# Description: configuration script for general SuSE 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 several # SuSE distro versions # # Author(s): Dirk von Suchodoletz , 29-07-2006 # # Copyright: (c) 2006 - RZ Universitaet Freiburg # # Version: 0.3.3a # empty functions are defined at the beginning of /etc/functions # 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.1.0\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 } # 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 () { if [ -e /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" "07" "14" 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 rllinker "cron" "18" "02" 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" >/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\"," \ -i /mnt/etc/${D_SYSCONFDIR}/displaymanager # start the display manager as early as possible, but avoid that it is # started twice during bootup ... late_dm can postpone the start of # displaymanager and X if problems with keyboard, console occur ... if [ "x$late_dm" = "xyes" ] ; then ln -sf /etc/${D_INITDIR}/xdm /mnt/etc/${D_INITDIR}/rc5.d/S01xdm ln -sf /etc/${D_INITDIR}/xdm /mnt/etc/${D_INITDIR}/rc5.d/K18xdm sed -e "s,xdm: .*,xdm:," -i /mnt/etc/${D_INITDIR}/.depend.start else ln -sf /etc/${D_INITDIR}/xdm /mnt/etc/${D_INITBOOTD}/S02xdm echo -e "\t(sleep 60; ln -sf ../xdm /etc/${D_INITDIR}/rc5.d/S01xdm; \ rm /etc/${D_INITBOOTD}/S02xdm) &\n" >>/mnt/etc/${D_INITDIR}/boot.ld fi } # 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 local debug="true" else local debug="false" fi # check if a gdm.conf was provided via ConfTGZ if [ ! -f /etc/opt/gnome/gdm/gdm.conf ] ; then 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 +kb -I 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 fi } # configure kdm as display manager config_kdm () { config_dm_entry yes # check if a kdmrc was provided via ConfTGZ [ -f /rootfs/etc/opt/kde3/share/config/kdm/kdmrc ] || \ echo -e "# /etc/opt/kde3/share/config/kdm/kdmrc - \ file generated by\n\ #\t$0: $date\n\ [General]\n\ ConfigVersion=2.3\nStaticServers=:0\nExportList=LANG\n\ PidFile=/var/run/kdm.pid\nAuthDir=/var/lib/xdm/authdir/authfiles/\n\ ServerVTs=-7\nConsoleTTYs=tty1,tty2,tty3,tty4,tty5,tty6\n\n\ [Xdmcp]\n\ Enable=$xdmcp\nXaccess=/etc/X11/xdm/Xaccess\n\ Willing=/etc/X11/xdm/Xwilling\n[Shutdown]\nHaltCmd=/sbin/halt\n\ RebootCmd=/sbin/reboot\n\n\ [X-*-Core]\n\ ServerCmd=/usr/X11R6/bin/X -br\n\ ServerArgsLocal=-nolisten tcp\n\ TerminateServer=true\n\ Resources=/etc/X11/xdm/Xresources\nSetup=/etc/X11/xdm/Xsetup\n\ 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=/etc/X11/xdm/Xstartup\nReset=/etc/X11/xdm/Xreset\n\ Session=/etc/X11/xdm/Xsession\nClientLogFile=.xsession-errors-%s\n\ AutoReLogin=false\nAllowRootLogin=true\n\ AllowNullPasswd=true\nAllowShutdown=All\n\ SessionsDirs=/etc/X11/sessions,/usr/share/xsessions,\ /opt/kde3/share/apps/kdm/sessions,$vmsessions/kdm\n\ AuthNames=XDM-AUTHORIZATION-1,MIT-MAGIC-COOKIE-1\n\n\ [X-*-Greeter]\n\ ShowUsers=Selected\nSelectedUsers=\nUserList=false\n\ GUIStyle=default\nLogoArea=Clock\nGreetString=Diskless Linux (%h)\n\ GreetFont=Nimbus Sans l,20,-1,5,48,0,0,0,0,0\n\ StdFont=Nimbus Sans l,14,-1,5,48,0,0,0,0,0\n\ FailFont=Nimbus Sans l,14,-1,5,74,0,0,0,0,0\n\ AntiAliasing=true\nLanguage=$lang\n\ EchoMode=OneStar\nShowLog=false\n\ UseTheme=true\nTheme=/opt/kde3/share/apps/kdm/themes/SUSE\n\ UseBackground=false\n\ BackgroundCfg=/etc/opt/kde3/share/config/kdm/backgroundrc\n\n\ [X-:*-Greeter]\n\ PreselectUser=None\n\ FocusPasswd=true\nLoginMode=DefaultLocal\n\ AllowClose=false\nUseAdminSession=true\n\n\ [X-:0-Core]\n\ AutoLoginEnable=false\n\ ClientLogFile=.xsession-errors\n\ NoPassEnable=false\n\n\ [X-:0-Greeter]\n\ LogSource=/dev/xconsole\n\ UseAdminSession=false" >/mnt/etc/opt/kde3/share/config/kdm/kdmrc echo -e "" > /mnt/etc/opt/kde3/share/config/kdm/backgroundrc } # 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 } # set up keytable (function run in hwautocfg) # kbd runlevel link is set via config_distro to avoid clashes between # servconfig and hwautocfg settings keytable () { sed -e "s,KEYTABLE=.*,KEYTABLE=\"${KEYTABLE}\"," \ -i /mnt/etc/${D_SYSCONFDIR}/keyboard echo -e "\tloadkeys ${KEYTABLE} >${LOGFILE} 2>&1\n" \ >>/mnt/etc/${D_INITDIR}/boot.ld } # consolefont and language (function run in hwautocfg) 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," \ -i /mnt/etc/${D_SYSCONFDIR}/language } # 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) # runlevel script for haldaemon is now haldaemon instead of hal 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}/haldaemon ] ; 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 "haldaemon" "$start" "$stop" fi fi } # configure automounter config_automount () { if [ -e /mnt/etc/${D_SYSCONFDIR}/autofs ] ; then testmkd /var/lock/subsys 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 rllinker "autofs" "18" "04" else error "$df_erramt" nonfatal fi } # start name service caching daemon config_nscd () { if [ -e /mnt/etc/${D_INITDIR}/nscd ] ; then testmkd /mnt/var/run/nscd rllinker "nscd" "02" "16" else error "$df_errnsc" nonfatal fi } # start portmapper (needed at least for nfs and nis services) config_portmap () { rllinker "portmap" "02" "20" } # start NIS config_nis () { if [ -f /mnt/etc/${D_INITDIR}/ypbind ] ; then rllinker "ypbind" "06" "16" else error "$df_erryp" nonfatal fi } # start vmware config_vmware () { if [ -f /mnt/etc/${D_SYSCONFDIR}/vmware ] ; then 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 # this line should be added to /etc/hotplug.d/usb/50-usb.hotplug # to block linux from handling usb events during vmware sessions sed -e '/USB-specific/{;i\' \ -e 'ps aux |grep -i vmware| grep -v "grep" &>/dev/null && exit 0' \ -e ' }' -i /mnt/etc/hotplug.d/usb/50-usb.hotplug else error "df_errvmw" nonfatal fi } # 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# after you applied changes to the creation scripts you have to \ rerun\n# the mkdxsinitrd script to get them applied\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 }