#!/bin/sh

po_domain="alterator-bc"
alterator_api_version=1

. alterator-sh-functions

pagesize="$(getconf PAGESIZE)"
[ -n "$pagesize" ] || pagesize=4096

BC_ROOT="/proc/bc"

counter_status()
{
	local max="$1" barr="$2" fail="$3"
	local gap="95/100"

	barr="$(echo "scale=0; $barr*$gap" | bc -q)"

	if [ "$barr" -eq 0 -o "$max" -lt "$barr" ]; then
		echo "OK::"
	elif [ "$max" -ge "$barr" -a "$fail" -eq 0 ]; then
		echo ":WARNING:"
	else
		echo "::ERROR"
	fi
}

counter_value()
{
	local name="$1" curr="$2" max="$3" barr="$4"
	local divisor=1 suffix= scale=0

	case "$name" in
		*pages) # pages
			divisor="$(( 1024*1024/$pagesize ))"
			suffix=M
			scale=2
			;;
		num*) # pieces
			;;
		*) # bytes
			divisor=1048576
			suffix=M
			scale=2
			;;
	esac

	case "$barr" in
		9223372036854775807|2147483647)
			barr="Unlimited"
			;;
		*)
			barr="$(echo "scale=$scale; $barr/$divisor" | bc -q)$suffix"
			;;
	esac

	curr="$(echo "scale=$scale; $curr/$divisor" | bc -q)$suffix"
	max="$(echo "scale=$scale; $max/$divisor" | bc -q)$suffix"

	printf '%s:%s:%s' "$curr" "$max" "$barr"
}

on_message()
{
	env | grep '^in_'
	case "$in_action" in
		list)
			case "$in__objects" in
				/)
					vzlist -aHo veid,name,status |
						while read veid name status; do
							ok="$status"
							warn=
							err=
							if [ "$status" = "running" -a -f "$BC_ROOT/$veid/resources" ]; then
								while read resname curr max barr lim fail; do
									[ -n "${resname##*guar*}" ] || continue
									status="$(counter_status "$max" "$barr" "$fail")"
									if [ -n "${status#*:*:}" ]; then
										ok=
										warn=
										err="${status#*:*:}"
										break
									fi
									warn="${status%:*}"
									warn="${warn#*:}"
								done < "$BC_ROOT/$veid/resources"
							fi
							[ -z "$warn" ] || ok=
							write_table_item \
								veid "$veid" \
								name "$name" \
								ok "$ok" \
								warn "$warn" \
								err "$err"
						done
					;;
				resources)
					if [ -f "$BC_ROOT/$in_veid/resources" ]; then
						while read resname curr max barr lim fail; do
							[ -n "${resname##*guar*}" ] || continue
							status="$(counter_status "$max" "$barr" "$fail")"
							ok="${status%:*:*}"
							warn="${status%:*}"
							warn="${warn#*:}"
							err="${status#*:*:}"
							value="$(counter_value "$resname" "$curr" "$max" "$barr")"
							curr="${value%:*:*}"
							max="${value%:*}"
							max="${max#*:}"
							barr="${value#*:*:}"
							write_table_item \
								resource "$resname" \
								curr "$curr" \
								max "$max" \
								barr "$barr" \
								ok "$ok" \
								warn "$warn" \
								err "$err"
						done < "$BC_ROOT/$in_veid/resources"
					fi
					;;
			esac
			;;
		read)
			case "$in__objects" in
				resources)
					write_string_param veid "$in_veid"
					;;
			esac
			;;
	esac
}

message_loop
# vim: set ts=4 sw=4:
