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
+# Keep it short so we don't delay too much wnen we don't have networking.
+# In practice, on my home network, on an x200, it took 15 seconds, so
+# give it an extra 10 seconds, which seems fairly short as I write this.
+NETWORK_TIMOUT_SECS=25
did_fai_check=false
+
+m() { printf "%s\n" "$*"; "$@"; }
+
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
grub-editenv /mnt/grubenv set did_fai_check=os_true
+ # our service does not wait for network-online.target,
+ # because it will wait for too long when we don't have a network
+ # connection. So, we wait for 10 seconds.
# 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
+ while ! nc -zu faiserver 69; do
+ if (( `date +%s` > deadline )); then
+ echo "fai-check: hit $NETWORK_TIMOUT_SECS s tftp server timeout"
+ return 0
+ fi
sleep 1
done
- pxe-kexec -n --ignore-whitelist -l fai-generated faiserver ||:
+ m pxe-kexec -n --ignore-whitelist -l fai-generated faiserver ||:
else
return 0
fi
mount $dev /mnt
if $first; then
if [[ -e /mnt/grubenv ]]; then
+ set -x
source <(grub-editenv /mnt/grubenv list)
+ set +x
fi
first=false
check-fai