summaryrefslogtreecommitdiffstats
path: root/build_tools/larch8/larch0/gui/front/page_medium.py
diff options
context:
space:
mode:
authorJames Meyer <james.meyer@operamail.com>2010-12-02 22:37:23 (GMT)
committerJames Meyer <james.meyer@operamail.com>2010-12-02 22:37:34 (GMT)
commit8b94d7f39c71234712bead363526a0283efeb9fa (patch)
tree23f1dbd6458dc39a2c1b08bcdd4cbf768a60d84d /build_tools/larch8/larch0/gui/front/page_medium.py
parent338af567e74d08cbd357079941208e494463d61e (diff)
downloadlinhes_dev-8b94d7f39c71234712bead363526a0283efeb9fa.zip
larch8: first checkin, still needs some work
Diffstat (limited to 'build_tools/larch8/larch0/gui/front/page_medium.py')
-rw-r--r--build_tools/larch8/larch0/gui/front/page_medium.py441
1 files changed, 441 insertions, 0 deletions
diff --git a/build_tools/larch8/larch0/gui/front/page_medium.py b/build_tools/larch8/larch0/gui/front/page_medium.py
new file mode 100644
index 0000000..e63ce13
--- /dev/null
+++ b/build_tools/larch8/larch0/gui/front/page_medium.py
@@ -0,0 +1,441 @@
+# page_medium.py - Handler for the project settings page
+#
+# (c) Copyright 2010 Michael Towers (larch42 at googlemail dot com)
+#
+# This file is part of the larch project.
+#
+# larch is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# larch is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with larch; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+#----------------------------------------------------------------------------
+# 2010.11.28
+
+"""This page takes a directory processed by larchify. It produces a bootable
+larch medium, or, in the case of CD/DVD, an iso image.
+It also handles creation of a boot-iso for an existing larch medium (partition)
+and can copy larch media to different devices.
+"""
+
+import os
+from config import detection_methods, OKFS
+
+
+class Medium:
+ def __init__(self):
+ self.medium = None
+ self.srcmedium = None
+ self.detectionmodes = detection_methods.split('|')
+ ui.widgetlist(fss('fetch_layout', 'page_medium.uim'))
+
+ ui.connectlist(
+ (':vlabelb*clicked', self.newlabel),
+ (':selectpart*clicked', self.choosedest),
+ (':selectsrc*clicked', self.choosesrc),
+ (':persist*toggled', self.persistence),
+ (':ovl_journal*toggled', self.journal),
+ (':mediumtype*changed', self.mediumtype),
+ (':srctype*changed', self.srctype),
+ (':make_medium*clicked', self.make),
+ (':nolarchboot*toggled', self.bootnosearch),
+ (':detection*changed', self.mediumsearch),
+ (':pformat*toggled', self.setpformat),
+ (':bootlines*clicked', self.editbootlines),
+ (':syslinuxtemplate*clicked', self.editsyslin),
+ (':cdroot*clicked', self.browsecdroot),
+ )
+
+
+ def enter(self):
+ """This is called when the page is entered/selected/shown.
+ It performs initialisations which depend on the state.
+ """
+ self.destinationpath = ''
+ self.fsok = None
+ self.source, ok = fss('testlarchify') # check the larchified installation
+ if not ok:
+ run_error(self.data('msg_med') % self.source)
+ self.source = ''
+ self.mediumtype(None)
+ if self.medium != 'medium-boot':
+ self.srctype(None)
+ detect = fss('getitem', 'medium_search')
+ ui.command(':detection.set',
+ [self.data('detectionmodes')[l] for l in self.detectionmodes],
+ self.detectionmodes.index(detect))
+ self.nlbenable(detect)
+ ui.command(':nolarchboot.set', fss('getbool', 'boot_nosearch'))
+ ui.command(':vlabele.text', fss('get_mediumlabel'))
+ ui.command(':ovl_journal.set', fss('getbool', 'journal'))
+ fmt = fss('getbool', 'do_format')
+ ui.command(':pformat.set', fmt )
+ ui.command(':ovl_journal.enable', fmt)
+ ui.command(':persist.set', fss('getbool', 'do_persist'))
+
+ ui.command(':larchpart.text') # clear the destination
+ docviewer.gohome('gui_medium.html')
+
+
+ def data(self, key):
+ return ui.command('medium_page_data.get', key)
+
+
+ def mediumtype(self, index):
+ if (index == None):
+ if self.medium == None:
+ self.medium = self.data('media')[0]
+ else:
+ self.medium = self.data('media')[index]
+
+ if self.medium == 'medium-boot':
+ label = fss('get_bootisolabel')
+ ui.command(':srctype.setindex', self.data('sources').index('device'))
+ ui.command(':srctype.enable', False)
+ ifile = fss('getbootisofile')
+
+ else:
+ label = fss('get_mediumlabel')
+ ui.command(':srctype.enable', True)
+
+ if self.medium == 'medium-iso':
+ ifile = fss('getisofile')
+
+ self.showlabel(label)
+
+ if self.medium == 'medium-w':
+ ui.command(':mediumopts.enable', True)
+ self.setdestinationpath('')
+
+ else:
+ ui.command(':mediumopts.enable', False)
+ idir = fss('getisosavedir')
+ if not fss('isdir', idir):
+ fss('setitem', 'isosavedir', '')
+ idir = fss('getisosavedir')
+ self.setdestinationpath(os.path.join(idir, ifile))
+
+ if index != None:
+ self.enableprofile()
+ self.enablemake()
+
+
+ def srctype(self, index):
+ if (index == None):
+ if self.srcmedium == None:
+ self.srcmedium = self.data('sources')[0]
+ else:
+ self.srcmedium = self.data('sources')[index]
+
+ if self.srcmedium == 'larchified':
+ self.setsourcepath(self.source)
+ ui.command(':selectsrc.enable', False)
+
+ elif self.srcmedium == 'device':
+ self.setsourcepath('') # clear source, it must be selected
+ ui.command(':selectsrc.enable', True)
+
+ elif self.srcmedium == 'isofile':
+ isof = fss('getisofile')
+ isod = fss('getisosavedir')
+ self.pendingpath = os.path.join(isod, isof)
+ ui.command(':selectsrc.enable', True)
+ self.setsourcepath('')
+ self.checklarchsource()
+
+
+ def setsourcepath(self, path):
+ self.sourcepath = path
+ ui.command(':srclocation.text', path)
+ self.enableprofile()
+ self.enablemake()
+
+
+ def choosesrc(self):
+ # 'larchified' should not be possible - it is set on the project page
+ if self.srcmedium == 'device':
+ self.devices = []
+ larchcall('*rootfn', self._cd_line, 'blkid -c dev/null -o list')
+
+ elif self.srcmedium == 'isofile':
+ # Pop up a file browser
+ self.pendingpath = self.isopath(mode='source')
+ self.checklarchsource()
+
+ else:
+ debug('page_medium: Medium.choosesrc / ' + self.srcmedium)
+
+ def _cd_line(self, line):
+ if line == None:
+ # Completed - pop up device chooser
+ ok, choice = ui.command('listDialog',
+ self.data('parts_src'),
+ self.data('parts_t'),
+ self.devices, len(self.devices) - 1)
+ if ok:
+ self.pendingpath = choice.split()[0]
+ ui.idle_add(self.checklarchsource)
+
+ else:
+ l = line.strip()
+ if l.startswith('/dev/'):
+ i = l.find('(not mounted)')
+ if i > 0:
+ ls = l[:i].split(None, 2)
+ if (ls[0] != self.destinationpath) and (len(ls) == 3):
+ self.devices.append('%-10s %s' % (ls[0], ls[2]))
+
+
+ def checklarchsource(self):
+ if self.pendingpath:
+ # check it is really a larch medium
+ self.larchok = False
+ larchcall('*larchmedium', self._cs_line, self.pendingpath)
+
+ def _cs_line(self, line):
+ if line == None:
+ # Completed
+ if self.larchok:
+ self.setsourcepath(self.pendingpath)
+ else:
+ l = line.strip()
+ if l.startswith('##--'):
+ if l.endswith('ok'):
+ self.larchok = True
+
+
+ def enableprofile(self):
+ """Set the enabled state of the medium profile frame,
+ according to the state of the choices.
+ """
+ ui.command(':mediumprofile.enable', (self.medium != 'medium-boot')
+ and (self.srcmedium == 'larchified'))
+
+
+ def enablemake(self):
+ on = bool(self.destinationpath) and bool(self.sourcepath)
+ if self.medium == 'medium-w':
+ formatting = fss('getbool', 'do_format')
+ self.enablepersist(formatting or (self.fsok in OKFS))
+ if (not formatting):
+ if (self.fsok not in OKFS) and (self.fsok != 'vfat'):
+ on = False
+ ui.command(':make_medium.enable', on)
+
+
+ def enablepersist(self, on):
+ ui.command(':persist.enable', on)
+ self.persist_enabled = on
+
+
+ def persistence(self, on):
+ fss('setbool', 'do_persist', on)
+
+
+ def journal(self, on):
+ fss('setbool', 'journal', on)
+
+
+ def mediumsearch(self, option):
+ choice = self.detectionmodes[option]
+ fss('setitem', 'medium_search', choice)
+ self.nlbenable(choice)
+
+
+ def nlbenable(self, choice):
+ ui.command(':nolarchboot.enable', choice != 'search')
+
+
+ def bootnosearch(self, on):
+ fss('setbool', 'boot_nosearch', on)
+
+
+ def setpformat(self, on):
+ fss('setbool', 'do_format', on)
+ ui.command(':ovl_journal.enable', on)
+ self.enablemake()
+
+
+ def editbootlines(self):
+ f0 = 'profile:cd-root/boot0/bootlines'
+ if not fss('isfile', f0):
+ f0 = 'base:cd-root/boot0/bootlines'
+ edit('profile:cd-root/boot/bootlines', 'base:cd-root/boot0/bootlines')
+
+
+ def editsyslin(self):
+ f0 = 'profile:cd-root/boot0/isolinux/isolinux.cfg'
+ if not fss('isfile', f0):
+ f0 = 'base:cd-root/boot0/isolinux/isolinux.cfg'
+ edit('profile:cd-root/boot/isolinux/isolinux.cfg', f0)
+
+
+ def browsecdroot(self):
+ fss('browse', 'profile:cd-root')
+
+
+ def newlabel(self):
+ labelsrc = 'bootiso' if self.medium == 'medium-boot' else 'medium'
+ ok, l = ui.command('textLineDialog',
+ self.data('prompt_label'),
+ None, fss('get_%slabel' % labelsrc))
+ if ok:
+ self.showlabel(fss('set_%slabel' % labelsrc, l))
+
+
+ def showlabel(self, l):
+ ui.command(':vlabele.text', l)
+
+
+ def choosedest(self):
+ if self.medium == 'medium-w':
+ # Present a list of unmounted partitions
+ self.devices = []
+ larchcall('*rootfn', self._sd_line, 'blkid -c /dev/null -o list')
+
+ elif self.medium == 'medium-iso':
+ # Pop up a file browser
+ path = self.isopath(mode='source')
+ if path:
+ self.setdestinationpath(path)
+
+ elif self.medium == 'medium-boot':
+ # Pop up a file browser
+ path = self.isopath(mode='bootiso')
+ if path:
+ self.setdestinationpath(path)
+
+ def _sd_line(self, line):
+ if line == None:
+ nmdevices = []
+ for part in fss('get_partitions'): # ->(dev, size in MiB(int))
+ if part[0] == self.sourcepath:
+ continue
+ found = False
+ for partinfo in self.devices:
+ if partinfo[0] == part[0]:
+ if partinfo[2]:
+ nmdevices.append('%-12s %8d MiB %-10s %s'
+ % (part[0], part[1], partinfo[1], partinfo[2]))
+ found = True
+ break
+ if not found:
+ nmdevices.append('%-12s %-12d MiB' % (part[0], part[1]))
+
+ # Completed - pop up device chooser
+ ok, choice = ui.command('listDialog',
+ self.data('parts_dst'),
+ self.data('parts_t'),
+ nmdevices, len(nmdevices) - 1)
+ if ok:
+ ui.idle_add(self.setdestinationpath, choice.split()[0])
+
+ else:
+ l = line.strip()
+ if l.startswith('/dev/'):
+ i = l.find('(not mounted)')
+ if i > 0:
+ # Try to get label for unmounted devices only
+ ls = l[:i].split(None, 2)
+ if len(ls) < 3:
+ ls.append('-') # signifies 'no label'
+ else:
+ ls = l.split(None, 2)
+ ls[2] = None # mark the partition as mounted
+ self.devices.append(ls)
+
+
+ def setdestinationpath(self, path):
+ ui.command(':larchpart.text', path)
+ self.destinationpath = path
+ if path.startswith('/dev/'):
+ # Check the file-system
+ self.fsok = None
+ larchcall('*rootfn', self._em_line,
+ 'blkid -c /dev/null -o value -s TYPE %s' % path)
+ else:
+ self.enablemake()
+
+ def _em_line(self, line):
+ if line == None:
+ # Completed
+ self.enablemake()
+ else:
+ line = line.strip()
+ if line:
+ self.fsok = line
+
+
+ def isopath(self, mode='dest'):
+ sdir = fss('getisosavedir')
+ ifname = fss('getbootisofile' if mode=='bootiso' else 'getisofile')
+ path = ui.fileDialog(self.data('isoget' if mode=='source' else 'isopath'),
+ startdir=sdir, create=(mode!='source'),
+ file=ifname, filter=(self.data('iso_type'), '*.iso'))
+ if path:
+ f = os.path.basename(path)
+ d = os.path.dirname(path)
+ if d != sdir:
+ fss('setitem', 'isosavedir', d)
+ if f != ifname:
+ fss('setitem', 'bootisofile' if mode=='bootiso' else 'isofile', f)
+ return path
+
+ return None
+
+
+ def make(self):
+ """Write the larch medium.
+ """
+ if self.srcmedium == 'larchified':
+ source = None
+ else:
+ source = self.sourcepath
+ if not source:
+ debug("page_medium: make / null source")
+ return
+
+ args = ['-l', ui.command(':vlabele.get')]
+
+ if self.medium == 'medium-boot':
+ # Write a boot iso file
+ args += ['-b', '-o', self.destinationpath]
+ larchcall('writemedium', source, args)
+
+ elif self.medium == 'medium-iso':
+ # Write an 'iso' file
+ args += ['-o', self.destinationpath]
+ larchcall('writemedium', source, args)
+
+ else:
+ # Write to partition
+ # Medium detection options
+ detect = fss('getitem', 'medium_search')
+ args += ['-d', detect]
+ if (detect != 'search') and ui.command(':nolarchboot.active'):
+ args.append('-n')
+ # Formatting
+ if fss('getbool', 'do_format'):
+ # Journalling?
+ if not fss('getbool', 'journal'):
+ args.append('-j')
+ else:
+ args.append('-F')
+ # Set master boot record?
+ if ui.command(':nombr.active'):
+ args.append('-m')
+ # Persistence
+ if fss('getbool', 'do_persist') and self.persist_enabled:
+ args.append('-P')
+ # Add the medium to the argument list
+ args.append(self.destinationpath)
+ larchcall('writemedium', source, args)