81
92
# first arg is force, second update_only
82
93
axi.update_async(True, True)
96
def fix_broken_depends(self):
97
self.emit("transaction-started")
99
trans = yield self.aptd_client.fix_broken_depends(defer=True)
100
yield self._run_transaction(trans, None, None, None)
101
except Exception, error:
102
self._on_trans_error(error)
84
105
def upgrade(self, pkgname, appname, iconname):
85
106
""" upgrade a single package """
86
107
self.emit("transaction-started")
87
reply_handler = lambda trans: self._run_transaction(trans, pkgname,
89
self.aptd_client.upgrade_packages([pkgname],
90
reply_handler=reply_handler,
91
error_handler=self._on_trans_error)
109
trans = yield self.aptd_client.upgrade_packages([pkgname],
111
yield self._run_transaction(trans, pkgname, appname, iconname)
112
except Exception, error:
113
self._on_trans_error(error)
93
116
def remove(self, pkgname, appname, iconname):
94
117
""" remove a single package """
95
118
self.emit("transaction-started")
96
reply_handler = lambda trans: self._run_transaction(trans, pkgname,
98
self.aptd_client.remove_packages([pkgname], wait=False,
99
reply_handler=reply_handler,
100
error_handler=self._on_trans_error)
120
trans = yield self.aptd_client.remove_packages([pkgname],
122
yield self._run_transaction(trans, pkgname, appname, iconname)
123
except Exception, error:
124
self._on_trans_error(error)
127
def remove_multiple(self, pkgnames, appnames, iconnames):
128
""" queue a list of packages for removal """
129
for pkgname, appname, iconname in zip(pkgnames, appnames, iconnames):
130
yield self.remove(pkgname, appname, iconname)
102
133
def install(self, pkgname, appname, iconname):
103
134
""" install a single package """
104
135
self.emit("transaction-started")
105
reply_handler = lambda trans: self._run_transaction(trans, pkgname,
107
self.aptd_client.install_packages([pkgname],
108
reply_handler=reply_handler,
109
error_handler=self._on_trans_error)
137
trans = yield self.aptd_client.install_packages([pkgname],
139
yield self._run_transaction(trans, pkgname, appname, iconname)
140
except Exception, error:
141
self._on_trans_error(error)
144
def install_multiple(self, pkgnames, appnames, iconnames):
145
""" queue a list of packages for install """
146
for pkgname, appname, iconname in zip(pkgnames, appnames, iconnames):
147
yield self.install(pkgname, appname, iconname)
111
150
def reload(self):
112
151
""" reload package list """
113
reply_handler = lambda trans: self._run_transaction(trans, None, None,
115
self.aptd_client.update_cache(reply_handler=reply_handler,
116
error_handler=self._on_trans_error)
153
trans = yield self.aptd_client.update_cache(defer=True)
154
yield self._run_transaction(trans, None, None, None)
155
except Exception, error:
156
self._on_trans_error(error)
118
159
def enable_component(self, component):
119
logging.debug("enable_component: %s" % component)
160
self._logger.debug("enable_component: %s" % component)
121
self.aptd_client.enable_distro_component(component)
122
except dbus.exceptions.DBusException, e:
123
if e._dbus_error_name == "org.freedesktop.PolicyKit.Error.NotAuthorized":
124
logging.error("enable_component: '%s'" % e)
162
yield self.aptd_client.enable_distro_component(component, defer=True)
163
except dbus.DBusException, err:
164
if err.get_dbus_name() == "org.freedesktop.PolicyKit.Error.NotAuthorized":
165
self._logger.error("enable_component: '%s'" % err)
127
168
# now update the cache
130
172
def enable_channel(self, channelfile):
131
import aptsources.sourceslist
133
173
# read channel file and add all relevant lines
134
174
for line in open(channelfile):
135
175
line = line.strip()
139
179
if entry.invalid:
141
181
sourcepart = os.path.basename(channelfile)
143
self.aptd_client.add_repository(
144
entry.type, entry.uri, entry.dist, entry.comps,
145
"Added by software-center", sourcepart)
146
except dbus.exceptions.DBusException, e:
147
if e._dbus_error_name == "org.freedesktop.PolicyKit.Error.NotAuthorized":
148
logging.error("add_repository: '%s'" % e)
150
# now update the cache
182
yield self.add_sources_list_entry(entry, sourcepart)
186
def add_sources_list_entry(self, source_entry, sourcepart=None):
187
if isinstance(source_entry, basestring):
188
entry = SourceEntry(source_entry)
189
elif isinstance(source_entry, aptsources.sourceslist.SourceEntry):
192
raise ValueError, "Unsupported entry type %s" % type(source_entry)
195
sourcepart = sources_filename_from_ppa_entry(entry)
197
args = (entry.type, entry.uri, entry.dist, entry.comps,
198
"Added by software-center", sourcepart)
200
yield self.aptd_client.add_repository(*args)
201
except dbus.DBusException, err:
202
if err.get_dbus_name() == "org.freedesktop.PolicyKit.Error.NotAuthorized":
203
self._logger.error("add_repository: '%s'" % err)
153
206
# internal helpers
154
207
def on_transactions_changed(self, current, pending):
263
301
transaction.cancel()
265
def set_http_proxy(self, trans):
266
""" set http proxy based on gconf and attach it to a transaction """
267
http_proxy = get_http_proxy_string_from_gconf()
269
trans.set_http_proxy(http_proxy, reply_handler=lambda t: True,
270
error_handler=self._on_trans_error)
272
304
def _run_transaction(self, trans, pkgname, appname, iconname):
273
305
# connect signals
274
306
trans.connect("config-file-conflict", self._config_file_conflict)
275
307
trans.connect("medium-required", self._medium_required)
276
308
trans.connect("finished", self._on_trans_finished)
277
# set appname/iconname/pkgname only if we actually have one
279
trans.set_meta_data(sc_appname=appname,
280
reply_handler=lambda t: True,
281
error_handler=self._on_trans_error)
283
trans.set_meta_data(sc_iconname=iconname,
284
reply_handler=lambda t: True,
285
error_handler=self._on_trans_error)
286
# we do not always have a pkgname, e.g. "cache_update" does not
288
trans.set_meta_data(sc_pkgname=pkgname,
289
reply_handler=lambda t: True,
290
error_handler=self._on_trans_error)
291
# setup debconf only if we have a pkg
292
trans.set_debconf_frontend("gnome", reply_handler=lambda t: True,
293
error_handler=self._on_trans_error)
294
# set this once the new aptdaemon 0.2.x API can be used
295
trans.set_remove_obsoleted_depends(True,
296
reply_handler=lambda t: True,
297
error_handler=self._on_trans_error)
300
self.set_http_proxy(trans)
301
trans.run(error_handler=self._on_trans_error,
302
reply_handler=self._on_trans_reply)
310
# set appname/iconname/pkgname only if we actually have one
312
yield trans.set_meta_data(sc_appname=appname, defer=True)
314
yield trans.set_meta_data(sc_iconname=iconname, defer=True)
315
# we do not always have a pkgname, e.g. "cache_update" does not
317
yield trans.set_meta_data(sc_pkgname=pkgname, defer=True)
318
# setup debconf only if we have a pkg
319
yield trans.set_debconf_frontend("gnome", defer=True)
320
# set this once the new aptdaemon 0.2.x API can be used
321
trans.set_remove_obsoleted_depends(True, defer=True)
323
http_proxy = get_http_proxy_string_from_gconf()
325
trans.set_http_proxy(http_proxy, defer=True)
326
yield trans.run(defer=True)
327
except Exception, error:
328
self._on_trans_error(error)
330
def _on_trans_error(self, error):
331
self._logger.warn("_on_trans_error: %s", error)
332
# re-enable the action button again if anything went wrong
333
self.emit("transaction-stopped")
334
if isinstance(error, dbus.DBusException):
335
name = error.get_dbus_name()
336
if name in ["org.freedesktop.PolicyKit.Error.NotAuthorized",
337
"org.freedesktop.DBus.Error.NoReply"]:
304
343
if __name__ == "__main__":
305
344
#c = client.AptClient()