home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / python2.6 / dist-packages / UpdateManager / UpdateManager.pyc (.txt) < prev   
Encoding:
Python Compiled Bytecode  |  2009-10-12  |  31.2 KB  |  806 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import pygtk
  5. pygtk.require('2.0')
  6. import gtk
  7. import gtk.gdk as gtk
  8. import gtk.glade as gtk
  9.  
  10. try:
  11.     import gconf
  12. except:
  13.     import fakegconf as gconf
  14.  
  15. import gobject
  16. import warnings
  17. warnings.filterwarnings('ignore', 'apt API not stable yet', FutureWarning)
  18. import apt
  19. import apt_pkg
  20. import gettext
  21. import copy
  22. import string
  23. import sys
  24. import os
  25. import os.path as os
  26. import stat
  27. import re
  28. import locale
  29. import tempfile
  30. import pango
  31. import subprocess
  32. import pwd
  33. import urllib2
  34. import httplib
  35. import socket
  36. import time
  37. import thread
  38. import xml.sax.saxutils as xml
  39. import dbus
  40. import dbus.service as dbus
  41. import dbus.glib as dbus
  42. import GtkProgress
  43. from gettext import gettext as _
  44. from gettext import ngettext
  45. from Core.utils import *
  46. from Core.UpdateList import UpdateList
  47. from Core.MyCache import MyCache, NotEnoughFreeSpaceError
  48. from Core.MetaRelease import Dist
  49. from DistUpgradeFetcher import DistUpgradeFetcherGtk
  50. from ChangelogViewer import ChangelogViewer
  51. from SimpleGladeApp import SimpleGladeApp
  52. from HelpViewer import HelpViewer
  53. from MetaReleaseGObject import MetaRelease
  54. (LIST_CONTENTS, LIST_NAME, LIST_PKG, LIST_ORIGIN) = range(4)
  55. (INSTALL, UPDATE) = range(2)
  56.  
  57. class UpdateManagerDbusControler(dbus.service.Object):
  58.     ''' this is a helper to provide the UpdateManagerIFace '''
  59.     
  60.     def __init__(self, parent, bus_name, object_path = '/org/freedesktop/UpdateManagerObject'):
  61.         dbus.service.Object.__init__(self, bus_name, object_path)
  62.         self.parent = parent
  63.  
  64.     
  65.     def bringToFront(self):
  66.         self.parent.window_main.present()
  67.         return True
  68.  
  69.     bringToFront = dbus.service.method('org.freedesktop.UpdateManagerIFace')(bringToFront)
  70.  
  71.  
  72. class UpdateManager(SimpleGladeApp):
  73.     
  74.     def __init__(self, datadir, options):
  75.         self.setupDbus()
  76.         gtk.window_set_default_icon_name('update-manager')
  77.         self.datadir = datadir
  78.         SimpleGladeApp.__init__(self, datadir + 'glade/UpdateManager.glade', None, domain = 'update-manager')
  79.         self.image_logo.set_from_icon_name('update-manager', gtk.ICON_SIZE_DIALOG)
  80.         self.window_main.set_sensitive(False)
  81.         self.window_main.grab_focus()
  82.         self.button_close.grab_focus()
  83.         self.dl_size = 0
  84.         self.textview_changes = ChangelogViewer()
  85.         self.textview_changes.show()
  86.         self.scrolledwindow_changes.add(self.textview_changes)
  87.         changes_buffer = self.textview_changes.get_buffer()
  88.         changes_buffer.create_tag('versiontag', weight = pango.WEIGHT_BOLD)
  89.         self.expander_details.connect('notify::expanded', self.activate_details)
  90.         self.window_main.connect('delete_event', self.close)
  91.         self.button_close.connect(('clicked',), (lambda w: self.exit()))
  92.         self.store = gtk.ListStore(str, str, gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT)
  93.         self.treeview_update.set_model(self.store)
  94.         self.treeview_update.set_headers_clickable(True)
  95.         tr = gtk.CellRendererText()
  96.         tr.set_property('xpad', 6)
  97.         tr.set_property('ypad', 6)
  98.         cr = gtk.CellRendererToggle()
  99.         cr.set_property('activatable', True)
  100.         cr.set_property('xpad', 6)
  101.         cr.connect('toggled', self.toggled)
  102.         column_install = gtk.TreeViewColumn('Install', cr)
  103.         column_install.set_cell_data_func(cr, self.install_column_view_func)
  104.         column = gtk.TreeViewColumn('Name', tr, markup = LIST_CONTENTS)
  105.         column.set_resizable(True)
  106.         (major, minor, patch) = gtk.pygtk_version
  107.         if major >= 2 and minor >= 5:
  108.             column_install.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
  109.             column_install.set_fixed_width(30)
  110.             column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
  111.             column.set_fixed_width(100)
  112.             self.treeview_update.set_fixed_height_mode(False)
  113.         
  114.         self.treeview_update.append_column(column_install)
  115.         column_install.set_visible(True)
  116.         self.treeview_update.append_column(column)
  117.         self.treeview_update.set_search_column(LIST_NAME)
  118.         self.treeview_update.connect('button-press-event', self.show_context_menu)
  119.         self.treeview_update.connect('row-activated', self.row_activated)
  120.         if not os.path.exists('/usr/bin/software-properties-gtk'):
  121.             self.button_settings.set_sensitive(False)
  122.         
  123.         self.gconfclient = gconf.client_get_default()
  124.         init_proxy(self.gconfclient)
  125.         
  126.         try:
  127.             self.show_versions = self.gconfclient.get_bool('/apps/update-manager/show_versions')
  128.         except gobject.GError:
  129.             e = None
  130.             self.show_versions = False
  131.  
  132.         
  133.         try:
  134.             self.gconfclient.set_int('/apps/update-manager/launch_time', int(time.time()))
  135.         except gobject.GError:
  136.             e = None
  137.             print 'Error setting launch_time: ', e
  138.  
  139.         self.progress = GtkProgress.GtkOpProgress(self.dialog_cacheprogress, self.progressbar_cache, self.label_cache, self.window_main)
  140.         self.restore_state()
  141.         if options.no_focus_on_map:
  142.             self.window_main.set_focus_on_map(False)
  143.             self.progress._window.set_focus_on_map(False)
  144.         
  145.         self.window_main.show()
  146.         if options.no_focus_on_map:
  147.             self.window_main.iconify()
  148.             self.window_main.set_urgency_hint(True)
  149.             self.window_main.connect('focus-in-event', (lambda w, e: if w.set_urgency_hint(False):
  150. passFalse))
  151.         
  152.  
  153.     
  154.     def install_column_view_func(self, cell_layout, renderer, model, iter):
  155.         pkg = model.get_value(iter, LIST_PKG)
  156.         renderer.set_property('visible', pkg != None)
  157.         if pkg is None:
  158.             return None
  159.         if not pkg.markedInstall:
  160.             pass
  161.         to_install = pkg.markedUpgrade
  162.         renderer.set_property('active', to_install)
  163.         if pkg.name in self.list.held_back:
  164.             renderer.set_property('activatable', False)
  165.         else:
  166.             renderer.set_property('activatable', True)
  167.  
  168.     
  169.     def setupDbus(self):
  170.         ''' this sets up a dbus listener if none is installed alread '''
  171.         
  172.         try:
  173.             bus = dbus.SessionBus()
  174.         except:
  175.             print 'warning: could not initiate dbus'
  176.             return None
  177.  
  178.         
  179.         try:
  180.             proxy_obj = bus.get_object('org.freedesktop.UpdateManager', '/org/freedesktop/UpdateManagerObject')
  181.             iface = dbus.Interface(proxy_obj, 'org.freedesktop.UpdateManagerIFace')
  182.             iface.bringToFront()
  183.             sys.exit(0)
  184.         except dbus.DBusException:
  185.             e = None
  186.             bus_name = dbus.service.BusName('org.freedesktop.UpdateManager', bus)
  187.             self.dbusControler = UpdateManagerDbusControler(self, bus_name)
  188.  
  189.  
  190.     
  191.     def on_checkbutton_reminder_toggled(self, checkbutton):
  192.         self.gconfclient.set_bool('/apps/update-manager/remind_reload', not checkbutton.get_active())
  193.  
  194.     
  195.     def close(self, widget, data = None):
  196.         if self.window_main.get_property('sensitive') is False:
  197.             return True
  198.         self.exit()
  199.  
  200.     
  201.     def set_changes_buffer(self, changes_buffer, text, name, srcpkg):
  202.         changes_buffer.set_text('')
  203.         lines = text.split('\n')
  204.         if len(lines) == 1:
  205.             changes_buffer.set_text(text)
  206.             return None
  207.         for line in lines:
  208.             end_iter = changes_buffer.get_end_iter()
  209.             version_match = re.match('^%s \\((.*)\\)(.*)\\;.*$' % re.escape(srcpkg), line)
  210.             author_match = re.match('^.*--.*<.*@.*>.*$', line)
  211.             if version_match:
  212.                 version = version_match.group(1)
  213.                 upload_archive = version_match.group(2).strip()
  214.                 version_text = _('Version %s: \n') % version
  215.                 changes_buffer.insert_with_tags_by_name(end_iter, version_text, 'versiontag')
  216.                 continue
  217.             len(lines) == 1
  218.             if author_match:
  219.                 continue
  220.             changes_buffer.insert(end_iter, line + '\n')
  221.         
  222.  
  223.     
  224.     def on_treeview_update_cursor_changed(self, widget):
  225.         tuple = widget.get_cursor()
  226.         path = tuple[0]
  227.         if path == None:
  228.             return None
  229.         model = widget.get_model()
  230.         iter = model.get_iter(path)
  231.         pkg = model.get_value(iter, LIST_PKG)
  232.         if pkg == None or pkg.description == None:
  233.             changes_buffer = self.textview_changes.get_buffer()
  234.             changes_buffer.set_text('')
  235.             desc_buffer = self.textview_descr.get_buffer()
  236.             desc_buffer.set_text('')
  237.             self.notebook_details.set_sensitive(False)
  238.             return None
  239.         long_desc = pkg.description
  240.         self.notebook_details.set_sensitive(True)
  241.         i = long_desc.find('\n')
  242.         long_desc = long_desc[i + 1:]
  243.         p = re.compile('^(\\s|\\t)*(\\*|0|-)', re.MULTILINE)
  244.         long_desc = p.sub('\n*', long_desc)
  245.         p = re.compile('\\n', re.MULTILINE)
  246.         long_desc = p.sub(' ', long_desc)
  247.         p = re.compile('\\s\\s+', re.MULTILINE)
  248.         long_desc = p.sub('\n', long_desc)
  249.         desc_buffer = self.textview_descr.get_buffer()
  250.         desc_buffer.set_text(long_desc)
  251.         name = model.get_value(iter, LIST_NAME)
  252.         if name == None:
  253.             return None
  254.         changes_buffer = self.textview_changes.get_buffer()
  255.         if self.cache.all_changes.has_key(name):
  256.             changes = self.cache.all_changes[name]
  257.             self.set_changes_buffer(changes_buffer, changes[0], name, changes[1])
  258.         elif self.expander_details.get_expanded():
  259.             lock = thread.allocate_lock()
  260.             lock.acquire()
  261.             t = thread.start_new_thread(self.cache.get_news_and_changelog, (name, lock))
  262.             changes_buffer.set_text('%s\n' % _('Downloading list of changes...'))
  263.             iter = changes_buffer.get_iter_at_line(1)
  264.             anchor = changes_buffer.create_child_anchor(iter)
  265.             button = gtk.Button(stock = 'gtk-cancel')
  266.             self.textview_changes.add_child_at_anchor(button, anchor)
  267.             button.show()
  268.             id = button.connect('clicked', (lambda w, lock: lock.release()), lock)
  269.             while lock.locked():
  270.                 time.sleep(0.01)
  271.                 while gtk.events_pending():
  272.                     gtk.main_iteration()
  273.                     continue
  274.                     pkg.description == None
  275.                 continue
  276.                 path == None
  277.             button.hide()
  278.             button.disconnect(id)
  279.         
  280.         changes = ''
  281.         srcpkg = self.cache[name].sourcePackageName
  282.         if self.cache.all_changes.has_key(name):
  283.             changes += self.cache.all_changes[name]
  284.         
  285.         if changes:
  286.             self.set_changes_buffer(changes_buffer, changes, name, srcpkg)
  287.         
  288.  
  289.     
  290.     def show_context_menu(self, widget, event):
  291.         '''
  292.     Show a context menu if a right click was performed on an update entry
  293.     '''
  294.         if event.type == gtk.gdk.BUTTON_PRESS and event.button == 3:
  295.             menu = gtk.Menu()
  296.             item_select_none = gtk.MenuItem(_('_Uncheck All'))
  297.             item_select_none.connect('activate', self.select_none_updgrades)
  298.             menu.add(item_select_none)
  299.             num_updates = self.cache.installCount
  300.             if num_updates == 0:
  301.                 item_select_none.set_property('sensitive', False)
  302.             
  303.             item_select_all = gtk.MenuItem(_('_Check All'))
  304.             item_select_all.connect('activate', self.select_all_updgrades)
  305.             menu.add(item_select_all)
  306.             menu.popup(None, None, None, 0, event.time)
  307.             menu.show_all()
  308.             return True
  309.  
  310.     
  311.     def select_all_updgrades(self, widget):
  312.         '''
  313.     Select all updates
  314.     '''
  315.         self.setBusy(True)
  316.         self.cache.saveDistUpgrade()
  317.         self.treeview_update.queue_draw()
  318.         self.refresh_updates_count()
  319.         self.setBusy(False)
  320.  
  321.     
  322.     def select_none_updgrades(self, widget):
  323.         '''
  324.     Select none updates
  325.     '''
  326.         self.setBusy(True)
  327.         self.cache.clear()
  328.         self.treeview_update.queue_draw()
  329.         self.refresh_updates_count()
  330.         self.setBusy(False)
  331.  
  332.     
  333.     def setBusy(self, flag):
  334.         ''' Show a watch cursor if the app is busy for more than 0.3 sec.
  335.       Furthermore provide a loop to handle user interface events '''
  336.         if self.window_main.window is None:
  337.             return None
  338.         if flag == True:
  339.             self.window_main.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
  340.         else:
  341.             self.window_main.window.set_cursor(None)
  342.         while gtk.events_pending():
  343.             gtk.main_iteration()
  344.  
  345.     
  346.     def refresh_updates_count(self):
  347.         self.button_install.set_sensitive(self.cache.installCount)
  348.         
  349.         try:
  350.             self.dl_size = self.cache.requiredDownload
  351.             self.label_downsize.set_markup(_('Download size: %s') % humanize_size(self.dl_size))
  352.         except SystemError:
  353.             e = None
  354.             print 'requiredDownload could not be calculated: %s' % e
  355.             self.label_downsize.set_markup(_('Unknown download size'))
  356.  
  357.  
  358.     
  359.     def _get_last_apt_get_update_text(self):
  360.         '''
  361.       return a human readable string with the information when
  362.       the last apt-get update was run
  363.       '''
  364.         if not os.path.exists('/var/lib/apt/periodic/update-success-stamp'):
  365.             return _("It is unknown when the package information was updated last. Please try clicking on the 'Check' button to update the information.")
  366.         mtime = os.stat('/var/lib/apt/periodic/update-success-stamp')[stat.ST_MTIME]
  367.         ago_days = int((time.time() - mtime) / 86400)
  368.         ago_hours = int((time.time() - mtime) / 3600)
  369.         if ago_days > 0:
  370.             return ngettext('The package information was last updated %s day ago.', 'The package information was last updated %s days ago.', ago_days) % ago_days
  371.         if ago_hours > 0:
  372.             return ngettext('The package information was last updated %s hour ago.', 'The package information was last updated %s hours ago.', ago_hours) % ago_hours
  373.         return _('The package information was last updated less than one hour ago.')
  374.  
  375.     
  376.     def update_count(self):
  377.         '''activate or disable widgets and show dialog texts correspoding to
  378.          the number of available updates'''
  379.         self.refresh_updates_count()
  380.         num_updates = self.cache.installCount
  381.         text_label_main = _('Software updates correct errors, eliminate security vulnerabilities and provide new features.')
  382.         if num_updates == 0:
  383.             text_header = '<big><b>%s</b></big>' % _('Your system is up-to-date')
  384.             text_download = ''
  385.             self.notebook_details.set_sensitive(False)
  386.             self.treeview_update.set_sensitive(False)
  387.             self.button_install.set_sensitive(False)
  388.             self.label_downsize.set_text = ''
  389.             self.button_close.grab_default()
  390.             self.textview_changes.get_buffer().set_text('')
  391.             self.textview_descr.get_buffer().set_text('')
  392.             if self._get_last_apt_get_update_text() is not None:
  393.                 text_label_main = self._get_last_apt_get_update_text()
  394.             
  395.         else:
  396.             firstrun = self.gconfclient.get_bool('/apps/update-manager/first_run')
  397.             if firstrun:
  398.                 text_header = '<big><b>%s</b></big>' % _('Welcome to Ubuntu')
  399.                 text_label_main = _('These software updates have been issued since Ubuntu was released. If you don\'t want to install them now, choose "Update Manager" from the Administration Menu later.')
  400.                 self.gconfclient.set_bool('/apps/update-manager/first_run', False)
  401.             else:
  402.                 text_header = '<big><b>%s</b></big>' % _('Software updates are available for this computer')
  403.                 text_label_main = _('If you don\'t want to install them now, choose "Update Manager" from the Administration menu later.')
  404.             text_download = _('Download size: %s') % humanize_size(self.dl_size)
  405.             self.notebook_details.set_sensitive(True)
  406.             self.treeview_update.set_sensitive(True)
  407.             self.button_install.grab_default()
  408.             self.treeview_update.set_cursor(1)
  409.         self.label_header.set_markup(text_header)
  410.         self.label_downsize.set_markup(text_download)
  411.         self.label_main_details.set_text(text_label_main)
  412.  
  413.     
  414.     def activate_details(self, expander, data):
  415.         expanded = self.expander_details.get_expanded()
  416.         self.vbox_updates.set_child_packing(self.expander_details, expanded, True, 0, True)
  417.         self.gconfclient.set_bool('/apps/update-manager/show_details', expanded)
  418.         if expanded:
  419.             self.on_treeview_update_cursor_changed(self.treeview_update)
  420.         
  421.  
  422.     
  423.     def run_synaptic(self, id, action, lock):
  424.         
  425.         try:
  426.             apt_pkg.PkgSystemUnLock()
  427.         except SystemError:
  428.             pass
  429.  
  430.         cmd = [
  431.             '/usr/bin/gksu',
  432.             '--desktop',
  433.             '/usr/share/applications/update-manager.desktop',
  434.             '--',
  435.             '/usr/sbin/synaptic',
  436.             '--hide-main-window',
  437.             '--non-interactive',
  438.             '--parent-window-id',
  439.             '%s' % id]
  440.         if action == INSTALL:
  441.             if self.gconfclient.get_bool('/apps/update-manager/autoclose_install_window'):
  442.                 cmd.append('-o')
  443.                 cmd.append('Synaptic::closeZvt=true')
  444.             
  445.             cmd.append('--progress-str')
  446.             cmd.append('%s' % _('Please wait, this can take some time.'))
  447.             cmd.append('--finish-str')
  448.             cmd.append('%s' % _('Update is complete'))
  449.             f = tempfile.NamedTemporaryFile()
  450.             for pkg in self.cache:
  451.                 if pkg.markedInstall or pkg.markedUpgrade:
  452.                     f.write('%s\tinstall\n' % pkg.name)
  453.                     continue
  454.             
  455.             cmd.append('--set-selections-file')
  456.             cmd.append('%s' % f.name)
  457.             f.flush()
  458.             subprocess.call(cmd)
  459.             f.close()
  460.         elif action == UPDATE:
  461.             cmd.append('--update-at-startup')
  462.             subprocess.call(cmd)
  463.         else:
  464.             print 'run_synaptic() called with unknown action'
  465.             sys.exit(1)
  466.         lock.release()
  467.  
  468.     
  469.     def on_button_reload_clicked(self, widget):
  470.         self.check_metarelease()
  471.         self.invoke_manager(UPDATE)
  472.  
  473.     
  474.     def on_button_settings_clicked(self, widget):
  475.         
  476.         try:
  477.             apt_pkg.PkgSystemUnLock()
  478.         except SystemError:
  479.             pass
  480.  
  481.         cmd = [
  482.             '/usr/bin/gksu',
  483.             '--desktop',
  484.             '/usr/share/applications/software-properties.desktop',
  485.             '--',
  486.             '/usr/bin/software-properties-gtk',
  487.             '--open-tab',
  488.             '2',
  489.             '--toplevel',
  490.             '%s' % self.window_main.window.xid]
  491.         self.window_main.set_sensitive(False)
  492.         p = subprocess.Popen(cmd)
  493.         while p.poll() is None:
  494.             while gtk.events_pending():
  495.                 gtk.main_iteration()
  496.             time.sleep(0.05)
  497.         self.fillstore()
  498.  
  499.     
  500.     def on_button_install_clicked(self, widget):
  501.         err_sum = _('Not enough free disk space')
  502.         err_long = _("The upgrade needs a total of %s free space on disk '%s'. Please free at least an additional %s of disk space on '%s'. Empty your trash and remove temporary packages of former installations using 'sudo apt-get clean'.")
  503.         
  504.         try:
  505.             self.cache.checkFreeSpace()
  506.         except NotEnoughFreeSpaceError:
  507.             e = None
  508.             for req in e.free_space_required_list:
  509.                 self.error(err_sum, err_long % (req.size_total, req.dir, req.size_needed, req.dir))
  510.             
  511.             return None
  512.  
  513.         self.invoke_manager(INSTALL)
  514.  
  515.     
  516.     def invoke_manager(self, action):
  517.         os.environ['APT_LISTCHANGES_FRONTEND'] = 'none'
  518.         (dev, cookie) = inhibit_sleep()
  519.         self.window_main.set_sensitive(False)
  520.         self.window_main.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
  521.         lock = thread.allocate_lock()
  522.         lock.acquire()
  523.         t = thread.start_new_thread(self.run_synaptic, (self.window_main.window.xid, action, lock))
  524.         while lock.locked():
  525.             while gtk.events_pending():
  526.                 gtk.main_iteration()
  527.             time.sleep(0.05)
  528.         while gtk.events_pending():
  529.             gtk.main_iteration()
  530.         s = _('Reading package information')
  531.         self.label_cache_progress_title.set_label('<b><big>%s</big></b>' % s)
  532.         self.fillstore()
  533.         if cookie != False:
  534.             allow_sleep(dev, cookie)
  535.         
  536.         self.window_main.set_sensitive(True)
  537.         self.window_main.window.set_cursor(None)
  538.  
  539.     
  540.     def row_activated(self, treeview, path, column):
  541.         iter = self.store.get_iter(path)
  542.         pkg = self.store.get_value(iter, LIST_PKG)
  543.         origin = self.store.get_value(iter, LIST_ORIGIN)
  544.         if pkg is not None:
  545.             return None
  546.         self.setBusy(True)
  547.         actiongroup = apt_pkg.GetPkgActionGroup(self.cache._depcache)
  548.         for pkg in self.list.pkgs[origin]:
  549.             if pkg.markedInstall or pkg.markedUpgrade:
  550.                 pkg.markKeep()
  551.                 continue
  552.             pkg is not None
  553.             if pkg.name not in self.list.held_back:
  554.                 pkg.markInstall(autoFix = False, autoInst = False)
  555.                 continue
  556.         
  557.         if self.cache._depcache.BrokenCount:
  558.             Fix = apt_pkg.GetPkgProblemResolver(self.cache._depcache)
  559.             Fix.ResolveByKeep()
  560.         
  561.         self.refresh_updates_count()
  562.         self.treeview_update.queue_draw()
  563.         del actiongroup
  564.         self.setBusy(False)
  565.  
  566.     
  567.     def toggled(self, renderer, path):
  568.         ''' a toggle button in the listview was toggled '''
  569.         iter = self.store.get_iter(path)
  570.         pkg = self.store.get_value(iter, LIST_PKG)
  571.         if pkg is None or pkg.name in self.list.held_back:
  572.             return False
  573.         self.setBusy(True)
  574.         if pkg.markedInstall or pkg.markedUpgrade:
  575.             pkg.markKeep()
  576.             if self.cache._depcache.BrokenCount:
  577.                 Fix = apt_pkg.GetPkgProblemResolver(self.cache._depcache)
  578.                 Fix.ResolveByKeep()
  579.             
  580.         else:
  581.             pkg.markInstall()
  582.         self.treeview_update.queue_draw()
  583.         self.refresh_updates_count()
  584.         self.setBusy(False)
  585.  
  586.     
  587.     def on_treeview_update_row_activated(self, treeview, path, column, *args):
  588.         '''
  589.       If an update row was activated (by pressing space), toggle the 
  590.       install check box
  591.       '''
  592.         self.toggled(None, path)
  593.  
  594.     
  595.     def exit(self):
  596.         ''' exit the application, save the state '''
  597.         self.save_state()
  598.         sys.exit(0)
  599.  
  600.     
  601.     def save_state(self):
  602.         ''' save the state  (window-size for now) '''
  603.         (x, y) = self.window_main.get_size()
  604.         
  605.         try:
  606.             self.gconfclient.set_pair('/apps/update-manager/window_size', gconf.VALUE_INT, gconf.VALUE_INT, x, y)
  607.         except gobject.GError:
  608.             e = None
  609.             print 'Could not save the configuration to gconf: %s' % e
  610.  
  611.  
  612.     
  613.     def restore_state(self):
  614.         ''' restore the state (window-size for now) '''
  615.         expanded = self.gconfclient.get_bool('/apps/update-manager/show_details')
  616.         self.expander_details.set_expanded(expanded)
  617.         self.vbox_updates.set_child_packing(self.expander_details, expanded, True, 0, True)
  618.         (x, y) = self.gconfclient.get_pair('/apps/update-manager/window_size', gconf.VALUE_INT, gconf.VALUE_INT)
  619.         if x > 0 and y > 0:
  620.             self.window_main.resize(x, y)
  621.         
  622.  
  623.     
  624.     def fillstore(self):
  625.         self.setBusy(True)
  626.         self.dl_size = 0
  627.         
  628.         try:
  629.             self.initCache()
  630.         except SystemError:
  631.             e = None
  632.             msg = "<big><b>%s</b></big>\n\n%s\n'%s'" % (_('Could not initialize the package information'), _("An unresolvable problem occurred while initializing the package information.\n\nPlease report this bug against the 'update-manager' package and include the following error message:\n"), e)
  633.             dialog = gtk.MessageDialog(self.window_main, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, '')
  634.             dialog.set_markup(msg)
  635.             dialog.vbox.set_spacing(6)
  636.             dialog.run()
  637.             dialog.destroy()
  638.             sys.exit(1)
  639.  
  640.         self.store.clear()
  641.         self.list = UpdateList(self)
  642.         
  643.         try:
  644.             self.list.update(self.cache)
  645.         except SystemError:
  646.             e = None
  647.             msg = "<big><b>%s</b></big>\n\n%s\n'%s'" % (_('Could not calculate the upgrade'), _("An unresolvable problem occurred while calculating the upgrade.\n\nPlease report this bug against the 'update-manager' package and include the following error message:"), e)
  648.             dialog = gtk.MessageDialog(self.window_main, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, '')
  649.             dialog.set_markup(msg)
  650.             dialog.vbox.set_spacing(6)
  651.             dialog.run()
  652.             dialog.destroy()
  653.  
  654.         if self.list.num_updates > 0:
  655.             origin_list = self.list.pkgs.keys()
  656.             origin_list.sort((lambda x, y: cmp(x.importance, y.importance)))
  657.             origin_list.reverse()
  658.             for origin in origin_list:
  659.                 self.store.append([
  660.                     '<b><big>%s</big></b>' % origin.description,
  661.                     origin.description,
  662.                     None,
  663.                     origin])
  664.                 for pkg in self.list.pkgs[origin]:
  665.                     name = xml.sax.saxutils.escape(pkg.name)
  666.                     summary = xml.sax.saxutils.escape(pkg.summary)
  667.                     contents = '<b>%s</b>\n<small>%s</small>' % (name, summary)
  668.                     size = _('(Size: %s)') % humanize_size(pkg.packageSize)
  669.                     if pkg.installedVersion != None:
  670.                         version = _('From version %(old_version)s to %(new_version)s') % {
  671.                             'old_version': pkg.installedVersion,
  672.                             'new_version': pkg.candidateVersion }
  673.                     else:
  674.                         version = _('Version %s') % pkg.candidateVersion
  675.                     if self.show_versions:
  676.                         contents = '%s\n<small>%s %s</small>' % (contents, version, size)
  677.                     else:
  678.                         contents = '%s <small>%s</small>' % (contents, size)
  679.                     self.store.append([
  680.                         contents,
  681.                         pkg.name,
  682.                         pkg,
  683.                         None])
  684.                 
  685.             
  686.         
  687.         self.update_count()
  688.         self.setBusy(False)
  689.         self.check_all_updates_installable()
  690.         return False
  691.  
  692.     
  693.     def dist_no_longer_supported(self, meta_release):
  694.         msg = '<big><b>%s</b></big>\n\n%s' % (_('Your distribution is not supported anymore'), _('You will not get any further security fixes or critical updates. Upgrade to a later version of Ubuntu Linux. See http://www.ubuntu.com for more information on upgrading.'))
  695.         dialog = gtk.MessageDialog(self.window_main, 0, gtk.MESSAGE_WARNING, gtk.BUTTONS_CLOSE, '')
  696.         dialog.set_title('')
  697.         dialog.set_markup(msg)
  698.         dialog.run()
  699.         dialog.destroy()
  700.  
  701.     
  702.     def error(self, summary, details):
  703.         ''' helper function to display a error message '''
  704.         msg = '<big><b>%s</b></big>\n\n%s\n' % (summary, details)
  705.         dialog = gtk.MessageDialog(self.window_main, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, '')
  706.         dialog.set_markup(msg)
  707.         dialog.vbox.set_spacing(6)
  708.         dialog.run()
  709.         dialog.destroy()
  710.  
  711.     
  712.     def on_button_dist_upgrade_clicked(self, button):
  713.         fetcher = DistUpgradeFetcherGtk(new_dist = self.new_dist, parent = self, progress = GtkProgress.GtkFetchProgress(self))
  714.         if self.options.sandbox:
  715.             fetcher.run_options.append('--sandbox')
  716.         
  717.         fetcher.run()
  718.  
  719.     
  720.     def new_dist_available(self, meta_release, upgradable_to):
  721.         self.frame_new_release.show()
  722.         self.label_new_release.set_markup(_("<b>New distribution release '%s' is available</b>") % upgradable_to.version)
  723.         self.new_dist = upgradable_to
  724.  
  725.     
  726.     def initCache(self):
  727.         
  728.         try:
  729.             apt_pkg.PkgSystemLock()
  730.         except SystemError:
  731.             e = None
  732.  
  733.         
  734.         try:
  735.             if hasattr(self, 'cache'):
  736.                 self.cache.open(self.progress)
  737.                 self.cache._initDepCache()
  738.             else:
  739.                 self.cache = MyCache(self.progress)
  740.         except AssertionError:
  741.             self.ask_run_partial_upgrade()
  742.             msg = '<big><b>%s</b></big>\n\n%s' % (_('Software index is broken'), _('It is impossible to install or remove any software. Please use the package manager "Synaptic" or run "sudo apt-get install -f" in a terminal to fix this issue at first.'))
  743.             dialog = gtk.MessageDialog(self.window_main, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, '')
  744.             dialog.set_markup(msg)
  745.             dialog.vbox.set_spacing(6)
  746.             dialog.run()
  747.             dialog.destroy()
  748.             sys.exit(1)
  749.  
  750.         self.progress.hide()
  751.  
  752.     
  753.     def check_auto_update(self):
  754.         remind = self.gconfclient.get_bool('/apps/update-manager/remind_reload')
  755.         if remind == False:
  756.             return None
  757.         update_days = apt_pkg.Config.FindI('APT::Periodic::Update-Package-Lists')
  758.         if update_days < 1:
  759.             self.dialog_manual_update.set_transient_for(self.window_main)
  760.             res = self.dialog_manual_update.run()
  761.             self.dialog_manual_update.hide()
  762.             if res == gtk.RESPONSE_YES:
  763.                 self.on_button_reload_clicked(None)
  764.             
  765.         
  766.  
  767.     
  768.     def check_all_updates_installable(self):
  769.         ''' Check if all available updates can be installed and suggest
  770.         to run a distribution upgrade if not '''
  771.         if self.list.distUpgradeWouldDelete > 0:
  772.             self.ask_run_partial_upgrade()
  773.         
  774.  
  775.     
  776.     def ask_run_partial_upgrade(self):
  777.         self.dialog_dist_upgrade.set_transient_for(self.window_main)
  778.         res = self.dialog_dist_upgrade.run()
  779.         self.dialog_dist_upgrade.hide()
  780.         if res == gtk.RESPONSE_YES:
  781.             os.execl('/usr/bin/gksu', '/usr/bin/gksu', '--desktop', '/usr/share/applications/update-manager.desktop', '--', '/usr/bin/update-manager', '--dist-upgrade')
  782.         
  783.         return False
  784.  
  785.     
  786.     def check_metarelease(self):
  787.         ''' check for new meta-release information '''
  788.         gconfclient = gconf.client_get_default()
  789.         self.meta = MetaRelease(self.options.devel_release, self.options.use_proposed)
  790.         self.meta.connect('dist_no_longer_supported', self.dist_no_longer_supported)
  791.         if self.options.check_dist_upgrades or gconfclient.get_bool('/apps/update-manager/check_dist_upgrades'):
  792.             self.meta.connect('new_dist_available', self.new_dist_available)
  793.         
  794.  
  795.     
  796.     def main(self, options):
  797.         self.options = options
  798.         self.check_metarelease()
  799.         while gtk.events_pending():
  800.             gtk.main_iteration()
  801.         self.fillstore()
  802.         self.check_auto_update()
  803.         gtk.main()
  804.  
  805.  
  806.