lots o fixes, beets, shellcheck stuff
[distro-setup] / dynamic-ip-update
index 4b5983fbed4153e5c9b7a57d3203863b2093393f..ccfe2becd2916349d93ca2db29f65718e61a6789 100755 (executable)
@@ -1,7 +1,47 @@
 #!/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() {
 
@@ -13,16 +53,20 @@ main() {
 
   up4=false
 
-  if ! read -r _ _  gateway _ ifdev _ < <(ip -4 route get 85.119.83.50 2>/dev/null); then
-    # if our internet is down, just give up, no need to have an error
-    if [[ ! $INVOCATION_ID ]]; then
+  if ! tmp=$(ip -4 route get 85.119.83.50 2>/dev/null); then
+    # our internet is down
+    if [[ $INVOCATION_ID ]]; then
+      return 0
+    else
       echo $0: failed to get route, giving up
+      exit 0
     fi
-    exit 0
   fi
+  read -r _ _  gateway _ ifdev _ <<<"$tmp"
 
   case $gateway in
     10.2.0.1)
+      dyndomain=b8.nz
       dynhost=i.b8.nz
       ;;
     *)
@@ -30,6 +74,11 @@ main() {
       ;;
   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)
@@ -46,9 +95,14 @@ main() {
 
 
   if $athome; then
-    cur4="$(dig +short $dynhost @iankelling.org | tail -1)"
+    if ! cur4="$(dig +short $dynhost @iankelling.org | tail -1)"; then
+      if [[ ! $INVOCATION_ID ]]; then
+        echo "$0: dig failed. internet looks down. giving up"
+      fi
+      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
@@ -74,7 +128,7 @@ main() {
     fi
   fi
 
-  if [[ $cur6 != $ip6 ]]; then
+  if $force || [[ $cur6 != $ip6 ]]; then
     up6=true
   fi
 
@@ -96,6 +150,8 @@ EOF
     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
 
@@ -119,27 +175,31 @@ answer
 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
 }
 
-if [[ $INVOCATION_ID ]]; then
-  # this is to prevent systemd from filling up the journal
-  for (( runcount=0; runcount < 100; runcount++ )); do
+loop-main() {
+  while true; do
     main
     sleep 30
   done
+}
+
+nsupdate_fails=0
+if [[ $INVOCATION_ID ]]; then
+  nsupdate_fail_limit=10
+  loop-main
 else
+  nsupdate_fail_limit=0
   main
 fi
 
-
-
-
-
 exit 0
 
 
@@ -165,7 +225,7 @@ exit 0
 #   # push here?
 #   #myunison -ob li
 #   #ssh li conflink
-#   ssh li.b8.nz systemctl reload bind9
+#   ssh li.b8.nz systemctl reload named
 
 
 #   # b8.nz has address 65.96.178.16