69aa27d4eda34b7eee940691f74f57d2559c008b
[project/netifd.git] / dummy / netifd-proto.sh
1 . /usr/share/libubox/jshn.sh
2
3 proto_config_add_generic() {
4 json_add_array ""
5 json_add_string "" "$1"
6 json_add_int "" "$2"
7 json_close_array
8 }
9
10 proto_config_add_int() {
11 proto_config_add_generic "$1" 5
12 }
13
14 proto_config_add_string() {
15 proto_config_add_generic "$1" 3
16 }
17
18 proto_config_add_boolean() {
19 proto_config_add_generic "$1" 7
20 }
21
22 add_default_handler() {
23 case "$(type $1 2>/dev/null)" in
24 *function*) return;;
25 *) eval "$1() { return; }"
26 esac
27 }
28
29 _proto_do_teardown() {
30 json_load "$data"
31 eval "proto_$1_teardown \"$interface\" \"$ifname\""
32 }
33
34 _proto_do_setup() {
35 json_load "$data"
36 _EXPORT_VAR=0
37 _EXPORT_VARS=
38 eval "proto_$1_setup \"$interface\" \"$ifname\""
39 }
40
41 proto_init_update() {
42 local ifname="$1"
43 local up="$2"
44 local external="$3"
45
46 PROTO_INIT=1
47 PROTO_TUNNEL_OPEN=
48 PROTO_IPADDR=
49 PROTO_IP6ADDR=
50 PROTO_ROUTE=
51 PROTO_ROUTE6=
52 PROTO_DNS=
53 PROTO_DNS_SEARCH=
54 json_init
55 json_add_int action 0
56 [ -n "$ifname" -a "*" != "$ifname" ] && json_add_string "ifname" "$ifname"
57 json_add_boolean "link-up" "$up"
58 [ -n "$3" ] && json_add_boolean "address-external" "$external"
59 }
60
61 proto_add_tunnel() {
62 proto_close_tunnel
63
64 PROTO_TUNNEL_OPEN=1
65 json_add_object "tunnel"
66 }
67
68 proto_close_tunnel() {
69 [ -n "$PROTO_TUNNEL_OPEN" ] || return
70 json_close_object
71 PROTO_TUNNEL_OPEN=
72 }
73
74 proto_add_dns_server() {
75 local address="$1"
76
77 jshn_append PROTO_DNS "$address"
78 }
79
80 proto_add_dns_search() {
81 local address="$1"
82
83 jshn_append PROTO_DNS_SEARCH "$address"
84 }
85
86 proto_add_ipv4_address() {
87 local address="$1"
88 local mask="$2"
89
90 jshn_append PROTO_IPADDR "$address/$mask"
91 }
92
93 proto_add_ipv6_address() {
94 local address="$1"
95 local mask="$2"
96
97 jshn_append PROTO_IP6ADDR "$address/$mask"
98 }
99
100 proto_add_ipv4_route() {
101 local target="$1"
102 local mask="$2"
103 local gw="$3"
104
105 jshn_append PROTO_ROUTE "$target/$mask/$gw"
106 }
107
108 proto_add_ipv6_route() {
109 local target="$1"
110 local mask="$2"
111 local gw="$3"
112
113 jshn_append PROTO_ROUTE6 "$target/$mask/$gw"
114 }
115
116 _proto_push_ip() {
117 json_add_string "" "$1"
118 }
119
120 _proto_push_route() {
121 local str="$1";
122 local target="${str%%/*}"
123 str="${str#*/}"
124 local mask="${str%%/*}"
125 local gw="${str#*/}"
126
127 json_add_object ""
128 json_add_string target "$target"
129 json_add_string netmask "$mask"
130 json_add_string gateway "$gw"
131 json_close_object
132 }
133
134 _proto_push_array() {
135 local name="$1"
136 local val="$2"
137 local cb="$3"
138
139 [ -n "$val" ] || return 0
140 json_add_array "$name"
141 for item in $val; do
142 eval "$cb \"\$item\""
143 done
144 json_close_array
145 }
146
147 _proto_notify() {
148 local interface="$1"
149 ubus call network.interface."$interface" notify_proto "$(json_dump)"
150 }
151
152 proto_send_update() {
153 local interface="$1"
154
155 proto_close_tunnel
156 _proto_push_array "ipaddr" "$PROTO_IPADDR" _proto_push_ip
157 _proto_push_array "ip6addr" "$PROTO_IP6ADDR" _proto_push_ip
158 _proto_push_array "routes" "$PROTO_ROUTE" _proto_push_route
159 _proto_push_array "routes6" "$PROTO_ROUTE6" _proto_push_route
160 _proto_push_array "dns" "$PROTO_DNS" _proto_push_ip
161 _proto_push_array "dns_search" "$PROTO_DNS_SEARCH" _proto_push_ip
162 _proto_notify "$interface"
163 }
164
165 proto_export() {
166 local var="VAR${_EXPORT_VAR}"
167 _EXPORT_VAR="$(($_EXPORT_VAR + 1))"
168 export -- "$var=$1"
169 jshn_append _EXPORT_VARS "$var"
170 }
171
172 proto_run_command() {
173 local interface="$1"; shift
174
175 json_init
176 json_add_int action 1
177 json_add_array command
178 while [ $# -gt 0 ]; do
179 json_add_string "" "$1"
180 shift
181 done
182 json_close_array
183 [ -n "$_EXPORT_VARS" ] && {
184 json_add_array env
185 for var in $_EXPORT_VARS; do
186 eval "json_add_string \"\" \"\${$var}\""
187 done
188 json_close_array
189 }
190 _proto_notify "$interface"
191 }
192
193 proto_kill_command() {
194 local interface="$1"; shift
195
196 json_init
197 json_add_int action 2
198 [ -n "$1" ] && json_add_int signal "$1"
199 _proto_notify "$interface"
200 }
201
202 proto_notify_error() {
203 local interface="$1"; shift
204
205 json_init
206 json_add_int action 3
207 json_add_array error
208 while [ $# -gt 0 ]; do
209 json_add_string "" "$1"
210 shift
211 done
212 json_close_array
213 _proto_notify "$interface"
214 }
215
216 proto_block_restart() {
217 local interface="$1"; shift
218
219 json_init
220 json_add_int action 4
221 _proto_notify "$interface"
222 }
223
224 proto_set_available() {
225 local interface="$1"
226 local state="$2"
227 json_init
228 json_add_int action 5
229 json_add_boolean available "$state"
230 _proto_notify "$interface"
231 }
232
233 init_proto() {
234 proto="$1"; shift
235 cmd="$1"; shift
236
237 case "$cmd" in
238 dump)
239 add_protocol() {
240 no_device=0
241 available=0
242
243 add_default_handler "proto_$1_init_config"
244
245 json_init
246 json_add_string "name" "$1"
247 json_add_array "config"
248 eval "proto_$1_init_config"
249 json_close_array
250 json_add_boolean no-device "$no_device"
251 json_add_boolean available "$available"
252 json_dump
253 }
254 ;;
255 setup|teardown)
256 interface="$1"; shift
257 data="$1"; shift
258 ifname="$1"; shift
259
260 add_protocol() {
261 [[ "$proto" == "$1" ]] || return 0
262
263 case "$cmd" in
264 setup) _proto_do_setup "$1";;
265 teardown) _proto_do_teardown "$1" ;;
266 *) return 1 ;;
267 esac
268 }
269 ;;
270 esac
271 }