[RFC] Generic I18N module - install script

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello everyone,

I'd like to present a draft of install script of new generic i18n
module.


~ Abstract ~

Different distros have variables holding keyboard settings, fonts and so
in different files and even under different names.  Sometimes it's
“SYSFONT” in /etc/sysconfig/i18n, sometimes it's “consolefont” in
/etc/conf.d/consolefont.  I came up with idea to hold mappings in
configuration file (dracut.conf or dracut.conf.d/«distro».conf). The
script gathers variables and prepares two “unified” files inside
Dracut overlay.

The rest of the script is quite the same as redhat-i18n but some tweaks.
Dracut uses console_init written in C included in initscripts RPM, but
I'm gonna rewrite it in bash and then i18n module will be fully generic.


Please post here any doubts, questions, suggestions, insults… ;-)


Cheers,
Amadeusz Żołnowski

PS. What do you think about moving inst_decompress, mksubdirs into
dracut-functions?

--
#!/bin/bash

# WE EXPECT FOLLOWING VARS
#
# ~ Keyboard ~
# KEYMAP
# UNIKEYMAP
# GRP_TOGGLE
# EXT_KEYMAPS
#
# ~ i18n ~
# UNICODE
# SYSFONT
# CONTRANS
# UNIMAP
#
# ~ Locales ~
# LANG
# LC_*
#
#
# SAMPLE MAPPINGS
# 
# ~ Fedora ~
# Keyboard: /etc/sysconfig/keyboard:KEYTABLE-KEYMAP
# i18n: /etc/sysconfig/i18n:SYSFONT,SYSFONTACM-CONTRANS,UNIMAP
#
# ~ Gentoo Base 1.0 ~
# Keyboard: /etc/conf.d/keymaps:KEYMAP,EXTENDED_KEYMAPS-EXT_KEYMAPS
# i18n: /etc/conf.d/consolefont:CONSOLEFONT-SYSFONT,CONSOLETRANSLATION-CONTRANS /etc/rc.conf:UNICODE
#
# ~ Gentoo Base 2.0 ~
# Keyboard: /etc/conf.d/keymaps:keymap-KEYMAP,extended_keymaps-EXT_KEYMAPS
# i18n: /etc/conf.d/consolefont:consolefont-SYSFONT,consoletranslation-CONTRANS /etc/rc.conf:unicode-UNICODE


KBDSUBDIRS=consolefonts,consoletrans,keymaps,unimaps
DEFAULT_SYSFONT=LatArCyrHeb-16


# Create all subdirectories for given path without creating the last element.
# $1 = path
mksubdirs() { mkdir -p ${1%/*}; }

# install function decompressing the target and handling symlinks
# $@ = list of compressed (gz or bz2) files or symlinks pointing to such files
#
# Function install targets in the same paths inside overlay but decompressed
# and without extensions (.gz, .bz2).
inst_decompress() {
    local src dst realsrc realdst cmd

    for src in $@
    do
        case ${src} in
            *.gz) cmd='gzip -d' ;;
            *.bz2) cmd='bzip2 -d' ;;
            *) return 1 ;;
        esac

        if [[ -L ${src} ]]
        then
            realsrc="$(readlink -f ${src})" # symlink target with extension
            dst="${src%.*}" # symlink without extension
            realdst="${realsrc%.*}" # symlink target without extension
            mksubdirs "${initdir}/${src}"
            # Create symlink without extension to target without extension.
            ln -s "${realdst}" "${initdir}/${dst}"
        fi

        # If the source is symlink we operate on its target.
        [[ ${realsrc} ]] && src=${realsrc}
        inst ${src}
        # Decompress with chosen tool.  We assume that tool changes name e.g.
        # from 'name.gz' to 'name'.
        ${cmd} "${initdir}${src}"
    done
}

# This is from 10redhat-i18n, not touched.
findkeymap () {
    local MAP=$1
    [[ ! -f $MAP ]] && \
    MAP=$(find ${kbddir}/keymaps -type f -name $MAP -o -name $MAP.\* | head -n1)
    [[ " $KEYMAPS " = *" $MAP "* ]] && return
    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 ${kbddir}/keymaps -type f -name $INCL\*); do
            findkeymap $FN
        done
    done
}

# Function gathers variables from distributed files among the tree, maps to
# specified names and prints the result in format "new-name=value".
#
# $@ = list in format specified below (BNF notation)
#
# <list> ::= <element> | <element> " " <list>
# <element> ::= <conf-file-name> ":" <map-list>
# <map-list> ::= <mapping> | <mapping> "," <map-list>
# <mapping> ::= <src-var> "-" <dst-var> | <src-var>
#
# We assume no whitespace are allowed between symbols.
# <conf-file-name> is a file holding <src-var> in your system.
# <src-var> is a variable holding value of meaning the same as <dst-var>.
# <dst-var> is a variable which will be set up inside initramfs.
# If <dst-var> has the same name as <src-var> we can omit <dst-var>.
#
# Hope it's clear. ;-)
#
# Example:
# /etc/conf.d/keymaps:KEYMAP,extended_keymaps-EXT_KEYMAPS
# <list> = /etc/conf.d/keymaps:KEYMAP,extended_keymaps-EXT_KEYMAPS
# <element> = /etc/conf.d/keymaps:KEYMAP,extended_keymaps-EXT_KEYMAPS
# <conf-file-name> = /etc/conf.d/keymaps
# <map-list> = KEYMAP,extended_keymaps-EXT_KEYMAPS
# <mapping> = KEYMAP
# <src-var> = KEYMAP
# <mapping> = extended_keymaps-EXT_KEYMAPS
# <src-var> = extended_keymaps
# <dst-var> = EXT_KEYMAPS
gather_vars() {
    local item map value

    for item in $@
    do
        item=(${item/:/ })
        for map in ${item[1]/,/ }
        do
            map=(${map/-/ })
            value=$(grep "^${map[0]}=" "${item[0]}")
            value=${value#*=}
            echo "${map[1]:-${map[0]}}=${value}"
        done
    done
}

# Function prints global variables in format name=value line by line.
# $@ = list of global variables' name
print_vars() {
    local var value

    for var in $@
    do
        value=$(eval echo \$$var)
        [[ ${value} ]] && echo "${var}=\"${value}\""
    done
}

install_items() {
    dracut_install setfont loadkeys
    inst ${moddir}/console_init /lib/udev/console_init
    inst_rules ${moddir}/10-console.rules
}

install_all_kbd() {
    local rel f

    for f in $(eval find ${kbddir}/{${KBDSUBDIRS}} -type f -print)
    do
        rel=${f#${kbddir}}
        rel=${rel#/}
        inst "$f" "/lib/kbd/${rel}"
    done

    # remove unnecessary files
    rm -f "${initdir}${kbddir}/consoletrans/utflist"
    find "${initdir}${kbddir}/" -name README\* -delete

    dracut_install gzip bzip2
}

install_local_keyboard() {
    local keyboard_conf="${initdir}/etc/sysconfig/keyboard"
    local map

    eval $(gather_vars ${keyboard_vars})

    # Gentoo user may have KEYMAP set to something like "-u pl2",
    KEYMAP=${KEYMAP#-* }
    EXT_KEYMAPS=${EXT_KEYMAPS:-backspace}
    # I'm not sure of the purpose of UNIKEYMAP and GRP_TOGGLE.  They were in
    # original redhat-i18n module.  Anyway it won't hurt.
    EXT_KEYMAPS+=\ ${UNIKEYMAP}\ ${GRP_TOGGLE}

    [[ ${KEYMAP} ]] || derror 'No KEYMAP.' || return 1
    findkeymap ${KEYMAP}

    for map in ${EXT_KEYMAPS}
    do
        dinfo "Adding bonus map: ${map}"
        findkeymap ${map}
    done

    inst_decompress ${KEYMAPS}

    mksubdirs ${keyboard_conf}
    print_vars KEYMAP EXT_KEYMAPS > ${keyboard_conf}
}


install_local_i18n() {
    local i18n_conf="${initdir}/etc/sysconfig/i18n"

    eval $(gather_vars ${i18n_vars})

	[[ ${SYSFONT} ]] || SYSFONT=${DEFAULT_SYSFONT}
    inst_decompress ${kbddir}/consolefonts/${SYSFONT}*

    if [[ ${CONTRANS} ]]
    then
        CONTRANS=${CONTRANS%.trans}
        inst ${kbddir}/consoletrans/${CONTRANS}.trans
    fi

    if [[ ${UNIMAP} ]]
    then
        UNIMAP=${UNIMAP%.uni}
        inst ${kbddir}/unimaps/${UNIMAP}.uni
    fi

    if [[ ${UNICODE} ]]
    then
        if [[ ${UNICODE^^} = YES || ${UNICODE} = 1 ]]
        then
            UNICODE=1
        elif [[ ${UNICODE^^} = NO || ${UNICODE} = 0 ]]
        then
            UNICODE=0
        else
            UNICODE=''
        fi
    fi
    if [[ ! ${UNICODE} && ${LANG^^} =~ .*\.UTF-?8 ]]
    then
        UNICODE=1
    fi

    mksubdirs ${i18n_conf}
    print_vars UNICODE SYSFONT CONTRANS UNIMAP > ${i18n_conf}
}


for kbddir in /usr/lib/kbd /lib/kbd /usr/share
do
    [[ -d "${kbddir}" ]] && \
    for dir in ${KBDSUBDIRS//,/ }
    do
        [[ -d "${kbddir}/${dir}" ]] && continue
        false
    done || kbddir=''
done

[[ ${kbddir} ]] || {
    derror "Directories ${KBDSUBDIRS//,/, } not found.  Please inform us about the issue including your OS name and version."
    exit 1
}

# Testing
keyboard_vars=/etc/conf.d/keymaps:KEYMAP,EXTENDED_KEYMAPS-EXT_KEYMAPS
i18n_vars=/etc/conf.d/consolefont:CONSOLEFONT-SYSFONT,CONSOLETRANSLATION-CONTRANS\ /etc/rc.conf:UNICODE

install_items

if [[ ${hostonly} ]]
then
    install_local_keyboard
    install_local_i18n
else
    install_all_kbd
fi

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux Kernel]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux