ASR_BASE

Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/external/subpack/net/nut/files/nut-server.init b/external/subpack/net/nut/files/nut-server.init
new file mode 100755
index 0000000..7d550bd
--- /dev/null
+++ b/external/subpack/net/nut/files/nut-server.init
@@ -0,0 +1,363 @@
+#!/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"
+}