Viewing file: InstallDruid.py (22.7 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
#!/usr/bin/python import signal import gtk import gtk.glade import os import package_gui import rpm import getopt import sys import locale import gnome.ui
from method import * from rhpl.translate import _, N_, textdomain from Progress import * from ProgressDialog import SimpleProgressDialog, ProgressCanceled from rhpl.GenericError import * from InstallProgressDialog import * from SummaryModel import SummaryModel from CompsCheckDialog import * from UnresolvableDependenciesDialog import * from LoopDialog import *
from config import *
needsumount = 0
def do_quit(method): if needsumount == 1: # print "trying to unmount" try: method.umount() except: pass # print "quitting" gtk.main_quit()
class InstallDruid (gtk.Window): STATE_CLOSE=0 STATE_SPLASH=1 STATE_SYSTEM_INFO=2 STATE_SELECTION_SCREEN=3 STATE_DEPS_CHECK=4 STATE_CONFIRM_INSTALL=5 STATE_INSTALLING=6 STATE_SUMMARY=7
def __init__ (self, cdmethod, mainmethod): gtk.Window.__init__ (self, gtk.WINDOW_TOPLEVEL) self.simple_progress = None self.run_state = self.STATE_SPLASH
self.set_title(_("Package Management"))
i = gtk.Invisible() i.selection_owner_set("_NAUTILUS_DISABLE_MOUNT_WINDOW")
if os.environ.has_key("REDHAT_FIRSTBOOT"): self.set_position(gtk.WIN_POS_CENTER)
self.method = cdmethod self.fullmethod = mainmethod self.usingfulltree = 0
self.need_setup = True self.connect ('delete_event', self.delete_event_cb) self.set_default_size (640, 480)
# get the glade file glade_file = "InstallDruid.glade" if not os.path.isfile(glade_file): glade_file = GLADEDIR + glade_file xml = gtk.glade.XML (glade_file, domain=PROGNAME)
# setup the druid. self.druid = gnome.ui.Druid () self.druid.connect ('cancel', self.cancel_cb) self.add (self.druid)
# setup the first page self.title_page = gnome.ui.DruidPage () self.title_page.connect ('prepare', self.title_prepare) self.title_page.connect ('next', self.title_next) xml.get_widget ('title_page_eventbox').modify_bg (gtk.STATE_NORMAL, gtk.gdk.color_parse ("#707070")) logo_file_name = self.method.getPixmapFile('package-installer-logo.png', 1) if logo_file_name == None: logo_file_name = self.method.getPixmapFile('system-config-packages.png') xml.get_widget ('title_page_logo_image').set_from_file (logo_file_name) watermark_file_name = self.method.getPixmapFile('package-installer-watermark.png') if watermark_file_name == None: watermark_file_name = RHCPIXMAPSDIR + 'system-config-packages-watermark.png' xml.get_widget ('title_page_image').set_from_file (watermark_file_name) xml.get_widget ('title_page_welcome_label').set_text (_("Install packages from '%s'") % self.method.getReleaseName()) dialog = xml.get_widget ('title_page_window') vbox = xml.get_widget ('title_page_vbox') dialog.remove (vbox) self.title_page.add (vbox) self.druid.append_page (self.title_page)
# setup the second page self.main_page = gnome.ui.DruidPage () self.main_page.connect ('next', self.main_next) self.main_page.connect ('back', self.main_back) self.main_page_vbox = xml.get_widget ('main_page_vbox') self.main_page.connect ('prepare', self.main_prepare) xml.get_widget ('main_page_eventbox').modify_bg (gtk.STATE_NORMAL, gtk.gdk.color_parse ("#707070")) xml.get_widget ('main_page_logo_image').set_from_file (logo_file_name)
dialog = xml.get_widget ('main_page_window') vbox = xml.get_widget ('main_page_vbox') dialog.remove (vbox) self.main_page.add (vbox) self.druid.append_page (self.main_page)
# setup the third page self.confirm_page = gnome.ui.DruidPage () self.confirm_page_title_label = xml.get_widget ('confirm_page_title_label') self.confirm_page_summary_label = xml.get_widget ('confirm_page_summary_label') tree_view = xml.get_widget ('confirm_page_description_tree_view') setup_summary_tree (tree_view) self.confirm_page_description_model = SummaryModel () tree_view.set_model (self.confirm_page_description_model) self.confirm_page.connect ('next', self.confirm_next) self.confirm_page.connect ('back', self.confirm_back) self.confirm_page_vbox = xml.get_widget ('confirm_page_vbox') self.confirm_page.connect ('prepare', self.confirm_prepare) xml.get_widget ('confirm_page_eventbox').modify_bg (gtk.STATE_NORMAL, gtk.gdk.color_parse ("#707070")) xml.get_widget ('confirm_page_logo_image').set_from_file (logo_file_name)
dialog = xml.get_widget ('confirm_page_window') vbox = xml.get_widget ('confirm_page_vbox') dialog.remove (vbox) self.confirm_page.add (vbox) self.druid.append_page (self.confirm_page)
# setup the last page self.summary_page = gnome.ui.DruidPage () self.summary_page_title_label = xml.get_widget ('summary_page_title_label') self.summary_page_summary_label = xml.get_widget ('summary_page_summary_label') self.summary_page.connect ('finish', self.summary_finish) self.summary_page_vbox = xml.get_widget ('summary_page_vbox') self.summary_page.connect ('prepare', self.summary_prepare) xml.get_widget ('summary_page_eventbox').modify_bg (gtk.STATE_NORMAL, gtk.gdk.color_parse ("#707070")) xml.get_widget ('summary_page_logo_image').set_from_file (logo_file_name) xml.get_widget ('summary_page_image').set_from_file (watermark_file_name)
dialog = xml.get_widget ('summary_page_window') vbox = xml.get_widget ('summary_page_vbox') dialog.remove (vbox) self.summary_page.add (vbox) self.druid.append_page (self.summary_page)
# Done. self.show_all ()
def cancel_cb (self, *args): if self.run_state == self.STATE_SPLASH or \ self.run_state == self.STATE_SELECTION_SCREEN or \ self.run_state == self.STATE_CONFIRM_INSTALL or \ self.run_state == self.STATE_SUMMARY: do_quit(self.method) elif self.run_state == self.STATE_SYSTEM_INFO or \ self.run_state == self.STATE_DEPS_CHECK: self.simple_progress.cancel () elif self.run_state == self.STATE_INSTALLING: return True self.run_state = self.STATE_CLOSE return True
def delete_event_cb (self, window, event): # print self.run_state if self.run_state == self.STATE_SPLASH or \ self.run_state == self.STATE_SELECTION_SCREEN or \ self.run_state == self.STATE_CONFIRM_INSTALL or \ self.run_state == self.STATE_SUMMARY: do_quit(self.method) elif self.run_state == self.STATE_SYSTEM_INFO or \ self.run_state == self.STATE_DEPS_CHECK: self.simple_progress.cancel () self.run_state = self.STATE_CLOSE return True
def title_prepare (self, druid_page, druid): self.run_state = self.STATE_SPLASH self.druid.set_buttons_sensitive (False, True, True, True)
def title_next (self, druid_page, druid): self.run_state = self.STATE_SYSTEM_INFO gtk.main_quit () return True
def screen_changed (self, screen): self.to_install = False self.to_remove = False for package in self.comps.hdrlist.values(): if package.installState == TOINSTALL: self.to_install = True if package.installState == TOREMOVE: self.to_remove = True
if self.to_install or self.to_remove: self.druid.set_buttons_sensitive (True, True, True, True) else: self.druid.set_buttons_sensitive (True, False, True, True) def main_prepare (self, druid_page, druid): self.run_state = self.STATE_SELECTION_SCREEN self.druid.set_buttons_sensitive (True, True, True, True) self.changed_id = self.screen.connect ('changed', self.screen_changed) self.screen_changed (self.screen)
def main_back (self, druid_page, druid): if self.changed_id: self.screen.disconnect (self.changed_id) self.changed_id = 0 self.run_state = self.STATE_SPLASH gtk.main_quit () return True
def main_next (self, druid_page, druid): if self.changed_id: self.screen.disconnect (self.changed_id) self.changed_id = 0 self.run_state = self.STATE_DEPS_CHECK gtk.main_quit () return True
def confirm_prepare (self, druid_page, druid): self.install_count = 0 self.remove_count = 0 size_delta = 0 install_list = [] remove_list = []
for te in self.ts: package_name = GroupSet.tenevra(te) package = self.comps.hdrlist[package_name] if te.Type() == (1 << 0): # TR_ADDED self.install_count += 1 size_delta += package[rpm.RPMTAG_SIZE] install_list.append ( (package_name, size_string (package[rpm.RPMTAG_SIZE]))) elif te.Type() == (1 << 1): # TR_REMOVED self.remove_count += 1 size_delta -= package[rpm.RPMTAG_SIZE] remove_list.append ( (package_name, size_string (package[rpm.RPMTAG_SIZE])))
assert (install_list != [] or remove_list !=[]) summary_label_text = "" if install_list != [] and remove_list != []: self.confirm_page_title_label.set_markup (_("<span size=\"xx-large\" color=\"white\">Package Update Overview</span>")) elif remove_list == []: self.confirm_page_title_label.set_markup (_("<span size=\"xx-large\" color=\"white\">Package Installation Overview</span>")) else: self.confirm_page_title_label.set_markup (_("<span size=\"xx-large\" color=\"white\">Package Removal Overview</span>")) summary_label_text = "" if self.install_count == 1: summary_label_text += _("%d package is queued for installation\n") % self.install_count elif self.install_count > 1: summary_label_text += _("%d packages are queued for installation\n") % self.install_count if self.remove_count == 1: summary_label_text += _("%d package is queued for removal\n") % self.remove_count elif self.remove_count > 1: summary_label_text += _("%d packages are queued for removal\n") % self.remove_count summary_label_text += "\n" if size_delta < 0: summary_label_text += _("This will free up %s of diskspace.") % size_string (size_delta * -1) else: summary_label_text += _("This will take %s of diskspace.") % size_string (size_delta)
if self.remove_count > MAX_PACKAGE_REMOVE_WARN: summary_label_text += "\n\n<b>" + _("Warning:") + "</b> " summary_label_text += _("An excessive number of packages are queued for removal. Please check the list below to confirm that all the packages should be removed.") self.confirm_page_summary_label.set_text (summary_label_text) self.confirm_page_description_model.set_packages (install_list, remove_list)
def confirm_back (self, druid_page, druid): self.comps.revertState() self.run_state = self.STATE_SELECTION_SCREEN gtk.main_quit () return True
def confirm_next (self, druid_page, druid): self.run_state = self.STATE_INSTALLING gtk.main_quit () return True def summary_prepare (self, druid_page, druid): if self.install_count != 0 and self.remove_count != 0: self.summary_page_title_label.set_markup ("<span size=\"xx-large\" color=\"white\">" + _("Package Update Complete") + "</span>") self.summary_page_summary_label.set_text (_("The packages were updated successfully.")) elif self.install_count != 0: self.summary_page_title_label.set_markup ("<span size=\"xx-large\" color=\"white\">" + _("Package Installation Complete") + "</span>") self.summary_page_summary_label.set_text (_("The packages were installed successfully.")) else: self.summary_page_title_label.set_markup ("<span size=\"xx-large\" color=\"white\">" + _("Package Removal Complete") + "</span>") self.summary_page_summary_label.set_text (_("The packages were removed successfully."))
self.druid.set_buttons_sensitive (False, True, True, True) self.druid.set_show_finish (True) self.druid.finish.set_label (_("Finish"))
def summary_finish (self, druid_page, druid): self.run_state = self.STATE_CLOSE gtk.main_quit () return True
def do_system_info_state (self, get_full = 0): if self.need_setup or get_full == 1: try: self.simple_progress = SimpleProgressDialog ("<span weight=\"bold\" size=\"larger\">" + _("Checking system package status") + "</span>\n\n" + _("The package manager program is searching your system to determine which packages are currently installed."), _("Checking System Status"),_("Checking System Status"), self) self.simple_progress.get_dialog().set_modal (True) self.simple_progress.get_dialog().show () self.simple_progress.get_dialog().window.set_functions (gtk.gdk.FUNC_MOVE | gtk.gdk.FUNC_MINIMIZE)
# I don't trust that all window managers will honor the Motif hints. def no_delete (*args): return True self.simple_progress.get_dialog().connect ('delete_event', no_delete)
# FIXME: this is a hack. if we're getting the full info, # get the header list from the full method and then add # (aka merge) them into the main hdrlist self.simple_progress.prepare_block (0.2, _("Reading RPM Headers")) if get_full == 0: hdlist = self.method.readHeaders() else: hdlist = self.fullmethod.readHeaders() self.comps.hdrlist.addHeaders(hdlist.hdlist, self.fullmethod) hdlist = self.comps.hdrlist self.usingfulltree = 1 self.simple_progress.update (1.0)
self.simple_progress.prepare_block (0.3, _("Processing Headers")) hdlist.mergeRpmDb() self.simple_progress.update (1.0)
self.simple_progress.prepare_block (0.5, _("Reading system state")) if get_full == 0: self.comps = self.method.readCompsViaMethod(hdlist, self.simple_progress.update) # else: # self.comps.setupStateDicts(self.comps.packages) self.simple_progress.update (1.0) self.simple_progress.destroy () self.simple_progress = None
if get_full == 0: # successfully got the system info. Now make the # install screen. self.screen = package_gui.PackageSelectionWindow() screen_widget = self.screen.getScreen(self.comps, self.method) screen_widget.show_all() self.main_page_vbox.pack_start (screen_widget, True, True) self.need_setup = False except ProgressCanceled: self.run_state = self.STATE_CLOSE return self.run_state = self.STATE_SELECTION_SCREEN
def do_deps_check_state (self): try: self.simple_progress = SimpleProgressDialog ("<span weight=\"bold\" size=\"larger\">" + _("Preparing System Update") + "</span>\n\n" + _("Prior to system update, this tool must determine which packages need upgrading. This may take a few minutes."), _("Preparing System Update"),_("Preparing System Update"), self) self.simple_progress.get_dialog().set_modal (True) self.simple_progress.get_dialog().show () def delete_event (window, event, dialog): dialog.cancel () return True self.simple_progress.get_dialog().connect ('delete_event', delete_event, self.simple_progress) self.ts = self.method.setupTransaction(self.comps, self.simple_progress) except CancelInstallation: self.run_state = self.STATE_SELECTION_SCREEN except DepsCheckLoop: # Immediately destroy the deps check. self.simple_progress.destroy () self.simple_progress = None dialog = LoopDialog (sys.exc_value.install_list, sys.exc_value.remove_list, self) result = dialog.run () if result == LOOP_RESPONSE_KEEP: # print 'ADD THE FILES' self.run_state = self.STATE_CONFIRM_INSTALL elif result == LOOP_RESPONSE_REMOVE: # print 'REMOVE THE FILES' self.run_state = self.STATE_CONFIRM_INSTALL else: self.run_state = self.STATE_SELECTION_SCREEN return except DepsCheckComps: self.simple_progress.destroy () self.simple_progress = None dialog = CompsCheckDialog (sys.exc_value.failed_list, sys.exc_value.unremovable_list, self) dialog.run () self.run_state = self.STATE_SELECTION_SCREEN return except UnresolvableDependencies: self.simple_progress.destroy () self.simple_progress = None if self.usingfulltree == 1: dialog = UnresolvableDependenciesDialog (sys.exc_value.unresolvable_dependencies, self) dialog.run () self.run_state = self.STATE_SELECTION_SCREEN return else: self.do_system_info_state(get_full = 1) self.run_state = self.STATE_DEPS_CHECK return else: self.run_state = self.STATE_CONFIRM_INSTALL self.simple_progress.destroy () self.simple_progress = None
def do_install_state (self): if self.install_count != 0 and self.remove_count != 0: title = _("Upgrading System") dialog_string = "<span weight=\"bold\" size=\"larger\">" + _("Upgrading System") + "</span>\n\n" + _("Installing and removing individual packages.") elif self.install_count != 0: title = _("Installing Packages") dialog_string = "<span weight=\"bold\" size=\"larger\">" + _("Installing Packages") + "</span>\n\n" + _("Adding individual packages to the system.") else: title = _("Removing Packages") dialog_string = "<span weight=\"bold\" size=\"larger\">" + _("Removing Packages") + "</span>\n\n" + _("Removing individual packages from the system.")
self.simple_progress = SimpleProgressDialog (dialog_string, title,_("System Update"), self) self.simple_progress.get_dialog().set_modal (True) self.simple_progress.get_dialog().show () self.simple_progress.get_dialog().window.set_functions (gtk.gdk.FUNC_MOVE | gtk.gdk.FUNC_MINIMIZE)
# I don't trust that all window managers will honor the Motif hints. def no_delete (*args): return True self.simple_progress.get_dialog().connect ('delete_event', no_delete)
self.method.installPackages(self.ts, self.comps, self.simple_progress) self.simple_progress.destroy () self.simple_progress = None self.run_state = self.STATE_SUMMARY
def run (self): while 1: if self.run_state == self.STATE_SPLASH: self.druid.set_page (self.title_page) gtk.main() elif self.run_state == self.STATE_SELECTION_SCREEN: self.druid.set_page (self.main_page) gtk.main() elif self.run_state == self.STATE_CONFIRM_INSTALL: self.druid.set_page (self.confirm_page) gtk.main() elif self.run_state == self.STATE_SUMMARY: self.druid.set_page (self.summary_page) gtk.main() elif self.run_state == self.STATE_SYSTEM_INFO: self.do_system_info_state () elif self.run_state == self.STATE_DEPS_CHECK: self.do_deps_check_state () elif self.run_state == self.STATE_INSTALLING: self.do_install_state () elif self.run_state == self.STATE_CLOSE: return def help(): sys.stderr.write("Usage: system-cdinstall-helper [--mountpoint=PATH] [--ismounted] [--cdtree=PATH]\n\t%s\n" %(default_args_help(),))
if __name__ == '__main__': locale.setlocale(locale.LC_ALL,"") signal.signal (signal.SIGINT, signal.SIG_DFL)
longargs = default_long_args() longargs.extend(['cdtree=', 'mountpoint=', 'ismounted', 'firstboot']) try: (args, extra) = getopt.getopt(sys.argv[1:], default_short_args(), longargs) except getopt.GetoptError, e: sys.stderr.write(str(e)) sys.stderr.write("\n") help() sys.exit(1)
cdmethod = None mountpoint = "/mnt/cdrom" mounted = 0 for (arg, val) in args: if (arg == '--help'): help() sys.exit(0) # if run from firstboot, we want to come up centered which has to # be app specific hacks instead of metacity. bleah elif (arg == '--firstboot'): os.environ["REDHAT_FIRSTBOOT"] = "1" elif (arg == '--cdtree'): cdmethod = TreeInstallMethod(val) elif (arg == '--mountpoint'): mountpoint = val elif (arg == '--ismounted'): mounted = 1
needsumount = not mounted mainmethod = get_method(args)
if cdmethod is None: cdmethod = CdromInstallMethod(mountpoint = mountpoint, alreadyMounted = mounted)
if os.geteuid() != 0: GenericError (TYPE_ERROR, _("Your account does not have permissions to run %s.") % "system-cdinstall-helper", _("Administrator level permissions are needed to run this program because it can install and remove system packages.")).display () sys.exit (1)
textdomain(PROGNAME) gtk.glade.bindtextdomain(PROGNAME, "/usr/share/locale")
druid = InstallDruid (cdmethod, mainmethod)
druid.run ()
|