]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
Add first pass of keyboard/console font setup
authorJeremy Katz <katzj@redhat.com>
Mon, 5 Jan 2009 19:40:34 +0000 (14:40 -0500)
committerJeremy Katz <katzj@redhat.com>
Mon, 5 Jan 2009 19:40:34 +0000 (14:40 -0500)
First pass of keyboard/console font setup.  This ends up being Fedora/RHEL
specific as everyone specifies these things in a different place

TODO
dracut
dracut-functions

diff --git a/TODO b/TODO
index a8b6e8a12f5dd6a1ad4fb1cadfd837e0063d0965..a59c869fce678a721b01353a710900ce774d086f 100644 (file)
--- a/TODO
+++ b/TODO
@@ -31,7 +31,9 @@ for us appropriately
 * mdraid
 * dmraid
 * multipath
-* Should SELinux policy be done in the initramfs or from the real rootfs?
+* Should SELinux policy be done in the initramfs or from the real
+rootfs?
+* Keyboard layout/consolefont setup is Fedora/RHEL-specific.  
 
 
 GENERATOR TODO
diff --git a/dracut b/dracut
index c974fb49f0032332c8cffa895bc22b7ec51d8d6e..2fb060b25d290dd68bd262de1d722926111a5e4a 100755 (executable)
--- a/dracut
+++ b/dracut
@@ -72,7 +72,7 @@ cryptexe="/sbin/cryptsetup"
 # and some things that are nice for debugging
 debugexe="/bin/ls /bin/cat /bin/ln /bin/ps /bin/grep /bin/more"
 # udev things we care about
-udevexe="/lib/udev/vol_id"
+udevexe="/lib/udev/vol_id /lib/udev/console_init"
 
 # install base files
 for binary in $exe $debugexe $udevexe $lvmexe $cryptexe ; do
@@ -83,13 +83,67 @@ done
 # ultimately, /lib/initramfs/rules.d or somesuch which includes links/copies
 # of the rules we want so that we just copy those in would be best
 mkdir -p $initdir/lib/udev/rules.d
-for rule in /lib/udev/rules.d/40-redhat* /lib/udev/rules.d/50* /lib/udev/rules.d/60-persistent-storage.rules /lib/udev/rules.d/61*edd* /lib/udev/rules.d/64* /lib/udev/rules.d/80* /lib/udev/rules.d/95* $rulesdir/*.rules ; do
+for rule in /lib/udev/rules.d/10-console* /lib/udev/rules.d/40-redhat* /lib/udev/rules.d/50* /lib/udev/rules.d/60-persistent-storage.rules /lib/udev/rules.d/61*edd* /lib/udev/rules.d/64* /lib/udev/rules.d/80* /lib/udev/rules.d/95* $rulesdir/*.rules ; do
   cp $rule $initdir/lib/udev/rules.d
 done
 
 # terminfo bits make things work better if you fall into interactive mode
 for f in $(find /lib/terminfo -type f) ; do cp  --parents $f "$initdir" ; done
 
+# FIXME: i18n stuff isn't really distro-independent :/
+if [ -f /etc/sysconfig/keyboard ] || [ -f /etc/sysconfig/console/default.kmap ]; then
+    if [ -f /etc/sysconfig/console/default.kmap ]; then
+        KEYMAP=/etc/sysconfig/console/default.kmap
+    else
+        . /etc/sysconfig/keyboard
+        if [ -n "$KEYTABLE" -a -d "/lib/kbd/keymaps" ]; then
+            KEYMAP="$KEYTABLE.map"
+        fi
+    fi
+    if [ -n "$KEYMAP" ]; then
+        [ -f /etc/sysconfig/keyboard ] && inst /etc/sysconfig/keyboard "$initdir"
+        inst /bin/loadkeys "$initdir"
+        findkeymap $KEYMAP
+
+        for FN in $KEYMAPS; do
+            inst $FN "$initdir"
+            case "$FN" in
+                *.gz)
+                    gzip -d "$initdir$FN"
+                    ;;
+                *.bz2)
+                    bzip2 -d "$initdir$FN"
+                    ;;
+            esac
+        done
+    fi
+fi
+
+if [ -f /etc/sysconfig/i18n ]; then
+    . /etc/sysconfig/i18n
+    inst /etc/sysconfig/i18n "$initdir"
+    [ -z "$SYSFONT" ] && SYSFONT=latarcyrheb-sun16
+    inst /bin/setfont "$initdir"
+
+    for FN in /lib/kbd/consolefonts/$SYSFONT.* ; do
+        inst $FN "$initdir"
+        case "$FN" in
+            *.gz)
+                gzip -d "$MNTIMAGE$FN"
+                ;;
+            *.bz2)
+                bzip2 -d "$MNTIMAGE$FN"
+                ;;
+        esac
+    done
+    if [ -n "$SYSFONTACM" ]; then
+        inst /lib/kbd/consoletrans/$SYSFONTACM "$initdir"
+    fi
+    if [ -n "$UNIMAP" ]; then
+        inst /lib/kbd/unimaps/$UNIMAP "$initdir"
+    fi
+fi
+
 # install our files
 cp $initfile $initdir/init
 cp $switchroot $initdir/sbin/switch_root
index 6c3e0340579b3530ec5c8e3642def66a3f2ce755..2e9250f9b742917f33eba6d52e215ba0b27549bf 100755 (executable)
@@ -290,6 +290,39 @@ resdeps () {
     resolved="$items"
 }
 
+findkeymap () {
+    local MAP=$1
+
+    if [ ! -f "$MAP" ]; then
+        MAP=$(find /lib/kbd/keymaps -type f -name $MAP -o -name $MAP.\* | head -n1)
+    fi
+
+    case " $KEYMAPS " in
+        *" $MAP "*)
+            return
+            ;;
+    esac
+
+    KEYMAPS="$KEYMAPS $MAP"
+
+    case $MAP in
+        *.gz)
+            cmd=zgrep
+            ;;
+        *.bz2)
+            cmd=bzgrep
+            ;;
+        *)
+            cmd=grep
+            ;;
+    esac
+
+    for INCL in $($cmd "^include " $MAP | cut -d' ' -f2 | tr -d '"'); do
+        for FN in $(find /lib/kbd/keymaps -type f -name $INCL\*); do
+            findkeymap $FN
+        done
+    done
+}
 
 
 # vim:ts=8:sw=4:sts=4:et