aboutsummaryrefslogtreecommitdiffstats
path: root/package/network/services/unetd/files/unetd.sh
blob: 70a28f64826c8de8da4d6e48eb6dac4e33039e31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#!/bin/sh

[ -x /usr/sbin/unetd ] || exit 0

. /lib/functions.sh
. /lib/functions/network.sh
. ../netifd-proto.sh

init_proto "$@"

proto_unet_init_config() {
	proto_config_add_string device
	proto_config_add_string type
	proto_config_add_string auth_key
	proto_config_add_string key
	proto_config_add_string file
	proto_config_add_int keepalive
	proto_config_add_string domain
	proto_config_add_array "tunnels:list(string)"
	proto_config_add_array "connect:list(string)"
	proto_config_add_array "peer_data:list(string)"
	no_device=1
	available=1
	no_proto_task=1
}

proto_unet_setup() {
	local config="$1"

	local device type key file keepalive domain tunnels
	json_get_vars device type auth_key key file keepalive domain
	json_get_values tunnels tunnels
	json_get_values connect connect
	json_get_values peer_data peer_data
	device="${device:-$config}"

	[ -n "$auth_key" ] && type="${type:-dynamic}"
	[ -n "$file" ] && type="${type:-file}"

	json_init
	json_add_string name "$device"
	json_add_string type "$type"
	json_add_string interface "$config"
	json_add_string auth_key "$auth_key"
	json_add_string key "$key"
	json_add_string file "$file"
	[ -n "$keepalive" ] && json_add_int keepalive "$keepalive"
	json_add_string domain "$domain"

	json_add_object tunnels
	for t in $tunnels; do
		local ifname="${t%%=*}"
		local service="${t#*=}"
		[ -n "$ifname" -a -n "$service" -a "$ifname" != "$t" ] || continue
		json_add_string "$ifname" "$service"
	done
	json_close_object

	json_add_array auth_connect
	for c in $connect; do
		json_add_string "" "$c"
	done
	json_close_array

	json_add_array peer_data
	for c in $peer_data; do
		json_add_string "" "$c"
	done
	json_close_array

	ip link del dev "$device" >/dev/null 2>&1
	ip link add dev "$device" type wireguard || {
		echo "Could not create wireguard device $device"
		proto_setup_failed "$config"
		exit 1
	}

	ubus call unetd network_add "$(json_dump)"
}

proto_unet_teardown() {
	local config="$1"
	local iface="$2"

	local device
	json_get_vars device
	device="${device:-$iface}"

	json_init
	json_add_string name "$device"

	ip link del dev "$device"

	ubus call unetd network_del "$(json_dump)"
}

add_protocol unet