#!/bin/bash
clear
#
# Configuration
#
tftp_boot_dir=/var/lib/tftpboot
menu_bg_png_url=http://www.howtoforge.com/images/pxe_install_server_ubuntu_9.10/howtoforge_pxe.png
#
ubuntu_stable=karmic
ubuntu_testing=lucid
#
debian_stable=lenny
debian_unstable=sid
debian_testing=squeeze
#
fedora_ver=12
#
centos_ver=5.4
#
mandriva_ver=2010.0
#
opensuse_ver=11.2
#
slackware_ver=13.0
#
archlinux_ver=2009.08
#
hdt_floppy="http://hdt-project.org/raw-attachment/wiki/hdt-0.3.6/hdt-0.3.6.img"
#
syslinux_basename="syslinux-3.84"
#
# DON'T TOUCH ANYTHING BELOW THIS
#
ubuntu_stable_url="http://us.archive.ubuntu.com/ubuntu/dists/$ubuntu_stable/main/installer-i386/current/images/netboot/"
ubuntu_testing_url="http://us.archive.ubuntu.com/ubuntu/dists/$ubuntu_testing/main/installer-i386/current/images/netboot/"
#
debian_stable_url="ftp://mirrors.kernel.org/debian/dists/$debian_stable/main/installer-i386/current/images/netboot/"
debian_unstable_url="ftp://mirrors.kernel.org/debian/dists/$debian_unstable/main/installer-i386/current/images/netboot/"
debian_testing_url="ftp://mirrors.kernel.org/debian/dists/$debian_testing/main/installer-i386/current/images/netboot/"
#
fedora_url="http://ftp-stud.fht-esslingen.de/pub/Mirrors/fedora.redhat.com/linux/releases/$fedora_ver/Fedora/i386/os/images/pxeboot/"
#
centos_url="http://ftp-stud.fht-esslingen.de/pub/Mirrors/centos/$centos_ver/os/i386/images/pxeboot/"
#
mandriva_url="http://ftp-stud.fht-esslingen.de/pub/Mirrors/Mandrivalinux/official/$mandriva_ver/i586/isolinux/alt0/"
mandriva_url="http://ftp-stud.fht-esslingen.de/pub/Mirrors/Mandrivalinux/official/$mandriva_ver/i586/isolinux/alt0/"
#
#opensuse_url="http://download.opensuse.org/distribution/$opensuse_ver/repo/oss/boot/i386/loader/"
opensuse_url="http://mirrors.kernel.org/opensuse//distribution/$opensuse_ver/repo/oss/boot/i386/loader/"
#
slackware_base_url="http://ftp.gwdg.de/pub/linux/slackware//slackware-$slackware_ver"
#
syslinux_url="http://www.kernel.org/pub/linux/utils/boot/syslinux/$syslinux_basename.tar.gz"
#
#
#
function get_file {
if [ -f $2 ]
then
echo "Not Downloading (file exists) : $2"
else
echo "Downloading : $1"
lftp -c "get $1 -o $2"
fi
}
#
#
function fixmenu {
OLD="$1-installer"
NEW="ubuntu\/$2"
DPATH="$1/$2/i386/boot-screens/*.cfg"
BPATH="backup/$2"
TFILE="/tmp/out.tmp.$$"
[ ! -d $BPATH ] && mkdir -p $BPATH || :
for f in $DPATH
do
  if [ -f $f -a -r $f ]; then
      /bin/cp -f $f $BPATH
      sed "s/$OLD/$NEW/g" "$f" > $TFILE && mv $TFILE "$f"
  else
      echo "Error: Cannot read $f"
  fi
done
}
#
#
function DownloadAndFixMenu {
echo "Downloading : $3"
lftp -c "open $3; mirror $1-installer/"
mv $1-installer $1/$2
fixmenu $1 $2
}
#
#
function get_syslinux {
get_file $syslinux_url syslinux.tar.gz
tar xzf syslinux.tar.gz
mv $syslinux_basename/core/pxelinux.0 $tftp_boot_dir/pxelinux.0
mv $syslinux_basename/com32/menu/vesamenu.c32 $tftp_boot_dir/vesamenu.c32
mv $syslinux_basename/memdisk/memdisk $tftp_boot_dir/memdisk
rm -rf $syslinux_basename
rm syslinux.tar.gz
}

#
# Make dirs exist
#
mkdir -p $tftp_boot_dir/pxelinux.cfg
cd $tftp_boot_dir
mkdir -p $tftp_boot_dir/ubuntu
mkdir -p $tftp_boot_dir/debian
mkdir -p $tftp_boot_dir/mandriva
mkdir -p $tftp_boot_dir/fedora
mkdir -p $tftp_boot_dir/slackware
mkdir -p $tftp_boot_dir/backup
#
# Backup Current PXE Cfg
#
if [ -f $tftp_boot_dir/pxelinux.cfg/default ]
then
echo Backing up current default PXE config
echo Backup file : $tftp_boot_dir/backup/pxelinux.cfg/default
mkdir -p $tftp_boot_dir/backup/pxelinux.cfg
mv $tftp_boot_dir/pxelinux.cfg/default $tftp_boot_dir/backup/pxelinux.cfg/default
fi
#
# Get Ubuntu Stable
#
echo "Ubuntu Stable ($ubuntu_stable)"
if [[ ! -d "ubuntu/$ubuntu_stable" ]];
then
DownloadAndFixMenu ubuntu $ubuntu_stable $ubuntu_stable_url
else
echo "Not Downloading (directory exist) Ubuntu Stable ($ubuntu_stable)"
fi
#
# Get Ubuntu Testing
#
echo "Ubuntu Testing ($ubuntu_testing)"
if [[ ! -d "ubuntu/$ubuntu_testing" ]];
then
DownloadAndFixMenu ubuntu $ubuntu_testing $ubuntu_testing_url
else
echo "Not Downloading (directory exist) Ubuntu Testing ($ubuntu_testing)"
fi
#
# Get Debian Stable
#
echo "Debian Stable ($debian_stable)"
if [[ ! -d "debian/$debian_stable" ]];
then
DownloadAndFixMenu debian $debian_stable $debian_stable_url
else
echo "Not Downloading (directory exist) Debian Stable ($debian_stable)"
fi
#
#Debian UnStable
#
echo "Debian UnStable ($debian_unstable)"
if [[ ! -d "debian/$debian_unstable" ]];
then
DownloadAndFixMenu debian $debian_unstable $debian_unstable_url
else
echo "Not Downloading (directory exist) Debian UnStable ($debian_unstable)"
fi
#
#Debian Testing
#
echo "Debian Testing ($debian_testing)"
if [[ ! -d "debian/$debian_testing" ]];
then
DownloadAndFixMenu debian $debian_testing $debian_testing_url
else
echo "Not Downloading (directory exist) Debian Testing ($debian_testing)"
fi
#
# Get Fedora
#
echo "Fedora ($fedora_ver)"
mkdir -p fedora/$fedora_ver/i386
get_file $fedora_url/initrd.img fedora/$fedora_ver/i386/initrd.img
get_file $fedora_url/vmlinuz fedora/$fedora_ver/i386/vmlinuz
#
# Get CentOS
#
echo "CentOS ($centos_ver)"
mkdir -p centos/$centos_ver/i386
get_file $centos_url/initrd.img  centos/$centos_ver/i386/initrd.img
get_file $centos_url/vmlinuz centos/$centos_ver/i386/vmlinuz
#
# Get Mandriva
#
echo "Mandriva ($mandriva_ver)"
mkdir -p mandriva/$mandriva_ver/i386
get_file $mandriva_url/all.rdz mandriva/$mandriva_ver/i386/all.rdz
get_file $mandriva_url/vmlinuz mandriva/$mandriva_ver/i386/vmlinuz
#
# Get Suse
#
echo "Suse ($opensuse_ver)"
mkdir -p suse/$opensuse_ver/i386
get_file $opensuse_url/initrd suse/$opensuse_ver/i386/initrd
get_file $opensuse_url/linux suse/$opensuse_ver/i386/linux
#
# Get Slackware
#
echo "Slackware ($slackware_ver)"
mkdir -p slackware/$slackware_ver
get_file $slackware_base_url/kernels/huge.s/bzImage slackware/$slackware_ver/bzImage_huge
get_file $slackware_base_url/kernels/hugesmp.s/bzImage slackware/$slackware_ver/bzImage_hugesmp
get_file $slackware_base_url/isolinux/initrd.img slackware/$slackware_ver/initrd.img

#
# Get Hardware Detection Tool
#
echo "Hardware Detection Tool"
mkdir -p hdt
get_file $hdt_floppy hdt/hdt.img

#
# Get Syslinux
#
echo "Syslinux"
if [ ! -f $tftp_boot_dir/pxelinux.0 ]
then
get_syslinux
fi                
if [ ! -f $tftp_boot_dir/memdisk ]
then
get_syslinux
fi                
if [ ! -f $tftp_boot_dir/vesamenu.c32 ]
then
get_syslinux
fi                

#
# Copy vesamenu and get PNG for background
#
wget -q $menu_bg_png_url -O splash.png 
cp ubuntu/$ubuntu_stable/i386/boot-screens/vesamenu.c32 .
echo "default vesamenu.c32" > pxelinux.cfg/default
echo "Menu Background splash.png" >> pxelinux.cfg/default
echo "Menu Title Boot Menu" >> pxelinux.cfg/default

#
# Create Menu Entries
#
if [[  -d "arch/$archlinux_ver" ]]
then
echo "# Arch" >> pxelinux.cfg/default
echo "LABEL Arch" >> pxelinux.cfg/default
echo "MENU LABEL Arch" >> pxelinux.cfg/default
echo "KERNEL vesamenu.c32" >> pxelinux.cfg/default
echo "APPEND pxelinux.cfg/arch" >> pxelinux.cfg/default
echo "#" >> pxelinux.cfg/default
fi

echo "# Ubuntu" >> pxelinux.cfg/default
echo "LABEL Ubuntu" >> pxelinux.cfg/default
echo "MENU LABEL Ubuntu" >> pxelinux.cfg/default
echo "KERNEL vesamenu.c32" >> pxelinux.cfg/default
echo "APPEND pxelinux.cfg/ubuntu" >> pxelinux.cfg/default
echo "#" >> pxelinux.cfg/default
echo "# Debian" >> pxelinux.cfg/default
echo "LABEL Debian" >> pxelinux.cfg/default
echo "MENU LABEL Debian" >> pxelinux.cfg/default
echo "KERNEL vesamenu.c32" >> pxelinux.cfg/default
echo "APPEND pxelinux.cfg/debian" >> pxelinux.cfg/default
echo "#" >> pxelinux.cfg/default
echo "# Slackware" >> pxelinux.cfg/default
echo "LABEL Slackware" >> pxelinux.cfg/default
echo "MENU LABEL Slackware" >> pxelinux.cfg/default
echo "KERNEL vesamenu.c32" >> pxelinux.cfg/default
echo "APPEND pxelinux.cfg/slackware" >> pxelinux.cfg/default
echo "#" >> pxelinux.cfg/default



#
echo "# Fedora" >> pxelinux.cfg/default
echo "LABEL Fedora ($fedora_ver)" >> pxelinux.cfg/default
echo "MENU LABEL Fedora ($fedora_ver)" >> pxelinux.cfg/default
echo "KERNEL fedora/$fedora_ver/i386/vmlinuz" >> pxelinux.cfg/default
echo "APPEND initrd=fedora/$fedora_ver/i386/initrd.img" >> pxelinux.cfg/default
echo "#" >> pxelinux.cfg/default
echo "# CentOS" >> pxelinux.cfg/default
echo "LABEL CentOS ($centos_ver)" >> pxelinux.cfg/default
echo "MENU LABEL CentOS ($centos_ver)" >> pxelinux.cfg/default
echo "KERNEL centos/$centos_ver/i386/vmlinuz" >> pxelinux.cfg/default
echo "APPEND initrd=centos/$centos_ver/i386/initrd.img" >> pxelinux.cfg/default
echo "#" >> pxelinux.cfg/default
#
#
echo "# Mandriva" >> pxelinux.cfg/default
echo "LABEL Mandriva ($mandriva_ver)" >> pxelinux.cfg/default
echo "MENU LABEL Mandriva ($mandriva_ver)" >> pxelinux.cfg/default
echo "KERNEL mandriva/$mandriva_ver/i386/vmlinuz" >> pxelinux.cfg/default
echo "APPEND  initrd=mandriva/$mandriva_ver/i386/all.rdz vga=788 splash=silent automatic=method:http,network:dhcp,server:www.gtlib.gatech.edu,directory:/pub/mandrake/official/2010.0/i586" >> pxelinux.cfg/default
echo "#" >> pxelinux.cfg/default
#
#
echo "# Suse" >> pxelinux.cfg/default
echo "LABEL Suse ($opensuse_ver)" >> pxelinux.cfg/default
echo "MENU LABEL Suse ($opensuse_ver)" >> pxelinux.cfg/default
echo "KERNEL suse/$opensuse_ver/i386/linux" >> pxelinux.cfg/default
echo "APPEND initrd=suse/$opensuse_ver/i386/initrd splash=silent showopts install=http://download.opensuse.org/distribution/$opensuse_ver/repo/oss/" >> pxelinux.cfg/default
echo "#" >> pxelinux.cfg/default
#
#
echo "# Hardware Detection Tool " >> pxelinux.cfg/default
echo "LABEL Hardware Detection Tool" >> pxelinux.cfg/default
echo "MENU LABEL Hardware Detection Tool" >> pxelinux.cfg/default
echo "KERNEL memdisk" >> pxelinux.cfg/default
echo "APPEND initrd=hdt/hdt.img" >> pxelinux.cfg/default
echo "#" >> pxelinux.cfg/default
#
#
echo "prompt 0" >> pxelinux.cfg/default
echo "timeout 0" >> pxelinux.cfg/default
#
# Sub Menus
#
echo "default vesamenu.c32" > pxelinux.cfg/ubuntu
echo "Menu Background splash.png" >> pxelinux.cfg/ubuntu
echo "Menu Title Boot Menu" >> pxelinux.cfg/ubuntu
echo "# Ubuntu Stable" >> pxelinux.cfg/ubuntu
echo "LABEL Ubuntu Stable ($ubuntu_stable)" >> pxelinux.cfg/ubuntu
echo "MENU LABEL Ubuntu Stable ($ubuntu_stable)" >> pxelinux.cfg/ubuntu
echo "KERNEL vesamenu.c32" >> pxelinux.cfg/ubuntu
echo "APPEND ubuntu/$ubuntu_stable/i386/boot-screens/menu.cfg" >> pxelinux.cfg/ubuntu
echo "#" >> pxelinux.cfg/ubuntu
echo "# Ubuntu Testing" >> pxelinux.cfg/ubuntu
echo "LABEL Ubuntu Testing ($ubuntu_testing)" >> pxelinux.cfg/ubuntu
echo "MENU LABEL Ubuntu Testing ($ubuntu_testing)" >> pxelinux.cfg/ubuntu
echo "KERNEL vesamenu.c32" >> pxelinux.cfg/ubuntu
echo "APPEND ubuntu/$ubuntu_testing/i386/boot-screens/menu.cfg" >> pxelinux.cfg/ubuntu
echo "#" >> pxelinux.cfg/ubuntu
echo "# BACK" >> pxelinux.cfg/ubuntu
echo "LABEL Main Menu" >> pxelinux.cfg/ubuntu
echo "MENU LABEL Main Menu" >> pxelinux.cfg/ubuntu
echo "KERNEL vesamenu.c32" >> pxelinux.cfg/ubuntu
echo "APPEND pxelinux.cfg/default" >> pxelinux.cfg/ubuntu
echo "#" >> pxelinux.cfg/ubuntu
echo "prompt 0" >> pxelinux.cfg/ubuntu
echo "timeout 0" >> pxelinux.cfg/ubuntu
#
#
echo "default vesamenu.c32" > pxelinux.cfg/debian
echo "Menu Background splash.png" >> pxelinux.cfg/debian
echo "Menu Title Boot Menu" >> pxelinux.cfg/debian
echo "# Debian Stable" >> pxelinux.cfg/debian
echo "LABEL Debian Stable ($debian_stable)" >> pxelinux.cfg/debian
echo "MENU LABEL Debian Stable ($debian_stable)" >> pxelinux.cfg/debian
echo "KERNEL vesamenu.c32" >> pxelinux.cfg/debian
echo "APPEND debian/$debian_stable/i386/boot-screens/menu.cfg" >> pxelinux.cfg/debian
echo "#" >> pxelinux.cfg/debian
echo "# Debian UnStable" >> pxelinux.cfg/debian
echo "LABEL Debian UnStable ($debian_unstable)" >> pxelinux.cfg/debian
echo "MENU LABEL Debian UnStable ($debian_unstable)" >> pxelinux.cfg/debian
echo "KERNEL vesamenu.c32" >> pxelinux.cfg/debian
echo "APPEND debian/$debian_unstable/i386/boot-screens/menu.cfg" >> pxelinux.cfg/debian
echo "#" >> pxelinux.cfg/debian
echo "# Debian Testing" >> pxelinux.cfg/debian
echo "LABEL Debian Testing ($debian_testing)" >> pxelinux.cfg/debian
echo "MENU LABEL Debian Testing ($debian_testing)" >> pxelinux.cfg/debian
echo "KERNEL vesamenu.c32" >> pxelinux.cfg/debian
echo "APPEND debian/$debian_testing/i386/boot-screens/menu.cfg" >> pxelinux.cfg/debian
echo "#" >> pxelinux.cfg/debian
echo "# BACK" >> pxelinux.cfg/debian
echo "LABEL Main Menu" >> pxelinux.cfg/debian
echo "MENU LABEL Main Menu" >> pxelinux.cfg/debian
echo "KERNEL vesamenu.c32" >> pxelinux.cfg/debian
echo "APPEND pxelinux.cfg/default" >> pxelinux.cfg/debian
echo "#" >> pxelinux.cfg/debian
echo "prompt 0" >> pxelinux.cfg/debian
echo "timeout 0" >> pxelinux.cfg/debian
#
#
#
echo "default vesamenu.c32" > pxelinux.cfg/slackware
echo "Menu Background splash.png" >> pxelinux.cfg/slackware
echo "Menu Title Boot Menu" >> pxelinux.cfg/slackware
echo "# Slackware " >> pxelinux.cfg/slackware
echo "LABEL Slackware ($slackware_ver) i486" >> pxelinux.cfg/slackware
echo "MENU LABEL Slackware ($slackware_ver) i486" >> pxelinux.cfg/slackware
echo "KERNEL slackware/$slackware_ver/bzImage_huge" >> pxelinux.cfg/slackware
echo "APPEND initrd=slackware/$slackware_ver/initrd.img load_ramdisk=1 prompt_ramdisk=0 rw SLACK_KERNEL=huge.s" >> pxelinux.cfg/slackware
echo "#" >> pxelinux.cfg/slackware
echo "LABEL Slackware ($slackware_ver) PentiumPro minimum" >> pxelinux.cfg/slackware
echo "MENU LABEL Slackware ($slackware_ver) PentiumPro minimum" >> pxelinux.cfg/slackware
echo "KERNEL slackware/$slackware_ver/bzImage_hugesmp" >> pxelinux.cfg/slackware
echo "APPEND initrd=slackware/$slackware_ver/initrd.img load_ramdisk=1 prompt_ramdisk=0 rw SLACK_KERNEL=hugesmp.s" >> pxelinux.cfg/slackware
echo "#" >> pxelinux.cfg/slackware
echo "# BACK" >> pxelinux.cfg/slackware
echo "LABEL Main Menu" >> pxelinux.cfg/slackware
echo "MENU LABEL Main Menu" >> pxelinux.cfg/slackware
echo "KERNEL vesamenu.c32" >> pxelinux.cfg/slackware
echo "APPEND pxelinux.cfg/default" >> pxelinux.cfg/slackware
echo "#" >> pxelinux.cfg/slackware
echo "prompt 0" >> pxelinux.cfg/slackware
echo "timeout 0" >> pxelinux.cfg/slackware




if [[  -d "arch/$archlinux_ver" ]];
then
echo "default vesamenu.c32" > pxelinux.cfg/arch
echo "Menu Background splash.png" >> pxelinux.cfg/arch
echo "Menu Title Boot Menu" >> pxelinux.cfg/arch
echo "# Arch" >> pxelinux.cfg/arch
echo "LABEL Arch ($archlinux_ver) i686" >> pxelinux.cfg/arch
echo "MENU LABEL Arch ($archlinux_ver) i686" >> pxelinux.cfg/arch
echo "KERNEL arch/$archlinux_ver/vmlinuz26_i686" >> pxelinux.cfg/arch
echo "APPEND lang=en locale=en_US.UTF-8 archisolabel=ARCHISO_EIYOHPO3 ramdisk_size=75% initrd=arch/$archlinux_ver/archiso_pata_i686.img" >> pxelinux.cfg/arch
echo "#" >> pxelinux.cfg/arch
echo "LABEL Arch ($archlinux_ver) x86_64" >> pxelinux.cfg/arch
echo "MENU LABEL Arch ($archlinux_ver) x86_64" >> pxelinux.cfg/arch
echo "KERNEL arch/$archlinux_ver/vmlinuz26_x86_64" >> pxelinux.cfg/arch
echo "APPEND lang=en locale=en_US.UTF-8 archisolabel=ARCHISO_OHD8FOH5 ramdisk_size=75% initrd=arch/$archlinux_ver/archiso_pata_x86_64.img" >> pxelinux.cfg/arch
echo "#" >> pxelinux.cfg/arch
echo "# BACK" >> pxelinux.cfg/arch
echo "LABEL Main Menu" >> pxelinux.cfg/arch
echo "MENU LABEL Main Menu" >> pxelinux.cfg/arch
echo "KERNEL vesamenu.c32" >> pxelinux.cfg/arch
echo "APPEND pxelinux.cfg/default" >> pxelinux.cfg/arch
echo "#" >> pxelinux.cfg/arch
echo "prompt 0" >> pxelinux.cfg/arch
echo "timeout 0" >> pxelinux.cfg/arch
fi


