Version in base suite: 2.13.2~deb13u1 Version in overlay suite: 2.13.7~deb13u1 Base version: debian-edu-config_2.13.7~deb13u1 Target version: debian-edu-config_2.13.11~deb13u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/d/debian-edu-config/debian-edu-config_2.13.7~deb13u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/d/debian-edu-config/debian-edu-config_2.13.11~deb13u1.dsc Makefile | 2 debian/changelog | 107 +++ etc/debian-edu/pxeinstall.conf | 4 etc/debian-edu/thin/x2gothinclient-minidesktop_start | 37 + etc/debian-edu/thin/x2gothinclient_sessions.in | 46 + libexec/debian-edu-apache2-update-tjener-aliases | 13 sbin/debian-edu-ltsp-chroot | 56 +- sbin/debian-edu-ltsp-initrd | 151 ++++- sbin/debian-edu-ltsp-install | 523 ++++++------------- sbin/debian-edu-ltsp-ipxe | 249 ++++++++- sbin/debian-edu-pxeinstall | 201 ------- share/debian-edu-config/squid.conf | 6 share/debian-edu-config/tools/run-at-firstboot | 16 13 files changed, 820 insertions(+), 591 deletions(-) dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmp4yiw8ngd/debian-edu-config_2.13.7~deb13u1.dsc: no acceptable signature found dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmp4yiw8ngd/debian-edu-config_2.13.11~deb13u1.dsc: no acceptable signature found diff -Nru debian-edu-config-2.13.7~deb13u1/Makefile debian-edu-config-2.13.11~deb13u1/Makefile --- debian-edu-config-2.13.7~deb13u1/Makefile 2026-11-09 00:22:40.000000000 +0000 +++ debian-edu-config-2.13.11~deb13u1/Makefile 2026-11-12 17:53:21.000000000 +0000 @@ -99,6 +99,8 @@ dconf/profile/user \ debian-edu/nightkill.conf \ debian-edu/pxeinstall.conf \ + debian-edu/thin/x2gothinclient_sessions.in \ + debian-edu/thin/x2gothinclient-minidesktop_start \ default/munin-node \ default/ldap2zone \ chromium/policies/managed/chromium-networked-prefs \ diff -Nru debian-edu-config-2.13.7~deb13u1/debian/changelog debian-edu-config-2.13.11~deb13u1/debian/changelog --- debian-edu-config-2.13.7~deb13u1/debian/changelog 2026-11-09 00:23:30.000000000 +0000 +++ debian-edu-config-2.13.11~deb13u1/debian/changelog 2026-11-12 20:58:15.000000000 +0000 @@ -1,3 +1,110 @@ +debian-edu-config (2.13.11~deb13u1) trixie; urgency=medium + + * Release to trixie. + + -- Mike Gabriel Thu, 12 Nov 2026 21:58:15 +0100 + +debian-edu-config (2.13.11) unstable; urgency=medium + + * debian-edu-{pxeinstall,ltsp-ipxe}: Regression fix for Debian Installer menu + items in iPXE boot menu. + The kernel boot cmdline contained empty fields due to variables not + having been properly prepared by the debian-edu-ltsp-ipxe script, + leading to installation failures during iPXE based Debian Edu host + installation. (Closes: #1153850). + * etc/debian-edu/pxeinstall.conf: Minor comment fixes. + + -- Mike Gabriel Thu, 12 Nov 2026 21:55:28 +0100 + +debian-edu-config (2.13.10) unstable; urgency=medium + + * run-at-firstboot: Default to X2Go's minidesktop thinclient variant on + - LTSP-Servers. + * debian-edu-ltsp-initrd: + - Drop support for creating LTSP image from Main-Server installation. + - Move entire logic for generating the ltsp.img (containing most of + LTSP code and config) into this script. + - For bare X2Go thinclient variant, use --thinclient option in X2GoClient + commandline. This enables display manager code in X2Go Client and it will + amongst others make the X2Go Client main window stretch across the whole + screen. (Closes: #1153651). + * debian-edu-ltsp-install: + - Drop support for creating an LTSP image from the Main-Server's host + filesystem. + - Move all logic for creating ltsp.img initrd image to debian-edu-ltsp- + initrd script + - Unmount BD/DVD/CDrom as soon as possible + - debian-edu-{pxeinstall,ltsp-install,ltsp-ipxe}: Move all ltsp.ipxe + generation logic into debian-edu-ltsp-ipxe script. (Closes: #1153608). + - Rephrase iPXE boot menu items. + - Only create /etc/ltsp/ltsp.conf if not present yet. + - Adopt timezone in LTSP chroots from host. (Closes: #1153741). + - Fix typo in cmdline option parser. (Closes: #1153762). + - Move locale generation to the top of the chroot creation process to get + rid of Perl's locale complaints. + - Don't over-install LTSP chroots if already created. (Closes: #1153763). + - Only update kernel of created chroot, don't touch the others. + - Use apt-get instead of apt (no cmdline API guarantee for apt). + Also, stop using -qq. It will hide mistakes which we may want to notice + rather. + - Stop installing apt-utils, nowadays replaced by apt. In addition, better + explain (in comment), why we install the ltsp package into the chroot, + although this is actually not needed (except for the kernel initrd + creation process). + - Run apt-get update && apt-get upgrade to have latest updates. + If a BD installation medium is used, debootstrap installs all packages + from that medium. If we are not offline, we want to ensure that security + updates get added to the chroot for those packages that got installed + from the installation medium. + - Simplify check for when to create a thinclient LTSP chroot. + - Add more Debian branding to X2Go thinclients. (Closes: #1153764). + * debian-edu-ltsp-chroot: + - Gracefully mount/unmount Debian Edu BD ISO image into chroot if configured + and media is inserted. (Closes: #1153756). + - Configure resolv.conf when entering an LTSP chroot. (Closes: #1153757). + - Make mounting the Debian Edu Installer BD ISO image optional. + * debian-edu-ltsp-{install,chroot}: + - Only attempt mounting BD installer medium if there is a medium inserted + in the optical drive. (Closes: #1153825). + * debian-edu-ltsp-ipxe: + - Add background image to iPXE boot menu (if the iPXE version supports it). + (Closes: #1153755). + * debian-edu-ltsp-*: + - Update copyright/author notices. + - White-space fixes. + - Indentation fixes. + - Add additional lines here and there. + * share/debian-edu-config/squid.conf: + - Comment out 'dns_v4_first on' as it throws verbose obsoletion warnings in + the logs (mentioning that this config will have no effect anymore anyway). + Also, add a FIXME reminder, because we might have to reinvestigate this + deeper. (Closes: #1153771). + + -- Mike Gabriel Thu, 12 Nov 2026 12:52:27 +0100 + +debian-edu-config (2.13.9) unstable; urgency=medium + + * run-at-firstboot: + - Fix check for successful LTSP chroot creations + + -- Mike Gabriel Mon, 09 Nov 2026 15:18:24 +0100 + +debian-edu-config (2.13.8) unstable; urgency=medium + + [ Mike Gabriel ] + * libexec/debian-edu-apache2-update-tjener-aliases: + - Only execute on host 'tjener', only if 'root'. (Closes: #1153506). + * run-at-firstboot: + - Launch debian-edu-ltsp-install with a clean environment. (Closes: #1153505). + * debian-edu-ltsp-install: + - Obtain LANG variable from LOCALE variable in /etc/debian-edu/config. + - White-space fix. + + [ Roland Clobus ] + * Use the proxy to speed up tests in a VM. (Closes: #1153509). + + -- Mike Gabriel Mon, 09 Nov 2026 13:24:23 +0100 + debian-edu-config (2.13.7~deb13u1) trixie; urgency=medium * Release to trixie. diff -Nru debian-edu-config-2.13.7~deb13u1/etc/debian-edu/pxeinstall.conf debian-edu-config-2.13.11~deb13u1/etc/debian-edu/pxeinstall.conf --- debian-edu-config-2.13.7~deb13u1/etc/debian-edu/pxeinstall.conf 2026-09-28 07:57:25.000000000 +0000 +++ debian-edu-config-2.13.11~deb13u1/etc/debian-edu/pxeinstall.conf 2026-11-12 20:57:36.000000000 +0000 @@ -1,5 +1,5 @@ -# Examples for local settings. Run 'debian-edu-pxeinstall' to re-generate the netboot -# environment and the iPXE menu each time any changes have been made.. +# Examples for site-specific settings. Run 'debian-edu-pxeinstall' to re-generate the netboot +# environment and the iPXE menu, each time any changes have been made to this file. # Set a different desktop environment for new installations instead of the default xfce one. #mydesktop=mate diff -Nru debian-edu-config-2.13.7~deb13u1/etc/debian-edu/thin/x2gothinclient-minidesktop_start debian-edu-config-2.13.11~deb13u1/etc/debian-edu/thin/x2gothinclient-minidesktop_start --- debian-edu-config-2.13.7~deb13u1/etc/debian-edu/thin/x2gothinclient-minidesktop_start 1970-01-01 00:00:00.000000000 +0000 +++ debian-edu-config-2.13.11~deb13u1/etc/debian-edu/thin/x2gothinclient-minidesktop_start 2026-11-12 17:53:21.000000000 +0000 @@ -0,0 +1,37 @@ +#!/bin/bash + +# Copyright (C) 2010-2019 by X2Go project, https://wiki.x2go.org +# Oleksandr Shneyder +# Moritz 'Morty' Struebe +# Mike Gabriel + +# X2Go is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# X2Go is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the +# Free Software Foundation, Inc., +# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + +# make sure pulseaudio can be reached via TCP from the X2Go Server side... +/usr/bin/pactl 'load-module' 'module-native-protocol-tcp' 'auth-ip-acl=127.0.0.1;::1' + +/usr/lib/x2go/x2goclient --no-menu \ + --maximize \ + --link=lan \ + --kbd-type=auto \ + --set-kbd=1 \ + --geometry=fullscreen \ + --background=/usr/share/desktop-base/active-theme/login/background-nologo.svg \ + --read-exports-from=~/export \ + --no-session-edit \ + --close-disconnect \ + --session=X2Go.Example \ + --add-to-known-hosts diff -Nru debian-edu-config-2.13.7~deb13u1/etc/debian-edu/thin/x2gothinclient_sessions.in debian-edu-config-2.13.11~deb13u1/etc/debian-edu/thin/x2gothinclient_sessions.in --- debian-edu-config-2.13.7~deb13u1/etc/debian-edu/thin/x2gothinclient_sessions.in 1970-01-01 00:00:00.000000000 +0000 +++ debian-edu-config-2.13.11~deb13u1/etc/debian-edu/thin/x2gothinclient_sessions.in 2026-11-12 17:53:21.000000000 +0000 @@ -0,0 +1,46 @@ +[default] +autologin=false +clipboard=both +command=@X2GO_COMMAND@ +defsndport=true +directrdp=false +directrdpsettings= +directxdmcp=false +directxdmcpsettings= +display=1 +dpi=96 +export="/usb0:1;" +fstunnel=true +fullscreen=true +height=600 +host=@HOSTNAME@ +icon=/usr/share/icons/hicolor/64x64/apps/x2goclient.png +iconvfrom=UTF-8 +iconvto=UTF-8 +krbdelegation=false +krblogin=false +maxdim=false +multidisp=false +name=Debian Edu Terminal Server +pack=16m-jpeg +print=true +published=false +quality=9 +rootless=false +setdpi=true +sndport=4713 +sound=true +soundsystem=pulse +soundtunnel=true +speed=4 +sshport=22 +sshproxyautologin=false +startsoundsystem=true +type=auto +useiconv=false +usekbd=true +usesshproxy=false +width=800 +xdmcpclient=Xnest +xdmcpserver=localhost +xinerama=false diff -Nru debian-edu-config-2.13.7~deb13u1/libexec/debian-edu-apache2-update-tjener-aliases debian-edu-config-2.13.11~deb13u1/libexec/debian-edu-apache2-update-tjener-aliases --- debian-edu-config-2.13.7~deb13u1/libexec/debian-edu-apache2-update-tjener-aliases 2026-11-09 00:22:40.000000000 +0000 +++ debian-edu-config-2.13.11~deb13u1/libexec/debian-edu-apache2-update-tjener-aliases 2026-11-12 17:53:21.000000000 +0000 @@ -15,6 +15,19 @@ set -euo pipefail # ----------------------------------------------------------------------------- +# Only run on tjener and only as root +# ----------------------------------------------------------------------------- +if [ "$(whoami)" != "root" ] ; then + echo "ERROR: $(basename $0) needs to be run as 'root', aborting..." + exit 1 +fi + +if [ "$(hostname -s)" != "tjener" ]; then + # silently exit, nothing to be done if not on tjener + exit 0 +fi + +# ----------------------------------------------------------------------------- # Configuration # ----------------------------------------------------------------------------- SCRIPT_PATH="/usr/libexec/debian-edu-config/debian-edu-apache2-update-tjener-aliases" diff -Nru debian-edu-config-2.13.7~deb13u1/sbin/debian-edu-ltsp-chroot debian-edu-config-2.13.11~deb13u1/sbin/debian-edu-ltsp-chroot --- debian-edu-config-2.13.7~deb13u1/sbin/debian-edu-ltsp-chroot 2026-09-15 22:02:18.000000000 +0000 +++ debian-edu-config-2.13.11~deb13u1/sbin/debian-edu-ltsp-chroot 2026-11-12 17:53:21.000000000 +0000 @@ -4,18 +4,26 @@ # with package 'ltsp-server 5.18.12-3' (Debian Buster). # Original information about authors and copyright: -# copyright 2009 Vagrant Cascadian , +# +# 2009 Vagrant Cascadian , # 2010 Alkis Georgopoulos , -# 2011 Wim Muskee , distributed under the -# terms of the GNU General Public License v2 or any later version. +# 2011 Wim Muskee , +# +# distributed under the terms of the GNU General Public License v2 or any +# later version. # Reduced to the bare minimum and adjusted to be useful for Debian Edu Bullseye. # Also, integrated everything into one tool to be usable standalone. +# # 2021 Wolfgang Schweer , distributed under the +# # terms of the GNU General Public License v2 or any later version. -# first edited: 2020-09-28 +# first edited: 2020-09-28 +# +# Updated by 2026, Mike Gabriel +# to be released with Debian Edu Trixie. -version=2023-01-30 +version=2026-11-11 # generic functions @@ -32,6 +40,9 @@ previous to chrooting. -h, --help Displays the debian-edu-ltsp-chroot help message. -p, --mount-proc If set, mounts the server /proc to the chroot previous to chrooting. + -i, --mount-isoimage If set (and Debian Edu BD ISO image is inserted into the optical drive), + this mounts the installation medium to /media/cdrom and bind-mounts + this into the chroot. -m, --mount-all If set, does both --mount-dev and --mount-proc previous to chrooting. --version Output version information and exit. EOF @@ -49,6 +60,7 @@ if boolean_is_true "$MOUNT_ALL"; then MOUNT_DEV=true MOUNT_PROC=true + MOUNT_ISOIMAGE=true fi if boolean_is_true "$MOUNT_DEV"; then mark_mount --bind "/dev" "$BASE/dev" @@ -57,12 +69,36 @@ if boolean_is_true "$MOUNT_PROC"; then mark_mount -t proc proc "$BASE/proc" fi + + # If the BD ISO image was used and it is still inserted, ensure that it is mounted. + if boolean_is_true "$MOUNT_ISOIMAGE"; then + # FIXME: this does not honour metal box installations from a USB iso9660 medium! + if grep -q BD /etc/apt/sources.list && ! mountpoint -q /media/cdrom && blkid /dev/sr0 1>/dev/null; then + if mark_mount -o ro /media/cdrom 2>/dev/null; then + bd_iso_was_mounted="yes" + fi + fi + + # If the BD ISO image is used, make it available inside the chroot, so that as many + # packages as possible are obtained from the BD image instead of downloading them. + if grep -q BD /etc/apt/sources.list && [ -e /media/cdrom/.disk/cd_type ] ; then + mkdir -p "${BASE}/media/cdrom" + mark_mount --bind /media/cdrom "${BASE}/media/cdrom" + fi + fi + + if [ ! -e "${BASE}/etc/resolv.conf" ]; then + RESOLVCONF_NOTFOUND=true + cp /etc/resolv.conf "${BASE}/etc/resolv.conf" + fi + } post_chroot() { # Stop trapping trap - 0 HUP INT QUIT KILL SEGV PIPE TERM umount_marked + cleanup_resolvconf } # Next functions are taken from ltsp-server-functions). @@ -114,7 +150,7 @@ fi if ! mount "$@"; then MARKED_MOUNTS="$old_marked_mounts" - die "Could not mount $dir." + warn "Could not mount $dir." fi } @@ -138,7 +174,7 @@ sync echo "$MARKED_MOUNTS" | while read -r dir; do # binfmt_misc might need to be unmounted manually, see LP #534211 - if [ "$dir%/proc}" != "$dir" ] && + if [ "$dir%/proc}" != "$dir" ] && [ -d "$dir/sys/fs/binfmt_misc" ] && [ -f "$dir/mounts" ] && grep -q "^binfmt_misc $dir/sys/fs/binfmt_misc" "$dir/mounts"; then if ! umount "$dir/sys/fs/binfmt_misc"; then @@ -152,6 +188,12 @@ unset MARKED_MOUNTS } +cleanup_resolvconf() { + if boolean_is_true "${RESOLVCONF_NOTFOUND}"; then + rm "${BASE}/etc/resolv.conf" + fi +} + # The command line parameters override the configuration file settings if ! args=$(getopt -n "$0" -o +a:b:dhmp -l \ 'base:,mount-dev,help,mount-all,mount-proc,version' -- "$@"); then diff -Nru debian-edu-config-2.13.7~deb13u1/sbin/debian-edu-ltsp-initrd debian-edu-config-2.13.11~deb13u1/sbin/debian-edu-ltsp-initrd --- debian-edu-config-2.13.7~deb13u1/sbin/debian-edu-ltsp-initrd 2026-09-15 22:02:18.000000000 +0000 +++ debian-edu-config-2.13.11~deb13u1/sbin/debian-edu-ltsp-initrd 2026-11-12 17:53:21.000000000 +0000 @@ -1,11 +1,12 @@ #!/bin/bash # # Debian Edu specific replacement for 'ltsp initrd' command. -# Author/Copyright: Wolfgang Schweer +# Author/Copyright: 2021-2023, Wolfgang Schweer +# Author/Copyright: 2026, Mike Gabriel # Licence: GPL2+ -# first edited: 2021-11-10 +# first edited: 2021-11-10 -version=2021-11-11 +version=2026-11-11 set -e @@ -22,21 +23,119 @@ EOF } +thin_prepare() { + type="${1}" + + if [ "${type}" = "bare" ]; then + # Needed for thin client auto login user. + mkdir -p /etc/ltsp/getty@tty1.service.d + cat < /etc/ltsp/getty@tty1.service.d/override.conf +[Service] +ExecStart= +ExecStart=-/usr/sbin/agetty -a thin --noclear %I $TERM +RestartSec=10 +EOF + + # Needed for thin client autofs setup (USB mass storage support (rw mode). + mkdir -p /etc/ltsp/autofs + cat < /etc/ltsp/autofs/extra.autofs +/- /etc/auto.usb0 --mode=0777 --timeout=3 +EOF + cat < /etc/ltsp/autofs/auto.usb0 +/usb0 -fstype=auto,rw,user,umask=000 :/dev/sda1 +EOF + + # Needed for thin client auto login configuration (startx). + mkdir -p /etc/ltsp/skel + cat < /etc/ltsp/skel/.profile +while true ; do + startx +done +EOF + + # Needed for thin client auto login configuration (x2goclient start). + cat < /etc/ltsp/skel/.xinitrc +exec x2goclient --no-menu --thinclient --background=/usr/share/desktop-base/active-theme/login/background-nologo.svg --add-to-known-hosts --no-session-edit --close-disconnect +EOF + + # Needed for thin client x2goclient configuration. + mkdir -p /etc/ltsp/skel/.x2goclient + + # Pick up x2go_desktop variabe from debian-edu-ltsp-install script run. + if [ -r "/var/lib/debian-edu/debian-edu-ltsp-initrd_x2go-command" ]; then + x2go_command="$(head -n1 "/var/lib/debian-edu/debian-edu-ltsp-initrd_x2go-command")" + fi + if [ -z "${x2go_command}" ]; then + # helpless fallback that nearly always works in X2Go + x2go_command=TERMINAL + fi + + # Needed for thin client (x2goclient preconfigured session). + cat /etc/debian-edu/thin/x2gothinclient_sessions.in \ + | sed -e "s/@HOSTNAME@/$(hostname -s)/g" \ + -e "s/@X2GO_COMMAND@/${x2go_command}/g" \ + > /etc/ltsp/skel/.x2goclient/sessions + + # Needed for thin client x2goclient configuration. + cat < /etc/ltsp/skel/.x2goclient/settings +[toolbar] +show=false +EOF + + # Needed for thin client x2goclient configuration. + cat < /etc/ltsp/skel/.x2goclient/printing +[General] +pdfview=false +showdialog=true + +[CUPS] +defaultprinter= + +[print] +command=lpr +ps=false +startcmd=false +stdin=false + +[view] +command=xpdf +open=true +EOF + + fi + +} + +thin_cleanup() { + type="${1}" + + if [ "${type}" = "bare" ]; then + rm -f /etc/ltsp/getty@tty1.service.d/override.conf + rmdir /etc/ltsp/getty@tty1.service.d + rm -Rf /etc/ltsp/autofs + fi + + rm -Rf /etc/ltsp/skel +} + thin() { - type="$1" + type="${1}" + arch="${2}" # Add specific configuration. - cat <> /etc/ltsp/ltsp.conf + if [ "${type}" = "bare" ]; then + cat <> /etc/ltsp/ltsp.conf POST_INIT_THIN_USER='useradd -G disk -m -d /run/home/thin -k /etc/ltsp/skel -r thin' POST_INIT_SYSTEMD='mkdir /etc/systemd/system/getty@tty1.service.d && \ cp /etc/ltsp/getty@tty1.service.d/override.conf /etc/systemd/system/getty@tty1.service.d' POST_INIT_AUTOFS='cp /etc/ltsp/autofs/extra.autofs /etc/auto.master.d && \ cp /etc/ltsp/autofs/auto.* /etc' EOF + fi # Create the ltsp.img file and move it to the right location. - echo "Updating LTSP initrd for $type:" + echo "Updating LTSP initrd for type: ${type}, arch: ${arch}:" ltsp initrd - mv /srv/tftp/ltsp/ltsp.img /srv/tftp/ltsp/"$type"/ltsp.img - echo "Moved /srv/tftp/ltsp/ltsp.img to /srv/tftp/ltsp/$type/" + mv /srv/tftp/ltsp/ltsp.img "/srv/tftp/ltsp/x2go-${type}-${arch}/ltsp.img" + echo "Moved /srv/tftp/ltsp/ltsp.img to /srv/tftp/ltsp/x2go-${type}-${arch}/" # Clean up ltsp.conf from image specific items. sed -i '/POST_INIT/d' /etc/ltsp/ltsp.conf @@ -62,23 +161,9 @@ server() { # Add specific configuration. - if echo "$PROFILE" | grep -Eq 'Main-Server' ; then - # The image is a copy of the main server's fs. On the server, autofs - # is disabled, but it is needed for diskless workstations. - # OTOH some services need to be disabled, i.e. 'masked'. - cat <> /etc/ltsp/ltsp.conf -PRE_INIT_AUTOFS="echo 'LDAPURI=ldap://ldap' >> /etc/default/autofs" -PRE_INIT_MAIN_SERVER="systemctl enable autofs" -POST_INIT_USE_FQDN="sed -i '/10.0.2.2/ s/server/tjener.intern tjener/' /etc/hosts" -POST_INIT_SITESUMMARY="sed -i 's/main-server/ltsp-client/' /etc/sitesummary/hostclass" -MASK_SYSTEM_SERVICES="apache2 named cups dovecot etckeeper exim4 squid tftpd-hpa \ -icinga2 nmbd slapd smbd systemd-journald xrdp xrdp-sesman krb5-kdc mariadb cfengine3 isc-dhcp-server" -EOF - else - cat <> /etc/ltsp/ltsp.conf + cat <> /etc/ltsp/ltsp.conf MASK_SYSTEM_SERVICES="etckeeper exim4 tftpd-hpa isc-dhcp-server xrdp xrdp-sesman" EOF - fi # Update the ltsp.img file and move it to the right location. echo "Updating LTSP initrd for use with the server's filesystem:" ltsp initrd @@ -91,8 +176,6 @@ fi # Clean up ltsp.conf from specific items. - sed -i '/PRE_INIT_MAIN/d' /etc/ltsp/ltsp.conf - sed -i '/PRE_INIT_AUTOFS/d' /etc/ltsp/ltsp.conf sed -i '/MASK_SYSTEM/d' /etc/ltsp/ltsp.conf } @@ -101,6 +184,11 @@ --version) echo $version ; exit 0 ;; esac +if [ ! -r /etc/ltsp/ltsp.conf ]; then + echo "NOTE: debian-edu-ltsp-install needs to run first, before using debian-edu-ltsp-initrd makes any sense." + exit 0 +fi + # Make Debian Edu profile available. if [ -r /etc/debian-edu/config ] ; then . /etc/debian-edu/config @@ -113,10 +201,17 @@ if [ -d "$BASE"/dlw ] ; then dlw ; fi # X2Go thin client variants. -variants="bare-amd64 display-amd64 desktop-amd64 bare-i386 display-i386 desktop-i386" +variants="bare display desktop" +archs="amd64" -for i in $variants ; do - if [ -d $BASE/x2go-"$i" ] ; then thin x2go-"$i" ; fi +for v in ${variants}; do + for a in ${archs}; do + if [ -d "$BASE/x2go-${v}-${a}" ] ; then + thin_prepare "${v}" + thin "${v}" "${a}" + thin_cleanup "${v}" + fi + done done case "$1" in diff -Nru debian-edu-config-2.13.7~deb13u1/sbin/debian-edu-ltsp-install debian-edu-config-2.13.11~deb13u1/sbin/debian-edu-ltsp-install --- debian-edu-config-2.13.7~deb13u1/sbin/debian-edu-ltsp-install 2026-11-09 00:22:40.000000000 +0000 +++ debian-edu-config-2.13.11~deb13u1/sbin/debian-edu-ltsp-install 2026-11-12 17:53:21.000000000 +0000 @@ -15,38 +15,48 @@ # The modified system provides a separate LTSP client network attached to eth1. # # Author/Copyright: Wolfgang Schweer +# Author/Copyright: Mike Gabriel # Licence: GPL2+ # first edited: 2019-11-21 -version=2023-03-25 +version=2026-11-11 set -e +get_timezone() { + if ! [ -L "$DPKG_ROOT/etc/localtime" ] ; then + return + fi + timezone="$(readlink "$DPKG_ROOT/etc/localtime")" + timezone="$(cd "$DPKG_ROOT/etc" && realpath -m -s "$timezone")" + echo "${timezone#/usr/share/zoneinfo/}" +} + select_desktop () { - # select the first found desktop as the default, based on what x2goclient - # (src/onmainwindow.cpp) and x2goserver (x2goserver/bin/x2goruncommand) - # support - if [ -x /usr/bin/startxfce4 ]; then # from xfce4-session - echo XFCE - elif [ -x /usr/bin/startplasma-x11 ]; then # from plasma-workspace - echo KDE - elif [ -x /usr/bin/gnome-session ]; then # from gnome-session-bin - echo GNOME - elif [ -x /usr/bin/mate-session ]; then # from mate-session - echo MATE - elif [ -x /usr/bin/startlxde ]; then # from openbox-lxde-session - echo LXDE - elif [ -x /usr/bin/startlxqt ]; then # from lxqt-session - echo LXQT - elif [ -x /usr/bin/cinnamon-session-cinnamon2d ]; then # from cinnamon - echo CINNAMON - elif [ -x /usr/bin/openbox-session ]; then # from openbox - echo OPENBOX - elif [ -x /usr/bin/icewm-session ]; then # from icewm - echo ICEWM - else - echo XFCE - fi + # select the first found desktop as the default, based on what x2goclient + # (src/onmainwindow.cpp) and x2goserver (x2goserver/bin/x2goruncommand) + # support + if [ -x /usr/bin/startxfce4 ]; then # from xfce4-session + echo XFCE + elif [ -x /usr/bin/startplasma-x11 ]; then # from plasma-workspace + echo KDE + elif [ -x /usr/bin/gnome-session ]; then # from gnome-session-bin + echo GNOME + elif [ -x /usr/bin/mate-session ]; then # from mate-session + echo MATE + elif [ -x /usr/bin/startlxde ]; then # from openbox-lxde-session + echo LXDE + elif [ -x /usr/bin/startlxqt ]; then # from lxqt-session + echo LXQT + elif [ -x /usr/bin/cinnamon-session-cinnamon2d ]; then # from cinnamon + echo CINNAMON + elif [ -x /usr/bin/openbox-session ]; then # from openbox + echo OPENBOX + elif [ -x /usr/bin/icewm-session ]; then # from icewm + echo ICEWM + else + echo XFCE + fi } # usage @@ -116,6 +126,10 @@ if [ -r /etc/debian-edu/config ] ; then . /etc/debian-edu/config + # Obtained from /etc/debian-edu/config + if [ -n "${LOCALE}" ]; then + export LANG="${LOCALE}" + fi fi # Grab dist value for both testing and stable release cases. @@ -124,6 +138,7 @@ else dist=$(lsb_release -sc) fi + # Set default values. arch="$(dpkg --print-architecture)" dns_server="10.0.2.2" @@ -134,6 +149,17 @@ desktop="xfce" x2go_desktop="$(select_desktop)" +# If apt was configured to use a proxy (e.g. in a VM), use it here too +if [ -z "$http_proxy" ]; then + eval $(apt-config shell http_proxy Acquire::http::Proxy) +fi +if [ -z "$https_proxy" ]; then + eval $(apt-config shell https_proxy Acquire::https::Proxy) +fi +if [ -z "$ftp_proxy" ]; then + eval $(apt-config shell ftp_proxy Acquire::ftp::Proxy) +fi + while [ $# -gt 0 ] ; do case "$1" in --arch) arch="$2" ; shift ;; @@ -144,7 +170,7 @@ --dlw) dlw="$2" ; shift ;; --img) img="$2" ; shift ;; --desktop) desktop="$2" ; shift ;; - --x2go_dektop) + --x2go_desktop) x2go_desktop="$(printf '%s\n' "$2" | tr '[:lower:]' '[:upper:]')" shift ;; --version) echo $version; exit 0 ;; @@ -152,6 +178,10 @@ shift done +# Hand over the x2go_desktop (either detected automatically or specified via cmdline option) +# to debian-edu-ltsp-initrd (needed for x2go-bare thinclient variant setup). +echo "${x2go_desktop}" > "/var/lib/debian-edu/debian-edu-ltsp-initrd_x2go-command" + kernel_arch="$arch" # Special case i386. @@ -176,7 +206,9 @@ # Debian Edu wants a greeter w/o user list, i.e. don't modify existing config. touch /etc/ltsp/client/init/55-display-manager.sh +fi +if [ ! -r /etc/ltsp/ltsp.conf ]; then # make ipxe menu entries more user friendly. cat < /etc/ltsp/ltsp.conf # /bin/sh -n @@ -185,60 +217,60 @@ [server] # Provide a full menu name for x2go-bare-amd64.img -IPXE_X2GO_BARE_AMD64_IMG="Plain X2Go Thin Client (64-Bit)" +IPXE_X2GO_BARE_AMD64_IMG="Plain X2Go Thin Client (amd64, SquashFS)" # Provide a full menu name for x2go-bare-i386.img -IPXE_X2GO_BARE_I386_IMG="Plain X2Go Thin Client (32-Bit)" +IPXE_X2GO_BARE_I386_IMG="Plain X2Go Thin Client (i386, SquashFS)" # Provide a full menu name for x2go-bare-amd64 -IPXE_X2GO_BARE_AMD64="Plain X2Go Thin Client (64-Bit, NFS rootfs)" +IPXE_X2GO_BARE_AMD64="Plain X2Go Thin Client (amd64, NFS rootfs)" # Provide a full menu name for x2go-bare-i386 -IPXE_X2GO_BARE_I386="Plain X2Go Thin Client (32-Bit, NFS rootfs)" +IPXE_X2GO_BARE_I386="Plain X2Go Thin Client (i386, NFS rootfs)" # Provide a full menu name for x2go-display-amd64.img -IPXE_X2GO_DISPLAY_AMD64_IMG="Display Mode X2Go Thin Client (64-Bit)" +IPXE_X2GO_DISPLAY_AMD64_IMG="Display Mode X2Go Thin Client (amd64, SquashFS)" # Provide a full menu name for x2go-display-i386.img -IPXE_X2GO_DISPLAY_I386_IMG="Display Mode X2Go Thin Client (32-Bit)" +IPXE_X2GO_DISPLAY_I386_IMG="Display Mode X2Go Thin Client (i386, SquashFS)" # Provide a full menu name for x2go-display-amd64 -IPXE_X2GO_DISPLAY_AMD64="Display Mode X2Go Thin Client (64-Bit, NFS rootfs)" +IPXE_X2GO_DISPLAY_AMD64="Display Mode X2Go Thin Client (amd64, NFS rootfs)" # Provide a full menu name for x2go-display-i386 -IPXE_X2GO_DISPLAY_I386="Display Mode X2Go Thin Client (32-Bit, NFS rootfs)" +IPXE_X2GO_DISPLAY_I386="Display Mode X2Go Thin Client (i386, NFS rootfs)" # Provide a full menu name for x2go-desktop-amd64.img -IPXE_X2GO_DESKTOP_AMD64_IMG="Desktop Mode X2Go Thin Client (64-Bit)" +IPXE_X2GO_DESKTOP_AMD64_IMG="Desktop Mode X2Go Thin Client (amd64, SquashFS)" # Provide a full menu name for thin/desktop-i386.img -IPXE_X2GO_DESKTOP_I386_IMG="Desktop Mode X2Go Thin Client (32-Bit)" +IPXE_X2GO_DESKTOP_I386_IMG="Desktop Mode X2Go Thin Client (i386, SquashFS)" # Provide a full menu name for x2go-desktop-amd64 -IPXE_X2GO_DESKTOP_AMD64="Desktop Mode X2Go Thin Client (64-Bit, NFS rootfs)" +IPXE_X2GO_DESKTOP_AMD64="Desktop Mode X2Go Thin Client (amd64, NFS rootfs)" # Provide a full menu name for thin/desktop-i386 -IPXE_X2GO_DESKTOP_I386="Desktop Mode X2Go Thin Client (32-Bit, NFS rootfs)" +IPXE_X2GO_DESKTOP_I386="Desktop Mode X2Go Thin Client (i386, NFS rootfs)" # Provide a full menu name for x86_64.img -IPXE_X86_64_IMG="Diskless Workstation (server's SquashFS image)" +IPXE_X86_64_IMG="Diskless Workstation (amd64, SquashFS)" # Provide a full menu name for x86_32.img -IPXE_X86_32_IMG="Diskless Workstation (32-Bit, server's SquashFS image)" +IPXE_X86_32_IMG="Diskless Workstation (i386, SquashFS)" # Provide a full menu name for dlw.img -IPXE_DLW_IMG="Diskless Workstation (SquashFS image from chroot)" +IPXE_DLW_IMG="Diskless Workstation (amd64, SquashFS)" # Provide a full menu name for dlw -IPXE_DLW="Diskless Workstation (Chroot as NFS rootfs)" +IPXE_DLW="Diskless Workstation (amd64, NFS rootfs)" ##### Set default boot value ###### # Default value is x86_64 or x86_32 (arch specific, Diskless Workstation) -# Plain X2Go Thin Client (64-Bit) +# Plain X2Go Thin Client (amd64) #DEFAULT_IMAGE="x2go-bare-amd64" -# Plain X2Go Thin Client (32-Bit) +# Plain X2Go Thin Client (i386) #DEFAULT_IMAGE="x2go-bare-i386" -# Display Mode X2Go Thin Client (64-Bit) +# Display Mode X2Go Thin Client (amd64) #DEFAULT_IMAGE="x2go-display-amd64" -# Desktop Mode X2Go Thin Client (64-Bit) +# Desktop Mode X2Go Thin Client (amd64) #DEFAULT_IMAGE="x2go-desktop-amd64" # Diskless Workstation (Chroot as NFS rootfs) #DEFAULT_IMAGE="dlw" -# Install Debian Edu/amd64 (64-Bit) +# Install Debian Edu/amd64 (amd64) #DEFAULT_IMAGE="amd64" -# Install Debian Edu/i386 (32-Bit) +# Install Debian Edu/i386 (i386) #DEFAULT_IMAGE="i386" ##### Set default iPXE menu timeout ###### @@ -281,179 +313,9 @@ EOF fi -# FIXME: On the main server even more additional excludes might be useful. -if echo "$PROFILE" | grep -Eq 'Main-Server' ; then - cat <> /etc/ltsp/image-local.excludes -etc/apache2 -etc/bind -etc/dbconfig-common -etc/dovecot -etc/etckeeper -etc/gosa -etc/freeradius -etc/icinga -etc/icinga2 -etc/icingaweb2 -etc/krb5kdc -etc/krb5.keytab.imap -etc/krb5.keytab.ldap -etc/krb5.keytab.smtp -etc/mysql -etc/nagios -etc/nagios-plugins -etc/nagios3 -etc/samba -etc/slbackup -etc/slbackup-php -usr/lib/apache2 -usr/lib/exim4 -usr/lib/icinga -usr/log/samba/* -usr/log/squid/* -var/cache/apache2/* -var/cache/apt/* -var/cache/bind/* -var/cache/debconf/* -var/cache/etckeeper/* -var/cache/gosa/* -var/cache/icinga/* -var/cache/munin/* -var/cache/nscd/* -var/cache/samba/* -var/lib/apache2/* -var/lib/cfengine3/* -var/lib/dbus/* -var/lib/dhcp/* -var/lib/dpkg/* -var/lib/exim4/* -var/lib/icinga/* -var/lib/ldap/* -var/lib/munin/* -var/lib/munin-node/* -var/lib/nfs/* -var/lib/samba/* -var/log/apache2/* -var/log/cfengine/* -var/log/installer/* -var/log/munin/* -var/log/samba/* -var/log/squid/* -var/mail/* -var/log/*.gz -var/spool/squid -EOF -fi - -# Needed for thin client auto login user. -mkdir -p /etc/ltsp/getty@tty1.service.d -cat < /etc/ltsp/getty@tty1.service.d/override.conf -[Service] -ExecStart= -ExecStart=-/usr/sbin/agetty -a thin --noclear %I $TERM -RestartSec=10 -EOF - -# Needed for thin client autofs setup (USB mass storage support (rw mode). -mkdir -p /etc/ltsp/autofs -cat < /etc/ltsp/autofs/extra.autofs -/- /etc/auto.usb0 --mode=0777 --timeout=3 -EOF -cat < /etc/ltsp/autofs/auto.usb0 -/usb0 -fstype=auto,rw,user,umask=000 :/dev/sda1 -EOF - -# Needed for thin client auto login configuration (startx). -mkdir -p /etc/ltsp/skel -cat < /etc/ltsp/skel/.profile -while true ; do - startx -done -EOF - -# Needed for thin client auto login configuration (x2goclient start). -cat < /etc/ltsp/skel/.xinitrc -exec x2goclient --no-menu --add-to-known-hosts --no-session-edit --close-disconnect -EOF - -# Needed for thin client x2goclient configuration. -mkdir -p /etc/ltsp/skel/.x2goclient -cat < /etc/ltsp/skel/.x2goclient/printing -[General] -pdfview=false -showdialog=true - -[CUPS] -defaultprinter= - -[print] -command=lpr -ps=false -startcmd=false -stdin=false - -[view] -command=xpdf -open=true -EOF - -# Needed for thin client (x2goclient preconfigured session). -cat < /etc/ltsp/skel/.x2goclient/sessions -[default] -autologin=false -clipboard=both -command=$x2go_desktop -defsndport=true -directrdp=false -directrdpsettings= -directxdmcp=false -directxdmcpsettings= -display=1 -dpi=96 -export="/usb0:1;" -fstunnel=true -fullscreen=true -height=600 -host=$(hostname -s) -icon=/usr/share/icons/hicolor/64x64/apps/x2goclient.png -iconvfrom=ISO8859-1 -iconvto=UTF-8 -krbdelegation=false -krblogin=false -maxdim=false -multidisp=false -name=Debian Edu Thin Client -pack=16m-jpeg -print=true -published=false -quality=9 -rootless=false -setdpi=true -sndport=4713 -sound=true -soundsystem=pulse -soundtunnel=true -speed=4 -sshport=22 -sshproxyautologin=false -startsoundsystem=true -type=auto -useiconv=false -usekbd=true -usesshproxy=false -width=800 -xdmcpclient=Xnest -xdmcpserver=localhost -xinerama=false -EOF - -# Needed for thin client x2goclient configuration. -cat < /etc/ltsp/skel/.x2goclient/settings -[toolbar] -show=false -EOF - # If the BD ISO image is used, ensure that it is mounted. -if grep -q BD /etc/apt/sources.list && ! mountpoint -q /media/cdrom ; then +# FIXME: this does not honour metal box installations from a USB iso9660 medium! +if grep -q BD /etc/apt/sources.list && ! mountpoint -q /media/cdrom && blkid /dev/sr0 1>/dev/null; then bd_iso_was_mounted="yes" mount /media/cdrom -o ro fi @@ -467,15 +329,40 @@ # Create thin client chroot and generate image. export DEBIAN_FRONTEND=noninteractive -if ! [ "" == "$thin_type" ] && [ ! -d /srv/tftp/ltsp/x2go-"$thin_type"-"$arch"/etc/ltsp ] ; then +if [ "" != "$thin_type" ]; then + + if [ -d "/srv/ltsp/x2go-${thin_type}-${arch}" ]; then + echo "ERROR: X2Go thinclient chroot '/srv/ltsp/x2go-${thin_type}-${arch}' already exists." + echo " Remove the chroot and re-run this script." + exit 1 + fi + mkdir -p /srv/tftp/ltsp/x2go-"$thin_type"-"$arch" # Install common thin client packages. -debootstrap --arch="$arch" --no-check-gpg --variant=minbase --include=sitesummary-client,linux-image-"$kernel_arch" \ - "$dist" /srv/ltsp/x2go-"$thin_type"-"$arch" "$mirror" + debootstrap --arch="$arch" \ + --no-check-gpg \ + --variant=minbase \ + --include=console-setup,locales,sitesummary-client,linux-image-"${kernel_arch}" \ + "${dist}" "/srv/ltsp/x2go-${thin_type}-${arch}" "${mirror}" # Unset temporary directory variables to avoid problems when directory # is missing inside the chroot. https://bugs.debian.org/765443 unset TMPDIR TEMP TEMPDIR TMP - chroot /srv/ltsp/x2go-"$thin_type"-"$arch"/ apt clean + chroot /srv/ltsp/x2go-"$thin_type"-"$arch"/ apt-get clean + + # Configure locale et al. + cp /etc/locale.gen /srv/ltsp/x2go-"$thin_type"-"$arch"/etc/ + cp /etc/default/locale /srv/ltsp/x2go-"$thin_type"-"$arch"/etc/default + chroot /srv/ltsp/x2go-"$thin_type"-"$arch" locale-gen + cp /etc/default/keyboard /srv/ltsp/x2go-"$thin_type"-"$arch"/etc/default + cp /etc/default/console-setup /srv/ltsp/x2go-"$thin_type"-"$arch"/etc/default + chroot /srv/ltsp/x2go-"$thin_type"-"$arch" setupcon -k + + # Set timezone properly. + timezone="$(get_timezone)" + echo "${timezone}" > "/srv/ltsp/x2go-${thin_type}-${arch}/etc/timezone" + chroot /srv/ltsp/x2go-"$thin_type"-"$arch" ln -fs "/usr/share/zoneinfo/${timezone}" "/etc/localtime" + chroot /srv/ltsp/x2go-"$thin_type"-"$arch" dpkg-reconfigure -f noninteractive tzdata + # Care for complete sources list (security, also nonfree -- in case firmware is needed). if [ -e /srv/ltsp/x2go-"$thin_type"-"$arch"/usr/share/doc/apt/examples/sources.list ] ; then # Up to bookworm @@ -491,17 +378,22 @@ mount /media/cdrom /srv/ltsp/x2go-"$thin_type"-"$arch"/media/cdrom -o bind echo "deb [trusted=yes] $mirror $dist main" > /srv/ltsp/x2go-"$thin_type"-"$arch"/etc/apt/sources.list fi - chroot /srv/ltsp/x2go-"$thin_type"-"$arch"/ apt -y -qq install education-thin-client p910nd + chroot /srv/ltsp/x2go-"$thin_type"-"$arch"/ apt-get update + chroot /srv/ltsp/x2go-"$thin_type"-"$arch"/ apt-get -y -q upgrade + chroot /srv/ltsp/x2go-"$thin_type"-"$arch"/ apt-get -y -q install education-thin-client p910nd + chroot /srv/ltsp/x2go-"$thin_type"-"$arch"/ apt-get -y -q install debian-edu-artwork # Install case specific additional packages. if [ "display" == "$thin_type" ] ; then - chroot /srv/ltsp/x2go-"$thin_type"-"$arch"/ apt -y -qq install x2gothinclient-displaymanager + chroot /srv/ltsp/x2go-"$thin_type"-"$arch"/ apt-get -y -q install x2gothinclient-displaymanager + cp /usr/share/desktop-base/active-theme/login/background-nologin.svg /srv/ltsp/x2go-"$thin_type"-"$arch"/etc/x2go/x2gothinclient-displaymanager_background.svg fi if [ "desktop" == "$thin_type" ] ; then - chroot /srv/ltsp/x2go-"$thin_type"-"$arch"/ apt -y -qq install x2gothinclient-minidesktop \ - x2gothinclient-cdmanager x2gothinclient-usbmount + chroot /srv/ltsp/x2go-"$thin_type"-"$arch"/ apt-get -y -q install x2gothinclient-minidesktop x2gothinclient-cdmanager x2gothinclient-usbmount if ! [ "en" == "$LANGCODE" ] ; then - chroot /srv/ltsp/x2go-"$thin_type"-"$arch"/ apt -y -qq install firefox-esr-l10n-"$LANGCODE" + chroot /srv/ltsp/x2go-"$thin_type"-"$arch"/ apt-get -y -q install firefox-esr-l10n-"$LANGCODE" fi + # Use Debian Edu version of x2gothinclient-minidesktop_start + cp /etc/debian-edu/thin/x2gothinclient-minidesktop_start /srv/ltsp/x2go-"$thin_type"-"$arch"/etc/x2go/ fi if [ "true" == "$BD_ISO" ] ; then umount /srv/ltsp/x2go-"$thin_type"-"$arch"/media/cdrom @@ -512,13 +404,6 @@ rm -rf /srv/ltsp/x2go-"$thin_type"-"$arch"/var/cache/debconf rm -rf /srv/ltsp/x2go-"$thin_type"-"$arch"/var/cache/man fi - # Configure locale et al. - cp /etc/locale.gen /srv/ltsp/x2go-"$thin_type"-"$arch"/etc/ - cp /etc/default/locale /srv/ltsp/x2go-"$thin_type"-"$arch"/etc/default - chroot /srv/ltsp/x2go-"$thin_type"-"$arch" locale-gen - cp /etc/default/keyboard /srv/ltsp/x2go-"$thin_type"-"$arch"/etc/default - cp /etc/default/console-setup /srv/ltsp/x2go-"$thin_type"-"$arch"/etc/default - chroot /srv/ltsp/x2go-"$thin_type"-"$arch" setupcon -k # Configure Sitesummary. cp -r /etc/sitesummary/config.d/ /srv/ltsp/x2go-"$thin_type"-"$arch"/etc/sitesummary/ cp -f /etc/sitesummary/site /srv/ltsp/x2go-"$thin_type"-"$arch"/etc/sitesummary/ @@ -527,8 +412,16 @@ # Customize X2Go client for Debian Edu use. if [ "display" == "$thin_type" ] || [ "desktop" == "$thin_type" ] ; then - cp /etc/ltsp/skel/.x2goclient/sessions /srv/ltsp/x2go-"$thin_type"-"$arch"/etc/x2go/x2gothinclient_sessions + cat /etc/debian-edu/thin/x2gothinclient_sessions.in \ + | sed -e "s/@HOSTNAME@/$(hostname -s)/g" \ + -e "s/@X2GO_COMMAND@/${x2go_desktop}/g" \ + > /srv/ltsp/x2go-"$thin_type"-"$arch"/etc/x2go/x2gothinclient_sessions + chroot /srv/ltsp/x2go-"$thin_type"-"$arch"/ ln -fs /usr/share/images/desktop-base/desktop-background /etc/x2go/x2gothinclient-minidesktop_background.svg fi + + # This needs to be installed after x2gothinclient-minidesktop installation. + chroot /srv/ltsp/x2go-"$thin_type"-"$arch"/ update-alternatives --set desktop-background /usr/share/desktop-base/active-theme/wallpaper/contents/images/1920x1080.svg + # Firefox-ESR customization for Debian Edu. if [ "desktop" == "$thin_type" ] ; then cp /etc/environment /srv/ltsp/x2go-"$thin_type"-"$arch"/etc @@ -570,47 +463,19 @@ ltsp image /srv/ltsp/x2go-"$thin_type"-"$arch" fi - # Create a runtime user for x2go login terminal; configure autofs (USB storage support). - if [ "bare" == "$thin_type" ] ; then - cat <> /etc/ltsp/ltsp.conf -POST_INIT_THIN_USER='useradd -G disk -m -d /run/home/thin -k /etc/ltsp/skel -r thin' - -POST_INIT_SYSTEMD='mkdir /etc/systemd/system/getty@tty1.service.d && \ -cp /etc/ltsp/getty@tty1.service.d/override.conf /etc/systemd/system/getty@tty1.service.d' + # Prepare X2Go thinclient kernel image for PXE booting. + ltsp kernel "x2go-${thin_type}-${arch}" -POST_INIT_AUTOFS='cp /etc/ltsp/autofs/extra.autofs /etc/auto.master.d && \ -cp /etc/ltsp/autofs/auto.* /etc' -EOF - fi - - ALL_IMAGES=1 ltsp kernel - # Create the ltsp.img file and move it to where it belongs. - ltsp initrd - mv /srv/tftp/ltsp/ltsp.img /srv/tftp/ltsp/x2go-"$thin_type"-"$arch"/ltsp.img - - # Clean up ltsp.conf from image specific items. - sed -i '/POST_INIT/d' /etc/ltsp/ltsp.conf fi # Generate image for diskless workstation. if [ "yes" == "$diskless_workstation" ] ; then + if echo "$PROFILE" | grep -Eq 'Main-Server' ; then - # The image is a copy of the main server's fs. On the server, autofs - # is disabled, but it is needed for diskless workstations. - # OTOH some services need to be disabled, i.e. 'masked'. - cat <> /etc/ltsp/ltsp.conf -PRE_INIT_AUTOFS="echo 'LDAPURI=ldap://ldap' >> /etc/default/autofs" -PRE_INIT_MAIN_SERVER="systemctl enable autofs" -POST_INIT_USE_FQDN="sed -i '/10.0.2.2/ s/server/tjener.intern tjener/' /etc/hosts" -POST_INIT_SITESUMMARY="sed -i 's/main-server/ltsp-client/' /etc/sitesummary/hostclass" -MASK_SYSTEM_SERVICES="apache2 named cups dovecot etckeeper exim4 squid tftpd-hpa \ -icinga2 nmbd slapd smbd systemd-journald xrdp xrdp-sesman krb5-kdc mariadb cfengine3 isc-dhcp-server" -EOF - else - cat <> /etc/ltsp/ltsp.conf -MASK_SYSTEM_SERVICES="etckeeper exim4 tftpd-hpa isc-dhcp-server xrdp xrdp-sesman" -EOF + echo "ERROR: Creating diskless workstations from host OS is not supported in the Main-Server" + exit 1 fi + # Temporary workaround needed in some cases for configuring the resolver inside # the SquashFS image. rm -f /etc/resolv.conf @@ -625,36 +490,47 @@ ln -s /run/resolvconf/resolv.conf /etc/resolv.conf # Revert temporary change to PROFILE in /etc/debian-edu/config sed -i /etc/debian-edu/config -e "s/^PROFILE=.*/PROFILE=\"${PROFILE}\"/g" - # next modification avoids ltsp command error if lot of images are available. - ALL_IMAGES=1 ltsp kernel - ltsp initrd - if uname -r | grep -q 686 ; then - mv /srv/tftp/ltsp/ltsp.img /srv/tftp/ltsp/x86_32/ltsp.img - else - mv /srv/tftp/ltsp/ltsp.img /srv/tftp/ltsp/"$(uname -m)"/ltsp.img - fi - # Clean up ltsp.conf from specific items. - sed -i '/PRE_INIT_MAIN/d' /etc/ltsp/ltsp.conf - sed -i '/PRE_INIT_AUTOFS/d' /etc/ltsp/ltsp.conf - sed -i '/MASK_SYSTEM/d' /etc/ltsp/ltsp.conf + fi # Generate chroot and SquashFS image (optional) for diskless workstation. if [ "yes" == "$dlw" ] ; then + + if [ -d "/srv/ltsp/dlw" ]; then + echo "ERROR: Diskless Workstation chroot '/srv/ltsp/dlw' already exists." + echo " Remove the chroot and re-run this script." + exit 1 + fi + # The chroot is basically a workstation installation. # Petter Reinholdtsen's debian-edu-bless script is used to achieve it. - cat <> /etc/ltsp/ltsp.conf -LIGHTDM_CONF="greeter-hide-users" -POST_INIT_USE_FQDN="sed -i '/10.0.2.2/ s/server/tjener.intern tjener/' /etc/hosts" -EOF mkdir -p /srv/ltsp/dlw chmod 755 /srv/ltsp/dlw # Install base system - debootstrap --arch="$arch" --no-check-gpg --variant=minbase --include=locales,console-setup,linux-image-"$kernel_arch" "$dist" /srv/ltsp/dlw "$mirror" + debootstrap --arch="$arch" \ + --no-check-gpg \ + --variant=minbase \ + --include=locales,console-setup,linux-image-"${kernel_arch}" \ + "${dist}" /srv/ltsp/dlw "${mirror}" # Unset temporary directory variables to avoid problems when directory # is missing inside the chroot. https://bugs.debian.org/765443 unset TMPDIR TEMP TEMPDIR TMP - chroot /srv/ltsp/dlw/ apt clean + chroot /srv/ltsp/dlw/ apt-get clean + + # Care for same locale and keyboard settings in the chroot, also useful to quiet down Perl. + cp /etc/locale.gen /srv/ltsp/dlw/etc/ + cp /etc/default/locale /srv/ltsp/dlw/etc/default + chroot /srv/ltsp/dlw locale-gen + cp /etc/default/keyboard /srv/ltsp/dlw/etc/default + cp /etc/default/console-setup /srv/ltsp/dlw/etc/default + chroot /srv/ltsp/dlw setupcon -k + + # Set timezone properly. + timezone="$(get_timezone)" + echo "${timezone}" > "/srv/ltsp/dlw/etc/timezone" + chroot /srv/ltsp/dlw ln -fs "/usr/share/zoneinfo/${timezone}" "/etc/localtime" + chroot /srv/ltsp/dlw dpkg-reconfigure -f noninteractive tzdata + # Care for complete sources list (security, also nonfree -- in case firmware is needed). if [ -e /srv/ltsp/dlw/usr/share/doc/apt/examples/sources.list ] ; then # Up to bookworm @@ -671,20 +547,22 @@ echo "deb [trusted=yes] $mirror $dist main" > /srv/ltsp/dlw/etc/apt/sources.list fi - # Care for same locale and keyboard settings in the chroot, also useful to quiet down Perl. - cp /etc/locale.gen /srv/ltsp/dlw/etc/ - cp /etc/default/locale /srv/ltsp/dlw/etc/default - chroot /srv/ltsp/dlw locale-gen - cp /etc/default/keyboard /srv/ltsp/dlw/etc/default - cp /etc/default/console-setup /srv/ltsp/dlw/etc/default - chroot /srv/ltsp/dlw setupcon -k - # Care for special files. mkdir -p /srv/ltsp/dlw/tmp/user/0/ cp /usr/share/debian-edu-config/tools/debian-edu-bless /srv/ltsp/dlw/sbin - # Install the mandatory ltsp package (and apt-utils to don't delay package configuration). - chroot /srv/ltsp/dlw apt-get install -y -qq apt-utils ltsp + chroot /srv/ltsp/dlw/ apt-get update + chroot /srv/ltsp/dlw/ apt-get -q -y upgrade + + # Install the ltsp package. Most of LTSP's client code is provided by the + # ltsp.img initrd injected into the LTSP client via kernel cmdline. + # However, for generating the kernel's initrd from within the DLW chroot, + # we need /usr/share/initramfs-tools/hooks/ltsp-next. + # + # We could copy the host's version into the DLW chroot, but who knows what + # changes might break this process in the future (either on host or in + # LTSP chroot). Better use ltsp from the LTSP client's Debian version. + chroot /srv/ltsp/dlw apt-get install -y -q ltsp # Turn system into a Debian Edu workstation. chroot /srv/ltsp/dlw sh -c "PROFILE=Workstation DESKTOP=$desktop /sbin/debian-edu-bless" @@ -717,20 +595,14 @@ ltsp image dlw fi - # Next modification avoids ltsp command error if lot of images are available. - ALL_IMAGES=1 ltsp kernel + # Prepare DLW kernel image for PXE booting. + ltsp kernel dlw - # Create ltsp initrd (ltsp.img) and move it to the right location. - ltsp initrd - mv /srv/tftp/ltsp/ltsp.img /srv/tftp/ltsp/dlw/ - - # Update iPXE menu and adjust the created file for Debian Edu needs. - ltsp ipxe - sed -i 's#ltsp/ltsp.img#ltsp/${img}/ltsp.img#' /srv/tftp/ltsp/ltsp.ipxe - - # Clean up ltsp.conf from image specific items. - sed -i '/POST_INIT/d' /etc/ltsp/ltsp.conf - sed -i '/LIGHTDM_CONF/d' /etc/ltsp/ltsp.conf +fi + +# Unmount the BD image, if it was mounted at the start of this script. +if [ "yes" == "$bd_iso_was_mounted" ] ; then + umount /media/cdrom fi # Get rid of additional excludes just in case they exist (main server). @@ -786,28 +658,9 @@ exportfs -rav fi -# Generate the LTSP specific iPXE menu -ltsp ipxe -# Add PXE installation related entries to iPXE menu. -if ! grep -q main-server /srv/tftp/ltsp/ltsp.ipxe && \ - [ -f /srv/tftp/debian-installer/amd64/linux ] ; then - echo "Modifying /srv/tftp/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 /srv/tftp/debian-edu/install.cfg >>/srv/tftp/ltsp/ltsp.ipxe -fi - -# Make sure /srv/tftp/ltsp/ltsp.ipxe is Debian Edu specific. -sed -i "s#ltsp/ltsp.img#ltsp/${img}/ltsp.img#" /srv/tftp/ltsp/ltsp.ipxe -# Add "quiet" and "splash" parameters to hide kernel logs on a boot screen. -sed -i "s/set cmdline ${cmdline_method} ${cmdline_ltsp} ${cmdline_client}$/set cmdline ${cmdline_method} ${cmdline_ltsp} ${cmdline_client} ${KERNEL_PARAMETERS}/" /srv/tftp/ltsp/ltsp.ipxe +# Debian Edu diskless machines use different ltsp.img files, so create them separately. +debian-edu-ltsp-initrd -# Unmount the BD image, if it was mounted at the start of this script. -if [ "yes" == "$bd_iso_was_mounted" ] ; then - umount /media/cdrom -fi +# Prepare the best ltsp.ipxe config for this server that we can... +debian-edu-ltsp-ipxe diff -Nru debian-edu-config-2.13.7~deb13u1/sbin/debian-edu-ltsp-ipxe debian-edu-config-2.13.11~deb13u1/sbin/debian-edu-ltsp-ipxe --- debian-edu-config-2.13.7~deb13u1/sbin/debian-edu-ltsp-ipxe 2026-10-17 20:41:36.000000000 +0000 +++ debian-edu-config-2.13.11~deb13u1/sbin/debian-edu-ltsp-ipxe 2026-11-12 20:57:36.000000000 +0000 @@ -1,26 +1,245 @@ #!/bin/sh +# +# Regenerate Debian Edu ltsp.ipxe configuration +# +# This needs to take into account: +# - LTSP images +# - Debian Installer images set -e -# Generate the LTSP specific iPXE menu -ltsp ipxe 2> /dev/null +# Grab dist value for both testing and stable release cases. +if grep -q / /etc/debian_version ; then + # Likely a Debian testing/unstable system this script is executed on. + dist_codename=$(cat /etc/debian_version | cut -d/ -f1) + dist_version=${dist_codename} +else + # A stable release of Debian. + dist_codename=$(lsb_release -sc) + dist_version=$(lsb_release -sr) +fi + + +# For PXE installation part of the ltsp.ipxe file +[ "$archs" ] || archs="amd64" +[ "$theme" ] || theme="$(ls -L /etc/alternatives/desktop-theme/plymouth 2>/dev/null | grep script | cut -d'.' -f 1)" +[ "$hostname" ] || hostname=pxeinstall +[ "$domain" ] || domain=intern +[ "$mydesktop" ] || mydesktop="${default_mydesktop}" +[ "$graphicdi" ] || graphicdi=false + +# Where to find the preseed file on the web +preseedurl=http://www/debian-edu-install.dat + +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 [ "tasksel/desktop" = $template ] && [ -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="${default_mydesktop}" + fi + if [ "tasksel/desktop" = $template ] && [ "${mydesktop}" != "${default_mydesktop}" ]; then + # Let setting from /etc/debian-edu/pxeinstall.conf override tasksel/desktop. + value="${mydesktop}" + fi + + # Map the long debconf names to the keywords supported in the kernel cmdline. + if [ "tasksel/desktop" = $template ] ; then template=desktop; fi + 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 + +# Start from a clean state after any configuration changes have been made. +if [ -d $tftpdir/ltsp ] ; then + rm -rf $tftpdir/debian-edu + rm -f $tftpdir/ltsp/ltsp.ipxe + # re-generate clean ipxe menu file in case of LTSP client support. + # FIXME: also check if chroot folders exist!!! + if [ -d /srv/ltsp/images ] ; then + ltsp ipxe + fi +fi + +[ -d $tftpdir ] || mkdir $tftpdir +[ -d $tftpdir/debian-edu ] || mkdir $tftpdir/debian-edu + +if [ -d "/srv/tftp/debian-installer/${dist_version}" ]; then + di_versions_supported="$(cd /srv/tftp/debian-installer/; ls -1 | grep -E '^[0-9]+$' | sort -r -h)" +else + di_versions_supported="" +fi + +menufile=$tftpdir/debian-edu/install.cfg +echo "Generating $menufile" +( + if [ true = "$graphicdi" ]; then + gtkvideo="vga=788" + fi + for arch in $archs ; do + for di_ver in ${di_versions_supported}; do + if [ -d "${tftpdir}/debian-installer/${di_ver}/${arch}" ]; then + 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 [ -n "${di_versions_supported}" ] && [ -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" + + # Configure background picture for iPXE versions that support that. + sed -i ${tftpdir}/ltsp/ltsp.ipxe \ + -e "$(grep -n -E '^# Configure iPXE for LTSP$' ${tftpdir}/ltsp/ltsp.ipxe | tail -1 | cut -f1 -d":") a \\ +\\ +console --picture /debian-edu/debian-edu-pxe.png ||\\ +" + + # Support server OS's version of the Debian Installer, but also earlier / later versions. + sed -i ${tftpdir}/ltsp/ltsp.ipxe \ + -e "$(grep -n -E "^item --key [0-9]+ .*" ${tftpdir}/ltsp/ltsp.ipxe | tail -1 | cut -f1 -d":") a item\\ +item --gap Installation:\\ +item --key i amd64_${dist_version} Install Debian Edu ${dist_version} / amd64\\ +# BEGIN: Debian-Installer other versions\\ +# END: Debian-Installer other versions" + cat $menufile >> $tftpdir/ltsp/ltsp.ipxe + fi +elif [ -n "${di_versions_supported}" ]; then + # 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 < ${tftpdir}/ltsp/ltsp.ipxe +#!ipxe +# +# Configure iPXE for network installations + +console --picture /debian-edu/debian-edu-pxe.png || + +# Set the default image (img) based on arch, or to root-path if it's not empty +cpuid --ext 29 && set img amd64_${dist_version} || set img i386_${dist_version} + +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 i amd64_${dist_version} Install Debian Edu ${dist_version} / amd64 +item +# BEGIN: Debian-Installer other versions +# END: Debian-Installer other versions +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 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 -# Add PXE installation related entries to iPXE menu. -if ! grep -q main-server /srv/tftp/ltsp/ltsp.ipxe && \ - [ -f /srv/tftp/debian-installer/amd64/linux ] ; then - echo "Modifying /srv/tftp/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 /srv/tftp/debian-edu/install.cfg >>/srv/tftp/ltsp/ltsp.ipxe +# Insert other Debian-Installer versions, if any. +if [ -n "${di_versions_supported}" ] && [ "${dist_version}" != "${di_versions_supported}" ]; then + # We have more D-I netboot versions installed, so inject them into the iPXE boot menu + for di_ver in ${di_versions_supported}; do + for arch in ${archs}; do + if [ "${di_ver}" = "${dist_version}" ]; then + # we already have this, see above + : + else + if [ -d $tftpdir/debian-installer/${di_ver}/${arch} ]; then + sed -i "/^# END: Debian-Installer other versions/i \ +item ${arch}_${di_ver} Install Debian Edu ${di_ver} / ${arch}\ +" ${tftpdir}/ltsp/ltsp.ipxe + fi + fi + done + done +else + sed -E -i "${tftpdir}/ltsp/ltsp.ipxe" -e "/# (BEGIN|END): Debian-Installer other versions/d" fi # Make sure /srv/tftp/ltsp/ltsp.ipxe is Debian Edu specific. sed -i 's#ltsp/ltsp.img#ltsp/${img}/ltsp.img#' /srv/tftp/ltsp/ltsp.ipxe # Add "quiet" and "splash" parameters to hide kernel logs on a boot screen. sed -i 's/set cmdline ${cmdline_method} ${cmdline_ltsp} ${cmdline_client}$/set cmdline ${cmdline_method} ${cmdline_ltsp} ${cmdline_client} quiet splash/' /srv/tftp/ltsp/ltsp.ipxe -echo "" -echo "/srv/tftp/ltsp/ltsp.ipxe has been modified." diff -Nru debian-edu-config-2.13.7~deb13u1/sbin/debian-edu-pxeinstall debian-edu-config-2.13.11~deb13u1/sbin/debian-edu-pxeinstall --- debian-edu-config-2.13.7~deb13u1/sbin/debian-edu-pxeinstall 2026-11-01 13:57:25.000000000 +0000 +++ debian-edu-config-2.13.11~deb13u1/sbin/debian-edu-pxeinstall 2026-11-12 20:57:36.000000000 +0000 @@ -10,8 +10,8 @@ LC_ALL=C export LC_ALL -## FIXME: Why is resolv.conf empty or missing? Because network -## was started in the chroot (target)? +## 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 @@ -33,8 +33,8 @@ echo "info: Create temporary /etc/resolv.conf with DNS: $DNS." cat >> /etc/resolv.conf < /etc/resolvconf/run/resolv.conf, i.e.: +## If you find it after installation, something went wrong. Try to replace it +## by a symlink: /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 @@ -61,16 +61,10 @@ dist_version=$(lsb_release -sr) fi -default_mydesktop="xfce" - [ "$archs" ] || archs="amd64" [ "$mirrorurl" ] || mirrorurl=http://deb.debian.org/debian -[ "$hostname" ] || hostname=pxeinstall -[ "$domain" ] || domain=intern -[ "$mydesktop" ] || mydesktop="${default_mydesktop}" [ "$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 @@ -85,60 +79,17 @@ . /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="${default_mydesktop}" - fi - - if [ "tasksel/desktop" = $template ] && [ "${mydesktop}" != "${default_mydesktop}" ]; then - # Let setting from /etc/debian-edu/pxeinstall.conf override tasksel/desktop. - value="${mydesktop}" - fi - - # Map the long debconf names to the keywords supported in the kernel cmdline. - if [ "tasksel/desktop" = $template ] ; then template=desktop; fi - 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 [ -d $tftpdir/debian-installer ] || \ mkdir $tftpdir/debian-installer @@ -310,145 +261,5 @@ fi ) > $preseedfile -menufile=$tftpdir/debian-edu/install.cfg -echo "Generating $menufile" -( - if [ true = "$graphicdi" ]; then - gtkvideo="vga=788" - fi - for arch in $archs ; do - for di_ver in ${di_versions_supported}; do - if [ -d "${tftpdir}/debian-installer/${di_ver}/${arch}" ]; then - 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" - - # FIXME: also support other installer versions here, currently only latest version gets - # integrated into LTSP servers ltsp.ipxe file. - - sed -i "/^menu.*/ a item\ -item --gap Installation:\ -item --key a amd64_${dist_version} Install Debian Edu ${dist_version} / amd64 (64-Bit)\ -# BEGIN: Debian-Installer other versions -# END: Debian-Installer other versions -item\ -" ${tftpdir}/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 < ${tftpdir}/ltsp/ltsp.ipxe -#!ipxe -# -# Configure iPXE for network installations - -console --picture /debian-edu/debian-edu-pxe.png || - -# Set the default image (img) based on arch, or to root-path if it's not empty -cpuid --ext 29 && set img amd64_${dist_version} || set img i386_${dist_version} - -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_${dist_version} Install Debian Edu ${dist_version} / amd64 -item -# BEGIN: Debian-Installer other versions -# END: Debian-Installer other versions -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 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 - -# Insert other Debian-Installer versions, if any. -if [ "${dist_version}" != "${di_versions_supported}" ]; then - # We have more D-I netboot versions installed, so inject them into the iPXE boot menu - for di_ver in ${di_versions_supported}; do - for arch in ${archs}; do - if [ "${di_ver}" = "${dist_version}" ]; then - # we already have this, see above - : - else - if [ -d $tftpdir/debian-installer/${di_ver}/${arch} ]; then - sed -i "/^# END: Debian-Installer other versions/i \ -item ${arch}_${di_ver} Install Debian Edu ${di_ver} / ${arch}\ -" ${tftpdir}/ltsp/ltsp.ipxe - fi - fi - done - done -else - sed -E -i "${tftpdir}/ltsp/ltsp.ipxe" -e "/# (BEGIN|END): Debian-Installer other versions/d" -fi +# Prepare the best ltsp.ipxe config for this server that we can... +debian-edu-ltsp-ipxe diff -Nru debian-edu-config-2.13.7~deb13u1/share/debian-edu-config/squid.conf debian-edu-config-2.13.11~deb13u1/share/debian-edu-config/squid.conf --- debian-edu-config-2.13.7~deb13u1/share/debian-edu-config/squid.conf 2026-09-15 22:02:19.000000000 +0000 +++ debian-edu-config-2.13.11~deb13u1/share/debian-edu-config/squid.conf 2026-11-12 17:53:21.000000000 +0000 @@ -9,7 +9,11 @@ # Currently, Debian Edu does not support IPv6 on the internal network # thus, we should try to use DNSv4 preferrably for the http proxy. # See https://bugs.debian.org/1006375 -dns_v4_first on +# +# FIXME: This option is obsolete in Debian 13's version of squid. Commenting +# it out for now, but this might need later investigation if IPv4/IPv6 issues +# return (see above bug URL). +#dns_v4_first on # Adjust cache size to fit size of /var/spool/squid, the initial capacity value # is dynamically updated using diff -Nru debian-edu-config-2.13.7~deb13u1/share/debian-edu-config/tools/run-at-firstboot debian-edu-config-2.13.11~deb13u1/share/debian-edu-config/tools/run-at-firstboot --- debian-edu-config-2.13.7~deb13u1/share/debian-edu-config/tools/run-at-firstboot 2026-11-09 00:22:40.000000000 +0000 +++ debian-edu-config-2.13.11~deb13u1/share/debian-edu-config/tools/run-at-firstboot 2026-11-12 17:53:21.000000000 +0000 @@ -75,11 +75,11 @@ # Diskless Workstation chroot from scratch as clean environment. if echo "$PROFILE" | grep -Eq 'Main-Server' && \ echo "$PROFILE" | grep -Eq 'LTSP-Server'; then - if [ -d /srv/ltsp/dlw ] && [ -z "$(find /srv/ltsp/dlw/ -name "SUCCESSFULLY_CREATED_*")" ]; then + if [ -d /srv/ltsp/dlw ] && [ -z "$(find /srv/ltsp/dlw/ -name "CREATED_SUCCESSFULLY_*")" ]; then rm -Rf /srv/ltsp/dlw fi - if [ ! -d /srv/ltsp/dlw ] || [ -n "$(find /srv/ltsp/dlw/ -name "SUCCESSFULLY_CREATED_*")" ]; then - /usr/sbin/debian-edu-ltsp-install --dlw yes + if [ ! -d /srv/ltsp/dlw ] || [ -n "$(find /srv/ltsp/dlw/ -name "CREATED_SUCCESSFULLY_*")" ]; then + env -i HOME="${HOME}" PATH="${PATH}" TERM="${TERM}" USER="${USER}" LOGNAME="${LOGNAME}" /usr/sbin/debian-edu-ltsp-install --dlw yes fi # else if this runs on a pure LTSP-Server (no Main-Server role), then # let's use the file system of the LTSP-Server and generate the LTSP @@ -87,16 +87,16 @@ elif echo "$PROFILE" | grep -Eqv 'Main-Server' && \ echo "$PROFILE" | grep -Eq 'LTSP-Server'; then if [ ! -f /srv/ltsp/images/$ltspimg ] ; then - /usr/sbin/debian-edu-ltsp-install --diskless_workstation yes + env -i HOME="${HOME}" PATH="${PATH}" TERM="${TERM}" USER="${USER}" LOGNAME="${LOGNAME}" /usr/sbin/debian-edu-ltsp-install --diskless_workstation yes fi fi # Always create the thin client image for all LTSP-Server variants/combinations. if echo "$PROFILE" | grep -Eq 'LTSP-Server'; then - if [ -d /srv/ltsp/x2go-bare-amd64 ] && [ -z "$(find /srv/ltsp/x2go-bare-amd64/ -name "SUCCESSFULLY_CREATED_*")" ]; then - rm -Rf /srv/ltsp/x2go-bare-amd64/ + if [ -d /srv/ltsp/x2go-desktop-amd64 ] && [ -z "$(find /srv/ltsp/x2go-desktop-amd64/ -name "CREATED_SUCCESSFULLY_*")" ]; then + rm -Rf /srv/ltsp/x2go-desktop-amd64/ fi - if [ ! -d /srv/ltsp/x2go-bare-amd64 ] || [ -n "$(find /srv/ltsp/x2go-bare-amd64/ -name "SUCCESSFULLY_CREATED_*")" ]; then - /usr/sbin/debian-edu-ltsp-install --thin_type bare + if [ ! -d /srv/ltsp/x2go-desktop-amd64 ] || [ -n "$(find /srv/ltsp/x2go-desktop-amd64/ -name "CREATED_SUCCESSFULLY_*")" ]; then + env -i HOME="${HOME}" PATH="${PATH}" TERM="${TERM}" USER="${USER}" LOGNAME="${LOGNAME}" /usr/sbin/debian-edu-ltsp-install --thin_type desktop fi fi fi