summaryrefslogblamecommitdiffstats
path: root/initramfs/initrd-stuff/etc/functions
blob: 3d16cf5ecb3fdc63be261de4c52ea968b74cd639 (plain) (tree)
1
2
3
4
5
6

                                             
 

                                                                         
 






                                                                            
 
                                                                             
                                                                   




                                                                       
 


                                                          
 


                                                                
 
 

                                              
 
 
 
 
                                                                             
                                        
                          
                                                





                                                                
        

                                  
        

                       
        

                             
        





                                    
 
 
                                                                             


                                                      


                                   






                                                                             
                                                            
          
                
                                      




                                               
                                                      
                     
                                                    
                                                            

                                                    
                                                            
    
                                              

                                                                     
                                                              
         


                                                           
                


                                                           

  
                                                                             

                                        

                                       


                                                                      
 
                                                                             

                                                                             
           
                           
                               
    
           

                                                         




                                      
      
  

        






                            
                          

   
                                                                             

                                                                  
                                                                       
 
                                                                             
                                                                       
                                               

              






              







                                                     
                                                    
                                                                       
                                      





                              
              
                   
                     
                           


                                                 












                               
                                                                             

                                                                       
            
                
                                             



                                      
                                         

  
                                                                             
                                        
            

                      
       



                                     
                                     








                                        
                                                                             


                             
          






                                                                 
                                                   




                             













                                                                           

                             



                                                                              





            
                                 


                               
                                            
     

                                                                   
                                    
                                              
      

                                                                   


                                                                        
    
                                                                
           
                                  
                     
        
                                                
      
                                                      

                                                            


                                                                        
    
       
                         
    

    


                                                                             








                                                       
                                                                             
                                                   
         

                
             

                             
                                                                      
                                                           
                                                                         

                                                                   

                                                          
           
 
                                                                             
                                        
               











                                                       
                                               






                                                                
                                                                 




                                                                     
                                                                             
                                                               
          
 
              
                                                
                              
    
                              
                                
    

                                                                    

                                                                


                                                                       
                                         
                                     




                     
                                                
                                                                       
                                                        

         
                                
                                           
                                                                   
                                              

       
                         
    
                                                                     

                                
                             
                                                                
                                                            
                                                                             
    
    
                                                 

 



                                                                             
                                        
                  





                                                                  
               
               
            
                                               
      


                                                                        
                                            
          
                                                    
        
      
    

                                                                 
                     
                            
                                                            



          
 
            
                                                                    

                                      
                           


                                               
                                          
    



                                                                      
                            



                                                                         
                                


                                                                          
      
  

                                                  
                                                      

 


                                                                             
            
                                           

 
                                                                             








                                                                          

                                                                          
                                            




                       

                                                                              














                                                                             





                             
                                                                             
                                
            

                                    

 
                                                                             
                              
             

                                           


 
                                                                             
                                             




                            
                                                                             




                                                         

                               
                         






                                      


                                                                             












                                              


                                                                             
               








                                                                     
                                                             

                                                              

 
                                                                             





                                                                      
                                                                         
                                          
                                    


                                                                  

                                                       

                                          

 


                                                                             
                 
            




                            
                     


                                   
                  
































































































































































































































                                                      
                                        





































                                


                                                                             
                 
              


                                                                           
                                     


                                                                

                                                                  
    

 
                                                             






























































































                                                                            



                                                                             
 
                                                                        

                                        


 
                                               
                


 

                                
 




                  



                  
 



                                             
 



                  
 



                      
 



                                  
 



                
 


                    
 



                                  
 
 
 




                                  

                                  
 



                                                    
 











                              
                                                                        
                 
 








                                                        
 



                       
 






                                                             
                   
               
 
 




                           
# Copyright (c) 2003 - 2006 - RZ Uni Freiburg
# Copyright (c) 2006, 2007 - OpenSLX GmbH
#
# This program/file is free software distributed under the GPL version 2.
# See http://openslx.org/COPYING
#
# If you have any feedback please consult http://openslx.org/feedback and
# send your feedback to feedback@openslx.org
#
# General information about OpenSLX can be found under http://openslx.org
#
# common functions file for the configuration of linux diskless clients
# (included by init, hwautocfg, servconfig, ... within OpenSLX initialramfs)

#############################################################################
# set of empty dummy functions (loaded before real functions in the
# distro specific files - to have no undeclared function in init, serv-
# config, hwautocfg, ...

# distro specific funtion called at the beginning of init script
preinit () {
:
}
# distro specific funtion called at the end of init script
postinit () {
:
}
# distro specific general function called from servconfig script
config_distro () {
:
}
# udev/hotplug - auto device discovery service
udev_hotplug () {
:
}


#############################################################################
# generate events with the sysfs trigger
trigger_device_events () {
  local 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
}

#############################################################################
# mini udev of busybox or distro specific udev_hotplug
runudev () {
if [ -x /bin/mdev ] ; then
  mknod /dev/mem c 1 1 &>/dev/null
  mknod /dev/zero c 1 5 &>/dev/null
  mdev -s
else
  udev_hotplug
fi
echo "Started udev"
}

#############################################################################
# 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 -a "$DEBUGLEVEL" != 8 ] && \
    echo -e "${error_msg}${e_msg}${error_nfe}" >> ${LOGFILE}
  [ "$DEBUGLEVEL" -gt 1 -a "$DEBUGLEVEL" != 8 ] && \
    echo -e "${error_msg}${e_msg}${error_nfe}"
  [ "$DEBUGLEVEL" -gt 2 -a "$DEBUGLEVEL" != 8 ] && usleep 10
else
  echo -e "${error_msg}${e_msg}${error_shell}"
  # load usb modules to have keyboard enabled - they might have to be
  # copied into initramfs with mkdxsinitramfs ...
  modprobe -a usbcore uhci-hcd ohci-hcd usbhid >/dev/null 2>&1
  /bin/sh
  echo -n "Reboot now? [y]"
  read input
#  [ -z "$input" -o "$input" = "y" -o "$input" = "Y" ] && {
#    usleep 5000
#    [ -f /proc/sysrq-trigger ] || mount -t proc none /proc
#    echo "b" > /proc/sysrq-trigger
#  }
fi
}
#############################################################################
# system uptime for performance analysis
sysup () {
uptime=$(sed -e "s, .*,," /proc/uptime)
echo "${uptime} s."
# if start times are kept, a summary of runtimes would be possible too
}


#############################################################################
# micro sleep - argument takes number of milliseconds. either busybox command
# or simply use uptime information
usleep () {
if [ -x /bin/usleep ]; then
  /bin/usleep `expr $1 \* 1000`
else
  local i=0
  local starttime=$(sed -e "s, .*,,;s,\.,," /proc/uptime)
  while [ $(sed -e "s, .*,,;s,\.,," /proc/uptime) -le \
    $(expr $starttime + $1 - 2) ] ; do
    # burn some cycles
    while [ $i -le 100 ] ; do
      i=$(expr 1 + $i)
    done
  done
fi
return 0
}
# standard sleep command
sleep () {
if [ -x /bin/sleep ]; then
  /bin/sleep $1
#elif [ -x /bin/bash ]; then
#  TMOUT=$1 read
else
  usleep `expr $1 \* 1000`
fi 
}
#############################################################################
# (re)generate dynamic linked libraries cache from /etc/ld.so.conf
ldcfg () {
[ -z "${noldsc}" ] && echo "$init_ldcfg" && ldconfig /tmp/ld.so.cache &
}
#############################################################################
# URI interpreter $1 variable to interprete, $2 type of token to return
# prot: tftp, http, nbd, ... server: IP or FQDN
uri_token () {
local var=$1
local prot
local rest
local server
local path
local port
local tmpval
local query=""
# first check if URI starts with prot:// - URI scheme
if strinstr "://" "$1" ; then
  prot=${var%://*}
  rest=${var#*://}
else
  rest="$var"
  prot=""
fi
# get the server IP or name and port - URI authority
# you get the path or other token without leading "/" - add it later if
# needed (fixme: port might be broken)
if strinstr ":" "$rest" ; then
  server="${rest%:*}"
  rest="${rest#*:}"
  path="${rest#*/}"
  port="${rest%/$path}"
else
  tmpval=$rest
  rest="${rest#*/}"
  path="${tmpval#*/}"
  server="${tmpval%/$path}"
  port=""
fi
# get path and query components - URI path, query
if strinstr "\?" "$rest" ; then
  path="${path%\?*}"
  query="${rest#*\?}"
fi
# return the requested token
case "$2" in
  prot) echo "$prot" ;;
  server) echo "$server" ;;
  path) echo "$path" ;;
  port) echo "$port" ;;
  query) echo "$query" ;;
esac
}
#############################################################################
# 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
local i
  for i in $1 $2 $3 $4 ; do
    case $i in
        0) break ;;
      128) n=`expr $n + 1` ; break ;;
      192) n=`expr $n + 2` ; 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 Xen bridge xenbr0
xenbr_config () {
modprobe netloop
local ipls
local vifnum="0"
local bridge="xenbr${vifnum}"
local netdev="eth${vifnum}"
local pdev="p${netdev}"
local vdev="veth${vifnum}"
local vif0="vif0.${vifnum}"
local mac=$(ip link show ${netdev} | sed -n '/^.*link\/ether/p' \
  | sed -e 's/.*ether \(..:..:..:..:..:..\).*/\1/')

brctl addbr ${bridge}
brctl stp ${bridge} off
brctl setfd ${bridge} 0
brctl addif ${bridge} ${vif0}
for ipls in "${netdev} name ${pdev}" "${vdev} name ${netdev}" \
            "${pdev} down arp off" "${pdev} addr fe:ff:ff:ff:ff:ff" \
            "${netdev} addr ${mac} arp on" "${netdev} addr ${mac} arp on" \
            "${bridge} up" "${vif0} up" "${pdev} up" ; do
  ip link set ${ipls}
done
#ip link set ${netdev} name ${pdev}
#ip link set ${vdev} name ${netdev}
#ip link set ${pdev} down arp off
#ip link set ${pdev} addr fe:ff:ff:ff:ff:ff
#ip link set ${netdev} addr ${mac} arp on
#ip link set ${bridge} up
#ip link set ${vif0} up
#ip link set ${pdev} up
brctl addif ${bridge} ${pdev}
}
#############################################################################
# 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 present.
ipsetup () {
local ip=$1
local nm=$2
local gw=$3
local bc=$4
local if=$5
for ipcfg in ip ifconfig none; do
  test -x /bin/$ipcfg && break;
done
case $ipcfg in
  # the standard linux ip configuration tool
  ip)
    ip link set dev $if up 2>/dev/null
    ip addr add $ip/`nm2pref $nm` broadcast $bc dev $if 2>/dev/null
    if [ "$gw" != "0.0.0.0" ] ; then
      ip route add default via $gw 2>/dev/null
    fi
    MAC=$(ip link show dev $if|sed -n "/ether [0-9e-f]\{2\}:.*/p" \
      | sed -e "s/.*ether //;s/ .*//")
    # if multicast is required for dnbd
    [ -n "$nbdhost" ] && [ `echo $nbdhost|sed "s,\..*,,"` -ge 224 ] && \
      ip route add 224.0.0.0/4 dev eth0
  ;;
  # traditional ifconfig/route - if a distro does not provide ip
  ifconfig)
    if [ "$ip" = "0.0.0.0" ]; then
      ifconfig $if up
    else
      ifconfig $if $ip netmask $nm broadcast $bc
    fi
    [ "$gw" != "0.0.0.0" ] && route add default gw $gw
    MAC=$(ifconfig $if|sed -n "/HWaddr [0-9A-F]\{2\}:.*/p" \
      | sed -e "s/.*HWaddr //;y/ABCDEF/abcdef/")
    # if multicast is required for dnbd
    [ -n "$nbdhost" ] && [ `echo $nbdhost|sed "s,\..*,,"` -ge 224 ] && \
      route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
  ;;
  none)
    error "$error_iptool"
  ;;
esac
}
#############################################################################
# replace @@@serverip@@@ with real serverip. Allows the usage of a variable 
# for the server ip address (e.g. in machine-setup or kernel commandline)
checkip ()
{
if [ "@@@serverip@@@" = "$1" -a -n "$serverip" ] ; then
  echo $serverip
else
  echo $1
fi
}

#############################################################################
# nfs mounter for root filesystem and other sources
nfsmnt ()
{
local nfsroot=$1
local dest=$2
local ret=0
[ -z "$dest" ] && dest="/mnt"
# often nfs is just a module and not compiled directly into the kernel
[ -f /lib/modules/@@@KERNVER@@@/kernel/fs/nfs/nfs.ko ] && \
  loadmod /lib/modules/@@@KERNVER@@@/kernel/fs/nfs/nfs.ko "$error_modnfs"
# busybox mount has to be compiled with nfs mount support otherwise
# --> error "$error_mntt"
mount -n -t nfs -o ro,nolock,tcp $nfsroot $dest || \
  mount -n -t nfs -o ro,nolock,udp $nfsroot $dest || ret=1
return $ret
}
#############################################################################
# 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 function (support dhclient, dhcpcd, pump, udhcpc)
rundhcp ()
{
local vci="$1"
for dhcp in dhclient dhcpcd pump udhcpc none; do
  test -e /bin/$dhcp && break;
done
if [ "$dhcp" = "none" ] ; then
  error "$error_nodhcp" nonfatal
else
  # ensure the interface is up - might produce conflicts - nbd could
  # fail!!
  [ -n "$noipyet" ] && \
    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 >/dev/null 2>&1
fi
export client="$dhcp"
case $dhcp in
  dhclient)
    mkdhclconf $vci
    ln -s /bin/dhcpmkconfig /bin/dhclient-script
    dhclient -cf /etc/dhclient.conf -lf /var/lib/dhcp/dhclient.leases \
      -q eth0 >/dev/null 2>&1 || error "$error_dhclient"
  ;;
  dhcpcd)
    [ -n $vci ] && vci="-i $vci"
    ln -s /bin/dhcpmkconfig /bin/dhcpcd.exe
    dhcpcd $vci -L /var/lib/dhcp -c /bin/dhcpcd.exe -T -t 30 eth0 \
      >/dev/null 2>&1 || error "$error_dhcpcd"
  ;;
  pump)
      error "$error_pump"
  ;;
  # udhcpc is part of busybox; then we expect to have mknod installed
  udhcpc)
    [ -n $vci ] && vci="-V $vci"
    testmkd /usr/share/udhcpc
    test -c /dev/urandom || mknod /dev/urandom c 1 9 2>/dev/null
    ln -s /bin/dhcpmkconfig /usr/share/udhcpc/default.script
    udhcpc -b -q $vci -s /usr/share/udhcpc/default.script -i eth0 2>/dev/null
  ;;
esac
echo "dhcp finished at $(sysup)" > /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
tftpgetunpack () {
# $1 is  config file name to get, $2 IP of server to get file from
for tftp in /bin/atftp /bin/tftp ; do
  test -x $tftp && break
done
echo -e "tftp\t69/tcp\ntftp\t69/udp" > /etc/services
local dst=/tmp/$(basename $1)
# tftp get part
case "$tftp" in
    */atftp)
      atftp -g -r $1 -l $dst $2 >/dev/null 2>&1
    ;;
    */tftp)
      # distinguish between busybox tftp and standalone (in.tftp) client
      if [ -x /bin/busybox ] ; then
        tftp -g -r $1 -l $dst $2 2>/dev/null
      else
        echo "get $1 $dst" | tftp $2 >/dev/null 2>&1
      fi
    ;;
esac
# unpack part (only gzip is supported, bzip binary not present in
# initramfs)
if [ -s $dst ] ; then
  tar -xpzf $dst 2>/dev/null
  [ "$DEBUGLEVEL" -le 2 -o "$DEBUGLEVEL" -eq 8  ] && rm $dst
  return 0
else
  return 1
fi
}
fileget () {
# get type of tftp available, alternatively use wget for ftp or http
# (fixme: rewrite of fileget needed!!)
# analyze file soure (URI) in $FILESRC
if [ -n "$FILESRC" ] ; then
  local srvproto=$(uri_token $FILESRC prot)
  local cfgfile="/$(uri_token $FILESRC path)"
  local tftpserver=$(uri_token $FILESRC server)
  tftpgetunpack $tftp $cfgfile $tftpserver
else
  # predefined value for openslx environment; it is expected that this
  # directory is just below the tftpboot/tftproot (path to which the 
  # daemon is restricted to)
  local cfgdir="client-config"
  local tftpserver=$serverip
  # try to get configuration files successively; start with distro client
  # and try last distro default ...
  echo -e "\n## Configuration via fileget: Hierarchy is distro client \
and as last\n# distro/default" >> /tmp/confviafile
  mac=$(echo $MAC|sed "s/:/-/g")
  for cfgfile in $cfgdir/$DISTRO/01-$mac.tgz $cfgdir/$DISTRO/default.tgz \
                 $cfgdir/01-$mac.tgz $cfgdir/default.tgz ; do
    tftpgetunpack $cfgfile $tftpserver && break
  done
fi
test -f /initramfs/machine-setup && \
  cat /initramfs/machine-setup >> /tmp/confviafile
echo "fileget via $srvproto 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 2>&1
}

#############################################################################
# function for writing a syslog-ng.conf file. First parameter is absolute 
# destination (incl. /mnt prefix)
# sysngwriter $dest $start_syslog
sysngwriter () {
syslogngcfg=$1
# logging servers might be specified in $log_servers (from e.g. dhcp)
# fixme!? only first logserver from dhcp variable is used
[ -n "$log_servers" ] && start_syslog="syslog://${log_servers% *}:514/udp"
echo -e "# File written by $0 within InitRamFS\n\
source src {\n\tfile(\"/proc/kmsg\");\n\
\tunix-dgram(\"/dev/log\");\n\tinternal();\n};\ndestination console_all {\
\n\tfile(\"/dev/tty10\");\n};" >$syslogngcfg
case "$start_syslog" in
  yes|Yes|YES)
    : # already defined
  ;;
  file)
    echo -e "destination allmessages {\n\tfile(\"/var/log/allmessages\");\n};\
\nlog {\n\tsource(src); destination(allmessages);\n};" >>$syslogngcfg
  ;;
  *)
    syslogsrv=$(uri_token $start_syslog server)
    syslogport=$(uri_token $start_syslog port)
    syslogprot=$(uri_token $start_syslog path)
    [ -z ${syslogport} ] && syslogport=514
    [ -z ${syslogprot} ] && syslogprot=udp
    echo -e "destination loghost {\n\t${syslogprot}(\"${syslogsrv}\" \
port(${syslogport}));\n};\nlog {\n\tsource(src); destination(loghost);\n};" \
      >>$syslogngcfg
  ;;
esac
}

#############################################################################
# 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 (){
  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
[ -z $file ] && return 0
[ -z $maxwait ] && maxwait=5000
while [ ! -e $file ] ; do
  echo "waiting ........." > /dev/null
  count=`expr $count + 1`
  [ $count -gt $maxwait ] && return 1
done
return 0
}

#############################################################################
# ldconfig is needed if rootfilesystem is composed of several parts 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
}

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

#############################################################################
# wait for the completion of configuration file (machine-setup). It is
# composed from different sources
cfgcomplete () {
waitfor /tmp/dhcp-done 10000 || error "$error_errdcfg" nonfatal
waitfor /tmp/file-done 10000 || error "$error_errfcfg" nonfatal
waitfor /tmp/ldap-done 10000 || error "$error_errlcfg" nonfatal
# concatenate the different files now into the central config file, order
# matters - ldap data has highest priority
if ! test -f /tmp/cfgcomplete ; then
  for config in /tmp/confviadhcp /tmp/confviafile /tmp/confvialdap
    do test -f $config && cat $config >> /etc/machine-setup
  done
# check if serverip is set as variable @@@serverip@@@
sed "s,@@@serverip@@@,$serverip," -i /etc/machine-setup
echo "config completed" > /tmp/cfgcomplete
fi
}

#############################################################################
# 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.UTF8"
    KEYTABLE="de-latin1-nodeadkeys"
    XKEYBOARD="de"
    KDEKEYBOARD="de"
    CHARSET="utf8"
    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
  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
}
#############################################################################
# setup initial boot scripts (for most standard distributions, gentoo is to
# be handled differently)
initial_boot () {
local count=10
# boot.ld is a special runlevel script generated within initialramfs which
# should be executed before the normal runlevel scripts. Proper shutdown is
# not needed!?
for i in boot.ld ${D_INITSCRIPTS}; do
  count=`expr $count + 1`
  revcnt=`expr 41 - $count`
  ln -sf /etc${D_INITDIR}/$i /mnt/etc/${D_INITBOOTD}/S${count}$i
  # uncomment if proper shutdown of bootup scripts is required
  #ln -sf /etc${D_INITDIR}/$i /mnt/etc/${D_INITBOOTD}/K${revcnt}$i
done
}

# kdmrc template started from distro specific functions files
config_kdm_template () {
usetheme=false
themeconf=$(ls /mnt/var/lib/openslx/themes/displaymanager/*.xml 2>/dev/null)
[ -r "${themeconf}" ] && usetheme=true
# check if a kdmrc was provided via ConfTGZ
[ -f /rootfs/${kdmrcdir}/kdmrc ] || \
  echo -e "# ${kdmrcdir}/kdmrc - \
file generated by
#\t$0: $date\n\
[General]
ConfigVersion=2.3
StaticServers=:0
ExportList=LANG
PidFile=/var/run/kdm.pid
AuthDir=/var/lib/xdm/authdir/authfiles
ServerVTs=-7
ConsoleTTYs=tty1,tty2,tty3,tty4,tty5,tty6
[Xdmcp]
Enable=$xdmcp
Xaccess=/${xdmdir}/Xaccess
Willing=/${xdmdir}/Xwilling
[Shutdown]
HaltCmd=/sbin/halt
RebootCmd=/sbin/reboot
[X-*-Core]
ServerCmd=/usr/X11R6/bin/X -br
ServerArgsLocal=-nolisten tcp
TerminateServer=true
Resources=/${xdmdir}/Xresources
Setup=/${xdmdir}/Xsetup
UserPath=/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/var/X11R6/bin
SystemPath=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:\
/usr/X11R6/bin:/var/X11R6/bin
Startup=/${xdmdir}/Xstartup
Reset=/${xdmdir}/Xreset
Session=/${xdmdir}/Xsession
ClientLogFile=.xsession-errors-%s
AutoReLogin=false
AllowRootLogin=true
AllowNullPasswd=true
AllowShutdown=All
SessionsDirs=/etc/X11/sessions,/usr/share/xsessions
AuthNames=XDM-AUTHORIZATION-1,MIT-MAGIC-COOKIE-1
[X-*-Greeter]
ShowUsers=Selected
SelectedUsers=
UserList=false
GUIStyle=default
LogoArea=Clock
GreetString=Diskless Linux (%h)
GreetFont=Nimbus Sans l,20,-1,5,48,0,0,0,0,0
StdFont=Nimbus Sans l,14,-1,5,48,0,0,0,0,0
FailFont=Nimbus Sans l,14,-1,5,74,0,0,0,0,0
AntiAliasing=true
Language=$lang
EchoMode=OneStar
ShowLog=false
UseTheme=${usetheme}
Theme=/var/lib/openslx/themes/displaymanager
UseBackground=true
BackgroundCfg=/var/lib/openslx/themes/displaymanager/backgroundrc
[X-:*-Greeter]
PreselectUser=None
FocusPasswd=true
LoginMode=DefaultLocal
AllowClose=false
UseAdminSession=true
[X-:0-Core]
AutoLoginEnable=false
ClientLogFile=.xsession-errors
NoPassEnable=false
[X-:0-Greeter]
LogSource=/dev/xconsole
UseAdminSession=false" >/mnt/${kdmrcdir}/kdmrc
echo -e "[Desktop0]
BackgroundMode=Flat
BlendBalance=100
BlendMode=NoBlending
ChangeInterval=60
Color1=0,51,102
Color2=255,255,255
CurrentWallpaper=0
LastChange=0
MinOptimizationDepth=1
MultiWallpaperMode=NoMulti
Pattern=triangles
Program=
ReverseBlending=false
UseSHM=false
Wallpaper=
WallpaperList=
WallpaperMode=NoWallpaper" \
  >/mnt/var/lib/openslx/themes/displaymanager/backgroundrc
}

#############################################################################
# dummy functions - avoid undefined functions in servconfig (functions are
# normally overwritten by settings within distro-functions - a file generated
# by slxmkramfs from <distro>/functions-default & ~-version

# find out if prerequisites for special X server modules are met (distro
# specific) and enable tvout if required
checkgraphix () {
:
}

# overwrite xorg configuration set by hwautocfg
displayvars () {
:
}

# function for ntp configuration
config_ntp () {
:
}

# function for afs
config_afs () {
:
}

# function for atd
config_atd () {
:
}

# function for configuration of cron services
config_cron () {
:
}

# syslog service
config_syslog () {
:
}

# secure shell service
config_sshd () {
:
}

# snmp agent for remote monitoring
config_snmp () {
:
}

# consolefont
consolefont () {
:
}
# acpi and powersave
config_acpi () {
:
}

# configure xdm as display manager
config_xdm () {
:
}

# configure kdm as display manager
config_kdm () {
:
}

# configure gdm as display manager
config_gdm () {
:
}

# configure hal, dbus, resmgr and services like that
config_dreshal () {
:
}

# configure automounter
config_automount () {
:
}

# configure bluetooth services
config_bt () {
:
}

# create a compliant runlevel script, needed for boot.ld and vmware-prep
d_mkrlscript () {
:
}

# start name service caching daemon
config_nscd () {
:
}

# prepare virtual machine environment (vmware, vmplayer)
config_vmware () {
:
}

# configure automounter
config_automount () {
:
}

# start portmapper (needed at least for nfs and nis services)
config_portmap () {
:
}

# start nis/ypbind 
config_nis () {
:
}

# konfigure keyboard layout
keytable () {
:
}