diff options
Diffstat (limited to 'pyanaconda/rescue.py')
-rw-r--r-- | pyanaconda/rescue.py | 163 |
1 files changed, 61 insertions, 102 deletions
diff --git a/pyanaconda/rescue.py b/pyanaconda/rescue.py index 5854e25a1..be84c1a2e 100644 --- a/pyanaconda/rescue.py +++ b/pyanaconda/rescue.py @@ -23,7 +23,6 @@ from snack import * from constants import * from textw.constants_text import * -from textw.add_drive_text import addDriveDialog from text import WaitWindow, OkCancelWindow, ProgressWindow, PassphraseEntryWindow, stepToClasses from flags import flags import sys @@ -92,11 +91,11 @@ class RescueInterface(InstallInterfaceBase): else: return OkCancelWindow(self.screen, title, text) - def enableNetwork(self, anaconda): - if len(anaconda.network.netdevices) == 0: + def enableNetwork(self): + if len(network.getDevices()) == 0: return False from textw.netconfig_text import NetworkConfiguratorText - w = NetworkConfiguratorText(self.screen, anaconda) + w = NetworkConfiguratorText(self.screen, self) ret = w.run() return ret != INSTALL_BACK @@ -115,9 +114,6 @@ class RescueInterface(InstallInterfaceBase): def resume(self): pass - def run(self, anaconda): - self.anaconda = anaconda - def __init__(self): InstallInterfaceBase.__init__(self) self.screen = SnackScreen() @@ -171,18 +167,6 @@ def makeResolvConf(instPath): f.write(buf) f.close() -# -# Write out something useful for networking and start interfaces -# -def startNetworking(network, intf): - # do lo first - if os.system("/usr/sbin/ifconfig lo 127.0.0.1"): - log.error("Error trying to start lo in rescue.py::startNetworking()") - - # start up dhcp interfaces first - if not network.bringUp(): - log.error("Error bringing up network interfaces") - def runShell(screen = None, msg=""): if screen: screen.suspend() @@ -204,7 +188,7 @@ def runShell(screen = None, msg=""): if os.path.exists("/usr/bin/firstaidkit-qs"): proc = subprocess.Popen(["/usr/bin/firstaidkit-qs"]) proc.wait() - + if proc is None or proc.returncode!=0: if os.path.exists("/bin/bash"): iutil.execConsole() @@ -215,7 +199,9 @@ def runShell(screen = None, msg=""): if screen: screen.finish() -def doRescue(anaconda): +def doRescue(rescue_mount, ksdata, platform): + import storage + for file in [ "services", "protocols", "group", "joe", "man.config", "nsswitch.conf", "selinux", "mke2fs.conf" ]: try: @@ -223,107 +209,82 @@ def doRescue(anaconda): except OSError: pass + intf = RescueInterface() + # see if they would like networking enabled if not network.hasActiveNetDev(): + rc = ButtonChoiceWindow(intf.screen, _("Setup Networking"), + _("Do you want to start the network interfaces on " + "this system?"), [_("Yes"), _("No")]) - while True: - rc = ButtonChoiceWindow(anaconda.intf.screen, _("Setup Networking"), - _("Do you want to start the network interfaces on " - "this system?"), [_("Yes"), _("No")]) - - if rc != _("No").lower(): - 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.network, anaconda.intf) - break - else: - break - - # shutdown the interface now - anaconda.intf.shutdown() - anaconda.intf = None + if rc != _("No").lower(): + if not intf.enableNetwork(): + intf.messageWindow(_("No Network Available"), + _("Unable to activate a networking device. Networking " + "will not be available in rescue mode.")) # Early shell access with no disk access attempts - if not anaconda.rescue_mount: + if not 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.ksdata and anaconda.ksdata.scripts: + if flags.automatedInstall and ksdata.scripts: from kickstart import runPostScripts - runPostScripts(anaconda.ksdata.scripts) + runPostScripts(ksdata.scripts) else: runShell() sys.exit(0) - anaconda.intf = RescueInterface() - - if anaconda.ksdata: - if anaconda.ksdata.rescue and anaconda.ksdata.rescue.romount: - readOnly = 1 - else: - readOnly = 0 + if flags.automatedInstall: + readOnly = ksdata.rescue.romount 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(anaconda.intf.screen, _("Rescue"), + rc = ButtonChoiceWindow(intf.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") % (ROOT_PATH,), - [_("Continue"), _("Read-Only"), _("Skip"), _("Advanced")] ) + [_("Continue"), _("Read-Only"), _("Skip")] ) if rc == _("Skip").lower(): - runShell(anaconda.intf.screen) + runShell(intf.screen) sys.exit(0) - elif rc == _("Advanced").lower(): - addDialog = addDriveDialog(anaconda) - addDialog.addDriveDialog(anaconda.intf.screen) - continue - elif rc == _("Read-Only").lower(): - readOnly = 1 else: - readOnly = 0 - break + readOnly = rc == _("Read-Only").lower() - import storage - storage.storageInitialize(anaconda) + break - (disks, notUpgradable) = storage.findExistingRootDevices(anaconda, upgradeany=True) + sto = storage.Storage(ksdata, platform) + storage.storageInitialize(sto, ksdata, []) + roots = storage.findExistingInstallations(sto.devicetree) - if not disks: + if not roots: root = None - elif (len(disks) == 1) or anaconda.ksdata: - root = disks[0] + elif len(roots) == 1 or ksdata.upgrade.upgrade: + root = roots[0] else: - height = min (len (disks), 12) + height = min (len (roots), 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)) + lst = [] + for root in roots: + lst.append("%s" % root.name) (button, choice) = \ - ListboxChoiceWindow(anaconda.intf.screen, _("System to Rescue"), + ListboxChoiceWindow(intf.screen, _("System to Rescue"), _("Which device holds the root partition " - "of your installation?"), devList, + "of your installation?"), lst, [ _("OK"), _("Exit") ], width = 30, scroll = scroll, height = height, help = "multipleroot") @@ -331,15 +292,15 @@ def doRescue(anaconda): if button == _("Exit").lower(): root = None else: - root = disks[choice] + root = roots[choice] - rootmounted = 0 + rootmounted = False if root: try: # TODO: add a callback to warn about dirty filesystems - rc = mountExistingSystem(anaconda.storage.fsset, root, - allowDirty = 1, + rc = mountExistingSystem(sto.fsset, root.device, + allowDirty = True, readOnly = readOnly) if not flags.imageInstall: @@ -350,20 +311,20 @@ def doRescue(anaconda): "when you are finished.") % ANACONDA_CLEANUP if rc == -1: - if anaconda.ksdata: + if flags.automatedInstall: log.error("System had dirty file systems which you chose not to mount") else: - ButtonChoiceWindow(anaconda.intf.screen, _("Rescue"), + ButtonChoiceWindow(intf.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. %s") % msg, [_("OK")], width = 50) - rootmounted = 0 + rootmounted = False else: - if anaconda.ksdata: + if flags.automatedInstall: log.info("System has been mounted under: %s" % ROOT_PATH) else: - ButtonChoiceWindow(anaconda.intf.screen, _("Rescue"), + ButtonChoiceWindow(intf.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" @@ -371,12 +332,12 @@ def doRescue(anaconda): {'rootPath': ROOT_PATH, 'msg': msg}, [_("OK")] ) - rootmounted = 1 + rootmounted = True # now turn on swap if not readOnly: try: - anaconda.storage.turnOnSwap() + sto.turnOnSwap() except StorageError: log.error("Error enabling swap") @@ -424,7 +385,7 @@ def doRescue(anaconda): raise except Exception as e: log.error("doRescue caught exception: %s" % e) - if anaconda.ksdata: + if flags.automatedInstall: log.error("An error occurred trying to mount some or all of your system") else: if not flags.imageInstall: @@ -434,16 +395,15 @@ def doRescue(anaconda): msg = _("Run %s to unmount the system " "when you are finished.") % ANACONDA_CLEANUP - ButtonChoiceWindow(anaconda.intf.screen, _("Rescue"), + ButtonChoiceWindow(intf.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.") % ROOT_PATH + msg, [_("OK")] ) else: - if anaconda.ksdata and \ - anaconda.ksdata.reboot.action in [KS_REBOOT, KS_SHUTDOWN]: + if flags.automatedInstall and ksdata.reboot.action in [KS_REBOOT, KS_SHUTDOWN]: log.info("No Linux partitions found") - anaconda.intf.screen.finish() + intf.screen.finish() print(_("You don't have any Linux partitions. Rebooting.\n")) sys.exit(0) else: @@ -452,7 +412,7 @@ def doRescue(anaconda): "from the shell.") else: msg = "" - ButtonChoiceWindow(anaconda.intf.screen, _("Rescue Mode"), + ButtonChoiceWindow(intf.screen, _("Rescue Mode"), _("You don't have any Linux partitions. Press " "return to get a shell.%s") % msg, [ _("OK") ], width = 50) @@ -460,28 +420,27 @@ def doRescue(anaconda): msgStr = "" if rootmounted and not readOnly: - anaconda.storage.makeMtab() + sto.makeMtab() try: makeResolvConf(ROOT_PATH) except (OSError, IOError) as e: log.error("error making a resolv.conf: %s" %(e,)) msgStr = _("Your system is mounted under the %s directory.") % (ROOT_PATH,) - ButtonChoiceWindow(anaconda.intf.screen, _("Rescue"), msgStr, [_("OK")] ) + ButtonChoiceWindow(intf.screen, _("Rescue"), msgStr, [_("OK")] ) # we do not need ncurses anymore, shut them down - anaconda.intf.shutdown() + intf.shutdown() #create /etc/fstab in ramdisk, so it is easier to work with RO mounted filesystems makeFStab() # run %post if we've mounted everything - if rootmounted and not readOnly and anaconda.ksdata: + if rootmounted and not readOnly and flags.automatedInstall: from kickstart import runPostScripts - runPostScripts(anaconda.ksdata.scripts) + runPostScripts(ksdata.scripts) # start shell if reboot wasn't requested - if not anaconda.ksdata or \ - not anaconda.ksdata.reboot.action in [KS_REBOOT, KS_SHUTDOWN]: + if not flags.automatedInstall or not ksdata.reboot.action in [KS_REBOOT, KS_SHUTDOWN]: runShell(msg=msgStr) sys.exit(0) |