#! /bin/sh
#
# Author: Matt Zimmerman <mdz@ubuntu.com>
#
### BEGIN INIT INFO
# Provides: ltsp-client-setup
# Required-Start: mountvirtfs $local_fs
# Required-Stop: mountvirtfs $local_fs
# Default-Start: S 1 2 3 4 5
# Default-Stop: 0 6
# Short-Description: Script for LTSP client initialization
# Description:
### END INIT INFO
set -e
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="LTSP client setup"
NAME=ltsp-client-setup
SCRIPTNAME=/etc/init.d/$NAME
# Gracefully exit if the package has been removed.
test -f /usr/lib/ltsp/ltsp_functions || exit 0
. /lib/lsb/init-functions
. /usr/lib/ltsp/ltsp_functions
. /usr/lib/ltsp/ltsp_config
test -f /etc/default/ltsp-client-setup && . /etc/default/ltsp-client-setup
load_modules() {
for module in $(env | awk -F= '$1 ~ /^MODULE_/ { print $2 }'); do
modprobe $module
done
}
configure_localdev() {
if [ -n "$LOCALDEV" ]; then
if [ ! -d /var/run/drives ];then
mkdir /var/run/drives
fi
/usr/bin/ltspfsd -a
# cdrom devices are handled by the cdpingerponger
/usr/sbin/cdpinger cdrom # default for usb cdroms
# and start one for every additional cdrom device
if [ -L /dev/cdrom?* ];then
for CDDEV in $(ls /dev/cdrom?*); do
/usr/sbin/cdpinger $(basename ${CDDEV})
done
fi
# handle already plugged devices on login
/usr/sbin/delayed_mounter
fi
}
configure_console() {
if [ -n "$CONSOLE_KEYMAP" ]; then
loadkeys "$CONSOLE_KEYMAP"
fi
}
configure_swap() {
if [ -n "$NBD_SWAP" ];then
if [ -z "$SWAP_SERVER" -a -z "$NBD_PORT" ]; then
SWAP_SERVER=server
NBD_PORT=9572
fi
cat <<EOF > /etc/nbd-client
NBD_DEVICE[0]=/dev/nbd0
NBD_TYPE[0]=s
NBD_HOST[0]=$SWAP_SERVER
NBD_PORT[0]=$NBD_PORT
NBD_TYPE[0]=s
EOF
if [ "$USE_LOCAL_SWAP" = "Y" ]; then
# Enable local swap partition if found on local disk
for part in `sfdisk -l 2>/dev/null | awk '/ 82 / { print $1}'`; do
mkswap $part
swapon $part
done
fi
fi
}
configure_resolver() {
hostname=$(hostname)
if [ "(none)" = "$hostname" ] ; then
/etc/init.d/hostname.sh start
hostname="$(hostname)"
else
echo $hostname > /etc/hostname
fi
cat <<EOF > /etc/hosts
127.0.0.1 localhost
127.0.0.2 $hostname
$SERVER server
EOF
if [ -f /etc/hosts.ltsp ]; then
cat /etc/hosts.ltsp >> /etc/hosts
fi
if [ -n "$DNS_SERVER" -a -n "$SEARCH_DOMAIN" ]; then
cat <<EOF > /etc/resolv.conf
search $SEARCH_DOMAIN
nameserver $DNS_SERVER
EOF
fi
}
configure_network() {
cat <<EOF > /etc/network/interfaces
auto lo
iface lo inet loopback
EOF
}
configure_printer() {
if [ -n "$PRINTER_0_DEVICE" ]; then
/usr/lib/ltsp/start_printer 0 &
fi
}
configure_syslog() {
cat <<EOF > /etc/syslog.conf
*.* @${SYSLOG_HOST-$SERVER}
EOF
}
configure_fstab() {
echo "/dev/root / unionfs defaults 0 0" > /etc/fstab
echo "tmpfs /tmp tmpfs defaults,nosuid,nodev 0 0" >> /etc/fstab
mount /tmp
}
# muzso: preseed() has been modified to only collect commands in a variable
# and does not pipe them instantly to debconf-communicate
# We do this at the end in one batch.
preseed() {
question="$1"
value="$2"
if [ -n "$value" ]; then
if [ -n "$debconf_commands" ]; then
debconf_commands="${debconf_commands}\n"
fi
debconf_commands="${debconf_commands}set $question $value"
debconf_commands="${debconf_commands}\nfset $question seen true"
fi
}
configure_x() {
if [ -z "$xserver_package" ]; then
# set default xserver
if [ -d /usr/share/doc/xserver-xorg/ ]; then
xserver_package="xserver-xorg"
elif [ -d /usr/share/doc/xserver-xfree86/ ]; then
xserver_package="xserver-xfree86"
else
echo "WARNING: no known xserver detected"
return
fi
fi
# set default configuration file
case $xserver_package in
xserver-xfree86) xserver_config="/etc/X11/XF86Config-4" ;;
xserver-xorg) xserver_config="/etc/X11/xorg.conf" ;;
esac
if [ -n "$XF86CONFIG_FILE" ]; then
# User has specified a custom config
cp "$XF86CONFIG_FILE" "$xserver_config"
else
# Autoconfigure
if [ -n "$(which xdebconfigurator)" ]; then
xdebconfigurator
fi
# Handle overrides of specific parameters
if [ -n "$XSERVER" ] && [ "$XSERVER" != "auto" ]; then
preseed $xserver_package/autodetect_video_card "false"
preseed $xserver_package/config/device/driver "$XSERVER"
fi
X_USE_SYNC_RANGES=${X_USE_SYNC_RANGES:-Y}
if [ -n "$X_HORZSYNC" ] && [ -n "$X_VERTREFRESH" ]; then
preseed $xserver_package/autodetect_monitor "false"
preseed $xserver_package/config/monitor/selection-method "Advanced"
preseed $xserver_package/config/monitor/vert-refresh "$X_VERTREFRESH"
preseed $xserver_package/config/monitor/horiz-sync "$X_HORZSYNC"
if [ Y = "$X_USE_SYNC_RANGES" ]; then
preseed $xserver_package/config/monitor/use_sync_ranges "true"
else
preseed $xserver_package/config/monitor/use_sync_ranges "false"
fi
fi
# Color depth preseeding
if [ -n "$X_COLOR_DEPTH" ]; then
preseed $xserver_package/config/display/default_depth "$X_COLOR_DEPTH"
fi
# set compatbility for X_VIDEORAM with ltsp 4.x
X_VIDEO_RAM=${X_VIDEO_RAM:-"$X_VIDEORAM"}
# set video ram
if [ -n "$X_VIDEO_RAM" ]; then
preseed $xserver_package/config/device/video_ram "$X_VIDEO_RAM"
fi
# Mouse preseeding options. Use inputattach if available
if type inputattach >/dev/null 2>/dev/null ; then
if [ $(echo "$X_MOUSE_DEVICE" | awk '/\/dev\/ttyS[0-9]/') ] && \
[ i386 = $(dpkg --print-architecture) ] && \
[ -n "$X_MOUSE_PROTOCOL" ]; then
inputattach --"$X_MOUSE_PROTOCOL" "$X_MOUSE_DEVICE" &
fi
else
if [ -n "$X_MOUSE_DEVICE" ]; then
preseed $xserver_package/config/inputdevice/mouse/port "$X_MOUSE_DEVICE"
fi
if [ -n "$X_MOUSE_PROTOCOL" ]; then
preseed $xserver_package/config/inputdevice/mouse/protocol "$X_MOUSE_PROTOCOL"
fi
fi
if [ -n "$X_MOUSE_EMULATE3BTN" ]; then
preseed $xserver_package/config/inputdevice/mouse/emulate3buttons "$X_MOUSE_EMULATE3BTN"
fi
X_MODE=$( echo "$X_MODE_0 $X_MODE_1 $X_MODE_2" | sed -r 's/ +/, /g;s/, *$//g')
if [ -n "$X_MODE" ]; then
preseed $xserver_package/config/display/modes "$X_MODE"
fi
# This require fontserver preseeding to work (Debian bug
# #323262, fixed in xorg-x11 version 6.8.99.901.dfsg.1-1).
# Also done using code in screen.d/startx and screen.d/ldm until
# the xorg-x11 version make it into unstable and testing.
if [ Y = "${USE_XFS}" ] ; then
if [ -z "${XFS_SERVER}" ] ; then
XFS_SERVER="${SERVER}"
fi
preseed $xserver_package/config/fontpath/fontserver "tcp/${XFS_SERVER}:7100"
fi
# Make sure xkb values only get preseeded if the variables are actually set
# (saves boottime to not call debconf-communicate on every empty value)
if [ -n "$XKBLAYOUT" ]; then
preseed $xserver_package/config/inputdevice/keyboard/layout "$XKBLAYOUT"
fi
if [ -n "$XKBMODEL" ]; then
preseed $xserver_package/config/inputdevice/keyboard/model "$XKBMODEL"
fi
if [ -n "$XKBRULES" ]; then
preseed $xserver_package/config/inputdevice/keyboard/rules "$XKBRULES"
fi
if [ -n "$XKBOPTIONS" ]; then
preseed $xserver_package/config/inputdevice/keyboard/options "$XKBOPTIONS"
fi
if [ -n "$XKBVARIANT" ]; then
preseed $xserver_package/config/inputdevice/keyboard/variant "$XKBVARIANT"
fi
# muzso: saving "preseeded" values
if [ -n "$debconf_commands" ]; then
echo $debconf_commands | debconf-communicate $xserver_package
fi
# Autoconfigure using dexconf when using xdebconfigurator, or X
# package postinst if not. Using dexconf directly might save
# some memory on the client.
if [ -n "$(which xdebconfigurator)" ] &&
[ "$root_write_method" = "bind_mounts" ]; then
# Using dexconf instead of reconfigure to save memory ?
dexconf -o $xserver_config
else
dpkg-reconfigure -fnoninteractive -pcritical $xserver_package
fi
fi
}
bind_mounts () {
# set defaults
test -z "$tmpfs_dir" && tmpfs_dir=/var/lib/ltsp-client-setup
test -z "$rw_dirs" && rw_dirs="/var/cache/man /var/lib/xkb /var/lock /var/run /var/log /var/spool /var/tmp /tmp /var/lib/discover"
test -z "$copy_dirs" && copy_dirs=""
test -z "$temp_copy_dirs" && temp_copy_dirs="/var/cache/debconf"
test -z "$bindfiles" && bindfiles="/etc/X11/xorg.conf /etc/X11/XF86Config-4"
mount -t tmpfs -o mode=0755 tmpfs $tmpfs_dir
# preserve directory structure
for d in $rw_dirs ; do
if [ -d "$d" ]; then
cd $tmpfs_dir
tar --no-recursion -cpf - $(find $d -type d 2> /dev/null) 2> /dev/null | tar xpf -
mount --bind $tmpfs_dir/$d $d
else
echo "WARNING: $d does not exist"
fi
done
# copy contents into tmpfs
for d in $copy_dirs $temp_copy_dirs; do
if [ -d "$d" ]; then
cd $tmpfs_dir
tar -cpf - $d 2> /dev/null | tar xpf -
mount --bind $tmpfs_dir/$d $d
else
echo "WARNING: $d does not exist"
fi
done
# mount one file on top of another
for f in $bindfiles ; do
if [ -e "$f" ]; then
mkdir -p "$(dirname $tmpfs_dir/$f)"
cp $f $tmpfs_dir/$f
mount --bind $tmpfs_dir/$f $f
else
echo "WARNING: $f does not exist"
fi
done
}
bind_unmounts() {
for dir in $temp_copy_dirs; do
umount $dir
rm -rf $tmpfs_dir/${dir#/}
done
}
run_rcfiles() {
for rcfile in $(env | sort | awk -F= '$1 ~ /^RCFILE_/ { print $2 }'); do
if [ -x "$rcfile" ]; then
"$rcfile" $@
fi
done
}
case "$1" in
start)
log_begin_msg "Setting up LTSP client..."
type usplash_write >/dev/null 2>/dev/null && usplash_write "TIMEOUT 120" || true
if [ "$root_write_method" = "bind_mounts" ]; then
bind_mounts
fi
load_modules || true
configure_console || true
configure_network || true
configure_resolver || true
configure_swap || true
configure_syslog || true
configure_fstab || true
run_rcfiles || true
configure_x || true
configure_localdev ||true
configure_printer || true
if [ "$root_write_method" = "bind_mounts" ]; then
bind_unmounts
fi
log_end_msg 0
;;
stop)
# echo -n "Stopping $DESC: $NAME"
# d_stop
# echo "."
;;
restart|force-reload)
#
# If the "reload" option is implemented, move the "force-reload"
# option to the "reload" entry above. If not, "force-reload" is
# just the same as "restart".
#
echo -n "Restarting $DESC: $NAME"
d_stop
sleep 1
d_start
echo "."
;;
*)
# echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
exit 1
;;
esac
exit 0