@@ -8,6 +8,7 @@ set -e -o pipefail
8
8
shopt -s extglob
9
9
export LC_ALL=C
10
10
11
+ exec 3>&2
11
12
SELF=" $( readlink -f " ${BASH_SOURCE[0]} " ) "
12
13
export PATH=" ${SELF%/* } :$PATH "
13
14
@@ -28,7 +29,7 @@ PROGRAM="${0##*/}"
28
29
ARGS=( " $@ " )
29
30
30
31
cmd () {
31
- echo " [#] $* " >&2
32
+ echo " [#] $* " >&3
32
33
" $@ "
33
34
}
34
35
@@ -91,34 +92,38 @@ get_real_interface() {
91
92
wg show interfaces > /dev/null
92
93
[[ -f " /var/run/wireguard/$INTERFACE .name" ]] || return 1
93
94
interface=" $( < " /var/run/wireguard/$INTERFACE .name" ) "
94
- [[ -n $interface && -S " /var/run/wireguard/$interface .sock" ]] || return 1
95
- diff=$(( $(stat - f % m "/ var/ run/ wireguard/ $interface .sock" 2 >/ dev/ null || echo 200 ) - $(stat - f % m "/ var/ run/ wireguard/ $INTERFACE .name" 2 >/ dev/ null || echo 100 ) ))
96
- [[ $diff -ge 2 || $diff -le -2 ]] && return 1
95
+ if [[ $interface != wg* ]]; then
96
+ [[ -n $interface && -S " /var/run/wireguard/$interface .sock" ]] || return 1
97
+ diff=$(( $(stat - f % m "/ var/ run/ wireguard/ $interface .sock" 2 >/ dev/ null || echo 200 ) - $(stat - f % m "/ var/ run/ wireguard/ $INTERFACE .name" 2 >/ dev/ null || echo 100 ) ))
98
+ [[ $diff -ge 2 || $diff -le -2 ]] && return 1
99
+ else
100
+ [[ " $( wg show interfaces) " == * " $interface " * ]] || return 1
101
+ fi
97
102
REAL_INTERFACE=" $interface "
98
103
echo " [+] Interface for $INTERFACE is $REAL_INTERFACE " >&2
99
104
return 0
100
105
}
101
106
102
107
add_if () {
103
- local index
104
- echo " find wg " | config -e /bsd 2> /dev/null | grep " wg count 1 " > /dev/null
105
- if [[ $? == 0 ]] ; then
106
- REAL_INTERFACE= " "
107
- index=0
108
- while [[ $REAL_INTERFACE == " " ]] ; do
109
- ifconfig wg $index create
110
- if [[ $? == 0 ]] ; then
111
- $REAL_INTERFACE = " wg $index "
112
- fi
113
- index= $(( index + 1 ))
114
- done
115
- echo " [+] Interface for $INTERFACE is $REAL_INTERFACE " >&2
116
- else
117
- export WG_TUN_NAME_FILE= " /var/run/wireguard/ $INTERFACE .name "
118
- mkdir -p " /var/run/wireguard/"
119
- cmd " ${WG_QUICK_USERSPACE_IMPLEMENTATION :- wireguard-go} " tun
120
- get_real_interface
121
- fi
108
+ local index=0 ret
109
+ while true ; do
110
+ if ret= " $( cmd ifconfig wg $index create 2>&1 ) " ; then
111
+ mkdir -p " /var/run/wireguard/ "
112
+ echo wg $ index > /var/run/wireguard/ $INTERFACE .name
113
+ get_real_interface
114
+ return 0
115
+ fi
116
+ if [[ $ret != * " ifconfig: SIOCIFCREATE: File exists " * ]] ; then
117
+ echo " [!] Missing WireGuard kernel support ( $ret ). Falling back to slow userspace implementation. " >&3
118
+ break
119
+ fi
120
+ echo " [+] wg $index in use, trying next "
121
+ (( ++ index ))
122
+ done
123
+ export WG_TUN_NAME_FILE= " /var/run/wireguard/$INTERFACE .name "
124
+ mkdir -p " /var/run/ wireguard/ "
125
+ cmd " ${WG_QUICK_USERSPACE_IMPLEMENTATION :- wireguard-go} " tun
126
+ get_real_interface
122
127
}
123
128
124
129
del_routes () {
@@ -148,7 +153,11 @@ del_routes() {
148
153
149
154
del_if () {
150
155
unset_dns
151
- [[ -z $REAL_INTERFACE ]] || cmd rm -f " /var/run/wireguard/$REAL_INTERFACE .sock"
156
+ if [[ -n $REAL_INTERFACE && $REAL_INTERFACE != wg* ]]; then
157
+ cmd rm -f " /var/run/wireguard/$REAL_INTERFACE .sock"
158
+ else
159
+ cmd ifconfig $REAL_INTERFACE destroy
160
+ fi
152
161
cmd rm -f " /var/run/wireguard/$INTERFACE .name"
153
162
}
154
163
0 commit comments