#!/bin/bash # FILE: admin/peer/list # DESCRIPTION: List peers for a user, or all peers # USAGE: list $remote_ip $querystring # QUERYSTRING: ?un=$username source /etc/wagon/config ip="${1}"; qs="$(<<<"${2}" tr '&' '\n' | sed 's/?//')" un="$(<<<"${qs}" grep -oP 'un=(.*)' | sed 's/^un=//' | xargs)" printf 'Admin %s requested peer listing...\n' "${ip}" >&2 # Create token if needed token="$(grep "${ip}" /var/local/wagon/tokens | cut -f2)" if [ "${token}" == "" ]; then printf 'Creating token for %s...\n' "${ip}" >&2 token="$(>/var/local/wagon/tokens fi # Get peer IP list if ! peers="$(sudo /usr/bin/wg show "${TLD}" allowed-ips)"; then printf 'ERROR! Wireguard failed!\n' >&2 /usr/lib/wagon/http_res 500; exit fi # Filter out single user (if provided) if [ "${un}" != '' ]; then peers="$(grep "${IPV4_NET%.*.*}\.${un}\." <<<"${peers}" 2>/dev/null)" if [ "${peers}" == '' ]; then printf 'User number %s not found!\n' "${un}" >&2 printf 'User not found!\n' | /usr/lib/wagon/http_res 404; exit fi fi # Get domains for each peer if peers="[$(/usr/lib/wagon/ips_to_peers json <<<"${peers}")]"; then printf '{"token":"%s","peers":%s}' "${token:?}" "${peers:?}" | /usr/lib/wagon/http_res 200 'application/json' printf 'Sent peers to admin %s\n' "${ip}" >&2 else printf 'ERROR: Failed to lookup user domain: %s\n' "${ip}" >&2 /usr/lib/wagon/http_res 500; exit fi