Advertisement
Guest User

Untitled

a guest
Jun 4th, 2017
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 41.85 KB | None | 0 0
  1. #!/usr/bin/env python
  2. import sys
  3. sys.path.append('/usr/lib/live-installer')
  4. from installer import InstallerEngine, fstab, fstab_entry, SystemUser, HostMachine
  5.  
  6. try:
  7.     import pygtk
  8.     pygtk.require("2.0")
  9.     import gtk
  10.     import gtk.glade
  11.     import gettext
  12.     import os
  13.     import commands
  14.     import subprocess
  15.     import sys
  16.     sys.path.append('/usr/lib/live-installer')
  17.     import pango   
  18.     import threading
  19.     import xml.dom.minidom
  20.     from xml.dom.minidom import parse
  21.     import gobject
  22.     import time
  23. except Exception, detail:
  24.     print detail
  25.  
  26. gettext.install("live-installer", "/usr/share/locale")
  27. gtk.gdk.threads_init()
  28.  
  29. ''' Handy. Makes message dialogs easy :D '''
  30. class MessageDialog(object):
  31.  
  32.         def __init__(self, title, message, style):
  33.                 self.title = title
  34.                 self.message = message
  35.                 self.style = style
  36.  
  37.         ''' Show me on screen '''
  38.         def show(self):
  39.                
  40.                 dialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, self.style, gtk.BUTTONS_OK, self.message)
  41.                 dialog.set_title(self.title)
  42.                 dialog.set_position(gtk.WIN_POS_CENTER)
  43.                 dialog.set_icon_from_file("/usr/share/icons/live-installer.png")
  44.                 dialog.run()
  45.                 dialog.destroy()
  46.        
  47. class WizardPage:
  48.    
  49.     def __init__(self, breadcrumb_label, breadcrumb_text, help_text):
  50.         self.breadcrumb_label = breadcrumb_label
  51.         self.breadcrumb_text = breadcrumb_text
  52.         self.help_text = help_text
  53.         self.breadcrumb_label.set_markup("<small>%s</small> <span color=\"#FFFFFF\">-</span>" % self.breadcrumb_text)
  54.              
  55. class InstallerWindow:
  56.    
  57.     def __init__(self, fullscreen=False):
  58.         self.resource_dir = '/usr/share/live-installer/'
  59.         #self.glade = 'interface.glade'
  60.         self.glade = os.path.join(self.resource_dir, 'interface.glade')
  61.         self.wTree = gtk.glade.XML(self.glade, 'main_window')
  62.  
  63.         # should be set early
  64.         self.done = False
  65.         self.fail = False
  66.  
  67.         # here cometh the installer engine
  68.         self.installer = InstallerEngine()
  69.         # the distribution name
  70.         DISTRIBUTION_NAME = self.installer.get_distribution_name()
  71.         # load the window object
  72.         self.window = self.wTree.get_widget("main_window")
  73.         if "--debug" in sys.argv:
  74.             self.window.set_title((_("%s Installer") % DISTRIBUTION_NAME) + " (debug)")
  75.         else:
  76.             self.window.set_title(_("%s Installer") % DISTRIBUTION_NAME)
  77.         self.window.connect("destroy", self.quit_cb)
  78.  
  79.         # Wizard pages
  80.         [self.PAGE_LANGUAGE, self.PAGE_PARTITIONS, self.PAGE_USER, self.PAGE_ADVANCED, self.PAGE_KEYBOARD, self.PAGE_OVERVIEW, self.PAGE_INSTALL] = range(7)
  81.         self.wizard_pages = range(7)
  82.         self.wizard_pages[self.PAGE_LANGUAGE] = WizardPage(self.wTree.get_widget("label_step_language"), _("Language selection"), _("Please select your language"))
  83.         self.wizard_pages[self.PAGE_KEYBOARD] = WizardPage(self.wTree.get_widget("label_step_keyboard"), _("Keyboard layout"), _("Please select your keyboard layout"))
  84.         self.wizard_pages[self.PAGE_PARTITIONS] = WizardPage(self.wTree.get_widget("label_step_partitions"), _("Disk partitioning"), _("Please select where you want to install %s") % DISTRIBUTION_NAME)
  85.         self.wizard_pages[self.PAGE_USER] = WizardPage(self.wTree.get_widget("label_step_user"), _("User info"), _("Please indicate your name and select a username, a password and a hostname"))
  86.         self.wizard_pages[self.PAGE_ADVANCED] = WizardPage(self.wTree.get_widget("label_step_advanced"), _("Advanced options"), _("Please review the following advanced options"))
  87.         self.wizard_pages[self.PAGE_OVERVIEW] = WizardPage(self.wTree.get_widget("label_step_overview"), _("Summary"), _("Please review this summary and make sure everything is correct"))
  88.         self.wizard_pages[self.PAGE_INSTALL] = WizardPage(self.wTree.get_widget("label_step_install"), _("Installation"), _("Please wait while %s is being installed on your computer") % DISTRIBUTION_NAME)
  89.            
  90.         # Remove last separator in breadcrumb
  91.         self.wizard_pages[self.PAGE_INSTALL].breadcrumb_label.set_markup("<small>%s</small>" % self.wizard_pages[self.PAGE_INSTALL].breadcrumb_text)
  92.        
  93.         # make first step label bolded.
  94.         label = self.wTree.get_widget("label_step_language")
  95.         text = label.get_label()
  96.         attrs = pango.AttrList()
  97.         nattr = pango.AttrWeight(pango.WEIGHT_BOLD, 0, len(text))
  98.         attrs.insert(nattr)
  99.         label.set_attributes(attrs)
  100.         label.set_sensitive(False)         
  101.        
  102.         # set the button events (wizard_cb)
  103.         self.wTree.get_widget("button_next").connect("clicked", self.wizard_cb, False)
  104.         self.wTree.get_widget("button_back").connect("clicked", self.wizard_cb, True)
  105.         self.wTree.get_widget("button_quit").connect("clicked", self.quit_cb)
  106.                
  107.         ren = gtk.CellRendererPixbuf()
  108.         column = gtk.TreeViewColumn("Flags", ren)
  109.         column.add_attribute(ren, "pixbuf", 2)
  110.         self.wTree.get_widget("treeview_language_list").append_column(column)
  111.  
  112.         ren = gtk.CellRendererText()
  113.         column = gtk.TreeViewColumn("Languages", ren)
  114.         column.add_attribute(ren, "text", 0)
  115.         self.wTree.get_widget("treeview_language_list").append_column(column)
  116.        
  117.         self.wTree.get_widget("treeview_language_list").connect("cursor-changed", self.cb_change_language)
  118.  
  119.         # build the language list
  120.         self.build_lang_list()
  121.  
  122.         # disk view    
  123.         self.wTree.get_widget("button_edit").connect("clicked", self.edit_partition)
  124.         self.wTree.get_widget("treeview_disks").connect("row_activated", self.edit_partition)
  125.          
  126.         # device
  127.         ren = gtk.CellRendererText()
  128.         column = gtk.TreeViewColumn(_("Device"), ren)
  129.         column.add_attribute(ren, "markup", 0)
  130.         self.wTree.get_widget("treeview_disks").append_column(column)
  131.         # filesystem
  132.         ren = gtk.CellRendererText()
  133.         column = gtk.TreeViewColumn(_("Filesystem"), ren)
  134.         column.add_attribute(ren, "markup", 1)
  135.         self.wTree.get_widget("treeview_disks").append_column(column)
  136.         # format
  137.         ren = gtk.CellRendererToggle()
  138.         column = gtk.TreeViewColumn(_("Format"), ren)
  139.         column.add_attribute(ren, "active", 2)
  140.         self.wTree.get_widget("treeview_disks").append_column(column)
  141.         # boot flag
  142.         ren = gtk.CellRendererToggle()
  143.         column = gtk.TreeViewColumn(_("Boot"), ren)
  144.         column.add_attribute(ren, "active", 5)
  145.         self.wTree.get_widget("treeview_disks").append_column(column)      
  146.         # mount point
  147.         ren = gtk.CellRendererText()
  148.         column = gtk.TreeViewColumn(_("Mount Point"), ren)
  149.         column.add_attribute(ren, "markup", 3)
  150.         self.wTree.get_widget("treeview_disks").append_column(column)
  151.         # size
  152.         ren = gtk.CellRendererText()
  153.         column = gtk.TreeViewColumn(_("Size (MB)"), ren)
  154.         column.add_attribute(ren, "markup", 4)
  155.         self.wTree.get_widget("treeview_disks").append_column(column)      
  156.         # start
  157.         #ren = gtk.CellRendererText()
  158.         #column = gtk.TreeViewColumn(_("Start"), ren)
  159.         #column.add_attribute(ren, "markup", 6)
  160.         #self.wTree.get_widget("treeview_disks").append_column(column)     
  161.         # end
  162.         #ren = gtk.CellRendererText()
  163.         #column = gtk.TreeViewColumn(_("End"), ren)
  164.         #column.add_attribute(ren, "markup", 7)
  165.         #self.wTree.get_widget("treeview_disks").append_column(column)
  166.         # Used space
  167.         ren = gtk.CellRendererText()
  168.         column = gtk.TreeViewColumn(_("Used space"), ren)
  169.         column.add_attribute(ren, "markup", 8)
  170.         self.wTree.get_widget("treeview_disks").append_column(column)
  171.        
  172.         # about you    
  173.         self.wTree.get_widget("label_your_name").set_markup("<b>%s</b>" % _("Your full name"))
  174.         self.wTree.get_widget("label_your_name_help").set_label(_("This will be shown in the About Me application"))
  175.         self.wTree.get_widget("label_username").set_markup("<b>%s</b>" % _("Your username"))
  176.         self.wTree.get_widget("label_username_help").set_label(_("This is the name you will use to login to your computer"))
  177.         self.wTree.get_widget("label_choose_pass").set_markup("<b>%s</b>" % _("Your password"))
  178.         self.wTree.get_widget("label_pass_help").set_label(_("Please enter your password twice to ensure it is correct"))
  179.         self.wTree.get_widget("label_hostname").set_markup("<b>%s</b>" % _("Hostname"))
  180.         self.wTree.get_widget("label_hostname_help").set_label(_("This hostname will be the computers name on the network"))   
  181.                
  182.         self.wTree.get_widget("entry_your_name").connect("notify::text", self.update_account_fields)
  183.        
  184.         # try to set the hostname
  185.         machine = HostMachine()
  186.         model = machine.get_model()
  187.         hostname = ""
  188.         if(model is not None):
  189.             model = model.replace(" ", "").lower()
  190.             hostname = model + "-"
  191.         if(machine.is_laptop()):
  192.             hostname += _("laptop")
  193.         else:
  194.             hostname += _("desktop")
  195.         self.wTree.get_widget("entry_hostname").set_text(hostname)
  196.        
  197.         # events for detecting password mismatch..
  198.         entry1 = self.wTree.get_widget("entry_userpass1")
  199.         entry2 = self.wTree.get_widget("entry_userpass2")
  200.         entry1.connect("changed", self.pass_mismatcher)
  201.         entry2.connect("changed", self.pass_mismatcher)                
  202.        
  203.         # grub
  204.         self.wTree.get_widget("label_grub").set_markup("<b>%s</b>" % _("Bootloader"))
  205.         self.wTree.get_widget("checkbutton_grub").set_label(_("Install GRUB"))     
  206.         self.wTree.get_widget("label_grub_help").set_label(_("GRUB is a bootloader used to load the Linux kernel"))
  207.        
  208.         # link the checkbutton to the combobox
  209.         grub_check = self.wTree.get_widget("checkbutton_grub")
  210.         grub_box = self.wTree.get_widget("combobox_grub")
  211.         grub_check.connect("clicked", lambda x: grub_box.set_sensitive(x.get_active()))
  212.        
  213.         # Install Grub by default
  214.         grub_check.set_active(True)
  215.         grub_box.set_sensitive(True)
  216.        
  217.         # keyboard page    
  218.         self.wTree.get_widget("label_test_kb").set_label(_("Use this box to test your keyboard layout"))
  219.         # kb models
  220.         ren = gtk.CellRendererText()
  221.         column = gtk.TreeViewColumn(_("Model"), ren)
  222.         column.add_attribute(ren, "text", 0)
  223.         self.wTree.get_widget("treeview_models").append_column(column)
  224.         self.wTree.get_widget("treeview_models").connect("cursor-changed", self.cb_change_kb_model)        
  225.        
  226.         # kb layouts
  227.         ren = gtk.CellRendererText()
  228.         column = gtk.TreeViewColumn(_("Layout"), ren)
  229.         column.add_attribute(ren, "text", 0)
  230.         self.wTree.get_widget("treeview_layouts").append_column(column)
  231.         self.wTree.get_widget("treeview_layouts").connect("cursor-changed", self.cb_change_kb_layout)
  232.         self.build_kb_lists()
  233.        
  234.         # 'about to install' aka overview      
  235.         ren = gtk.CellRendererText()
  236.         column = gtk.TreeViewColumn(_("Overview"), ren)
  237.         column.add_attribute(ren, "markup", 0)
  238.         self.wTree.get_widget("treeview_overview").append_column(column)
  239.         # install page     
  240.         self.wTree.get_widget("label_install_progress").set_markup("<i>%s</i>" % _("Calculating file indexes..."))
  241.        
  242.         # build partition list
  243.         self.device_node = None
  244.         self.build_disks()
  245.         self.should_pulse = False
  246.        
  247.         # make sure we're on the right page (no pun.)
  248.         self.activate_page(0)      
  249.        
  250.         # this is a hack atm to steal the menubar's background color
  251.         self.wTree.get_widget("menubar").realize()
  252.         style = self.wTree.get_widget("menubar").style.copy()
  253.         self.wTree.get_widget("menubar").hide()
  254.         # apply to the header
  255.         self.wTree.get_widget("eventbox1").realize()
  256.         self.wTree.get_widget("eventbox1").modify_bg(gtk.STATE_NORMAL, style.bg[gtk.STATE_NORMAL])
  257.         self.wTree.get_widget("eventbox1").modify_bg(gtk.STATE_ACTIVE, style.bg[gtk.STATE_ACTIVE])
  258.         self.wTree.get_widget("eventbox1").modify_bg(gtk.STATE_INSENSITIVE, style.bg[gtk.STATE_INSENSITIVE])
  259.         self.wTree.get_widget("help_label").realize()
  260.         self.wTree.get_widget("help_label").modify_fg(gtk.STATE_NORMAL, style.fg[gtk.STATE_NORMAL])
  261.         # now apply to the breadcrumb nav
  262.         index = 0
  263.         for page in self.wizard_pages:     
  264.             page.breadcrumb_label.modify_fg(gtk.STATE_NORMAL, style.fg[gtk.STATE_NORMAL])          
  265.         if(fullscreen):
  266.             # dedicated installer mode thingum
  267.             img = gtk.gdk.pixbuf_new_from_file_at_size("/usr/share/live-installer/logo.svg", 96, 96)
  268.             self.wTree.get_widget("logo").set_from_pixbuf(img)
  269.             self.window.maximize()
  270.             self.window.fullscreen()
  271.         else:
  272.             # running on livecd (windowed)
  273.             img = gtk.gdk.pixbuf_new_from_file_at_size("/usr/share/live-installer/logo.svg", 64, 64)
  274.             self.wTree.get_widget("logo").set_from_pixbuf(img)
  275.         # visible please :)
  276.         self.window.show_all()
  277.        
  278.     def update_account_fields(self, entry, prop):  
  279.         text = entry.props.text.strip().lower()
  280.         if " " in entry.props.text:        
  281.             elements = text.split()
  282.             text = elements[0]                 
  283.         self.wTree.get_widget("entry_username").set_text(text)
  284.  
  285.     def quit_cb(self, widget, data=None):
  286.         ''' ask whether we should quit. because touchpads do happen '''
  287.         gtk.main_quit()
  288.  
  289.     def edit_partition(self, widget, data=None, data2=None):
  290.         ''' edit the partition ... '''
  291.         disks = self.wTree.get_widget("treeview_disks")
  292.         model = disks.get_model()
  293.         active = disks.get_selection().get_selected_rows()
  294.         if(len(active) < 1):
  295.             return
  296.         if(len(active[1]) < 1):
  297.             return
  298.         active = active[1][0]
  299.         if(active is None):
  300.             return
  301.         row = model[active]
  302.         stabber = fstab_entry(row[0], row[3], row[1], None)
  303.         stabber.format = row[2]
  304.         dlg = PartitionDialog(stabber)
  305.         stabber = dlg.show()
  306.         if(stabber is None):
  307.             return
  308.         # now set the model as shown..
  309.         row[0] = stabber.device
  310.         row[3] = stabber.mountpoint
  311.         row[1] = stabber.filesystem
  312.         row[2] = stabber.format
  313.         model[active] = row
  314.        
  315.     def build_lang_list(self):
  316.        
  317.         cur_lang = os.environ['LANG']
  318.         if("." in cur_lang):
  319.             cur_lang = cur_lang.split(".")[0]
  320.        
  321.         model = gtk.ListStore(str,str,gtk.gdk.Pixbuf)
  322.         model.set_sort_column_id(0, gtk.SORT_ASCENDING)
  323.        
  324.         #Load countries into memory
  325.         countries = {}
  326.         file = open(os.path.join(self.resource_dir, 'countries'), "r")
  327.         for line in file:
  328.             line = line.strip()
  329.             split = line.split("=")
  330.             if len(split) == 2:
  331.                 countries[split[0]] = split[1]
  332.         file.close()
  333.        
  334.         #Load languages into memory
  335.         languages = {}
  336.         file = open(os.path.join(self.resource_dir, 'languages'), "r")
  337.         for line in file:
  338.             line = line.strip()
  339.             split = line.split("=")
  340.             if len(split) == 2:
  341.                 languages[split[0]] = split[1]
  342.         file.close()
  343.        
  344.         path = os.path.join(self.resource_dir, 'locales')
  345.         locales = open(path, "r")
  346.         cur_index = -1 # find the locale :P
  347.         set_index = None
  348.         for line in locales:
  349.             cur_index += 1
  350.             if "UTF-8" in line:
  351.                 locale_code = line.replace("UTF-8", "")
  352.                 locale_code = locale_code.replace(".", "")
  353.                 locale_code = locale_code.strip()
  354.                 if "_" in locale_code:
  355.                     split = locale_code.split("_")
  356.                     if len(split) == 2:
  357.                         language_code = split[0]
  358.                         if language_code in languages:
  359.                             language = languages[language_code]
  360.                         else:
  361.                             language = language_code
  362.                        
  363.                         country_code = split[1].lower()
  364.                         if country_code in countries:
  365.                             country = countries[country_code]
  366.                         else:
  367.                             country = country_code
  368.                            
  369.                         language_label = "%s (%s)" % (language, country)
  370.                    
  371.                         iter = model.append()
  372.                         model.set_value(iter, 0, language_label)
  373.                         model.set_value(iter, 1, locale_code)              
  374.                         flag_path = self.resource_dir + '/flags/16/' + country_code + '.png'
  375.                         if os.path.exists(flag_path):
  376.                             model.set_value(iter, 2, gtk.gdk.pixbuf_new_from_file(flag_path))
  377.                         else:
  378.                             flag_path = self.resource_dir + '/flags/16/generic.png'
  379.                             model.set_value(iter, 2, gtk.gdk.pixbuf_new_from_file(flag_path))
  380.                         if(locale_code == cur_lang):
  381.                             set_index = iter
  382.  
  383.         treeview = self.wTree.get_widget("treeview_language_list")
  384.         treeview.set_model(model)
  385.         if(set_index is not None):
  386.             column = treeview.get_column(0)
  387.             path = model.get_path(set_index)
  388.             treeview.set_cursor(path, focus_column=column)
  389.             treeview.scroll_to_cell(path, column=column)
  390.         treeview.set_search_column(0)
  391.  
  392.     def build_disks(self):
  393.         gtk.gdk.threads_enter()
  394.         import subprocess
  395.         self.disks = {}
  396.         inxi = subprocess.Popen("inxi -c0 -D", shell=True, stdout=subprocess.PIPE)
  397.         parent = None
  398.         for line in inxi.stdout:
  399.             line = line.rstrip("\r\n")
  400.             if(line.startswith("Disks:")):
  401.                 line = line.replace("Disks:", "")
  402.             device = None
  403.             sections = line.split(":")
  404.             for section in sections:
  405.                 section = section.strip()          
  406.                 if("/dev/" in section):
  407.                     device = None
  408.                     elements = section.split()
  409.                     for element in elements:
  410.                         if "/dev/" in element:
  411.                             device = element
  412.                     if elements[len(elements) -1].endswith("GB") or elements[elements[len(elements) -1]].endswith("GB"):
  413.                         size = elements[len(elements) -1]
  414.                         section = section.replace(size, "(%s)" % size)                                         
  415.                     if device is not None:
  416.                         description = section.replace(device, "").strip()
  417.                         description = description.replace("  ", " ")
  418.                         self.disks[device] = description
  419.                         if(parent is None):
  420.                             self.device_node = device
  421.                             radio = gtk.RadioButton(None)
  422.                             radio.connect("clicked", self.select_disk_cb, device)
  423.                             radio.set_label(description)
  424.                             self.wTree.get_widget("vbox_disks").pack_start(radio, expand=False, fill=False)
  425.                             parent = radio
  426.                         else:
  427.                             radio = gtk.RadioButton(parent)
  428.                             radio.connect("clicked", self.select_disk_cb, device)
  429.                             radio.set_label(description)
  430.                             self.wTree.get_widget("vbox_disks").pack_start(radio, expand=False, fill=False)                
  431.         self.wTree.get_widget("vbox_disks").show_all()
  432.         gtk.gdk.threads_leave()
  433.     def select_disk_cb(self, widget, device):
  434.         self.device_node = device
  435.            
  436.     def build_partitions(self):
  437.         gtk.gdk.threads_enter()
  438.         self.window.set_sensitive(False)
  439.         # "busy" cursor.
  440.         cursor = gtk.gdk.Cursor(gtk.gdk.WATCH)
  441.         self.window.window.set_cursor(cursor)
  442.        
  443.         from progress import ProgressDialog
  444.         dialog = ProgressDialog()
  445.         dialog.show(title=_("Installer"), label=_("Scanning disk %s for partitions") % self.device_node)
  446.         import parted, commands
  447.         from screen import Partition
  448.         os.popen('mkdir -p /tmp/live-installer/tmpmount')
  449.         # disks that you can install grub to
  450.         grub_model = gtk.ListStore(str)
  451.         hdd_descriptions = []
  452.         inxi = commands.getoutput("inxi -D -c 0")
  453.         parts = inxi.split(":")
  454.         partitions = []
  455.         path = self.device_node # i.e. /dev/sda
  456.         grub_model.append([path])
  457.         device = parted.getDevice(path)
  458.         disk = parted.Disk(device)                                         
  459.         partition = disk.getFirstPartition()   
  460.         last_added_partition = Partition(partition)                
  461.         partitions.append(last_added_partition)
  462.         partition = partition.nextPartition()
  463.         while (partition is not None):
  464.             if last_added_partition.partition.number == -1 and partition.number == -1:
  465.                 last_added_partition.add_partition(partition)
  466.             else:
  467.                 last_added_partition = Partition(partition)
  468.                 partitions.append(last_added_partition)    
  469.                
  470.                 if partition.number != -1 and "swap" not in last_added_partition.type:
  471.                    
  472.                     #Umount temp folder
  473.                     if ('/tmp/live-installer/tmpmount' in commands.getoutput('mount')):                                
  474.                         os.popen('umount /tmp/live-installer/tmpmount')
  475.                    
  476.                     #Mount partition if not mounted
  477.                     if (partition.path not in commands.getoutput('mount')):
  478.                         os.system("mount %s /tmp/live-installer/tmpmount" % partition.path)
  479.                        
  480.                     #Identify partition's description and used space
  481.                     if (partition.path in commands.getoutput('mount')):                                                                                                                
  482.                         last_added_partition.used_space = commands.getoutput("df | grep %s | awk {'print $5'}" % partition.path)
  483.                         mount_point = commands.getoutput("df | grep %s | awk {'print $6'}" % partition.path)
  484.                         if os.path.exists(os.path.join(mount_point, 'etc/lsb-release')):
  485.                             last_added_partition.description = commands.getoutput("cat " + os.path.join(mount_point, 'etc/lsb-release') + " | grep DISTRIB_DESCRIPTION").replace('DISTRIB_DESCRIPTION', '').replace('=', '').replace('"', '').strip()
  486.                         elif os.path.exists(os.path.join(mount_point, 'etc/issue')):
  487.                             last_added_partition.description = commands.getoutput("cat " + os.path.join(mount_point, 'etc/issue')).replace('\\n', '').replace('\l', '').strip()
  488.                         elif os.path.exists(os.path.join(mount_point, 'Windows/servicing/Version')):
  489.                             version = commands.getoutput("ls %s" % os.path.join(mount_point, 'Windows/servicing/Version'))
  490.                             if version.startswith("6.1"):
  491.                                 last_added_partition.description = "Windows 7"
  492.                             elif version.startswith("6.0"):
  493.                                 last_added_partition.description = "Windows Vista"
  494.                             elif version.startswith("5.1") or version.startswith("5.2"):
  495.                                 last_added_partition.description = "Windows XP"
  496.                             elif version.startswith("5.0"):
  497.                                 last_added_partition.description = "Windows 2000"  
  498.                             elif version.startswith("4.90"):
  499.                                 last_added_partition.description = "Windows Me"
  500.                             elif version.startswith("4.1"):
  501.                                 last_added_partition.description = "Windows 98"
  502.                             elif version.startswith("4.0.1381"):
  503.                                 last_added_partition.description = "Windows NT"
  504.                             elif version.startswith("4.0.950"):
  505.                                 last_added_partition.description = "Windows 95"                                            
  506.                         elif os.path.exists(os.path.join(mount_point, 'Boot/BCD')):                                        
  507.                             if os.system("grep -qs \"V.i.s.t.a\" " + os.path.join(mount_point, 'Boot/BCD')) == 0:
  508.                                 last_added_partition.description = "Windows Vista bootloader"
  509.                             elif os.system("grep -qs \"W.i.n.d.o.w.s. .7\" " + os.path.join(mount_point, 'Boot/BCD')) == 0:
  510.                                 last_added_partition.description = "Windows 7 bootloader"
  511.                             elif os.system("grep -qs \"W.i.n.d.o.w.s. .R.e.c.o.v.e.r.y. .E.n.v.i.r.o.n.m.e.n.t\" " + os.path.join(mount_point, 'Boot/BCD')) == 0:
  512.                                 last_added_partition.description = "Windows recovery"
  513.                             elif os.system("grep -qs \"W.i.n.d.o.w.s. .S.e.r.v.e.r. .2.0.0.8\" " + os.path.join(mount_point, 'Boot/BCD')) == 0:
  514.                                 last_added_partition.description = "Windows Server 2008 bootloader"
  515.                             else:
  516.                                 last_added_partition.description = "Windows bootloader"                                                                                                        
  517.                         elif os.path.exists(os.path.join(mount_point, 'Windows/System32')):
  518.                             last_added_partition.description = "Windows"
  519.                        
  520.                     #Umount temp folder
  521.                     if ('/tmp/live-installer/tmpmount' in commands.getoutput('mount')):                                
  522.                         os.popen('umount /tmp/live-installer/tmpmount')        
  523.                                            
  524.             partition = partition.nextPartition()                          
  525.                        
  526.         from screen import Screen
  527.         myScreen = Screen(partitions)
  528.         self.part_screen = myScreen
  529.         kids = self.wTree.get_widget("vbox_cairo").get_children()
  530.         if(kids is not None):
  531.             for sprog in kids:
  532.                 self.wTree.get_widget("vbox_cairo").remove(sprog)
  533.         self.wTree.get_widget("vbox_cairo").add(myScreen)
  534.         self.wTree.get_widget("vbox_cairo").show_all()
  535.         color = self.wTree.get_widget("notebook1").style.bg[gtk.STATE_ACTIVE]
  536.         self.part_screen.modify_bg(gtk.STATE_NORMAL, color)
  537.                
  538.         model = gtk.ListStore(str,str,bool,str,str,bool, str, str, str)
  539.         model2 = gtk.ListStore(str)
  540.        
  541.         for partition in partitions:
  542.             if partition.size > 0.5:
  543.                 if partition.partition.number == -1:
  544.                     model.append(["<small><span foreground='#555555'>" + partition.name + "</span></small>", partition.type, False, None, '%.0f' % round(partition.size, 0), False, partition.start, partition.end, partition.used_space])
  545.                 elif partition.real_type == parted.PARTITION_EXTENDED:
  546.                     print "Extended partition"
  547.                     model.append(["<small><span foreground='#555555'>extended partition</span></small>", None, False, None,  '%.0f' % round(partition.size, 0), False, partition.start, partition.end, partition.used_space])
  548.                 else:          
  549.                     if partition.description != "":
  550.                         model.append([partition.name, "%s (%s)" % (partition.description, partition.type), False, None, '%.0f' % round(partition.size, 0), False, partition.start, partition.end, partition.used_space])
  551.                     else:
  552.                         model.append([partition.name, partition.type, False, None, '%.0f' % round(partition.size, 0), False, partition.start, partition.end, partition.used_space])
  553.                    
  554.         self.wTree.get_widget("treeview_disks").set_model(model)
  555.         self.wTree.get_widget("combobox_grub").set_model(grub_model)
  556.         self.wTree.get_widget("combobox_grub").set_active(0)   
  557.         dialog.hide()
  558.        
  559.         self.window.set_sensitive(True)
  560.         self.window.window.set_cursor(None)
  561.         gtk.gdk.threads_leave()    
  562.     def build_kb_lists(self):
  563.         ''' Do some xml kung-fu and load the keyboard stuffs '''
  564.        
  565.         # firstly we'll determine the layouts in use
  566.         p = subprocess.Popen("setxkbmap -print",shell=True,stdout=subprocess.PIPE)
  567.         for line in p.stdout:
  568.             # strip it
  569.             line = line.rstrip("\r\n")
  570.             line = line.replace("{","")
  571.             line = line.replace("}","")
  572.             line = line.replace(";","")
  573.             if("xkb_symbols" in line):
  574.                 # decipher the layout in use
  575.                 section = line.split("\"")[1] # split by the " mark
  576.                 self.keyboard_layout = section.split("+")[1]
  577.             if("xkb_geometry" in line):
  578.                 first_bracket = line.index("(") +1
  579.                 substr = line[first_bracket:]
  580.                 last_bracket = substr.index(")")
  581.                 substr = substr[0:last_bracket]
  582.                 self.keyboard_geom = substr
  583.         p.poll()
  584.        
  585.         xml_file = '/usr/share/X11/xkb/rules/xorg.xml'
  586.         model_models = gtk.ListStore(str,str)
  587.         model_models.set_sort_column_id(0, gtk.SORT_ASCENDING)
  588.         model_layouts = gtk.ListStore(str,str)
  589.         model_layouts.set_sort_column_id(0, gtk.SORT_ASCENDING)
  590.         dom = parse(xml_file)
  591.        
  592.         # if we find the users keyboard info we can set it in the list
  593.         set_keyboard_model = None
  594.         set_keyboard_layout = None
  595.        
  596.         # grab the root element
  597.         root = dom.getElementsByTagName('xkbConfigRegistry')[0]
  598.         # build the list of models
  599.         root_models = root.getElementsByTagName('modelList')[0]
  600.         for element in root_models.getElementsByTagName('model'):
  601.             conf = element.getElementsByTagName('configItem')[0]
  602.             name = conf.getElementsByTagName('name')[0]
  603.             desc = conf.getElementsByTagName('description')[0]
  604.             #vendor = conf.getElementsByTagName('vendor')[0] # presently unused..
  605.             iter_model = model_models.append([self.getText(desc.childNodes), self.getText(name.childNodes)])
  606.             item = self.getText(name.childNodes)
  607.             if(item == self.keyboard_geom):
  608.                 set_keyboard_model = iter_model
  609.         root_layouts = root.getElementsByTagName('layoutList')[0]
  610.         for element in root_layouts.getElementsByTagName('layout'):
  611.             conf = element.getElementsByTagName('configItem')[0]
  612.             name = conf.getElementsByTagName('name')[0]
  613.             desc = conf.getElementsByTagName('description')[0]
  614.             iter_layout = model_layouts.append([self.getText(desc.childNodes), self.getText(name.childNodes)])
  615.             item = self.getText(name.childNodes)
  616.             if(item == self.keyboard_layout):
  617.                 set_keyboard_layout = iter_layout
  618.         # now set the model
  619.         self.wTree.get_widget("treeview_models").set_model(model_models)
  620.         self.wTree.get_widget("treeview_layouts").set_model(model_layouts)
  621.        
  622.         if(set_keyboard_layout is not None):
  623.             # show it in the list
  624.             treeview = self.wTree.get_widget("treeview_layouts")
  625.             model = treeview.get_model()
  626.             column = treeview.get_column(0)
  627.             path = model.get_path(set_keyboard_layout)
  628.             treeview.set_cursor(path, focus_column=column)
  629.             treeview.scroll_to_cell(path, column=column)
  630.         if(set_keyboard_model is not None):
  631.             # show it in the list
  632.             treeview = self.wTree.get_widget("treeview_models")
  633.             model = treeview.get_model()
  634.             column = treeview.get_column(0)
  635.             path = model.get_path(set_keyboard_model)
  636.             treeview.set_cursor(path, focus_column=column)
  637.             treeview.scroll_to_cell(path, column=column)
  638.            
  639.     def getText(self, nodelist):
  640.         rc = []
  641.         for node in nodelist:
  642.             if node.nodeType == node.TEXT_NODE:
  643.                 rc.append(node.data)
  644.         return ''.join(rc)
  645.  
  646.     def cb_change_language(self, treeview, data=None):
  647.         ''' Called whenever someone updates the language '''
  648.         model = treeview.get_model()
  649.         active = treeview.get_selection().get_selected_rows()
  650.         if(len(active) < 1):
  651.             return
  652.         active = active[1][0]
  653.         if(active is None):
  654.             return
  655.         row = model[active]    
  656.         self.locale = row[1]
  657.    
  658.     def cb_change_kb_model(self, treeview, data=None):
  659.         ''' Called whenever someone updates the keyboard model '''
  660.         model = treeview.get_model()
  661.         active = treeview.get_selection().get_selected_rows()
  662.         if(len(active) < 1):
  663.             return
  664.         active = active[1][0]
  665.         if(active is None):
  666.             return
  667.         row = model[active]
  668.         os.system("setxkbmap -model %s" % row[1])
  669.         self.keyboard_model = row[1]
  670.         self.keyboard_model_desc = row[0]
  671.  
  672.     def cb_change_kb_layout(self, treeview, data=None):
  673.         ''' Called whenever someone updates the keyboard layout '''
  674.         model = treeview.get_model()
  675.         active = treeview.get_selection().get_selected_rows()
  676.         if(len(active) < 1):
  677.             return
  678.         active = active[1][0]
  679.         if(active is None):
  680.             return
  681.         row = model[active]
  682.         os.system("setxkbmap -layout %s" % row[1])
  683.         self.keyboard_layout = row[1]
  684.         self.keyboard_layout_desc = row[0]
  685.  
  686.     def pass_mismatcher(self, widget):
  687.         ''' Someone typed into the entry '''
  688.         w = self.wTree.get_widget("entry_userpass1")
  689.         w2 = self.wTree.get_widget("entry_userpass2")
  690.         txt1 = w.get_text()
  691.         txt2 = w2.get_text()
  692.         if(txt1 == "" and txt2 == ""):
  693.             self.wTree.get_widget("image_mismatch").hide()
  694.             self.wTree.get_widget("label_mismatch").hide()
  695.         else:
  696.             self.wTree.get_widget("image_mismatch").show()
  697.             self.wTree.get_widget("label_mismatch").show()
  698.         if(txt1 != txt2):
  699.             img = self.wTree.get_widget("image_mismatch")
  700.             img.set_from_stock(gtk.STOCK_NO, gtk.ICON_SIZE_BUTTON)
  701.             label = self.wTree.get_widget("label_mismatch")
  702.             label.set_label(_("Passwords do not match"))
  703.         else:
  704.             img = self.wTree.get_widget("image_mismatch")
  705.             img.set_from_stock(gtk.STOCK_OK, gtk.ICON_SIZE_BUTTON)
  706.             label = self.wTree.get_widget("label_mismatch")
  707.             label.set_label(_("Passwords match"))          
  708.            
  709.     def activate_page(self, index):
  710.         # Make breadcrumb normal       
  711.         for page in self.wizard_pages:
  712.             attrs = pango.AttrList()
  713.             text = self.wizard_pages[index].breadcrumb_text
  714.             battr = pango.AttrWeight(pango.WEIGHT_NORMAL, 0, len(text))
  715.             attrs.insert(battr)
  716.             page.breadcrumb_label.set_attributes(attrs)
  717.        
  718.         # Prepare bold style for one particular breadcrumb item
  719.         attrs = pango.AttrList()       
  720.         battr = pango.AttrWeight(pango.WEIGHT_BOLD, 0, len(text))
  721.         attrs.insert(battr)
  722.         self.wizard_pages[index].breadcrumb_label.set_attributes(attrs)    
  723.         self.wTree.get_widget("help_label").set_markup("%s" % self.wizard_pages[index].help_text)
  724.         self.wTree.get_widget("notebook1").set_current_page(index)
  725.        
  726.    
  727.     def wizard_cb(self, widget, goback, data=None):
  728.         ''' wizard buttons '''     
  729.         sel = self.wTree.get_widget("notebook1").get_current_page()
  730.         # check each page for errors
  731.         if(not goback):
  732.             if(sel == self.PAGE_LANGUAGE):             
  733.                 self.activate_page(self.PAGE_KEYBOARD)
  734.             elif(sel == self.PAGE_KEYBOARD):
  735.                 self.activate_page(self.PAGE_PARTITIONS)               
  736.                 notebook = self.wTree.get_widget("notebook_disks")
  737.                 if len(self.disks) == 1:                   
  738.                     notebook.set_current_page(1)                   
  739.                     thr = threading.Thread(name="live-installer-disk-search", group=None, target=self.build_partitions, args=(), kwargs={})
  740.                     thr.start()
  741.                 else:
  742.                     notebook.set_current_page(0)
  743.             elif(sel == self.PAGE_PARTITIONS):
  744.                 notebook = self.wTree.get_widget("notebook_disks")
  745.                 if notebook.get_current_page() == 0:
  746.                     notebook.set_current_page(1)                   
  747.                     thr = threading.Thread(name="live-installer-disk-search", group=None, target=self.build_partitions, args=(), kwargs={})
  748.                     thr.start()
  749.                 else:
  750.                     model = self.wTree.get_widget("treeview_disks").get_model()
  751.                     found_root = False
  752.                     for row in model:
  753.                         mountpoint = row[3]
  754.                         if(mountpoint == "/"):
  755.                             found_root = True
  756.                     if(not found_root):
  757.                         MessageDialog(_("Installation Tool"), _("Please select a root (/) partition before proceeding"), gtk.MESSAGE_ERROR).show()                                             
  758.                     else:
  759.                         self.activate_page(self.PAGE_USER)
  760.             elif(sel == self.PAGE_USER):
  761.                 username = self.wTree.get_widget("entry_username").get_text()
  762.                 if(username == ""):
  763.                     MessageDialog(_("Installation Tool"), _("Please provide a username"), gtk.MESSAGE_ERROR).show()                
  764.                 else:
  765.                     # username valid?
  766.                     for char in username:
  767.                         if(char.isupper()):
  768.                             MessageDialog(_("Installation Tool"), _("Your username must be lower case"), gtk.MESSAGE_WARNING).show()                           
  769.                         elif(char.isspace()):
  770.                             MessageDialog(_("Installation Tool"), _("Your username may not contain whitespace"), gtk.MESSAGE_WARNING).show()
  771.                         else:
  772.                             password1 = self.wTree.get_widget("entry_userpass1").get_text()
  773.                             password2 = self.wTree.get_widget("entry_userpass2").get_text()
  774.                             if(password1 == ""):
  775.                                 MessageDialog(_("Installation Tool"), _("Please provide a password for your user account"), gtk.MESSAGE_WARNING).show()
  776.                             elif(password1 != password2):
  777.                                 MessageDialog(_("Installation Tool"), _("Your passwords do not match"), gtk.MESSAGE_ERROR).show()
  778.                             else:
  779.                                 self.activate_page(self.PAGE_ADVANCED)
  780.             elif(sel == self.PAGE_ADVANCED):           
  781.                 self.activate_page(self.PAGE_OVERVIEW)
  782.                 self.show_overview()
  783.                 self.wTree.get_widget("treeview_overview").expand_all()
  784.                 print "next: overview"
  785.             elif(sel == self.PAGE_OVERVIEW):
  786.                 print "I should install.."
  787.                 self.activate_page(self.PAGE_INSTALL)
  788.                 # do install
  789.                 self.wTree.get_widget("button_next").hide()
  790.                 self.wTree.get_widget("button_back").hide()
  791.                 thr = threading.Thread(name="live-install", group=None, args=(), kwargs={}, target=self.do_install)
  792.                 thr.start()
  793.             self.wTree.get_widget("button_back").set_sensitive(True)
  794.         else:      
  795.             if(sel == self.PAGE_OVERVIEW):
  796.                 self.activate_page(self.PAGE_ADVANCED)
  797.             if(sel == self.PAGE_ADVANCED):
  798.                 self.activate_page(self.PAGE_USER)
  799.             if(sel == self.PAGE_USER):
  800.                 self.activate_page(self.PAGE_PARTITIONS)
  801.                 notebook = self.wTree.get_widget("notebook_disks")
  802.                 if len(self.disks) == 1:
  803.                     notebook.set_current_page(1)                   
  804.                     thr = threading.Thread(name="live-installer-disk-search", group=None, target=self.build_partitions, args=(), kwargs={})
  805.                     thr.start()
  806.                 else:
  807.                     notebook.set_current_page(0)
  808.             if(sel == self.PAGE_PARTITIONS):
  809.                 self.activate_page(self.PAGE_KEYBOARD)
  810.             if(sel == self.PAGE_KEYBOARD):
  811.                 self.activate_page(self.PAGE_LANGUAGE)
  812.                 self.wTree.get_widget("button_back").set_sensitive(False)          
  813.            
  814.     def show_overview(self):
  815.         ''' build the summary page '''
  816.         model = gtk.TreeStore(str)
  817.                
  818.         top = model.append(None)
  819.         model.set(top, 0, _("Localization"))
  820.         iter = model.append(top)
  821.         model.set(iter, 0, _("Language: ") + "<b>%s</b>" % self.locale)
  822.         iter = model.append(top)
  823.         model.set(iter, 0, _("Keyboard layout: ") + "<b>%s</b>" % self.keyboard_layout_desc)
  824.         iter = model.append(top)
  825.         model.set(iter, 0, _("Keyboard model: ") + "<b>%s</b>" % self.keyboard_model_desc)
  826.                
  827.         top = model.append(None)
  828.         model.set(top, 0, _("User settings"))
  829.         username = self.wTree.get_widget("entry_username").get_text()
  830.         realname = self.wTree.get_widget("entry_your_name").get_text() 
  831.         iter = model.append(top)
  832.         model.set(iter, 0, _("Real name: ") + "<b>%s</b>" % realname)  
  833.         iter = model.append(top)
  834.         model.set(iter, 0, _("Username: ") + "<b>%s</b>" % username)
  835.                
  836.         top = model.append(None)
  837.         model.set(top, 0, _("System settings"))
  838.         iter = model.append(top)
  839.         model.set(iter, 0, _("Hostname: ") + "<b>%s</b>" % self.wTree.get_widget("entry_hostname").get_text())
  840.                
  841.         install_grub = self.wTree.get_widget("checkbutton_grub").get_active()
  842.         grub_box = self.wTree.get_widget("combobox_grub")
  843.         grub_active = grub_box.get_active()
  844.         grub_model = grub_box.get_model()
  845.         iter = model.append(top)
  846.         if(install_grub):
  847.             model.set(iter, 0, _("Install bootloader in %s") % ("<b>%s</b>" % grub_model[grub_active][0]))
  848.         else:
  849.             model.set(iter, 0, _("Do not install bootloader"))
  850.                
  851.         top = model.append(None)
  852.         model.set(top, 0, _("Filesystem operations"))
  853.         disks = self.wTree.get_widget("treeview_disks").get_model()
  854.         for item in disks:
  855.             if(item[2]):
  856.                 # format it
  857.                 iter = model.append(top)
  858.                 model.set(iter, 0, "<b>%s</b>" % (_("Format %s (%s) as %s") % (item[0], item[4], item[1])))
  859.             if(item[3] is not None and item[3] is not ""):
  860.                 # mount point
  861.                 iter = model.append(top)
  862.                 model.set(iter, 0, "<b>%s</b>" % (_("Mount %s as %s") % (item[0], item[3])))
  863.        
  864.         self.wTree.get_widget("treeview_overview").set_model(model)
  865.        
  866.     def do_install(self):
  867.         print "do_install"
  868.         if "--debug" in sys.argv:
  869.             print "DEBUG MODE - INSTALLATION PROCESS NOT LAUNCHED"
  870.             sys.exit(0)
  871.            
  872.         ''' Actually perform the installation .. '''
  873.        
  874.         print "create installer"
  875.         inst = self.installer
  876.         # Create fstab
  877.         files = fstab()
  878.         model = self.wTree.get_widget("treeview_disks").get_model()
  879.         for row in model:
  880.             if(row[2] or row[3] is not None): # format or mountpoint specified.
  881.                 files.add_mount(device=row[0], mountpoint=row[3], filesystem=row[1], format=row[2])
  882.         inst.fstab = files # need to add set_fstab() to InstallerEngine
  883.        
  884.         print "create user"
  885.         # set up the system user
  886.         username = self.wTree.get_widget("entry_username").get_text()
  887.         password = self.wTree.get_widget("entry_userpass1").get_text()
  888.         realname = self.wTree.get_widget("entry_your_name").get_text()
  889.         hostname = self.wTree.get_widget("entry_hostname").get_text()      
  890.         user = SystemUser(username=username, password=password, realname=realname)
  891.         inst.set_main_user(user)
  892.         inst.set_hostname(hostname)
  893.                
  894.         print "set locale" 
  895.         # set language
  896.         inst.set_locale(self.locale)
  897.        
  898.         print "set keyboard options"
  899.         # set keyboard
  900.         inst.set_keyboard_options(layout=self.keyboard_layout, model=self.keyboard_model)
  901.  
  902.         # grub?
  903.         print "set grub"
  904.         do_grub = self.wTree.get_widget("checkbutton_grub").get_active()
  905.         if(do_grub):
  906.             grub_box = self.wTree.get_widget("combobox_grub")
  907.             grub_location = grub_box.get_model()[grub_box.get_active()][0]
  908.             inst.set_install_bootloader(device=grub_location)
  909.         inst.set_progress_hook(self.update_progress)
  910.  
  911.         print "install!"
  912.         # do we dare? ..       
  913.         inst.install()
  914.         print "install finished"
  915.         # show a message dialog thingum
  916.         while(not self.done):
  917.             time.sleep(0.1)
  918.         gtk.gdk.threads_enter()
  919.         MessageDialog(_("Installation Tool"), _("Installation is now complete. Please restart your computer to use the new system"), gtk.MESSAGE_INFO).show()
  920.         gtk.gdk.threads_leave()
  921.         # safe??
  922.         gtk.main_quit()
  923.         # you are now..
  924.         sys.exit(0)
  925.  
  926.     def update_progress(self, fail=False, done=False, pulse=False, total=0,current=0,message=""):
  927.         # TODO: ADD FAIL CHECKS..
  928.         if(pulse):
  929.             gtk.gdk.threads_enter()
  930.             self.wTree.get_widget("label_install_progress").set_label(message)
  931.             gtk.gdk.threads_leave()
  932.             self.do_progress_pulse(message)
  933.             return
  934.         if(done):
  935.             # cool, finished :D
  936.             self.should_pulse = False
  937.             self.done = done
  938.             gtk.gdk.threads_enter()
  939.             self.wTree.get_widget("progressbar").set_fraction(1)
  940.             self.wTree.get_widget("label_install_progress").set_label(message)
  941.             gtk.gdk.threads_leave()
  942.             return
  943.         self.should_pulse = False
  944.         _total = float(total)
  945.         _current = float(current)
  946.         pct = float(_current/_total)
  947.         szPct = int(pct)
  948.         # thread block
  949.         gtk.gdk.threads_enter()
  950.         self.wTree.get_widget("progressbar").set_fraction(pct)
  951.         self.wTree.get_widget("label_install_progress").set_label(message)
  952.         gtk.gdk.threads_leave()
  953.        
  954.         # end thread block
  955.    
  956.     def do_progress_pulse(self, message):
  957.         def pbar_pulse():
  958.             if(not self.should_pulse):
  959.                 return False
  960.             gtk.gdk.threads_enter()
  961.             self.wTree.get_widget("progressbar").pulse()
  962.             gtk.gdk.threads_leave()
  963.             return self.should_pulse
  964.         if(not self.should_pulse):
  965.             self.should_pulse = True
  966.             gobject.timeout_add(100, pbar_pulse)
  967.         else:
  968.             # asssume we're "pulsing" already
  969.             self.should_pulse = True
  970.             pbar_pulse()
  971.        
  972. class PartitionDialog:
  973.    
  974.     def __init__(self, item_to_edit):
  975.         self.resource_dir = '/usr/share/live-installer/'
  976.         self.glade = os.path.join(self.resource_dir, 'interface.glade')
  977.         self.dTree = gtk.glade.XML(self.glade, 'dialog')
  978.         self.window = self.dTree.get_widget("dialog")
  979.         self.window.set_title(_("Edit partition"))
  980.  
  981.         self.cancelled = False
  982.         self.dTree.get_widget("button_cancel").connect("clicked", self.cb_cancel)
  983.         self.build_fs_model()
  984.         self.build_mount_model()
  985.         # this is the fstab entry we will return
  986.         self.stab = item_to_edit
  987.         # i18n
  988.         self.dTree.get_widget("label_partition").set_markup("<b>%s</b>" % _("Device:"))
  989.         self.dTree.get_widget("label_partition_value").set_label(self.stab.device)
  990.         self.dTree.get_widget("label_use_as").set_markup("<b>%s</b>" % _("Use as:"))
  991.         # set the correct filesystem in this dialog
  992.         cur = -1
  993.         model = self.dTree.get_widget("combobox_use_as").get_model()
  994.         for item in model:
  995.             cur += 1
  996.             if(item[0] == self.stab.filesystem):
  997.                 self.dTree.get_widget("combobox_use_as").set_active(cur)
  998.                 break
  999.         self.dTree.get_widget("label_mount_point").set_markup("<b>%s</b>" % _("Mount point:"))
  1000.         if(self.stab.mountpoint is not None):
  1001.             self.dTree.get_widget("comboboxentry_mount_point").child.set_text(self.stab.mountpoint)
  1002.         self.dTree.get_widget("checkbutton_format").set_label(_("Format"))
  1003.         self.dTree.get_widget("checkbutton_format").set_active(self.stab.format)
  1004.        
  1005.     def build_fs_model(self):
  1006.         ''' Build supported filesystems list '''
  1007.         model = gtk.ListStore(str)
  1008.         model.append(["swap"])
  1009.         try:
  1010.             for item in os.listdir("/sbin"):
  1011.                 if(item.startswith("mkfs.")):
  1012.                     fstype = item.split(".")[1]
  1013.                     model.append([fstype])
  1014.         except Exception, detail:
  1015.             print detail
  1016.             print _("Could not build supported filesystems list!")
  1017.         self.dTree.get_widget("combobox_use_as").set_model(model)
  1018.            
  1019.     def build_mount_model(self):
  1020.         mounts = ["/", "/boot", "/tmp", "/home", "/srv"]
  1021.         model = gtk.ListStore(str)
  1022.         for mount in mounts:
  1023.             model.append([mount])
  1024.         self.dTree.get_widget("comboboxentry_mount_point").set_model(model)
  1025.        
  1026.     def cb_cancel(self, w, data=None):
  1027.         self.cancelled = True
  1028.  
  1029.     def show(self):
  1030.         self.window.run()
  1031.         self.window.hide()
  1032.         if(self.cancelled):
  1033.             return None
  1034.         self.stab.format = self.dTree.get_widget("checkbutton_format").get_active()
  1035.         w = self.dTree.get_widget("comboboxentry_mount_point")
  1036.         if(w.child.get_text().replace(" ","") != ""):
  1037.             self.stab.mountpoint = w.child.get_text()
  1038.         w = self.dTree.get_widget("combobox_use_as")
  1039.         # find filesystem ..
  1040.         active = w.get_active()
  1041.         model = w.get_model()[active]
  1042.         self.stab.filesystem = model[0]
  1043.         return self.stab
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement