# 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 # # configuration script for general SuSE to configure linux stateless clients # (included by init, hwautocfg, servconfig within InitialRamFS after # inclusion of the main functions file). This file is the main base for the # several SuSE distro versions # empty functions are defined at the beginning of /etc/functions # distro specific function called from servconfig script config_distro () { # no need to run start scripts in parallel # enable magic sysrequest for the clients sed -e "1i# /etc/${D_SYSCONFDIR}/sysctl - modified by $0 version $version" \ -e "s,ENABLE_SYSRQ=.*,ENABLE_SYSRQ=\"yes\"," \ -i /mnt/etc/${D_SYSCONFDIR}/sysctl # add specific path /var/X11R6/bin ... echo -e "# stuff generated by $0 (out of InitRamFS 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 "SLX VERSION = $SLXVERSION\nINITRAMFS GENERATION DATE = $date" \ >> /mnt/etc/SuSE-release # create a stateless specific halt script echo -e '#!/bin/sh\n# script generated in InitRamFS (SLX stage3) . /etc/rc.status\n trap "echo" SIGINT SIGSEGV SIGQUIT SIGTERM\nset +e\n\n case "$0" in\n\t*halt) \t message="The system will be halted immediately." \t command="halt -p"\n\t ;;\n\t*reboot)\n \t message="Please stand by while rebooting the system..." \t command="reboot"\n\t ;;\nesac\n rc_reset\ntest -e /etc/init.d/halt.local && { \techo Running /etc/init.d/halt.local\n\t/bin/sh /etc/init.d/halt.local \trc_status -v1 -r\n} echo $message\nexec $command -d -f' > /mnt/etc/${D_INITDIR}/halt # 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 # enable execution of all important start scripts # running stuff in parallel seems to be rather useless and generates some # difficult to solve problems. If you want to try nevertheless enable the # following line and disable the latter one (switching off that feature) sed -e "s,RUN_PARALLEL=.*,RUN_PARALLEL=\"no\"," \ -i /mnt/etc/${D_SYSCONFDIR}/boot # if YaST2 should be runnable (without much effect anyway) on the client testmkd /mnt/var/log/YaST2 echo "$host_name" > /mnt/etc/HOSTNAME } # linking runlevel scripts rllinker () { local script="$1" if [ $2 -lt 10 ] ; then local start="0$2"; else local start="$2" fi if [ $3 -lt 10 ] ; then local stop="0$3"; else local stop="$3" fi # 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 if [ "x$start_ntp" = "xyes" ] ; then rllinker "ntp" 7 14 fi fi } # function for atd config_atd () { if [ "x$start_atd" = "xyes" ]; then rllinker "atd" 14 4 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 2 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 (use syslog-ng for all versions) config_syslog () { if [ "x$start_syslog" != "xno" ] ; then # enable basic logging to console tty10; file logging could be enabled via # setting of config_syslog="file" start_syslog="yes" if [ -f /mnt/etc/${D_INITDIR}/syslog ] ; then sed -e "1i# modified in InitRamFS by $0" \ -e "s,SYSLOG_DAEMON=.*,SYSLOG_DAEMON=\"syslog-ng\"," \ -i /mnt/etc/sysconfig/syslog # logoutput depending on $start_syslog definitions sysngwriter /mnt/etc/syslog-ng/syslog-ng.conf rllinker syslog 2 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/run/sshd testmkd /mnt/var/lib/empty if ! strinfile "sshd:" /mnt/etc/passwd ; then echo -e "sshd:x:117:65534::/var/run/sshd:/usr/sbin/nologin" \ >>/mnt/etc/passwd echo -e "sshd:!:13099:0:99999:7:::" >>/mnt/etc/shadow fi # set permissions with userid #echo -e "\tchown sshd:nogroup /var/run/sshd /var/lib/empty 2>/dev/null" \ # >>/mnt/etc/${D_INITDIR}/boot.slx rllinker "sshd" 25 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 2 testmkd /mnt/var/lib/net-snmp >/dev/null 2>&1 fi # fixme!! # write service monitor depending on services started fi } # configure print server (lpd or cups) config_printer () { if [ "x${start_printdaemon}" != "x" ] && \ [ "x${start_printdaemon}" != "xno" ]; then case ${start_printdaemon} in yes|cups*|CUPS*) rllinker "cups" 25 1 testmkd /mnt/var/spool/cups/tmp #chown -R lp:lp /var/spool/cups ;; lp*|LP*|PLP*) rllinker "lpd" 25 1 testmkd /mnt/var/spool/lpd #chown -R lp:lp /var/spool/lpd ;; *) #logwrite "Do not know print-server $start_printdaemon; \ #specify 'cups' or 'lpd'." ;; esac fi # configure cups printer client, avoid to overwrite admin provided printer # configuration file if [ "x$lpr_servers" != "x" ] && [ ! -e /rootfs/etc/cups/client.conf ] ; then echo -e "# /etc/cups/client.conf - file generated by\n#\t$0:\n\ #\t$date\n#\nServerName\t$lpr_servers" > /mnt/etc/cups/client.conf fi } # configure samba service config_samba () { if [ "$start_samba" != "no" ]; then testmkd /mnt/var/run/samba if [ "$start_samba" = "yes" ] && [ -f /mnt/etc/init.d/smb ] ; then rllinker "smb" 27 2 rllinker "nmb" 28 2 fi # set up samba configuration with NetBIOS name servers etc. if [ "x$netbios_name_servers" != "x" ]; then wins_server="\\twins server = $netbios_name_servers" else wins_server=";\\twins server = 127.0.0.1" fi if [ "x$netbios_workgroup" != "x" ]; then workgroup="workgroup = $new_netbios_workgroup" else workgroup="workgroup = openslx" fi # avoid to overwrite admin provided samba configuration file [ ! -f /rootfs/etc/samba/smb.conf ] && [ -f /mnt/etc/samba/smb.conf ] && \ sed -e "1i# modified in InitRamFS by $0" \ -e "s,\s*netbios name.*,netbios name = ${host_name},g" \ -e "s,\s*interfaces.*,interfaces = ${clientip}/${subnet_mask},g" \ -e "s,;.*wins server.*,$wins_server,g" \ -e "s,\s*workgroup =.*,$workgroup,g" \ -i /mnt/etc/samba/smb.conf; # special kde network discovery service [ -f /mnt/etc/lisarc ] && [ ! -f /rootfs/etc/lisarc ] && sed -e "1i# modified in InitRamFS by $0" \ -e "s,AllowedA.*,AllowedAddresses=${clientip}/${subnet_mask};,g" \ -e "s,BroadcastN.*,BroadcastNetwork=${clientip}/${subnet_mask};,g" \ -e "s,PingAdd.*,PingAddresses=${clientip}/${subnet_mask};,g" \ -i /mnt/etc/lisarc fi } # configure X display manager (/etc/${D_SYSCONFDIR}/displaymanager) config_dm_entry () { local dm="$1" # should be stated that entries were made (fixmee how??) # autologin is defined some other way ... # -e "s,.*_AUTOLOGIN.*,DISPLAYMANAGER_AUTOLOGIN=\"\"," \ 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 in runlevel 5 ln -sf ../xdm /mnt/etc/${D_INITDIR}/rc5.d/S01xdm ln -sf ../xdm /mnt/etc/${D_INITDIR}/rc5.d/K18xdm sed -e "s,xdm: .*,xdm:," -i /mnt/etc/${D_INITDIR}/.depend.start } # 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=${D_XORGBIN} +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 () { # first define directories for kdm kdmrcdir=/etc/opt/kde3/share/config/kdm xdmdir=/etc/X11/xdm testmkd /mnt/${kdmrcdir} config_dm_entry yes # write configuration file # use general config in /etc/functions config_kdm_template } # configure bluetooth services config_bt () { if [ -e /mnt/etc/${D_SYSCONFDIR}/bluetooth ] ; then sed -e "1i# /etc/${D_SYSCONFDIR}/bluetooth - file modified by $0" \ -e "s,START_SERVICES.*,START_SERVICES=\"yes\"," \ -i /mnt/etc/${D_SYSCONFDIR}/bluetooth else : # no bluetooth components installed fi } # 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.slx } # consolefont and language (function run in hwautocfg) consolefont () { echo -e "\tsetfont ${CONSOLE_FONT} >${LOGFILE} 2>&1\n" \ >>/mnt/etc/${D_INITDIR}/boot.slx sed -e "s,RC_LANG=.*,RC_LANG=\"${LANG}\" # added in initrd," \ -i /mnt/etc/${D_SYSCONFDIR}/language } # acpi and powersave daemons, required e.g. to shutdown the machine via # power button, no need for early start config_acpi () { rllinker acpid 22 12 rllinker powersaved 23 11 # dbus is required to run acpid and powersaved start_dreshal="yes" } # 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=5 local stop=18 if [ "x$start_dreshal" = "xyes" ]; then for dir in /var/run/dbus /var/run/resmgr/classes /var/run/hal \ /var/cache/hald /var/lib/PolicyKit; do testmkd /mnt/$dir done 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 # set permissions with userid echo -e "\tchown messagebus:messagebus /var/run/dbus 2>/dev/null" \ >>/mnt/etc/${D_INITDIR}/boot.slx rllinker "dbus" $start $stop fi if [ -f /mnt/etc/${D_INITDIR}/resmgr ] ; then start=$(($start + 1)) stop=$(($stop - 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 echo -n "" > /mnt/var/lib/PolicyKit/reload # set permissions with userid echo -e "\tchown haldaemon:haldaemon /var/run/hal /var/cache/hald \ 2>/dev/null" >>/mnt/etc/${D_INITDIR}/boot.slx start=$(($start + 1)) stop=$(($stop - 1)) rllinker "haldaemon" $start $stop fi fi } # configure automounter (fixme: config version for NFSv4 might be required) config_automount () { if [ -e /mnt/etc/${D_SYSCONFDIR}/autofs ] ; then testmkd /var/lock/subsys sed -e "1i# /etc/${D_SYSCONFDIR}/autofs - file modified by\n#\t$0:\n#" \ -e "s,AUTOFS_OPTIONS.*,AUTOFS_OPTIONS=\"--timeout 3\"," \ -i /mnt/etc/${D_SYSCONFDIR}/autofs rllinker "autofs" 18 4 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" 16 16 else error "$df_errnsc" nonfatal fi } # start portmapper (needed at least for nfs and nis services) config_portmap () { rllinker "portmap" 2 20 } # start NIS config_nis () { if [ -f /mnt/etc/${D_INITDIR}/ypbind ] ; then rllinker "ypbind" 6 16 config_portmap testmkd /mnt/var/yp/nicknames else error "$df_erryp" nonfatal fi } # start vmware config_vmware () { if [ -f /mnt/etc/${D_SYSCONFDIR}/vmware ] ; then rllinker "vmware" 20 2 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 } # Xorg variable settings. Lots of stuff changed since 10.2 displayvars () { Files='\tModulePath\t"/etc/X11/modules"\n \tModulePath\t"/usr/lib/xorg/modules"\n \tFontPath\t"/usr/share/fonts/misc/:unscaled"\n \tFontPath\t"/usr/share/fonts/75dpi/:unscaled"\n \tFontPath\t"/usr/share/fonts/100dpi/:unscaled"' synapticsdrv="/usr/lib/xorg/modules/input/synaptics_drv.so" }