summaryrefslogblamecommitdiffstats
path: root/initrd/initrd-stuff/etc/functions
blob: 19644cf5e74784f5eccf5ab93f65ae01c844030e (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>, 23-03-2006
#	 	Felix Endres, 21-03-2006
#		Blub
#
# Copyright:    (c) 2006 - RZ Universitaet Freiburg
# 
# Version:      0.4.2b

#######################################################################
# generate events with the sysfs trigger
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 e_msg=$1
# 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 "$error_msg $e_msg $error_nfe" \
      >> ${LOGFILE} 
  [ "$DEBUGLEVEL" -gt 1 ] && echo -e "$error_msg $e_msg $error_nfe"
  [ "$DEBUGLEVEL" -gt 2 ] && usleep 20
else
  echo -e "$error_msg $e_msg $error_shell"
  /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 "$error_modload '$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 $error_iptool
  ;;
esac
}
#######################################################################
# nfs mounter
nfsmnt ()
{
local nfsroot=$1
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 $error_modnfs
case $mnt in
  nfsmount)
    nfsmount -o ro $nfsroot /mnt || error $error_nfs
  ;;
  mount)
    portmap || error $error_portm
    mount -n -t nfs -o ro $nfsroot /mnt || error $errmsg
    killall -9 portmap
  ;;
  none)
    error $error_mntt
  ;;
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 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 $error_dhclient 
  ;;
  dhcpcd)
    ln -s /bin/dhcpmkconfig /bin/dhcpcd.exe
    dhcpcd -L /var/lib/dhcp -c /bin/dhcpcd.exe -T -t 30 eth0 2>&1 >/dev/null \
     || error $error_dhcpcd
  ;;
  pump)
      error $error_pump
  ;;
  ipconfig)
      error $error_ipconf
  ;;
  *)
  ;;
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)
# tftpget is helper function for fileget 
tftpget () {
# $1 is type of tftp command, $2 is config file name to get, $3 IP of
# server to get file from
case "$1" in
    atftp)
      atftp -g -r $2 $3
      ;;
    tftp)
      echo "get $2" | tftp $3
      ;;
esac
}
fileget () {
for tftp in /bin/atftp /bin/tftp ; do
  test -x $tftp && break
done
if [ -n "$FILESRC" ] ; then
  cfgfile=${FILESRC#*:}
  tftpserver=${FILESRC%:*}
  tftpget $tftp $cfgfile $tftpserver
else
  cfgfile="/tftpboot/dxs-config"
  # ensure that a / is at the end of path to config file
  cfgfile=$cfgfile"/"
  tftpserver=$serverip
  # try to get configuration files successively; start with first part
  # of the servers IP, add second part ...
  set `IFS="."; echo $serverip`
  for i in $1 $2 $3 $4 ; do
    cfgfile=$cfgfile$i
    tftpget $tftp $cfgfile $tftpserver 
    cfgfile=$cfgfile"."
  done
fi
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 $error_ldapcfg
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
sed '/^[a-zA-Z0-9]*:[a-zA-Z0-9]*:[1-9][0-9]\{3,4\}:/d;/^+:*/d;/^+$/d;
  /^[a-zA-Z0-9]*:[a-zA-Z0-9]*:[5-9][0-9]\{2\}:/d' /mnt/etc/passwd \
  > /tmp/newpasswd
# and add user nobody again (is there a more elegant way?)
sed -n -e '/nobody/p' /mnt/etc/passwd >> /tmp/newpasswd
cp /tmp/newpasswd /mnt/etc/passwd
# create the shadow from passwd file
echo -e "root:"$root_pw":12958:0:10000::::" > /mnt/etc/shadow
sed 's/:.*/:!:13078:0:99999:7:::/;/^root.*/d' /tmp/newpasswd \
  >> /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
}