I tried all of the following in my kickstart file:
keyboard --vconsole=de-latin1-nodeadkyes --xlayouts='de (nodeadkyes)' de
as well as any possible combination of these. In all cases my custom f19-livecd-kde image was created with "layout=us"!!!
I have: lang en_US.utf-8 keyboard --vconsole=de-latin1-nodeadkyes --xlayouts='de (nodeadkyes)' de timezone Europe/Paris
I also looked in the official i18l-kickstarts and the anaconda/kickstart wiki - without luck.
What am I missing?
On Mon, Aug 05, 2013 at 07:57:23PM +0200, Joshua C. wrote:
I tried all of the following in my kickstart file:
keyboard --vconsole=de-latin1-nodeadkyes --xlayouts='de (nodeadkyes)' de
as well as any possible combination of these. In all cases my custom f19-livecd-kde image was created with "layout=us"!!!
I have: lang en_US.utf-8 keyboard --vconsole=de-latin1-nodeadkyes --xlayouts='de (nodeadkyes)' de timezone Europe/Paris
I also looked in the official i18l-kickstarts and the anaconda/kickstart wiki - without luck.
What am I missing?
Nothing. It doesn't work. The underlying package we used to depend on changed to use dbus, which doesn't work very well when running from inside a mock. So I kludged in a temporary fix that really only works with us. If anyone has suggestions for a general fix I'm open to suggestions.
2013/8/5 Brian C. Lane bcl@redhat.com:
On Mon, Aug 05, 2013 at 07:57:23PM +0200, Joshua C. wrote:
I tried all of the following in my kickstart file:
keyboard --vconsole=de-latin1-nodeadkyes --xlayouts='de (nodeadkyes)' de
as well as any possible combination of these. In all cases my custom f19-livecd-kde image was created with "layout=us"!!!
I have: lang en_US.utf-8 keyboard --vconsole=de-latin1-nodeadkyes --xlayouts='de (nodeadkyes)' de timezone Europe/Paris
I also looked in the official i18l-kickstarts and the anaconda/kickstart wiki - without luck.
What am I missing?
Nothing. It doesn't work. The underlying package we used to depend on changed to use dbus, which doesn't work very well when running from inside a mock. So I kludged in a temporary fix that really only works with us. If anyone has suggestions for a general fix I'm open to suggestions.
-- Brian C. Lane | Anaconda Team | IRC: bcl #anaconda | Port Orchard, WA (PST8PDT)
-- livecd mailing list livecd@lists.fedoraproject.org https://admin.fedoraproject.org/mailman/listinfo/livecd
I just switched from f17 to f19 and this is the first bad surprise to find out. Anyway, which package did the creator depend on? I can at least look at it.
On Mon, Aug 05, 2013 at 11:28:46PM +0200, Joshua C. wrote:
2013/8/5 Brian C. Lane bcl@redhat.com:
On Mon, Aug 05, 2013 at 07:57:23PM +0200, Joshua C. wrote:
I tried all of the following in my kickstart file:
keyboard --vconsole=de-latin1-nodeadkyes --xlayouts='de (nodeadkyes)' de
as well as any possible combination of these. In all cases my custom f19-livecd-kde image was created with "layout=us"!!!
I have: lang en_US.utf-8 keyboard --vconsole=de-latin1-nodeadkyes --xlayouts='de (nodeadkyes)' de timezone Europe/Paris
I also looked in the official i18l-kickstarts and the anaconda/kickstart wiki - without luck.
What am I missing?
Nothing. It doesn't work. The underlying package we used to depend on changed to use dbus, which doesn't work very well when running from inside a mock. So I kludged in a temporary fix that really only works with us. If anyone has suggestions for a general fix I'm open to suggestions.
-- Brian C. Lane | Anaconda Team | IRC: bcl #anaconda | Port Orchard, WA (PST8PDT)
-- livecd mailing list livecd@lists.fedoraproject.org https://admin.fedoraproject.org/mailman/listinfo/livecd
I just switched from f17 to f19 and this is the first bad surprise to find out. Anyway, which package did the creator depend on? I can at least look at it.
system-config-keyboard
I also see that I mis-typed that as system config kickstart in the commit message :/ (commit f674482986d701ddc21120fa8f9b0249095cdeec)
2013/8/6 Brian C. Lane bcl@redhat.com:
On Mon, Aug 05, 2013 at 11:28:46PM +0200, Joshua C. wrote:
2013/8/5 Brian C. Lane bcl@redhat.com:
On Mon, Aug 05, 2013 at 07:57:23PM +0200, Joshua C. wrote:
I tried all of the following in my kickstart file:
keyboard --vconsole=de-latin1-nodeadkyes --xlayouts='de (nodeadkyes)' de
as well as any possible combination of these. In all cases my custom f19-livecd-kde image was created with "layout=us"!!!
I have: lang en_US.utf-8 keyboard --vconsole=de-latin1-nodeadkyes --xlayouts='de (nodeadkyes)' de timezone Europe/Paris
I also looked in the official i18l-kickstarts and the anaconda/kickstart wiki - without luck.
What am I missing?
Nothing. It doesn't work. The underlying package we used to depend on changed to use dbus, which doesn't work very well when running from inside a mock. So I kludged in a temporary fix that really only works with us. If anyone has suggestions for a general fix I'm open to suggestions.
-- Brian C. Lane | Anaconda Team | IRC: bcl #anaconda | Port Orchard, WA (PST8PDT)
-- livecd mailing list livecd@lists.fedoraproject.org https://admin.fedoraproject.org/mailman/listinfo/livecd
I just switched from f17 to f19 and this is the first bad surprise to find out. Anyway, which package did the creator depend on? I can at least look at it.
system-config-keyboard
I also see that I mis-typed that as system config kickstart in the commit message :/ (commit f674482986d701ddc21120fa8f9b0249095cdeec)
-- Brian C. Lane | Anaconda Team | IRC: bcl #anaconda | Port Orchard, WA (PST8PDT)
-- livecd mailing list livecd@lists.fedoraproject.org https://admin.fedoraproject.org/mailman/listinfo/livecd
I made a simple patch to restore the missing functionality. The patch adds a modified keyboard.py file and call the appropriate functions from within livecd-creator. However for some reason the written configs aren't read during boot?!?
/etc/sysconfig/vconsole.conf has the desired settings but my keyboard still keeps the us layout.
Any ideas?
From 43716accadb8bbe63c6b3b76045dd0d5c193407c Mon Sep 17 00:00:00 2001
From: Live System User liveuser@localhost.localdomain Date: Wed, 7 Aug 2013 20:42:58 +0200 Subject: [PATCH] honor keyboard settings
--- imgcreate/keyboard_old.py | 188 ++++++++++++++++++++++++++++++++++++++++++++++ imgcreate/kickstart.py | 13 +++- 2 files changed, 197 insertions(+), 4 deletions(-) create mode 100644 imgcreate/keyboard_old.py
diff --git a/imgcreate/keyboard_old.py b/imgcreate/keyboard_old.py new file mode 100644 index 0000000..be458d9 --- /dev/null +++ b/imgcreate/keyboard_old.py @@ -0,0 +1,188 @@ +# +# keyboard_old.py - keyboard backend data object +# +# Brent Fox bfox@redhat.com +# Mike Fulbright msf@redhat.com +# Jeremy Katz katzj@redhat.com +# Lubomir Rintel lkundrak@v3.sk +# +# Copyright 2002 Red Hat, Inc. +# Copyright 2009 Lubomir Rintel +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty 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., 675 Mass Ave, Cambridge, MA 02139, USA. +# + +import dbus +import string +import os +from subprocess import call +import system_config_keyboard.keyboard_models as keyboard_models + +class Keyboard_old(): + def __init__(self): + self._mods = keyboard_models.KeyboardModels() + + self.type = "PC" + self.beenset = 0 + self.config = [] + self.loadkeys = "" + self.setxkbmap = "" + + # default to us + self.set("us") + + try: + bus = dbus.SystemBus() + hal = dbus.Interface(bus.get_object("org.freedesktop.Hal","/org/freedesktop/Hal/Manager"),"org.freedesktop.Hal.Manager") + kbs = hal.FindDeviceByCapability("input.keyboard") + if len(kbs) == 0: + self.type = "Serial" + else: + self._var ("KEYBOARDTYPE", "pc") + kb = dbus.Interface(bus.get_object("org.freedesktop.Hal", kbs[0]), 'org.freedesktop.Hal.Device') + if kb.GetPropertyString("info.product").startswith("Sun Type"): + self.type == "Sun" + self._var ("KEYBOARDTYPE", "sun") + except: + pass + + def _get_models(self): + return self._mods.get_models() + modelDict = property(_get_models) + + def _var (self, name, value = None): + found = 0 + for line in self.config: + if line[1] == name: + found = 1 + break + if not found: + line = [None, None, None] + # get or set? + if not value: + return line[2] + line[1:3] = (name, value) + line[0] = '{0}="{1}"\n'.format (name, value) + if not found: + self.config.append (line) + + def set(self, keytable): + if self.type != "Serial": + kb = self.modelDict[keytable] + self._var ("KEYTABLE", keytable) + self._var ("MODEL", kb[2]) + self._var ("LAYOUT", kb[1]) + self._var ("VARIANT", kb[3]) + self._var ("OPTIONS", kb[4]) + + def get(self): + return self._var ("KEYTABLE") + + def getKeymapName(self): + kbd = self.modelDict[self.get()] + if not kbd: + return "" + (name, layout, model, variant, options) = kbd + return name + + def __getitem__(self, item): + table = self._var ("KEYTABLE") + if not self.modelDict.has_key(table): + raise KeyError, "No such keyboard type %s" % (table,) + + kb = self.modelDict[table] + if item == "rules": + return "xorg" + elif item == "model": + return kb[2] + elif item == "layout": + return kb[1] + elif item == "variant": + return kb[3] + elif item == "options": + return kb[4] + elif item == "name": + return kb[0] + elif item == "keytable": + return table + else: + raise KeyError, item + + def read(self, instPath = "/"): + try: + file = open(instPath + "/etc/sysconfig/keyboard", "r") + except: + return + self.config = [] + while 1: + line = file.readline () + if not line: + break + (name, value) = line.rstrip("\n").split ('=') + self.config.append ([line, name, value.strip ('"'), 0]) + self.beenset = 1 + + def write(self, instPath = "/"): + file = open(instPath + "/etc/sysconfig/keyboard", "w") + for line in self.config: + file.write (line[0]); + try: + os.unlink(instPath + "/etc/sysconfig/console/default.kmap") + except: + pass + + def writeKS(self, f): + f.write("keyboard %s\n" % (self.get(),)) + + def activate(self): + # XXX do isys.loadkeys + console_kbd = self.get() + if not console_kbd: + return + + # Call loadkeys to change the console keymap + if os.access("/bin/loadkeys", os.X_OK): + command = "/bin/loadkeys" + elif os.access("/usr/bin/loadkeys", os.X_OK): + command = "/usr/bin/loadkeys" + else: + command = "/bin/loadkeys" + argv = [ command, console_kbd ] + + if os.access(argv[0], os.X_OK) == 1: + self.loadkeys = argv + + try: + kbd = self.modelDict[console_kbd] + except KeyError: + return + + if not kbd: + return + (name, layout, model, variant, options) = kbd + + # XXX set the X keyboard map even if X isn't running + + argv = [ "/usr/bin/setxkbmap", "-layout", layout ] + + # XXX setxkbmap(1) needs one -option flag for each option + if options: + argv = argv + [ "-option", options ] + + if variant: + argv = argv + [ "-variant", variant ] + + if os.access(argv[0], os.X_OK) == 1: + self.setxkbmap = argv diff --git a/imgcreate/kickstart.py b/imgcreate/kickstart.py index 1059801..46ba09d 100644 --- a/imgcreate/kickstart.py +++ b/imgcreate/kickstart.py @@ -25,10 +25,7 @@ import logging import urlgrabber import selinux
-try: - import system_config_keyboard.keyboard as keyboard -except ImportError: - import rhpl.keyboard as keyboard +import keyboard_old as keyboard
import pykickstart.commands as kscommands import pykickstart.constants as ksconstants @@ -153,6 +150,14 @@ class KeyboardConfig(KickstartConfig): f.write('FONT="%s"\n' % DEFAULT_VC_FONT) except IOError as e: logging.error("Cannot write vconsole configuration file: %s" % e) + + k = keyboard.Keyboard_old() + if kskeyboard.keyboard: + k.set(kskeyboard.keyboard) + k.write(self.instroot) + k.activate() + self.call(k.loadkeys) + self.call(k.setxkbmap)
class TimezoneConfig(KickstartConfig): """A class to apply a kickstart timezone configuration to a system."""
2013/8/7 Joshua C. joshuacov@gmail.com:
2013/8/6 Brian C. Lane bcl@redhat.com:
On Mon, Aug 05, 2013 at 11:28:46PM +0200, Joshua C. wrote:
2013/8/5 Brian C. Lane bcl@redhat.com:
On Mon, Aug 05, 2013 at 07:57:23PM +0200, Joshua C. wrote:
I tried all of the following in my kickstart file:
keyboard --vconsole=de-latin1-nodeadkyes --xlayouts='de (nodeadkyes)' de
as well as any possible combination of these. In all cases my custom f19-livecd-kde image was created with "layout=us"!!!
I have: lang en_US.utf-8 keyboard --vconsole=de-latin1-nodeadkyes --xlayouts='de (nodeadkyes)' de timezone Europe/Paris
I also looked in the official i18l-kickstarts and the anaconda/kickstart wiki - without luck.
What am I missing?
Nothing. It doesn't work. The underlying package we used to depend on changed to use dbus, which doesn't work very well when running from inside a mock. So I kludged in a temporary fix that really only works with us. If anyone has suggestions for a general fix I'm open to suggestions.
-- Brian C. Lane | Anaconda Team | IRC: bcl #anaconda | Port Orchard, WA (PST8PDT)
-- livecd mailing list livecd@lists.fedoraproject.org https://admin.fedoraproject.org/mailman/listinfo/livecd
I just switched from f17 to f19 and this is the first bad surprise to find out. Anyway, which package did the creator depend on? I can at least look at it.
system-config-keyboard
I also see that I mis-typed that as system config kickstart in the commit message :/ (commit f674482986d701ddc21120fa8f9b0249095cdeec)
-- Brian C. Lane | Anaconda Team | IRC: bcl #anaconda | Port Orchard, WA (PST8PDT)
-- livecd mailing list livecd@lists.fedoraproject.org https://admin.fedoraproject.org/mailman/listinfo/livecd
I made a simple patch to restore the missing functionality. The patch adds a modified keyboard.py file and call the appropriate functions from within livecd-creator. However for some reason the written configs aren't read during boot?!?
/etc/sysconfig/vconsole.conf has the desired settings but my keyboard still keeps the us layout.
Any ideas?
From 43716accadb8bbe63c6b3b76045dd0d5c193407c Mon Sep 17 00:00:00 2001 From: Live System User liveuser@localhost.localdomain Date: Wed, 7 Aug 2013 20:42:58 +0200 Subject: [PATCH] honor keyboard settings
imgcreate/keyboard_old.py | 188 ++++++++++++++++++++++++++++++++++++++++++++++ imgcreate/kickstart.py | 13 +++- 2 files changed, 197 insertions(+), 4 deletions(-) create mode 100644 imgcreate/keyboard_old.py
diff --git a/imgcreate/keyboard_old.py b/imgcreate/keyboard_old.py new file mode 100644 index 0000000..be458d9 --- /dev/null +++ b/imgcreate/keyboard_old.py @@ -0,0 +1,188 @@ +# +# keyboard_old.py - keyboard backend data object +# +# Brent Fox bfox@redhat.com +# Mike Fulbright msf@redhat.com +# Jeremy Katz katzj@redhat.com +# Lubomir Rintel lkundrak@v3.sk +# +# Copyright 2002 Red Hat, Inc. +# Copyright 2009 Lubomir Rintel +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty 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., 675 Mass Ave, Cambridge, MA 02139, USA. +#
+import dbus +import string +import os +from subprocess import call +import system_config_keyboard.keyboard_models as keyboard_models
+class Keyboard_old():
- def __init__(self):
self._mods = keyboard_models.KeyboardModels()
self.type = "PC"
self.beenset = 0
self.config = []
self.loadkeys = ""
self.setxkbmap = ""
# default to us
self.set("us")
try:
bus = dbus.SystemBus()
hal =
dbus.Interface(bus.get_object("org.freedesktop.Hal","/org/freedesktop/Hal/Manager"),"org.freedesktop.Hal.Manager")
kbs = hal.FindDeviceByCapability("input.keyboard")
if len(kbs) == 0:
self.type = "Serial"
else:
self._var ("KEYBOARDTYPE", "pc")
kb = dbus.Interface(bus.get_object("org.freedesktop.Hal",
kbs[0]), 'org.freedesktop.Hal.Device')
if kb.GetPropertyString("info.product").startswith("Sun Type"):
self.type == "Sun"
self._var ("KEYBOARDTYPE", "sun")
except:
pass
- def _get_models(self):
return self._mods.get_models()
- modelDict = property(_get_models)
- def _var (self, name, value = None):
found = 0
for line in self.config:
if line[1] == name:
found = 1
break
if not found:
line = [None, None, None]
# get or set?
if not value:
return line[2]
line[1:3] = (name, value)
line[0] = '{0}="{1}"\n'.format (name, value)
if not found:
self.config.append (line)
- def set(self, keytable):
if self.type != "Serial":
kb = self.modelDict[keytable]
self._var ("KEYTABLE", keytable)
self._var ("MODEL", kb[2])
self._var ("LAYOUT", kb[1])
self._var ("VARIANT", kb[3])
self._var ("OPTIONS", kb[4])
- def get(self):
return self._var ("KEYTABLE")
- def getKeymapName(self):
kbd = self.modelDict[self.get()]
if not kbd:
return ""
(name, layout, model, variant, options) = kbd
return name
- def __getitem__(self, item):
table = self._var ("KEYTABLE")
if not self.modelDict.has_key(table):
raise KeyError, "No such keyboard type %s" % (table,)
kb = self.modelDict[table]
if item == "rules":
return "xorg"
elif item == "model":
return kb[2]
elif item == "layout":
return kb[1]
elif item == "variant":
return kb[3]
elif item == "options":
return kb[4]
elif item == "name":
return kb[0]
elif item == "keytable":
return table
else:
raise KeyError, item
- def read(self, instPath = "/"):
try:
file = open(instPath + "/etc/sysconfig/keyboard", "r")
except:
return
self.config = []
while 1:
line = file.readline ()
if not line:
break
(name, value) = line.rstrip("\n").split ('=')
self.config.append ([line, name, value.strip ('"'), 0])
self.beenset = 1
- def write(self, instPath = "/"):
- file = open(instPath + "/etc/sysconfig/keyboard", "w")
- for line in self.config:
file.write (line[0]);
try:
os.unlink(instPath + "/etc/sysconfig/console/default.kmap")
except:
pass
- def writeKS(self, f):
f.write("keyboard %s\n" % (self.get(),))
- def activate(self):
# XXX do isys.loadkeys
console_kbd = self.get()
if not console_kbd:
return
# Call loadkeys to change the console keymap
if os.access("/bin/loadkeys", os.X_OK):
command = "/bin/loadkeys"
elif os.access("/usr/bin/loadkeys", os.X_OK):
command = "/usr/bin/loadkeys"
else:
command = "/bin/loadkeys"
argv = [ command, console_kbd ]
if os.access(argv[0], os.X_OK) == 1:
self.loadkeys = argv
try:
kbd = self.modelDict[console_kbd]
except KeyError:
return
if not kbd:
return
(name, layout, model, variant, options) = kbd
# XXX set the X keyboard map even if X isn't running
argv = [ "/usr/bin/setxkbmap", "-layout", layout ]
# XXX setxkbmap(1) needs one -option flag for each option
if options:
argv = argv + [ "-option", options ]
if variant:
argv = argv + [ "-variant", variant ]
if os.access(argv[0], os.X_OK) == 1:
self.setxkbmap = argv
diff --git a/imgcreate/kickstart.py b/imgcreate/kickstart.py index 1059801..46ba09d 100644 --- a/imgcreate/kickstart.py +++ b/imgcreate/kickstart.py @@ -25,10 +25,7 @@ import logging import urlgrabber import selinux
-try:
- import system_config_keyboard.keyboard as keyboard
-except ImportError:
- import rhpl.keyboard as keyboard
+import keyboard_old as keyboard
import pykickstart.commands as kscommands import pykickstart.constants as ksconstants @@ -153,6 +150,14 @@ class KeyboardConfig(KickstartConfig): f.write('FONT="%s"\n' % DEFAULT_VC_FONT) except IOError as e: logging.error("Cannot write vconsole configuration file: %s" % e)
k = keyboard.Keyboard_old()
if kskeyboard.keyboard:
k.set(kskeyboard.keyboard)
k.write(self.instroot)
k.activate()
self.call(k.loadkeys)
self.call(k.setxkbmap)
class TimezoneConfig(KickstartConfig): """A class to apply a kickstart timezone configuration to a system.""" -- 1.8.3.1
-- --joshua
I came up with a better solution. The activate() method in the above patch doesn't work in chroot because X isn't running. That's why we get an error. We can delete the method as well as the following from kickstart.py: - self.call(k.loadkeys) - self.call(k.setxkbmap)
Without these we have a configured keyboard settings written in /etc/sysconfig/keyboard. Now what we need to do is to read the file after X has started and apply the settings. My simplest solution is adding the following code to /etc/init.d/livesys (just edit the corresponding kickstart file -in my case fedora-live-base-kde.ks)
cat > /etc/X11/xinit/xinitrc.d/set-my-keyboard.sh << KEYBOARD_EOF #!/bin/bash /usr/bin/setxkbmap -layout `cat /etc/sysconfig/keyboard | grep LAYOUT | cut -d "=" -f2` KEYBOARD_EOF
This can be further refined to take into account all options written in /etc/sysconfig/keyboard. A better solution can be to implement the activate() method here. With all these our settings are applied at boot and we are not dependent on system-config-keyboard anymore.
I hope someone to refine this further.
livecd@lists.fedoraproject.org