Add DIY DDNS script for Cloudflare to VyOS

Clean out old, unused scripts
This commit is contained in:
Joey Hafner 2024-08-29 00:00:24 -07:00
parent bc2a702450
commit 711773e580
No known key found for this signature in database
8 changed files with 196 additions and 63 deletions

View File

@ -0,0 +1,50 @@
#!/bin/bash
# Takes two positional arguments:
# $1 is the name of the zone to update
# E.g. jafner.net
# $2 is an auth token for Cloudflare;
# Must have the following permissions
# for the given zone:
# - Zone: Read
# - DNS: Read
# - DNS: Edit
function cfddns () {
ZONE=$1
TOKEN=$2
# 1. Get the zone ID from the zone name
ZONE_ID=$(
curl -s \
-X GET "https://api.cloudflare.com/client/v4/zones" \
--header "Authorization: Bearer $TOKEN" \
--header "Content-Type:application/json" |\
jq -r --arg NAME "$ZONE" '.[] | .[]? | select(.name?==$NAME) | .id' 2>/dev/null |\
xargs
); echo $ZONE_ID
# 2. Get the record ID of the root A record
RECORD_ID=$(
curl -s \
-X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records" \
--header "Authorization: Bearer $TOKEN" \
--header 'Content-Type:application/json' |\
jq -r --arg NAME "$ZONE" '.[] | .[]? | select(.type=="A") | select(.name?==$NAME) | .id' 2>/dev/null |\
xargs
); echo $RECORD_ID
# 3. Compose the json payload for the record to push
DATA=$(jq --null-input \
--arg CONTENT "$(curl -s ipinfo.io/ip)" \
--arg NAME "$ZONE" \
'{"content": $CONTENT, "name": $NAME, "type": "A"}'
); echo $DATA
# 4. Finally submit the updated record to Cloudflare
curl --request PUT \
--url https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID \
--header "Authorization: Bearer $TOKEN" \
--header 'Content-Type:application/json' \
--data "$DATA" > /dev/null 2>&1
}
cfddns $1 $2

View File

@ -0,0 +1,58 @@
{
"data": "ENC[AES256_GCM,data:i5Lxi5BD/whq/11xY/AeSU22Lvx2oee6ooR7Xrycm1bjWIJCGGZ9Wg==,iv:9d8M7WEKUSfYIKuWQ6KkzM08tr5PAxXH/SEDQHwDko4=,tag:6/KSwxdZD7HVVk/lRI29PQ==,type:str]",
"sops": {
"shamir_threshold": 2,
"key_groups": [
{
"hc_vault": null,
"age": [
{
"recipient": "age1zswcq6t5wl8spr3g2wpxhxukjklngcav0vw8py0jnfkqd2jm2ypq53ga00",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBuR3ZGekxTR1JZNGphaGRj\ncVZCM1NGd2w3SFlkR0VKMlZxM0lxdGlQMVFvCkRRK2VjVUlEVndjZ25RUWl3NDUz\nUkNXdXNubTZ5REVOUDI5MGZXdVh6bTAKLS0tIHhCTlorSVdmZTY3ekQ1aVJkQ0Ix\nV001NGVyKzdtaXFhcmJURFhJRDFhNncKTDLvXoXS6OW/LwUs9av4ATIq4nqpWqtX\n7Z0TTB/Ms1l0l6lBmJMT/ep/aWj9RHkdIQGlpPlxJ5HVBhMcIiDH6JE=\n-----END AGE ENCRYPTED FILE-----\n"
}
]
},
{
"hc_vault": null,
"age": [
{
"recipient": "age1zswcq6t5wl8spr3g2wpxhxukjklngcav0vw8py0jnfkqd2jm2ypq53ga00",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBFTWNpbUduY0RYeWd6ekVy\nN2dlS3VWYkZZZVJWMTJFNzZkbVNNOFY2QlZZCmd4VWw4VUQ2blR2VTdma00yVy9F\nUlN0UEV0Wk9ZaXZGUTkvL0hpV29zOWcKLS0tIDlwdjBkOXBJNXdjc0FMQm5QbUda\nbjVQbU1EcFl2RStCcnRIeFhUaTRkV2cKFtV2Tq+v5uQMgOCUTuT/PCrhhykEc3g8\n5SWMZmiKxSNZsGMSXJqHzVSK615nKmm4Tgbm09UHBMgS3gEo/GStpuk=\n-----END AGE ENCRYPTED FILE-----\n"
}
]
},
{
"hc_vault": null,
"age": [
{
"recipient": "age12xgfd2w8acy5c2mrg3xv7ndzx3zw2j4kxv2a6ull385vxe8lcq2qpkhnv5",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBGWEtWSEhsRmtEbzdYZzRN\nanEwYStlZHZOWlVobWVpd0JUb0xHUlY2N2xjCkllaGl2NGhsZmFzMGVqalNtaHgw\nSm5ublc3cjRMVmJ1TEhmd0VWZElyQTAKLS0tIHgzdlMybnFuQTRqNGNoUTZmM0hI\ndmcxSHA4NzBzcTBnWmFLcFVIdUwyZk0KmAxGREoNa42UYoHV8aFBVMpbF5jtAmAu\nMDwj8f9IVSMNBKZ695uFfS+opJJgEUT5k6dCpms55SOmVVI2ueVtumY=\n-----END AGE ENCRYPTED FILE-----\n"
}
]
},
{
"hc_vault": null,
"age": [
{
"recipient": "age13prhyye2jy3ysa6ltnjgkrqtxrxgs0035d86jyn4ltgk3wxtqgrqgav855",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB6UmlnOVlML3FYaDFDZThP\nVVNiZU1rN08raWNUSHMxVkppTmFpL0hqUndVCmgvRTdLMHQwajZabWZjTXpodm8x\nUnZKZVN0MHBMaGVoMlBmY29DZEV2R00KLS0tIHpPWVYrUWxkVmIzV0NmaGNUNmti\neHRIVlVuM1p5Y3FxVHpHMnVDVGp4UEkKD8Yp2JdE4LPVtWGibIv9IQGxCvrJXi8D\nUwnRPwYOxqKDc82YkiB+xmPLybGNyDTySkfEmgYJVVC3nrRTBu6n0Sw=\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1n20krynrj75jqfy2muvhrygvzd4ee8ngamljqavsrk033zwx0ses2tdtfe",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBRakVSbHFsQjJwU09HMEpK\nVnY5UE9zNzgzOEtUVEV1RTlHN2oySU1CYnhjCkZKMTBnK0Fia0FGdFowVXR1S01z\nVldWc096QW01c0w3OGt4MytrTWNjdGcKLS0tIHBsbUxDMHhTT0JMTGZWR09aRUhh\nQWNKbngzRmhUL1VmdHc2MU13Y3VZejAKbByk3tp2ya7d6Lqe/I8Q5VWfkBBre5EH\nfXUd2ARacgPhaAT03z5TSc+ufVM6J7OUtGcY+ux4aTliQi+Uf3Lgsy0=\n-----END AGE ENCRYPTED FILE-----\n"
}
]
}
],
"kms": null,
"gcp_kms": null,
"azure_kv": null,
"hc_vault": null,
"age": null,
"lastmodified": "2024-08-29T06:59:11Z",
"mac": "ENC[AES256_GCM,data:PNmmT1P861SjNMyIti1LeReS59FGHTx4w+DlbcuI7ImTdcCCOYerGYzoQ4ocqLWzRODrPFs9GMrPS6CIxW0eIZ6NFUrRjk+0gOKDITVWwGWHfBG1GkEi5x4PSjqDL0lxQOxZlLtBLIhvaNMrRvbydcuYN4O3uCV+A2AtuVKCJVA=,iv:bL77QIfKp3yXmQbI5Alak/GzeQAfJGbs6beKFsEiY0A=,tag:qsbFZgh6cm6FyoIxkNV+tQ==,type:str]",
"pgp": null,
"unencrypted_suffix": "_unencrypted",
"version": "3.9.0"
}
}

View File

@ -1,16 +0,0 @@
#!/bin/vbash
# https://docs.vyos.io/en/equuleus/automation/command-scripting.html
source /opt/vyatta/etc/functions/script-template
configure
delete service dns forwarding name-server 192.168.1.21
delete service dns forwarding name-server 192.168.1.22
set service dns forwarding name-server 1.1.1.1
delete service dhcp-server shared-network-name LAN name-server 192.168.1.21
delete service dhcp-server shared-network-name LAN name-server 192.168.1.22
set service dhcp-server shared-network-name LAN name-server 192.168.1.1
commit
save
exit

View File

@ -1,16 +0,0 @@
#!/bin/vbash
# https://docs.vyos.io/en/equuleus/automation/command-scripting.html
source /opt/vyatta/etc/functions/script-template
configure
delete service dns forwarding name-server 1.1.1.1
set service dns forwarding name-server 192.168.1.21
set service dns forwarding name-server 192.168.1.22
delete service dhcp-server shared-network-name LAN name-server 192.168.1.1
set service dhcp-server shared-network-name LAN name-server 192.168.1.21
set service dhcp-server shared-network-name LAN name-server 192.168.1.22
commit
save
exit

View File

@ -1,8 +0,0 @@
#!/bin/vbash
# https://docs.vyos.io/en/equuleus/automation/command-scripting.html
source /opt/vyatta/etc/functions/script-template
cp /config/config.boot /config/config.new
nano /config/config.new
configure
load /config/config.new

View File

@ -0,0 +1,30 @@
#!/bin/vbash
source /opt/vyatta/etc/functions/script-template
SCRIPT_PATH="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
WEBHOOK_URL="$(cat $SCRIPT_PATH/webhook.token)"
NAT_COMMANDS="$(run show configuration commands | grep 'set nat destination' | grep 'destination address')"
# Assert all destination nat rules use the same IP
if [[ "$(echo "$NAT_COMMANDS" | cut -d' ' -f8 | sort -u | wc -l)" != "1" ]]; then
curl -i -H "Accept: application/json" -H "Content-Type:application/json" -X POST --data "{\"content\": \"$SCRIPT_PATH/ipupdate.sh: Error: Existing NAT rules are not consistent\"}" $WEBHOOK_URL
fi
# Get new and old public IPs
PUBLIC_IP="$(curl -s ipinfo.io/ip)"
echo "$NAT_COMMANDS" | cut -d' ' -f-7 | while read line; do echo $line "$PUBLIC_IP"; done > /tmp/commands
configure; source /tmp/commands > /dev/null; rm /tmp/commands
compare |\
if [[ "$(cat -)" != *"No changes between working and active configurations."* ]]; then
curl -s -o /dev/null -i -H "Accept: application/json" -H "Content-Type:application/json" -X POST --data "{\"content\": \"$SCRIPT_PATH/ipupdate.sh: Info: Attempting to update hairpin NAT rules. New public IP: $PUBLIC_IP\"}" $WEBHOOK_URL
{ # try commit, save, exit
commit && save && exit
} || { # catch, exit discard and create a very basic error file
exit discard
curl -s -o /dev/null -i -H "Accept: application/json" -H "Content-Type:application/json" -X POST --data "{\"content\": \"$SCRIPT_PATH/ipupdate.sh: Error: Failed during commit, save, exit.\"}" $WEBHOOK_URL
}
else
exit
fi

View File

@ -1,23 +0,0 @@
#!/bin/vbash
source /opt/vyatta/etc/functions/script-template
# get current public IP
NEW_IP=$(show interfaces pppoe pppoe1 | grep "inet\s" | cut -d ' ' -f 6)
# get old public IP
OLD_IP=$(show nat destination rules | grep 1100 | head -1 | tr -s ' ' | cut -d' ' -f 3)
show configuration commands | grep $OLD_IP | sed --expression="s/$OLD_IP/$NEW_IP/" > ipupdate.tmp
configure
source ipupdate.tmp
{ # try commit, save, exit
commit && save && exit
} || { # catch, exit discard and create a very basic error file
exit discard
echo "Script failed. Write some real error handling."
}
rm ipupdate.tmp

View File

@ -0,0 +1,58 @@
{
"data": "ENC[AES256_GCM,data:J0L1cIwxF9x+zi8VnDglNPEXaTjPKAyn6KuUeRAFSwseAa3CxW2AgB+p2O97VJGisW/4Ft87jDuLecZAKBbytOlWRQmvPwcHzNl4bVMfzIfqXTb/mplQY736r4Ibzko/QWN3rlIRVg2BMpTeKem3cEgyxHCtAvMHrA==,iv:9o5DcCX9U224+GeUOZ0MVyrX41OjWkin2Zii914In2A=,tag:IG1x4JX7MCML1F7KZYRy+g==,type:str]",
"sops": {
"shamir_threshold": 2,
"key_groups": [
{
"hc_vault": null,
"age": [
{
"recipient": "age1zswcq6t5wl8spr3g2wpxhxukjklngcav0vw8py0jnfkqd2jm2ypq53ga00",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA4Ykp5a1hJMGNDZ3VUSEl1\nTTNVdG82QW9MbmJqSFVWVzl2bVhaMWFiR1cwCjdrN2d4UlVHeHVOUEMzWXdCNzRC\nTk8wUTRRODRYMGJDVUltUVVrQ0d5RDQKLS0tIE5ORi9NUzdWM2lWUmtWemtrdTBR\nVGJGNnVERVIvYTNQU01YNFlGOE9kRDgKqA5t9bmCIpdEx8uIRZRuJqyHqVkV1v+l\ngZvorclJF36oSI+NWtj3pWZRFbxXh/CbMpTq9FMNaY5pmgVK7TUGq2E=\n-----END AGE ENCRYPTED FILE-----\n"
}
]
},
{
"hc_vault": null,
"age": [
{
"recipient": "age1zswcq6t5wl8spr3g2wpxhxukjklngcav0vw8py0jnfkqd2jm2ypq53ga00",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBuTys0TDZqb1pwejFyWU5Q\ncG1rM3pRMEJod1p1MWNneHk2OE5zdWRoQ1RVCkJjeEVvMVNUM0ZhOHhiWWN2VDYz\nKysrNmZWYTljaVBuVDNqQkRqQktpZWsKLS0tIEI4OGxLRzIzai9RRlFmVlpuVEZC\nT1UrSTYvNndwQ2toOTdoQ0hhV2V1NWcKiNXIZqUGwsgOKp63oaFoUMifcJPsgWXv\nRUTjlQCPnaWf5dWWqgtFQ5BpVIEp7t1o10Bz1l+njwb26ArsOUFI+MI=\n-----END AGE ENCRYPTED FILE-----\n"
}
]
},
{
"hc_vault": null,
"age": [
{
"recipient": "age12xgfd2w8acy5c2mrg3xv7ndzx3zw2j4kxv2a6ull385vxe8lcq2qpkhnv5",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBSeFdUS2dyL29LMnpWdzA0\nWWhVN1NKWHp2VjF0bStONlVCZzQrME1DMUVRClNRWXJxQWVCNUlycXQ2YkVyOUlL\nWGZCZk1zZW1KVkhncGhDSjIrNVdOWWMKLS0tIFd4VjFLVnBlNjRNczhnU2lvYzh4\nRVJmU2k2Q2oySmdyc3dQVEpvR2lMZUkKLxIX14E7+ETRCQCgkE944+UiP+k6sp2F\n1mPDBVW4wK6UBcl5YVDVQfh3cY2dHSLmwzsDVkrqJgFvnlJtILPSDG4=\n-----END AGE ENCRYPTED FILE-----\n"
}
]
},
{
"hc_vault": null,
"age": [
{
"recipient": "age13prhyye2jy3ysa6ltnjgkrqtxrxgs0035d86jyn4ltgk3wxtqgrqgav855",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBQTFp1VFZ4QUtzQTc2RG1K\nQmk1aGdOZWNwUUlkZndyWk85WW1nZExMMWo4CjR4d2pSUitGZVhJK3h6WUFsaFNy\nS1dYWk9lM25Va2VKMnJnbVNWZ2lWTnMKLS0tIDd4NUMwRFplNktabm81aGdoeUVV\nOWU1RnM1YTI4WDlVOEFCaEtuM2ZvOWMKai54kxKRvRxCchAGxcfn1dW1o1UBOWsx\n8TneFFmpPOT67IaCc1APOeIyWYYNUIz1POoA+SpEiSaQAMVeAif5ek8=\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1n20krynrj75jqfy2muvhrygvzd4ee8ngamljqavsrk033zwx0ses2tdtfe",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBrWFh5aFczYmRsblM3dkxZ\nTGg2WWg3SmhSUUJJL2NUcHcydlhDaUs5MjJjCnRyY1ltWjJrM0ZGUjZQTm5zMXV4\naVFPcm5BcXY1OFZQOU1SejRlYjBBNjQKLS0tIDlqNUllUXY1MUdoN2VMM2ozS2ti\nSXBQeDNrTEt1a2VhYkdrT0xLaTQxbDgKQ8ef/QkEzgqNF8dQ5o9WUmfsP3f+fwHJ\nm/IaR+tFiBjCqJsbr6sExc7wxQpyY2Ir/S6fsJ9dwtbjCTT032T+cTU=\n-----END AGE ENCRYPTED FILE-----\n"
}
]
}
],
"kms": null,
"gcp_kms": null,
"azure_kv": null,
"hc_vault": null,
"age": null,
"lastmodified": "2024-08-29T06:59:11Z",
"mac": "ENC[AES256_GCM,data:YuQ0M5fLfnTLY3oSpBkf35pH7AUwCq5ROIpNw13+Jk3GvKplX3acp54hxbKVBKK78sP6duh6mr+l7tROxsNer60PIMBCyAlFap3Bwhjm7wxuQuEv+0JTNC2MgzJBsZZxl/GbUhvX8DznK8mxMiNUSLvWvHUp6OF8dlhs39jaPEA=,iv:1WrF+cuLsGs6HSGSml/BJ4Ocprdkmt6IW/azHWF08Cs=,tag:hNzozSh9G0pblU6XeyEGwA==,type:str]",
"pgp": null,
"unencrypted_suffix": "_unencrypted",
"version": "3.9.0"
}
}