class DownloadMonitor(): def __init__(self, screen, title, item_count=0): self.screen = screen self.title = title self.current_item = 0 self.item_count = item_count g = Grid(1, 2) self.fnm_label = Textbox(40, 2, 'Downloading...', 0, 0) self.scale = Scale(40, 100) self.scale.set(0) g.setField(self.fnm_label, 0, 1) g.setField(self.scale, 0, 0) self.screen.gridWrappedWindow(g, title) self.f = Form() self.f.add(self.scale) self.f.add(self.fnm_label) def update_url(self, fnm): self.current_item = self.current_item + 1 self.fnm_label.setText("(%s/%s): %s" % (self.current_item, self.item_count, fnm)) def download_hook(self, count, blockSize, totalSize): donep = int(min(100, float(blockSize * count) / totalSize * 100)) self.scale.set(donep) self.f.draw() self.screen.refresh()
class DownloadMonitor(): def __init__(self, screen, title, item_count=0): self.screen = screen self.title = title self.current_item = 0 self.item_count = item_count g = Grid(1, 2) self.fnm_label = Textbox(40, 2, 'Downloading...', 0, 0) self.scale = Scale(40, 100) self.scale.set(0) g.setField(self.fnm_label, 0, 1) g.setField(self.scale, 0, 0) self.screen.gridWrappedWindow(g, title) self.f = Form() self.f.add(self.scale) self.f.add(self.fnm_label) def update_url(self, fnm): self.current_item = self.current_item + 1 self.fnm_label.setText("(%s/%s): %s" % (self.current_item, self.item_count, fnm)) def download_hook(self, count, blockSize, totalSize): donep = int(min(100, float(blockSize * count) / totalSize * 100)) self.scale.set(donep) self.f.draw() self.screen.refresh()
def process(): global NvLtDrvURL, LatestFile, LatestHeader, DownloadFlag, SymlinkFlag screen = SnackScreen() bb = ButtonBar(screen, (("End", "end"), )) tbTittle = Textbox(65, 3, "Processing Input... ", 0, 1) tbDownload = Textbox(65, 3, " ", 0, 1) tbSymlink = Textbox(65, 3, " ", 0, 1) g = GridForm(screen, "chkltdr (NvDrIn) - by Trodskovich", 1, 6) g.add(tbTittle, 0, 2) g.add(tbDownload, 0, 3, growx=1) g.add(tbSymlink, 0, 4, growx=1) g.add(bb, 0, 5, growx=1) if DownloadFlag: tbDownload.setText("Downloading Please Wait...") result = g.runOnce() screen.finish() urllib.request.urlretrieve(NvLtDrvURL, "./" + LatestFile) else: tbDownload.setText("Download Skipped") if SymlinkFlag: subprocess.call( ["ln -nfs ./" + LatestFile + " NVIDIA-Linux-x86_64-Latest.run"], shell=True) tbSymlink.setText("Symlink Created") else: tbSymlink.setText("Symlink Skipped") result = g.runOnce() screen.finish() return bb.buttonPressed(result)
class ExtTopProgressWindow: def __init__(self, screen, title, text): self.screen = screen self.g = GridForm(self.screen, title, 1, 2) self.s = Scale(70, 100) self.t = Textbox(70, 12, text) self.g.add(self.s, 0, 0) self.g.add(self.t, 0, 1, padding=(0, 1, 0, 0)) def show(self): self.g.draw() self.screen.refresh() def update(self, progress, text=''): self.s.set(progress) self.t.setText(text) self.g.draw() self.screen.refresh() def close(self): time.sleep(1) self.screen.popWindow()
class UpdateManagerText(object): DEBUG = False def __init__(self, datadir): self.screen = SnackScreen() # FIXME: self.screen.finish() clears the screen (and all messages) # there too #atexit.register(self.restoreScreen) self.button_bar = ButtonBar(self.screen, ((_("Cancel"), "cancel"), (_("Install"), "ok")), compact=True) self.textview_changes = Textbox(72, 8, _("Changelog"), True, True) self.checkbox_tree_updates = CheckboxTree(height=8, width=72, scroll=1) self.checkbox_tree_updates.setCallback(self.checkbox_changed) self.layout = GridForm(self.screen, _("Updates"), 1, 5) self.layout.add(self.checkbox_tree_updates, 0, 0) # empty line to make it look less crowded self.layout.add(Textbox(60, 1, " ", False, False), 0, 1) self.layout.add(self.textview_changes, 0, 2) # empty line to make it look less crowded self.layout.add(Textbox(60, 1, " ", False, False), 0, 3) self.layout.add(self.button_bar, 0, 4) # FIXME: better progress than the current suspend/resume screen thing self.screen.suspend() if not self.DEBUG: apt_pkg.pkgsystem_lock() self.openCache() print(_("Building Updates List")) self.fillstore() if self.list.distUpgradeWouldDelete > 0: print( _(""" A normal upgrade can not be calculated, please run: sudo apt-get dist-upgrade This can be caused by: * A previous upgrade which didn't complete * Problems with some of the installed software * Unofficial software packages not provided by Ubuntu * Normal changes of a pre-release version of Ubuntu""")) sys.exit(1) self.screen.resume() # def restoreScreen(self): # self.screen.finish() def openCache(self): # open cache progress = apt.progress.text.OpProgress() if hasattr(self, "cache"): self.cache.open(progress) self.cache._initDepCache() else: self.cache = MyCache(progress) self.actiongroup = apt_pkg.ActionGroup(self.cache._depcache) # lock the cache self.cache.lock = True def fillstore(self): # populate the list self.list = UpdateList(self) self.list.update(self.cache) origin_list = sorted(self.list.pkgs, key=operator.attrgetter("importance"), reverse=True) for (i, origin) in enumerate(origin_list): self.checkbox_tree_updates.append(origin.description, selected=True) for pkg in self.list.pkgs[origin]: self.checkbox_tree_updates.addItem(pkg.name, (i, snackArgs['append']), pkg, selected=True) def updateSelectionStates(self): """ helper that goes over the cache and updates the selection states in the UI based on the cache """ for pkg in self.cache: if pkg not in self.checkbox_tree_updates.item2key: continue # update based on the status if pkg.marked_upgrade or pkg.marked_install: self.checkbox_tree_updates.setEntryValue(pkg, True) else: self.checkbox_tree_updates.setEntryValue(pkg, False) self.updateUI() def updateUI(self): self.layout.draw() self.screen.refresh() def get_news_and_changelog(self, pkg): changes = "" name = pkg.name # if we don't have it, get it if (name not in self.cache.all_changes and name not in self.cache.all_news): self.textview_changes.setText(_("Downloading changelog")) lock = threading.Lock() lock.acquire() changelog_thread = threading.Thread( target=self.cache.get_news_and_changelog, args=(name, lock)) changelog_thread.start() # this lock should never take more than 2s even with network down while lock.locked(): time.sleep(0.03) # build changes from NEWS and changelog if name in self.cache.all_news: changes += self.cache.all_news[name] if name in self.cache.all_changes: changes += self.cache.all_changes[name] return changes def checkbox_changed(self): # item is either a apt.package.Package or a str (for the headers) pkg = self.checkbox_tree_updates.getCurrent() descr = "" if hasattr(pkg, "name"): need_refresh = False name = pkg.name if self.options.show_description: descr = getattr(pkg.candidate, "description", None) else: descr = self.get_news_and_changelog(pkg) # check if it is a wanted package selected = self.checkbox_tree_updates.getEntryValue(pkg)[1] marked_install_upgrade = pkg.marked_install or pkg.marked_upgrade if not selected and marked_install_upgrade: need_refresh = True pkg.mark_keep() if selected and not marked_install_upgrade: if not (name in self.list.held_back): # FIXME: properly deal with "fromUser" here need_refresh = True pkg.mark_install() # fixup any problems if self.cache._depcache.broken_count: need_refresh = True Fix = apt_pkg.ProblemResolver(self.cache._depcache) Fix.resolve_by_keep() # update the list UI to reflect the cache state if need_refresh: self.updateSelectionStates() self.textview_changes.setText(descr) self.updateUI() def main(self, options): self.options = options res = self.layout.runOnce() self.screen.finish() button = self.button_bar.buttonPressed(res) if button == "ok": self.screen.suspend() res = self.cache.commit(apt.progress.text.AcquireProgress(), apt.progress.base.InstallProgress())
class Plugin(PluginBase): """Plugin for RHEV-M configuration. """ def __init__(self, ncs): PluginBase.__init__(self, "RHEV-M", ncs) def form(self): elements = Grid(2, 8) is_network_up = network_up() if is_network_up: header_message = "RHEV-M Configuration" else: header_message = "Network Down, RHEV-M Configuration Disabled" heading = Label(header_message) self.ncs.screen.setColor(customColorset(1), "black", "magenta") heading.setColors(customColorset(1)) elements.setField(heading, 0, 0, anchorLeft=1) rhevm_grid = Grid(2, 2) rhevm_grid.setField(Label("Management Server:"), 0, 0, anchorLeft=1) self.rhevm_server = Entry(25, "") self.rhevm_server.setCallback(self.valid_rhevm_server_callback) rhevm_grid.setField(Label("Management Server Port:"), 0, 1, anchorLeft=1) self.rhevm_server_port = Entry(6, "", scroll=0) self.rhevm_server_port.setCallback( self.valid_rhevm_server_port_callback) rhevm_grid.setField(self.rhevm_server, 1, 0, anchorLeft=1, padding=(2, 0, 0, 1)) rhevm_grid.setField(self.rhevm_server_port, 1, 1, anchorLeft=1, padding=(2, 0, 0, 1)) elements.setField(rhevm_grid, 0, 1, anchorLeft=1, padding=(0, 0, 0, 0)) elements.setField(Label(""), 0, 2, anchorLeft=1) self.verify_rhevm_cert = Checkbox( "Connect to RHEV Manager and Validate Certificate", isOn=True) elements.setField(self.verify_rhevm_cert, 0, 3, anchorLeft=1, padding=(0, 0, 0, 0)) elements.setField(Label(""), 0, 4, anchorLeft=1) elements.setField(Label("Set RHEV-M Admin Password"), 0, 5, anchorLeft=1) pw_elements = Grid(3, 3) pw_elements.setField(Label("Password: "******"Confirm Password: "******"", wrap=1) elements.setField(pw_elements, 0, 6, anchorLeft=1) elements.setField(self.pw_msg, 0, 7, padding=(0, 0, 0, 0)) inputFields = [ self.rhevm_server, self.rhevm_server_port, self.verify_rhevm_cert, self.root_password_1, self.root_password_2 ] if not is_network_up: for field in inputFields: field.setFlags(FLAG_DISABLED, FLAGS_SET) try: rhevm_server = get_rhevm_config() rhevm_server, rhevm_port = rhevm_server.split(":") if rhevm_server.startswith("None"): self.rhevm_server.set("") else: self.rhevm_server.set(rhevm_server) self.rhevm_server_port.set(rhevm_port) except: pass return [Label(""), elements] def password_check_callback(self): resp, msg = password_check(self.root_password_1.value(), self.root_password_2.value()) self.pw_msg.setText(msg) return def action(self): self.ncs.screen.setColor("BUTTON", "black", "red") self.ncs.screen.setColor("ACTBUTTON", "blue", "white") if self.root_password_1.value() != "" and self.root_password_2.value( ) != "" and self.root_password_1.value() == self.root_password_2.value( ): set_password(self.root_password_1.value(), "root") augtool("set", "/files/etc/ssh/sshd_config/PasswordAuthentication", "yes") dn = file('/dev/null', 'w+') subprocess.Popen(['/sbin/service', 'sshd', 'restart'], stdout=dn, stderr=dn) if len(self.rhevm_server.value()) > 0: deployUtil.nodeCleanup() if self.verify_rhevm_cert.selected(): if deployUtil.getRhevmCert(self.rhevm_server.value(), self.rhevm_server_port.value()): path, dontCare = deployUtil.certPaths('') fp = deployUtil.generateFingerPrint(path) approval = ButtonChoiceWindow( self.ncs.screen, "Certificate Fingerprint:", fp, buttons=['Approve', 'Reject']) if 'reject' == approval: ButtonChoiceWindow(self.ncs.screen, "Fingerprint rejected", "RHEV-M Configuration Failed", buttons=['Ok']) return False else: ovirt_store_config(path) self.ncs.reset_screen_colors() else: ButtonChoiceWindow(self.ncs.screen, "RHEV-M Configuration", "Failed downloading RHEV-M certificate", buttons=['Ok']) self.ncs.reset_screen_colors() # Stopping vdsm-reg may fail but its ok - its in the case when the menus are run after installation deployUtil._logExec([constants.EXT_SERVICE, 'vdsm-reg', 'stop']) if write_vdsm_config(self.rhevm_server.value(), self.rhevm_server_port.value()): deployUtil._logExec( [constants.EXT_SERVICE, 'vdsm-reg', 'start']) ButtonChoiceWindow(self.ncs.screen, "RHEV-M Configuration", "RHEV-M Configuration Successfully Updated", buttons=['Ok']) self.ncs.reset_screen_colors() return True else: ButtonChoiceWindow(self.ncs.screen, "RHEV-M Configuration", "RHEV-M Configuration Failed", buttons=['Ok']) self.ncs.reset_screen_colors() return False def valid_rhevm_server_callback(self): if not is_valid_host_or_ip(self.rhevm_server.value()): self.ncs.screen.setColor("BUTTON", "black", "red") self.ncs.screen.setColor("ACTBUTTON", "blue", "white") ButtonChoiceWindow(self.ncs.screen, "Configuration Check", "Invalid RHEV-M Hostname or Address", buttons=['Ok']) self.ncs.reset_screen_colors() def valid_rhevm_server_port_callback(self): if not is_valid_port(self.rhevm_server_port.value()): self.ncs.screen.setColor("BUTTON", "black", "red") self.ncs.screen.setColor("ACTBUTTON", "blue", "white") ButtonChoiceWindow(self.ncs.screen, "Configuration Check", "Invalid RHEV-M Server Port", buttons=['Ok']) self.ncs.reset_screen_colors()
class NewtUI(object): """ Newt UI implementation """ def __init__(self, frontend): self._frontend = frontend self.screen = SnackScreen() self.textview_changes = None self.button_bar = None self.checkbox_tree_updates = None self.layout = None self._app = None self._updates_received = False def create_ui(self): """ Creates/Draws the UI """ self.button_bar = ButtonBar(self.screen, ((_("Cancel"), "cancel"), (_("Install"), "ok")), compact=True) self.textview_changes = Textbox(72, 8, "Changelog", True, True) self.checkbox_tree_updates = CheckboxTree(height=8, width=72, scroll=1) self.checkbox_tree_updates.setCallback(self.checkbox_changed) self.layout = GridForm(self.screen, "Updates", 1, 5) self.layout.add(self.checkbox_tree_updates, 0, 0) # empty line to make it look less crowded self.layout.add(Textbox(60, 1, " ", False, False), 0, 1) self.layout.add(self.textview_changes, 0, 2) # empty line to make it look less crowded self.layout.add(Textbox(60, 1, " ", False, False), 0, 3) self.layout.add(self.button_bar, 0, 4) # FIXME: better progress than the current suspend/resume screen thing self.screen.suspend() def cache_reload_callback(self, percent, operation): """ Cache reloading callback :param percent: Percentage done :param operation: Current operation """ if percent == RELOAD_CACHE_STATUS.DONE: sys.stdout.write(_('Finished loading package cache.') + '\n') elif percent == RELOAD_CACHE_STATUS.BEGIN: sys.stdout.write(_('Loading package cache.') + '\n') else: sys.stdout.write('[%2d] %s\r' % (percent, operation)) def main(self, application): """ UI main loop :param application: class:`UpdateManager.Application.Application` object """ self._app = application while not self._updates_received: time.sleep(0.3) self.screen.resume() res = self.layout.runOnce() self.screen.finish() button = self.button_bar.buttonPressed(res) if button == "ok": self.screen.suspend() def get_updates(self): sys.stdout.write(_("Building Updates List") + "\n") sys.stdout.flush() packages = self._app.get_available_updates() # download_size = 0 categories = {} for pkg in packages: catid = pkg.get_update_category() if not catid in categories.keys(): categories[catid] = [ pkg, ] else: categories[catid].append(pkg) for (i, cat_id) in enumerate(categories.keys()): cat_name = self._app.get_update_category_name(cat_id) self.checkbox_tree_updates.append(cat_name, selected=True) for pkg in categories[cat_id]: self.checkbox_tree_updates.addItem(pkg.get_package_name(), (i, snackArgs['append']), pkg, selected=True) self._updates_received = True def update_ui(self): """ Redraws the UI """ self.layout.draw() self.screen.refresh() def checkbox_changed(self): """ Handler for checkbox state-changes """ pkg = self.checkbox_tree_updates.getCurrent() descr = "" if hasattr(pkg, "get_description"): descr = pkg.get_description() # TODO: changelog handling/selection of changelog instead of # description self.textview_changes.setText(descr) self.update_ui()
class Plugin(PluginBase): """Plugin for oVirt Engine configuration. """ def __init__(self, ncs): PluginBase.__init__(self, "oVirt Engine", ncs) def form(self): elements = Grid(2, 8) is_network_up = network_up() if is_network_up: header_message = "oVirt Engine Configuration" else: header_message = "Network Down, oVirt Engine Configuration Disabled" heading = Label(header_message) self.ncs.screen.setColor(customColorset(1), "black", "magenta") heading.setColors(customColorset(1)) elements.setField(heading, 0, 0, anchorLeft = 1) rhevm_grid = Grid(2,2) rhevm_grid.setField(Label("Management Server:"), 0, 0, anchorLeft = 1) self.rhevm_server = Entry(25, "") self.rhevm_server.setCallback(self.valid_rhevm_server_callback) rhevm_grid.setField(Label("Management Server Port:"), 0, 1, anchorLeft = 1) self.rhevm_server_port = Entry(6, "", scroll = 0) self.rhevm_server_port.setCallback(self.valid_rhevm_server_port_callback) rhevm_grid.setField(self.rhevm_server, 1, 0, anchorLeft = 1, padding=(2, 0, 0, 1)) rhevm_grid.setField(self.rhevm_server_port, 1, 1, anchorLeft = 1, padding=(2, 0, 0, 1)) elements.setField(rhevm_grid, 0, 1, anchorLeft = 1, padding = (0,0,0,0)) elements.setField(Label(""), 0, 2, anchorLeft = 1) self.verify_rhevm_cert = Checkbox("Connect to oVirt Engine and Validate Certificate", isOn=True) elements.setField(self.verify_rhevm_cert, 0, 3, anchorLeft = 1, padding = (0,0,0,0)) elements.setField(Label(""), 0, 4, anchorLeft = 1) elements.setField(Label("Set oVirt Engine Admin Password"), 0, 5, anchorLeft = 1) pw_elements = Grid(3,3) pw_elements.setField(Label("Password: "******"Confirm Password: "******"", wrap=1) elements.setField(pw_elements, 0, 6, anchorLeft=1) elements.setField(self.pw_msg, 0, 7, padding = (0,0,0,0)) inputFields = [self.rhevm_server, self.rhevm_server_port, self.verify_rhevm_cert, self.root_password_1, self.root_password_2] if not is_network_up: for field in inputFields: field.setFlags(FLAG_DISABLED, FLAGS_SET) try: rhevm_server = get_rhevm_config() rhevm_server,rhevm_port = rhevm_server.split(":") if rhevm_server.startswith("None"): self.rhevm_server.set("") else: self.rhevm_server.set(rhevm_server) self.rhevm_server_port.set(rhevm_port) except: pass return [Label(""), elements] def password_check_callback(self): resp, msg = password_check(self.root_password_1.value(), self.root_password_2.value()) self.pw_msg.setText(msg) return def action(self): self.ncs.screen.setColor("BUTTON", "black", "red") self.ncs.screen.setColor("ACTBUTTON", "blue", "white") if self.root_password_1.value() != "" and self.root_password_2.value() != "" and self.root_password_1.value() == self.root_password_2.value(): set_password(self.root_password_1.value(), "root") augtool("set", "/files/etc/ssh/sshd_config/PasswordAuthentication", "yes") dn = file('/dev/null', 'w+') subprocess.Popen(['/sbin/service', 'sshd', 'restart'], stdout=dn, stderr=dn) if len(self.rhevm_server.value()) > 0: deployUtil.nodeCleanup() if self.verify_rhevm_cert.selected(): if deployUtil.getRhevmCert(self.rhevm_server.value(), self.rhevm_server_port.value()): path, dontCare = deployUtil.certPaths('') fp = deployUtil.generateFingerPrint(path) approval = ButtonChoiceWindow(self.ncs.screen, "Certificate Fingerprint:", fp, buttons = ['Approve', 'Reject']) if 'reject' == approval: ButtonChoiceWindow(self.ncs.screen, "Fingerprint rejected", "oVirt Engine Configuration Failed", buttons = ['Ok']) return False else: ovirt_store_config(path) self.ncs.reset_screen_colors() else: ButtonChoiceWindow(self.ncs.screen, "oVirt Engine Configuration", "Failed downloading oVirt Engine certificate", buttons = ['Ok']) self.ncs.reset_screen_colors() # Stopping vdsm-reg may fail but its ok - its in the case when the menus are run after installation deployUtil._logExec([constants.EXT_SERVICE, 'vdsm-reg', 'stop']) if write_vdsm_config(self.rhevm_server.value(), self.rhevm_server_port.value()): deployUtil._logExec([constants.EXT_SERVICE, 'vdsm-reg', 'start']) ButtonChoiceWindow(self.ncs.screen, "oVirt Engine Configuration", "oVirt Engine Configuration Successfully Updated", buttons = ['Ok']) self.ncs.reset_screen_colors() return True else: ButtonChoiceWindow(self.ncs.screen, "oVirt Engine Configuration", "oVirt Engine Configuration Failed", buttons = ['Ok']) self.ncs.reset_screen_colors() return False def valid_rhevm_server_callback(self): if not is_valid_host_or_ip(self.rhevm_server.value()): self.ncs.screen.setColor("BUTTON", "black", "red") self.ncs.screen.setColor("ACTBUTTON", "blue", "white") ButtonChoiceWindow(self.ncs.screen, "Configuration Check", "Invalid oVirt Engine Hostname or Address", buttons = ['Ok']) self.ncs.reset_screen_colors() def valid_rhevm_server_port_callback(self): if not is_valid_port(self.rhevm_server_port.value()): self.ncs.screen.setColor("BUTTON", "black", "red") self.ncs.screen.setColor("ACTBUTTON", "blue", "white") ButtonChoiceWindow(self.ncs.screen, "Configuration Check", "Invalid oVirt Engine Server Port", buttons = ['Ok']) self.ncs.reset_screen_colors()
class UpdateManagerText(object): DEBUG = False def __init__(self, datadir): self.screen = SnackScreen() # FIXME: self.screen.finish() clears the screen (and all messages) # there too #atexit.register(self.restoreScreen) self.button_bar = ButtonBar(self.screen, ( (_("Cancel"), "cancel"), (_("Install"), "ok")), compact = True) self.textview_changes = Textbox(72, 8, "Changelog", True, True) self.checkbox_tree_updates = CheckboxTree(height=8, width=72, scroll=1) self.checkbox_tree_updates.setCallback(self.checkbox_changed) self.layout = GridForm(self.screen, "Updates", 1, 5) self.layout.add(self.checkbox_tree_updates, 0, 0) # empty line to make it look less crowded self.layout.add(Textbox(60, 1," ",False, False), 0, 1) self.layout.add(self.textview_changes, 0, 2) # empty line to make it look less crowded self.layout.add(Textbox(60, 1," ",False, False), 0, 3) self.layout.add(self.button_bar, 0, 4) # FIXME: better progress than the current suspend/resume screen thing self.screen.suspend() if not self.DEBUG: apt_pkg.PkgSystemLock() self.openCache() print _("Building Updates List") self.fillstore() if self.list.distUpgradeWouldDelete > 0: print _(""" A normal upgrade can not be calculated, please run: sudo apt-get dist-upgrade This can be caused by: * A previous upgrade which didn't complete * Problems with some of the installed software * Unofficial software packages not provided by Ubuntu * Normal changes of a pre-release version of Ubuntu""") sys.exit(1) self.screen.resume() # def restoreScreen(self): # self.screen.finish() def openCache(self): # open cache progress = apt.progress.OpTextProgress() if hasattr(self, "cache"): self.cache.open(progress) self.cache._initDepCache() else: self.cache = MyCache(progress) self.actiongroup = apt_pkg.GetPkgActionGroup(self.cache._depcache) # lock the cache self.cache.lock = True def fillstore(self): # populate the list self.list = UpdateList(self) self.list.update(self.cache) origin_list = self.list.pkgs.keys() origin_list.sort(lambda x,y: cmp(x.importance, y.importance)) origin_list.reverse() for (i, origin) in enumerate(origin_list): self.checkbox_tree_updates.append(origin.description, selected=True) for pkg in self.list.pkgs[origin]: self.checkbox_tree_updates.addItem(pkg.name, (i, snackArgs['append']), pkg, selected = True) def updateSelectionStates(self): """ helper that goes over the cache and updates the selection states in the UI based on the cache """ for pkg in self.cache: if not self.checkbox_tree_updates.item2key.has_key(pkg): continue # update based on the status if pkg.markedUpgrade or pkg.markedInstall: self.checkbox_tree_updates.setEntryValue(pkg, True) else: self.checkbox_tree_updates.setEntryValue(pkg, False) self.updateUI() def updateUI(self): self.layout.draw() self.screen.refresh() def get_news_and_changelog(self, pkg): changes = "" name = pkg.name # if we don't have it, get it if (not self.cache.all_changes.has_key(name) and not self.cache.all_news.has_key(name)): self.textview_changes.setText(_("Downloading changelog")) lock = thread.allocate_lock() lock.acquire() thread.start_new_thread(self.cache.get_news_and_changelog,(name,lock)) # this lock should never take more than 2s even with network down while lock.locked(): time.sleep(0.03) # build changes from NEWS and changelog if self.cache.all_news.has_key(name): changes += self.cache.all_news[name] if self.cache.all_changes.has_key(name): changes += self.cache.all_changes[name] return changes def checkbox_changed(self): # item is either a apt.package.Package or a str (for the headers) pkg = self.checkbox_tree_updates.getCurrent() descr = "" if hasattr(pkg, "name"): need_refresh = False name = pkg.name if self.options.show_description: descr = pkg.description else: descr = self.get_news_and_changelog(pkg) # check if it is a wanted package selected = self.checkbox_tree_updates.getEntryValue(pkg)[1] marked_install_upgrade = pkg.markedInstall or pkg.markedUpgrade if not selected and marked_install_upgrade: need_refresh = True pkg.markKeep() if selected and not marked_install_upgrade: if not (name in self.list.held_back): # FIXME: properly deal with "fromUser" here need_refresh = True pkg.markInstall() # fixup any problems if self.cache._depcache.BrokenCount: need_refresh = True Fix = apt_pkg.GetPkgProblemResolver(self.cache._depcache) Fix.ResolveByKeep() # update the list UI to reflect the cache state if need_refresh: self.updateSelectionStates() self.textview_changes.setText(descr) self.updateUI() def main(self, options): self.options = options res = self.layout.runOnce() self.screen.finish() button = self.button_bar.buttonPressed(res) if button == "ok": self.screen.suspend() res = self.cache.commit(apt.progress.text.AcquireProgress(), apt.progress.base.InstallProgress())
class SnackInterface(): def __init__(self, margin, title, message=None, vendor_text=None, args=None): self.debug_mode = args is not None and args.debug self.screen = SnackScreen() # set usual colors for i in colorsets["ROOT"], colorsets["ROOTTEXT"], colorsets[ "HELPLINE"], colorsets["EMPTYSCALE"]: self.screen.setColor(i, "white", "blue") if not self.debug_mode else \ self.screen.setColor(i, "brightgreen", "black") # remove silly default help text self.screen.popHelpLine() # write static messages self.screen.drawRootText((self.screen.width - len(message)) // 2, 4, message) self.screen.drawRootText(-len(vendor_text) - 2, -2, vendor_text) if self.debug_mode: # write some static debug information self.screen.drawRootText(1, 1, _("DEBUG MODE")) self.screen.drawRootText( 2, 2, "screen {}×{}".format(self.screen.width, self.screen.height)) self.screen.drawRootText(2, 3, "file {}".format(args.input)) self.window_width = self.screen.width - margin * 2 # assemble our progress bar self.scale = Scale(self.window_width, 100) self.spacer = Label("") self.taskbox = Textbox(self.window_width - 2, 1, "") self.messagebox = Textbox(self.window_width - 8, 1, " . . . ") self.grid = Grid(1, 4) self.grid.setField(self.scale, 0, 0) self.grid.setField(self.spacer, 0, 1) self.grid.setField(self.taskbox, 0, 2) self.grid.setField(self.messagebox, 0, 3) self.grid.place(1, 1) self.screen.gridWrappedWindow(self.grid, title) self.form = Form() self.form.add(self.scale) self.form.add(self.taskbox) self.form.add(self.messagebox) self.form.draw() self.screen.refresh() def update_task(self, percent, task, description): self.taskbox.setText(description) self.update(percent, "") def update(self, percent, text=None): progress = int(percent) self.scale.set(progress) self.form.draw() self.screen.refresh() if text is not None: self.messagebox.setText(text) self.form.draw() self.screen.refresh() def debug(self, message): self.screen.popHelpLine() self.screen.pushHelpLine("[DEBUG] {}".format(message)) self.screen.refresh() def cleanup(self): self.screen.popWindow() self.screen.finish()