summaryrefslogtreecommitdiffstats
path: root/rescue.py
blob: 8e9f7ed10c4f8af25a43f025e79ee61593b53119 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import upgrade
from snack import *
from text import WaitWindow, OkCancelWindow
from translate import _
import raid
import os
from log import log

class RescueInterface:

    def waitWindow(self, title, text):
	return WaitWindow(self.screen, title, text)

    def messageWindow(self, title, text, type = "ok"):
	if type == "ok":
	    ButtonChoiceWindow(self.screen, _(title), _(text),
			       buttons = [ _("OK") ])
	else:
	    return OkCancelWindow(self.screen, _(title), _(text))

    def __init__(self, screen):
	self.screen = screen

def runRescue(serial):

    from fstab import NewtFstab

    fstab = None

    log.open (serial, 0, 0)

    try:
	fstab = NewtFstab(1, serial, 0, 0, None, None, None, 0, [], 0, 0,
			  requireBlockDevices = 0)
    except SystemError, text:
	print _("WARNING: no valid block devices were found.\n")
    except:
	print _("ERROR: unknown error encountered reading partition tables.\n")
	
    if not fstab:
	os.execv("/bin/sh", [ "-/bin/sh" ])

    screen = SnackScreen()
    intf = RescueInterface(screen)

    parts = upgrade.findExistingRoots(intf, fstab)

    if not parts:
	root = None
    elif len(parts) == 1:
	root = parts[0]
    else:
	height = min (len (parts), 12)
	if height == 12:
	    scroll = 1
	else:
	    scroll = 0

	partList = []
	for (drive, fs) in parts:
	    partList.append(drive)

	(button, choice) = \
	    ListboxChoiceWindow(screen, _("System to Rescue"),
				_("What partition holds the root partition "
				  "of your installation?"), partList, 
				[ _("OK"), _("Exit") ], width = 30,
				scroll = scroll, height = height,
				help = "multipleroot")

	if button == string.lower (_("Exit")):
	    root = None
	else:
	    root = parts[choice]

    rootmounted = 0
    if root:
	try:
	    upgrade.mountRootPartition(intf, root, fstab, '/mnt/sysimage', 
			       allowDirty = 1)
	    ButtonChoiceWindow(screen, _("Rescue"),
		_("Your system has been mounted under /mnt/sysimage.\n\n"
		  "Press <return> to get a shell. The system will reboot "
		  "automatically when you exit from the shell."),
		  [_("OK")] )
            rootmounted = 1
	except SystemError, msg:
	    ButtonChoiceWindow(screen, _("Rescue").
		_("An error occured trying to mount some or all of your "
		  "system. Some of it may be mounted under /mnt/sysimage.\n\n"
		  "Press <return> to get a shell. The system will reboot "
		  "automatically when you exit from the shell."),
		  [_("OK")] )
    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."),
			   [ _("Back") ], width = 50)

    screen.finish()

    for file in [ "services", "protocols", "group" ]:
       os.symlink('/mnt/runtime/etc/' + file, '/etc/' + file)

    if rootmounted:
        print
        print _("Your system is mounted under the /mnt/sysimage directory.")
        print

    os.execv("/bin/sh", [ "-/bin/sh" ])