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