[pykickstart] [PATCH] Change keyboard command to accept VConsole keymap and X layouts

Vratislav Podzimek vpodzime at redhat.com
Fri Oct 5 17:33:49 UTC 2012


We want to allow user specify which VConsole keymap and X layouts
they want to set on the system and during installation. Moreover,
we need to store these values during the installation and output
them in final kickstart file produced.

Signed-off-by: Vratislav Podzimek <vpodzime at redhat.com>
---
 pykickstart/commands/keyboard.py | 71 ++++++++++++++++++++++++++++++++--------
 tests/commands/keyboard.py       | 14 ++++++--
 2 files changed, 68 insertions(+), 17 deletions(-)

diff --git a/pykickstart/commands/keyboard.py b/pykickstart/commands/keyboard.py
index c5f67bc..e54bbf5 100644
--- a/pykickstart/commands/keyboard.py
+++ b/pykickstart/commands/keyboard.py
@@ -56,38 +56,81 @@ class FC3_Keyboard(KickstartCommand):
 
 class F18_Keyboard(FC3_Keyboard):
     def __init__(self, writePriority=0, *args, **kwargs):
-        FC3_Keyboard.__init__(self, writePriority, *args, **kwargs)
+        KickstartCommand.__init__(self, writePriority, *args, **kwargs)
         self.op = self._getParser()
-        self.layouts_list = kwargs.get("layouts_list", [])
+        self._keyboard = kwargs.get("keyboard", "")
+        self.vc_keymap = kwargs.get("vc_keymap", "")
+        self.x_layouts = kwargs.get("x_layouts", [])
 
     def __str__(self):
-        if not self.layouts_list:
+        if not any((self._keyboard, self.x_layouts, self.vc_keymap)):
             return ""
 
-        retval = "# Keyboard layouts\nkeyboard"
-        for layout in self.layouts_list:
-            retval += " '%s'" % layout
+        retval = "# Keyboard layouts\n"
+        if self._keyboard:
+            retval += "# old format: keyboard %s\n" % self._keyboard
+            retval += "# new format:\n"
+        retval += "keyboard" + self._getArgsAsStr() + "\n"
+
+        return retval
+
+    def _getArgsAsStr(self):
+        retval = ""
+
+        if self.vc_keymap:
+            retval += " --vckeymap=%s" % self.vc_keymap
+
+        if self.x_layouts:
+            layouts_str = "'%s'" % self.x_layouts[0]
+            for layout in self.x_layouts[1:]:
+                layouts_str += ",'%s'" % layout
+            retval += " --xlayouts=%s" % layouts_str
 
         return retval
 
+    def _getParser(self):
+        def x_layouts_callback(option, opt_str, value, parser):
+            for layout in value.split(","):
+                if layout:
+                    parser.values.ensure_value(option.dest, []).append(layout)
+
+        op = FC3_Keyboard._getParser(self)
+        op.add_option("--vckeymap", dest="vc_keymap", action="store", default="")
+        op.add_option("--xlayouts", dest="x_layouts", action="callback",
+                      callback=x_layouts_callback, nargs=1, type="string")
+
+        return op
+
     def parse(self, args):
         (opts, extra) = self.op.parse_args(args=args, lineno=self.lineno)
+        self._setToSelf(self.op, opts)
+
+        if len(extra) > 1:
+            message = _("A single argument is expected for the %s command") % \
+                        "keyboard"
+            raise KickstartValueError(formatErrorMsg(self.lineno, msg=message))
+
+        elif len(extra) == 0 and not self.vc_keymap and not self.x_layouts:
+            message = _("One of --xlayouts, --vckeymap options with value(s) "
+                        "or argument is expected for the keyboard command")
+            raise KickstartValueError(formatErrorMsg(self.lineno, msg=message))
+
+        if len(extra) > 0:
+            self._keyboard = extra[0]
 
-        if len(extra) < 1:
-            raise KickstartValueError, formatErrorMsg(self.lineno, msg=_("Kickstart command %s requires at least"\
-                                                                         "one argument") % "keyboard")
-        self.layouts_list = extra
         return self
 
+    # property for backwards compatibility
     # pylint: disable-msg=E0202
     @property
     def keyboard(self):
-        if self.layouts_list:
-            return self.layouts_list[0]
+        if self.x_layouts:
+            return self._keyboard or self.vc_keymap or self.x_layouts[0]
         else:
-            return ""
+            return self._keyboard or self.vc_keymap or ""
 
     # pylint: disable-msg=E0102,E1101
     @keyboard.setter
     def keyboard(self, value):
-        self.layouts_list = [value]
+        self._keyboard = value
+
diff --git a/tests/commands/keyboard.py b/tests/commands/keyboard.py
index a21b4d3..a847233 100644
--- a/tests/commands/keyboard.py
+++ b/tests/commands/keyboard.py
@@ -40,13 +40,21 @@ class F18_TestCase(FC3_TestCase):
     command = "keyboard"
 
     def runTest(self):
+        # pass
         self.assert_parse("keyboard us")
-
-        # we now support defining multiple layouts
-        self.assert_parse("keyboard us cz")
+        self.assert_parse("keyboard --vckeymap=us")
+        self.assert_parse("keyboard --vckeymap=us sk")
+        self.assert_parse("keyboard --xlayouts='cz (qwerty)'")
+        self.assert_parse("keyboard --xlayouts=cz,'cz (qwerty)'")
+        self.assert_parse("keyboard --xlayouts=cz sk")
+        self.assert_parse("keyboard --vckeymap=us --xlayouts=cz")
+        self.assert_parse("keyboard --vckeymap=us --xlayouts=cz,'cz (qwerty)' sk")
 
         # fail
         self.assert_parse_error("keyboard", KickstartValueError)
+        self.assert_parse_error("keyboard cz sk", KickstartValueError)
+        self.assert_parse_error("keyboard --vckeymap=us --xlayouts=cz,"
+                                "'cz (qwerty)' cz sk", KickstartValueError)
         self.assert_parse_error("keyboard --foo us", KickstartParseError)
 
 if __name__ == "__main__":
-- 
1.7.11.4



More information about the anaconda-patches mailing list