diff options
Diffstat (limited to 'initramfs/initrd-stuff/bin/servconfig')
-rwxr-xr-x | initramfs/initrd-stuff/bin/servconfig | 521 |
1 files changed, 521 insertions, 0 deletions
diff --git a/initramfs/initrd-stuff/bin/servconfig b/initramfs/initrd-stuff/bin/servconfig new file mode 100755 index 00000000..9e592a23 --- /dev/null +++ b/initramfs/initrd-stuff/bin/servconfig @@ -0,0 +1,521 @@ +#!/bin/sh +# +# universal (distro independent) configuration script for OpenSLX linux +# diskless clients (executed in stage3 within initial ramfs). The file- +# system is setup when servconfig starts +# +# Dirk von Suchodoletz <dvs@OpenSLX.com>, 03-09-2006 +# Michael Janczyk <mj0>, 12-09-2006 +# Lars Mueller <lm@OpenSLX.com>, 23-06-2006 +# Oliver Tappe <ot@OpenSLX.com>, 23-06-2006 +# +# (c) 2006 - RZ Universitaet Freiburg +# (c) 2006 - OpenSLX.ORG Project + +# 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 variables and functions. distro +# specific functions may overwrite functions defined in /etc/functions +. /etc/sysconfig/config +. /etc/distro-functions +# get location of logfile definition +. /mnt/etc/${D_SYSCONFDIR}/logfile + +# 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 + +####################################################################### +# copy distro specific scripts, programs, libraries and configs +cp -a /etc/sysconfig/files/* /mnt 2>/dev/null & +# boot.local file (different for several distros) +[ -f "/etc/boot.local" -a -n "${D_BOOTLOCAL}" ] && { + echo "# added by $0 (initramfs from $date)" >> /mnt/etc/${D_BOOTLOCAL} + cat /etc/boot.local >> /mnt/etc/${D_BOOTLOCAL} +} + +####################################################################### +# read and unify configuration options - default configuration file, +# from dhcp, ldap ... +# wait for the appearance of configuration from several sources +cfgcomplete +. /etc/machine-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...) +# ... in the near future ... +cp -a /rootfs/* /mnt 2>/dev/null + +# set greeting and add information on booted system (distro) +len=$(expr length $DISTRO) +dstr="$DISTRO)" +while [ $len -le 16 ] ; do + dstr="$dstr " + len=$(expr $len + 1) +done +len=$(expr length $host_name) +while [ $len -le 30 ] ; do + space="$space " + len=$(expr $len + 1) +done +echo " + WELCOME TO $space \n (\l) + _____ ______ ______ __ __ _______ __ __ __ + / _ | _ | ___| | | | | ____| | | | | | + | | | | |_| | |_ | | | | |___ | | / / + | | | | ___/| _| | | ____ | | | | + | |_| | | | |___| | | | ____| | |___ / / + _____/|__| |______|__| |__| |_______|______|__| |__| + + Diskless Workstation (v4.1/$dstr (c) <OpenSLX.ORG project> +">/mnt/etc/issue + +####################################################################### +# vmware stuff first part: two scenarios +# * VM images in /usr/share/vmware - then simply link +# * VM images via additional mount (mount source NFS, NBD, ...) +if [ "x$vmware" != "x" ] && [ "x$vmware" != "xno" ] ; then + # get source of vmware image server (get type, server and path) + if [ -n "${imgsrv}" ] ; then + vmimgprot=$(uri_token $imgsrv prot) + vmimgserv=$(uri_token $imgsrv server) + vmimgpath="/$(uri_token $imgsrv path)" + # on DHCP config systems vmware image server might be coded into the + # $vmware variable + elif strinstr "/" "$vmware" ; then + vmimgprot=$(uri_token $vmware prot) + vmimgserv=$(uri_token $vmware server) + vmimgpath="/$(uri_token $vmware path)" + fi + if [ -n "${vmimgserv}" ] ; then + testmkd /mnt/var/lib/vmware + case "${vmimgsprot}" in + *nbd) + ;; + *) + # we expect nfs mounts here ... + nfsmnt ${vmimgserv}:${vmimgpath} /mnt/var/lib/vmware || { + error "${scfg_nfs}" nonfatal; noimg=yes; } + ;; + esac + # if only the path is given expect a local source within exported + # system (allow compatibility to older 3.X versions) + elif [ -n "${vmimgpath}" ] ; then + ln -s ${vmimgpath} /mnt/var/lib/vmware 2>/dev/null + fi +fi + +####################################################################### +# set localization +if [ -z "$country" ] ; then + error "$scfg_country" nonfatal + country="${D_DEFAULTCOUNTRY}" +fi +localization "${country}" + +####################################################################### +# setup passwd and shadow for local system users like root, bin, daemon +# and nobody if no user/admin provided passwd exists ... +# the root password provided by machine-setup is used only if no passwd +# file is provided (default case) +if [ ! -f /rootfs/etc/passwd ] ; then + basepasswd +fi + +####################################################################### +# dns and ip configuration +# hostname of the machine +echo "$host_name" >/proc/sys/kernel/hostname +echo -e "# /etc/hosts - file generated by\n#\t$0:\n#\t$date\ +\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 +echo -e "$clientip\t$host_name.$domain $host_name\n" >>/mnt/etc/hosts + +# set up domainname and resolving +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 nameserver in $domain_name_servers; do + echo nameserver $nameserver >>/mnt/etc/resolv.conf; + done; } + +####################################################################### +# initial boot scripts +# delete and create runlevel links for initial booting (SuSE, Debian, +# ...) +initial_boot + +####################################################################### +# +# run distro specific configuration function +config_distro + + +####################################################################### +# +# boot.local +if [ -n "$bootlocal_script" ]; then + echo -e "# entries added by $0:\n#\t$date\n\n\ +$bootlocal_script" >> /mnt/etc/${D_INITDIR}/boot.local +fi + +####################################################################### +# 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 +[ "x$crontab_entries" != "x" ] && \ + echo -e "$crontab_entries" >> /mnt/etc/crontab + +# setup system log services - distro dependent function config_syslog +config_syslog + +# 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 + +# acpi and powersave - distro dependent function config_acpi +config_acpi + +# configure automounter +# if automounter=yes +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 machine-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 + strinstr "/" ${automnt_dir} && error "$scfg_erratpld" nonfatal + amserv=$(uri_token $automnt_src server) + ampath=$(uri_token $automnt_src path) + echo -e "/${automnt_dir}\t/etc/auto.${automnt_dir}\n" \ + >> /mnt/etc/auto.master + echo -e "# /etc/auto.${automnt_dir} created by $0:\n" \ + > /mnt/etc/auto.${automnt_dir} + echo -e "*\t-rsize=32768,wsize=32768,rw\t${amserv}:/${ampath}/&" \ + >> /mnt/etc/auto.${automnt_dir} + # 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 + config_portmap +fi +config_automount +# fi + +# configure bluetooth services +config_bt + +####################################################################### +# network(ed) services + +# 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 ntpserver in $ntp_servers; do + echo server $ntpserver >>/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 + +# setup afs client stuff +config_afs + +####################################################################### +# NIS +# setup nis configuration if needed +if [ "x$nis_domain" != "x" ] && [ "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 + # should be last in passwd file + strinfile "+:::" /mnt/etc/passwd || echo "+::::::" >>/mnt/etc/passwd + config_nis +fi + +####################################################################### +# name service caching daemon if networked user database +config_nscd + +####################################################################### +# vmware stuff second part: setting up the environment + +# create needed directories and files +if [ "x$vmware" != "x" ] && [ "x$vmware" != "xno" ] ; then + for i in /var/X11R6/bin /etc/vmware/vmnet1 /etc/vmware/vmnet8 \ + /var/run/vmware /etc/X11/sessions ; do + testmkd /mnt/$i + done + # generate a runlevel script + d_mkrlscript init vmware-prep "Starting preparation of vmware environment" + sed "s,^#.*,,;/^$/d;s,^, ," /etc/vmware-prep >> \ + /mnt/etc/${D_INITDIR}/vmware-prep + d_mkrlscript close vmware-prep "" + chmod u+x /mnt/etc/${D_INITDIR}/vmware-prep + # check here that mount finished and the important files are available + if [ "$noimg" = "yes" ] ; then + error "$scfg_vmdir" nonfatal + else + # add special sessions to the display managers session menu + # default kdm session. Xdialog with WM and VMware images + cp /mnt/var/lib/vmware/templ/runvmware \ + /mnt/var/X11R6/bin >/dev/null 2>&1 + cp /mnt/var/lib/vmware/templ/defaultwm \ + /mnt/var/X11R6/bin >/dev/null 2>&1 + cp /mnt/var/lib/vmware/templ/kursimages \ + /mnt/var/X11R6/bin >/dev/null 2>&1 + fi + config_vmware + chmod 1777 /mnt/var/run/vmware + # define a variable where gdm/kdm should look for additional sessions + export vmsessions=/var/lib/vmware/vmsessions + # create default.desktop for kdm + echo -e "[Desktop Entry]\nEncoding=UTF-8\nName=Default\n\ +Name[de]=Standard\nExec=defaultwm\nTryExec=/var/X11R6/bin/defaultwm\n\ +Type=Application" >/mnt/etc/X11/sessions/default.desktop + rm /mnt/etc/vmware/not_configured 2>/dev/null + echo -e "#!/bin/sh\n#\n# file generated by ${0} at ${date}\ + \n# set X background\ + \nres=\$(xvidtune -show | grep -wo \"\\\".*\\\"\" | sed \"s/\\\"//g\")\ + \nif ! [ -f /var/lib/vmware/templ/corp-id/bootsplash/silent-\${res}.jpg ]; then + \n img=\$(ls /etc/bootsplash/themes/dxs/images/ | grep -m 1 \"silent\")\ + \n display -window root /var/lib/vmware/templ/corp-id/bootsplash/images/\${img}\ + \nelse\ + \n display -window root /var/lib/vmware/templ/corp-id/bootsplash/images/silent-\${res}.jpg\ + \nfi + \nstartvm=\$(echo \$0 | sed -e \"s,.*/,,\")\ + \n/var/X11R6/bin/runvmware -s \${startvm}\n"\ + > /mnt/var/X11R6/bin/desktop-session #${debug} removed + chmod 755 /mnt/var/X11R6/bin/runvmware /mnt/var/X11R6/bin/defaultwm \ + /mnt/var/X11R6/bin/desktop-session >/dev/null 2>&1 + sessions=$(ls /mnt/var/lib/vmware/vmsessions/*.desktop 2>/dev/null) + # fixme: the following part is to be tested!! + if [ -n "${sessions}" ]; then + for i in /mnt/var/lib/vmware/vmsessions/*.desktop; do + #session_name=$(cat ${i} | grep -iw "exec" \ + # | awk -F "=" '{print $2}') + session_name=$(cat ${i}|sed -n "/^[Ee]xec/p"|sed -e "s,Exec=,,") + # copy bacause of initrd + cp /mnt/var/X11R6/bin/desktop-session \ + /mnt/var/X11R6/bin/${session_name} + #ln -s /mnt/var/X11R6/bin/desktop-session \ + # /mnt/var/X11R6/bin/${session_name} + done + fi +fi + +####################################################################### +# 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 +waitfor /tmp/tmpready 10000 +[ $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) + # fixme - use nfsmnt and pass info on rw + mount -t nfs -o rw,nolock,intr,nodev,soft,timeo=2,nosuid \ + ${tmpserv}:/${tmppath} /tmp/scratch >/dev/null 2>&1 && { + mkdir -p /tmp/scratch/${clientip} >/dev/null 2>&1 + umount /tmp/scratch + mount -t nfs -o rw,nolock,intr,nodev,soft,timeo=2,nosuid \ + ${tmpserv}:/${tmppath}/${clientip} /mnt/tmp >/dev/null 2>&1; } + ;; + esac +fi +chmod 1777 /mnt/tmp + +####################################################################### +# X11/GUI stuff +if [ "x$start_x" != "xno" ] ; then + # creating directories commonly needed for X11 in all distros + # rest should be done via config_x11 function (distro specific) + for i in /var/lib/xkb/ \ + /etc/X11/xdm \ + /etc/X11/sessions \ + /var/X11R6/bin \ + /var/run/xdmctl \ + /tmp/.ICE-unix \ + /tmp/.X11-unix ; do testmkd /mnt/$i; done + chmod a+rwxt /mnt/tmp/.ICE-unix /mnt/tmp/.X11-unix + echo "# file emtied by $0 during initramfs" > /mnt/etc/X11/xdm/Xservers + # define additional sessions offered to the user (via dhcp/ldap config) + # descsession -> deprecated by new vmware integration concept + # write available X display manager to /etc/X11/xdm/Xaccess + [ -n "$x_display_manager" ] && \ + echo -e "# /etc/X11/xdm/Xaccess - file generated by $0: \ +$date\n*\n%hostlist\t$x_display_manager\n*\t\tCHOOSER %hostlist"\ + >/mnt/etc/X11/xdm/Xaccess + + # define type of X session + dsx="no" + init="#7:5:respawn:/usr/X11R6/bin/X vt7 -quiet" + case "$start_x" in + yes|YES|direct|DIRECT|query|QUERY) + # direct connection onto the own displaymanager, which + # should be enabled then + [ "x$start_xdmcp" = "xno" ] && $start_xdmcp="yes" + init="" + dsx="yes" + xdmcp="false" + echo -e "# /etc/X11/Xservers - file generated by \ +$0: $date\n:0 local /usr/X11R6/bin/X :0 vt07\n" >/mnt/etc/X11/xdm/Xservers + ;; + broadcast|BROADCAST) + # the client will XDMCP broadcast and choose first available + # X11 server + [ "x$start_xdmcp" = "xgdm" ] || init="$init -broadcast" + ;; + indirect|INDIRECT) + # the client will try to XDMCP connect list of X11 servers + if [ "x$start_xdmcp" = "xgdm" ] ; then + init="" + else + init="$init -indirect $host_name" + fi + [ "x$start_xdmcp" = "xno" ] && start_xdmcp="yes" + xdmcp="true" + ;; + *) + # no display manager needed in kiosk mode + # in this mode you have to provide the type of X session to start + [ x$start_xdmcp != "x" ] || start_xdmcp="no"; + init="7:5:respawn:/var/X11R6/bin/kiosk /dev/tty7" + echo -e "#!/bin/sh\n# /var/X11R6/bin/kiosk - file generated by $0: \ +$date\nwhile ps aux|grep -i kiosk|grep -v \"grep\" &>/dev/null;\ +do\n test -f /var/run/kiosk || break; sleep 3;\ndone\ntouch \ + /var/run/kiosk\nresmgr login nobody tty7\nresmgr grant nobody desktop\n\ +chown nobody /dev/dsp* /dev/audio* /dev/mixer* /dev/snd/control*\n\ +chown -R nobody:nobody /var/lib/nobody\nsu -c 'xinit /var/X11R6/bin/startgui \ +$start_x -- vt7 -quiet' -l nobody &>/dev/null\nrm /var/run/kiosk\n\ +resmgr revoke nobody\nresmgr logout tty7\nkillall X" \ + >/mnt/var/X11R6/bin/kiosk + # early start of kiosk session if not late_dm is set + if [ "x$late_dm" != "xyes" ] ; then + echo -e "\t# kiosk start added by $0\n\t\ +/var/X11R6/bin/kiosk &>/dev/null &" >>/mnt/etc/${D_INITDIR}/boot.ld + fi + cp /etc/startgui /mnt/var/X11R6/bin + chmod a+x /mnt/var/X11R6/bin/kiosk /mnt/var/X11R6/bin/startgui + rm /mnt/var/run/kiosk 2>/dev/null + ;; + esac + echo -e "# entry made by $0 $date\n$init" >> /mnt/etc/inittab +fi + +# setup requested display manager +if [ "x$start_xdmcp" != "xno" ] ; then + testmkd /mnt/var/lib/xdm/authdir/authfiles + testmkd /mnt/var/run/xdmctl + if [ "$start_xdmcp" = "yes" ] ; then + start_xdmcp=kdm + fi + # just ensure lowercase + start_xdmcp=$(echo $start_xdmcp|sed -e "y/'GKWXDM'/'gkwxdm'/") + case "$start_xdmcp" in + wdm) + # anywhere in use!? + ;; + kdm) + # config is most probably not common in all distros? + # distro specific function config_kdm + config_kdm + ;; + gdm) + # config is most probably not common in all distros? + # distro specific function config_gdm + config_gdm + ;; + *) + # setup xdm (should be the same over the several distros) + echo -e "# /etc/X11/xdm/xdm-config - file generated by\n\ +#\t$0: $date\n\nDisplayManager.errorLogFile:\t/var/log/xdm.errors\n\ +DisplayManager.pidFile:\t\t/var/run/xdm.pid\n\ +DisplayManager.authDir:\t\t/var/lib/xdm\n\ +DisplayManager.keyFile:\t\t/etc/X11/xdm/xdm-keys\n\ +DisplayManager.servers:\t\t/etc/X11/xdm/Xservers\n\ +DisplayManager.accessFile:\t/etc/X11/xdm/Xaccess\n\ +DisplayManager.willing:\t\tsu nobody -c /etc/X11/xdm/Xwilling\n\ +DisplayManager.*.authName:\tMIT-MAGIC-COOKIE-1\n\ +DisplayManager.*.authComplain:\tfalse\n\ +DisplayManager.*.setup:\t\t/etc/X11/xdm/Xsetup\n\ +DisplayManager.*.chooser:\t/etc/X11/xdm/RunChooser\n\ +DisplayManager.*.startup:\t/etc/X11/xdm/Xstartup\n\ +DisplayManager.*.session:\t/etc/X11/xdm/Xsession\n\ +DisplayManager.*.reset:\t\t/etc/X11/xdm/Xreset" \ + >/mnt/etc/X11/xdm/xdm-config + [ "$xdmcp" = "false" ] && echo -e \ + "DisplayManager.requestPort:\t0\n" >>/mnt/etc/X11/xdm/xdm-config + # distro specific function config_xdm (at least for runlevel links) + config_xdm + ;; + esac +fi + +# theming +mkdir -p /mnt/var/lib/openslx/themes +cp -a /usr/share/themes/kdm /usr/share/themes/Xdialog \ + /usr/share/themes/bootsplash /mnt/var/lib/openslx/themes >/dev/null 2>&1 +cp /usr/share/themes/kdm/kdmrc /mnt/etc/opt/kde3/share/config/kdm >/dev/null 2>&1 + +# script run timer +[ $DEBUGLEVEL -eq 8 ] && echo "** SW setup finished at $(sysup)" + +# servconfig finished successfully +echo "finished" > /tmp/svcfg |