47 lines
1.6 KiB
Bash
Executable File
47 lines
1.6 KiB
Bash
Executable File
#!/bin/bash
|
|
# FILE: ips_to_peers_rxfr
|
|
# DESCRIPTION: Takes a list of IPs from wg show allowed-ips
|
|
# and adds domains using rxfr lookups
|
|
# USAGE: ips_to_peers_rxfr json <<<"${user_peers}"
|
|
# ERRORS:
|
|
# 3: bad usage
|
|
# 4: nslookup failed
|
|
# 5: Invalid format
|
|
# 6: Config file not found
|
|
|
|
CONFIG_FILE='/etc/wgapi/config'
|
|
if ! [ -f "${CONFIG_FILE}" ]; then
|
|
printf 'ERROR! %s Config file not found\n' "${0}" >>"${LOGFILE}"
|
|
exit 6
|
|
fi & if ! [ ${#} -eq 1 ] || [ ${#} -eq 3 ]; then
|
|
printf 'ERROR! Bad usage: %s %s\n' "$0" "$*" >>"${LOGFILE}"
|
|
exit 3
|
|
fi & if ! [ -x /usr/bin/wg ]; then
|
|
printf 'ERROR! %s /usr/bin/wg not found\n' "${0}" >>"${LOGFILE}"
|
|
exit 5
|
|
fi
|
|
source "${CONFIG_FILE}"
|
|
format="${1}"
|
|
|
|
# Perform AXFR lookup
|
|
res="$("${LIB_DIR:?}/ns_lookup_rxfr")" || exit 4
|
|
|
|
# This should read from stdin
|
|
# TODO: Run this loop in parallel
|
|
while IFS= read -r line; do
|
|
pubkey="$(<<<"${line}" cut -d ' ' -f1)"
|
|
ips="$(<<<"${line}" cut -d ' ' -f2 | tr ' ' '\n')"
|
|
ipv4="$(<<<"${ips}" grep '\.')"
|
|
ipv6="$(<<<"${ips}" grep ':')"
|
|
ipv4="${ipv4%%/*}"
|
|
ipv6="${ipv6%%/*}"
|
|
domain=$(<<<"${res}" grep -B1 " ${ipv4}$" | sed '/--/d' | awk '{print $2}' | paste -d " " - - | awk '{print $1}')
|
|
case "${format}" in
|
|
'json') printf '{"domain":"%s","ipv4":"%s","ipv6":"%s","pubkey":"%s"},' \
|
|
"${domain}" "${ipv4}" "${ipv6}" "${pubkey}";;
|
|
'tsv') printf '%s\t%s\t%s\t%s\n' "${domain}" "${ipv4}" "${ipv6}" "${pubkey}";;
|
|
*) printf 'ERROR! Invalid format for %s: %s\n' "${0}" "${format}" >>"${LOGFILE}"
|
|
exit 5;
|
|
esac
|
|
done | sed 's/\n//g' | sed 's/,$//' # Remove trailing comma and newlines
|