#!/bin/sh next_port () { local port_start=$1 local port_end=$2 ports=$(wg show all listen-port | awk '{print $2}') for i in $(seq "$port_start" "$port_end"); do if ! echo "$ports" | grep -q "$i"; then echo "$i" return fi done } cleanup_wginterfaces() { check_wg_neighbors } delete_wg_interface() { ip link del dev "$1" [ -f "/tmp/run/wgserver/$1.key" ] && rm "/tmp/run/wgserver/$1.key" [ -f "/tmp/run/wgserver/$1.pub" ] && rm "/tmp/run/wgserver/$1.pub" } check_wg_neighbors() { wg_interfaces=$(ip link | grep wg | awk '{print $2}' | sed 's/://') for phy in $wg_interfaces; do linklocal=$(ip -6 addr list dev "$phy" | grep "scope link" | awk '{print $2}' | sed 's/\/64//') 2>/dev/null ips=$(ping ff02::1%"$phy" -w5 -W5 -c10 | awk '/from/{print($4)}' | sed 's/.$//') 2>/dev/null delete=1 for ip in $ips; do if [ "$ip" != "$linklocal" ] && [ "$(owipcalc $ip linklocal)" -eq 1 ]; then delete=0 break fi done if [ $delete -eq 1 ]; then delete_wg_interface "$phy" fi done } case $1 in next_port|\ cleanup_wginterfaces) "$@" exit ;; esac