summaryrefslogblamecommitdiffstats
path: root/initrd/initrd-stuff/etc/functions
blob: 825eff175674574c833ce6597e132073c5f10d99 (plain) (tree)
1
2
3
4
5
6
7
8
9
10



                                                                    
                                                               




                                                   
                      
 





















                                                                       
                               

                                      

       
 


                                                                       
                                                                       
                                      




                                               
                                                      
                     





                                                                    
    
                                                                    






                                                                       

                                                                       





                                                                       

                                                                       

                
                                             


























                                                                       


                                                                   





            
                                          



















                                                       




                                                                      






                                                                       
                                                                             




                                                                           
                                  

                             


                                                           







                                                                           

                      


                                           
















                                                                       
                                               






                                                                
                                                                 













                                                                            
                                                  

                              
                              

                                                                        
                                                                        
    

                                                                


                                                                       
                                         
                                     




                     

                                                                                                  


                                                                              

                                                                                








                                                                            

    




                                                                       


























                                                                       















                                                                       

                                    











                                                                       

                                           















































                                                                       


                                                                    







                                                                                                                                                



                                                                       





















































































































































































































































































                                                                    
# Description:  common function script for the configuration of
#		linux diskless clients (included by init, hwautocfg,
#		servconfig, ... within initial ramdisk) 
#
# Author(s):    Dirk von Suchodoletz <dirk@goe.net>, 07-03-2006
#		Blabla
#		Blub
#
# Copyright:    (c) 2006 - RZ Universitaet Freiburg
# 
# Version:      0.4.2a

#######################################################################
# generate events with the sysfs trigger
function trigger_device_events() {
    list=$(echo /sys/bus/*/devices/*/uevent)
    list="$list $(echo /sys/class/*/*/uevent)"
    list="$list $(echo /sys/block/*/uevent /sys/block/*/*/uevent)"
    for i in $list; do
       case "$i" in
           */device/uevent|*\**)
               continue
               ;;
           */class/mem/*|*/class/tty/*)
               first="$first $i"
               ;;
           */block/md*)
               last="$last $i"
               ;;
           */*)
               default="$default $i"
               ;;
       esac
    done
    # trigger the sorted events
    for i in $first $default $last; do
       echo "add" > "$i"
   done
}

#######################################################################
# produce error message and if $2 is empty run (debug) shell 
error() {
local message="An error occured during execution of $0 script:\n\n$1\n"
# check if LOGFILE is really writeable
if [ -n "${LOGFILE}" ] ; then
  [ "${LOGFILE}" != "/dev/null" ] && \
  [ -w /mnt/${LOGFILE} ] || LOGFILE="/dev/null"
else LOGFILE="/dev/null"
fi
# if nonfatal error else fatal error message and shell
if [ -n "$2" ] ; then
  [ "$DEBUGLEVEL" -ge 1 ] && \
    echo -e "$message  This error is not fatal - continuing ...\n" \
      >> ${LOGFILE} 
  [ "$DEBUGLEVEL" -gt 1 ] && \
    echo -e "$message  This error is not fatal - continuing ...\n"
  [ "$DEBUGLEVEL" -gt 2 ] && usleep 20
else
  echo -e "$message  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
[ -f /lib/modules/@@@KERNVER@@@/kernel/fs/nfs/nfs.ko ] && \
  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 \"/bin/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 &
  [ -f /lib/modules/@@@KERNVER@@@/kernel/net/packet/af_packet.ko ] && \
    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 /bin/dhclient-script
    dhclient -q -cf /etc/dhclient.conf -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 /bin/dhcpd.exe
    dhcpcd -L /var/lib/dhcp -c /bin/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 retrieving configuration file (machine-setup) via tftp
# from a predefined server or given source (file=tftp-server:/path via
# kernel command line) 
fileget () {
for tftp in /bin/atftp /bin/tftp ; do
  test -x $tftp && break
done
if [ -n "$FILESRC" ] ; then
  cfgfile=${FILESRC#*:}
  tftpserver=${FILESRC%:*}
else
  cfgfile="/tftpboot/dxs-config/$clientip.cfg"
  tftpserver=$serverip
fi
# 
case "$tftp" in
  atftp)
    atftp -g -r $cfgfile $tftpserver
    ;;
  tftp)
    echo "get $cfgfile" | tftp $tftpserver
    ;;
esac
echo "finished" > /tmp/file-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
} 

#######################################################################
# base passwd/shadow, the standard user present in every system. All
# other system users should be generated within the service function
basepasswd () {
# strip every line with userid between 500 and 99999 from the passwd-file
# FIXME: "nobody" will be deleted too
cat /mnt/etc/passwd | sed '/^[a-zA-Z0-9]*:[a-zA-Z0-9]*:[1-9][0-9]\{3,4\}:/d;/^[a-zA-Z0-9]*:[a-zA-Z0-9]*:[5-9][0-9]\{2\}:/d' > /mnt/etc/newpasswd
mv /mnt/etc/newpasswd /mnt/etc/passwd


#echo -e "root:x:0:0:System Administrator:/root:/bin/bash" \
#  > /mnt/etc/passwd
echo -e "root:"$root_pw":12958:0:10000::::" > /mnt/etc/shadow
}

#######################################################################
# 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
}