forked from Bitmessage/sysdeploy
feat: high leve functions for install and update
This commit is contained in:
parent
ef7291d9b8
commit
b17988134b
|
@ -52,10 +52,13 @@ function find_unused
|
||||||
function find_oldest
|
function find_oldest
|
||||||
{
|
{
|
||||||
local drive="$1"
|
local drive="$1"
|
||||||
|
local current="$(grep -E ^serial: /etc/cloud/build.info |cut -d\ -f2)"
|
||||||
oldest="$(parted -m "$drive" -- print|awk -F: \
|
oldest="$(parted -m "$drive" -- print|awk -F: \
|
||||||
|
-v current="root_$current" \
|
||||||
'BEGIN {min="zzzzz"}
|
'BEGIN {min="zzzzz"}
|
||||||
{if (NR > 2 && $1 >= 2 && $1 <= 4 &&
|
{if (NR > 2 && $1 >= 2 && $1 <= 4 &&
|
||||||
$6 < min && $6 != "root unused") {
|
$6 < min && $6 != "root unused" &&
|
||||||
|
$6 != current) {
|
||||||
min=$6; part=$1
|
min=$6; part=$1
|
||||||
}}
|
}}
|
||||||
END {print part}')"
|
END {print part}')"
|
||||||
|
|
35
install.sh
35
install.sh
|
@ -1,25 +1,18 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
function setup_bootloader()
|
. install.inc
|
||||||
{
|
|
||||||
local dev="$1"
|
drive="$1"
|
||||||
check_if_can_overwrite
|
|
||||||
check_if_mounted_or_used_in_lvm_md_crypt
|
if [ ! -b "$drive" ]; then
|
||||||
wipe_or_nvme_format
|
echo "Usage install.sh /dev/wherever"
|
||||||
parted mklabel gpt
|
exit 1
|
||||||
parted mkpart 1GB EFI
|
fi
|
||||||
parted mkpart 1GB squashfs-1
|
|
||||||
parted mkpart 1GB squashfs-2
|
setup_drive "$drive"
|
||||||
parted mkpart 1GB squashfs-3
|
get_streams
|
||||||
|
get_latest_maas_id
|
||||||
|
download_version "$release_version" "$drive"
|
||||||
|
update_syslinux_menu "$drive"
|
||||||
|
|
||||||
dd gptmbr.bin
|
|
||||||
mkfs.vfat "$dev"1
|
|
||||||
syslinux "$dev"1
|
|
||||||
mount
|
|
||||||
copy_efi_files
|
|
||||||
create_syslinux_cfg
|
|
||||||
umount
|
|
||||||
}
|
|
||||||
|
|
||||||
detect_disks
|
|
||||||
select_disk
|
|
||||||
|
|
|
@ -6,6 +6,9 @@ OS_VERSION=20.04
|
||||||
|
|
||||||
function get_streams()
|
function get_streams()
|
||||||
{
|
{
|
||||||
|
if [ -e "$streams" ]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
streams="$(mktemp)"
|
streams="$(mktemp)"
|
||||||
wget -qO "$streams" https://images.maas.io/ephemeral-v3/stable/streams/v1/com.ubuntu.maas:stable:v3:download.json
|
wget -qO "$streams" https://images.maas.io/ephemeral-v3/stable/streams/v1/com.ubuntu.maas:stable:v3:download.json
|
||||||
}
|
}
|
||||||
|
@ -23,27 +26,39 @@ function get_checksum()
|
||||||
{
|
{
|
||||||
local release_version="$1"
|
local release_version="$1"
|
||||||
local filename="$2"
|
local filename="$2"
|
||||||
|
if [ ! -f "$streams" ]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
checksum=$(jq -r '.products[]|select(.version=="'"$OS_VERSION"'" and .arch=="amd64" and .kflavor=="generic" and .subarch=="ga-'"$OS_VERSION"'").versions."'"$release_version"'".items."'"$filename"'".sha256' \
|
checksum=$(jq -r '.products[]|select(.version=="'"$OS_VERSION"'" and .arch=="amd64" and .kflavor=="generic" and .subarch=="ga-'"$OS_VERSION"'").versions."'"$release_version"'".items."'"$filename"'".sha256' \
|
||||||
"$streams")
|
"$streams")
|
||||||
}
|
}
|
||||||
|
|
||||||
function remove_version()
|
function file_url()
|
||||||
{
|
{
|
||||||
local version="$1"
|
local release_version="$1"
|
||||||
|
local filename="$2"
|
||||||
|
if [ ! -f "$streams" ]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
url=$(jq -r '.products[]|select(.version=="'"$OS_VERSION"'" and .arch=="amd64" and .kflavor=="generic" and .subarch=="ga-'"$OS_VERSION"'").versions."'"$release_version"'".items."'"$filename"'".path' \
|
||||||
|
"$streams")
|
||||||
|
url="https://images.maas.io/ephemeral-v3/stable/$url"
|
||||||
}
|
}
|
||||||
|
|
||||||
function download_and_verify()
|
function download_and_verify()
|
||||||
{
|
{
|
||||||
local url="$1"
|
local release_version="$1"
|
||||||
local checksum="$2"
|
local fname="$2"
|
||||||
local fname="$3"
|
|
||||||
|
file_url "$release_version" "$fname"
|
||||||
|
checksum "$release_version" "$fname"
|
||||||
|
|
||||||
wget "$url" -O "$fname"
|
wget "$url" -O "$fname"
|
||||||
sha256sum=$(sha256sum "$fname")
|
sha256sum=$(sha256sum "$fname")
|
||||||
if [ "$sha256sum" == "$checksum" ]; then
|
if [ "$sha256sum" == "$checksum" ]; then
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
rm -f "$fname"
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,18 +69,4 @@ function cleanup_temp()
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function download_files()
|
|
||||||
{
|
|
||||||
download kernel
|
|
||||||
download initrd
|
|
||||||
download squashfs
|
|
||||||
|
|
||||||
dd if=squashfs of="$partition" bs=1M
|
|
||||||
|
|
||||||
create_options_file
|
|
||||||
update_default
|
|
||||||
delete_oldest_if_needed
|
|
||||||
update_onerror_second_youngest
|
|
||||||
}
|
|
||||||
|
|
||||||
# vim: set ft=sh:
|
# vim: set ft=sh:
|
||||||
|
|
21
syslinux.inc
21
syslinux.inc
|
@ -1,17 +1,25 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
function mount_efi()
|
function dev_from_partnum()
|
||||||
{
|
{
|
||||||
local drive="$1"
|
local drive="$1"
|
||||||
local partition="$drive"1
|
local partnum="$2"
|
||||||
|
partition="$drive""$partnum"
|
||||||
if [ ! -b "$partition" ]; then
|
if [ ! -b "$partition" ]; then
|
||||||
partition="$drive"p1
|
partition="$drive"p"$partnum"
|
||||||
if [ ! -b "$partition" ]; then
|
if [ ! -b "$partition" ]; then
|
||||||
echo "Can't find first partition for \"$drive\""
|
echo "Can't find first partition for \"$drive\""
|
||||||
|
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function mount_efi()
|
||||||
|
{
|
||||||
|
local drive="$1"
|
||||||
|
|
||||||
|
dev_from_partnum "$drive" 1
|
||||||
|
|
||||||
unset mnt
|
unset mnt
|
||||||
mnt="$(mktemp -d)"
|
mnt="$(mktemp -d)"
|
||||||
|
@ -25,7 +33,7 @@ function mount_efi()
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function cleanup_mnt()
|
function umount_efi()
|
||||||
{
|
{
|
||||||
umount "$mnt"
|
umount "$mnt"
|
||||||
flush
|
flush
|
||||||
|
@ -36,6 +44,9 @@ function install_syslinux()
|
||||||
{
|
{
|
||||||
local drive="$1"
|
local drive="$1"
|
||||||
|
|
||||||
|
dd bs=440 count=1 conv=notrunc \
|
||||||
|
if=/usr/lib/syslinux/mbr/gptmbr.bin of="$drive"
|
||||||
|
|
||||||
mount_efi "$drive"
|
mount_efi "$drive"
|
||||||
|
|
||||||
# legacy
|
# legacy
|
||||||
|
@ -48,7 +59,7 @@ function install_syslinux()
|
||||||
cp syslinux/{mainmenu,syslinux}.cfg "$mnt"/syslinux
|
cp syslinux/{mainmenu,syslinux}.cfg "$mnt"/syslinux
|
||||||
cp syslinux/syslx64.cfg "$mnt"/EFI/BOOT
|
cp syslinux/syslx64.cfg "$mnt"/EFI/BOOT
|
||||||
|
|
||||||
cleanup_mnt
|
umount_efi
|
||||||
syslinux "$partition"
|
syslinux "$partition"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ function update_syslinux_menu()
|
||||||
version_from_partnum "$drive" "$part"
|
version_from_partnum "$drive" "$part"
|
||||||
versions["$version"]=1
|
versions["$version"]=1
|
||||||
for f in $files; do
|
for f in $files; do
|
||||||
if [ ! -e "$imagepath"/"$f""$version" ]; then
|
if [ ! -e "$mnt"/"$imagepath"/"$f""$version" ]; then
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
@ -38,7 +38,17 @@ APPEND initrd=$imagepath/boot-initrd.$version root=PARTLABEL="rootfs_$version" i
|
||||||
(EOL)
|
(EOL)
|
||||||
done
|
done
|
||||||
|
|
||||||
cleanup_mnt
|
# find expired
|
||||||
|
for f in $files; do
|
||||||
|
for i in "$mnt"/"$imagepath"/"$f"*; do
|
||||||
|
version="$(basename "$i"|cut -d_ -f2-)"
|
||||||
|
if [ -z "${versions[$version]}" ]; then
|
||||||
|
rm -f $i
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
umount_efi
|
||||||
}
|
}
|
||||||
|
|
||||||
# vim: set ft=sh:
|
# vim: set ft=sh:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user