Files
dotfiles/bin/xmpp-resolve
T

51 lines
1.3 KiB
Bash
Executable File

#!/usr/bin/env bash
ADDR=$1
DNS_SERVER=$2
EXTRA_LINES_EXPR='(is an alias|has no|not found|^Using domain server:|^Name:|^Address:|^Aliases:|^$)'
function print_host() {
local port=$2
for ipv in A AAAA; do
if [ "$ipv" = A ]; then
local argn=4
local wl=''
local wr=''
else
local argn=5
local wl='['
local wr=']'
fi
host -t $ipv $1 $DNS_SERVER | grep -Ev "$EXTRA_LINES_EXPR" | awk "{ print \$$argn }" | while read server; do
echo -n "$wl$server$wr:$port (${3-$ipv}"
local response
response=$( (echo '</>'; sleep 0.1) | nc -nw 2 $server $port 2>/dev/null)
if [ $? -eq 0 ]; then
local introduced_as=$(echo "$response" | grep -Eo "from=.[^\'\"]+." | cut -d= -f2)
[ -n "$introduced_as" ] && echo -n " $introduced_as"
echo ')'
else
echo ', unavailable)'
fi
done
done
}
for role in client server; do
echo "--- $role ---------------------------------------------"
HOST_ANSWER=$(host -t SRV "_xmpp-$role._tcp.$ADDR" $DNS_SERVER | grep -Ev "$EXTRA_LINES_EXPR")
if echo $HOST_ANSWER | grep -q 'has SRV'; then
echo "$HOST_ANSWER" | awk '{ print $7, $8 }' | while read port server; do
print_host $server $port SRV
done
else
if [ "$role" = "server" ]; then
port=5269
else
port=5222
fi
print_host $ADDR $port
fi
done