[PATCH 06/13] Add the new Summary hub and Password TUI spokes + tools to test TUI stuff

Martin Sivak msivak at redhat.com
Wed Aug 8 08:52:44 UTC 2012


---
 pyanaconda/ui/tui/hubs/summary.py    |    5 ++
 pyanaconda/ui/tui/spokes/password.py |   47 +++++++++++++++
 pyanaconda/ui/tui/tools/run-hub.py   |    1 +
 pyanaconda/ui/tui/tools/run-spoke.py |  105 ++++++++++++++++++++++++++++++++++
 4 files changed, 158 insertions(+)
 create mode 100644 pyanaconda/ui/tui/hubs/summary.py
 create mode 100644 pyanaconda/ui/tui/spokes/password.py
 create mode 120000 pyanaconda/ui/tui/tools/run-hub.py
 create mode 100755 pyanaconda/ui/tui/tools/run-spoke.py

diff --git a/pyanaconda/ui/tui/hubs/summary.py b/pyanaconda/ui/tui/hubs/summary.py
new file mode 100644
index 0000000..9411e4a
--- /dev/null
+++ b/pyanaconda/ui/tui/hubs/summary.py
@@ -0,0 +1,5 @@
+from pyanaconda.ui.tui.hubs import TUIHub
+
+class SummaryHub(TUIHub):
+    title = "Install hub"
+    categories = ["source", "localization", "destination", "password"]
diff --git a/pyanaconda/ui/tui/spokes/password.py b/pyanaconda/ui/tui/spokes/password.py
new file mode 100644
index 0000000..db65b25
--- /dev/null
+++ b/pyanaconda/ui/tui/spokes/password.py
@@ -0,0 +1,47 @@
+from pyanaconda.ui.tui.spokes import NormalTUISpoke
+from pyanaconda.ui.tui.simpleline import TextWidget
+import getpass
+
+class PasswordSpoke(NormalTUISpoke):
+    title = "Set root password"
+    category = "password"
+
+    def __init__(self, app, ksdata, storage, payload, instclass):
+        NormalTUISpoke.__init__(self, app, ksdata, storage, payload, instclass)
+        self._password = None
+
+    @property
+    def completed(self):
+        return self._password is not None
+
+    @property
+    def status(self):
+        if self._password is None:
+            return "Password is not set."
+        else:
+            return "Password is set."
+
+    def refresh(self, args = None):
+        NormalTUISpoke.refresh(self, args)
+
+        self._window += [TextWidget("Please select new root password. You will have to type it twice."), ""]
+
+        return True
+
+    def prompt(self):
+        """Overriden prompt as password typing is special."""
+        p1 = getpass.getpass("Password: ")
+        p2 = getpass.getpass("Password (confirm): ")
+
+        if p1 != p2:
+            print "Passwords do not match!"
+        else:
+            self._password = p1
+            self.apply()
+
+        self.close()
+        #return None
+
+    def apply(self):
+        self.data.rootpw.password = self._password
+        self.data.rootpw.isCrypted = False
diff --git a/pyanaconda/ui/tui/tools/run-hub.py b/pyanaconda/ui/tui/tools/run-hub.py
new file mode 120000
index 0000000..4583bed
--- /dev/null
+++ b/pyanaconda/ui/tui/tools/run-hub.py
@@ -0,0 +1 @@
+run-spoke.py
\ No newline at end of file
diff --git a/pyanaconda/ui/tui/tools/run-spoke.py b/pyanaconda/ui/tui/tools/run-spoke.py
new file mode 100755
index 0000000..d5e9c57
--- /dev/null
+++ b/pyanaconda/ui/tui/tools/run-spoke.py
@@ -0,0 +1,105 @@
+#!/usr/bin/python
+
+import sys, os
+import os.path
+
+# Check command line arguments
+if len(sys.argv)<2:
+    print "Usage: $0 <spoke module name> [<spoke widget class>]"
+    sys.exit(1)
+
+# Logging always needs to be set up first thing, or there'll be tracebacks.
+from pyanaconda import anaconda_log
+anaconda_log.init()
+
+from pyanaconda.installclass import DefaultInstall
+from pyanaconda.storage import Storage
+from pyanaconda.threads import initThreading
+from pyanaconda.packaging.yumpayload import YumPayload
+from pyanaconda.platform import getPlatform
+from pykickstart.version import makeVersion
+from pyanaconda.ui.tui.simpleline import App
+from pyanaconda.ui.tui import YesNoDialog
+
+# Don't worry with fcoe, iscsi, dasd, any of that crud.
+from pyanaconda.flags import flags
+flags.imageInstall = True
+flags.testing = True
+
+initThreading()
+
+# Figure out the part we are about to show: hub/spoke?
+# And get the name of the module which represents it
+if os.path.basename(sys.argv[0]) == "run-spoke.py":
+    spokeModuleName = "pyanaconda.ui.tui.spokes.%s" % sys.argv[1]
+    from pyanaconda.ui.common import Spoke
+    spokeBaseClass = Spoke
+    spokeText = "spoke"
+    SpokeText = "Spoke"
+elif os.path.basename(sys.argv[0]) == "run-hub.py":
+    spokeModuleName = "pyanaconda.ui.tui.hubs.%s" % sys.argv[1]
+    from pyanaconda.ui.common import Hub
+    spokeBaseClass = Hub
+    spokeText = "hub"
+    SpokeText = "Hub"
+else:
+    print "You have to run this command as run-spoke.py or run-hub.py."
+    sys.exit(1)
+
+# Set default spoke class
+spokeClass = None
+spokeClassName = None
+
+# Load spoke specified on the command line
+# If the spoke module was specified, but the spoke class was not,
+# try to find it using class hierarchy
+try:
+    spokeClassName = sys.argv[2]
+    __import__(spokeModuleName, fromlist = [spokeClassName])
+    spokeModule = sys.modules[spokeModuleName]
+except IndexError:
+    __import__(spokeModuleName)
+    spokeModule = sys.modules[spokeModuleName]
+    for k,v in vars(spokeModule).iteritems():
+        try:
+            print k,v
+            if issubclass(v, spokeBaseClass) and v != spokeBaseClass:
+                spokeClassName = k
+                spokeClass = v
+        except TypeError:
+            pass
+
+if not spokeClass:
+    try:
+        spokeClass = getattr(spokeModule, spokeClassName)
+    except KeyError:
+        print "%s %s could not be found in %s" % (SpokeText, spokeClassName, spokeModuleName)
+        sys.exit(1)
+
+
+print "Running %s %s from %s" % (spokeText, spokeClass, spokeModule)
+
+platform = getPlatform()
+ksdata = makeVersion()
+storage = Storage(data=ksdata, platform=platform)
+storage.reset()
+instclass = DefaultInstall()
+app = App("TEST HARNESS", yes_or_no_question = YesNoDialog)
+
+payload = YumPayload(ksdata)
+payload.setup(storage)
+payload.install_log = sys.stdout
+
+spoke = spokeClass(app, ksdata, storage, payload, instclass)
+
+if not spoke.showable:
+    print "This %s is not showable, but I'll continue anyway." % spokeText
+
+app.schedule_screen(spoke)
+app.run()
+
+if hasattr(spoke, "status"):
+    print "%s status:\n%s\n" % (SpokeText, spoke.status)
+if hasattr(spoke, "completed"):
+    print "%s completed:\n%s\n" % (SpokeText, spoke.completed)
+print "%s kickstart fragment:\n%s" % (SpokeText, ksdata)
-- 
1.7.10.4



More information about the anaconda-patches mailing list