#! /bin/bash # # Description: Script for generating dxs filesystem by # cloning from rsync source for Diskless X Stations (v4.0) # # Author(s): Dirk von Suchodoletz , 02-11-2005 # Copyright: (c) 2003, 2005 - RZ Universitaet Freiburg # header() { echo echo "Welcome to the LD4 installation" echo } # check needed things for installation precheck() { # check if running as root if [ "`id -u`" != "0" ]; then echo -e "\nYou don't have the needed permission. Please rerun as root user!\n" exit 1 fi # check for existing programs: # rsync (server-side) which rsync >/dev/null if [ $? != 0 ] ; then echo -e "\nYou need to install rsync on server side before installing!\n" exit 1 fi # ssh, rsync (referenz-system-side) -> not possible in precheck # nfs-kernel-server, atftpd # -> not needed for installation } # ask question variable_name default_value ask() { echo echo "$1" echo -n "* [ $3 ] " read userinput if [ -z "$userinput" ] ; then local back=$3 else local back="$userinput" fi eval "$2=\"$back\"" echo "$2=\"$back\"" >> .config } distro_check() { case "${!1}" in Debian*|debian*|Sarge*|sarge*) eval "$1=\"debian\"" case "${!2}" in Sarge*|sarge*|3.1*|*) eval "$2=\"3.1\"" ;; esac ;; Ubuntu*|ubuntu*) eval "$1=\"ubuntu\"" case "${!2}" in Breezy*|breezy*|*) eval "$2=\"5.10\"" ;; esac ;; Gentoo*|gentoo*) eval "$1=\"gentoo\"" case "${!2}" in 2005*|*) eval "$2=\"2005.1\"" ;; esac ;; SuSE*|suse*|Suse*|SuSe*|SUSE*|*) eval "$1=\"suse\"" case "${!2}" in 9*) eval "$2=\"9.3\"" ;; 10.0) eval "$2=\"10.0\"" ;; 10*) eval "$2=\"10.1\"" ;; esac ;; esac } configure() { export LANG="c" if [ -f .config ] ; then echo -n "Use values from last installation? [Y/n] " read userinput if [ "x$userinput" = "xn" ] ; then cp .config.default .config fi else cp .config.default .config fi . .config # TODO: bash doesnt allow concatenation of more than 2 logical expressions if ! [ -z $netmask -a -z $broadcast -a -z $netname -a -z $server ] ; then ipcfg=( `ifconfig eth0 | grep "inet addr" | sed -e "s,[a-zA-Z]*:,,g"` ) netmask=${ipcfg[3]} broadcast=${ipcfg[2]} # quickhack (more intelligent solution needed ...) netname=`route -n | grep -m 1 eth0 | grep -v "UG" | awk '{ print $1 }'` server=${ipcfg[1]} fi # try to detect server architecture if [ -z "${server_distro}" ] ; then for i in /bin/lsb_release /usr/bin/lsb_release; do if [ -e $i ] ; then $i > /dev/null 2>&1 || break server_distro=`. $i -i | sed "s/.*\t//"` server_distro_ver=`. $i -r | sed "s/.*\t//"` break fi done fi # if still no distro name set, try to find it using significant files if [ -z "${server_distro}" ] ; then if [ -e ${ROOTDIR}/etc/SuSE-release ] ; then server_distro=suse server_distro_ver=`grep "VERSION" /etc/SuSE-release | sed "s/.*= //"` elif [ -e /etc/lsb-release ] ; then . /etc/lsb-release server_distro=${DISTRIB_ID} server_distro_ver=${DISTRIB_RELEASE} elif [ -e /etc/debian_version ] ; then server_distro=debian server_distro_ver=`cat /etc/debian_version` fi fi # das grosse frage-antwort-spiel: ask "Server distribution: " server_distro ${server_distro} distro_check server_distro server_distro_ver echo "Using ${server_distro} as server distribution" # ask for client distro ask "Client distribution: " client_distro ${client_distro} distro_check client_distro client_distro_ver echo "Using ${client_distro} as client distribution" . config-${server_distro} ask "Path for client system: " rootdir $rootdir ask "Path for tftpboot: " tftpbootdir $tftpbootdir ask "Which network do you want to use for DXS? (A.B.C.0) " netname $netname ask "Which netmask should be used? (255.B.C.0): " netmask $netmask ask "What is your servers IP for NFS, DHCP and TFTP? " server $server # noetig?? ask "Broadcast Address: " broadcast $broadcast # evtl. optional? ask "Where automount home directories from? (A.B.C.D:/home-dir)" amt $server":/home" ask "Which debug level should be used? " debuglevel $debuglevel # wo ist das referenzsystem? - was ist default ??? ask "IP + Path to reference system: " rsyncsource "localhost:/" # hier auch dns-server etc abfragen?? # nfs / nbd / squash-fs? } copy_system() { rsync -avDe ssh --delete --exclude-from=distro-specs/exclude-${client_distro} ${rsyncsource} ${rootdir} # generate error message in case rsync didn't work and exit. } # setting up server site configuration files etc. setup_server () { # dhcp if [ -f ${dhcpd_conf} ] ; then echo "Copying old dhcpd.conf to dhcpd.conf.dxs.bak" mv ${dhcpd_conf} ${dhcpd_conf}.dxs.bak fi cp default_files/dhcpd.conf ${dhcpd_conf} sed -e "s,@@@server@@@,${server}," -i ${dhcpd_conf} # atftpd if [ -f ${atftpd_conf} ] ; then echo "Copying old atftpd config file to ${atftpd_conf}.dxs.bak" cp ${atftpd_conf} ${atftpd_conf}.dxs.bak fi ## MISSING COPY - DISTRO SPECIFIC!! sed -e "s,/tftpboot,${tftpbootdir}," -i ${atftpd_conf} # nfs exports_conf="/etc/exports" if [ -f ${exports_conf} ] ; then echo "Copying old nfs export file to ${exports_conf}.dxs.bak" mv ${exports_conf} ${exports_conf}.dxs.bak fi echo "/nfsroot/dxs ${netname}/${netmask}(ro,no_root_squash,async)" >> ${exports_conf} # pxe if [ -e ${tftpbootdir} ] ; then echo "Copying old tftpboot directory to ${tftpbootdir}.dxs.bak" mv ${tftpbootdir} ${tftpbootdir}.dxs.bak fi cp -r default_files/tftpboot ${tftpbootdir} sed -e "s,@@@server@@@,${server},g" -e "s,@@@tftpbootdir@@@,${tftpbootdir},g" -i ${tftpbootdir}/pxelinux.cfg/default # make services start -- do we really want to do this? } create_initrd() { ../initrd/mkdxsinitrd -r ${rootdir} # generate links to kernel and initial ramdisk ln -s ${rootdir}/boot/vmlinuz ${tftpbootdir} ln -s ${rootdir}/boot/initrd ${tftpbootdir} # TODO: assure that vmlinuz and initrd exist!! } ## ------ MAIN ------ ## header precheck #(run as root, rsync etc.) configure copy_system setup_server create_initrd