#!/bin/bash set -eE -o pipefail trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR # keep it short so we don't delay too much wnen we don't have networking. NETWORK_TIMOUT_SECS=10 fai_check=false check-fai() { # we could just as well check if last_boot != /debianstable_boostrap # the intent with this one is just a little clearer. if [[ $did_fai_check == true ]]; then fai_check=true # ref: https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ deadline=$(( `date +%s` + NETWORK_TIMOUT_SECS )) while ! systemctl status network-online.target && \ (( `date +%s` < deadline )); do sleep 1 done pxe-kexec -n --ignore-whitelist -l fai-generated faiserver ||: else return 0 fi } first=true for dev in $(btrfs fi show / | sed -rn 's#^\s*devid\s.*\s([^0-9 ]+)\S+$#\1#p' \ |sort); do dev+=4 mount $dev /mnt if $first; then if [[ -e /mnt/grubenv ]]; then source <(grub-editenv /mnt/grubenv list) fi first=false check-fai else # we make sure there is only 1 grubenv, # so grub can just find the first one, in whatever order # if looks at them, which may not be the same as us. # If the disk dies, we just lose the default boot option, # we will have to do manual steps to replace it anyways. rm -f /mnt/gruvenv fi umount /mnt done if $fai_check && [[ $last_boot != /debianstable_boostrap ]]; then # no need to reboot if we actually want to boot into this os. reboot fi