home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / python2.6 / dist-packages / softwareproperties / gtk / DialogMirror.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  14.1 KB  |  348 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import os
  5. import gobject
  6. import gtk
  7. import gtk.glade as gtk
  8. from gettext import gettext as _
  9. import threading
  10. import string
  11. import re
  12. from random import randint
  13. import dialogs
  14. from softwareproperties.MirrorTest import MirrorTest
  15. testing = threading.Event()
  16. (COLUMN_PROTO, COLUMN_DIR) = range(2)
  17. (COLUMN_URI, COLUMN_SEPARATOR, COLUMN_CUSTOM, COLUMN_MIRROR) = range(4)
  18. from softwareproperties.CountryInformation import CountryInformation
  19.  
  20. def threaded(f):
  21.     ''' Thanks to Ross Burton for this piece of code '''
  22.     
  23.     def wrapper(*args, **kwargs):
  24.         t = threading.Thread(target = f, args = args, kwargs = kwargs)
  25.         t.setDaemon(True)
  26.         t.start()
  27.  
  28.     wrapper.__name__ = f.__name__
  29.     return wrapper
  30.  
  31.  
  32. def sort_mirrors(model, iter1, iter2, data = None):
  33.     ''' sort function for the mirror list:
  34.            - at first show all custom urls
  35.            - secondly the separator
  36.            - third the official mirrors. if available
  37.              sort the countries '''
  38.     (url1, sep1, custom1) = model.get(iter1, 0, 1, 2)
  39.     (url2, sep2, custom2) = model.get(iter2, 0, 1, 2)
  40.     if custom1 and custom2:
  41.         return cmp(url1, url2)
  42.     if custom1:
  43.         return -1
  44.     if custom2:
  45.         return 1
  46.     if sep1:
  47.         return -1
  48.     if sep2:
  49.         return 1
  50.     return cmp(url1, url2)
  51.  
  52.  
  53. class DialogMirror:
  54.     
  55.     def __init__(self, parent, datadir, distro, custom_mirrors):
  56.         '''
  57.     Initialize the dialog that allows to choose a custom or official mirror
  58.     '''
  59.         
  60.         def is_separator(model, iter, data = None):
  61.             return model.get_value(iter, COLUMN_SEPARATOR)
  62.  
  63.         self.custom_mirrors = custom_mirrors
  64.         self.country_info = CountryInformation()
  65.         self.gladexml = gtk.glade.XML('%s/glade/dialogs.glade' % datadir)
  66.         self.gladexml.signal_autoconnect(self)
  67.         self.dialog = self.gladexml.get_widget('dialog_mirror')
  68.         self.dialog.set_transient_for(parent)
  69.         self.dialog_test = self.gladexml.get_widget('dialog_mirror_test')
  70.         self.dialog_test.set_transient_for(self.dialog)
  71.         self.distro = distro
  72.         self.treeview = self.gladexml.get_widget('treeview_mirrors')
  73.         self.button_edit = self.gladexml.get_widget('button_mirror_edit')
  74.         self.button_remove = self.gladexml.get_widget('button_mirror_remove')
  75.         self.button_choose = self.gladexml.get_widget('button_mirror_choose')
  76.         self.button_cancel = self.gladexml.get_widget('button_test_cancel')
  77.         self.label_test = self.gladexml.get_widget('label_test_mirror')
  78.         self.progressbar_test = self.gladexml.get_widget('progressbar_test_mirror')
  79.         self.combobox = self.gladexml.get_widget('combobox_mirror_proto')
  80.         self.progress = self.gladexml.get_widget('progressbar_test_mirror')
  81.         self.label_action = self.gladexml.get_widget('label_test_mirror')
  82.         model_proto = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
  83.         self.combobox.set_model(model_proto)
  84.         self.model = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_BOOLEAN, gobject.TYPE_BOOLEAN, gobject.TYPE_PYOBJECT)
  85.         self.treeview.set_row_separator_func(is_separator)
  86.         self.model_sort = gtk.TreeModelSort(self.model)
  87.         self.model_sort.set_default_sort_func(sort_mirrors)
  88.         self.distro = distro
  89.         self.treeview.set_model(self.model_sort)
  90.         self.renderer_mirror = gtk.CellRendererText()
  91.         self.renderer_mirror.connect('edited', self.on_edited_custom_mirror, self.model)
  92.         self.column_mirror = gtk.TreeViewColumn('URI', self.renderer_mirror, text = COLUMN_URI)
  93.         self.treeview.append_column(self.column_mirror)
  94.         map_loc = { }
  95.         patriot = None
  96.         model = self.treeview.get_model().get_model()
  97.         if len(self.custom_mirrors) > 0:
  98.             for mirror in self.custom_mirrors:
  99.                 model.append(None, [
  100.                     mirror,
  101.                     False,
  102.                     True,
  103.                     None])
  104.                 self.column_mirror.add_attribute(self.renderer_mirror, 'editable', COLUMN_CUSTOM)
  105.             
  106.             model.append(None, [
  107.                 None,
  108.                 True,
  109.                 False,
  110.                 None])
  111.         
  112.         for hostname in self.distro.source_template.mirror_set.keys():
  113.             mirror = self.distro.source_template.mirror_set[hostname]
  114.             if map_loc.has_key(mirror.location):
  115.                 model.append(map_loc[mirror.location], [
  116.                     hostname,
  117.                     False,
  118.                     False,
  119.                     mirror])
  120.                 continue
  121.             if mirror.location != None:
  122.                 parent = model.append(None, [
  123.                     self.country_info.get_country_name(mirror.location),
  124.                     False,
  125.                     False,
  126.                     None])
  127.                 if mirror.location == self.country_info.code and patriot == None:
  128.                     patriot = parent
  129.                 
  130.                 (model.append(parent, [
  131.                     hostname,
  132.                     False,
  133.                     False,
  134.                     mirror]),)
  135.                 map_loc[mirror.location] = parent
  136.                 continue
  137.             model.append(None, [
  138.                 hostname,
  139.                 False,
  140.                 False,
  141.                 mirror])
  142.         
  143.         if patriot != None:
  144.             path_sort = self.model_sort.get_path(self.model_sort.convert_child_iter_to_iter(None, patriot))
  145.             self.treeview.expand_row(path_sort, False)
  146.             self.treeview.set_cursor(path_sort)
  147.             self.treeview.scroll_to_cell(path_sort, use_align = True, row_align = 0.5)
  148.         
  149.  
  150.     
  151.     def on_edited_custom_mirror(self, cell, path, new_text, model):
  152.         ''' Check if the new mirror uri is faild, if yes change it, if not
  153.         remove the mirror from the list '''
  154.         iter = model.get_iter(path)
  155.         iter_next = model.iter_next(iter)
  156.         if new_text != '':
  157.             model.set_value(iter, COLUMN_URI, new_text)
  158.             if iter_next != None:
  159.                 if not model.get_value(iter_next, COLUMN_SEPARATOR):
  160.                     pass
  161.                 if not model.get_value(iter_next, COLUMN_CUSTOM):
  162.                     model.insert(1, [
  163.                         None,
  164.                         True,
  165.                         False])
  166.                 
  167.             self.button_choose.set_sensitive(self.is_valid_mirror(new_text))
  168.         else:
  169.             model.remove(iter)
  170.             if model.get_value(model.get_iter_first(), COLUMN_SEPARATOR):
  171.                 model.remove(model.get_iter_first())
  172.             
  173.             self.treeview.set_cursor((0,))
  174.  
  175.     
  176.     def is_valid_mirror(self, uri):
  177.         ''' Check if a given uri is a vaild one '''
  178.         if uri == None:
  179.             return False
  180.         if re.match('^((ftp)|(http)|(file)|(rsync)|(https))://([a-z]|[A-Z]|[0-9]|:|/|\\.|~)+$', uri) == None:
  181.             return False
  182.         return True
  183.  
  184.     
  185.     def on_treeview_mirrors_cursor_changed(self, treeview, data = None):
  186.         ''' Check if the currently selected row in the mirror list
  187.         contains a mirror and or is editable '''
  188.         (row, column) = treeview.get_cursor()
  189.         if row == None:
  190.             self.button_remove.set_sensitive(False)
  191.             self.button_edit.set_sensitive(False)
  192.             self.button_choose.set_sensitive(False)
  193.             return None
  194.         model = treeview.get_model()
  195.         iter = model.get_iter(row)
  196.         mirror = model.get_value(iter, COLUMN_MIRROR)
  197.         model_protos = self.combobox.get_model()
  198.         model_protos.clear()
  199.  
  200.     
  201.     def on_button_mirror_remove_clicked(self, button, data = None):
  202.         ''' Remove the currently selected mirror '''
  203.         (path, column) = self.treeview.get_cursor()
  204.         iter = self.treeview.get_model().get_iter(path)
  205.         model = self.treeview.get_model().get_model()
  206.         model.remove(iter)
  207.         if model.get_value(model.get_iter_first(), COLUMN_SEPARATOR):
  208.             model.remove(model.get_iter_first())
  209.         
  210.         self.treeview.set_cursor((0,))
  211.  
  212.     
  213.     def on_button_mirror_add_clicked(self, button, data = None):
  214.         ''' Add a new mirror at the beginning of the list and start
  215.         editing '''
  216.         model = self.treeview.get_model().get_model()
  217.         model.append(None, [
  218.             _('New mirror'),
  219.             False,
  220.             True,
  221.             None])
  222.         self.treeview.grab_focus()
  223.         self.treeview.set_cursor((0,), focus_column = self.column_mirror, start_editing = True)
  224.  
  225.     
  226.     def on_button_mirror_edit_clicked(self, button, data = None):
  227.         ''' Grab the focus and start editing the currently selected mirror '''
  228.         (path, column) = self.treeview.get_cursor()
  229.         self.treeview.grab_focus()
  230.         self.treeview.set_cursor(path, focus_column = column, start_editing = True)
  231.  
  232.     
  233.     def on_dialog_mirror_test_delete_event(self, dialog, event, data = None):
  234.         ''' If anybody wants to close the dialog, stop the test before '''
  235.         self.on_button_cancel_test_clicked(None)
  236.         return True
  237.  
  238.     
  239.     def run(self):
  240.         ''' Run the chooser dialog and return the chosen mirror or None '''
  241.         res = self.dialog.run()
  242.         self.dialog.hide()
  243.         (row, column) = self.treeview.get_cursor()
  244.         model = self.treeview.get_model()
  245.         iter = model.get_iter(row)
  246.         mirror = model.get_value(iter, COLUMN_MIRROR)
  247.         if res == gtk.RESPONSE_OK:
  248.             if mirror == None:
  249.                 return model.get_value(iter, COLUMN_URI)
  250.             model_proto = self.combobox.get_model()
  251.             iter_proto = model_proto.get_iter(self.combobox.get_active())
  252.             proto = model_proto.get_value(iter_proto, COLUMN_PROTO)
  253.             dir = model_proto.get_value(iter_proto, COLUMN_DIR)
  254.             return '%s://%s/%s' % (proto, mirror.hostname, dir)
  255.         res == gtk.RESPONSE_OK
  256.         return None
  257.  
  258.     
  259.     def on_button_test_clicked(self, button, data = None):
  260.         ''' Perform a test to find the best mirror and select it 
  261.         afterwards in the treeview '''
  262.         
  263.         class MirrorTestGtk(MirrorTest):
  264.             
  265.             def __init__(self, mirrors, test_file, running, progressbar, label):
  266.                 MirrorTest.__init__(self, mirrors, test_file, running)
  267.                 self.progress = progressbar
  268.                 self.label = label
  269.  
  270.             
  271.             def report_action(self, text):
  272.                 gtk.gdk.threads_enter()
  273.                 self.label.set_label(str('<i>%s</i>' % text))
  274.                 gtk.gdk.threads_leave()
  275.  
  276.             
  277.             def report_progress(self, current, max, borders = (0, 1), mod = (0, 0)):
  278.                 gtk.gdk.threads_enter()
  279.                 self.progress.set_text(_('Completed %s of %s tests') % (current + mod[0], max + mod[1]))
  280.                 frac = borders[0] + ((borders[1] - borders[0]) / max) * current
  281.                 self.progress.set_fraction(frac)
  282.                 gtk.gdk.threads_leave()
  283.  
  284.             
  285.             def run_full_test(self):
  286.                 results_ping = self.run_ping_test(max = 5, borders = (0, 0.5), mod = (0, 7))
  287.                 size = len(self.mirrors)
  288.                 if size > 2:
  289.                     results_ping.append([
  290.                         0,
  291.                         0,
  292.                         self.mirrors[randint(1, size - 1)]])
  293.                     results_ping.append([
  294.                         0,
  295.                         0,
  296.                         self.mirrors[randint(1, size - 1)]])
  297.                 
  298.                 results = self.run_download_test(map((lambda r: r[2]), results_ping), borders = (0.5, 1), mod = (MirrorTest.todo, MirrorTest.todo))
  299.                 for t, h in results:
  300.                     print 'mirror: %s - time: %s' % (h.hostname, t)
  301.                 
  302.                 if len(results) == 0:
  303.                     return None
  304.                 return results[0][1].hostname
  305.  
  306.  
  307.         gtk.gdk.threads_enter()
  308.         self.button_cancel.set_sensitive(True)
  309.         self.dialog_test.show()
  310.         gtk.gdk.threads_leave()
  311.         self.running = threading.Event()
  312.         self.running.set()
  313.         pipe = os.popen('dpkg --print-architecture')
  314.         arch = pipe.read().strip()
  315.         test_file = 'dists/%s/%s/binary-%s/Packages.gz' % (self.distro.source_template.name, self.distro.source_template.components[0].name, arch)
  316.         test = MirrorTestGtk(self.distro.source_template.mirror_set.values(), test_file, self.running, self.progress, self.label_action)
  317.         test.start()
  318.         rocker = test.run_full_test()
  319.         gtk.gdk.threads_enter()
  320.         testing.clear()
  321.         self.dialog_test.hide()
  322.         if rocker != None:
  323.             self.model_sort.foreach(self.select_mirror, rocker)
  324.         else:
  325.             dialogs.show_error_dialog(self.dialog, _('No suitable download server was found'), _('Please check your Internet connection.'))
  326.         gtk.gdk.threads_leave()
  327.  
  328.     on_button_test_clicked = threaded(on_button_test_clicked)
  329.     
  330.     def select_mirror(self, model, path, iter, mirror):
  331.         '''Select and expand the path to a matching mirror in the list'''
  332.         if model.get_value(iter, COLUMN_URI) == mirror:
  333.             self.treeview.expand_to_path(path)
  334.             self.treeview.set_cursor(path)
  335.             self.treeview.scroll_to_cell(path, use_align = True, row_align = 0.5)
  336.             self.treeview.grab_focus()
  337.             return True
  338.  
  339.     
  340.     def on_button_cancel_test_clicked(self, button):
  341.         ''' Abort the mirror performance test '''
  342.         self.running.clear()
  343.         self.label_test.set_label('<i>%s</i>' % _('Canceling...'))
  344.         self.button_cancel.set_sensitive(False)
  345.         self.progressbar_test.set_fraction(1)
  346.  
  347.  
  348.