From ef7291d9b8bb1ae6817248b0d37410d37174b69f Mon Sep 17 00:00:00 2001 From: Peter Surda Date: Tue, 2 Mar 2021 12:12:10 +0100 Subject: [PATCH] feat: add and update syslinux --- drive.inc | 2 +- maas-images.inc | 14 +++++------ syslinux.inc | 55 +++++++++++++++++++++++++++++++++++++++++++ syslinux/mainmenu.cfg | 4 ++++ syslinux/syslinux.cfg | 4 ---- syslinux/syslx64.cfg | 4 ---- syslinux_menu.inc | 44 ++++++++++++++++++++++++++++++++++ tests/data/rename.dat | 2 +- tests/drive.sh | 6 ++--- 9 files changed, 115 insertions(+), 20 deletions(-) create mode 100644 syslinux.inc create mode 100644 syslinux/mainmenu.cfg create mode 100644 syslinux_menu.inc diff --git a/drive.inc b/drive.inc index 7f5e085..fe75b43 100644 --- a/drive.inc +++ b/drive.inc @@ -83,7 +83,7 @@ function version_from_partnum $6 != "root unused") { print $6 }}')" - version="$(echo "$version"|cut -d\ -f2)" + version="$(echo "$version"|cut -d_ -f2-)" } # vim: set ft=sh: diff --git a/maas-images.inc b/maas-images.inc index acb939d..ce5f181 100644 --- a/maas-images.inc +++ b/maas-images.inc @@ -3,19 +3,13 @@ OS_CODENAME=focal OS_VERSION=20.04 + function get_streams() { streams="$(mktemp)" wget -qO "$streams" https://images.maas.io/ephemeral-v3/stable/streams/v1/com.ubuntu.maas:stable:v3:download.json } - -function find_oldest() -{ - # find locally - return 0 -} - function get_latest_maas_id() { if [ ! -f "$streams" ]; then @@ -33,6 +27,12 @@ function get_checksum() "$streams") } +function remove_version() +{ + local version="$1" + +} + function download_and_verify() { local url="$1" diff --git a/syslinux.inc b/syslinux.inc new file mode 100644 index 0000000..fa45cb6 --- /dev/null +++ b/syslinux.inc @@ -0,0 +1,55 @@ +#!/bin/bash + +function mount_efi() +{ + local drive="$1" + local partition="$drive"1 + if [ ! -b "$partition" ]; then + partition="$drive"p1 + if [ ! -b "$partition" ]; then + echo "Can't find first partition for \"$drive\"" + + exit 1 + fi + fi + + unset mnt + mnt="$(mktemp -d)" + if ! mount "$partition" "$mnt"; then + mkfs.vfat "$partition" + if ! mount "$partition" "$mnt"; then + echo "Can't mount \"$partition\"" + cleanup_mnt + exit 1 + fi + fi +} + +function cleanup_mnt() +{ + umount "$mnt" + flush + rmdir "$mnt" +} + +function install_syslinux() +{ + local drive="$1" + + mount_efi "$drive" + + # legacy + cp /usr/lib/syslinux/modules/bios/*.c32 "$mnt"/syslinux/ + + # UEFI + cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi "$mnt"/EFI/BOOT/BOOTX64.EFI + cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 "$mnt"/EFI/BOOT/ldlinux.e64 + cp /usr/lib/syslinux/modules/efi64/*.c32 "$mnt"/EFI/BOOT/ + cp syslinux/{mainmenu,syslinux}.cfg "$mnt"/syslinux + cp syslinux/syslx64.cfg "$mnt"/EFI/BOOT + + cleanup_mnt + syslinux "$partition" +} + +# vim: set ft=sh: diff --git a/syslinux/mainmenu.cfg b/syslinux/mainmenu.cfg new file mode 100644 index 0000000..09e038a --- /dev/null +++ b/syslinux/mainmenu.cfg @@ -0,0 +1,4 @@ +TIMEOUT 50 +TOTALTIMEOUT 3000 + +INCLUDE /syslinux/items.cfg diff --git a/syslinux/syslinux.cfg b/syslinux/syslinux.cfg index 9aa7d2e..d9914e4 100755 --- a/syslinux/syslinux.cfg +++ b/syslinux/syslinux.cfg @@ -1,8 +1,4 @@ MENU TITLE Legacy boot UI vesamenu.c32 -TIMEOUT 50 -TOTALTIMEOUT 3000 - -DEFAULT cloud-init-latest INCLUDE /syslinux/mainmenu.cfg diff --git a/syslinux/syslx64.cfg b/syslinux/syslx64.cfg index 2dcf93e..7117c09 100755 --- a/syslinux/syslx64.cfg +++ b/syslinux/syslx64.cfg @@ -1,8 +1,4 @@ MENU TITLE UEFI boot UI vesamenu.c32 -TIMEOUT 50 -TOTALTIMEOUT 3000 - -DEFAULT cloud-init-latest INCLUDE /syslinux/mainmenu.cfg diff --git a/syslinux_menu.inc b/syslinux_menu.inc new file mode 100644 index 0000000..e218dea --- /dev/null +++ b/syslinux_menu.inc @@ -0,0 +1,44 @@ +#!/bin/bash + +. syslinux.inc +. drive.inc + +function update_syslinux_menu() +{ + local drive="$1" + declare -A versions + declare -a files + local imagepath='/os/focal-maas' + + files=('boot-kernel.', 'boot-initrd.') + + mount_efi "$drive" + + find_newest "$drive" + + if [ -n "$newest" ]; then + echo "DEFAULT cloud-init-$newest" >> "$mnt"/items.cfg + fi + + partition_list "$drive" + for part in $partitions; do + version_from_partnum "$drive" "$part" + versions["$version"]=1 + for f in $files; do + if [ ! -e "$imagepath"/"$f""$version" ]; then + continue + fi + done + cat >> "$mnt"/items.cfg << (EOL) + +LABEL cloud-init-$version +MENU LABEL Ubuntu focal (MAAS $version) +KERNEL $imagepath/boot-kernel.$version +APPEND initrd=$imagepath/boot-initrd.$version root=PARTLABEL="rootfs_$version" ip=dhcp overlayroot=tmpfs:recurse=0 ds=nocloud-net;s=https://box.sysdeploy.org/cloud-init/ +(EOL) + done + + cleanup_mnt +} + +# vim: set ft=sh: diff --git a/tests/data/rename.dat b/tests/data/rename.dat index 5cc68aa..3392e6d 100644 --- a/tests/data/rename.dat +++ b/tests/data/rename.dat @@ -1,7 +1,7 @@ BYT; T_E_M_P:17.2GB:file:512:512:gpt::; 1:1049kB:1074MB:1073MB::EFI system partition:boot, legacy_boot, esp; -2:1075MB:2147MB:1073MB::root 20210228:; +2:1075MB:2147MB:1073MB::root_20210228:; 3:2149MB:3221MB:1073MB::root unused:; 4:3222MB:4295MB:1073MB::root unused:; 5:4296MB:17.2GB:12.9GB::Encrypted:; diff --git a/tests/drive.sh b/tests/drive.sh index c18f046..9d4defb 100755 --- a/tests/drive.sh +++ b/tests/drive.sh @@ -15,7 +15,7 @@ function test_partitioning() sed -i "s|T_E_M_P|$img|g;" tests/data/parted.dat assertEquals "setup_drive" "$(cat tests/data/parted.dat)" "$output" - rename_partition "$img" 2 "root $test_version" + rename_partition "$img" 2 "root_$test_version" output=$(parted -ms "$img" -- print) sed -i "s|T_E_M_P|$img|g;" tests/data/rename.dat assertEquals "rename_partition" "$(cat tests/data/rename.dat)" "$output" @@ -28,13 +28,13 @@ function test_partitioning() version_from_partnum "$img" 3 assertEquals "version_from_partnum unused" "" "$version" - rename_partition "$img" 3 "root $min_version" + rename_partition "$img" 3 "root_$min_version" find_oldest "$img" assertEquals "find_oldest" 3 "$oldest" version_from_partnum "$img" 3 assertEquals "version_from partnum 3" "$min_version" "$version" - rename_partition "$img" 4 "root $max_version" + rename_partition "$img" 4 "root_$max_version" find_newest "$img" assertEquals "find_newest" 4 "$newest" version_from_partnum "$img" 4