- #!/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
|