From b34c796ab6be6e3eb6573842284011e00d5313dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Thu, 9 Sep 2021 21:31:22 +0200 Subject: Adding ddns-client commands. Signed-off-by: Daniel Baumann --- ddns-client/libexec/ddns-client/list | 45 ++++++++++++++++ ddns-client/libexec/ddns-client/remove | 83 ++++++++++++++++++++++++++++ ddns-client/libexec/ddns-client/update | 99 ++++++++++++++++++++++++++++++++++ 3 files changed, 227 insertions(+) create mode 100755 ddns-client/libexec/ddns-client/list create mode 100755 ddns-client/libexec/ddns-client/remove create mode 100755 ddns-client/libexec/ddns-client/update diff --git a/ddns-client/libexec/ddns-client/list b/ddns-client/libexec/ddns-client/list new file mode 100755 index 0000000..664ddf5 --- /dev/null +++ b/ddns-client/libexec/ddns-client/list @@ -0,0 +1,45 @@ +#!/bin/sh + +# Copyright (C) 2014-2021 Daniel Baumann +# +# SPDX-License-Identifier: GPL-3.0+ +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set -e + +. /etc/network-tools/config/ddns-client.conf + +# alternatives handling for dig +if command -v kdig > /dev/null 2>&1 +then + # knot-dnsutils + DIG="kdig +noadditional" +elif command -v dig > /dev/null 2>&1 +then + # bind9-dnsutils + DIG="dig +noadditional" +else + echo "'${HOOK}': need dig from bind9-dnsutils or knot-dnsutils" >&2 + exit 1 +fi + +NAMESERVER="$(echo ${NAMESERVERS} | awk '{ print $1 }')" + +# Run +for NAMESERVER in ${NAMESERVERS} +do + # shellcheck disable=SC2086 + ${DIG} -k "${TSIG_KEYFILE}" @"${NAMESERVER}" AXFR "${ZONE}" +done | grep -E 'IN (A|AAAA|TXT) ' | sort -u diff --git a/ddns-client/libexec/ddns-client/remove b/ddns-client/libexec/ddns-client/remove new file mode 100755 index 0000000..de14479 --- /dev/null +++ b/ddns-client/libexec/ddns-client/remove @@ -0,0 +1,83 @@ +#!/bin/sh + +# Copyright (C) 2014-2021 Daniel Baumann +# +# SPDX-License-Identifier: GPL-3.0+ +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set -e + +. /etc/network-tools/config/ddns-client.conf + +# alternatives handling for knsupdate/nsupdate +if command -v knsupdate > /dev/null 2>&1 +then + # knot-dnsutils + NSUPDATE="knsupdate -k ${TSIG_KEYFILE}" +elif command -v nsupdate > /dev/null 2>&1 +then + # bind9-dnsutils + NSUPDATE="nsupdate -k ${TSIG_KEYFILE}" +else + echo "'${HOOK}': need nsupdate from bind9-dnsutils or knot-dnsutils" >&2 + exit 1 +fi + +# alternatives handling for wget/curl +if command -v wget > /dev/null 2>&1 +then + # wget + GET="wget -q -O - -U $(basename "${0}")/git" +elif command -v curl > /dev/null 2>&1 +then + # curl + GET="curl -s -A $(basename "${0}")/git" +else + echo "'${HOOK}': need wget or curl" >&2 + exit 1 +fi + +IPV4_ADDRESS="$(${GET} -4 https://tools.bfh.info/api/v0/ipv4/address/ | jq -r -M '.data.ipv4_address')" +IPV6_ADDRESS="$(${GET} -6 https://tools.bfh.info/api/v0/ipv6/address/ | jq -r -M '.data.ipv6_address')" + +DATE="$(date +%Y-%m-%d\ %H:%M:%S)" + +Update_record () +{ + ACTION="${1}" + TYPE="${2}" + ADDRESS="${3}" + + echo -n "${NAMESERVER}: ${ACTION} ${RECORD}.${ZONE} ${TTL} ${TYPE} ${ADDRESS}:" + +# shellcheck disable=SC2086 +echo "server ${NAMESERVER} +zone ${ZONE} +ttl ${TTL} +update ${ACTION} ${RECORD}.${ZONE} ${TTL} ${TYPE} ${ADDRESS} +send" | ${NSUPDATE} + + echo " done." +} + +# Run +for NAMESERVER in ${NAMESERVERS} +do + Update_record delete AAAA + Update_record delete A + Update_record delete TXT + + echo +done diff --git a/ddns-client/libexec/ddns-client/update b/ddns-client/libexec/ddns-client/update new file mode 100755 index 0000000..d0bfc9f --- /dev/null +++ b/ddns-client/libexec/ddns-client/update @@ -0,0 +1,99 @@ +#!/bin/sh + +# Copyright (C) 2014-2021 Daniel Baumann +# +# SPDX-License-Identifier: GPL-3.0+ +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +set -e + +. /etc/network-tools/config/ddns-client.conf + +# alternatives handling for knsupdate/nsupdate +if command -v knsupdate > /dev/null 2>&1 +then + # knot-dnsutils + NSUPDATE="knsupdate -k ${TSIG_KEYFILE}" +elif command -v nsupdate > /dev/null 2>&1 +then + # bind9-dnsutils + NSUPDATE="nsupdate -k ${TSIG_KEYFILE}" +else + echo "'${HOOK}': need nsupdate from bind9-dnsutils or knot-dnsutils" >&2 + exit 1 +fi + +# alternatives handling for wget/curl +if command -v wget > /dev/null 2>&1 +then + # wget + GET="wget -q -O - -U $(basename "${0}")/git" +elif command -v curl > /dev/null 2>&1 +then + # curl + GET="curl -s -A $(basename "${0}")/git" +else + echo "'${HOOK}': need wget or curl" >&2 + exit 1 +fi + +IPV4_ADDRESS="$(${GET} -4 https://tools.bfh.info/api/v0/ipv4/address/ | jq -r -M '.data.ipv4_address')" +IPV6_ADDRESS="$(${GET} -6 https://tools.bfh.info/api/v0/ipv6/address/ | jq -r -M '.data.ipv6_address')" + +DATE="$(date +%Y-%m-%d\ %H:%M:%S)" + +Update_record () +{ + ACTION="${1}" + TYPE="${2}" + ADDRESS="${3}" + + echo -n "${NAMESERVER}: ${ACTION} ${RECORD}.${ZONE} ${TTL} ${TYPE} ${ADDRESS}:" + +# shellcheck disable=SC2086 +echo "server ${NAMESERVER} +zone ${ZONE} +ttl ${TTL} +update ${ACTION} ${RECORD}.${ZONE} ${TTL} ${TYPE} ${ADDRESS} +send" | ${NSUPDATE} + + echo " done." +} + +# Run +for NAMESERVER in ${NAMESERVERS} +do + Update_record delete AAAA + Update_record delete A + + Update_record delete TXT + + if [ -n "${IPV6_ADDRESS}" ] && [ "${IPV6_ADDRESS}" != "null" ] + then + Update_record add AAAA "${IPV6_ADDRESS}" + fi + + if [ -n "${IPV4_ADDRESS}" ] && [ "${IPV4_ADDRESS}" != "null" ] + then + Update_record add A "${IPV4_ADDRESS}" + fi + + if [ -n "${IPV6_ADDRESS}" ] || [ -n "${IPV4_ADDRESS}" ] + then + Update_record add TXT "\"last update: ${DATE}\"" + fi + + echo +done -- cgit v1.2.3