better support for systems with no pxe
[automated-distro-installer] / fai / config / files / root / fai-check / STABLE_BOOTSTRAP
diff --git a/fai/config/files/root/fai-check/STABLE_BOOTSTRAP b/fai/config/files/root/fai-check/STABLE_BOOTSTRAP
new file mode 100755 (executable)
index 0000000..29bb1fb
--- /dev/null
@@ -0,0 +1,43 @@
+#!/bin/bash
+
+set -eE -o pipefail
+trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR
+
+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
+        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