There is the RescueInterface class an instance of which should be assigned to
anaconda.intf as in both other cases -- tui and gui. Also the 'meh_interface'
and 'tty_num' properties have to added to make RescueInterface valid user
interface with exception handling support. But since RescueInterface uses snack,
it unfortunately needs a special class for exception handling interface that
shuts snack down before running textual exception handler.
---
anaconda | 8 +++++---
pyanaconda/rescue.py | 25 ++++++++++++++++++++++---
2 files changed, 27 insertions(+), 6 deletions(-)
diff --git a/anaconda b/anaconda
index 0d60c71..c6e5c92 100755
--- a/anaconda
+++ b/anaconda
@@ -959,6 +959,10 @@ if __name__ == "__main__":
# now start the interface
setupDisplay(anaconda, opts, addon_paths)
+ if anaconda.rescue:
+ from pyanaconda import rescue
+ anaconda.intf = rescue.RescueInterface()
+
# Set flag to prompt for missing ks data
if anaconda.displayMode == 'c':
flags.ksprompt = False
@@ -1004,9 +1008,7 @@ if __name__ == "__main__":
from pyanaconda.network import networkInitialize, wait_for_connecting_NM_thread
if anaconda.rescue:
- from pyanaconda.rescue import doRescue
- doRescue(anaconda.rescue_mount, ksdata)
-
+ rescue.doRescue(anaconda.intf, anaconda.rescue_mount, ksdata)
networkInitialize(ksdata)
if not flags.dirInstall:
diff --git a/pyanaconda/rescue.py b/pyanaconda/rescue.py
index c6750bf..cf3db7d 100644
--- a/pyanaconda/rescue.py
+++ b/pyanaconda/rescue.py
@@ -38,6 +38,7 @@ import re
import network
import subprocess
from pykickstart.constants import *
+import meh.ui.text
import gettext
_ = lambda x: gettext.ldgettext("anaconda", x)
@@ -97,6 +98,14 @@ class RescueInterface(InstallInterfaceBase):
w.pop()
return passphrase
+ @property
+ def meh_interface(self):
+ return self._meh_interface
+
+ @property
+ def tty_num(self):
+ return 1
+
def shutdown (self):
self.screen.finish()
@@ -109,6 +118,18 @@ class RescueInterface(InstallInterfaceBase):
def __init__(self):
InstallInterfaceBase.__init__(self)
self.screen = SnackScreen()
+ self._meh_interface = RescueExceptionHandlingIface(self.screen)
+
+class RescueExceptionHandlingIface(meh.ui.text.TextIntf):
+ def __init__(self, snack_screen, *args, **kwargs):
+ meh.ui.text.TextIntf.__init__(self, *args, **kwargs)
+ self._snack_running = True
+ self._snack_screen = snack_screen
+
+ def __getattr__(self, attr):
+ if self._snack_running:
+ self._snack_screen.finish()
+ self._snack_running = False
def makeFStab(instPath = ""):
if os.access("/proc/mounts", os.R_OK):
@@ -191,7 +212,7 @@ def runShell(screen = None, msg=""):
if screen:
screen.finish()
-def doRescue(rescue_mount, ksdata):
+def doRescue(intf, rescue_mount, ksdata):
import blivet
for file in [ "services", "protocols", "group",
"joe", "man.config",
@@ -201,8 +222,6 @@ def doRescue(rescue_mount, ksdata):
except OSError:
pass
- intf = RescueInterface()
-
# Early shell access with no disk access attempts
if not rescue_mount:
# the %post should be responsible for mounting all needed file systems
--
1.7.11.7