#!/bin/bash
-source ~/.bashrc
+
+set -e; . /usr/local/lib/err; set +e
+[[ $EUID == 0 ]] || exec sudo -E "${BASH_SOURCE[0]}" "$@"
+
+this_file="$(readlink -f -- "${BASH_SOURCE[0]}")"
+readonly this_file
+this_dir="${this_file%/*}"
+readonly this_dir
+cd "$this_dir"
+
+usage() {
+ cat <<EOF
+Usage: ${0##*/} [-f]
+Update ip in remote nameserver.
+
+-f Force update even if ip hasn't changed.
+-h|--help Print help and exit.
+
+Note: Uses util-linux getopt option parsing: spaces between args and
+options, short options can be combined, options before args.
+EOF
+ exit $1
+}
+
+##### begin command line parsing ########
+
+# ensure we can handle args with spaces or empty.
+ret=0; getopt -T || ret=$?
+[[ $ret == 4 ]] || { echo "Install util-linux for enhanced getopt" >&2; exit 1; }
+
+force=false # default
+temp=$(getopt -l help hf "$@") || usage 1
+eval set -- "$temp"
+while true; do
+ case $1 in
+ -f) force=true ;;
+ --) shift; break ;;
+ *) echo "$0: unexpected args: $*" >&2 ; usage 1 ;;
+ esac
+ shift
+done
+
+##### end command line parsing ########
main() {
case $gateway in
10.2.0.1)
+ dyndomain=b8.nz
dynhost=i.b8.nz
;;
*)
;;
esac
+ # We check if we are at home by testing gateway ssh
+ # fingerprint. However, if we found in the past that we are, I dont
+ # like to spam its logs with ssh login attempts, so just check if our
+ # gateway interface has an increasing amount of packets sent +
+ # received from last time.
athome=false
if [[ -s /dev/shm/dynamic-ip-update-state ]]; then
oldbytes=$(cat /dev/shm/dynamic-ip-update-state)
return 0
fi
if ip4=$(curl -s4 https://iankelling.org/cgi/pubip); then
- if [[ $cur4 && $ip4 && $cur4 != $ip4 ]]; then
+ if $force || [[ $cur4 && $ip4 && $cur4 != $ip4 ]]; then
up4=true # update ipv4
fi
fi
fi
fi
- if [[ $cur6 != $ip6 ]]; then
+ if $force || [[ $cur6 != $ip6 ]]; then
up6=true
fi
cat >>$f <<EOF
update delete $dynhost. A
update add $dynhost. 300 A $ip4
+update delete $dyndomain. A
+update add $dyndomain. 300 A $ip4
EOF
fi
quit
EOF
- nsupdate -k /p/c/machine_specific/vps/filesystem/etc/bind/Kb8.nz.*.private <$f
+ nsupdate -k /p/c/machine_specific/vps/filesystem/etc/bind/Kb8.nz.*.private <$f || nsupdate_fails=$((nsupdate_fails + 1))
sed -i 's/^server .*/server bk.b8.nz/' $f
- nsupdate -k /p/c/machine_specific/vps/filesystem/etc/bind/Kb8.nz.*.private <$f
-
-
+ nsupdate -k /p/c/machine_specific/vps/filesystem/etc/bind/Kb8.nz.*.private <$f || nsupdate_fails=$((nsupdate_fails + 1))
+ if (( nsupdate_fails > nsupdate_fail_limit )); then
+ echo error: nsupdate is persistently failing >&2
+ exit 1
+ fi
}
loop-main() {
done
}
-
+nsupdate_fails=0
if [[ $INVOCATION_ID ]]; then
+ nsupdate_fail_limit=10
loop-main
else
+ nsupdate_fail_limit=0
main
fi