#! /bin/sh
#
# printf '%s %s\n' hostname IP-address for each known public retiolum address
#
set -eu

_list_hostname_address() {
  cd /etc/tinc/retiolum/hosts
  grep --with-filename '^Address' * |
  sed -n '
    s/: */ /
    s/ *= */ /
    s/ Address \([a-zA-Z0-9.:_]*\) \?.*/ \1/p'
}
_lookup_address() {
  sed '
    /:/!{/ [0-9.]*$/!{s/ / `dig +short /;s/$/` \&/}}
    s/^/echo /
    $s/$/\nwait/
  ' | sh
}
_filter_public() {
  sed '
    # drop private IPv4 addresses
    / 10\./d
    / 172\.\(1[6-9]\|2[0-9]\|3[01]\)\./d
    / 192\.168\./d
    # TODO drop private IPv6 addresses
  '
}
_filter_online() {
  awk '
    {print"nc -zw 2 "$2" 655 2>/dev/null && echo "$1" "$2" &"}
    END {print"wait"}
  ' | sh
}

_list_hostname_address | _lookup_address | _filter_public