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