Merge pull request #18472 from sotux/master
[feed/packages.git] / net / nut / files / nut-server.init
1 #!/bin/sh /etc/rc.common
2 # Copyright © 2012 OpenWrt.org
3 #
4 # This is free software, licensed under the GNU General Public License v2.
5 # See /LICENSE for more information.
6 #
7 START=70
8 STOP=30
9
10 USERS_C=/var/etc/nut/upsd.users
11 UPSD_C=/var/etc/nut/upsd.conf
12 UPS_C=/var/etc/nut/ups.conf
13
14 USE_PROCD=1
15
16 get_write_driver_config() {
17 local cfg="$1"
18 local var="$2"
19 local def="$3"
20 local flag="$4"
21 local val
22
23 [ -z "$flag" ] && {
24 config_get val "$cfg" "$var" "$def"
25 [ -n "$val" ] && [ "$val" != "0" ] && echo "$var = $val" >>"$UPS_C"
26 }
27
28 [ -n "$flag" ] && {
29 config_get_bool val "$cfg" "$var" "$def"
30 [ "$val" = 1 ] && echo "$var" >>"$UPS_C"
31 }
32 }
33
34 upsd_statepath() {
35 local statepath
36
37 config_get statepath upsd statepath /var/run/nut
38 STATEPATH="$statepath"
39 }
40
41 upsd_runas() {
42 local runas
43
44 [ -n "$RUNAS" ] && return 0
45
46 config_get runas upsd runas nut
47 RUNAS="$runas"
48 }
49
50 listen_address() {
51 local cfg="$1"
52
53 config_get address "$cfg" address "::1"
54 config_get port "$cfg" port
55 echo "LISTEN $address $port" >>"$UPSD_C"
56 }
57
58 upsd_config() {
59 local cfg="$1"
60 local maxage maxconn certfile runas statepath
61
62 # Note runas support requires you make sure USB device file is readable by
63 # the runas user
64 config_get runas "$cfg" runas nut
65 RUNAS="$runas"
66
67 config_get statepath "$cfg" statepath /var/run/nut
68 STATEPATH="$statepath"
69
70 config_get maxage "$cfg" maxage
71 [ -n "$maxage" ] && echo "MAXAGE $maxage" >>"$UPSD_C"
72
73 [ -n "$statepath" ] && echo "STATEPATH $statepath" >>"$UPSD_C"
74
75 config_get maxconn "$cfg" maxconn
76 [ -n "$maxconn" ] && echo "MAXCONN $maxconn" >>"$UPSD_C"
77
78 #NOTE: certs only apply to SSL-enabled version
79 config_get certfile "$cfg" certfile
80 [ -n "$certfile" ] && echo "CERTFILE $certfile" >>"$UPSD_C"
81 }
82
83 nut_user_add() {
84 local cfg="$1"
85 local a
86 local val
87
88 config_get val "$cfg" username "$1"
89 echo "[$val]" >> "$USERS_C"
90
91 config_get val "$cfg" password
92 echo " password = $val" >> "$USERS_C"
93
94 config_get val "$cfg" actions
95 for a in $val; do
96 echo " actions = $a" >> "$USERS_C"
97 done
98
99 instcmd() {
100 local val="$1"
101 echo " instcmds = $val" >> "$USERS_C"
102 }
103
104 config_list_foreach "$cfg" instcmd instcmd
105
106 config_get val "$cfg" upsmon
107 if [ -n "$val" ]; then
108 echo " upsmon $val" >> "$USERS_C"
109 fi
110 }
111
112 build_server_config() {
113 mkdir -p "$(dirname "$UPSD_C")"
114 chmod 0640 "$UPS_C"
115 rm -f "$USERS_C"
116 rm -f "$UPSD_C"
117 rm -f /var/etc/nut/nut.conf
118
119 echo "# Config file automatically generated from UCI config" > "$USERS_C"
120 echo "# Config file automatically generated from UCI config" > "$UPSD_C"
121
122 config_foreach nut_user_add user
123 config_foreach listen_address listen_address
124 config_foreach upsd_config upsd
125 echo "MODE=netserver" >>/var/etc/nut/nut.conf
126
127 chmod 0640 "$USERS_C"
128 chmod 0640 "$UPSD_C"
129 chmod 0644 /var/etc/nut/nut.conf
130
131 [ -d "${STATEPATH}" ] || {
132 mkdir -p "${STATEPATH}"
133 chmod 0750 "${STATEPATH}"
134 }
135
136 if [ -n "$RUNAS" ]; then
137 chown "$RUNAS":"$(id -gn "$RUNAS")" "${STATEPATH}"
138 chgrp "$(id -gn "$RUNAS")" "$USERS_C"
139 chgrp "$(id -gn "$RUNAS")" "$UPSD_C"
140 fi
141 haveserver=1
142 }
143
144 build_driver_config() {
145 local cfg="$1"
146
147 echo "[$cfg]" >>"$UPS_C"
148
149 get_write_driver_config "$cfg" bus
150 get_write_driver_config "$cfg" cable
151 get_write_driver_config "$cfg" community
152 get_write_driver_config "$cfg" desc
153 get_write_driver_config "$cfg" driver "usbhid-ups"
154 get_write_driver_config "$cfg" ignorelb 0 1
155 get_write_driver_config "$cfg" interruptonly 0 1
156 get_write_driver_config "$cfg" interruptsize
157 get_write_driver_config "$cfg" maxreport
158 get_write_driver_config "$cfg" maxstartdelay
159 get_write_driver_config "$cfg" mfr
160 get_write_driver_config "$cfg" model
161 get_write_driver_config "$cfg" nolock 0 1
162 get_write_driver_config "$cfg" notransferoids 0 1
163 get_write_driver_config "$cfg" offdelay
164 get_write_driver_config "$cfg" ondelay
165 get_write_driver_config "$cfg" pollfreq
166 get_write_driver_config "$cfg" port "auto"
167 get_write_driver_config "$cfg" product
168 get_write_driver_config "$cfg" productid
169 get_write_driver_config "$cfg" retrydelay
170 get_write_driver_config "$cfg" sdorder
171 get_write_driver_config "$cfg" sdtime
172 get_write_driver_config "$cfg" serial
173 get_write_driver_config "$cfg" snmp_version
174 get_write_driver_config "$cfg" snmp_retries
175 get_write_driver_config "$cfg" snmp_timeout
176 get_write_driver_config "$cfg" synchronous
177 get_write_driver_config "$cfg" vendor
178 get_write_driver_config "$cfg" vendorid
179
180 # Params specific to NetXML driver
181 get_write_driver_config "$cfg" login
182 get_write_driver_config "$cfg" password
183 get_write_driver_config "$cfg" subscribe 0 1
184
185 defoverride() {
186 local overvar="$1"
187 local defover="$2"
188 local overtype="$(echo "$overvar" | tr '_' '.')"
189 local overval
190
191 config_get overval "${defover}_${overvar}" value
192 [ -n "$overval" ] && echo "${defover}.${overtype} = $overval" >>"$UPS_C"
193 }
194
195 config_list_foreach "$cfg" override defoverride override
196 config_list_foreach "$cfg" default defoverride default
197
198 other() {
199 local othervar="$1"
200 local othervarflag="$2"
201 local otherval
202
203 if [ "$othervarflag" = "otherflag" ]; then
204 config_get_bool otherval "${othervarflag}_${othervar}" value
205 [ "$otherval" = "1" ] && echo "${othervar}" >>"$UPS_C"
206 else
207 config_get otherval "${othervarflag}_${othervar}" value
208 [ -n "$otherval" ] && echo "${othervar} = $otherval" >>"$UPS_C"
209 fi
210 }
211
212 config_list_foreach "$cfg" other other other
213 config_list_foreach "$cfg" otherflag other otherflag
214 echo "" >>$UPS_C
215 havedriver=1
216 }
217
218 build_global_driver_config() {
219 local cfg="$1"
220
221 # Global driver config
222 get_write_driver_config "$cfg" chroot
223 get_write_driver_config "$cfg" driverpath
224 get_write_driver_config "$cfg" maxstartdelay
225 get_write_driver_config "$cfg" maxretry
226 get_write_driver_config "$cfg" retrydelay
227 get_write_driver_config "$cfg" pollinterval
228 get_write_driver_config "$cfg" synchronous
229 config_get runas "$cfg" user nut
230 RUNAS="$runas"
231
232 echo "" >>"$UPS_C"
233 }
234
235 build_config() {
236 local STATEPATH=/var/run/nut
237
238 mkdir -p "$(dirname "$UPS_C")"
239 rm -f "$UPS_C"
240 echo "# Config file automatically generated from UCI config" > "$UPS_C"
241 chmod 0640 "$UPS_C"
242
243 config_load nut_server
244
245 upsd_runas
246 config_foreach build_global_driver_config driver_global
247 config_foreach build_driver_config driver
248 upsd_statepath
249 build_server_config
250 [ -n "$RUNAS" ] && chgrp "$(id -gn "$RUNAS")" "$UPS_C"
251 }
252
253 start_driver_instance() {
254 local cfg="$1"
255 local requested="$2"
256 local driver
257 local STATEPATH=/var/run/nut
258 local RUNAS=nut
259
260 [ "$havedriver" != 1 ] && return
261
262 # If wanting a specific instance, only start it
263 if [ "$requested" != "$cfg" ] && [ "$request" != "" ]; then
264 return 0
265 fi
266
267 mkdir -p "$(dirname "$UPS_C")"
268 chmod 0755 "$UPS_C"
269
270 upsd_statepath
271 build_config
272
273 # Avoid hotplug inadvertenly restarting driver during
274 # forced shutdown
275 [ -f /var/run/killpower ] && return 0
276 if [ -d /var/run/nut ] && [ -f /var/run/nut/disable-hotplug ]; then
277 return 0
278 fi
279
280 if [ -n "$RUNAS" ]; then
281 chown "$RUNAS":"$(id -gn "$RUNAS")" "${STATEPATH}"
282 chgrp "$(id -gn "$RUNAS")" "$UPS_C"
283 fi
284
285 config_get driver "$cfg" driver "usbhid-ups"
286 procd_open_instance "$cfg"
287 procd_set_param respawn
288 procd_set_param stderr 0
289 procd_set_param stdout 1
290 procd_set_param command /lib/nut/"${driver}" -D -a "$cfg" ${RUNAS:+-u "$RUNAS"}
291 procd_close_instance
292 }
293
294 interface_triggers() {
295 local action="$1"
296 local triggerlist trigger
297
298 config_get triggerlist upsd triggerlist
299
300 . /lib/functions/network.sh
301
302 if [ -n "$triggerlist" ]; then
303 for trigger in $triggerlist; do
304 if [ "$action" = "add_trigger" ]; then
305 procd_add_interface_trigger "interface.*" "$trigger" /etc/init.d/nut-server reload
306 else
307 network_is_up "$trigger" && return 0
308 fi
309 done
310 else
311 if [ "$action" = "add_trigger" ]; then
312 procd_add_raw_trigger "interface.*.up" 2000 /etc/init.d/nut-server reload
313 else
314 ubus call network.device status | grep -q '"up": true' && return 0
315 fi
316 fi
317 [ "$action" = "add_trigger" ] || return 1
318 }
319
320 start_server_instance() {
321 local cfg="$1"
322
323 [ "$haveserver" != 1 ] && return
324 interface_triggers "check_interface_up" || return
325
326 procd_open_instance "$cfg"
327 procd_set_param respawn
328 procd_set_param stderr 0
329 procd_set_param stdout 1
330 procd_set_param command /usr/sbin/upsd -D ${RUNAS:+-u "$RUNAS"}
331 procd_close_instance
332 }
333
334 start_service() {
335 local STATEPATH=/var/run/nut
336
337 # Avoid hotplug inadvertenly restarting driver during
338 # forced shutdown
339 [ -f /var/run/killpower ] && return 0
340
341 config_load nut_server
342 build_config
343
344 case $@ in
345 "")
346 config_foreach start_driver_instance driver "$@"
347 start_server_instance upsd
348 ;;
349 *upsd*)
350 start_server_instance upsd
351 ;;
352 *)
353 config_foreach start_driver_instance driver "$@"
354 ;;
355 esac
356 }
357
358 reload_service() {
359 stop_service "$@"
360 sleep 2
361 start_service "$@"
362 }
363
364 service_triggers() {
365 config_load nut_server
366
367 interface_triggers "add_trigger"
368 procd_add_reload_trigger "nut_server"
369 }