aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/contrib/examples/reresolve-dns/reresolve-dns.sh
blob: d63f5fa907042d534f8a7379417d1ee2f6f14839 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/bash
set -e
shopt -s nocasematch
shopt -s extglob
export LC_ALL=C

CONFIG_FILE="$1"
[[ $CONFIG_FILE =~ ^[a-zA-Z0-9_=+.-]{1,16}$ ]] && CONFIG_FILE="/etc/wireguard/$CONFIG_FILE.conf"
[[ $CONFIG_FILE =~ /?([a-zA-Z0-9_=+.-]{1,16})\.conf$ ]]
INTERFACE="${BASH_REMATCH[1]}"

process_peer() {
        [[ $PEER_SECTION -ne 1 || -z $PUBLIC_KEY || -z $ENDPOINT ]] && return 0
        [[ $(wg show "$INTERFACE" latest-handshakes) =~ ^${PUBLIC_KEY//+/\\+}\  ([0-9]+)$ ]] || return 0
        (( ($(date +%s) - ${BASH_REMATCH[1]}) > 135 )) || return 0
        wg set "$INTERFACE" peer "$PUBLIC_KEY" endpoint "$ENDPOINT"
        reset_peer_section
}

reset_peer_section() {
        PEER_SECTION=0
        PUBLIC_KEY=""
        ENDPOINT=""
}

reset_peer_section
while read -r line || [[ -n $line ]]; do
        key="${line%%=*}"; key="${key##*( )}"; key="${key%%*( )}"
        value="${line#*=}"; value="${value##*( )}"; value="${value%%*( )}"
        [[ $key == "["* ]] && { process_peer; reset_peer_section; }
        [[ $key == "[Peer]" ]] && PEER_SECTION=1
        if [[ $PEER_SECTION -eq 1 ]]; then
                case "$key" in
                PublicKey) PUBLIC_KEY="$value"; continue ;;
                Endpoint) ENDPOINT="$value"; continue ;;
                esac
        fi
done < "$CONFIG_FILE"
process_peer