nfsn-dns-update
9067dadd
 #!/bin/sh
 set -euC
 
 # nfsn-dns-update DOMAIN NAME TYPE FILTER_REGEX [DATA]...
 
 # nfsn-dns-update "example.com" "git" "A" '' \
 #     "$(curl -s "https://api.ipify.org")"
 
 # Arguments.
 
 domain="$1" ; shift
 name="$1" ; shift
 type="$1" ; shift
 filter_regex="$1" ; shift
 
 host="${name:+"$name."}$domain"
 
 data_new_list=""
 while [ "$#" -gt "0" ]
 do
     data="$1" ; shift
     data_new_list="$(
         printf "%s${data_new_list:+"\n"}%s\n" \
             "${data_new_list:-}" \
             "$data"
     )"
 done
 
 # Old data.
 
 data_old_response="$(
     nfsn-send "POST" "/dns/$domain/listRRs" \
         "name" "$name" \
         "type" "$type"
 )"
 data_old_list="$(
     printf "%s\n" "$data_old_response" \
     | jq -r '
         .[] |
         if ."aux"
         then
             "\(."aux") "
         else
             ""
         end
         +
         "\(."data"?)"
     ' \
     | grep "$filter_regex" \
     || true
 )"
 
 # Update.
 
 if [ -n "$data_old_list" ]
 then
     printf "%s\n" "$data_old_list" \
     | while IFS= read -r data
     do
         if ! printf "%s\n" "$data_new_list" | grep -qFx "$data"
         then
             printf "Removing data: %s\n" "$data"
             nfsn-send "POST" "/dns/$domain/removeRR" \
                 "name" "$name" \
                 "type" "$type" \
                 "data" "$data"
         fi
     done
 fi
 
 if [ -n "$data_new_list" ]
 then
     printf "%s\n" "$data_new_list" \
     | while IFS= read -r data
     do
         if ! printf "%s\n" "$data_old_list" | grep -qFx "$data"
         then
             printf "Adding data: %s\n" "$data"
             nfsn-send "POST" "/dns/$domain/addRR" \
                 "name" "$name" \
                 "type" "$type" \
                 "data" "$data"
         else
             printf "Data already present: %s\n" "$data"
         fi
     done
 fi