#!/bin/bash # # Fix things during bootup - run last # # Urs Beyerle, PSI # ### ----------------------------------------------------------- ### definitions ### ----------------------------------------------------------- # dir of mounted live system: /$MOUNTDIR/live MOUNTDIR=livecd # source functions . /$MOUNTDIR/live/liblinuxlive . /etc/init.d/functions ### ----------------------------------------------------------- ### Get boot parameters ### ----------------------------------------------------------- # root on NFS? NFSROOT=$( cmdline_value nfsroot ) # NFS Server NFSSERVER=$( echo $NFSROOT | cut -d":" -f1 ) # no local user? NOLOCAL=$( cmdline_parameter nolocal ) # no root user? NOROOT=$( cmdline_parameter noroot ) # no localadmin? NOADMIN=$( cmdline_parameter noadmin ) LocalAdminGroup=localadmin # set password PASSWD=$( cmdline_value passwd ) [ ! $PASSWD ] && PASSWD=$( cmdline_value pw ) # no password = empty password ? NOPASSWD=$( cmdline_parameter nopasswd ) # keyboard layout (kb= or keyboard=) KEYBOARD=$( cmdline_value keyboard ) KB=$( cmdline_value kb ) # PSI setup? PSI=$( cmdline_parameter psi ) # cups server CUPS=$( cmdline_value cups ) # no X11 NOX=$( cmdline_parameter nox ) # failsafe X server SIMPLEX=$( cmdline_parameter simplex ) # NVIDIA driver NVIDIA=$( cmdline_parameter nvidia ) if [ "$XDRIVER" = "nvidia" ]; then NVIDIA=nvidia fi # force NO NVIDIA driver - will overwite NVIDIA option NONVIDIA=$( cmdline_parameter nonvidia ) # VESA driver VESA=$( cmdline_parameter vesa ) # force to use a video driver ? XDRIVER=$( cmdline_value xdriver ) # Xserver configurations HSYNC=$( cmdline_value hsync ) VSYNC=$( cmdline_value vsync ) SCREEN=$( cmdline_value screen ) # no SWAP NOSWAP=$( cmdline_parameter noswap ) # should we auto mount all found devices? AUTOMOUNT=$( cmdline_parameter automount ) if [ $AUTOMOUNT ]; then MOUNTOPT="auto,users" else MOUNTOPT="noauto,users,ro" fi # folder where we find data which was previously stored # (normally on a usbstick, but can be partition) if [ $PSI ]; then SAVEFOLDER=PSI_LIVECD else SAVEFOLDER=SL_LIVECD fi # local home partition? # (e.g. /dev/hda1, /dev/hda1:/my_home) HOMELOCAL=$( cmdline_value home ) # fast booting ? FASTBOOT=$( cmdline_parameter fastboot ) # start afs? AFS=$( cmdline_parameter afs ) # or force no afs [ $( cmdline_parameter noafs ) ] && AFS="" # turn of sound (volume=0) NOSOUND=$( cmdline_parameter nosound ) # local user name? LOCALUSER=$( cmdline_value user ) # hostname? HOSTNAME=$( cmdline_value hostname ) # do we have defined a configuration directory? CONFIG=$( cmdline_value config ) # do not udpate fstab? NOFSTAB=$( cmdline_parameter nofstab ) # kde/gnome as desktop GNOME=$( cmdline_parameter gnome ) KDE=$( cmdline_parameter kde ) ### ----------------------------------------------------------- ### Improved hardware detection ### ----------------------------------------------------------- ### Improved graphic card detection? if [ ! $SIMPLEX ]; then ### Intel Mobile 945GM lspci | grep -q VGA.*Intel.*Mobile.*945GM if [ "$?" = "0" ]; then I945GM=i945gm ## not yet supported by i810 driver ## [ $XDRIVER ] || XDRIVER=i810 I915RESOLUTION=on fi ### Intel Mobile 915GM lspci | grep -q VGA.*Intel.*Mobile.*915GM if [ "$?" = "0" ]; then I915GM=i915gm [ $XDRIVER ] || XDRIVER=i810 I855RESOLUTION=on fi ### Intel Mobile 855GM lspci | grep -q VGA.*Intel.*855GM if [ "$?" = "0" ]; then I855GM=i855gm I855RESOLUTION=on fi fi ### ----------------------------------------------------------- ### Main ### ----------------------------------------------------------- ### try load fuse kernel module modprobe fuse 2>/dev/null ### activate SWAP # delete all swap lines in fstab sed -i -e "/ swap /d" /etc/fstab # search for swap partition fdisk -l > /var/log/fdisk swap_part=$( fdisk -l 2>/dev/null | grep -i "Linux swap" \ | grep "^/dev/" | cut -f 1 -d " " | head -1 ) # add to /etc/fstab and activate SWAP if [ $swap_part ] && [ ! $NOSWAP ]; then echo "$swap_part swap swap defaults 0 0" >>/etc/fstab # activate SWAP swapoff -a swapon -a -e fi ### MAC Address of eth0 MAC_ETH0=$( ifconfig | grep eth0 | awk '{print $5}' ) ### Get CONFIG_FOLDER for this machine from NFS Server (if existing) # and copy it to /$MOUNTDIR if [ $NFSSERVER ] && [ $CONFIG ]; then mkdir -p /mnt/config echo "Search for configuration files on the server ..." /etc/init.d/portmap start >/dev/null mount -t nfs $NFSSERVER:$CONFIG /mnt/config 2>/dev/null if [ "$?" != "0" ]; then echo "Could not mount $NFSSERVER:$CONFIG." else if [ -d /mnt/config/$MAC_ETH0 ]; then CONFIG_FOLDER=/$MOUNTDIR/config mkdir -p $CONFIG_FOLDER cp -a /mnt/config/$MAC_ETH0/* /$CONFIG_FOLDER/ 2>/dev/null if [ "$?" != "0" ]; then echo "Could not get $NFSSERVER:$CONFIG/$MAC_ETH0" CONFIG_FOLDER="" else echo "Found configuration files on the server." fi fi umount /mnt/config fi /etc/init.d/portmap stop >/dev/null fi ### search for partitions and update fstab ### and look for $SAVEFOLDER (previously stored data) if [ ! $FASTBOOT ] && [ ! $NOFSTAB ]; then echo "Update /etc/fstab ..." # disable kernel messages during mount/unmount echo 0 > /proc/sys/kernel/printk DEVICES=$( list_partition_devices ) for DEVICE in $DEVICES; do # try to mount the device and unmount it. # If OK, we can add it to fstab DEV=$( echo $DEVICE | cut -d"/" -f 3 ) if [ $DEV ]; then mkdir -p /mnt/$DEV mount $DEVICE /mnt/$DEV >/dev/null 2>&1 # search for $SAVEFOLDER if [ -d /mnt/$DEV/$SAVEFOLDER ]; then FOUND_RESTORE_DEV=/dev/$DEV echo "Found folder '$SAVEFOLDER' on $FOUND_RESTORE_DEV" fi # unmount again umount /mnt/$DEV >/dev/null 2>&1 # if sucsessful add to fstab, if not already done if [ "$?" = "0" ]; then grep -q "^$DEVICE " /etc/fstab if [ "$?" != "0" ]; then echo -e "$DEVICE \t /mnt/$DEV \t auto \t $MOUNTOPT,suid,dev,exec 0 0" >> /etc/fstab fi else rmdir /mnt/$DEV 2>/dev/null fi fi done # enable kernel messages again echo 6 > /proc/sys/kernel/printk fi ### if $SAVEFOLDER found, set $CONFIG_FOLDER and mount $FOUND_RESTORE_MNT if [ $FOUND_RESTORE_DEV ]; then FOUND_RESTORE_MNT=$( grep "^$FOUND_RESTORE_DEV " /etc/fstab | awk '{ print $2 }' ) CONFIG_FOLDER=$FOUND_RESTORE_MNT/$SAVEFOLDER echo "Will restore data from $CONFIG_FOLDER" mount $FOUND_RESTORE_MNT fi ### source the file "config", if found in $CONFIG_FOLDER if [ -f $CONFIG_FOLDER/config ]; then . $CONFIG_FOLDER/config fi ### do we have a shadow/passwd file in $FOUND_FOULDER if [ -r $CONFIG_FOLDER/passwd.tar.gz ] && [ -r $CONFIG_FOLDER/shadow.tar.gz ]; then # we do not need a password for local user and root NOLOCAL=nolocal NOROOT=noroot fi ### set local user name and default hostname if [ $PSI ]; then [ $LOCALUSER ] || LOCALUSER=l_psi DEFAULT_HOSTNAME=psi else [ $LOCALUSER ] || LOCALUSER=sluser DEFAULT_HOSTNAME=slinux fi ### start 855resolution? [ $I855RESOLUTION ] && /etc/init.d/855resolution start 2>/dev/null ### start 915resolution? [ $I915RESOLUTION ] && /etc/init.d/915resolution start 2>/dev/null ### configure Xserver ### check for xorg.conf in CONFIG_FOLDER if [ -r $CONFIG_FOLDER/xorg.conf ]; then cp -af $CONFIG_FOLDER/xorg.conf /etc/X11/xorg.conf if [ "$?" = "0" ]; then echo "Saved xorg.conf file found." XDRIVER="" HAVE_XORG_CONF="yes" fi fi ### use vesa driver? if [ $VESA ]; then echo "Force to use VESA driver!" video_driver="--set-driver=vesa" else video_driver="" fi ### force an other video driver? if [ $XDRIVER ]; then echo "Force to use $XDRIVER driver!" video_driver="--set-driver=$XDRIVER" fi ### run system-config-display if [ -x /usr/bin/system-config-display ]; then echo "Configure Xserver:" if [ ! $HAVE_XORG_CONF ]; then if [ ! $SIMPLEX ]; then # default values [ ! $HSYNC ] && HSYNC="30.0-80.0" [ ! $VSYNC ] && VSYNC="50.0-90.0" [ ! $SCREEN ] && SCREEN="1280x1024" system-config-display \ --reconfig \ --set-resolution=$SCREEN \ --set-hsync=$HSYNC \ --set-vsync=$VSYNC \ $video_driver else echo "Use simple Xserver configuration." system-config-display --noui --reconfig fi fi fi ### enable NVIDIA driver (needs nvidia, nvidia-libs rpms) if [ $NVIDIA ] && [ ! $NONVIDIA ]; then # serach for Nvidia Video Card /sbin/lspci | grep VGA | grep -i -q nvidia if [ "$?" = "0" ]; then # lib or lib64 ? LIB=lib [ $( arch ) = "x86_64" ] && LIB=lib64 # find out installed Nvidia driver version libglx=$( ls /usr/X11R6/$LIB/modules/extensions/libglx.so.1.* | head -n 1 ) nvidia_version=${libglx##*.so.1.} # enable Nvidia driver (normally done by nvidia-enable - does not work on LiveCD) echo -n "NVIDIA graphic card found. Enable the nvidia driver ${nvidia_version} ... " NVLOG=/var/log/nvidia.log # assuming that the kernel modules are already build # link to Nvidia libs ln -sf ../../usr/X11R6/$LIB/libGL.so.1.${nvidia_version} /usr/$LIB/libGL.so ln -sf libGL.so.1.${nvidia_version} /usr/X11R6/$LIB/libGL.so rm -f /usr/X11R6/$LIB/modules/extensions/libGLcore.a rm -f /usr/X11R6/$LIB/modules/extensions/libglx.a ln -sf libglx.so.1.${nvidia_version} /usr/X11R6/$LIB/modules/extensions/libglx.so # reconfigure X /usr/sbin/nvidia-xconfig >> $NVLOG 2>&1 if [ $PSI ]; then echo 'NVIDIA=on' >> /etc/sysconfig/cfengine fi echo "ok." fi fi ### set special video driver options for Intel Mobile # (external VGA output: Clone) if [ $I915GM ] || [ $I855GM ]; then sed -e "/Section[ \t]*\"Device\"/,/EndSection/{ /^[ \t]*Option[ \t]*\"MonitorLayout\"/d /^[ \t]*Option[ \t]*\"Clone/d /EndSection/i\\ Option \"MonitorLayout\" \"CRT,LFP\"\\ Option \"Clone\" \"1\"\\ Option \"CloneRefresh\" \"60\" }" -i /etc/X11/xorg.conf fi # Set BoardName for Intel 915GM if [ $I915GM ]; then sed -i 's/BoardName.*VESA driver.*/BoardName "Intel 915"/' /etc/X11/xorg.conf fi ### parameter KB = KEYBOARD KEYBOARD=$KB ### ask user for keyboard layout if no keyboard given if [ -x /usr/bin/system-config-keyboard ]; then if [ ! $KEYBOARD ]; then MORE_LAYOUTS="more..." keytables="U.S...........(us) \ Swiss-German..(sg-latin1) \ Swiss-French..(fr_CH-latin1) \ German........(de-latin1) \ Japanese......(jp106) \ $MORE_LAYOUTS" PS3="-> " echo echo "Please choose keyboard layout (type 1-6):" select KEYBOARD in $keytables; do case $KEYBOARD in *) # extract keyboard layout string from $KEYBOARD KEYBOARD=${KEYBOARD##*(} KEYBOARD=${KEYBOARD%%)} break ;; esac done fi fi ### set keyboard if [ -x /usr/bin/system-config-keyboard ]; then if [ "$KEYBOARD" = "$MORE_LAYOUTS" ]; then system-config-keyboard --text else echo -n "Set keyboard to '$KEYBOARD', please wait ... " system-config-keyboard --noui $KEYBOARD >/dev/null 2>&1 echo "done." fi echo fi ### update AFS users and SEPP links (only for PSI) if [ $PSI ] && [ $AFS ]; then echo "Update AFS users and SEPP links..." [ -x /afs/psi.ch/sys/common/update_user.pl ] && /afs/psi.ch/sys/common/update_user.pl >/dev/null 2>&1 & [ -x /afs/psi.ch/sys/common/update_sepp.pl ] && /afs/psi.ch/sys/common/update_sepp.pl >/dev/null 2>&1 & sleep 1 echo fi ### create local user, if "nolocal" is not set if [ ! $NOLOCAL ]; then user=$LOCALUSER # execute useradd twice, to make it work (don't know why) if [ $PSI ] && [ ! $NOADMIN ]; then userdel -r $user 2>/dev/null useradd -G $LocalAdminGroup $user 2>/dev/null userdel -r $user 2>/dev/null useradd -G $LocalAdminGroup $user else userdel -r $user 2>/dev/null useradd $user 2>/dev/null userdel -r $user 2>/dev/null useradd $user fi # only for PSI: change users's group to GID=UID+50000 if [ $PSI ]; then uid=$( id -u $user ) old_gid=$( id -g $user ) new_gid=$(( $old_gid + 50000 )) # fix /etc/group sed -i "s/${user}:x:${old_gid}:/${user}:x:${new_gid}:/" /etc/group # fix /etc/passwd sed -i "s/${user}:x:${uid}:${old_gid}:/${user}:x:${uid}:${new_gid}:/" /etc/passwd # fix perm of /home/${user) chgrp -R $user /home/${user} fi fi ### copy special files for PSI user l_psi if [ $PSI ] && [ ! $NOLOCAL ]; then find /usr/share/${LOCALUSER}/ -maxdepth 1 -mindepth 1 2>/dev/null | \ while read dir; do cp -a $dir /home/${LOCALUSER}/ done # set owner chown -R ${LOCALUSER}.${LOCALUSER} /home/${LOCALUSER} fi ### set password for root and local user if [ ! $NOPASSWD ]; then if [ ! $NOROOT ] || [ ! $NOLOCAL ]; then echo -n "Set password for " if [ ! $NOROOT ]; then echo -n "'root' " fi if [ ! $NOROOT ] && [ ! $NOLOCAL ]; then echo -n "and " fi if [ ! $NOLOCAL ]; then echo -n "local user '$user' " fi echo if [ ! $NOLOCAL ]; then echo "Login as local user '$user' with this password." echo fi # set password, if not yet given by $PASSWD until [ $PASSWD ]; do echo -n "Password: " read -s PASSWD echo done if [ ! $NOROOT ]; then echo $PASSWD | passwd --stdin root >/dev/null fi if [ ! $NOLOCAL ]; then echo $PASSWD | passwd --stdin $user >/dev/null fi echo fi else # set root and $LOCALUSER to empty password sed -i "s|^root:.*|root::12345:0:99999:1:::|" /etc/shadow sed -i "s|^$LOCALUSER:.*|$LOCALUSER::12345:0:99999:1:::|" /etc/shadow fi ### try to get hostname from DNS, if not yet defined if [ ! $HOSTNAME ]; then echo "Try to get hostname from DNS ..." IP=$( /sbin/ip add show dev eth0 2>/dev/null | grep "inet " | cut -d" " -f6 | sed 's|/.*||' ) if [ "$IP" = "" ]; then IP=$( /sbin/ip add show dev eth1 2>/dev/null | grep "inet " | cut -d" " -f6 | sed 's|/.*||' ) fi if [ "$IP" != "" ]; then host -W 1 $IP >/dev/null 2>&1 if [ "$?" = "0" ]; then HOSTNAME=$( host -W 1 $IP | cut -d" " -f 5 | cut -d"." -f 1 ) if [ "$HOSTNAME" = "3(NXDOMAIN)" ]; then HOSTNAME=$DEFAULT_HOSTNAME fi if [ "$HOSTNAME" = "no" ]; then HOSTNAME=$DEFAULT_HOSTNAME fi fi fi fi ### define default hostname, if $HOSTNAME still not yet set if [ ! $HOSTNAME ]; then HOSTNAME=$DEFAULT_HOSTNAME fi ### set hostname for eth0 or eth1 export HOSTNAME=$HOSTNAME hostname $HOSTNAME sed -i "s/HOSTNAME=.*/HOSTNAME=${HOSTNAME}/" /etc/sysconfig/network if [ $PSI ]; then sed -i "s/hostname=.*/hostname=${HOSTNAME}.psi.ch/" /etc/ssmtp/ssmtp.conf sed -i "s/HOSTNAME=.*/HOSTNAME=${HOSTNAME}/" /etc/sysconfig/cfengine fi echo "DHCP_HOSTNAME=${HOSTNAME}" >> /etc/sysconfig/networking/devices/ifcfg-eth0 echo "DHCP_HOSTNAME=${HOSTNAME}" >> /etc/sysconfig/networking/devices/ifcfg-eth1 echo "Hostname set to: $HOSTNAME" echo ### set cups server if [ $CUPS ]; then sed -i "s|.*ServerName .*|ServerName $CUPS|" /etc/cups/client.conf fi ### some magic: just access this file in order that it can be sourced later ls -lag /etc/X11/xinit/xinitrc-common >/dev/null 2>&1 sleep 1 ### set keyboard for rdesktop if [ -e /etc/X11/xorg.conf ]; then grep -q de_CH /etc/X11/xorg.conf && RDESKTOP_OPT="-k de-ch" grep -q fr_CH /etc/X11/xorg.conf && RDESKTOP_OPT="-k fr-ch" grep -q jp106 /etc/X11/xorg.conf && RDESKTOP_OPT="-k ja" fi if [ "$RDESKTOP_OPT" ]; then echo "alias rdesktop='rdesktop $RDESKTOP_OPT'" > /etc/profile.d/rdesktop.sh echo "export RDESKTOP_OPT='$RDESKTOP_OPT'" >> /etc/profile.d/rdesktop.sh chmod 755 /etc/profile.d/rdesktop.sh fi ### run setup script, if found in $CONFIG_FOLDER on $FOUND_RESTORE_MNT if [ -r $CONFIG_FOLDER/setup ]; then CONFIG_FOLDER=$CONFIG_FOLDER bash $CONFIG_FOLDER/setup fi ### umount $FOUND_RESTORE_MNT if [ $FOUND_RESTORE_MNT ]; then echo "Unmount $FOUND_RESTORE_MNT" umount $FOUND_RESTORE_MNT 2>/dev/null sleep 3 fi ### local home partition? if [ $HOMELOCAL ]; then mv /home /home.old mkdir -p /mnt/home_par # which partition? which folder? HOMEPAR=$( echo $HOMELOCAL | cut -d":" -f1 ) HOMEDIR=$( echo $HOMELOCAL | grep ":" | cut -d":" -f2 ) umount $HOMEPAR 2>/dev/null # mount it with option noatime, healthy for USB flash drives mount -o noatime -rw $HOMEPAR /mnt/home_par 2>/dev/null if [ "$?" != "0" ]; then echo "ERROR: Could not mount read/write $HOMEPAR" umount $HOMEPAR >/dev/null 2&>1 mv /home.old /home else echo "$HOMEPAR mounted on /mnt/home_par" # link to new home ln -s /mnt/home_par/$HOMEDIR /home if [ ! -d /mnt/home_par/$HOMEDIR ]; then echo "$HOMELOCAL not found on $HOMEPAR" echo mkdir -p /mnt/home_par/$HOMEDIR if [ "$?" != "0" ]; then echo "ERROR: Could not create $HOMELOCAL on $HOMEPAR" umount $HOMEPAR >/dev/null 2&>1 rm -f /home mv /home.old /home else echo "Folder $HOMEDIR created on $HOMEPAR" fi fi if [ -d /mnt/home_par/$HOMEDIR ]; then echo "/home is linked to /mnt/home_par${HOMEDIR}" # copy files from /home.old to /home, which are not yet there /bin/cp -a -i --reply=no /home.old/* /home/ rm -rf /home.old fi fi sleep 2 fi ### mount all if AUTOMOUNT set if [ $AUTOMOUNT ]; then mount -a fi ### unmute all mixers and set volumes if [ -x /usr/bin/set-volume ]; then if [ $NOSOUND ]; then /usr/bin/set-volume 0 > /var/log/set-volume.log 2>&1 & else /usr/bin/set-volume 60 > /var/log/set-volume.log 2>&1 & fi fi ### set kde or gnome as desktop if [ $KDE ]; then sed -i "/^DESKTOP=.*/d" /etc/sysconfig/desktop 2&>/dev/null echo "DESKTOP=KDE" >> /etc/sysconfig/desktop fi if [ $GNOME ]; then sed -i "/^DESKTOP=.*/d" /etc/sysconfig/desktop 2&>/dev/null echo "DESKTOP=GNOME" >> /etc/sysconfig/desktop fi ### change to runlevel 3, if NOX (bad hack) if [ $NOX ]; then init 3 fi