c50d776a6b0f4fa7d8a036709a0a9dcfc1e0a074
[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 "$1_teardown \"$interface\" \"$ifname\""
32 }
33
34 _proto_do_setup() {
35         json_load "$data"
36         eval "$1_setup \"$interface\" \"$ifname\""
37 }
38
39 proto_init_update() {
40         local ifname="$1"
41         local up="$2"
42         local external="$3"
43
44         PROTO_INIT=1
45         PROTO_IPADDR=
46         PROTO_IP6ADDR=
47         PROTO_ROUTE=
48         PROTO_ROUTE6=
49         json_init
50         json_add_int action 0
51         json_add_string "ifname" "$ifname"
52         json_add_boolean "link-up" "$up"
53         [ -n "$3" ] && json_add_boolean "address-external" "$external"
54 }
55
56 proto_add_ipv4_address() {
57         local address="$1"
58         local mask="$2"
59
60         jshn_append PROTO_IPADDR "$address/$mask"
61 }
62
63 proto_add_ipv6_address() {
64         local address="$1"
65         local mask="$2"
66
67         jshn_append PROTO_IP6ADDR "$address/$mask"
68 }
69
70 proto_add_ipv4_route() {
71         local target="$1"
72         local mask="$2"
73         local gw="$3"
74
75         jshn_append PROTO_ROUTE "$target/$mask/$gw"
76 }
77
78 proto_add_ipv6_route() {
79         local target="$1"
80         local mask="$2"
81         local gw="$3"
82
83         jshn_append PROTO_ROUTE6 "$target/$mask/$gw"
84 }
85
86 _proto_push_ip() {
87         json_add_string "" "$1"
88 }
89
90 _proto_push_route() {
91         local str="$1";
92         local target="${str%%/*}"
93         str="${str#*/}"
94         local mask="${str%%/*}"
95         local gw="${str#*/}"
96
97         json_add_table ""
98         json_add_string target "$target"
99         json_add_integer mask "$mask"
100         json_add_string gateway "$gw"
101         json_close_table
102 }
103
104 _proto_push_array() {
105         local name="$1"
106         local val="$2"
107         local cb="$3"
108
109         [ -n "$val" ] || return 0
110         json_add_array "$name"
111         for item in $val; do
112                 eval "$cb \"\$item\""
113         done
114         json_close_array
115 }
116
117 _proto_notify() {
118         ubus call network.interface."$interface" notify_proto "$(json_dump)"
119 }
120
121 proto_send_update() {
122         local interface="$1"
123
124         _proto_push_array "ipaddr" "$PROTO_IPADDR" _proto_push_ip
125         _proto_push_array "ip6addr" "$PROTO_IP6ADDR" _proto_push_ip
126         _proto_push_array "route" "$PROTO_ROUTE" _proto_push_route
127         _proto_push_array "route6" "$PROTO_ROUTE6" _proto_push_route
128         _proto_notify
129 }
130
131 proto_run_command() {
132         json_init
133         json_add_int action 1
134         json_add_array command
135         while [ $# -gt 0 ]; do
136                 json_add_string "" "$1"
137                 shift
138         done
139         _proto_notify
140 }
141
142 init_proto() {
143         proto="$1"; shift
144         cmd="$1"; shift
145
146         case "$cmd" in
147                 dump)
148                         add_protocol() {
149                                 no_device=0
150                                 available=0
151
152                                 add_default_handler "$1_init_config"
153
154                                 json_init
155                                 json_add_string "name" "$1"
156                                 eval "$1_init"
157                                 json_add_boolean no-device "$no_device"
158                                 json_add_boolean available "$available"
159                                 json_add_array "config"
160                                 eval "$1_init_config"
161                                 json_close_array
162                                 json_dump
163                         }
164                 ;;
165                 setup|teardown)
166                         interface="$1"; shift
167                         data="$1"; shift
168                         ifname="$1"; shift
169
170                         add_protocol() {
171                                 [[ "$proto" == "$1" ]] || return 0
172
173                                 case "$cmd" in
174                                         setup) _proto_do_setup "$1";;
175                                         teardown) _proto_do_teardown "$1" ;;
176                                         *) return 1 ;;
177                                 esac
178                         }
179                 ;;
180         esac
181 }