#!/bin/bash # update dns records of # pool.mirror.archlinux32.org = CNAME pool32.ddns.eckner.net # either called with 1 argument (the ip to check and add) or without # arguments (all known mirrors will be checked in parallel) if [ $# -eq 1 ]; then if [ "${1%.*}" != "$1" ]; then ipver='A' elif [ "${1%:*}" != "$1" ]; then ipver='AAAA' else exit fi if [ "$(curl \ -w '%{http_code}' \ -o /dev/null \ --connect-timeout 10 \ --resolve "pool.mirror.archlinux32.org:80:$1" \ -s 'http://pool.mirror.archlinux32.org/i686/')" != '200' ]; then exit fi printf '%s %s\n' "${ipver}" "$1" exit fi mirrors=$( curl -s 'https://packages.archlinux32.org/mirrors/status.php?tsv' ) url_column=$( printf '%s\n' "${mirrors}" | \ head -n1 | \ tr '\t' '\n' | \ grep -nxF 'url' | \ cut -d: -f1 ) recently_active_column=$( printf '%s\n' "${mirrors}" | \ head -n1 | \ tr '\t' '\n' | \ grep -nxF 'recently_active' | \ cut -d: -f1 ) if [ -z "${url_column}" ] || [ -z "${recently_active_column}" ]; then # https://packages.archlinux32.org/mirrors/status.php?tsv gave bogus content exit fi { for type in 'A' 'AAAA'; do printf '%s\n' \ 'zone ddns.eckner.net.' \ 'prereq yxrrset pool32.ddns.eckner.net IN '"${type}" \ 'update delete pool32.ddns.eckner.net IN '"${type}" \ 'send' done printf 'zone ddns.eckner.net.\n' printf '%s\n' "${mirrors}" | \ sed '1d' | \ awk '{ print $'"${recently_active_column}"' "\t" $'"${url_column}"' }' | \ sed -n ' s/^1\t// T \|//mirror\.archlinux32\.org/|d s|[^:]\+://|| T s|/.*$|| p ' | \ sort -u | \ parallel -j0 getent ahosts | \ sed -n ' s/\s\+STREAM\(\s.*\)\?$// T p ' | \ sort -u | \ parallel -j0 "$0" | \ sed ' s/^/update add pool32.ddns.eckner.net. 3600 IN / ' printf '%s\n' \ 'send' } | \ nsupdate -l exit 0