def clean_selected_ppa(self): self.set_busy() # name_list is to display the name of PPA # url_list is to identify the ppa name_list = [] url_list = [] for id in self.get_list(): #TODO try: name_list.append(SOURCE_PARSER.get_name(int(id))) url_list.append(SOURCE_PARSER.get_url(int(id))) except: name_list.append(ppa.get_short_name(id)) url_list.append(id) package_view = DowngradeView() package_view.update_model(url_list) sw = gtk.ScrolledWindow() sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) select_pkgs = package_view.get_downgrade_packages() sw.add(package_view) #TODO the logic is a little ugly, need to improve the BaseMessageDialog if not select_pkgs: message = _("It's safe to purge the PPA, no packages need to be downgraded.") sw.hide() else: message = _("To safely purge the PPA, the following packages must be downgraded.") sw.show_all() sw.set_size_request(500, 100) dialog = QuestionDialog(message, title=_("You're going to purge: %s") % ', '.join(name_list)) dialog.set_resizable(True) dialog.vbox.pack_start(sw, True, True, 0) dialog.show() response = dialog.run() dialog.destroy() # Workflow # 1. Downgrade all the PPA packages to offical packages #TODO Maybe not official? Because anther ppa which is enabled may have newer packages then offical # 2. If succeed, disable PPA, or keep it if response == gtk.RESPONSE_YES: self.set_busy() log.debug("The select pkgs is: %s", str(select_pkgs)) dialog = CleanPpaDialog(self.get_toplevel(), select_pkgs, url_list) dialog.run() dialog.destroy() if dialog.error: self.show_failed_dialog(dialog.error) else: self.show_success_dialog() self.update_ppa_model() self.unset_busy() else: self.update_ppa_model() # TODO refresh source? self.__check_list = [] self.emit('cleaned') self.unset_busy()
def update_ppa_model(self): self.set_busy() self.__column.set_title('PPA Sources') model = self.get_model() model.clear() self.mode = 'ppa' ppa_source_dict = get_ppa_source_dict() for source in self.get_sourceslist(): if ppa.is_ppa(source.uri) and source.type == 'deb' and not source.disabled: try: id = ppa_source_dict[source.uri] pixbuf = get_source_logo_from_filename(SOURCE_PARSER[id]['logo']) name = SOURCE_PARSER.get_name(id) comment = SOURCE_PARSER.get_summary(id) except: id = source.uri name = ppa.get_short_name(source.uri) comment = ppa.get_homepage(source.uri) pixbuf = get_source_logo_from_filename('') self.total_num += 1 iter = model.append() log.debug("Found an enalbed PPA: %s" % name) model.set(iter, COLUMN_ICON, pixbuf, COLUMN_CHECK, False, COLUMN_NAME, str(id), COLUMN_DESC, '', COLUMN_DISPLAY, '<b>%s</b>\n%s' % (name, comment), ) self.unset_busy()
def get_ppa_source_dict(): ppa_source_dict = {} for id in SOURCE_PARSER: url = SOURCE_PARSER.get_url(id) ppa_source_dict[url] = id return ppa_source_dict
def process_data(self): if self.pkgs: log.debug("call proxy.install_select_pkgs") proxy.install_select_pkgs(self.pkgs) log.debug("done proxy.install_select_pkgs") else: log.debug("No pkgs to downloaded, just done") self.downgrade_done = True while True: if not self.downgrade_done: time.sleep(0.2) continue ppa_source_dict = get_ppa_source_dict() # Sort out the unique owner urls, so that the PPAs from same owner will only fetch key fingerprint only once key_fingerprint_dict = {} for url in self.urls: if url in ppa_source_dict: id = ppa_source_dict[url] key_fingerprint = SOURCE_PARSER.get_key_fingerprint(id) else: key_fingerprint = '' owner, ppa_name = url.split('/')[3:5] if owner not in key_fingerprint_dict: key_fingerprint_dict[owner] = key_fingerprint log.debug("Get the key_fingerprint_dict done: %s" % key_fingerprint_dict) for url in self.urls: owner, ppa_name = url.split('/')[3:5] key_fingerprint = key_fingerprint_dict[owner] self.set_progress_text(_('Removing key files...')) if not key_fingerprint: try: #TODO wrap the LP API or use library owner, ppa_name = url.split('/')[3:5] lp_url = 'https://launchpad.net/api/beta/~%s/+archive/%s' % (owner, ppa_name) req = Request(lp_url) req.add_header("Accept","application/json") lp_page = urlopen(req).read() data = json.loads(lp_page) key_fingerprint = data['signing_key_fingerprint'] except Exception, e: log.error(e) continue log.debug("Get the key fingerprint: %s", key_fingerprint) result = proxy.purge_source(url, key_fingerprint) log.debug("Set source: %s to %s" % (url, str(result))) self.removekey_done = True log.debug("removekey_done is True") break
def update_ppa_model(self): self.set_busy() self.__column.set_title('PPA Sources') model = self.get_model() model.clear() self.mode = 'ppa' ppa_source_dict = get_ppa_source_dict() for source in self.get_sourceslist(): if ppa.is_ppa(source.uri ) and source.type == 'deb' and not source.disabled: try: id = ppa_source_dict[source.uri] pixbuf = get_source_logo_from_filename( SOURCE_PARSER[id]['logo']) name = SOURCE_PARSER.get_name(id) comment = SOURCE_PARSER.get_summary(id) except: id = source.uri name = ppa.get_short_name(source.uri) comment = ppa.get_homepage(source.uri) pixbuf = get_source_logo_from_filename('') self.total_num += 1 iter = model.append() log.debug("Found an enalbed PPA: %s" % name) model.set( iter, COLUMN_ICON, pixbuf, COLUMN_CHECK, False, COLUMN_NAME, str(id), COLUMN_DESC, '', COLUMN_DISPLAY, '<b>%s</b>\n%s' % (name, comment), ) self.unset_busy()
def process_data(self): if self.pkgs: proxy.install_select_pkgs(self.pkgs) else: self.downgrade_done = True ppa_source_dict = get_ppa_source_dict() # Sort out the unique owner urls, so that the PPAs from same owner will only fetch key fingerprint only once key_fingerprint_dict = {} for url in self.urls: if url in ppa_source_dict: id = ppa_source_dict[url] key_fingerprint = SOURCE_PARSER.get_key_fingerprint(id) else: key_fingerprint = '' owner, ppa_name = url.split('/')[3:5] if owner not in key_fingerprint_dict: key_fingerprint_dict[owner] = key_fingerprint for url in self.urls: owner, ppa_name = url.split('/')[3:5] key_fingerprint = key_fingerprint_dict[owner] self.set_progress_text(_('Removing key files...')) if not key_fingerprint: try: #TODO wrap the LP API or use library owner, ppa_name = url.split('/')[3:5] lp_url = 'https://launchpad.net/api/beta/~%s/+archive/%s' % ( owner, ppa_name) req = Request(lp_url) req.add_header("Accept", "application/json") lp_page = urlopen(req).read() data = json.loads(lp_page) key_fingerprint = data['signing_key_fingerprint'] except Exception, e: log.error(e) continue log.debug("Get the key fingerprint: %s", key_fingerprint) result = proxy.purge_source(url, key_fingerprint) log.debug("Set source: %s to %s" % (url, str(result)))
def clean_selected_ppa(self): self.set_busy() # name_list is to display the name of PPA # url_list is to identify the ppa name_list = [] url_list = [] for id in self.get_list(): #TODO try: name_list.append(SOURCE_PARSER.get_name(int(id))) url_list.append(SOURCE_PARSER.get_url(int(id))) except: name_list.append(ppa.get_short_name(id)) url_list.append(id) package_view = DowngradeView() package_view.update_model(url_list) sw = gtk.ScrolledWindow() sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) select_pkgs = package_view.get_downgrade_packages() sw.add(package_view) #TODO the logic is a little ugly, need to improve the BaseMessageDialog if not select_pkgs: message = _( "It's safe to purge the PPA, no packages need to be downgraded." ) sw.hide() else: message = _( "To safely purge the PPA, the following packages must be downgraded." ) sw.show_all() sw.set_size_request(500, 100) dialog = QuestionDialog(message, title=_("You're going to purge: %s") % ', '.join(name_list)) dialog.set_resizable(True) dialog.vbox.pack_start(sw, True, True, 0) dialog.show() response = dialog.run() dialog.destroy() # Workflow # 1. Downgrade all the PPA packages to offical packages #TODO Maybe not official? Because anther ppa which is enabled may have newer packages then offical # 2. If succeed, disable PPA, or keep it if response == gtk.RESPONSE_YES: self.set_busy() log.debug("The select pkgs is: %s", str(select_pkgs)) dialog = CleanPpaDialog(self.get_toplevel(), select_pkgs, url_list) dialog.run() dialog.destroy() if dialog.error == False: self.show_success_dialog() else: self.show_failed_dialog() self.update_ppa_model() self.unset_busy() else: self.update_ppa_model() # TODO refresh source? self.__check_list = [] self.emit('cleaned') self.unset_busy()