#######################################################################
# produce error message and if $2 is empty run (debug) shell
error() {
echo -e "An error occured during execution of $0 script:\n\n$1\n"
if [ -n "$2" ] ; then
echo -e "This error is not fatal - continuing ...\n"
else
echo -e "Running shell for debugging purposes now ...\n"
/bin/sh
fi
}
msg() {
echo -e "$1 info: $2"
}
#######################################################################
# micro sleep - simply loop and delete 1 from the first argument gotten
# until zero
usleep () {
local count=`expr $1 \* 10`
while [ $count -gt 0 ] ; do count=`expr $count \- 1` ; done
return 0
}
#######################################################################
# load a certain module - name of module with path in argument one, the
# error message in second argument
loadmod() {
local modpath=$1
local module=`echo $modpath|sed -e "s,.*/,,"`
local msg=$2
if [ -f $modpath ] ; then
module=${module%.*}
modprobe ${MODPRV} ${module#*.} || \
echo "Failed to load module '$module'. $msg"
fi
}
#######################################################################
# compute prefix bit number from netmask
nm2pref() {
set `IFS="."; echo $1`
local n=0
for i in $1 $2 $3 $4 ; do
case $i in
0) break ;;
128) n=`expr $n + 1` ; break ;;
192) n=`expr $n + 1` ; break ;;
224) n=`expr $n + 3` ; break ;;
240) n=`expr $n + 4` ; break ;;
252) n=`expr $n + 6` ; break ;;
254) n=`expr $n + 7` ; break ;;
255) n=`expr $n + 8` ; continue ;;
esac
done
echo $n
}
#######################################################################
# configure IP address statically - first argument the ip address,
# second the netmask, then gateway and broadcast address and last
# interface. All arguments have to be given.
ipsetup () {
local ip=$1
local nm=$2
local gw=$3
local bc=$4
local if=$5
for ipcfg in ip ipconfig ifconfig none; do
test -x /bin/$ipcfg && break;
done
case $ipcfg in
ip)
ip link set dev $if up
ip addr add $ip/`nm2pref $nm` broadcast $bc dev $if
if [ "$gw" != "0.0.0.0" ] ; then
ip route add default via $gw
fi
;;
ipconfig)
# fixme: to be checked
ipconfig $ip::$gw:$nm:$if:none
;;
ifconfig)
ifconfig $if $ip netmask $nm broadcast $bc
if [ "$gw" != "0.0.0.0" ] ; then
route add default gw $gw
fi
;;
none)
error " No tool for local IP configuration found. You should at \
least add\n one of the following programs to your ramdisk: ip \
ipconfig\n ifconfig."
;;
esac
}
#######################################################################
# nfs mounter
nfsmnt()
{
local nfsroot=$1
errmsg="Mount of root filesystem via NFS was requested via kernel command \
line\nbut failed. There might be the following reasons for that:\n\
* No nfs.ko module could be loaded and no NFS support was present in the\n\
running kernel - see error messages above\n\
* You tried to mount from wrong server or path ($nfsroot)\n\
* No NFS server is running or you do not have permissions"
for mnt in nfsmount mount none; do
test -x /bin/$mnt && break;
done
loadmod /lib/modules/@@@KERNVER@@@/kernel/fs/nfs/nfs.ko \
"needed for mounting rootfs"
case $mnt in
nfsmount)
nfsmount -o ro $nfsroot /mnt || error $errmsg
;;
mount)
portmap || error " Portmapper should be present, if normal mount \
command is used. Please\n check your initial ramdisk setup (mkdxsinitrd)."
mount -n -t nfs -o ro $nfsroot /mnt || error $errmsg
killall -9 portmap
;;
none)
error " No suitable mount tool found."
;;
esac
}
#######################################################################
# create configuration file for dhclient
mkdhclconf() {
local vci=$1
# provide dhclient with proper configuration
echo -e "option bootlocal-script code 221\t= string;\n\
option language code 222\t\t= string;\n\
option start-x code 223\t\t\t= string;\n\
option start-snmp code 224\t\t= string;\n\
option start-sshd code 225\t\t= string;\n\
option start-xdmcp code 226\t\t= string;\n\
option start-cron code 227\t\t= string;\n\
option crontab-entries code 228\t\t= string;\n\
option start-rwhod code 229\t\t= string;\n\
option start-printdaemon code 230\t= string;\n\
option desktop-session code 231\t\t= string;\n\
option tex-enable code 232\t\t= string;\n\
option netbios-workgroup code 233\t= string;\n\
option vmware code 234\t\t\t= string;\n\
option hw-mouse code 252\t\t= string;\n\
option hw-graphic code 253\t\t= string;\n\
option hw-monitor code 254\t\t= string;\n\n\
send dhcp-lease-time 86400;\nsend dhcp-max-message-size 1400;\n\
request;\nscript \"/sbin/dhclient-script\";" >> /etc/dhclient.conf
if [ -n "$vci" ] ; then
echo "send vendor-class-identifier \"$vci\";" >> /etc/dhclient.conf
fi
}
#######################################################################
# dhcp client
rundhcp()
{
local commonerr=" The following problems could produce that error:\n\
* The af_packet.ko module is either not loaded nor present in kernel.\n\
* No network device is present - either no module matching the hardware\n\
was loaded nor present in kernel.\n You might want to run 'lsmod'."
local vci=$1
for dhcp in dhclient dhcpcd pump ipconfig none; do
test -x /bin/$dhcp && break;
done
if [ "$dhcp" = "none" ] ; then
error " You tried to configure system via dhcp, but no usable dhcp\n\
client could be found. Please check that you have some client from\n\
the following list installed: dhclient dhcpcd pump ipconfig." nonfatal
else
# ensure the interface is up
ipsetup 0.0.0.0 255.255.255.255 0.0.0.0 255.255.255.255 eth0 &
loadmod /lib/modules/@@@KERNVER@@@/kernel/net/packet/af_packet.ko \
"needed for dhcp";
echo "Starting $dhcp for configuration"
mkdir /var/lib/dhcp 2>&1 >/dev/null
fi
export client="$dhcp"
case $dhcp in
dhclient)
mkdhclconf $vci
ln -s /bin/dhcpmkconfig /sbin/dhclient-script
dhclient -q -lf /var/lib/dhcp/dhclient.leases eth0 2>&1 >/dev/null || \
error " Fatal error occured while trying to run dhclient.\n$commonerr"
;;
dhcpcd)
ln -s /bin/dhcpmkconfig /sbin/dhcpd.exe
dhcpcd -L /var/lib/dhcp -c /sbin/dhcpd.exe -T -t 30 eth0 2>&1 >/dev/null || \
error " Fatal error occured while trying to run dhcpcd.\n$commonerr"
;;
pump)
error " Config via pump not implemented yet.\n$commonerr"
;;
ipconfig)
error " Config via ipconfig (from klibc) not implemented yet.\n\
$commonerr"
;;
*)
;;
esac
echo "finished" > /tmp/dhcp-done
}
#######################################################################
# function for creating directories after testing of their existance
# avoids to recreate directories in union mounts
testmkd () {
test -d $1 || mkdir -p $1 &>/dev/null
}
#######################################################################
# simple basename replacement
basename () {
local b=${1##*/}
echo ${b%$2}
}
#######################################################################
# simple string in string search
strinstr (){
case "$2" in *$1*) return 0;; esac
return 1
}
#######################################################################
# simple string in file search
#strinfile (){
#local line
#while read < $2 line; do
# case "${line}" in *$1*) return 0;; esac
#done
#return 1
#}
strinfile(){
case "$(cat $2)" in *$1*) return 0;; esac
return 1
}
#######################################################################
# Check boot commandline for specified option
inkernelcmdline (){
strinstr " $1" "${KCMDLINE}"
return "$?"
}
#######################################################################
# wait for a file to appear and stop after maxwait counts
waitfor () {
local file=$1
local maxwait=$2
local count=0
while [ ! -f $file ] ; do
echo "waiting ........." > /dev/null
count=`expr $count + 1`
[ $count -gt $maxwait ] && return 1
done
return 0
}
#######################################################################
# search for ldconfig and execute it
# check that /mnt/etc/ld.so.conf is never lost
ldconfig () {
local cachefile="$1"
for ldcfg in /mnt/sbin/ldconfig \
/mnt/bin/ldconfig \
/mnt/usr/sbin/ldconfig; do
test -x $ldcfg && {
$ldcfg -r /mnt -C $cachefile; break; }
done
#/mnt/sbin/ldconfig -r /mnt -C $cachefile
echo "finished" > /tmp/ldcfg
}
#######################################################################
# configuration via ldap
ldapconf () {
local ldapserver=$1
error " The configuration via ldap is not implemented yet."
echo "not implemented" > /tmp/ldap-done
}
#######################################################################
# localization simply derived from $language variable set in
# machine-setup or other sources - mostly taken from knoppix
localization () {
country=$1
CONSOLE_FONT="lat9w-16.psfu"
case "$country" in
# German version
de*)
COUNTRY="de"
LANG="de_DE@euro"
KEYTABLE="de-latin1-nodeadkeys"
XKEYBOARD="de"
KDEKEYBOARD="de"
CHARSET="iso8859-15"
KDEKEYBOARDS="us,fr"
TZ="Europe/Berlin"
;;
# Belgian version
be*)
COUNTRY="be"
LANG="C"
KEYTABLE="be2-latin1"
XKEYBOARD="be"
KDEKEYBOARD="be"
CHARSET="iso8859-15"
KDEKEYBOARDS="us,de,fr"
TZ="Europe/Brussels"
;;
# Bulgarian version
bg*)
COUNTRY="bg"
LANG="bg_BG"
KEYTABLE="bg"
XKEYBOARD="bg"
KDEKEYBOARD="bg"
CHARSET="microsoft-cp1251"
KDEKEYBOARDS="us,de,fr"
TZ="Europe/Sofia"
;;
# Switzerland (basically de with some modifications)
ch)
LANGUAGE="de"
COUNTRY="ch"
LANG="de_CH"
KEYTABLE="sg-latin1"
XKEYBOARD="de_CH"
KDEKEYBOARD="de_CH"
CHARSET="iso8859-15"
KDEKEYBOARDS="de,us,fr"
TZ="Europe/Zurich"
;;
# Simplified Chinese
cn)
COUNTRY="cn"
LANG="zh_CN.GB2312"
KEYTABLE="us"
XKEYBOARD="us"
KDEKEYBOARD="us"
CHARSET="gb2312.1980-0"
KDEKEYBOARDS="us,de,fr"
XMODIFIERS="@im=Chinput"
TZ="Asia/Shanghai"
;;
# Czechoslovakia
cs|cz)
LANGUAGE="cs"
COUNTRY="cs"
LANG="cs_CZ"
KEYTABLE="cz-lat2"
XKEYBOARD="cs"
KDEKEYBOARD="cz"
CHARSET="iso8859-2"
KDEKEYBOARDS="us,de,fr"
TZ="Europe/Prague"
CONSOLE_FONT="iso02g"
;;
# Denmark
dk|da)
COUNTRY="dk"
LANG="da_DK"
# Workaround: "dk" broken in gettext, use da:da_DK
LANGUAGE="da:da_DK"
KEYTABLE="dk"
XKEYBOARD="dk"
KDEKEYBOARD="dk"
CHARSET="iso8859-15"
KDEKEYBOARDS="dk,de,us,fr"
TZ="Europe/Copenhagen"
;;
es)
# Spain
COUNTRY="es"
LANG="es_ES@euro"
KEYTABLE="es"
XKEYBOARD="es"
KDEKEYBOARD="es"
CHARSET="iso8859-15"
KDEKEYBOARDS="de,us,fr"
TZ="Europe/Madrid"
;;
# Finland
fi)
COUNTRY="fi"
LANG="fi_FI@euro"
KEYTABLE="fi"
XKEYBOARD="fi"
KDEKEYBOARD="fi"
CHARSET="iso8859-15"
KDEKEYBOARDS="us"
TZ="Europe/Helsinki"
;;
# France
fr*)
COUNTRY="fr"
LANG="fr_FR@euro"
KEYTABLE="fr"
XKEYBOARD="fr"
KDEKEYBOARD="fr"
CHARSET="iso8859-15"
KDEKEYBOARDS="de,us"
TZ="Europe/Paris"
;;
he|il)
# Hebrew version
LANGUAGE="he"
COUNTRY="il"
LANG="he_IL"
KEYTABLE="us"
XKEYBOARD="us"
KDEKEYBOARD="il"
CHARSET="iso8859-8"
KDEKEYBOARDS="us,fr,de"
TZ="Asia/Jerusalem"
;;
# Ireland
ie)
COUNTRY="ie"
LANG="en_IE@euro"
KEYTABLE="uk"
XKEYBOARD="uk"
KDEKEYBOARD="gb"
CHARSET="iso8859-15"
KDEKEYBOARDS="us,de,es,fr,it"
TZ="Europe/Dublin"
;;
# Italy
it)
COUNTRY="it"
LANG="it_IT@euro"
KEYTABLE="it"
XKEYBOARD="it"
KDEKEYBOARD="it"
CHARSET="iso8859-15"
KDEKEYBOARDS="fr,us,de"
TZ="Europe/Rome"
;;
# Japan
ja)
COUNTRY="jp"
LANG="ja_JP"
LANGUAGE="ja"
KEYTABLE="us"
XKEYBOARD="us"
KDEKEYBOARD="us"
CHARSET="iso8859-15"
KDEKEYBOARDS="fr,us,de"
TZ="Asia/Tokyo"
;;
# The Netherlands
nl)
COUNTRY="nl"
LANG="nl_NL@euro"
KEYTABLE="us"
XKEYBOARD="us"
KDEKEYBOARD="en_US"
CHARSET="iso8859-15"
KDEKEYBOARDS="nl,de,fr"
TZ="Europe/Amsterdam"
;;
# Poland
pl)
COUNTRY="pl"
LANG="pl_PL"
KEYTABLE="pl"
XKEYBOARD="pl"
KDEKEYBOARD="pl"
CHARSET="iso8859-2"
KDEKEYBOARDS="de,us,fr"
TZ="Europe/Warsaw"
CONSOLE_FONT="iso02g"
;;
# Russia
ru)
COUNTRY="ru"
LANG="ru_RU.KOI8-R"
KEYTABLE="ru"
XKEYBOARD="ru"
KDEKEYBOARD="ru"
CHARSET="koi8-r"
CONSOLE_FONT="Cyr_a8x16"
KDEKEYBOARDS="de,us,fr"
TZ="Europe/Moscow"
;;
# Slovakia
sk)
COUNTRY="sk"
LANG="sk"
KEYTABLE="sk-qwerty"
XKEYBOARD="sk"
KDEKEYBOARD="sk"
CHARSET="iso8859-2"
KDEKEYBOARDS="us,de"
TZ="Europe/Bratislava"
CONSOLE_FONT="iso02g"
;;
# Slovenia
sl)
LANGUAGE="sl"
COUNTRY="si"
LANG="sl_SI"
KEYTABLE="slovene"
XKEYBOARD="sl"
KDEKEYBOARD="si"
CHARSET="iso8859-2"
KDEKEYBOARDS="us,de"
TZ="Europe/Ljubljana"
CONSOLE_FONT="iso02g"
;;
tr)
# Turkish version (guessed)
COUNTRY="tr"
LANG="tr_TR"
KEYTABLE="tr_q-latin5"
XKEYBOARD="tr"
KDEKEYBOARD="tr"
CHARSET="iso8859-9"
KDEKEYBOARDS="us,de,fr"
TZ="Europe/Istanbul"
;;
# Taiwan - Traditional Chinese version (thanks to Chung-Yen Chang)
tw)
COUNTRY="tw"
LANG="zh_TW.Big5"
LANGUAGE="zh_TW.Big5"
KEYTABLE="us"
XKEYBOARD="us"
KDEKEYBOARD="us"
CHARSET="iso8859-1"
KDEKEYBOARDS="us"
XMODIFIERS="@im=xcin"
TZ="Asia/Taipei"
;;
# Great Britian
uk)
COUNTRY="uk"
LANG="en_GB"
LANGUAGE="en"
KEYTABLE="uk"
XKEYBOARD="uk"
KDEKEYBOARD="gb"
CHARSET="iso8859-1"
KDEKEYBOARDS="us"
TZ="Europe/London"
;;
# US and default configuration
*)
LANGUAGE="us"
COUNTRY="us"
LANG="C"
KEYTABLE="us"
XKEYBOARD="us"
KDEKEYBOARD="us"
CHARSET="iso8859-1"
KDEKEYBOARDS="de,fr"
TZ="America/New_York"
;;
esac
}