system-helpers/usr/local/bin/dynv6

148 lines
4.1 KiB
Bash

#!/usr/bin/env bash
set -e;
usage() {
USAGE=$(cat <<EOF
Usage: dynv6 [CONFIG_FILE (absolute path)]
If no CONFIG_FILE is given, HOME/.dynv6.conf is used. This fallback option
has to exist or the script will exit.
Configuration can be done in any file and any pre-defined variable can be overwritten.
The following are at least required for the script to work:
- DYNV6_MAIL_ENABLED= // if notify via mail
- DYNV6_MAIL_ADDRESS="" // (optional) mail.rc has to be configured
- DYNV6_TOKEN="" // the dynv6 token
- DYNV6_HOSTNAME="" // the dynv6 hostname
- DYNV6_IPV4_ENABLED=true // if should update ipv4
- DYNV6_IPV6_ENABLED=true // if should update ipv6
- DYNV6_IPV6_INTERFACE=eth0 // which interface to track, be sure that Privacy Extensions are disabled
You can copy this script to '/usr/local/bin' and use create a custom CONFIG_FILE as user. Examples can be found in '/usr/share/doc/<scriptname>'.
EOF
)
echo "$USAGE";
}
# check for config file
source_config() {
local config=$1;
local configFallback=$2;
if [[ ! -f "$config" ]]; then
if [[ ! -f "$configFallback" ]]; then
echo "No config file specified and could not find default in '$configFallback'!";
echo "";
usage;
exit 1;
else
config=$configFallback;
fi
fi
set -a;
source "$config";
set +a;
}
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";
source_config "${CONFIG_FILE}" "${FALLBACK_CONFIG_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://v4.ident.me/")
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