def __init__(self, bus, mainloop): self.daemonApt = AptDaemon(self) self.bus = bus self.bus_name = dbus.service.BusName(INTERFACE, bus=bus) # print "SoftwarecenterDbusService:",self.bus_name dbus.service.Object.__init__(self, self.bus_name, UKPATH) self.mainloop = mainloop self.worklist = [] self.cancel_name_list = [] self.mutex = threading.RLock() self.cancelmutex = threading.RLock() self.worker_thread = WorkThread(self) self.worker_thread.setDaemon(True) self.worker_thread.start()
class SoftwarecenterDbusService(dbus.service.Object): def __init__(self, bus, mainloop): self.daemonApt = AptDaemon(self) self.bus = bus self.bus_name = dbus.service.BusName(INTERFACE, bus=bus) # print "SoftwarecenterDbusService:",self.bus_name dbus.service.Object.__init__(self, self.bus_name, UKPATH) self.mainloop = mainloop self.worklist = [] self.cancel_name_list = [] self.mutex = threading.RLock() self.cancelmutex = threading.RLock() self.worker_thread = WorkThread(self) self.worker_thread.setDaemon(True) self.worker_thread.start() def auth_with_policykit(self, sender, action, text="要安装或卸载软件"): if not sender: raise ValueError("sender == None") # print "auth_with_policykit:", sender granted = False try: obj = dbus.SystemBus().get_object("org.freedesktop.PolicyKit1", "/org/freedesktop/PolicyKit1/Authority") policykit = dbus.Interface(obj, "org.freedesktop.PolicyKit1.Authority") subject = ("system-bus-name", {"name": sender}) flags = dbus.UInt32(1) # AllowUserInteraction flag msg = text + ",您需要进行验证。" details = {"polkit.message": msg} cancel_id = "" # No cancellation id (granted, notused, details) = policykit.CheckAuthorization(subject, action, details, flags, cancel_id) except: print "auth with except......" granted = False return granted def add_worker_item(self, item): print "####add_worker_item:", item self.mutex.acquire() self.worklist.append(item) self.mutex.release() print "####add_worker_item finished!" def del_worker_item_by_name(self, pkgname): print "####del_worker_item_by_name:", pkgname exist = False self.mutex.acquire() for item in self.worklist: if item.pkgname == pkgname: exist = True break if exist is True: self.worklist.remove(pkgname) self.mutex.release() self.cancelmutex.acquire() self.cancel_name_list.append(pkgname) self.cancelmutex.release() print "####del_worker_item_by_name finished!" def check_cancel_worker_item(self, pkgname): # print "####check_cancel_worker_item:",pkgname cancel = False self.cancelmutex.acquire() # print "check_cancel_worker_item:",len(self.cancel_name_list) for item in self.cancel_name_list: if item == pkgname: cancel = True break if cancel is True: self.cancel_name_list.remove(pkgname) self.cancelmutex.release() # print "####check_cancel_worker_item finished!:",cancel return cancel @dbus.service.method(INTERFACE, in_signature="", out_signature="") def exit(self): self.mainloop.quit() # check ubuntukylin source is in /etc/apt/sources.list or not @dbus.service.method(INTERFACE, in_signature="", out_signature="b", sender_keyword="sender") def check_source_ubuntukylin(self, sender=None): print "check_source_ubuntukylin..." source = aptsources.sourceslist.SourcesList() for item in source.list: if item.str().find(DEB_SOURCE_UBUNTUKYLIN) != -1: return True return False # add ubuntukylin source in /etc/apt/sources.list @dbus.service.method(INTERFACE, in_signature="s", out_signature="b", sender_keyword="sender") def add_source_ubuntukylin(self, version, sender=None): granted = self.auth_with_policykit(sender, UBUNTUKYLIN_SOFTWARECENTER_ACTION, "要增加软件源") if not granted: return False source = aptsources.sourceslist.SourcesList(()) # ????the check option should include version if self.check_source_ubuntukylin() is True: return False osversion = str(version) + (" main") source.add("deb", HTTP_SOURCE_UBUNTUKYLIN, osversion, "") source.save() return True # add source in /etc/apt/sources.list @dbus.service.method(INTERFACE, in_signature="s", out_signature="b", sender_keyword="sender") def add_source(self, text, sender=None): granted = self.auth_with_policykit(sender, UBUNTUKYLIN_SOFTWARECENTER_ACTION, "要增加软件源") if not granted: return False return self.daemonApt.add_source(text) # remove source from /etc/apt/sources.list @dbus.service.method(INTERFACE, in_signature="s", out_signature="b", sender_keyword="sender") def remove_source(self, text, sender=None): granted = self.auth_with_policykit(sender, UBUNTUKYLIN_SOFTWARECENTER_ACTION) if not granted: return False return self.daemonApt.remove_source(text) # check ubuntukylin source is in /etc/apt/sources.list or not @dbus.service.method(INTERFACE, in_signature="b", out_signature="as", sender_keyword="sender") def get_sources(self, except_ubuntu, sender=None): return self.daemonApt.get_sources(except_ubuntu) # -------------------------software-center------------------------- # install deb file @dbus.service.method(INTERFACE, in_signature="s", out_signature="b", sender_keyword="sender") def install_debfile(self, path, sender=None): print "####install deb file: ", path granted = self.auth_with_policykit(sender, UBUNTUKYLIN_SOFTWARECENTER_ACTION) if not granted: kwarg = {"appname": path, "action": AppActions.INSTALLDEBFILE} self.software_auth_signal("auth_cancel", kwarg) return False item = WorkItem(path, AppActions.INSTALLDEBFILE, None) self.add_worker_item(item) return True # install deb file's deps @dbus.service.method(INTERFACE, in_signature="s", out_signature="b", sender_keyword="sender") def install_deps(self, path, sender=None): print "####install deps: ", path granted = self.auth_with_policykit(sender, UBUNTUKYLIN_SOFTWARECENTER_ACTION) if not granted: kwarg = {"appname": path, "action": AppActions.INSTALLDEPS} self.software_auth_signal("auth_cancel", kwarg) return False item = WorkItem(path, AppActions.INSTALLDEPS, None) self.add_worker_item(item) return True # install package sa:software_fetch_signal() and software_apt_signal() @dbus.service.method(INTERFACE, in_signature="s", out_signature="b", sender_keyword="sender") def install(self, pkgName, sender=None): print "####install: ", pkgName granted = self.auth_with_policykit(sender, UBUNTUKYLIN_SOFTWARECENTER_ACTION) if not granted: kwarg = {"appname": pkgName, "action": AppActions.INSTALL} self.software_auth_signal("auth_cancel", kwarg) return False item = WorkItem(pkgName, AppActions.INSTALL, None) self.add_worker_item(item) # self.daemonApt.install_pkg(pkgName) print "####install return" return True # uninstall package sa:software_apt_signal() @dbus.service.method(INTERFACE, in_signature="s", out_signature="b", sender_keyword="sender") def remove(self, pkgName, sender=None): print "####remove: ", pkgName granted = self.auth_with_policykit(sender, UBUNTUKYLIN_SOFTWARECENTER_ACTION) if not granted: kwarg = {"appname": pkgName, "action": AppActions.REMOVE} self.software_auth_signal("auth_cancel", kwarg) return False item = WorkItem(pkgName, AppActions.REMOVE, None) self.add_worker_item(item) # self.daemonApt.uninstall_pkg(pkgName) print "####remove return" return True # update package sa:software_fetch_signal() and software_apt_signal() @dbus.service.method(INTERFACE, in_signature="s", out_signature="b", sender_keyword="sender") def upgrade(self, pkgName, sender=None): print "####upgrade: ", pkgName granted = self.auth_with_policykit(sender, UBUNTUKYLIN_SOFTWARECENTER_ACTION) if not granted: kwarg = {"appname": pkgName, "action": AppActions.UPGRADE} self.software_auth_signal("auth_cancel", kwarg) return False item = WorkItem(pkgName, AppActions.UPGRADE, None) self.add_worker_item(item) # self.daemonApt.upgrade_pkg(pkgName) print "####upgrade return" return True @dbus.service.method(INTERFACE, in_signature="s", out_signature="b", sender_keyword="sender") def cancel(self, pkgName, sender=None): print "####cancel: ", pkgName granted = self.auth_with_policykit(sender, UBUNTUKYLIN_SOFTWARECENTER_ACTION) if not granted: return False self.del_worker_item_by_name(pkgName) print "####cancel return" return True # apt-get update sa:software_fetch_signal() @dbus.service.method(INTERFACE, in_signature="b", out_signature="b", sender_keyword="sender") def update(self, quiet, sender=None): print "####update: " granted = self.auth_with_policykit(sender, UBUNTUKYLIN_SOFTWARECENTER_ACTION, "要更新软件源") if not granted: return False kwargs = {"quiet": str(quiet)} item = WorkItem("#update", AppActions.UPDATE, kwargs) self.add_worker_item(item) # self.daemonApt.update() print "####update return" # ???????????????????????????? # apt-get update sa:software_fetch_signal() @dbus.service.method(INTERFACE, in_signature="b", out_signature="b", sender_keyword="sender") def update_first(self, quiet, sender=None): print "####update first: " granted = self.auth_with_policykit(sender, UBUNTUKYLIN_SOFTWARECENTER_ACTION, "要更新软件源") if not granted: return False kwargs = {"quiet": str(quiet)} item = WorkItem("#update", AppActions.UPDATE_FIRST, kwargs) self.add_worker_item(item) # self.daemonApt.update() print "####update return" # check packages status by pkgNameList sa:software_check_status_signal() @dbus.service.method(INTERFACE, in_signature="as", out_signature="") def check_pkgs_status(self, pkgNameList): self.daemonApt.check_pkgs_status_rtn_list(pkgNameList) # check one package status by pkgName @dbus.service.method(INTERFACE, in_signature="s", out_signature="s") def check_pkg_status(self, pkgName): return self.daemonApt.check_pkg_status(pkgName) # package download status signal """parm mean type: start:start download stop:all work is finish done:all items download finished fail:download failed fetch:one item download finished pulse:download status, this msg given a string like dict msg: a message of type, sometimes is None """ @dbus.service.signal(INTERFACE, signature="sa{ss}") def software_fetch_signal(self, type, msg): pass @dbus.service.signal(INTERFACE, signature="sa{ss}") def software_auth_signal(self, type, msg): pass # package install/update/remove signal """parm mean type: start:start work stop:work finish error:got a error pulse:work status, this msg given a string like dict msg: a message of type, sometimes is None """ @dbus.service.signal(INTERFACE, signature="sa{ss}") def software_apt_signal(self, type, msg): pass # get packages status signal """parm mean dict{packageName, packageStatus} packageStatus: i:installed u:installed and can update n:notinstall """ @dbus.service.signal(INTERFACE, signature="as") def software_check_status_signal(self, statusList): pass @dbus.service.signal(INTERFACE, signature="s") def software_signal_test(self, msg): pass