#!/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