Files
packages/net/nut/files/nut-server.init
T
Daniel F. Dickinson 8f41fa7f82 nut: Default to run as root but fix alt runas
Since the new hotplug script in master was not backport (new feature),
for 18.06 branch revert the old behavior of running NUT daemons and
drivers as root by default to avoid permisions problems, but backport
fix the support for running as another user for those who can set the
appropriate permissions on the USB (or other) device.

Closes: #7742

Signed-off-by: Daniel F. Dickinson <cshored@thecshore.com>
2018-12-28 16:18:26 -05:00

328 lines
7.9 KiB
Bash
Executable File

#!/bin/sh /etc/rc.common
# Copyright © 2012 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
START=50
USERS_C=/var/etc/nut/upsd.users
UPSD_C=/var/etc/nut/upsd.conf
UPS_C=/var/etc/nut/ups.conf
USE_PROCD=1
get_write_driver_config() {
local cfg="$1"
local var="$2"
local def="$3"
local flag="$4"
local val
[ -z "$flag" ] && {
config_get val "$cfg" "$var" "$def"
[ -n "$val" ] && [ "$val" != "0" ] && echo "$var = $val" >>"$UPS_C"
}
[ -n "$flag" ] && {
config_get_bool val "$cfg" "$var" "$def"
[ "$val" = 1 ] && echo "$var" >>"$UPS_C"
}
}
upsd_statepath() {
local cfg="$1"
local statepath
config_get statepath "$cfg" statepath "/var/run/nut"
STATEPATH="$statepath"
}
upsd_runas() {
local cfg="$1"
local runas
[ -n "$RUNAS" ] && return
config_get runas "$cfg" runas
RUNAS="$runas"
}
listen_address() {
local cfg="$1"
config_get address "$cfg" address "::1"
config_get port "$cfg" port
echo "LISTEN $address $port" >>"$UPSD_C"
}
upsd_config() {
local cfg="$1"
local maxage maxconn certfile runas statepath
# Note runas support requires you make sure USB device file is readable by
# the runas user
config_get runas "$cfg" runas
RUNAS="$runas"
config_get statepath "$cfg" statepath "/var/run/nut"
STATEPATH="$statepath"
config_get maxage "$cfg" maxage
[ -n "$maxage" ] && echo "MAXAGE $maxage" >>"$UPSD_C"
[ -n "$statepath" ] && echo "STATEPATH $statepath" >>"$UPSD_C"
config_get maxconn "$cfg" maxconn
[ -n "$maxconn" ] && echo "MAXCONN $maxconn" >>"$UPSD_C"
#NOTE: certs only apply to SSL-enabled version
config_get certfile "$cfg" certfile
[ -n "$certfile" ] && echo "CERTFILE $certfile" >>"$UPSD_C"
}
nut_user_add() {
local cfg="$1"
local a
local val
config_get val "$cfg" username "$1"
echo "[$val]" >> "$USERS_C"
config_get val "$cfg" password
echo " password = $val" >> "$USERS_C"
config_get val "$cfg" actions
for a in $val; do
echo " actions = $a" >> "$USERS_C"
done
instcmd() {
local val="$1"
echo " instcmds = $val" >> "$USERS_C"
}
config_list_foreach "$cfg" instcmd instcmd
config_get val "$cfg" upsmon
if [ -n "$val" ]; then
echo " upsmon $val" >> "$USERS_C"
fi
}
build_server_config() {
mkdir -m 0755 -p "$(dirname "$UPSD_C")"
rm -f "$USERS_C"
rm -f "$UPSD_C"
rm -f /var/etc/nut/nut.conf
echo "# Config file automatically generated from UCI config" > "$USERS_C"
echo "# Config file automatically generated from UCI config" > "$UPSD_C"
config_foreach nut_user_add user
config_foreach listen_address listen_address
config_foreach upsd_config upsd
echo "MODE=netserver" >>/var/etc/nut/nut.conf
chmod 0640 "$USERS_C"
chmod 0640 "$UPSD_C"
chmod 0644 /var/etc/nut/nut.conf
[ -d "${STATEPATH}" ] || {
mkdir -m 0750 -p "${STATEPATH}"
}
if [ -n "$RUNAS" ]; then
chown $RUNAS:$(id -gn $RUNAS) "${STATEPATH}"
chgrp $(id -gn $RUNAS) "$USERS_C"
chgrp $(id -gn $RUNAS) "$UPSD_C"
fi
haveserver=1
}
build_driver_config() {
local cfg="$1"
echo "[$cfg]" >>"$UPS_C"
get_write_driver_config "$cfg" driver "usbhid-ups"
get_write_driver_config "$cfg" port "auto"
get_write_driver_config "$cfg" sdorder
get_write_driver_config "$cfg" desc
get_write_driver_config "$cfg" nolock 0 1
get_write_driver_config "$cfg" ignorelb 0 1
get_write_driver_config "$cfg" mfr
get_write_driver_config "$cfg" model
get_write_driver_config "$cfg" serial
get_write_driver_config "$cfg" sdtime
get_write_driver_config "$cfg" offdelay
get_write_driver_config "$cfg" ondelay
get_write_driver_config "$cfg" pollfreq
get_write_driver_config "$cfg" vendor
get_write_driver_config "$cfg" product
get_write_driver_config "$cfg" bus
get_write_driver_config "$cfg" interruptonly 0 1
get_write_driver_config "$cfg" interruptsize
get_write_driver_config "$cfg" maxreport
get_write_driver_config "$cfg" vendorid
get_write_driver_config "$cfg" productid
get_write_driver_config "$cfg" community
get_write_driver_config "$cfg" snmp_version
get_write_driver_config "$cfg" snmp_retries
get_write_driver_config "$cfg" snmp_timeout
get_write_driver_config "$cfg" notransferoids 0 1
get_write_driver_config "$cfg" maxstartdelay
get_write_driver_config "$cfg" retrydelay
get_write_driver_config "$cfg" synchronous
get_write_driver_config "$cfg" other
get_write_driver_config "$cfg" otherflag
defoverride() {
local overvar="$1"
local defover="$2"
local overtype="$(echo "$overvar" | tr '.' '_')"
config_get overval "${defover}_${overtype}" value
[ -n "$overval" ] && echo "${defover}.${overvar} = $overval" >>"$UPS_C"
}
config_list_foreach "$cfg" override defoverride override
config_list_foreach "$cfg" default defoverride default
other() {
local othervar="$1"
local othervarflag="$2"
if [ "$othervarflag" = "otherflag" ]; then
config_get_bool otherval "${othervarflag}_${overtype}" value
[ "$otherval" = "1" ] && echo "${othervarflag}_${othervar}" >>"$UPS_C"
else
config_get otherval "${othervarflag}_${overtype}" value
[ -n "$otherval" ] && echo "${othervarflag}_${othervar} = $otherval" >>"$UPS_C"
fi
}
config_list_foreach "$cfg" override defoverride override
config_list_foreach "$cfg" default defoverride default
config_list_foreach "$cfg" default other other
config_list_foreach "$cfg" default other otherflag
echo "" >>$UPS_C
havedriver=1
}
build_global_driver_config() {
local cfg="$1"
# Global driver config
get_write_driver_config "$cfg" chroot
get_write_driver_config "$cfg" driverpath
get_write_driver_config "$cfg" maxstartdelay
get_write_driver_config "$cfg" maxretry
get_write_driver_config "$cfg" retrydelay
get_write_driver_config "$cfg" pollinterval
get_write_driver_config "$cfg" synchronous
config_get runas "$cfg" user
RUNAS="$runas"
upsd_runas
echo "" >>$UPS_C
}
build_config() {
local STATEPATH=/var/run/nut
mkdir -m 0755 -p "$(dirname "$UPS_C")"
rm -f "$UPS_C"
echo "# Config file automatically generated from UCI config" > "$UPS_C"
chmod 0640 "$UPS_C"
config_load nut_server
config_foreach upsd_statepath upsd
config_foreach build_global_driver_config driver_global
config_foreach build_driver_config driver
[ -n "$RUNAS" ] && chgrp $(id -gn $RUNAS) "$UPS_C"
build_server_config
}
start_driver_instance() {
local cfg="$1"
local requested="$2"
local driver
local STATEPATH=/var/run/nut
local RUNAS
[ "$havedriver" != 1 ] && return
# If wanting a specific instance, only start it
[ "$requested" != "$cfg" ] && [ x"$requested" != x ] && return 0
mkdir -m 0755 -p "$(dirname "$UPS_C")"
[ ! -s "$UPS_C" ] && build_config
# Avoid hotplug inadvertenly restarting driver during
# forced shutdown
[ -f /var/run/killpower ] && return 0
[ -d /var/run/nut ] && [ -f /var/run/nut/disable-hotplug ] && return 0
config_foreach upsd_statepath upsd
if [ -n "$RUNAS" ]; then
chown $RUNAS:$(id -gn $RUNAS) "${STATEPATH}"
fi
config_get driver "$cfg" driver "usbhid-ups"
procd_open_instance "$cfg"
procd_set_param respawn
procd_set_param stderr 0
procd_set_param stdout 1
procd_set_param command /lib/nut/${driver} -D -a "$cfg" ${RUNAS:+-u $RUNAS}
procd_close_instance
}
start_server_instance() {
local RUNAS
build_config
[ "$haveserver" != 1 ] && return
procd_open_instance "upsd"
procd_set_param respawn
procd_set_param stderr 0
procd_set_param stdout 1
procd_set_param command /usr/sbin/upsd -D ${RUNAS:+-u $RUNAS}
procd_close_instance
}
start_service() {
local havedriver haveserver
local STATEPATH=/var/run/nut
local RUNAS
# Avoid hotplug inadvertenly restarting driver during
# forced shutdown
[ -f /var/run/killpower ] && return 0
[ -f /var/run/nut/disable-hotplug ] && return 0
config_load nut_server
build_config
config_foreach start_driver_instance driver "$@"
start_server_instance "upsd"
}
reload_service() {
stop
sleep 2
local havedriver haveserver
start
}
service_triggers() {
procd_add_reload_trigger "nut_server"
}