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

RUN_D=/var/run
PID_F=$RUN_D/upsd.pid
UPS_C=/var/etc/nut/ups.conf
USERS_C=/var/etc/nut/upsd.users
UPSD_C=/var/etc/nut/upsd.conf

USE_PROCD=1

listen_address() {
    local cfg="$1"

    config_get address "$cfg" address "::1"
    config_get port "$cfg" port
    echo "LISTEN $address $port" >>$UPSD_C
}

upsd_statepath() {
    local cfg="$1"
    config_get statepath "$cfg" statepath
}

upsd_config() {
    local cfg="$1"
    local maxage maxconn certfile

    # Note runas support requires you make sure USB device file is readable by
    # the runas user
    config_get runas "$cfg" runas

    config_get maxage "$cfg" maxage
    [ -n "$maxage" ] && echo "MAXAGE $maxage" >>$UPSD_C

    config_get statepath "$cfg" statepath
    [ -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
}

start_service() {
	local runas statepath

        mkdir -p /var/etc/nut
	chmod -R 750 /var/etc/nut

	rm -f $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" > $UPS_C
	echo "# Config file automatically generated from UCI config" > $USERS_C
	echo "# Config file automatically generated from UCI config" > $UPSD_C

        local in_driver have_drivers
	config_cb() {
	    if [ "$1" != "driver" ]; then
		in_driver=
	    else
		echo "[$2]" >> $UPS_C
		in_driver=true
		have_drivers=true
	    fi
	}
	option_cb() {
	    if [ "$in_driver" = "true" ]; then
		echo " $1 = $2" >> $UPS_C
	    fi
	}

	config_load nut_server

	config_foreach nut_user_add user
	config_foreach upsd_config upsd
	config_foreach listen_address listen_address

	echo "MODE=netserver" >>/var/etc/nut/nut.conf

	chmod 0640 $USERS_C
	chmod 0640 $UPS_C
	chmod 0640 $UPSD_C
	chmod 0640 /var/etc/nut/nut.conf
	[ -d "${statepath:-/var/run/nut}" ] || {
		mkdir -m 0750 -p "${statepath:-/var/run/nut}"
		chown $runas:$(id -gn $runas) "${statepath:-/var/run/nut}"
	}

	if [ -n "$runas" ]; then
		chown -R $runas:$(id -gn $runas) /var/etc/nut
	fi

	if [ "$have_drivers" = "true" ]; then
	    $DEBUG /usr/sbin/upsd ${runas:+-u $runas} $OPTIONS
	    $DEBUG /usr/sbin/upsdrvctl ${runas:+-u $runas} start
	fi
}


nut_driver_stop() {
	local cfg="$1"
	local driver

	config_get driver "$cfg" driver

	[ -r ${statepath:-/var/run/nut}/$driver-$cfg ] && /usr/sbin/upsdrvctl stop $cfg
}

stop_service() {
	[ -r $PID_F ] && /usr/sbin/upsd -c stop
	config_load ups
	config_foreach upsd_statepath upsd
	config_foreach nut_driver_stop driver
}

reload_service() {
	upsd -c reload
}
