#!/bin/sh
#
# Prepare for PXE installation of Debian Edu.
#
# A better idea might be to use di-netboot-assistant,
# .
set -e
LC_ALL=C
export LC_ALL
## FIXME: Why is resolv.conf empty or missing? Because network
## was started in the chroot (target)?
## Try to find the DNS from the leases file, if that fails use
## default DNS:
if [ ! -s /etc/resolv.conf ] ; then
DNS="10.0.2.2"
LEASEDIR=/var/lib/dhcp/
if [ -d $LEASEDIR ] ; then
LEASEFILE=$LEASEDIR`ls -tr -1 $LEASEDIR | tail -n 1`
if [ -r $LEASEFILE ] ; then
if DNSLEASE=`cat $LEASEFILE | grep domain-name-servers | \
tail -n 1 | \
grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"` ; then
DNS=$DNSLEASE
echo "info: Found leases file and domain-name-server: $DNS."
else
echo "info: Could not extract DNS from leases file."
fi
fi
fi
echo "info: Create temporary /etc/resolv.conf with DNS: $DNS."
cat >> /etc/resolv.conf < /etc/resolvconf/run/resolv.conf, i.e.:
## rm /etc/resolv.conf; ln -s /etc/resolvconf/run/resolv.conf /etc/resolv.conf
nameserver $DNS
search intern
EOF
fi
# Make sure the created directories and files are readable by tfptd
# run as user nobody.
umask 022
# Fetch ftp_proxy and http_proxy if set globally
if [ -f /etc/environment ] ; then
. /etc/environment
fi
# Grab dist value for both testing and stable release cases.
if grep -q / /etc/debian_version ; then
dist=$(cat /etc/debian_version | cut -d/ -f1)
else
dist=$(lsb_release -sc)
fi
[ "$archs" ] || archs="amd64 i386"
[ "$mirrorurl" ] || mirrorurl=http://deb.debian.org/debian
[ "$hostname" ] || hostname=pxeinstall
[ "$domain" ] || domain=intern
[ "$mydesktop" ] || mydesktop=xfce
[ "$graphicdi" ] || graphicdi=false
[ "$dailydi" ] || dailydi=false
[ "$theme" ] || theme="$(ls -L /etc/alternatives/desktop-theme/plymouth 2>/dev/null | grep script | cut -d'.' -f 1)"
# Not hardcoded to allow PXE installation of a main-server without a
# proxy set
#[ "$http_proxy" ] || http_proxy=http://webcache:3128
#[ "$ftp_proxy" ] || ftp_proxy=http://webcache:3128
if [ -f /etc/debian-edu/config ] ; then
. /etc/debian-edu/config
fi
# Allow site specific overrides to the variables
if [ -f /etc/debian-edu/pxeinstall.conf ] ; then
. /etc/debian-edu/pxeinstall.conf
fi
# This part does not work from within debian-installer, as it is
# executed from cfengine before the cdebconf files are copied into
# /var/log/installer/cdebconf/ ("debconf-get-selections --installer"
# does not work). A workaround for this issue was added to
# debian-edu-install, copying the files a bit earlier.
installconfig=""
for template in debian-installer/locale \
keyboard-configuration/xkb-keymap \
tasksel/desktop; do
value="$(debconf-get-selections --installer | grep $template | awk '{print $4}')"
if [ -z "$value" ] ; then
# If there is no value in the installer debconf database, set the default one.
# Useful if modular main server installation has been used (no desktop).
value="$mydesktop"
fi
# Using desktop= as kernel argument work, while tasksel/desktop=
# do not. No idea why, but lets use the one that work.
if [ "tasksel/desktop" = $template ] ; then template=desktop ; desktop=$value; fi
# Map the long name to the short alias, to keep the argument list
# shorter.
if [ "debian-installer/locale" = $template ] ; then template=locale; fi
if [ "keyboard-configuration/xkb-keymap" = $template ] ; then template=keymap; fi
if [ "$value" ] ; then
installconfig="$installconfig $template=$value"
fi
done
tftpdir=/srv/tftp
# Where to find the preseed file on the web
preseedurl=http://www/debian-edu-install.dat
# Where the preseed file is on the disk.
preseedfile=/etc/debian-edu/www/debian-edu-install.dat
# Start from a clean state after any configuration changes have been made.
if [ -d $tftpdir/ltsp ] ; then
rm -rf $tftpdir/debian-edu
rm -rf $tftpdir/debian-installer
rm -f $tftpdir/ltsp/ltsp.ipxe
# re-generate clean ipxe menu file in case of LTSP client support.
if [ -d /srv/ltsp/images ] ; then
ltsp ipxe
# adjust ipxe menue for Debian Edu use.
sed -i 's#ltsp/ltsp.img#ltsp/${img}/ltsp.img#' /srv/tftp/ltsp/ltsp.ipxe
fi
fi
[ -d $tftpdir ] || mkdir $tftpdir
[ -d $tftpdir/debian-edu ] || mkdir $tftpdir/debian-edu
for arch in $archs ; do
(
if [ true = "$dailydi" ] ; then
diurl=https://d-i.debian.org/daily-images/$arch/daily/netboot
else
diurl=$mirrorurl/dists/$dist/main/installer-$arch/current/images/netboot
fi
[ -d $tftpdir/debian-installer ] || \
mkdir $tftpdir/debian-installer
cd $tftpdir/debian-installer
di_ver=11
tarball=""
if [ -d /usr/lib/debian-installer/images/$di_ver/$arch ]; then
di_img_dir="/usr/lib/debian-installer/images/$di_ver/$arch"
# Use the debian/installer netboot debs
tarball=""
if [ true = "$graphicdi" ]; then
cp -r -u $di_img_dir/gtk/debian-installer/$arch $arch
else
cp -r -u $di_img_dir/text/debian-installer/$arch $arch
fi
elif [ ! -f netboot-$arch.tar.gz ] ; then
if [ true = "$graphicdi" ]; then
# Use this URL for graphical installer, and fix
# gtkvideo setting below
url=$diurl/gtk/netboot.tar.gz
else
url=$diurl/netboot.tar.gz
fi
echo "Fetching $url"
if wget -q -O netboot-$arch.tar.gz.new $url ; then
mv netboot-$arch.tar.gz.new netboot-$arch.tar.gz
tarball=netboot-$arch.tar.gz
else
echo "error: Unable to download $url"
exit 1
fi
fi
if [ "$tarball" ] ; then
tar --strip-components=2 -zxvf $tarball
fi
if [ true = "$graphicdi" ]; then
# Replace Debian installer logo with Debian Edu one.
TMP=$(mktemp -d)
mkdir $TMP/$arch
cd $TMP/$arch
mkdir new
cd new
unmkinitramfs $tftpdir/debian-installer/$arch/initrd.gz .
if [ ! -z "$theme" ] ; then
cp /usr/share/pixmaps/$theme-installer-logo.png usr/share/graphics/logo_debian.png
fi
find . | cpio -H newc -o > ../initrd
cd ..
gzip initrd
cp initrd.gz $tftpdir/debian-installer/$arch
rm -rf $TMP
fi
)
done
echo "Generating $preseedfile"
(
cat <
# if you want popcon enabled by default
#d-i debian-edu-install/participate-popcon boolean true
# If you want a specific set of profiles installed
#d-i debian-edu-install/profile multiselect Workstation, LTSP-Server
# If you want automatic partitioning
#d-i debian-edu-install/confirm boolean true
# If you want to avoid the password question
#d-i passwd/root-password-crypted password passwordhash
# Tell PXE clients to fetch the correct time from the central NTP server
# d-i is unable to discover the ntp-server DHCP option. Hardcode
# setting here instead. FIXME: Remove when #714288 in netcfg is fixed.
d-i netcfg/dhcp_ntp_servers string ntp
# Pass on the time zone used on the main-server
EOF
debconf-get-selections --installer | grep -w 'time/zone'
# No use copying the installation mirror setting if a DVD or USB
# stick was used.
if grep -qi 'dvd|bd' /etc/apt/sources.list ; then
cat < $preseedfile
menufile=$tftpdir/debian-edu/install.cfg
echo "Generating $menufile"
(
if [ true = "$graphicdi" ]; then
gtkvideo="vga=788"
fi
for arch in $archs ; do
cat < $menufile
if [ ! -z "$theme" ] ; then
cp /usr/share/pixmaps/$theme-syslinux.png $tftpdir/debian-edu/debian-edu-pxe.png
fi
# Generate/modify the iPXE menu file
if [ -f $tftpdir/ltsp/ltsp.ipxe ] ; then
# ltsp is installed already, modify existing ipxe menu
if ! grep -q main-server $tftpdir/ltsp/ltsp.ipxe ; then
echo "Modifying $tftpdir/ltsp/ltsp.ipxe"
sed -i '/^menu.*/ a item\
item --gap Installation:\
item --key a amd64 Install Debian Edu/amd64 (64-Bit)\
item --key i i386 Install Debian Edu/i386 (32-Bit)\
item\
' /srv/tftp/ltsp/ltsp.ipxe
cat $menufile >> $tftpdir/ltsp/ltsp.ipxe
fi
else
# generate ipxe menu on a plain main server for PXE installations
mkdir -p $tftpdir/ltsp/
cp /usr/lib/ipxe/undionly.kpxe $tftpdir/ltsp/
cp /usr/lib/ipxe/snponly.efi $tftpdir/ltsp/
cp /boot/memtest86+ia32.bin $tftpdir/ltsp/memtest.0
cp /boot/memtest86+x64.efi $tftpdir/ltsp/memtest.efi
echo "Generating $tftpdir/ltsp/ltsp.ipxe"
cat < /srv/tftp/ltsp/ltsp.ipxe
#!ipxe
#
# Configure iPXE for network installations
# Set the default image (img) based on arch, or to root-path if it's not empty
cpuid --ext 29 && set img amd64 || set img i386
goto start
:start
# To completely hide the menu, set menu-timeout to -1
isset \${menu-timeout} || set menu-timeout 5000
iseq "\${menu-timeout}" "-1" && goto \${img} ||
menu Debian Edu iPXE boot menu || goto \${img}
item
item --gap Debian Edu installation:
item --key a amd64 Install Debian Edu/amd64 (64-Bit)
item --key i i386 Install Debian Edu/i386 (32-Bit)
item
item --gap Other options:
item --key m memtest Memory test
item --key c config Enter iPXE configuration
item --key s shell Drop to iPXE shell
item --key d disk Boot from the first local disk
item
item --key x exit Exit iPXE and continue BIOS boot
choose --timeout \${menu-timeout} --default \${img} img || goto cancel
goto \${img}
:memtest
iseq \${platform} pcbios && kernel memtest.0 || kernel memtest.efi
# Boot "fails" on normal memtest exit with Esc, so show the menu again
boot ||
goto start
:config
config
goto start
:shell
echo Type 'exit' to get the back to the menu
shell
goto start
:disk
# Boot the first local HDD
sanboot --no-describe --drive 0x80 || goto failed
:exit
exit 1
:cancel
echo You cancelled the menu, dropping to a shell
goto shell
:failed
echo Booting failed, dropping to a shell
goto shell
EOF
if ! grep -q main-server $tftpdir/ltsp/ltsp.ipxe ; then
cat $menufile >> $tftpdir/ltsp/ltsp.ipxe
fi
fi