#!/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