#!/bin/sh

. /usr/share/alterator/build/backend3.sh

PATH="/usr/libexec/alterator-nut/:$PATH"
UPS_CONF="/etc/nut/ups.conf"


_()
{
LANG=${in_language%%;*}.utf8 gettext "alterator-nut" "$1"
}

inireplace()
{
    local object="$1" && shift
    local name="$1" && shift
    local value="$1" && shift

    sed -r "s,(^$object:[[:space:]]*$name[[:space:]]*)=.*,\1=$value,"
}

replace_conf()
{
    chmod 640 "$UPS_CONF.new"
    chown 'root:upsdrv' "$UPS_CONF.new"
    mv -f "$UPS_CONF" "$UPS_CONF.bak"
    mv -f "$UPS_CONF.new" "$UPS_CONF"
}

restart_server()
{
    service upsdrv restart >&2
    service upsd restart >&2
}

status_name()
{
    case "$1" in
        OFF) _ "Off";;
        OL) _ "On-line";;
        OB) _ "On battery";;
        LB) _ "Low battery";;
        RB) _ "Replace battery";;
        OVER) _ "Overload";;
        TRIM) _ "Voltage trim";;
        BOOST) _ "Voltage boost";;
        CAL) _ "Calibartion";;
        BYPASS) _ "Bypass";;
        *)	echo "$1" ;;
    esac
}

ups_status()
{
    set -- $(upsc "$1" "ups.status" || echo "N/A")
    for i; do status_name "$i"; echo -n ' ';done
}

service upsdrv start >&2 ||:
service upsd start >&2 ||:

on_message()
{
	case "$in_action" in
		constraints)
			echo '('
    			    if [ "$in__objects" = "/" ] ;then
				printf 'name (required #t match ("^[a-z][a-z0-9]+$" "%s" ) label "%s")' \
				"`_ "should be digits and small latin letters"`" "`_ "UPS Name"`"
			    fi
			    
			    if echo "$in__objects"|grep -vqs 'drivers' ;then
				printf 'port (required #t label "%s")' "`_ "Connection port"`"
				printf 'driver (required #t label "%s" default "genericups")' "`_ "UPS Driver"`"
				printf 'status (label "%s")' "`_ "UPS Status"`"
				printf 'charge (label "%s")' "`_ "UPS Charge"`"
				printf 'load (label "%s")' "`_ "UPS Load"`"
			    else
				printf 'vendor (label "%s")' "`_ "Vendor"`"
				printf 'model (label "%s")' "`_ "Model"`"
			    fi
			echo ')'
			;;
		list)
			if [ "$in__objects" = "/" ]; then
				echo '('
				    iniread "$UPS_CONF" |
					grep '^\[start\]' |
					cut -f2 -d: |
					sed 's,.*,("&"),'
				echo ')'
			elif echo "${in__objects}"|grep -qs '/drivers$' ; then
				echo '('
				    drvlist|
					cut -d';' -f1|
					sort -u|
					sed 's,.*,("&"),'
				echo ')'
			elif echo "${in__objects}"|grep -qs '/drivers/'; then
				local vendor="${in__objects##*/}"
				echo '('
				    drvlist|
					grep "^$vendor;"|
					cut -d';' -f2|
					sed 's,.*,("&"),'
				echo ')'
			else
				echo '()'
			fi
			;;
		read)
			if [ "$in__objects" == "/" ];then
			    echo '()'
			else
			    local cfgout=$(iniread "$UPS_CONF"|grep "^$in__objects:"|cut -f2 -d':')
			    local driver=$(echo "$cfgout"|sed -n '/driver/ {s,[[:space:]]*driver[[:space:]]*=[[:space:]]*,,;p}')
			    local port=$(echo "$cfgout"|sed -n '/port/ {s,[[:space:]]*port[[:space:]]*=[[:space:]]*,,;p}')
			    
			    echo '('
			    printf 'driver "%s"' "$driver"
			    printf 'port "%s"' "$port"
			    printf 'status "%s"' "$(ups_status "$in__objects@localhost")"
			    printf 'charge "%s%%"' "$(upsc "$in__objects@localhost" "battery.charge" || echo "0")"
			    printf 'load "%s%%"' "$(upsc "$in__objects@localhost" "ups.load" || echo "0")"
			    echo ')'
			fi
			;;
		write)
			#read
			local out="$(iniread "$UPS_CONF")"

			#modify
	    		if echo "$in__objects"|grep -qs "drivers";then
			    local vendor="${in__objects##*/}"
			    local driver="$(drvlist|grep "^$vendor;$in_model[[:space:]]*;"|cut -f3 -d';')"
			    out="$(echo "$out"|inireplace "${in__objects%%/*}" "driver" "$driver")"
			else
			    [ -n "$in_driver" ] && 
				out="$(echo "$out"|inireplace "$in__objects" "driver" "$in_driver")"
    			    [ -n "$in_port" ] && 
				out="$(echo "$out"|inireplace "$in__objects" "port" "$in_port")"
			fi
			
			#write
			echo "$out"|iniwrite >"$UPS_CONF.new"
			replace_conf

			restart_server
			echo '()'
			;;
		new)
			if iniread "$UPS_CONF"|egrep -qs "^\[start\]:$in_name$"; then
			    printf '(error "%s")' "`_ "Same device already exists"`"
			else
    			    #append new entry to config file
			    echo "[$in_name]" >>$UPS_CONF
			    echo "	port=$in_port" >>$UPS_CONF
			    echo "	driver=$in_driver" >>$UPS_CONF
			    restart_server
			    echo '()'
			fi
			
			;;
		delete)
			#filter entry from config file
			iniread "$UPS_CONF"|
			    egrep -v "(^\[start\]:$in__objects$|^$in__objects:)"|
			    iniwrite >"$UPS_CONF.new"
			replace_conf
			restart_server
			echo '()'
			;;
		*)
			echo '#f'
			;;
	esac
}

message_loop
