X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=dynamic-ip-update;h=c725682b5e02b63eda4d9d80305cc97b28d81b84;hb=89a1a98bb918fdf856d34900610413c79e32897e;hp=1e7880274c3a57a6801d930a20e3a1ded1b27dc0;hpb=b18dade73dedfe69aa741f8417947d83c4208f2d;p=distro-setup diff --git a/dynamic-ip-update b/dynamic-ip-update index 1e78802..c725682 100755 --- a/dynamic-ip-update +++ b/dynamic-ip-update @@ -1,7 +1,47 @@ #!/bin/bash -source ~/.bashrc +set -e; . /usr/local/lib/bash-bear; 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 <&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 ip4=$(curl -s4 https://iankelling.org/cgi/pubip); then - if [[ $cur4 && $ip4 && $cur4 != $ip4 ]]; then + 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 --connect-timeout 10 -s4 https://iankelling.org/cgi/pubip); then + if $force || [[ $cur4 && $ip4 && $cur4 != $ip4 ]]; then up4=true # update ipv4 fi fi @@ -59,7 +113,7 @@ main() { up6=false - out6=$(curl -s6 https://iankelling.org/cgi/pubip) ||: # failure allowed if we have no ipv6 + out6=$(curl --connect-timeout 10 -s6 https://iankelling.org/cgi/pubip) ||: # failure allowed if we have no ipv6 if [[ $out6 ]]; then dev=$(ip -o a show to $out6 | awk '{print $2}') @@ -74,10 +128,16 @@ main() { fi fi - if [[ $cur6 != $ip6 ]]; then + if $force || [[ $cur6 != $ip6 ]]; then up6=true fi + # if we failed to get our ipv6 addr, we probably have ipv6 + # connectivity problem. + if [[ ! $ip6 ]]; then + ip_arg=-4 + fi + if ! $up4 && ! $up6; then return 0 fi @@ -96,6 +156,8 @@ EOF cat >>$f < nsupdate_fail_limit )); then + echo error: nsupdate is persistently failing >&2 + exit 1 + fi } loop-main() { @@ -133,10 +197,12 @@ loop-main() { done } - +nsupdate_fails=0 if [[ $INVOCATION_ID ]]; then + nsupdate_fail_limit=10 loop-main else + nsupdate_fail_limit=0 main fi @@ -165,7 +231,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