gluon/package/gluon-mesh-vpn-wireguard/files/usr/bin/wg-broker-client
2020-03-09 22:46:43 +01:00

62 lines
1.7 KiB
Bash
Executable File

#!/bin/sh
timeout=10
run_broker() {
local interface="$1"
local pubkey="$2"
local remote="$3"
local brokerport="$4"
local port
local interval=5
localtime=$(date +%s)
# sleeping on stdin keeps the sockets open in nc, allowing us to receive a
# reply. Unfortunately this means all requests take $timeout seconds even
# if the server is faster
peer_reply="$( { echo '{"version":1, "pubkey":"'"$pubkey"'"}'; sleep $timeout; } | gluon-wan timeout $timeout nc "$remote" "$brokerport" | tail -n1)"
if [[ "x$peer_reply" != "x" ]]; then
port=$(jsonfilter -s "$peer_reply" -e "@.port")
peer_time=$(jsonfilter -s "$peer_reply" -e "@.time")
difference=0
if [[ $peer_time -gt $localtime ]]; then
difference=$((peer_time - localtime))
else
difference=$((localtime - peer_time))
fi
if [[ "x$peer_time" != "x" && $difference -gt 240 ]]; then
# local clock differs a lot from the peer clock.
# assuming ntp is working only when a tunnel is established we need to
# set the clock to something in the proximity of the correct time.
# Let's assume peer_time for now. ntpd will handle the rest
formatted_time=$(date -d "@$peer_time" +%Y%m%d%H%M.%S)
date -s "$formatted_time" >/dev/null
fi
if [[ -z $port ]]; then
error=$(jsonfilter -s "$peer_reply" -e "@.error")
if [[ -n $error ]]; then
reason=$(jsonfilter -s "$peer_reply" -e "@.error.reason")
ecode=$(jsonfilter -s "$peer_reply" -e "@.error.code")
echo "received error [$ecode] from host $remote: $reason" >&2
if [[ "$ecode" == "1" ]]; then
echo FULL
return 1
fi
fi
fi
echo "$port"
return 0
else
echo "Received no reply from peer $remote" >&2
echo "ERROR"
return 255
fi
}
run_broker "$1" "$2" "$3" "$4"