packages: clean up the package folder
[openwrt/staging/yousong.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