fix interrupted read checks in log collection
[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 }