# 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,TARGETS =,TARGETS = xdm boot.slx," \
# -i /mnt/etc/${D_INITDIR}/.depend.boot
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 &>/dev/null
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
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/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 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, 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 ...
# might be connected to running startup scripts in parallel, see above ...
if [ "x$late_dm" = "xno" ] ; then
ln -sf /etc/${D_INITDIR}/xdm /mnt/etc/${D_INITBOOTD}/S12boot.xdm
echo -e "\t(sleep 60; ln -sf ../xdm /etc/${D_INITDIR}/rc5.d/S01xdm; \
rm /etc/${D_INITBOOTD}/S12boot.xdm) &\n" >>/mnt/etc/${D_INITDIR}/boot.slx
else
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
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=${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
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.slx
rllinker "dbus" $start $stop
fi
if [ -f /mnt/etc/${D_INITDIR}/resmgr ] ; then
testmkd /mnt/var/run/resmgr/classes
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
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.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 changes for newer Xorg servers
displayvars () {
synapticsdrv="/usr/X11R6/lib/modules/input/synaptics_drv.o"
}