#!/bin/sh
TFTPBOOT="/var/lib/tftpboot"
CASPER="casper"
CDROM="/cdrom"
NETMASK="255.255.255.0"
DEVICE="eth0"
IP="192.168.10.1"
IPRANGE_FROM="192.168.10.201"
IPRANGE_TO="192.168.10.250"
[ -r /etc/default/kanotix-terminalserver ] && . /etc/default/kanotix-terminalserver
CDROM="/cdrom"
[ -d /live/image ] && CDROM="/live/image"
[ -d "$CDROM"/live ] && CASPER="live"
NETWORK="${IP%.*}"
NETOPTS="netboot=nfs nfsroot=$IP:$CDROM"
case $(cat /proc/cmdline) in *boot=casper*) BOOTOPTS="$(sed 's/.*-- //' /proc/cmdline)";; esac
EXTRAOPTS=""
case $LANG in de*) EXTRAOPTS="locale=de_DE console-setup/layoutcode=de";; esac
[ -r /etc/lsb-release ] && . /etc/lsb-release
if [ "$DISTRIB_ID" = "Ubuntu" ]; then
 if ! grep -Eq "^[[:space:]]*deb[[:space:]]+.*universe$" /etc/apt/sources.list; then
  grep -Eq "deb[[:space:]]+.*universe$" /etc/apt/sources.list && sed -i 's/^#\s*\(deb\s.*universe\)$/\1/' /etc/apt/sources.list
 fi
fi
if ! [ /etc/init.d/nfs-kernel-server -a -x /etc/init.d/dnsmasq -a -r /usr/lib/syslinux/pxelinux.0 ]; then
 apt-get update
 apt-get --yes install nfs-kernel-server dnsmasq syslinux
fi
rm -f /etc/exports
echo "$CDROM $NETWORK.0/$NETMASK(ro,no_root_squash,sync,subtree_check)" > /etc/exports
ifconfig $DEVICE $IP netmask $NETMASK
if [ "$GATEWAY" ]; then
route del default
route add default gw $GATEWAY
fi
[ -x /etc/init.d/openbsd-inetd ] && /etc/init.d/openbsd-inetd stop
[ -x /etc/init.d/tftpd-hpa ] && /etc/init.d/tftpd-hpa stop
killall in.tftpd
/etc/init.d/nfs-kernel-server stop
/etc/init.d/portmap stop
/etc/init.d/dnsmasq stop
[ -x /etc/init.d/dhcp3-server ] && /etc/init.d/dhcp3-server stop
rm -f /etc/dnsmasq.conf
cat > /etc/dnsmasq.conf <<EOT
dhcp-boot=pxelinux.0
dhcp-range=$IPRANGE_FROM,$IPRANGE_TO,$NETMASK
interface=$DEVICE
enable-tftp
tftp-root=$TFTPBOOT
EOT
rm -rf "$TFTPBOOT"
mkdir -p "$TFTPBOOT"
cd "$TFTPBOOT"
cp -v /usr/lib/syslinux/pxelinux.0 .
mkdir -p pxelinux.cfg
if [ "$CASPER" = "casper" ]; then
 cp "$CDROM"/isolinux/* .
 [ -d "$CDROM"/install ] && cp -vr "$CDROM"/install .
 sed "s|\(--\).*|\1 $NETOPTS $BOOTOPTS $EXTRAOPTS|;s|^\(GFXBOOT.*\)|#\1|;s|^\(TIMEOUT\).*|\1 50|" isolinux.cfg > pxelinux.cfg/default
 if [ -f text.cfg ]; then
  sed -i "s|\(--\).*|\1 $NETOPTS $BOOTOPTS $EXTRAOPTS|;s|^\(GFXBOOT.*\)|#\1|;s|^\(TIMEOUT\).*|\1 50|" text.cfg
  sed -i 's| quiet||g' text.cfg
  sed -i 's| splash||g' text.cfg
 fi
else
 EXTRAOPTS=""
 cp -r "$CDROM"/isolinux .
 if [ -f isolinux/menu.cfg ]; then
  sed "s|\(append\)|\1 $NETOPTS $BOOTOPTS $EXTRAOPTS|" isolinux/menu.cfg > pxelinux.cfg/default
  echo "default menu.c32" >> pxelinux.cfg/default
  grep -qi timeout pxelinux.cfg/default || echo "timeout 100" >> pxelinux.cfg/default
 else
  sed "s|\(append\)|\1 $NETOPTS $BOOTOPTS $EXTRAOPTS|" isolinux/isolinux.cfg > pxelinux.cfg/default
 fi
fi
sed -i 's| quiet||g' pxelinux.cfg/default
sed -i 's| splash||g' pxelinux.cfg/default
rm -rf "$CASPER" "$CASPER"64
mkdir -p "$CASPER"
cp -v "$CDROM"/"$CASPER"/vmlinuz* "$CASPER"
cp -v "$CDROM"/"$CASPER"/initrd* "$CASPER"
if [ -d "$CDROM"/"$CASPER"64 ]; then
mkdir -p "$CASPER"64
cp -v "$CDROM"/"$CASPER"64/vmlinuz* "$CASPER"64
cp -v "$CDROM"/"$CASPER"64/initrd* "$CASPER"64
fi
[ -f "$CDROM"/"$CASPER"/memtest ] && cp -v "$CDROM"/"$CASPER"/memtest "$CASPER"
if [ -r /usr/lib/syslinux/menu.c32 -a ! -r "$CDROM"/isolinux/data/vesamenu.c32-bad ]; then
 cp -v /usr/lib/syslinux/menu.c32 .
 sed -i "s|^\(timeout\).*|\1 100|;s|^\(TIMEOUT\).*|\1 100|;
         s|^\(APPEND\)|#\1|;s|^\(prompt\).*|\1 0|;s|^\(PROMPT\).*|\1 0|;
         s|^\(default\).*|\1 menu.c32|;s|^\(DEFAULT\).*|\1 menu.c32|" pxelinux.cfg/default
 echo "MENU TITLE advanced PXE boot" >> pxelinux.cfg/default
fi
if [ -f /etc/default/tftpd-hpa ]; then
 . /etc/default/tftpd-hpa
 [ "$RUN_DAEMON" = "no" -a -x /etc/init.d/openbsd-inetd ] && update-inetd --disable tftp
 sed -i 's/^\(RUN_DAEMON\)="yes"/\1="no"/' /etc/default/tftpd-hpa
fi
/etc/init.d/dnsmasq start
/etc/init.d/portmap start
/etc/init.d/nfs-kernel-server start
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -o ! lo -j MASQUERADE
