#!/usr/bin/env bash set -e; usage() { USAGE=$(cat <'. EOF ) echo "$USAGE"; } # check for config file apply_config() { local config=$1; if [[ ! -f "$config" ]]; then echo "No config file specified"; echo ""; usage; exit 1; fi set -a; source "$config"; set +a; } source_config() { local config=$1; local configFallback=$2; local configGlobalFallback=$3; if [[ -f "$config" ]]; then apply_config "$config"; return; fi if [[ -f "$configFallback" ]]; then apply_config "$configFallback"; return; fi if [[ -f "$configGlobalFallback" ]]; then apply_config "$configGlobalFallback"; return; fi } apply_defaults() { if [ -z "${DYNV6_MAIL_ENABLED}" ]; then DYNV6_MAIL_ENABLED=false; fi if [ -z "${DYNV6_MAIL_ADDRESS}" ]; then DYNV6_MAIL_ADDRESS=""; fi if [ -z "${DYNV6_TOKEN}" ]; then DYNV6_TOKEN=""; fi if [ -z "${DYNV6_HOSTNAME}" ]; then DYNV6_HOSTNAME=""; fi if [ -z "${DYNV6_IPV4_ENABLED}" ]; then DYNV6_IPV4_ENABLED=true; fi if [ -z "${DYNV6_IPV6_ENABLED}" ]; then DYNV6_IPV6_ENABLED=true; fi if [ -z "${DYNV6_IPV6_INTERFACE}" ]; then DYNV6_IPV6_INTERFACE="eth0"; fi } check_required() { if [ -z "${DYNV6_TOKEN}" ]; then echo "DYNV6_TOKEN is required" exit 1; fi if [ -z "${DYNV6_HOSTNAME}" ]; then echo "DYNV6_HOSTNAME is required" exit 1; fi } # check requirements CONFIG_FILE="$1"; FALLBACK_CONFIG_FILE="${HOME}/.dynv6.conf"; FALLBACK_CONFIG_GLOBAL_FILE="/etc/dynv6.conf"; source_config "${CONFIG_FILE}" "${FALLBACK_CONFIG_FILE}" "${FALLBACK_CONFIG_GLOBAL_FILE}"; apply_defaults; check_required; # DO NOT CHANGE token=${DYNV6_TOKEN} hostname=${DYNV6_HOSTNAME} echo "Checking ${hostname}" # check via service # ipv6 if [ "${DYNV6_IPV6_ENABLED}" = "true" ]; then echo "Testing IPv6"; ipv6Address=$(LC_ALL=C /usr/bin/ip -c=never -6 -o a s dev ${DYNV6_IPV6_INTERFACE} | grep --color=never -Po '(?<=inet6 )(2.*?)(?=\/64 scope global dynamic mngtmpaddr)') ipv6AddressLocalFile="/tmp/dynv6_ip6"; if [ ! -f "${ipv6AddressLocalFile}" ]; then touch "${ipv6AddressLocalFile}"; fi if grep --color=never -Fxq ${ipv6Address} "${ipv6AddressLocalFile}"; then echo "IPv6 is still ${ipv6Address}"; else echo "IPv6 changed" echo "${ipv6Address}" > "${ipv6AddressLocalFile}"; ipv6Res=$(curl -s -v "https://ipv6.dynv6.com/api/update?hostname=${hostname}&ipv6=${ipv6Address}&token=${token}") ipv6Changed=true; if [ "${ipv6Res}" = "addresses unchanged" ]; then ipv6Changed=false; fi if [ "${ipv6Changed}" = "true" ]; then if [ "${DYNV6_MAIL_ENABLED}" = "true" ]; then HOSTMACHINE=$(hostname) echo -e "IPv6 for ${hostname} on host ${HOSTMACHINE} changed to ${ipv6Address}" | mailx -s "[dynv6 IPv6 ${HOSTMACHINE}] IPv6 changed for ${hostname}" "${DYNV6_MAIL_ADDRESS}" fi fi fi fi # ipv4 if [ "${DYNV6_IPV4_ENABLED}" = "true" ]; then echo "Testing IPv4"; ipv4Address=$(curl -s "https://api.ipify.org/?format=text") ipv4Res=$(curl -fsS "https://ipv4.dynv6.com/api/update?hostname=${hostname}&ipv4=${ipv4Address}&token=${token}") ipv4Changed=true; if [ "$ipv4Res" = "addresses unchanged" ]; then ipv4Changed=false; fi if [ "${ipv4Changed}" = "true" ]; then echo "IPv4 changed" if [ "${DYNV6_MAIL_ENABLED}" = "true" ]; then HOSTMACHINE=$(hostname) echo -e "IPv4 for ${hostname} on host ${HOSTMACHINE} changed to ${ipv4Address}" | mailx -s "[dynv6 IPv4 ${HOSTMACHINE}] IPv4 changed for ${hostname}" "${DYNV6_MAIL_ADDRESS}" fi fi fi