diff --git a/live_exam_os/.env.example b/live_exam_os/.env.example index c0e640d87487cb72396bf17ee76e24a421540d74..0cd3d7a9e87782eb072cf08fe18898849fc92db5 100644 --- a/live_exam_os/.env.example +++ b/live_exam_os/.env.example @@ -3,7 +3,6 @@ export SQUASHFS="/tmp/squashfs" export ROOTFS_DIR="/tmp/rootfs" export ISO_DIR="/tmp/iso" export BOOT_FOLDER="$ISO_DIR/boot" -export LUKS_IMG="squash.rootfs.luks" # Nexus build configuration export SERVER="127.0.0.1:1077" @@ -14,7 +13,9 @@ export EXAM_PWD="password" # Build parameters export LUKS_PASSPHRASE="passphrase" export ADDITIONAL_KEYS="keys keyss" +export CHALLENGE="challenge" export VERBOSE=false +export RAM="squashfs_tmpfs" #export PXE_URL="127.0.0.1:8000" export OUTPUT="build" export CACHE_FS="cache" diff --git a/live_exam_os/Dockerfile b/live_exam_os/Dockerfile index c8909d9214dcc565b61a22b0dc1aeac6ce76cc6e..f5e1cdc738df56d5a7d15e45a72ca47e26112656 100644 --- a/live_exam_os/Dockerfile +++ b/live_exam_os/Dockerfile @@ -4,7 +4,7 @@ FROM ubuntu:22.04 ENV archive=go1.22.6.linux-amd64.tar.gz ENV PATH=$PATH:/usr/local/go/bin -RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y gcc pkg-config git wget make ca-certificates libglfw3-dev libxcursor-dev libxinerama-dev libxi-dev libxxf86vm-dev upx-ucl curl cryptsetup squashfs-tools fakechroot debootstrap xorriso +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y gcc pkg-config git wget make ca-certificates libglfw3-dev libxcursor-dev libxinerama-dev libxi-dev libxxf86vm-dev upx-ucl curl cryptsetup squashfs-tools fakechroot debootstrap xorriso mtools dosfstools RUN git clone https://github.com/limine-bootloader/limine.git --branch=v8.x-binary --depth=1 /opt/limine && \ cd /opt/limine && \ diff --git a/live_exam_os/Makefile b/live_exam_os/Makefile index 254f262bd8b7c7f1e25e985112948d715190a6c1..ae290925508537fa315b3fb2a152b2e296eedd1d 100644 --- a/live_exam_os/Makefile +++ b/live_exam_os/Makefile @@ -15,6 +15,6 @@ bios_cd: qemu-system-x86_64 -drive file=$(ISO),media=cdrom,if=ide,readonly=on -boot d -m 4G -smp 4 uefi: - qemu-system-x86_64 -bios /usr/share/OVMF/x64/OVMF.fd -drive file=$(ISO),format=raw -boot d -m 16G -smp 4 -netdev user,id=n1 -device virtio-net-pci,netdev=n1 -serial mon:stdio + qemu-system-x86_64 -bios /usr/share/OVMF/x64/OVMF.fd -drive file=$(ISO),format=raw -boot d -m 16G -smp 4 -netdev user,id=n1 -device virtio-net-pci,netdev=n1 .PHONY: build diff --git a/live_exam_os/README.md b/live_exam_os/README.md index 05ca500089dfa4fd892cc06074d9b90a2b09bf44..3fe607e463a843a35271fbd78f94946d5d3ff244 100644 --- a/live_exam_os/README.md +++ b/live_exam_os/README.md @@ -29,8 +29,12 @@ For simpler deployment on any environment that supports Docker, we provide a `Do | `--output` | Define the output folder (default: `.`). | | `--luks-passphrase` | Enable LUKS encryption with a passphrase. | | `--luks-keys` | Provide a list of additional keys for LUKS encryption. | -| `--pxe` | Set the URL of the PXE and generate an initramfs, kernel, and SquashFS for PXE use. | -| `--cache` | Specify the path to a folder containing a pre-downloaded clean filesystem. | +| `--ram` | Using the system in RAM. | +| `--challenge` | Challenge in use by yubikeys. | +| `--arch` | Set the architecture of the system (e.g., amd64). | +| `--pxe` | Set the url of the pxe and generate an initramfs, kernel and squashfs for the pxe to use (use the url of the folder where the squashfs is stored, not the direct link to the squashfs). | +| `--cache` | Path to a folder with a clean fs already downloaded. | +| `--version` | Version of Ubuntu (e.g., Noble) | ### Environment Setup Parameters diff --git a/live_exam_os/build.sh b/live_exam_os/build.sh index f222c6587898daad465efb1df92e86ba47578149..2542af4917dfa2af6d7f0053460d86b3c5f073e3 100755 --- a/live_exam_os/build.sh +++ b/live_exam_os/build.sh @@ -3,14 +3,17 @@ . tools/functions.sh # Default variables -export SQUASHFS="/tmp/squashfs" -export ROOTFS_DIR="/tmp/rootfs" -export ISO_DIR="/tmp/iso" +export SQUASHFS="output/squashfs" +export ROOTFS_DIR="output/rootfs" +export ISO_DIR="output/iso" export BOOT_FOLDER="$ISO_DIR/boot" -export LUKS_IMG="squash.rootfs.luks" +export SQUASHFS_IMG="squash.rootfs" export VERBOSE=false -export OUTPUT="." +export OUTPUT="build" export ISO_NAME="nexus.iso" +export UBUNTU_VERSION="noble" +export CHALLENGE="default_challenge" +export ARCH="amd64" helper() { echo "USAGE: $(basename "$0") [options]" @@ -21,8 +24,13 @@ helper() { echo " --output Set the output folder (default: .)" echo " --luks-passphrase Enable LUKS encryption with passphrase" echo " --luks-keys List of additional keys" - echo " --pxe Set the url of the pxe and generate an initramfs, kernel and squashfs for pxe use" + echo " --ram Using the system in RAM" + echo " --challenge List of additional keys" + echo " --arch Set the architecture of the system (e.g., amd64)" + echo " --pxe Set the url of the pxe and generate an initramfs, kernel and squashfs for the pxe to use + (use the url of the folder where the squashfs is stored, not the direct link to the squashfs)" echo " --cache Path to a folder with a clean fs already downloaded" + echo " --version Version of Ubuntu (e.g., Noble)" echo echo "Environment Setup Parameters:" echo " SQUASHFS Path to the SquashFS file (e.g., out/squash.rootfs)" @@ -55,8 +63,13 @@ while [ "$#" -gt 0 ]; do fi ;; --luks-passphrase) - LUKS_PASSPHRASE="$2" - shit 2 + if [ -n "$2" ]; then + LUKS_PASSPHRASE="$2" + shift 2 + else + echo "Error: --luks-keys requires an argument" >&2 + helper + fi ;; --luks-keys) if [ -n "$2" ]; then @@ -67,6 +80,15 @@ while [ "$#" -gt 0 ]; do helper fi ;; + --challenge) + if [ -n "$2" ]; then + CHALLENGE="$2" + shift 2 + else + echo "Error: --luks-keys requires an argument" >&2 + helper + fi + ;; --pxe) if [ -n "$2" ]; then export PXE_URL="$2" @@ -80,6 +102,10 @@ while [ "$#" -gt 0 ]; do export VERBOSE=true shift ;; + --ram) + export RAM="squashfs_tmpfs" + shift + ;; --verbose) export VERBOSE=true shift @@ -93,6 +119,24 @@ while [ "$#" -gt 0 ]; do helper fi ;; + --version) + if [ -n "$2" ]; then + export UBUNTU_VERSION=$2 + shift 2 + else + echo "Error: --cache requires an argument" >&2 + helper + fi + ;; + --arch) + if [ -n "$2" ]; then + export ARCH=$2 + shift 2 + else + echo "Error: --cache requires an argument" >&2 + helper + fi + ;; *) echo "Unknown option: $1" >&2 helper @@ -101,15 +145,14 @@ while [ "$#" -gt 0 ]; do done check_environment_var - +CMDLINE="boot=nexus quiet splash $RAM modprobe.blacklist=floppy" echo "[Create filesystem...]" rm -rf "$ROOTFS_DIR" "$OUTPUT" mkdir -p "$ROOTFS_DIR" if [ -z $CACHE_FS ]; then - echo "debootstrap --arch=amd64 noble $ROOTFS_DIR http://archive.ubuntu.com/ubuntu/" - debootstrap --arch=amd64 noble $ROOTFS_DIR http://archive.ubuntu.com/ubuntu/ + run_command debootstrap --arch=$ARCH $UBUNTU_VERSION $ROOTFS_DIR http://archive.ubuntu.com/ubuntu/ mount -t proc /proc $ROOTFS_DIR/proc mount --rbind /sys $ROOTFS_DIR/sys mount --rbind /dev $ROOTFS_DIR/dev @@ -119,15 +162,15 @@ if [ -z $CACHE_FS ]; then echo "[Installing packages...]" packages=$(tr '\n' ' ' < config/01-packages_install/packages) - echo "deb http://archive.ubuntu.com/ubuntu noble main universe" > $ROOTFS_DIR/etc/apt/sources.list + echo "deb http://archive.ubuntu.com/ubuntu $UBUNTU_VERSION main universe" > $ROOTFS_DIR/etc/apt/sources.list run_command_chroot apt update check_exit_code $? "Error during apt update" - run_command_chroot apt install -y --no-install-recommends zstd initramfs-tools linux-image-generic linux-firmware casper cryptsetup-initramfs $packages + run_command_chroot apt install -y --no-install-recommends $packages check_exit_code $? "Error during packages installation" else if [ ! -d $CACHE_FS ]; then mkdir $CACHE_FS - debootstrap --arch=amd64 noble $CACHE_FS http://archive.ubuntu.com/ubuntu/ + run_command debootstrap --arch=$ARCH $UBUNTU_VERSION $CACHE_FS http://archive.ubuntu.com/ubuntu/ mount -t proc /proc $CACHE_FS/proc mount --rbind /sys $CACHE_FS/sys @@ -138,10 +181,10 @@ else echo "[Installing packages...]" packages=$(tr '\n' ' ' < config/01-packages_install/packages) - echo "deb http://archive.ubuntu.com/ubuntu noble main universe" > $CACHE_FS/etc/apt/sources.list + echo "deb http://archive.ubuntu.com/ubuntu $UBUNTU_VERSION main universe" > $CACHE_FS/etc/apt/sources.list run_command chroot $CACHE_FS apt update check_exit_code $? "Error during apt update" - run_command chroot $CACHE_FS apt install -y --no-install-recommends zstd initramfs-tools linux-image-generic linux-firmware casper cryptsetup-initramfs $packages + run_command chroot $CACHE_FS apt install -y --no-install-recommends $packages check_exit_code $? "Error during packages installation" umount -l $CACHE_FS/proc @@ -150,7 +193,7 @@ else umount -l $CACHE_FS/run umount -l $CACHE_FS/tmp else - echo "Skip through cache" + echo " [Skip through cache]" fi cp -r $CACHE_FS/* $ROOTFS_DIR @@ -165,12 +208,32 @@ fi echo "[Uploading configuration file...]" cp -rf config/02-customisation/* $ROOTFS_DIR +if [ -z $PXE_URL ]; then + echo "[EFI img preparation]" + mkdir -p "$ISO_DIR/boot/grub" + sed "s/CMDLINE/$CMDLINE/g" config/00-bootloader/grub.cfg > "$ISO_DIR/boot/grub/grub.cfg" + EFIBOOT=/tmp/efiboot.img + EFIBOOT_MOUNT=/tmp/efiboot + SIZE_EFIBOOT=$(get_total_size $ROOTFS_DIR/usr/lib/shim/shimx64.efi.signed.latest $ROOTFS_DIR/usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed) + OFFSET=$(( 150 * 1024 )) # Some space for fat header and grub.cfg file + + fallocate -l $(( $SIZE_EFIBOOT + $OFFSET)) $EFIBOOT + run_command mkfs.vfat $EFIBOOT + mkdir $EFIBOOT_MOUNT + mount -o loop $EFIBOOT $EFIBOOT_MOUNT + mkdir -p $EFIBOOT_MOUNT/EFI/BOOT + cp config/00-bootloader/grub.efi.cfg $EFIBOOT_MOUNT/EFI/BOOT/grub.cfg + cp $ROOTFS_DIR/usr/lib/shim/shimx64.efi.signed.latest "$EFIBOOT_MOUNT/EFI/BOOT/BOOTx64.EFI" + cp $ROOTFS_DIR/usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed "$EFIBOOT_MOUNT/EFI/BOOT/grubx64.efi" + umount $EFIBOOT_MOUNT +fi + echo "[Post-install...]" for script in config/03-post_install/*.sh; do ./$script done -echo "[Moving kernel..]" +echo "[Moving kernel...]" cp $ROOTFS_DIR/boot/vmlinuz-* /tmp/vmlinuz cp $ROOTFS_DIR/boot/initrd.img /tmp/initrd rm -rf $ROOTFS_DIR/boot @@ -182,96 +245,59 @@ umount -l $ROOTFS_DIR/dev umount -l $ROOTFS_DIR/run umount -l $ROOTFS_DIR/tmp -echo "[Create squash.rootfs..]" +echo "[Create squash.rootfs...]" run_command mksquashfs "$ROOTFS_DIR" "$SQUASHFS" check_exit_code $? "Error during squashfs generation" if [ ! -z $LUKS_PASSPHRASE ]; then - echo "[Encrypt squash.rootfs..]" + echo "[Encrypt squash.rootfs...]" SQUASHFS_SIZE=$(stat -c %s "$SQUASHFS") LUKS_HEADER_SIZE=$((1024 * 1024 * 16)) # 16 MiB header LUKS2 TOTAL_SIZE=$((SQUASHFS_SIZE + LUKS_HEADER_SIZE)) SECTOR_SIZE=512 - TOTAL_SIZE=$(( (TOTAL_SIZE + SECTOR_SIZE - 1) / SECTOR_SIZE * SECTOR_SIZE )) - fallocate -l $TOTAL_SIZE "/tmp/$LUKS_IMG" - echo -n "$LUKS_PASSPHRASE" | cryptsetup luksFormat "/tmp/$LUKS_IMG" --batch-mode - echo -n "$LUKS_PASSPHRASE" | cryptsetup luksOpen "/tmp/$LUKS_IMG" container + fallocate -l $TOTAL_SIZE "/tmp/$SQUASHFS_IMG" + echo -n "$LUKS_PASSPHRASE" | cryptsetup luksFormat "/tmp/$SQUASHFS_IMG" --batch-mode + echo -n "$LUKS_PASSPHRASE" | cryptsetup luksOpen "/tmp/$SQUASHFS_IMG" container run_command dd if="$SQUASHFS" of=/dev/mapper/container bs=4M cryptsetup luksClose container if [ ! -z $ADDITIONAL_KEYS ]; then for key in $ADDITIONAL_KEYS; do - echo -e "$LUKS_PASSPHRASE\n$key" | cryptsetup luksAddKey "/tmp/$LUKS_IMG" + echo -e "$LUKS_PASSPHRASE\n$key" | cryptsetup luksAddKey "/tmp/$SQUASHFS_IMG" done fi else - mkdir -p $ISO_DIR/casper - cp "$SQUASHFS" "$ISO_DIR/casper/filesystem.squashfs" + cp "$SQUASHFS" "/tmp/$SQUASHFS_IMG" fi mkdir $OUTPUT -if [ ! -z $PXE_URL ];then +if [ ! -z $PXE_URL ]; then cp /tmp/vmlinuz $OUTPUT cp /tmp/initrd $OUTPUT - cp /tmp/$LUKS_IMG $OUTPUT - - echo "[Moving kernel to iso/boot...]" - mkdir -p $BOOT_FOLDER - cp /tmp/vmlinuz $BOOT_FOLDER/vmlinuz - cp /tmp/initrd $BOOT_FOLDER/initrd - - echo "[Create iso...]" - - mkdir -p "$ISO_DIR/EFI/BOOT" - - cp /opt/limine/*.EFI "$ISO_DIR/EFI/BOOT/" - cp /opt/limine/*.bin "$ISO_DIR/" - cp /opt/limine/*.sys "$ISO_DIR/" - - cp config/00-bootloader/limine_pxe.conf "$ISO_DIR/boot/limine.conf" - - run_command xorriso -as mkisofs -R -r -J -b "limine-bios-cd.bin" \ - -no-emul-boot -boot-load-size 4 -boot-info-table -hfsplus \ - -apm-block-size 2048 --efi-boot "limine-uefi-cd.bin" \ - -efi-boot-part --efi-boot-image --protective-msdos-label \ - -volid "NEXUSCLIENTISO" \ - "$ISO_DIR" -o "$OUTPUT/$ISO_NAME" - check_exit_code $? "Error during iso creation" - - run_command limine bios-install "$OUTPUT/$ISO_NAME" - check_exit_code $? "Error during add bios header" + cp /tmp/$SQUASHFS_IMG $OUTPUT else echo "[Moving kernel && squashfs from rootfs to iso/boot...]" mkdir -p $BOOT_FOLDER cp /tmp/vmlinuz $BOOT_FOLDER/vmlinuz cp /tmp/initrd $BOOT_FOLDER/initrd - cp /tmp/$LUKS_IMG $ISO_DIR/$LUKS_IMG echo "[Create iso...]" - - mkdir -p "$ISO_DIR/EFI/BOOT" - - cp /opt/limine/*.EFI "$ISO_DIR/EFI/BOOT/" + cp /tmp/$SQUASHFS_IMG $ISO_DIR/$SQUASHFS_IMG cp /opt/limine/*.bin "$ISO_DIR/" cp /opt/limine/*.sys "$ISO_DIR/" - - if [ ! -z $LUKS_PASSPHRASE ]; then - cp config/00-bootloader/limine.conf "$ISO_DIR/boot/" - else - cp config/00-bootloader/limine_casper.conf "$ISO_DIR/boot/limine.conf" - fi + cp $EFIBOOT $ISO_DIR + sed "s/CMDLINE/$CMDLINE/g" config/00-bootloader/limine.conf > "$ISO_DIR/boot/limine.conf" run_command xorriso -as mkisofs -R -r -J -b "limine-bios-cd.bin" \ - -no-emul-boot -boot-load-size 4 -boot-info-table -hfsplus \ - -apm-block-size 2048 --efi-boot "limine-uefi-cd.bin" \ - -efi-boot-part --efi-boot-image --protective-msdos-label \ - -volid "NEXUSCLIENTISO" \ - "$ISO_DIR" -o "$OUTPUT/$ISO_NAME" + -no-emul-boot -boot-load-size 4 -boot-info-table -hfsplus \ + -apm-block-size 2048 --efi-boot "efiboot.img" \ + -efi-boot-part --efi-boot-image --protective-msdos-label \ + -volid "NEXUSCLIENTISO" \ + "$ISO_DIR" -o "$OUTPUT/$ISO_NAME" + check_exit_code $? "Error during iso creation" - run_command limine bios-install "$OUTPUT/$ISO_NAME" - check_exit_code $? "Error during add bios header" fi chown -R 1000:1000 "$OUTPUT" diff --git a/live_exam_os/config/00-bootloader/grub.cfg b/live_exam_os/config/00-bootloader/grub.cfg new file mode 100644 index 0000000000000000000000000000000000000000..b9c139084a82214e15ba1a1ffb16c7474ae8c93e --- /dev/null +++ b/live_exam_os/config/00-bootloader/grub.cfg @@ -0,0 +1,6 @@ +set timeout=0 + +menuentry "Nexus-Exam" { + linux /boot/vmlinuz CMDLINE -- + initrd /boot/initrd +} diff --git a/live_exam_os/config/00-bootloader/grub.efi.cfg b/live_exam_os/config/00-bootloader/grub.efi.cfg new file mode 100644 index 0000000000000000000000000000000000000000..08ef767a9a2291cf408c5a5bdbe47c4f3118c8bd --- /dev/null +++ b/live_exam_os/config/00-bootloader/grub.efi.cfg @@ -0,0 +1,2 @@ +search --file /boot/vmlinuz --no-floppy --set root +configfile /boot/grub/grub.cfg diff --git a/live_exam_os/config/00-bootloader/limine.conf b/live_exam_os/config/00-bootloader/limine.conf index a2004d66299228c805650c8e1ceb19940cbd3b7a..5a2cf966beb6388c3286b9300b66b48de01c0009 100644 --- a/live_exam_os/config/00-bootloader/limine.conf +++ b/live_exam_os/config/00-bootloader/limine.conf @@ -3,5 +3,5 @@ timeout: 0 /Nexus protocol: linux kernel_path: boot():/boot/vmlinuz - kernel_cmdline: boot=nexus quiet splash + kernel_cmdline: CMDLINE module_path: boot():/boot/initrd diff --git a/live_exam_os/config/00-bootloader/limine_casper.conf b/live_exam_os/config/00-bootloader/limine_casper.conf deleted file mode 100644 index 853c8c849d3b3f8dc9d7756d213c498d230c079e..0000000000000000000000000000000000000000 --- a/live_exam_os/config/00-bootloader/limine_casper.conf +++ /dev/null @@ -1,7 +0,0 @@ -timeout: 0 - -/Nexus - protocol: linux - kernel_path: boot():/boot/vmlinuz - kernel_cmdline: boot=casper quiet splash - module_path: boot():/boot/initrd diff --git a/live_exam_os/config/00-bootloader/limine_pxe.conf b/live_exam_os/config/00-bootloader/limine_pxe.conf deleted file mode 100644 index 653cf3ae75e8d12184b90ae6572eebd0696ce564..0000000000000000000000000000000000000000 --- a/live_exam_os/config/00-bootloader/limine_pxe.conf +++ /dev/null @@ -1,7 +0,0 @@ -timeout: 0 - -/Nexus - protocol: linux - kernel_path: boot():/boot/vmlinuz - kernel_cmdline: boot=pxe quiet splash - module_path: boot():/boot/initrd diff --git a/live_exam_os/config/01-packages_install/packages b/live_exam_os/config/01-packages_install/packages index f60d5f36c864537fad921a4388b835420597e563..c47aa32595b0bd1b62da0f9c7dcb3ff41986b147 100644 --- a/live_exam_os/config/01-packages_install/packages +++ b/live_exam_os/config/01-packages_install/packages @@ -1,4 +1,8 @@ -udev +zstd +initramfs-tools +linux-image-generic +linux-firmware +cryptsetup-initramfs network-manager xserver-xorg xserver-xorg-input-libinput @@ -14,8 +18,8 @@ virt-viewer mesa-va-drivers iptables ufw -sudo -vim rfkill wpasupplicant yubikey-personalization +shim-signed +grub-efi-amd64-signed diff --git a/live_exam_os/config/02-customisation/etc/NetworkManager/NetworkManager.conf.bak b/live_exam_os/config/02-customisation/etc/NetworkManager/NetworkManager.conf.bak deleted file mode 100644 index 06c5d59a6699ec1fcfc048b3190f22e789302a9a..0000000000000000000000000000000000000000 --- a/live_exam_os/config/02-customisation/etc/NetworkManager/NetworkManager.conf.bak +++ /dev/null @@ -1,8 +0,0 @@ -[main] -plugins=ifupdown,keyfile - -[ifupdown] -managed=true - -[device] -wifi.scan-rand-mac-address=no diff --git a/live_exam_os/config/02-customisation/etc/NetworkManager/conf.d/10-default-wired.conf.bak b/live_exam_os/config/02-customisation/etc/NetworkManager/conf.d/10-default-wired.conf.bak deleted file mode 100644 index 5582524c548a441f6c8d9680e708fe529e4b4a70..0000000000000000000000000000000000000000 --- a/live_exam_os/config/02-customisation/etc/NetworkManager/conf.d/10-default-wired.conf.bak +++ /dev/null @@ -1,10 +0,0 @@ -[connection] -id=Auto Ethernet -type=ethernet -autoconnect=true - -[ipv4] -method=auto - -[ipv6] -method=auto diff --git a/live_exam_os/config/02-customisation/etc/NetworkManager/conf.d/dns.conf.bak b/live_exam_os/config/02-customisation/etc/NetworkManager/conf.d/dns.conf.bak deleted file mode 100644 index d435aba99e5b4978136e05393f5434b2403d1ebc..0000000000000000000000000000000000000000 --- a/live_exam_os/config/02-customisation/etc/NetworkManager/conf.d/dns.conf.bak +++ /dev/null @@ -1,2 +0,0 @@ -[main] -dns=none diff --git a/live_exam_os/config/02-customisation/etc/challenge b/live_exam_os/config/02-customisation/etc/challenge deleted file mode 100644 index 9daeafb9864cf43055ae93beb0afd6c7d144bfa4..0000000000000000000000000000000000000000 --- a/live_exam_os/config/02-customisation/etc/challenge +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/live_exam_os/config/02-customisation/etc/default/keyboard b/live_exam_os/config/02-customisation/etc/default/keyboard index c7fe671af6e33dbba07761dacbdd6400c8d596f1..ad849b1f846aece8158718d922fdc961dd2aeea5 100644 --- a/live_exam_os/config/02-customisation/etc/default/keyboard +++ b/live_exam_os/config/02-customisation/etc/default/keyboard @@ -2,9 +2,9 @@ # Consult the keyboard(5) manual page. -#XKBMODEL="pc105" -#XKBLAYOUT="ch" -#XKBVARIANT="fr" -#XKBOPTIONS="" -# -#BACKSPACE="guess" +XKBMODEL="pc105" +XKBLAYOUT="ch" +XKBVARIANT="fr" +XKBOPTIONS="" + +BACKSPACE="guess" diff --git a/live_exam_os/config/02-customisation/etc/initramfs-tools/hooks/nexus b/live_exam_os/config/02-customisation/etc/initramfs-tools/hooks/nexus deleted file mode 100755 index e1a61da7cdd7c9227f88f5903dcd5d263c12185c..0000000000000000000000000000000000000000 --- a/live_exam_os/config/02-customisation/etc/initramfs-tools/hooks/nexus +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh -set -e - -. /usr/share/initramfs-tools/hook-functions - -copy_exec /etc/initramfs-tools/scripts/init /scripts/nexus diff --git a/live_exam_os/config/02-customisation/etc/initramfs-tools/hooks/pxe b/live_exam_os/config/02-customisation/etc/initramfs-tools/hooks/pxe index 887c32db62002ea14b1274b8547039f64ff0d856..64ef1890b9f1a5bc8f485be3fb65c5fb7a5cfc42 100755 --- a/live_exam_os/config/02-customisation/etc/initramfs-tools/hooks/pxe +++ b/live_exam_os/config/02-customisation/etc/initramfs-tools/hooks/pxe @@ -6,4 +6,3 @@ set -e if [ -f /etc/squashfs-url ]; then copy_exec /etc/squashfs-url /squashfs-url fi -copy_exec /etc/initramfs-tools/scripts/pxe /scripts/pxe diff --git a/live_exam_os/config/02-customisation/etc/initramfs-tools/scripts/init b/live_exam_os/config/02-customisation/etc/initramfs-tools/scripts/init deleted file mode 100755 index 337eeb88e1da2df57aec4bf0224bf3cebbc2a621..0000000000000000000000000000000000000000 --- a/live_exam_os/config/02-customisation/etc/initramfs-tools/scripts/init +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/sh - -mount_and_switch() { - SQUASHFS_PATH=$1 - - echo "Mounting overlay..." - mkdir -p /squash /upper /work /newroot - mount -t squashfs $SQUASHFS_PATH /squash - - mount -t overlay -o lowerdir=/squash,upperdir=/upper,workdir=/work overlayfs /newroot - - mount -t devtmpfs none /newroot/dev - mount -t proc none /newroot/proc - mount -t sysfs none /newroot/sys - mount -t tmpfs none /newroot/tmp - mount -t devpts none /newroot/dev/pts - - exec switch_root /newroot /sbin/init -} - -decrypt_with_passphrase() { - cryptsetup open /cdrom/squash.rootfs.luks data - exit_code=$? - - if [ "$exit_code" -eq 0 ]; then - mount_and_switch /dev/mapper/data - fi - - echo "Wrong passphrase" -} - -decrypt_with_challenge() { - echo -n "$1" | cryptsetup open /cdrom/squash.rootfs.luks data - exit_code=$? - - if [ "$exit_code" -eq 0 ]; then - mount_and_switch /dev/mapper/data - fi - - echo "Decryption error, possibly wrong Yubikey" -} - -while [ -z $(blkid | grep "NEXUSCLIENTISO" | cut -d ':' -f1) ]; do - echo -n "" -done - -DISK=$(blkid | grep "NEXUSCLIENTISO" | cut -d ':' -f1 | sed 's/.$//') -mkdir -p /cdrom -mount -t iso9660 $DISK /cdrom - -echo "Waiting for Yubikey. Press 'p' to enter the passphrase" -while true; do - output=$(ykchalresp -2 -i /scripts/challenge 2>&1) - exit_code=$? - - if read -t 1 -n 1 input && [ "$input" = "p" ]; then - echo "" - decrypt_with_passphrase - continue - fi - - if [ "$exit_code" -eq 1 ]; then - sleep 1 - continue - fi - - decrypt_with_challenge $output -done diff --git a/live_exam_os/config/02-customisation/etc/initramfs-tools/scripts/nexus b/live_exam_os/config/02-customisation/etc/initramfs-tools/scripts/nexus new file mode 100755 index 0000000000000000000000000000000000000000..0b2fb417d630e16180f7c963a2c7799148150921 --- /dev/null +++ b/live_exam_os/config/02-customisation/etc/initramfs-tools/scripts/nexus @@ -0,0 +1,46 @@ +#!/bin/sh + +. /scripts/tools + +while true; do + for dev in /dev/sd* /dev/sr*; do + if [ -e "$dev" ]; then + label="$(blkid -o value -s LABEL "$dev" 2>/dev/null)" + if [ "$label" = "NEXUSCLIENTISO" ]; then + DISK="$dev" + break 2 + fi + fi + done +done + + +mkdir -p /cdrom +mount -t iso9660 $DISK /cdrom + +cryptsetup isLuks /cdrom/squash.rootfs +exit_code=$? +if [ ! $exit_code -eq 0 ]; then + mount_and_switch /cdrom/squash.rootfs +fi + + +echo "Waiting for Yubikey." +while true; do + output=$(ykchalresp -2 -i /scripts/challenge 2>&1) + + exit_code=$? + + if read -t 1 -n 1 input && [ "$input" = "p" ]; then + echo "" + decrypt_with_passphrase /cdrom/squash.rootfs + continue + fi + + if [ "$exit_code" -eq 1 ]; then + sleep 1 + continue + fi + + decrypt_with_challenge /cdrom/squash.rootfs $output +done diff --git a/live_exam_os/config/02-customisation/etc/initramfs-tools/scripts/pxe b/live_exam_os/config/02-customisation/etc/initramfs-tools/scripts/pxe index 6579225064bdb0fbc3d4639994f0fd5c5fa410f7..d5ed66b68011bbaca5bb671575cb23810de655dd 100755 --- a/live_exam_os/config/02-customisation/etc/initramfs-tools/scripts/pxe +++ b/live_exam_os/config/02-customisation/etc/initramfs-tools/scripts/pxe @@ -1,86 +1,30 @@ #!/bin/sh -LUKS_FILE="/squash.rootfs" +. /scripts/tools -find_active_interface() { - for iface in $(ls /sys/class/net); do - if [ "$iface" = "lo" ]; then - continue - fi - - if [ "$(cat /sys/class/net/$iface/type)" = "1" ]; then - if ip link show "$iface" | grep -q "<BROADCAST,MULTICAST>"; then - echo "Lookup for $iface interface" - dhcpcd -q $iface - exit_code=$? - - if [ "$exit_code" -eq 0 ]; then - return 0 - fi - fi - fi - done - - echo "No active network interface found." >&2 - /bin/sh - return 1 -} - -mount_and_switch() { - SQUASHFS_PATH=$1 - - echo "Mounting overlay..." - mkdir -p /squash /upper /work /newroot - mount -t squashfs $SQUASHFS_PATH /squash - - mount -t overlay -o lowerdir=/squash,upperdir=/upper,workdir=/work overlayfs /newroot - - mount -t devtmpfs none /newroot/dev - mount -t proc none /newroot/proc - mount -t sysfs none /newroot/sys - mount -t tmpfs none /newroot/tmp - mount -t devpts none /newroot/dev/pts - - exec switch_root /newroot /sbin/init -} - -decrypt_with_passphrase() { - cryptsetup open $LUKS_FILE data - exit_code=$? - - if [ "$exit_code" -eq 0 ]; then - mount_and_switch /dev/mapper/data - fi - - echo "Wrong passphrase" -} - -decrypt_with_challenge() { - echo -n "$1" | cryptsetup open $LUKS_FILE data - exit_code=$? - - if [ "$exit_code" -eq 0 ]; then - mount_and_switch /dev/mapper/data - fi - - echo "Decryption error, possibliy wrong Yubikey" -} +SQUASH_FILE="/squash.rootfs" sleep 3 echo "DHCP lookup..." find_active_interface -wget $(cat /squashfs-url) -O $LUKS_FILE +wget $(cat /squashfs-url) -O $SQUASH_FILE + +cryptsetup isLuks $SQUASH_FILE +exit_code=$? +if [ ! $exit_code -eq 0 ]; then + mount_and_switch $SQUASH_FILE +fi -echo "Waiting for Yubikey. Press 'p' to enter the passphrase" +echo "Waiting for Yubikey" while true; do output=$(ykchalresp -2 -i /scripts/challenge 2>&1) exit_code=$? if read -t 1 -n 1 input && [ "$input" = "p" ]; then echo "" - decrypt_with_passphrase + decrypt_with_passphrase $SQUASH_FILE continue fi @@ -89,5 +33,5 @@ while true; do continue fi - decrypt_with_challenge $output + decrypt_with_challenge $SQUASH_FILE $output done diff --git a/live_exam_os/config/02-customisation/etc/initramfs-tools/scripts/tools b/live_exam_os/config/02-customisation/etc/initramfs-tools/scripts/tools new file mode 100755 index 0000000000000000000000000000000000000000..1f712517796be800b1827df64942f854a0c7cc2e --- /dev/null +++ b/live_exam_os/config/02-customisation/etc/initramfs-tools/scripts/tools @@ -0,0 +1,89 @@ +#!/bin/bash + +mount_and_switch() { + SQUASHFS_PATH=$1 + + mount_fs $SQUASHFS_PATH + + mount -t devtmpfs none /newroot/dev + mount -t proc none /newroot/proc + mount -t sysfs none /newroot/sys + mount -t tmpfs none /newroot/tmp + mount -t devpts none /newroot/dev/pts + + exec switch_root /newroot /sbin/init +} + +decrypt_with_passphrase() { + SQUASHFS_LUKS=$1 + cryptsetup open $1 data + exit_code=$? + + if [ "$exit_code" -eq 0 ]; then + mount_and_switch /dev/mapper/data + fi + + echo "Wrong passphrase" +} + +decrypt_with_challenge() { + SQUASHFS_LUKS=$1 + echo -n "$2" | cryptsetup open $SQUASHFS_LUKS data + exit_code=$? + + if [ "$exit_code" -eq 0 ]; then + mount_and_switch /dev/mapper/data + fi + + echo "Decryption error, possibly wrong Yubikey" +} + +mount_fs() { + SQUASHFS_PATH=$1 + mkdir -p /newroot/{home, run, tmp, var/log, var/tmp} /rw_home /squash + + if grep -q "squashfs_tmpfs" /proc/cmdline; then + echo "Mounting fs on ram..." + mount -t squashfs -o loop,ro $SQUASHFS_PATH /squash + mount -t tmpfs none /newroot + cp -rp /squash/* /newroot + else + echo "Mounting fs..." + mount -t squashfs -o loop,ro "$SQUASHFS_PATH" /newroot + fi + + mount -t tmpfs none /rw_home + cp -rp /newroot/home/. /rw_home/ + + mount -t tmpfs none /newroot/run + mount -t tmpfs none /newroot/tmp + mount -t tmpfs none /newroot/var/log + mount -t tmpfs none /newroot/var/tmp + mount -t tmpfs none /newroot/var/lib/systemd + mount --bind /rw_home /newroot/home +} + + +find_active_interface() { + for iface in $(ls /sys/class/net); do + if [ "$iface" = "lo" ]; then + continue + fi + + if [ "$(cat /sys/class/net/$iface/type)" = "1" ]; then + if ip link show "$iface" | grep -q "<BROADCAST,MULTICAST>"; then + echo "Lookup for $iface interface" + dhcpcd -q $iface + exit_code=$? + + if [ "$exit_code" -eq 0 ]; then + return 0 + fi + fi + fi + done + + echo "No active network interface found." >&2 + /bin/sh + return 1 +} diff --git a/live_exam_os/config/02-customisation/home/user/.profile b/live_exam_os/config/02-customisation/home/user/.profile index 9992ad7ebe5dfb0ee9336dcc7099d9a444c19f35..fecabe0d3d60460df4510a1265a496cacdd0b8b7 100644 --- a/live_exam_os/config/02-customisation/home/user/.profile +++ b/live_exam_os/config/02-customisation/home/user/.profile @@ -2,4 +2,4 @@ while [ ! -e /dev/dri/card* ]; do sleep 1 done -startx +startx && poweroff diff --git a/live_exam_os/config/03-post_install/2500-disable_services.sh b/live_exam_os/config/03-post_install/2500-disable_services.sh new file mode 100755 index 0000000000000000000000000000000000000000..7d247d7c8d6d846df07bfaa851733735676a8806 --- /dev/null +++ b/live_exam_os/config/03-post_install/2500-disable_services.sh @@ -0,0 +1,6 @@ +#/bin/sh + +. tools/functions.sh + +echo " [Masking services...]" +run_command_chroot systemctl mask console-setup diff --git a/live_exam_os/config/03-post_install/3000-nexus_exam.sh b/live_exam_os/config/03-post_install/3000-nexus_exam.sh index 5d80457aa0f7acb9dd4097e62858d162b8fa4845..0894fb98e9d4d679c290c2b392ab8398cba1c122 100755 --- a/live_exam_os/config/03-post_install/3000-nexus_exam.sh +++ b/live_exam_os/config/03-post_install/3000-nexus_exam.sh @@ -3,7 +3,7 @@ . tools/functions.sh echo " [Compiling nexus-exam...]" -cd .. +pushd .. > /dev/null run_command make build_nexus-exam SERVER=$SERVER CERT=$CERT EXAM_USER=$EXAM_USER EXAM_PWD=$EXAM_PWD check_exit_code $? "Error during nexus-exam compilation" if [[ "$ROOTFS_DIR" != /* ]]; then @@ -14,4 +14,4 @@ else cp build/nexus-exam $ROOTFS_DIR/usr/local/bin/nexus-exam fi make clean_client -cd - +popd > /dev/null diff --git a/live_exam_os/config/03-post_install/5000-push_challenge.sh b/live_exam_os/config/03-post_install/5000-push_challenge.sh new file mode 100755 index 0000000000000000000000000000000000000000..27bfbe6a91dddc542aee97f2085613a06b442769 --- /dev/null +++ b/live_exam_os/config/03-post_install/5000-push_challenge.sh @@ -0,0 +1,6 @@ +#/bin/bash + +. tools/functions.sh + + echo " [Adding challenge file...]" + echo "$CHALLENGE" > $ROOTFS_DIR/etc/challenge diff --git a/live_exam_os/config/03-post_install/5000-pxe.sh b/live_exam_os/config/03-post_install/5000-pxe.sh index ecf5afdca64f7b693f7ab333db20590b1a88ceaa..5f11861249dee6d54217138c389b837c3e011207 100755 --- a/live_exam_os/config/03-post_install/5000-pxe.sh +++ b/live_exam_os/config/03-post_install/5000-pxe.sh @@ -4,5 +4,5 @@ if [ ! -z $PXE_URL ]; then echo " [Adding PXE url...]" - echo -n "$PXE_URL/$LUKS_IMG" > $ROOTFS_DIR/etc/squashfs-url + echo -n "$PXE_URL/$SQUASHFS_IMG" > $ROOTFS_DIR/etc/squashfs-url fi diff --git a/live_exam_os/config/03-post_install/9999-initramfs.sh b/live_exam_os/config/03-post_install/8000-initramfs.sh similarity index 100% rename from live_exam_os/config/03-post_install/9999-initramfs.sh rename to live_exam_os/config/03-post_install/8000-initramfs.sh diff --git a/live_exam_os/config/03-post_install/9999-cleanup.sh b/live_exam_os/config/03-post_install/9999-cleanup.sh new file mode 100755 index 0000000000000000000000000000000000000000..deafdfb86c08de5738f31ecaf5d32246340cffda --- /dev/null +++ b/live_exam_os/config/03-post_install/9999-cleanup.sh @@ -0,0 +1,7 @@ +#/bin/bash + +. tools/functions.sh + +echo " [Cleanup...]" +PACKAGES="casper krb5-locales libatm1t64 libglib2.0-data libnss-systemd libpam-cap logrotate python3-rich rfkill rsyslog systemd-hwe-hwdb systemd-resolved systemd-timesyncd ubuntu-pro-client-l10n xfce4-terminal xxd yubikey-personalization zstd" +run_command_chroot apt remove --purge -y $PACKAGES diff --git a/live_exam_os/tools/functions.sh b/live_exam_os/tools/functions.sh index ad9b11332ba645a73e1beb665795a3f8c9f3785a..0a945add858c7f1637233dc99b424adf8d1ffc86 100755 --- a/live_exam_os/tools/functions.sh +++ b/live_exam_os/tools/functions.sh @@ -37,3 +37,15 @@ check_environment_var() { helper fi } + +get_total_size() { + local total=0 + for file in "$@"; do + if [[ -f "$file" ]]; then + total=$(( total + $(stat -c%s "$file") )) + else + return 1 + fi + done + echo "$total" +}