#!/bin/sh
|
|
|
|
. /usr/share/wginstaller/rpcd_ubus.sh
|
|
. /usr/share/wginstaller/wg.sh
|
|
|
|
CMD=$1
|
|
shift
|
|
|
|
while true; do
|
|
case "$1" in
|
|
-h | --help)
|
|
echo "help"
|
|
shift 1
|
|
;;
|
|
-i | --ip)
|
|
IP=$2
|
|
shift 2
|
|
;;
|
|
--user)
|
|
USER=$2
|
|
shift 2
|
|
;;
|
|
--password)
|
|
PASSWORD=$2
|
|
shift 2
|
|
;;
|
|
--bandwidth)
|
|
BANDWIDTH=$2
|
|
shift 2
|
|
;;
|
|
--mtu)
|
|
WG_MTU=$2
|
|
shift 2
|
|
;;
|
|
'')
|
|
break
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
|
|
escape_ip () {
|
|
local gw_ip=$1
|
|
|
|
# ipv4 processing
|
|
ret_ip=$(echo $gw_ip | tr '.' '_')
|
|
|
|
# ipv6 processing
|
|
ret_ip=$(echo $ret_ip | tr ':' '_')
|
|
ret_ip=$(echo $ret_ip | cut -d '[' -f 2)
|
|
ret_ip=$(echo $ret_ip | cut -d ']' -f 1)
|
|
|
|
echo $ret_ip
|
|
}
|
|
|
|
register_client_interface () {
|
|
local pubkey=$1
|
|
local gw_ip=$2
|
|
local gw_port=$3
|
|
local endpoint=$4
|
|
local mtu_client=$5
|
|
|
|
gw_key=$(uci get wgclient.@client[0].wg_key)
|
|
interface_name="gw_$(escape_ip $endpoint)"
|
|
port_start=$(uci get wgclient.@client[0].port_start)
|
|
port_end=$(uci get wgclient.@client[0].port_end)
|
|
base_prefix=$(uci get wgclient.@client[0].base_prefix)
|
|
|
|
port=$(next_port $port_start $port_end)
|
|
ifname="wg_$port"
|
|
|
|
offset=$(($port - $port_start))
|
|
client_ip=$(owipcalc $base_prefix add $offset next 128)
|
|
client_ip_assign="${client_ip}/128"
|
|
|
|
echo "Installing Interface With:"
|
|
echo "Endpoint ${endpoint}"
|
|
echo "Client IP ${client_ip}"
|
|
echo "Port ${port}"
|
|
echo "Pubkey ${pubkey}"
|
|
|
|
ip link add dev $ifname type wireguard
|
|
|
|
ip -6 a a dev $ifname $client_ip
|
|
ip -6 a a dev $ifname fe80::2/64
|
|
wg set $ifname listen-port $port private-key $gw_key peer $pubkey allowed-ips ::/0 endpoint "${endpoint}:${gw_port}"
|
|
ip link set up dev $ifname
|
|
ip link set mtu $mtu_client dev $ifname # configure mtu here!
|
|
}
|
|
|
|
# rpc login
|
|
token="$(request_token $IP $USER $PASSWORD)"
|
|
if [ $? != 0 ]; then
|
|
echo "failed to register token"
|
|
exit 1
|
|
fi
|
|
|
|
# now call procedure
|
|
case $CMD in
|
|
"get_usage")
|
|
wg_rpcd_get_usage $token $IP
|
|
;;
|
|
"register")
|
|
gw_pub=$(uci get wgclient.@client[0].wg_pub)
|
|
gw_pub_string=$(cat $gw_pub)
|
|
register_output=$(wg_rpcd_register $token $IP $BANDWIDTH $WG_MTU $gw_pub_string)
|
|
if [ $? != 0 ]; then
|
|
echo "Failed to Register!"
|
|
exit 1
|
|
fi
|
|
pubkey=$(echo $register_output | awk '{print $2}')
|
|
ip_addr=$(echo $register_output | awk '{print $4}')
|
|
port=$(echo $register_output | awk '{print $6}')
|
|
client_ip=$(echo $register_output | awk '{print $8}')
|
|
register_client_interface $pubkey $ip_addr $port $IP $WG_MTU
|
|
;;
|
|
*) echo "Usage: wg-client-installer [cmd] --ip [2001::1] --user wginstaller --password wginstaller" ;;
|
|
esac
|