• source navigation  • diff markup  • identifier search  • freetext search  • 

Sources/netifd/scripts/netifd-proto.sh

  1 NETIFD_MAIN_DIR="${NETIFD_MAIN_DIR:-/lib/netifd}"
  2 PROTO_DEFAULT_OPTIONS="defaultroute peerdns metric"
  3 if [ -f /usr/share/libubox/jshn.sh ]; then
  4         . /usr/share/libubox/jshn.sh
  5 else
  6         . /usr/local/share/libubox/jshn.sh
  7 fi
  8 . $NETIFD_MAIN_DIR/utils.sh
  9 
 10 proto_config_add_int() {
 11         config_add_int "$@"
 12 }
 13 
 14 proto_config_add_string() {
 15         config_add_string "$@"
 16 }
 17 
 18 proto_config_add_boolean() {
 19         config_add_boolean "$@"
 20 }
 21 
 22 proto_config_add_array() {
 23         config_add_array "$@"
 24 }
 25 
 26 proto_config_add_defaults() {
 27         proto_config_add_boolean "defaultroute"
 28         proto_config_add_boolean "peerdns"
 29         proto_config_add_boolean "renew"
 30         proto_config_add_int "metric"
 31 }
 32 
 33 proto_add_dynamic_defaults() {
 34         [ -n "$defaultroute" ] && json_add_boolean defaultroute "$defaultroute"
 35         [ -n "$peerdns" ] && json_add_boolean peerdns "$peerdns"
 36         [ -n "$metric" ] && json_add_int metric "$metric"
 37 }
 38 
 39 _proto_do_teardown() {
 40         json_load "$data"
 41         eval "proto_$1_teardown \"$interface\" \"$ifname\""
 42 }
 43 
 44 _proto_do_renew() {
 45         json_load "$data"
 46         eval "proto_$1_renew \"$interface\" \"$ifname\""
 47 }
 48 
 49 _proto_do_restart() {
 50         json_load "$data"
 51         eval "proto_$1_restart \"$interface\" \"$ifname\""
 52 }
 53 
 54 _proto_do_setup() {
 55         json_load "$data"
 56         _EXPORT_VAR=0
 57         _EXPORT_VARS=
 58         eval "proto_$1_setup \"$interface\" \"$ifname\""
 59 }
 60 
 61 proto_init_update() {
 62         local ifname="$1"
 63         local up="$2"
 64         local external="$3"
 65 
 66         PROTO_KEEP=0
 67         PROTO_INIT=1
 68         PROTO_TUNNEL_OPEN=
 69         PROTO_IPADDR=
 70         PROTO_IP6ADDR=
 71         PROTO_ROUTE=
 72         PROTO_ROUTE6=
 73         PROTO_PREFIX6=
 74         PROTO_DNS=
 75         PROTO_DNS_SEARCH=
 76         PROTO_NEIGHBOR=
 77         PROTO_NEIGHBOR6=
 78         json_init
 79         json_add_int action 0
 80         [ -n "$ifname" -a "*" != "$ifname" ] && json_add_string "ifname" "$ifname"
 81         json_add_boolean "link-up" "$up"
 82         [ -n "$3" ] && json_add_boolean "address-external" "$external"
 83 }
 84 
 85 proto_set_keep() {
 86         PROTO_KEEP="$1"
 87 }
 88 
 89 proto_close_nested() {
 90         [ -n "$PROTO_NESTED_OPEN" ] && json_close_object
 91         PROTO_NESTED_OPEN=
 92 }
 93 
 94 proto_add_nested() {
 95         PROTO_NESTED_OPEN=1
 96         json_add_object "$1"
 97 }
 98 
 99 proto_add_tunnel() {
100         proto_add_nested "tunnel"
101 }
102 
103 proto_close_tunnel() {
104         proto_close_nested
105 }
106 
107 proto_add_data() {
108         proto_add_nested "data"
109 }
110 
111 proto_close_data() {
112         proto_close_nested
113 }
114 
115 proto_add_dns_server() {
116         local address="$1"
117 
118         append PROTO_DNS "$address"
119 }
120 
121 proto_add_dns_search() {
122         local address="$1"
123 
124         append PROTO_DNS_SEARCH "$address"
125 }
126 
127 proto_add_ipv4_address() {
128         local address="$1"
129         local mask="$2"
130         local broadcast="$3"
131         local ptp="$4"
132 
133         append PROTO_IPADDR "$address/$mask/$broadcast/$ptp"
134 }
135 
136 proto_add_ipv6_address() {
137         local address="$1"
138         local mask="$2"
139         local preferred="$3"
140         local valid="$4"
141         local offlink="$5"
142         local class="$6"
143 
144         append PROTO_IP6ADDR "$address/$mask/$preferred/$valid/$offlink/$class"
145 }
146 
147 proto_add_ipv4_neighbor(){
148         local address="$1"
149         local mac="$2"
150         local proxy="$3"
151 
152         append PROTO_NEIGHBOR "$address/$mac/$proxy"
153 }
154 
155 proto_add_ipv6_neighbor(){
156         local address="$1"
157         local mac="$2"
158         local proxy="$3"
159         local router="$4"
160 
161         append PROTO_NEIGHBOR6 "$address/$mac/$proxy/$router"
162 }
163 
164 proto_add_ipv4_route() {
165         local target="$1"
166         local mask="$2"
167         local gw="$3"
168         local source="$4"
169         local metric="$5"
170 
171         append PROTO_ROUTE "$target/$mask/$gw/$metric///$source"
172 }
173 
174 proto_add_ipv6_route() {
175         local target="$1"
176         local mask="$2"
177         local gw="$3"
178         local metric="$4"
179         local valid="$5"
180         local source="$6"
181         local table="$7"
182 
183         append PROTO_ROUTE6 "$target/$mask/$gw/$metric/$valid/$table/$source"
184 }
185 
186 proto_add_ipv6_prefix() {
187         local prefix="$1"
188         local valid="$2"
189         local preferred="$3"
190 
191         if [ -z "$valid" ]; then
192                 append PROTO_PREFIX6 "$prefix"
193         else
194                 [ -z "$preferred" ] && preferred="$valid"
195                 append PROTO_PREFIX6 "$prefix,$valid,$preferred"
196         fi
197 }
198 
199 _proto_push_ipv4_addr() {
200         local str="$1"
201         local address mask broadcast ptp
202 
203         address="${str%%/*}"
204         str="${str#*/}"
205         mask="${str%%/*}"
206         str="${str#*/}"
207         broadcast="${str%%/*}"
208         str="${str#*/}"
209         ptp="$str"
210 
211         json_add_object ""
212         json_add_string ipaddr "$address"
213         [ -n "$mask" ] && json_add_string mask "$mask"
214         [ -n "$broadcast" ] && json_add_string broadcast "$broadcast"
215         [ -n "$ptp" ] && json_add_string ptp "$ptp"
216         json_close_object
217 }
218 
219 _proto_push_ipv6_addr() {
220         local str="$1"
221         local address mask preferred valid offlink
222 
223         address="${str%%/*}"
224         str="${str#*/}"
225         mask="${str%%/*}"
226         str="${str#*/}"
227         preferred="${str%%/*}"
228         str="${str#*/}"
229         valid="${str%%/*}"
230         str="${str#*/}"
231         offlink="${str%%/*}"
232         str="${str#*/}"
233         class="${str%%/*}"
234 
235         json_add_object ""
236         json_add_string ipaddr "$address"
237         [ -n "$mask" ] && json_add_string mask "$mask"
238         [ -n "$preferred" ] && json_add_int preferred "$preferred"
239         [ -n "$valid" ] && json_add_int valid "$valid"
240         [ -n "$offlink" ] && json_add_boolean offlink "$offlink"
241         [ -n "$class" ] && json_add_string class "$class"
242         json_close_object
243 }
244 
245 _proto_push_string() {
246         json_add_string "" "$1"
247 }
248 
249 _proto_push_ipv4_neighbor(){
250         local str="$1"
251         local address mac proxy
252 
253         address="${str%%/*}"
254         str="${str#*/}"
255         mac="${str%%/*}"
256         str="${str#*/}"
257         proxy="${str%%/*}"
258 
259         json_add_object ""
260         json_add_string ipaddr "$address"
261         [ -n "$mac" ] && json_add_string mac "$mac"
262         [ -n "$proxy" ] && json_add_boolean proxy "$proxy"
263         json_close_object
264 }
265 
266 _proto_push_ipv6_neighbor(){
267         local str="$1"
268         local address mac proxy router
269 
270         address="${str%%/*}"
271         str="${str#*/}"
272         mac="${str%%/*}"
273         str="${str#*/}"
274         proxy="${str%%/*}"
275         str="${str#*/}"
276         router="${str%%/*}"
277 
278         json_add_object ""
279         json_add_string ipaddr "$address"
280         [ -n "$mac" ] && json_add_string mac "$mac"
281         [ -n "$proxy" ] && json_add_boolean proxy "$proxy"
282         [ -n "$router" ] && json_add_boolean router "$router"
283         json_close_object
284 }
285 
286 _proto_push_route() {
287         local str="$1";
288         local target="${str%%/*}"
289         str="${str#*/}"
290         local mask="${str%%/*}"
291         str="${str#*/}"
292         local gw="${str%%/*}"
293         str="${str#*/}"
294         local metric="${str%%/*}"
295         str="${str#*/}"
296         local valid="${str%%/*}"
297         str="${str#*/}"
298         local table="${str%%/*}"
299         str="${str#*/}"
300         local source="${str}"
301 
302         json_add_object ""
303         json_add_string target "$target"
304         json_add_string netmask "$mask"
305         [ -n "$gw" ] && json_add_string gateway "$gw"
306         [ -n "$metric" ] && json_add_int metric "$metric"
307         [ -n "$valid" ] && json_add_int valid "$valid"
308         [ -n "$source" ] && json_add_string source "$source"
309         [ -n "$table" ] && json_add_string table "$table"
310         json_close_object
311 }
312 
313 _proto_push_array() {
314         local name="$1"
315         local val="$2"
316         local cb="$3"
317 
318         [ -n "$val" ] || return 0
319         json_add_array "$name"
320         for item in $val; do
321                 eval "$cb \"\$item\""
322         done
323         json_close_array
324 }
325 
326 _proto_notify() {
327         local interface="$1"
328         local options="$2"
329         json_add_string "interface" "$interface"
330         ubus $options call network.interface notify_proto "$(json_dump)"
331 }
332 
333 proto_send_update() {
334         local interface="$1"
335 
336         proto_close_nested
337         json_add_boolean keep "$PROTO_KEEP"
338         _proto_push_array "ipaddr" "$PROTO_IPADDR" _proto_push_ipv4_addr
339         _proto_push_array "ip6addr" "$PROTO_IP6ADDR" _proto_push_ipv6_addr
340         _proto_push_array "routes" "$PROTO_ROUTE" _proto_push_route
341         _proto_push_array "routes6" "$PROTO_ROUTE6" _proto_push_route
342         _proto_push_array "ip6prefix" "$PROTO_PREFIX6" _proto_push_string
343         _proto_push_array "dns" "$PROTO_DNS" _proto_push_string
344         _proto_push_array "dns_search" "$PROTO_DNS_SEARCH" _proto_push_string
345         _proto_push_array "neighbor" "$PROTO_NEIGHBOR" _proto_push_ipv4_neighbor
346         _proto_push_array "neighbor6" "$PROTO_NEIGHBOR6" _proto_push_ipv6_neighbor
347         _proto_notify "$interface"
348 }
349 
350 proto_export() {
351         local var="VAR${_EXPORT_VAR}"
352         _EXPORT_VAR="$(($_EXPORT_VAR + 1))"
353         export -- "$var=$1"
354         append _EXPORT_VARS "$var"
355 }
356 
357 proto_run_command() {
358         local interface="$1"; shift
359 
360         json_init
361         json_add_int action 1
362         json_add_array command
363         while [ $# -gt 0 ]; do
364                 json_add_string "" "$1"
365                 shift
366         done
367         json_close_array
368         [ -n "$_EXPORT_VARS" ] && {
369                 json_add_array env
370                 for var in $_EXPORT_VARS; do
371                         eval "json_add_string \"\" \"\${$var}\""
372                 done
373                 json_close_array
374         }
375         _proto_notify "$interface"
376 }
377 
378 proto_kill_command() {
379         local interface="$1"; shift
380 
381         json_init
382         json_add_int action 2
383         [ -n "$1" ] && json_add_int signal "$1"
384         _proto_notify "$interface"
385 }
386 
387 proto_notify_error() {
388         local interface="$1"; shift
389 
390         json_init
391         json_add_int action 3
392         json_add_array error
393         while [ $# -gt 0 ]; do
394                 json_add_string "" "$1"
395                 shift
396         done
397         json_close_array
398         _proto_notify "$interface"
399 }
400 
401 proto_block_restart() {
402         local interface="$1"; shift
403 
404         json_init
405         json_add_int action 4
406         _proto_notify "$interface"
407 }
408 
409 proto_set_available() {
410         local interface="$1"
411         local state="$2"
412         json_init
413         json_add_int action 5
414         json_add_boolean available "$state"
415         _proto_notify "$interface"
416 }
417 
418 proto_add_host_dependency() {
419         local interface="$1"
420         local host="$2"
421         local ifname="$3"
422 
423         # execute in subshell to not taint callers env
424         # see tickets #11046, #11545, #11570
425         (
426                 json_init
427                 json_add_int action 6
428                 json_add_string host "$host"
429                 [ -n "$ifname" ] && json_add_string ifname "$ifname"
430                 _proto_notify "$interface" -S
431         )
432 }
433 
434 proto_setup_failed() {
435         local interface="$1"
436         json_init
437         json_add_int action 7
438         _proto_notify "$interface"
439 }
440 
441 init_proto() {
442         proto="$1"; shift
443         cmd="$1"; shift
444 
445         case "$cmd" in
446                 dump)
447                         add_protocol() {
448                                 no_device=0
449                                 no_device_config=0
450                                 no_proto_task=0
451                                 available=0
452                                 renew_handler=0
453                                 restart_handler=0
454                                 type "proto_$1_restart" >/dev/null 2>&1 && restart_handler=1
455                                 teardown_on_l3_link_down=0
456 
457                                 add_default_handler "proto_$1_init_config"
458 
459                                 json_init
460                                 json_add_string "name" "$1"
461                                 json_add_array "config"
462                                 eval "proto_$1_init_config"
463                                 json_close_array
464                                 json_add_boolean no-device "$no_device"
465                                 json_add_boolean no-device-config "$no_device_config"
466                                 json_add_boolean no-proto-task "$no_proto_task"
467                                 json_add_boolean available "$available"
468                                 json_add_boolean renew-handler "$renew_handler"
469                                 json_add_boolean restart-handler "$restart_handler"
470                                 json_add_boolean lasterror "$lasterror"
471                                 json_add_boolean teardown-on-l3-link-down "$teardown_on_l3_link_down"
472                                 json_dump
473                         }
474                 ;;
475                 setup|teardown|renew|restart)
476                         interface="$1"; shift
477                         data="$1"; shift
478                         ifname="$1"; shift
479 
480                         add_protocol() {
481                                 [[ "$proto" == "$1" ]] || return 0
482 
483                                 case "$cmd" in
484                                         setup) _proto_do_setup "$1";;
485                                         teardown) _proto_do_teardown "$1" ;;
486                                         renew) _proto_do_renew "$1" ;;
487                                         restart) _proto_do_restart "$1" ;;
488                                         *) return 1 ;;
489                                 esac
490                         }
491                 ;;
492         esac
493 }

This page was automatically generated by LXR 0.3.1.  •  OpenWrt