| #!/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" 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 |
| |
| 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" |
| } |