mirror of
https://github.com/openwrt/packages.git
synced 2025-01-31 03:41:44 +00:00
67e49b7e0e
at least driver apcsmart-old (maybe more) allow for specifying the type of cable used. My old UPS does will not function when cable type is not specified. This will add support for configuration option 'cable' Signed-off-by: Rob J. Epping <epping@renf.us>
370 lines
8.7 KiB
Bash
Executable File
370 lines
8.7 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=70
|
|
STOP=30
|
|
|
|
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 statepath
|
|
|
|
config_get statepath upsd statepath /var/run/nut
|
|
STATEPATH="$statepath"
|
|
}
|
|
|
|
upsd_runas() {
|
|
local runas
|
|
|
|
[ -n "$RUNAS" ] && return 0
|
|
|
|
config_get runas upsd runas nut
|
|
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 nut
|
|
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 -p "$(dirname "$UPSD_C")"
|
|
chmod 0640 "$UPS_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 -p "${STATEPATH}"
|
|
chmod 0750 "${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" bus
|
|
get_write_driver_config "$cfg" cable
|
|
get_write_driver_config "$cfg" community
|
|
get_write_driver_config "$cfg" desc
|
|
get_write_driver_config "$cfg" driver "usbhid-ups"
|
|
get_write_driver_config "$cfg" ignorelb 0 1
|
|
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" maxstartdelay
|
|
get_write_driver_config "$cfg" mfr
|
|
get_write_driver_config "$cfg" model
|
|
get_write_driver_config "$cfg" nolock 0 1
|
|
get_write_driver_config "$cfg" notransferoids 0 1
|
|
get_write_driver_config "$cfg" offdelay
|
|
get_write_driver_config "$cfg" ondelay
|
|
get_write_driver_config "$cfg" pollfreq
|
|
get_write_driver_config "$cfg" port "auto"
|
|
get_write_driver_config "$cfg" product
|
|
get_write_driver_config "$cfg" productid
|
|
get_write_driver_config "$cfg" retrydelay
|
|
get_write_driver_config "$cfg" sdorder
|
|
get_write_driver_config "$cfg" sdtime
|
|
get_write_driver_config "$cfg" serial
|
|
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" synchronous
|
|
get_write_driver_config "$cfg" vendor
|
|
get_write_driver_config "$cfg" vendorid
|
|
|
|
# Params specific to NetXML driver
|
|
get_write_driver_config "$cfg" login
|
|
get_write_driver_config "$cfg" password
|
|
get_write_driver_config "$cfg" subscribe 0 1
|
|
|
|
defoverride() {
|
|
local overvar="$1"
|
|
local defover="$2"
|
|
local overtype="$(echo "$overvar" | tr '_' '.')"
|
|
local overval
|
|
|
|
config_get overval "${defover}_${overvar}" value
|
|
[ -n "$overval" ] && echo "${defover}.${overtype} = $overval" >>"$UPS_C"
|
|
}
|
|
|
|
config_list_foreach "$cfg" override defoverride override
|
|
config_list_foreach "$cfg" default defoverride default
|
|
|
|
other() {
|
|
local othervar="$1"
|
|
local othervarflag="$2"
|
|
local otherval
|
|
|
|
if [ "$othervarflag" = "otherflag" ]; then
|
|
config_get_bool otherval "${othervarflag}_${othervar}" value
|
|
[ "$otherval" = "1" ] && echo "${othervar}" >>"$UPS_C"
|
|
else
|
|
config_get otherval "${othervarflag}_${othervar}" value
|
|
[ -n "$otherval" ] && echo "${othervar} = $otherval" >>"$UPS_C"
|
|
fi
|
|
}
|
|
|
|
config_list_foreach "$cfg" other other other
|
|
config_list_foreach "$cfg" otherflag 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 nut
|
|
RUNAS="$runas"
|
|
|
|
echo "" >>"$UPS_C"
|
|
}
|
|
|
|
build_config() {
|
|
local STATEPATH=/var/run/nut
|
|
|
|
mkdir -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
|
|
|
|
upsd_runas
|
|
config_foreach build_global_driver_config driver_global
|
|
config_foreach build_driver_config driver
|
|
upsd_statepath
|
|
build_server_config
|
|
[ -n "$RUNAS" ] && chgrp "$(id -gn "$RUNAS")" "$UPS_C"
|
|
}
|
|
|
|
start_driver_instance() {
|
|
local cfg="$1"
|
|
local requested="$2"
|
|
local driver
|
|
local STATEPATH=/var/run/nut
|
|
local RUNAS=nut
|
|
|
|
[ "$havedriver" != 1 ] && return
|
|
|
|
# If wanting a specific instance, only start it
|
|
if [ "$requested" != "$cfg" ] && [ "$request" != "" ]; then
|
|
return 0
|
|
fi
|
|
|
|
mkdir -p "$(dirname "$UPS_C")"
|
|
chmod 0755 "$UPS_C"
|
|
|
|
upsd_statepath
|
|
build_config
|
|
|
|
# Avoid hotplug inadvertenly restarting driver during
|
|
# forced shutdown
|
|
[ -f /var/run/killpower ] && return 0
|
|
if [ -d /var/run/nut ] && [ -f /var/run/nut/disable-hotplug ]; then
|
|
return 0
|
|
fi
|
|
|
|
if [ -n "$RUNAS" ]; then
|
|
chown "$RUNAS":"$(id -gn "$RUNAS")" "${STATEPATH}"
|
|
chgrp "$(id -gn "$RUNAS")" "$UPS_C"
|
|
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
|
|
}
|
|
|
|
interface_triggers() {
|
|
local action="$1"
|
|
local triggerlist trigger
|
|
|
|
config_get triggerlist upsd triggerlist
|
|
|
|
. /lib/functions/network.sh
|
|
|
|
if [ -n "$triggerlist" ]; then
|
|
for trigger in $triggerlist; do
|
|
if [ "$action" = "add_trigger" ]; then
|
|
procd_add_interface_trigger "interface.*" "$trigger" /etc/init.d/nut-server reload
|
|
else
|
|
network_is_up "$trigger" && return 0
|
|
fi
|
|
done
|
|
else
|
|
if [ "$action" = "add_trigger" ]; then
|
|
procd_add_raw_trigger "interface.*.up" 2000 /etc/init.d/nut-server reload
|
|
else
|
|
ubus call network.device status | grep -q '"up": true' && return 0
|
|
fi
|
|
fi
|
|
[ "$action" = "add_trigger" ] || return 1
|
|
}
|
|
|
|
start_server_instance() {
|
|
local cfg="$1"
|
|
|
|
[ "$haveserver" != 1 ] && return
|
|
interface_triggers "check_interface_up" || return
|
|
|
|
procd_open_instance "$cfg"
|
|
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 STATEPATH=/var/run/nut
|
|
|
|
# Avoid hotplug inadvertenly restarting driver during
|
|
# forced shutdown
|
|
[ -f /var/run/killpower ] && return 0
|
|
|
|
config_load nut_server
|
|
build_config
|
|
|
|
case $@ in
|
|
"")
|
|
config_foreach start_driver_instance driver "$@"
|
|
start_server_instance upsd
|
|
;;
|
|
*upsd*)
|
|
start_server_instance upsd
|
|
;;
|
|
*)
|
|
config_foreach start_driver_instance driver "$@"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
reload_service() {
|
|
stop_service "$@"
|
|
sleep 2
|
|
start_service "$@"
|
|
}
|
|
|
|
service_triggers() {
|
|
config_load nut_server
|
|
|
|
interface_triggers "add_trigger"
|
|
procd_add_reload_trigger "nut_server"
|
|
}
|