# Description: configuration script for SuSE 9.3 to configure linux # diskless clients (included by init, hwautocfg, servconfig # within initial ramdisk after inclusion of the main # functions file). This file is the main base for the # following SuSE distributions # # Author(s): Dirk von Suchodoletz , 12-04-2006 # # Copyright: (c) 2006 - RZ Universitaet Freiburg # # Version: 0.2.2b # distro specific stuff to initialize preinit () { # do nothing here (might be needed for other versions) : } postinit () { # for some reason the udev daemon does not create the needed device files udevstart } # distro specific function called from servconfig script config_distro () { # enable magic sysrequest for the clients echo -e "# /etc/${D_SYSCONFDIR}/sysctl - file modified by $0 version $version"\ > /mnt/etc/${D_SYSCONFDIR}/sysctl.new sed -e "s,ENABLE_SYSRQ=.*,ENABLE_SYSRQ=\"yes\"," \ /mnt/etc/${D_SYSCONFDIR}/sysctl > /etc/sysctl cat /etc/sysctl >> /mnt/etc/${D_SYSCONFDIR}/sysctl # add specific path /var/X11R6/bin ... echo -e "# stuff generated by $0 (out of InitRD written $date)\n\ PATH=\"\$PATH:/var/X11R6/bin\"\n\ test \"\$UID\" -ge 100 && PATH=\"\$PATH:.\"\n\ QTDIR=/usr/lib/qt3\nexport QTDIR\nno_proxy='localhost'\n\ export no_proxy" > /mnt/etc/SuSEconfig/profile echo -e "DXS VERSION = 4.0a\nINITRAMFS GENERATION DATE = $date" \ >> /mnt/etc/SuSE-release # add the halt link to the 0 and 6 runlevel directories ln -sf ../halt /mnt/etc/${D_INITDIR}/rc0.d/S20halt ln -sf ../halt /mnt/etc/${D_INITDIR}/rc6.d/S20reboot # if YaST2 should be runnable (without much effect anyway) on the client testmkd /mnt/var/log/YaST2 } # udev/hotplug - auto device discovery service udev_hotplug () { local result=0 [ -d /etc/hotplug -a -d /etc/hotplug.d ] || error "$df_errhotpl" nonfatal echo "Enabling hotplug/udev" udevstart || result=1 udevd -d || result=1 return $result } # linking runlevel scripts rllinker () { local script="$1" local start="$2" local stop="$3" # empty runlevel links - decision on running certain services is # passed via configuration for i in rc3.d/K$stop$script rc5.d/K$stop$script \ rc3.d/S$start$script rc5.d/S$start$script ; do ln -sf ../$script /mnt/etc/${D_INITDIR}/$i done } # group of functions for the normal runlevels - first parameter is start # second stop # function for ntp configuration config_ntp () { local start="07" local stop="14" if [ -f /mnt/etc/${D_INITDIR}/ntp ] ; then if ! strinfile "ntp:" /mnt/etc/passwd ; then echo -e "ntp:x:74:65534:NTP daemon:/var/lib/ntp:/bin/false" \ >>/mnt/etc/passwd echo -e "ntp:!:13099:0:99999:7:::" >>/mnt/etc/shadow fi testmkd /mnt/var/lib/ntp/var/run/ntp &>/dev/null if [ "x$start_ntp" = "xinitial" ] ; then echo -e "\t# entries added by $0 (InitRamFS from $date)\n\ \t( ntpdate -s -b $ntp_servers >${LOGFILE} 2>&1 && {\n\t which \ hwclock &>/dev/null && hwclock -w;} ) &" \ >>/mnt/etc/${D_INITDIR}/boot.ld elif [ "x$start_ntp" = "xyes" ] ; then rllinker "ntp" "$start" "$stop" fi fi } # function for atd config_atd () { if [ "x$start_atd" = "xyes" ]; then rllinker "atd" "14" "04" fi } # function for configuration of cron services config_cron () { if [ "x$start_cron" = "xyes" ] ; then if [ -f /mnt/etc/${D_INITDIR}/cron ] ; then testmkd /mnt/var/spool/cron/lastrun testmkd /mnt/var/spool/cron/tabs echo -e "# /etc/crontab - file generated by $0:\n\ #\t$date\nSHELL=/bin/sh\nPATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin\ \nMAILTO=\n-*/15 * * * *\troot\ttest -x /usr/lib/cron/run-crons && \ /usr/lib/cron/run-crons >/dev/null 2>&1\n" >/mnt/etc/crontab else error "$df_errcron" nonfatal fi fi } # syslog service config_syslog () { if [ "x$start_syslog" = "xyes" ] ; then if [ -f /mnt/etc/${D_INITDIR}/syslog ] ; then # how to configure remote log server? # logging servers might be specified in $log_servers (from e.g. dhcp) echo -e "# File modified by $0 within initial ramdisk" \ > /etc/syslog-ng.conf sed -e "s,.*dhcp/dev.*,,;s,.*named/dev.*,," \ /mnt/etc/syslog-ng/syslog-ng.conf >> /etc/syslog-ng.conf cp /etc/syslog-ng.conf /mnt/etc/syslog-ng/syslog-ng.conf rllinker syslog "02" "20" else error "$df_errsysl" nonfatal fi fi } # secure shell service config_sshd () { if [ "x$start_sshd" = "xyes" ] ; then if [ -f /mnt/etc/${D_INITDIR}/sshd ] ; then testmkd /mnt/var/lib/sshd testmkd /mnt/var/lib/empty rllinker "sshd" "12" "10" else error "$df_errsshd" nonfatal fi fi } # snmp agent for remote monitoring config_snmp () { if [ "x$start_snmp" = "xyes" ] ; then if [ -f /mnt/etc/${D_INITDIR}/snmpd ] ; then rllinker "snmpd" "24" "02" testmkd /mnt/var/lib/net-snmp >/dev/null 2>&1 fi # fixme!! # write service monitor depending on services started fi } # configure X display manager (/etc/${D_SYSCONFDIR}/displaymanager) config_dm_entry () { local dm="$1" # should be stated that entries were made (fixmee how??) sed -e "s,DISPLAYMANAGER=.*,DISPLAYMANAGER=\"$start_xdmcp\"," \ -e "s,.*_XSERVER.*,DISPLAYMANAGER_STARTS_XSERVER=\"$dm\"," \ /mnt/etc/${D_SYSCONFDIR}/displaymanager > /etc/displaymanager cp /etc/displaymanager /mnt/etc/${D_SYSCONFDIR}/displaymanager # start the display manager as early as possible, but avoid that is # started twice during bootup - quickhack ... #ln -sf /etc/${D_INITDIR}/xdm /mnt/etc/${D_INITDIR}/rc5.d/S01xdm ln -sf ../xdm /mnt/etc/${D_INITDIR}/rc5.d/K20xdm echo -e "\t/etc/${D_INITDIR}/xdm start >${LOGFILE} 2>&1\n\ \t( sleep 120; ln -sf ../xdm /etc/${D_INITDIR}/rc5.d/S01xdm \ >${LOGFILE} 2>&1) &\n" >>/mnt/etc/${D_INITDIR}/boot.ld } # configure X display manager (runlevel links and kind of manager) config_xdm () { config_dm_entry yes } # configure gdm as display manager config_gdm () { config_dm_entry yes testmkd /mnt/var/lib/gdm testmkd /mnt/var/log/gdm strinfile "gdm:" /mnt/etc/passwd || echo "gdm:x:50:15:Gnome Display Manager \ Daemon:/var/lib/gdm:/bin/false" >>/mnt/etc/passwd # hack - gdm should be user 50 and shadow group 15 chown 50:15 /mnt/var/lib/gdm /mnt/var/log/gdm chmod 0750 /mnt/var/lib/gdm /mnt/var/log/gdm xdmcp_hosts=`echo $x_display_manager|sed -e "s; ;,;"` if [ "${DEBUGLEVEL}" -gt 0 ] ; then debug="true" else debug="false" fi echo -e "# /etc/opt/gnome/gdm/gdm.conf - file generated by $0\n\ [daemon] AutomaticLoginEnable=false TimedLoginEnable=false #AlwaysRestartServer=false Chooser=/opt/gnome/lib/gdm/gdmchooser Greeter=/opt/gnome/lib/gdm/gdmgreeter RemoteGreeter=/opt/gnome/lib/gdm/gdmgreeter DefaultPath=/usr/local/bin:/usr/bin:/usr/X11R6/bin:/bin:/usr/games:/opt/bin:\ /opt/gnome/bin:/opt/kde3/bin:/opt/kde/bin:/usr/openwin/bin RootPath=/usr/local/bin:/usr/bin:/usr/X11R6/bin:/bin:/usr/local/bin:/usr/bin:\ /usr/X11R6/bin:/bin:/usr/games:/opt/bin:/opt/gnome/bin:/opt/kde3/bin:\ /opt/kde/bin:/usr/openwin/bin:/opt/cross/bin User=gdm Group=shadow #KillInitClients=true LogDir=/var/lib/gdm ServAuthDir=/var/lib/gdm PostLoginScriptDir=/etc/opt/gnome/gdm/PostLogin/ PreSessionScriptDir=/etc/opt/gnome/gdm/PreSession/ PostSessionScriptDir=/etc/opt/gnome/gdm/PostSession/ DisplayInitDir=/etc/opt/gnome/gdm/Init XKeepsCrashing=/etc/opt/gnome/gdm/XKeepsCrashing RebootCommand=/sbin/shutdown -r now HaltCommand=/sbin/shutdown -h now SuspendCommand=/usr/bin/powersave --suspend-to-disk BaseXsession=/etc/opt/gnome/gdm/Xsession SessionDesktopDir=/usr/share/xsessions/:/etc/X11/sessions/:\ /etc/opt/gnome/dm/Sessions/:/opt/gnome/share/gdm/BuiltInSessions/:\ $vmsessions BaseXsession=/etc/opt/gnome/gdm/Xsession UserAuthFBDir=/tmp UserAuthFile=.Xauthority StandardXServer=/usr/X11R6/bin/X Xnest=/usr/X11R6/bin/Xnest -audit 0 -name Xnest [security] AllowRoot=true AllowRemoteRoot=true AllowRemoteAutoLogin=false CheckDirOwner=true #UserMaxFile=65536 RetryDelay=1 #SessionMaxFile=524388 NeverPlaceCookiesOnNFS=true [xdmcp] Enable=$xdmcp HonorIndirect=true MaxPending=4 MaxPendingIndirect=4 MaxSessions=10 MaxWait=15 MaxWaitIndirect=15 DisplaysPerHost=2 Willing=/etc/X11/xdm/Xwilling [gui] #MaxIconWidth=128 #MaxIconWidth=128 [greeter] Browser=false #TitleBar=true MinimalUID=500 Quiver=true Welcome=Welcome to %n LockPosition=true BackgroundImage=0 BackgroundColor=#000000 ShowGnomeFailsafeSession=false ShowXtermFailsafeSession=false ShowLastSession=false Use24Clock=true GraphicalTheme=GDM-SuSE GraphicalTheme=circles GraphicalThemeDir=/opt/gnome/share/gdm/themes/ GraphicalThemeRand=false #SystemMenu=true InfoMsgFile=/opt/gnome/share/gdm/UserInfo InfoMsgFont=monospace 10 SoundOnLogin=false [chooser] HostImageDir=/opt/gnome/share/hosts/ Broadcast=false Multicast=false Hosts=$xdmcp_hosts [debug] Enable=$debug" >/mnt/etc/opt/gnome/gdm/gdm.conf if [ "x$start_x" = "xindirect" ] ; then # when X server consumes to much mem set X -terminate echo -e "\n[servers]\n0=Terminal -audit 0 -indirect \ $host_name\n\n\ [server-Terminal]\nname=Terminal server\ncommand=/usr/X11R6/bin/X \ -audit 0\n\ flexible=true\nhandled=true\nchooser=true" >>/mnt/etc/opt/gnome/gdm/gdm.conf else echo -e "\n[servers]\n0=Standard\n\n\ [server-Standard]\nname=Standard server\ncommand=/usr/X11R6/bin/X\n\ flexible=true\nhandled=true" >>/mnt/etc/opt/gnome/gdm/gdm.conf fi } # configure kdm as display manager config_kdm () { config_dm_entry yes } # configure bluetooth services config_bt () { echo -e "# /etc/${D_SYSCONFDIR}/bluetooth - file modified by $0"\ > /etc/bluetooth sed -e "s,START_SERVICES.*,START_SERVICES=\"yes\"," \ /mnt/etc/${D_SYSCONFDIR}/bluetooth >> /etc/bluetooth cp /etc/bluetooth /mnt/etc/${D_SYSCONFDIR}/bluetooth } # consolefont consolefont () { echo -e "\tsetfont ${CONSOLE_FONT} >${LOGFILE} 2>&1\n" \ >>/mnt/etc/${D_INITDIR}/boot.ld sed -e "s,RC_LANG=.*,RC_LANG=\"${LANG}\" # added in initrd," \ /mnt/etc/${D_SYSCONFDIR}/language > /etc/language cp /etc/language /mnt/etc/${D_SYSCONFDIR}/language } # acpi and powersave config_acpi () { local start_powersave=10 local stop_powersave=12 rllinker powersaved "$start_powersave" "$stop_powersave" } # configure dbus (inter application communication for kde and gnome), hal # (hardware abstraction layer - used e.g. by powersaved) and resmgr # (resource manager - the user gets permissions to devices when loggin on) config_dreshal () { local start="05" local stop="18" if [ "x$start_dreshal" = "xyes" ]; then if [ -f /mnt/etc/${D_INITDIR}/dbus ] ; then strinfile "messagebus:" /mnt/etc/passwd || \ echo "messagebus:x:100:101:User for D-BUS:/var/run/dbus:/bin/false" \ >> /mnt/etc/passwd strinfile "messagebus:" /mnt/etc/group || \ echo "messagebus:!:101:" >> /mnt/etc/group testmkd /mnt/var/run/dbus # set permissions with userid echo -e "\tchown messagebus:messagebus /var/run/dbus 2>/dev/null" \ >>/mnt/etc/${D_INITDIR}/boot.ld rllinker "dbus" "$start" "$stop" fi if [ -f /mnt/etc/${D_INITDIR}/resmgr ] ; then testmkd /mnt/var/run/resmgr/classes start="0"`expr $start + 1` stop="0"`expr $start - 1` rllinker "resmgr" "$start" "$stop" fi if [ -f /mnt/etc/${D_INITDIR}/hal ] ; then strinfile "haldaemon:" /mnt/etc/passwd || \ echo "haldaemon:x:105:103:User for haldaemon:/var/run/hal:/bin/false" \ >> /mnt/etc/passwd strinfile "haldaemon:" /mnt/etc/group || \ echo "haldaemon:!:103:" >> /mnt/etc/group testmkd /mnt/var/run/hal # set permissions with userid echo -e "\tchown haldaemon:haldaemon /var/run/hal 2>/dev/null" \ >>/mnt/etc/${D_INITDIR}/boot.ld start="0"`expr $start + 1` stop="0"`expr $start - 1` rllinker "hal" "$start" "$stop" fi fi } # configure automounter config_automount () { if [ -f /mnt/etc/${D_SYSCONFDIR}/autofs ] ; then testmkd /var/lock/subsys 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:\n" \ > /mnt/etc/auto.misc if [ -n "${automnt_src}" ] ; then # local directory and home directory server from machine-setup [ -z "${automnt_dir}" ] && automnt_dir="/home" strinstr "/" "${automnt_dir}" && error "$df_erratpld" nonfatal automnt_dir=${automnt_dir#/} echo -e "/home\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${automnt_src}/&" \ >> /mnt/etc/auto.${automnt_dir} fi echo -e "# /etc/${D_SYSCONFDIR}/autofs - file modified by\n#\t$0:\n#" \ > /etc/autofs sed -e "s,AUTOFS_OPTIONS.*,AUTOFS_OPTIONS=\"--timeout 3\"," \ /mnt/etc/${D_SYSCONFDIR}/autofs >> /etc/autofs cp /etc/autofs /mnt/etc/${D_SYSCONFDIR}/autofs config_portmap rllinker "autofs" "18" "04" fi } # start name service caching daemon config_nscd () { if [ -f /mnt/etc/${D_INITDIR}/nscd ] ; then testmkd /mnt/var/run/nscd rllinker "nscd" "02" "16" fi } # start portmapper (needed at least for nfs and nis services) config_portmap () { rllinker "portmap" "02" "20" } # start NIS config () { rllinker "ypbind" "06" "16" } # start vmware config_vmware () { rllinker "vmware-prep" "18" "02" rllinker "vmware" "20" "02" # if running start scripts in parallel vmware-prep is not recognized # first solution: just avoid running in parallel #sed 's/PARALLEL=.*/PARALLEL=no/' /mnt/etc/${D_SYSCONFDIR}/boot \ # > /tmp/boot #cp /tmp/boot /mnt/etc/${D_SYSCONFDIR}/boot # second solution: vmware-prep script should be added to .depends.start sed -e "s,TARGETS =,TARGETS = vmware-prep," \ /mnt/etc/${D_INITDIR}/.depend.start >> /etc/.depend.start echo "vmware-prep: " >> /etc/.depend.start cp /etc/.depend.start /mnt/etc/${D_INITDIR}/.depend.start } # initialize runlevel skript to be executed during system startup # (before most of the normal boot init scripts) # this script should operate like a normal runlevel script d_mkrlscript () { local switch="$1" local name="$2" local info="$3" case "$1" in init) echo -e "#!/bin/sh\n# skeleton of /etc/${D_INITDIR}/$name created \ by $0\n. /etc/rc.status\n. /etc/${D_SYSCONFDIR}/logfile\nrc_reset\ncase \ \"\$1\" in\n start)\n\techo -n \"$info\"" >>/mnt/etc/${D_INITDIR}/$name chmod u+x /mnt/etc/${D_INITDIR}/$name ;; close) echo -e "\trc_status -v\n\t;;\n stop)\n\t;;\nesac\nrc_exit" \ >>/mnt/etc/${D_INITDIR}/$name ;; esac }