packages: clean up the package folder
[openwrt.git] / package / system / procd / files / procd.sh
1 # procd API:
2 #
3 # procd_open_service(name, [script]):
4 #   Initialize a new procd command message containing a service with one or more instances
5 #
6 # procd_close_service()
7 #   Send the command message for the service
8 #
9 # procd_open_instance([name]):
10 #   Add an instance to the service described by the previous procd_open_service call
11 #
12 # procd_set_param(type, [value...])
13 #   Available types:
14 #     command: command line (array).
15 #     env: environment variable (passed to the process)
16 #     data: arbitrary name/value pairs for detecting config changes (table)
17 #     file: configuration files (array)
18 #     netdev: bound network device (detects ifindex changes)
19 #
20 #   No space separation is done for arrays/tables - use one function argument per command line argument
21 #
22 # procd_close_instance():
23 #   Complete the instance being prepared
24 #
25 # procd_kill(service, [instance]):
26 #   Kill a service instance (or all instances)
27 #
28
29 . $IPKG_INSTROOT/usr/share/libubox/jshn.sh
30
31 _PROCD_SERVICE=
32
33 _procd_call() {
34         local old_cb
35
36         json_set_namespace procd old_cb
37         "$@"
38         json_set_namespace $old_cb
39 }
40
41 _procd_wrapper() {
42         while [ -n "$1" ]; do
43                 eval "$1() { _procd_call _$1 \"\$@\"; }"
44                 shift
45         done
46 }
47
48 _procd_ubus_call() {
49         local cmd="$1"
50
51         ubus call service "$cmd" "$(json_dump)"
52         json_cleanup
53 }
54
55 _procd_open_service() {
56         local name="$1"
57         local script="$2"
58
59         _PROCD_SERVICE="$name"
60         _PROCD_INSTANCE_SEQ=0
61
62         json_init
63         json_add_string name "$name"
64         [ -n "$script" ] && json_add_string script "$script"
65         json_add_object instances
66 }
67
68 _procd_close_service() {
69         json_close_object
70         _procd_ubus_call set
71 }
72
73 _procd_add_array_data() {
74         while [ -n "$1" ]; do
75                 json_add_string "" "$1"
76                 shift
77         done
78 }
79
80 _procd_add_array() {
81         json_add_array "$1"
82         shift
83         _procd_add_array_data "$@"
84         json_close_array
85 }
86
87 _procd_add_table_data() {
88         while [ -n "$1" ]; do
89                 local var="${1%%=*}"
90                 local val="${1#*=}"
91                 [[ "$1" == "$val" ]] && val=
92                 json_add_string "$var" "$val"
93                 shift
94         done
95 }
96
97 _procd_add_table() {
98         json_add_object "$1"
99         shift
100         _procd_add_table_data "$@"
101         json_close_object
102 }
103
104 _procd_open_instance() {
105         local name="$1"; shift
106
107         _PROCD_INSTANCE_SEQ="$(($_PROCD_INSTANCE_SEQ + 1))"
108         name="${name:-instance$_PROCD_INSTANCE_SEQ}"
109         json_add_object "$name"
110 }
111
112 _procd_set_param() {
113         local type="$1"; shift
114
115         case "$type" in
116                 env|data)
117                         _procd_add_table "$type" "$@"
118                 ;;
119                 command|netdev|file)
120                         _procd_add_array "$type" "$@"
121                 ;;
122                 nice)
123                         json_add_int "$type" "$1"
124                 ;;
125         esac
126 }
127
128 _procd_append_param() {
129         local type="$1"; shift
130
131         json_select "$type"
132         case "$type" in
133                 env|data)
134                         _procd_add_table_data "$@"
135                 ;;
136                 command|netdev|file)
137                         _procd_add_array_data "$@"
138                 ;;
139         esac
140         json_select ..
141 }
142
143 _procd_close_instance() {
144         json_close_object
145 }
146
147 _procd_add_instance() {
148         _procd_open_instance
149         _procd_set_command "$@"
150         _procd_close_instance
151 }
152
153 _procd_kill() {
154         local service="$1"
155         local instance="$2"
156
157         json_init
158         [ -n "$service" ] && json_add_string service "$service"
159         [ -n "$instance" ] && json_add_string instance "$instance"
160         _procd_ubus_call delete
161 }
162
163 _procd_wrapper \
164         procd_open_service \
165         procd_close_service \
166         procd_add_instance \
167         procd_open_instance \
168         procd_close_instance \
169         procd_set_param \
170         procd_append_param \
171         procd_kill