@@ -8,6 +8,7 @@ set -e -o pipefail
88shopt  -s extglob
99export  LC_ALL=C
1010
11+ exec  3>&2 
1112SELF=" $( readlink -f " ${BASH_SOURCE[0]} " ) " 
1213export  PATH=" ${SELF%/* } :$PATH " 
1314
@@ -28,7 +29,7 @@ PROGRAM="${0##*/}"
2829ARGS=( " $@ " 
2930
3031cmd () {
31- 	echo  " [#] $* " >&2  
32+ 	echo  " [#] $* " >&3  
3233	" $@ " 
3334}
3435
@@ -91,34 +92,38 @@ get_real_interface() {
9192	wg show interfaces > /dev/null
9293	[[ -f  " /var/run/wireguard/$INTERFACE .name" ||  return  1
9394	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+ 		echo  " [+] Tun interface for $INTERFACE  is $interface " >&2 
100+ 	else 
101+ 		[[ "  $( wg show interfaces) " ==  * "  $interface  " *  ]] ||  return  1
102+ 	fi 
97103	REAL_INTERFACE=" $interface " 
98- 	echo  " [+] Interface for $INTERFACE  is $REAL_INTERFACE " >&2 
99104	return  0
100105}
101106
102107add_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 
122127}
123128
124129del_routes () {
@@ -148,7 +153,11 @@ del_routes() {
148153
149154del_if () {
150155	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 
152161	cmd rm -f " /var/run/wireguard/$INTERFACE .name" 
153162}
154163
0 commit comments