def __call__(self, screen, anaconda): self.anaconda = anaconda while 1: g = GridFormHelp(screen, _("Partitioning Type"), "autopart", 1, 6) txt = TextboxReflowed(65, _("Installation requires partitioning of your hard drive. The default layout is suitable for most users. Select what space to use and which drives to use as the install target.")) g.add(txt, 0, 0, (0, 0, 0, 0)) opts = ((_("Use entire drive"), CLEARPART_TYPE_ALL), (_("Replace existing Linux system"), CLEARPART_TYPE_LINUX), (_("Use free space"), CLEARPART_TYPE_NONE)) typebox = Listbox(height = len(opts), scroll = 0) for (txt, val) in opts: typebox.append(txt, val) if anaconda.storage.clearPartType is None: preselection = CLEARPART_TYPE_LINUX else: preselection = anaconda.storage.clearPartType typebox.setCurrent(preselection) g.add(typebox, 0, 1, (0, 1, 0, 0)) # list of drives to select which to clear subgrid = Grid(1, 2) subgrid.setField(TextboxReflowed(55, _("Which drive(s) do you want to " "use for this installation?")), 0, 0) drivelist = CheckboxTree(height=2, scroll=1) subgrid.setField(drivelist, 0, 1) g.add(subgrid, 0, 2, (0, 1, 0, 0)) bb = ButtonBar(screen, [ TEXT_OK_BUTTON, TEXT_BACK_BUTTON ]) g.add(bb, 0, 5, (0,1,0,0)) typebox.setCallback(self.typeboxChange, (typebox, drivelist)) self.drivelist = drivelist g.addHotKey("F2") screen.pushHelpLine (_("<Space>,<+>,<-> selection | <F2> Add drive | <F12> next screen")) # restore the drive list each time disks = anaconda.storage.partitioned cleardrives = anaconda.storage.clearPartDisks for disk in disks: model = disk.model if not cleardrives or len(cleardrives) < 1: selected = 1 else: if disk.name in cleardrives: selected = 1 else: selected = 0 sizestr = "%8.0f MB" % (disk.size,) diskdesc = "%6s %s (%s)" % (disk.name, sizestr, model[:23],) drivelist.append(diskdesc, selected = selected) rc = g.run() if len(self.drivelist.getSelection()) > 0: sel = map(lambda s: s.split()[0], self.drivelist.getSelection()) else: sel = [] partmethod_ans = typebox.current() res = bb.buttonPressed(rc) self.clearDrivelist() screen.popHelpLine() screen.popWindow() if rc == "F2": addDialog = addDriveDialog(anaconda) if addDialog.addDriveDialog(screen) != INSTALL_BACK: anaconda.storage.reset() anaconda.bootloader.updateDriveList() continue if res == TEXT_BACK_CHECK: return INSTALL_BACK if anaconda.storage.checkNoDisks(): continue if len(sel) < 1: mustHaveSelectedDrive(anaconda.intf) continue anaconda.dispatch.skipStep("autopartitionexecute", skip = 0) anaconda.storage.doAutoPart = True anaconda.storage.clearPartType = partmethod_ans anaconda.storage.clearPartDisks = sel break # ask to review autopartition layout - but only if it's not custom partitioning anaconda.dispatch.skipStep("partition", skip = 1) anaconda.dispatch.skipStep("bootloader", skip = 1) return INSTALL_OK
def __call__(self, screen, anaconda): self.anaconda = anaconda while 1: g = GridFormHelp(screen, _("Partitioning Type"), "autopart", 1, 6) txt = TextboxReflowed(65, _("Installation requires partitioning of your hard drive. The default layout is suitable for most users. Select what space to use and which drives to use as the install target.")) g.add(txt, 0, 0, (0, 0, 0, 0)) opts = ((_("Use entire drive"), CLEARPART_TYPE_ALL), (_("Replace existing Linux system"), CLEARPART_TYPE_LINUX), (_("Use free space"), CLEARPART_TYPE_NONE)) typebox = Listbox(height = len(opts), scroll = 0) for (txt, val) in opts: typebox.append(txt, val) if anaconda.storage.config.clearPartType is None: preselection = CLEARPART_TYPE_LINUX else: preselection = anaconda.storage.config.clearPartType typebox.setCurrent(preselection) g.add(typebox, 0, 1, (0, 1, 0, 0)) # list of drives to select which to clear subgrid = Grid(1, 2) subgrid.setField(TextboxReflowed(55, _("Which drive(s) do you want to " "use for this installation?")), 0, 0) drivelist = CheckboxTree(height=2, scroll=1) subgrid.setField(drivelist, 0, 1) g.add(subgrid, 0, 2, (0, 1, 0, 0)) bb = ButtonBar(screen, [ TEXT_OK_BUTTON, TEXT_BACK_BUTTON ]) g.add(bb, 0, 5, (0,1,0,0)) typebox.setCallback(self.typeboxChange, (typebox, drivelist)) self.drivelist = drivelist g.addHotKey("F2") screen.pushHelpLine (_("<Space>,<+>,<-> selection | <F2> Add drive | <F12> next screen")) # restore the drive list each time disks = anaconda.storage.partitioned cleardrives = anaconda.storage.config.clearPartDisks for disk in disks: model = disk.model if not cleardrives or len(cleardrives) < 1: selected = 1 else: if disk.name in cleardrives: selected = 1 else: selected = 0 sizestr = "%8.0f MB" % (disk.size,) diskdesc = "%6s %s (%s)" % (disk.name, sizestr, model[:23],) drivelist.append(diskdesc, selected = selected) rc = g.run() if len(self.drivelist.getSelection()) > 0: sel = map(lambda s: s.split()[0], self.drivelist.getSelection()) else: sel = [] partmethod_ans = typebox.current() res = bb.buttonPressed(rc) self.clearDrivelist() screen.popHelpLine() screen.popWindow() if rc == "F2": addDialog = addDriveDialog(anaconda) if addDialog.addDriveDialog(screen) != INSTALL_BACK: anaconda.storage.reset() anaconda.bootloader.updateDriveList() continue if res == TEXT_BACK_CHECK: return INSTALL_BACK if anaconda.storage.checkNoDisks(): continue if len(sel) < 1: mustHaveSelectedDrive(anaconda.intf) continue anaconda.dispatch.skipStep("autopartitionexecute", skip = 0) anaconda.storage.doAutoPart = True anaconda.storage.config.clearPartType = partmethod_ans anaconda.storage.config.clearPartDisks = sel break # ask to review autopartition layout - but only if it's not custom partitioning anaconda.dispatch.skipStep("partition", skip = 1) anaconda.dispatch.skipStep("bootloader", skip = 1) return INSTALL_OK
def runRescue(anaconda, instClass): for file in [ "services", "protocols", "group", "joe", "man.config", "nsswitch.conf", "selinux", "mke2fs.conf" ]: try: os.symlink('/mnt/runtime/etc/' + file, '/etc/' + file) except: pass # see if they would like networking enabled if not network.hasActiveNetDev(): screen = SnackScreen() while True: rc = ButtonChoiceWindow(screen, _("Setup Networking"), _("Do you want to start the network interfaces on " "this system?"), [_("Yes"), _("No")]) if rc != string.lower(_("No")): anaconda.intf = RescueInterface(screen) if not anaconda.intf.enableNetwork(anaconda): anaconda.intf.messageWindow(_("No Network Available"), _("Unable to activate a networking device. Networking " "will not be available in rescue mode.")) break startNetworking(anaconda.id.network, anaconda.intf) break else: break anaconda.intf = None screen.finish() # Early shell access with no disk access attempts if not anaconda.rescue_mount: # the %post should be responsible for mounting all needed file systems # NOTE: 1st script must be bash or simple python as nothing else might be available in the rescue image if anaconda.isKickstart and anaconda.id.ksdata.scripts: from kickstart import runPostScripts runPostScripts(anaconda) else: runShell() sys.exit(0) screen = SnackScreen() anaconda.intf = RescueInterface(screen) if anaconda.isKickstart: if anaconda.id.ksdata.rescue and anaconda.id.ksdata.rescue.romount: readOnly = 1 else: readOnly = 0 else: # prompt to see if we should try and find root filesystem and mount # everything in /etc/fstab on that root while True: rc = ButtonChoiceWindow(screen, _("Rescue"), _("The rescue environment will now attempt to find your " "Linux installation and mount it under the directory " "%s. You can then make any changes required to your " "system. If you want to proceed with this step choose " "'Continue'. You can also choose to mount your file systems " "read-only instead of read-write by choosing 'Read-Only'. " "If you need to activate SAN devices choose 'Advanced'." "\n\n" "If for some reason this process fails you can choose 'Skip' " "and this step will be skipped and you will go directly to a " "command shell.\n\n") % (anaconda.rootPath,), [_("Continue"), _("Read-Only"), _("Skip"), _("Advanced")] ) if rc == string.lower(_("Skip")): runShell(screen) sys.exit(0) elif rc == string.lower(_("Advanced")): addDialog = addDriveDialog(anaconda) addDialog.addDriveDialog(screen) continue elif rc == string.lower(_("Read-Only")): readOnly = 1 else: readOnly = 0 break import storage storage.storageInitialize(anaconda) disks = upgrade.findExistingRoots(anaconda, upgradeany=True) if not disks: root = None elif (len(disks) == 1) or anaconda.isKickstart: root = disks[0] else: height = min (len (disks), 12) if height == 12: scroll = 1 else: scroll = 0 devList = [] for (device, relstr) in disks: if getattr(device.format, "label", None): devList.append("%s (%s) - %s" % (device.name, device.format.label, relstr)) else: devList.append("%s - %s" % (device.name, relstr)) (button, choice) = \ ListboxChoiceWindow(screen, _("System to Rescue"), _("Which device holds the root partition " "of your installation?"), devList, [ _("OK"), _("Exit") ], width = 30, scroll = scroll, height = height, help = "multipleroot") if button == string.lower (_("Exit")): root = None else: root = disks[choice] rootmounted = 0 if root: try: rc = mountExistingSystem(anaconda, root, allowDirty = 1, warnDirty = 1, readOnly = readOnly) if rc == -1: if anaconda.isKickstart: log.error("System had dirty file systems which you chose not to mount") else: ButtonChoiceWindow(screen, _("Rescue"), _("Your system had dirty file systems which you chose not " "to mount. Press return to get a shell from which " "you can fsck and mount your partitions. The system " "will reboot automatically when you exit from the " "shell."), [_("OK")], width = 50) rootmounted = 0 else: if anaconda.isKickstart: log.info("System has been mounted under: %s" % anaconda.rootPath) else: ButtonChoiceWindow(screen, _("Rescue"), _("Your system has been mounted under %(rootPath)s.\n\n" "Press <return> to get a shell. If you would like to " "make your system the root environment, run the command:\n\n" "\tchroot %(rootPath)s\n\nThe system will reboot " "automatically when you exit from the shell.") % {'rootPath': anaconda.rootPath}, [_("OK")] ) rootmounted = 1 # now turn on swap if not readOnly: try: anaconda.id.storage.turnOnSwap() except: log.error("Error enabling swap") # and /selinux too if flags.selinux and os.path.isdir("%s/selinux" %(anaconda.rootPath,)): try: isys.mount("/selinux", "%s/selinux" %(anaconda.rootPath,), "selinuxfs") except Exception, e: log.error("error mounting selinuxfs: %s" %(e,)) fd = open("%s/.autorelabel" % anaconda.rootPath, "w+") fd.close() # set a library path to use mounted fs libdirs = os.environ["LD_LIBRARY_PATH"].split(":") mounted = map(lambda dir: "/mnt/sysimage%s" % dir, libdirs) os.environ["LD_LIBRARY_PATH"] = ":".join(libdirs + mounted) # find groff data dir try: glst = os.listdir("/mnt/sysimage/usr/share/groff") # find a directory which is a numeral, its where # data files are gversion = None for gdir in glst: try: isone = 1 for idx in range(0, len(gdir)): if string.find(string.digits + '.', gdir[idx]) == -1: isone = 0 break if isone: gversion = gdir break except: gversion = None continue except: gversion = None if gversion is not None: gpath = "/mnt/sysimage/usr/share/groff/"+gversion os.environ["GROFF_FONT_PATH"] = gpath + '/font' os.environ["GROFF_TMAC_PATH"] = "%s:/mnt/sysimage/usr/share/groff/site-tmac" % (gpath + '/tmac',) # do we have bash? try: if os.access("/usr/bin/bash", os.R_OK): os.symlink ("/usr/bin/bash", "/bin/bash") except: pass except: # This looks horrible, but all it does is catch every exception, # and reraise those in the tuple check. This lets programming # errors raise exceptions, while any runtime error will # still result in a shell (exc, val) = sys.exc_info()[0:2] log.error(str(exc)+": "+str(val)) if exc in (IndexError, ValueError, SyntaxError): raise exc, val, sys.exc_info()[2] if anaconda.isKickstart: log.error("An error occurred trying to mount some or all of your system") else: ButtonChoiceWindow(screen, _("Rescue"), _("An error occurred trying to mount some or all of your " "system. Some of it may be mounted under %s.\n\n" "Press <return> to get a shell. The system will reboot " "automatically when you exit from the shell.") % (anaconda.rootPath,), [_("OK")] ) else: if anaconda.isKickstart and \ anaconda.id.ksdata.reboot.action in [KS_REBOOT, KS_SHUTDOWN]: log.info("No Linux partitions found") screen.finish() print(_("You don't have any Linux partitions. Rebooting.\n")) sys.exit(0) else: ButtonChoiceWindow(screen, _("Rescue Mode"), _("You don't have any Linux partitions. Press " "return to get a shell. The system will reboot " "automatically when you exit from the shell."), [ _("OK") ], width = 50) msgStr = "" if rootmounted and not readOnly: makeMtab(anaconda.rootPath, anaconda.id.storage) try: makeResolvConf(anaconda.rootPath) except Exception, e: log.error("error making a resolv.conf: %s" %(e,)) msgStr = _("Your system is mounted under the %s directory.") % (anaconda.rootPath,) ButtonChoiceWindow(screen, _("Rescue"), msgStr, [_("OK")] )
def runRescue(anaconda, instClass): for file in [ "services", "protocols", "group", "joe", "man.config", "nsswitch.conf", "selinux", "mke2fs.conf" ]: try: os.symlink('/mnt/runtime/etc/' + file, '/etc/' + file) except: pass # see if they would like networking enabled if not network.hasActiveNetDev(): screen = SnackScreen() while True: rc = ButtonChoiceWindow( screen, _("Setup Networking"), _("Do you want to start the network interfaces on " "this system?"), [_("Yes"), _("No")]) if rc != string.lower(_("No")): anaconda.intf = RescueInterface(screen) if not anaconda.intf.enableNetwork(anaconda): anaconda.intf.messageWindow( _("No Network Available"), _("Unable to activate a networking device. Networking " "will not be available in rescue mode.")) break startNetworking(anaconda.id.network, anaconda.intf) break else: break anaconda.intf = None screen.finish() # Early shell access with no disk access attempts if not anaconda.rescue_mount: # the %post should be responsible for mounting all needed file systems # NOTE: 1st script must be bash or simple python as nothing else might be available in the rescue image if anaconda.isKickstart and anaconda.id.ksdata.scripts: from kickstart import runPostScripts runPostScripts(anaconda) else: runShell() sys.exit(0) screen = SnackScreen() anaconda.intf = RescueInterface(screen) if anaconda.isKickstart: if anaconda.id.ksdata.rescue and anaconda.id.ksdata.rescue.romount: readOnly = 1 else: readOnly = 0 else: # prompt to see if we should try and find root filesystem and mount # everything in /etc/fstab on that root while True: rc = ButtonChoiceWindow( screen, _("Rescue"), _("The rescue environment will now attempt to find your " "Linux installation and mount it under the directory " "%s. You can then make any changes required to your " "system. If you want to proceed with this step choose " "'Continue'. You can also choose to mount your file systems " "read-only instead of read-write by choosing 'Read-Only'. " "If you need to activate SAN devices choose 'Advanced'." "\n\n" "If for some reason this process fails you can choose 'Skip' " "and this step will be skipped and you will go directly to a " "command shell.\n\n") % (anaconda.rootPath, ), [_("Continue"), _("Read-Only"), _("Skip"), _("Advanced")]) if rc == string.lower(_("Skip")): runShell(screen) sys.exit(0) elif rc == string.lower(_("Advanced")): addDialog = addDriveDialog(anaconda) addDialog.addDriveDialog(screen) continue elif rc == string.lower(_("Read-Only")): readOnly = 1 else: readOnly = 0 break import storage storage.storageInitialize(anaconda) disks = upgrade.findExistingRoots(anaconda, upgradeany=True) if not disks: root = None elif (len(disks) == 1) or anaconda.isKickstart: root = disks[0] else: height = min(len(disks), 12) if height == 12: scroll = 1 else: scroll = 0 devList = [] for (device, relstr) in disks: if getattr(device.format, "label", None): devList.append("%s (%s) - %s" % (device.name, device.format.label, relstr)) else: devList.append("%s - %s" % (device.name, relstr)) (button, choice) = \ ListboxChoiceWindow(screen, _("System to Rescue"), _("Which device holds the root partition " "of your installation?"), devList, [ _("OK"), _("Exit") ], width = 30, scroll = scroll, height = height, help = "multipleroot") if button == string.lower(_("Exit")): root = None else: root = disks[choice] rootmounted = 0 if root: try: rc = mountExistingSystem(anaconda, root, allowDirty=1, warnDirty=1, readOnly=readOnly) if rc == -1: if anaconda.isKickstart: log.error( "System had dirty file systems which you chose not to mount" ) else: ButtonChoiceWindow( screen, _("Rescue"), _("Your system had dirty file systems which you chose not " "to mount. Press return to get a shell from which " "you can fsck and mount your partitions. The system " "will reboot automatically when you exit from the " "shell."), [_("OK")], width=50) rootmounted = 0 else: if anaconda.isKickstart: log.info("System has been mounted under: %s" % anaconda.rootPath) else: ButtonChoiceWindow( screen, _("Rescue"), _("Your system has been mounted under %(rootPath)s.\n\n" "Press <return> to get a shell. If you would like to " "make your system the root environment, run the command:\n\n" "\tchroot %(rootPath)s\n\nThe system will reboot " "automatically when you exit from the shell.") % {'rootPath': anaconda.rootPath}, [_("OK")]) rootmounted = 1 # now turn on swap if not readOnly: try: anaconda.id.storage.turnOnSwap() except: log.error("Error enabling swap") # and /selinux too if flags.selinux and os.path.isdir("%s/selinux" % (anaconda.rootPath, )): try: isys.mount("/selinux", "%s/selinux" % (anaconda.rootPath, ), "selinuxfs") except Exception, e: log.error("error mounting selinuxfs: %s" % (e, )) fd = open("%s/.autorelabel" % anaconda.rootPath, "w+") fd.close() # set a library path to use mounted fs libdirs = os.environ["LD_LIBRARY_PATH"].split(":") mounted = map(lambda dir: "/mnt/sysimage%s" % dir, libdirs) os.environ["LD_LIBRARY_PATH"] = ":".join(libdirs + mounted) # find groff data dir try: glst = os.listdir("/mnt/sysimage/usr/share/groff") # find a directory which is a numeral, its where # data files are gversion = None for gdir in glst: try: isone = 1 for idx in range(0, len(gdir)): if string.find(string.digits + '.', gdir[idx]) == -1: isone = 0 break if isone: gversion = gdir break except: gversion = None continue except: gversion = None if gversion is not None: gpath = "/mnt/sysimage/usr/share/groff/" + gversion os.environ["GROFF_FONT_PATH"] = gpath + '/font' os.environ[ "GROFF_TMAC_PATH"] = "%s:/mnt/sysimage/usr/share/groff/site-tmac" % ( gpath + '/tmac', ) # do we have bash? try: if os.access("/usr/bin/bash", os.R_OK): os.symlink("/usr/bin/bash", "/bin/bash") except: pass except: # This looks horrible, but all it does is catch every exception, # and reraise those in the tuple check. This lets programming # errors raise exceptions, while any runtime error will # still result in a shell (exc, val) = sys.exc_info()[0:2] log.error(str(exc) + ": " + str(val)) if exc in (IndexError, ValueError, SyntaxError): raise exc, val, sys.exc_info()[2] if anaconda.isKickstart: log.error( "An error occurred trying to mount some or all of your system" ) else: ButtonChoiceWindow( screen, _("Rescue"), _("An error occurred trying to mount some or all of your " "system. Some of it may be mounted under %s.\n\n" "Press <return> to get a shell. The system will reboot " "automatically when you exit from the shell.") % (anaconda.rootPath, ), [_("OK")]) else: if anaconda.isKickstart and \ anaconda.id.ksdata.reboot.action in [KS_REBOOT, KS_SHUTDOWN]: log.info("No Linux partitions found") screen.finish() print(_("You don't have any Linux partitions. Rebooting.\n")) sys.exit(0) else: ButtonChoiceWindow( screen, _("Rescue Mode"), _("You don't have any Linux partitions. Press " "return to get a shell. The system will reboot " "automatically when you exit from the shell."), [_("OK")], width=50) msgStr = "" if rootmounted and not readOnly: makeMtab(anaconda.rootPath, anaconda.id.storage) try: makeResolvConf(anaconda.rootPath) except Exception, e: log.error("error making a resolv.conf: %s" % (e, )) msgStr = _("Your system is mounted under the %s directory.") % ( anaconda.rootPath, ) ButtonChoiceWindow(screen, _("Rescue"), msgStr, [_("OK")])