2a6a393e5676947b16000a14404212e2f666f2dd
[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 _EXPORT_VAR=0
37 _EXPORT_VARS=
38 eval "$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_IPADDR=
48 PROTO_IP6ADDR=
49 PROTO_ROUTE=
50 PROTO_ROUTE6=
51 json_init
52 json_add_int action 0
53 [ -n "$ifname" -a "*" != "$ifname" ] && json_add_string "ifname" "$ifname"
54 json_add_boolean "link-up" "$up"
55 [ -n "$3" ] && json_add_boolean "address-external" "$external"
56 }
57
58 proto_add_dns_server() {
59 local address="$1"
60
61 jshn_append PROTO_DNS "$address"
62 }
63
64 proto_add_dns_search() {
65 local address="$1"
66
67 jshn_append PROTO_DNS_SEARCH "$address"
68 }
69
70 proto_add_ipv4_address() {
71 local address="$1"
72 local mask="$2"
73
74 jshn_append PROTO_IPADDR "$address/$mask"
75 }
76
77 proto_add_ipv6_address() {
78 local address="$1"
79 local mask="$2"
80
81 jshn_append PROTO_IP6ADDR "$address/$mask"
82 }
83
84 proto_add_ipv4_route() {
85 local target="$1"
86 local mask="$2"
87 local gw="$3"
88
89 jshn_append PROTO_ROUTE "$target/$mask/$gw"
90 }
91
92 proto_add_ipv6_route() {
93 local target="$1"
94 local mask="$2"
95 local gw="$3"
96
97 jshn_append PROTO_ROUTE6 "$target/$mask/$gw"
98 }
99
100 _proto_push_ip() {
101 json_add_string "" "$1"
102 }
103
104 _proto_push_route() {
105 local str="$1";
106 local target="${str%%/*}"
107 str="${str#*/}"
108 local mask="${str%%/*}"
109 local gw="${str#*/}"
110
111 json_add_object ""
112 json_add_string target "$target"
113 json_add_string mask "$mask"
114 json_add_string gateway "$gw"
115 json_close_object
116 }
117
118 _proto_push_array() {
119 local name="$1"
120 local val="$2"
121 local cb="$3"
122
123 [ -n "$val" ] || return 0
124 json_add_array "$name"
125 for item in $val; do
126 eval "$cb \"\$item\""
127 done
128 json_close_array
129 }
130
131 _proto_notify() {
132 local interface="$1"
133 ubus call network.interface."$interface" notify_proto "$(json_dump)"
134 }
135
136 proto_send_update() {
137 local interface="$1"
138
139 _proto_push_array "ipaddr" "$PROTO_IPADDR" _proto_push_ip
140 _proto_push_array "ip6addr" "$PROTO_IP6ADDR" _proto_push_ip
141 _proto_push_array "routes" "$PROTO_ROUTE" _proto_push_route
142 _proto_push_array "routes6" "$PROTO_ROUTE6" _proto_push_route
143 _proto_push_array "dns" "$PROTO_DNS" _proto_push_ip
144 _proto_push_array "dns_search" "$PROTO_DNS_SEARCH" _proto_push_ip
145 _proto_notify "$interface"
146 }
147
148 proto_export() {
149 local var="VAR${_EXPORT_VAR}"
150 _EXPORT_VAR="$(($_EXPORT_VAR + 1))"
151 export -- "$var=$1"
152 jshn_append _EXPORT_VARS "$var"
153 }
154
155 proto_run_command() {
156 local interface="$1"; shift
157
158 json_init
159 json_add_int action 1
160 json_add_array command
161 while [ $# -gt 0 ]; do
162 json_add_string "" "$1"
163 shift
164 done
165 json_close_array
166 [ -n "$_EXPORT_VARS" ] && {
167 json_add_array env
168 for var in $_EXPORT_VARS; do
169 eval "json_add_string \"\" \"\${$var}\""
170 done
171 json_close_array
172 }
173 _proto_notify "$interface"
174 }
175
176 proto_kill_command() {
177 local interface="$1"; shift
178
179 json_init
180 json_add_int action 2
181 [ -n "$1" ] && json_add_int signal "$1"
182 _proto_notify "$interface"
183 }
184
185 init_proto() {
186 proto="$1"; shift
187 cmd="$1"; shift
188
189 case "$cmd" in
190 dump)
191 add_protocol() {
192 no_device=0
193 available=0
194
195 add_default_handler "$1_init_config"
196
197 json_init
198 json_add_string "name" "$1"
199 eval "$1_init"
200 json_add_boolean no-device "$no_device"
201 json_add_boolean available "$available"
202 json_add_array "config"
203 eval "$1_init_config"
204 json_close_array
205 json_dump
206 }
207 ;;
208 setup|teardown)
209 interface="$1"; shift
210 data="$1"; shift
211 ifname="$1"; shift
212
213 add_protocol() {
214 [[ "$proto" == "$1" ]] || return 0
215
216 case "$cmd" in
217 setup) _proto_do_setup "$1";;
218 teardown) _proto_do_teardown "$1" ;;
219 *) return 1 ;;
220 esac
221 }
222 ;;
223 esac
224 }