#!/bin/sh
# Copyright (c) 2003..2006 - RZ Uni Freiburg
# Copyright (c) 2006..2010 - OpenSLX GmbH
#
# This program 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
#
# universal (distro independent) configuration script for OpenSLX linux
# diskless clients (executed in stage3 within initial ramfs). The file-
# system setup is completed when servconfig starts
#############################################################################
# check for configuration files to source
# functions common for all distros, messages contains all error and
# info output
. /etc/messages
. /etc/functions
# load distro specific configuration functions. Distro specific functions may
# overwrite functions defined in /etc/functions
. /etc/distro-functions
. /etc/slxsystem.conf
# load variables defined by plugins
[ -f /tmp/env/wrapper.env ] && . /tmp/env/wrapper.env
# script run timer
[ $DEBUGLEVEL -eq 8 ] && echo "** SW setup started at $(sysup)"
# heavy debugging output in level 3 and below 8 ...
[ $DEBUGLEVEL -gt 3 -a $DEBUGLEVEL -lt 8 -o $DEBUGLEVEL -eq 12 ] && \
set -x
#############################################################################
# read and unify configuration options - default configuration file, from
# dhcp, ldap ...
# wait for the appearance of configuration from several sources
cfgcomplete
. /etc/initramfs-setup
[ $DEBUGLEVEL -eq 8 ] && echo "** Config info is complete at $(sysup)"
# copy additional configuration and var files and directories
# admins can place there files in /var/lib/openslx/config/...
# to be packed during stage2 into (/srv/dxs)/tftpboot/client-config...)
cp -a /rootfs/* /mnt 2>/dev/null
# copy passwd, group files for temporarily (within stage3 configuration) used
# by chown
cp /mnt/etc/passwd /etc
cp /mnt/etc/group /etc
# set greeting and add information on booted system
len=$(expr length ${SLXVERSION}${SYSTEM_NAME})
if [ $len -le 28 ] ; then
vdstr="Stateless Workstation (V${SLXVERSION}/${SYSTEM_NAME})"
smax=28
else
vdstr="V${SLXVERSION}/${SYSTEM_NAME}"
smax=52
fi
while [ $len -le $smax ] ; do
vdstr="$vdstr "
len=$(($len + 1))
done
len=$(expr length ${host_name})
while [ $len -le 30 ] ; do
space="$space "
len=$(($len + 1))
done
echo "
WELCOME TO $space \n (\l)
_____ ______ ______ __ __ _______ __ __ __
/ _ | _ | ___| | | | | ____| | | | | |
| | | | |_| | |_ | | | | |___ | | / /
| | | | ___/| _| | | ____ | | | |
| |_| | | | |___| | | | ____| | |___ / /
_____/|__| |______|__| |__| |_______|______|__| |__|
$vdstr (c) <OpenSLX.ORG>
" >/mnt/etc/issue
#############################################################################
# set localization and add entries to initialize keytable and consolefont to
# boot.slx
if [ -z "${country}" ] ; then
error "$scfg_country" nonfatal
country="us"
fi
# do localization (this functions simply sets a list of variables)
localization "${country}"
# start distrospecific localization
dlocale
#############################################################################
# setup passwd and shadow for local system users like root, bin, daemon and
# nobody if no user/admin provided passwd exists ... fixme: see #206
[ ! -e /rootfs/etc/shadow ] && \
basepasswd $(sed "/+::0/d;s/root://;s/:.*//" /rootfs/etc/shadow 2>/dev/null)
#############################################################################
# dns and ip configuration
# hostname of the machine
echo "$host_name" >/proc/sys/kernel/hostname
echo -e "# /etc/hosts - file generated by $0 during OpenSLX stage3\
\n#\n# IP-Address Full-Qualified-Hostname Short-Hostname\n#\n\
127.0.0.1\tlocalhost\n::1\t\tlocalhost ipv6-localhost ipv6-loopback\n\
fe00::0\t\tipv6-localnet\nff00::0\t\tipv6-mcastprefix\nff02::1\
\t\tipv6-allnodes\nff02::2\t\tipv6-allrouters\nff02::3\t\t\
ipv6-allhosts\n" >/mnt/etc/hosts
if [ -n "${domain_name}" ]; then
echo -en "${clientip}\t" >>/mnt/etc/hosts
for name in ${domain_name}; do
echo -en "${host_name}.${name} " >>/mnt/etc/hosts
done
echo -e "${host_name}" >>/mnt/etc/hosts
else
echo -e "${clientip}\t${host_name}" >>/mnt/etc/hosts
fi
# set up domainname and resolving
rm -rf /mnt/etc/resolv.conf
test -n "${domain_name}" && \
echo -e "# /etc/resolv.conf - file generated by\n#\t$0:\n\
#\t${date}\n#options timeout:1 attempts:1 rotate\n\
search "${domain_name} >/mnt/etc/resolv.conf
test -n "${domain_name_servers}" && {
for name in ${domain_name_servers}; do
echo nameserver ${name} >>/mnt/etc/resolv.conf;
done; }
#############################################################################
# run distro specific configuration function
config_distro
#############################################################################
# basic (non network) services
# at daemon - calling distro specific function config_atd
config_atd
# configuration of cron services - calling distro specific function
# config_cron (runlevel links, directories, ...)
config_cron
# setup system log services - distro dependent function config_syslog
config_syslog
# acpi and powersave - distro dependent function config_acpi, these daemons
# might require dbus
config_acpi
# configure udev
config_udev
# configure dbus - distro dependent function config_dreshal - handle
# all stuff regarding dependent services like dbus, resmgr, hal ...
# (check for runlevel scripts, passwd entries, directories ...)
config_dreshal
# configure automounter (should be moved to plugin)
if [ "x$automnt" != "xno" ] ; then
# check if there is some user provided configuration (only auto.master is
# important) and skip automatic setup
if [ ! -f /rootfs/etc/auto.master ] ; then
if [ -d /mnt/misc ] ; then
echo -e "# /etc/auto.master - file generated by $0:\n\
/misc\t/etc/auto.misc" >/mnt/etc/auto.master
echo -e "# /etc/auto.misc - file generated by $0:" >/mnt/etc/auto.misc
else
echo -e "# /etc/auto.master - file generated by $0:\n\
/misc\t#/etc/auto.misc" >/mnt/etc/auto.master
echo -e "# /etc/auto.misc - file generated by $0:\nautomount for \
removable devices is mostly deprecated, so /misc is not\nactivated in \
auto.master." >/mnt/etc/auto.misc
fi
if [ -n "${automnt_src}" ] ; then
# local directory and home directory server from initialramfs-setup
[ -z "${automnt_dir}" ] && automnt_dir="/home"
# remove leading and trailing slash
automnt_dir=${automnt_dir#/}
automnt_dir=${automnt_dir%/}
test -d /${automnt_dir} || error "$scfg_erradir" nonfatal
amserv=$(uri_token $automnt_src server)
ampath=$(uri_token $automnt_src path)
amdirn=$(echo ${automnt_dir}|sed "s,/,_,g")
echo -e "/${automnt_dir}\t/etc/auto.${amdirn}\n" \
>> /mnt/etc/auto.master
echo -e "# /etc/auto.${amdirn} created by $0:\n" \
> /mnt/etc/auto.${amdirn}
# add '/' to path because uri_token removes any leading '/' (s. function)
echo -e "*\t-rsize=32768,wsize=32768,rw\t${amserv}:/${ampath}/&" \
>> /mnt/etc/auto.${amdirn}
# no tempfs needed if automounter operates on /home
[ "${automnt_dir}" = "home" ] && umount -t tmpfs /mnt/home 2>/dev/null
# portmapper is needed for remote NFS sources and local nfs directories
testmkd /mnt/var/lib/nfs/state
config_portmap
fi
fi
config_automount
fi
# configure print services / start requested printer daemon
config_printer
# configure bluetooth services
#[ -s /etc/hwinfo.bt ] if existance of bt devices should play any role
config_bt
#############################################################################
# network(ed) services
if [ -n "$ntp_servers" ]; then
# rdate uses the time protocol (port 37 which is not the ntp standard port)
# thus not every standard ntp-server might offer this service)
( rdate -s "$ntp_servers" 2>/dev/null || error "$scfg_rdate" nonfatal
hwclock -w ) &
fi
# network time service (ntp) configuration file
if [ -n "$ntp_servers" -a ! -f /rootfs/etc/ntp.conf ]; then
echo -e "# /etc/ntp.conf - file generated by $0: \
$date\n" >/mnt/etc/ntp.conf
for name in $ntp_servers; do
echo server $name >>/mnt/etc/ntp.conf
done
fi
# copy timezone file defined with language settings
[ -z "$TZ" ] && TZ="$timezone"
ln -snf /usr/share/zoneinfo/${TZ} /mnt/etc/localtime || \
error "$scfg_ntptz" nonfatal
config_ntp
# secure shell server - at the moment all clients share one "secret"
# key or the key has to be regenerated on every bootup or fetched on
# every bootup from somewhere
config_sshd
# simple network management protocol agent
config_snmp
# configure samba service
config_samba
#############################################################################
# NIS (variable typically fetched via dhcp)
# setup nis configuration if needed
if [ "x$nis_domain" != "x" -a "x$nis_servers" != "x" ] ; then
echo $nis_domain >/mnt/etc/defaultdomain
echo -e "# /etc/yp.conf - file generated by $0:\n#\t\
$date\n\nypserver "$nis_servers >/mnt/etc/yp.conf
config_nis
fi
#############################################################################
# name service caching daemon if networked user database
config_nscd
#############################################################################
# preparation of /tmp directory (partition 44, nfs scratch, ramdisk). there
# might be the chance that we have a disk partition available, so wait for
# completion of detection, setup process
[ $DEBUGLEVEL -eq 8 ] && echo "** Waiting for /tmp completion at $(sysup)"
waitfor /tmp/tmpready 40000
[ $DEBUGLEVEL -eq 8 ] && echo "** Setup of /tmp completed at $(sysup)"
# create some directories and correct permissions
tmpisdisk=$(sed -n '/\/tmp/p' /tmp/fstab 2>/dev/null)
# if there is no local disk partition for /tmp then try to mount a rw
# scratch space (if defined in $scratch) and prepared on server
if [ -n "$scratch" -a -z "$tmpisdisk" ] ; then
scrproto=$(uri_token $FILESRC prot)
scrpath=$(uri_token $FILESRC path)
testmkd /tmp/scratch
# exports have to be per client!!
case "$scrproto" in
nbd)
:
;;
*)
tmpserv=$(uri_token $scratch server)
tmppath=$(uri_token $scratch path)
# hanging mount processes might stop further setup - timeout
# should be configured ...
# fsmount proto server path target options
fsmount nfs ${tmpserv} ${tmppath} /tmp/scratch \
"rw,intr,soft,timeo=2,nosuid" && {
if [ -d /tmp/scratch/${clientip} ] ; then
mv /tmp/scratch/${clientip} /tmp/scratch/${clientip}.totrash
rm -rf /tmp/scratch/${clientip}.totrash 2>/dev/null &
fi
testmkd /tmp/scratch/${clientip}
# no need for tempfs there ...
umount /mnt/tmp >/dev/null 2>&1
fsmount nfs ${tmpserv} ${tmppath} /mnt/tmp \
"rw,intr,soft,timeo=2,nosuid"; }
;;
esac
fi
# script run timer
[ $DEBUGLEVEL -eq 8 ] && echo "** SW setup finished at $(sysup)"
# servconfig finished successfully
echo "servconfig finished at $(sysup)" > /tmp/svcfg