add shell functions for adding tunnel data in proto notify
[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 }