Source code for pykickstart.commands.keyboard

#
# Chris Lumens <clumens@redhat.com>
#
# Copyright 2005, 2006, 2007 Red Hat, Inc.
#
# This copyrighted material is made available to anyone wishing to use, modify,
# copy, or redistribute it subject to the terms and conditions of the GNU
# General Public License v.2.  This program is distributed in the hope that it
# will be useful, but WITHOUT ANY WARRANTY expressed or implied, including the
# implied warranties of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc., 51
# Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  Any Red Hat
# trademarks that are incorporated in the source code or documentation are not
# subject to the GNU General Public License and may only be used or replicated
# with the express permission of Red Hat, Inc.
#
from textwrap import dedent
from pykickstart.base import KickstartCommand
from pykickstart.version import FC3, F18, versionToLongString
from pykickstart.errors import KickstartParseError
from pykickstart.options import KSOptionParser, commaSplit

from pykickstart.i18n import _


[docs] class FC3_Keyboard(KickstartCommand): removedKeywords = KickstartCommand.removedKeywords removedAttrs = KickstartCommand.removedAttrs def __init__(self, writePriority=0, *args, **kwargs): KickstartCommand.__init__(self, writePriority, *args, **kwargs) self.op = self._getParser() self.keyboard = kwargs.get("keyboard", "") def __str__(self): retval = KickstartCommand.__str__(self) if self.keyboard: retval += "# System keyboard\nkeyboard %s\n" % self.keyboard return retval def _getParser(self): op = KSOptionParser(prog="keyboard", description=""" This required command sets system keyboard type.""", version=FC3) op.add_argument("kbd", nargs='*', help="Keyboard type", version=FC3) return op
[docs] def parse(self, args): (_ns, extra) = self.op.parse_known_args(args=args, lineno=self.lineno) if len(_ns.kbd) != 1: raise KickstartParseError(_("Kickstart command %s requires one argument") % "keyboard", lineno=self.lineno) elif extra: mapping = {"command": "keyboard", "options": extra} raise KickstartParseError(_("Unexpected arguments to %(command)s command: %(options)s") % mapping, lineno=self.lineno) self.keyboard = _ns.kbd[0] return self
[docs] class F18_Keyboard(FC3_Keyboard): def __init__(self, writePriority=0, *args, **kwargs): # pylint: disable=super-init-not-called KickstartCommand.__init__(self, writePriority, *args, **kwargs) # pylint: disable=non-parent-init-called self.op = self._getParser() self._keyboard = kwargs.get("_keyboard", "") self.vc_keymap = kwargs.get("vc_keymap", "") self.x_layouts = kwargs.get("x_layouts", []) self.switch_options = kwargs.get("switch_options", []) def __str__(self): if not any((self._keyboard, self.x_layouts, self.vc_keymap)): return "" retval = "# Keyboard layouts\n" if not self.vc_keymap and not self.x_layouts: retval += "keyboard '%s'\n" % self._keyboard return retval 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 if self.switch_options: switch_str = "'%s'" % self.switch_options[0] for opt in self.switch_options[1:]: switch_str += ",'%s'" % opt retval += " --switch=%s" % switch_str return retval def _getParser(self): op = FC3_Keyboard._getParser(self) op.description += dedent(""" .. versionchanged:: %s See the documentation of ``--vckeymap`` option and the tip at the end of this section for a guide how to get values accepted by this command. Either ``--vckeymap`` or ``--xlayouts`` must be used. Alternatively, use the older format, ``arg``, which is still supported. ``arg`` can be an X layout or VConsole keymap name. Missing values will be automatically converted from the given one(s). """ % versionToLongString(F18)) op.add_argument("--vckeymap", dest="vc_keymap", default="", help=""" Specify VConsole keymap that should be used. is a keymap name which is the same as the filename under ``/usr/lib/kbd/keymaps/`` without the ``.map.gz`` extension. """, version=F18) op.add_argument("--xlayouts", dest="x_layouts", type=commaSplit, version=F18, help=""" Specify a list of X layouts that should be used (comma-separated list without spaces). Accepts the same values as ``setxkbmap(1)``, but uses either the layout format (such as cz) or the 'layout (variant)' format (such as 'cz (qwerty)'). For example:: ``keyboard --xlayouts=cz,'cz (qwerty)'`""") op.add_argument("--switch", dest="switch_options", type=commaSplit, version=F18, help=""" Specify a list of layout switching options that should be used (comma-separated list without spaces). Accepts the same values as ``setxkbmap(1)`` for layout switching. For example:: ``keyboard --xlayouts=cz,'cz (qwerty)' --switch=grp:alt_shift_toggle`` """) op.epilog = dedent(""" *If you know only the description of the layout (e.g. Czech (qwerty)), you can use http://vpodzime.fedorapeople.org/layouts_list.py to list all available layouts and find the one you want to use. The string in square brackets is the valid layout specification as Anaconda accepts it. The same goes for switching options and http://vpodzime.fedorapeople.org/switching_list.py*""") return op
[docs] def parse(self, args): (ns, extra) = self.op.parse_known_args(args=args, lineno=self.lineno) self.set_to_self(ns) if len(ns.kbd) > 1: message = _("A single argument is expected for the %s command") % "keyboard" raise KickstartParseError(message, lineno=self.lineno) elif extra: mapping = {"command": "keyboard", "options": extra} raise KickstartParseError(_("Unexpected arguments to %(command)s command: %(options)s") % mapping, lineno=self.lineno) elif not any([ns.kbd, self.vc_keymap, self.x_layouts]): message = _("One of --xlayouts, --vckeymap options with value(s) " "or argument is expected for the keyboard command") raise KickstartParseError(message, lineno=self.lineno) if ns.kbd: self._keyboard = ns.kbd[0] return self
# property for backwards compatibility # pylint: disable=method-hidden @property def keyboard(self): if self.x_layouts: return self._keyboard or self.vc_keymap or self.x_layouts[0] else: return self._keyboard or self.vc_keymap or "" # pylint: disable=function-redefined,no-member @keyboard.setter def keyboard(self, value): self._keyboard = value