#!/bin/bash

name="Power consumption"
WATTS=-1
SPEC=0

ipmi_instantaneous_power_reading () {
	WATTS=$(ipmitool dcmi power reading 2>/dev/null | grep "Instantaneous power reading:" | awk '{print $4}' )
}

ipmi_sdr () {
	WATTS=$(ipmitool sdr 2>/dev/null | awk -F"|" 'BEGIN {watts=0; avg=0} { \
		if ($1 ~ "^Avg Power[[:space:]]*$") {gsub("[^0-9]*", "", $2); watts=$2; avg=1} \
		if ($1 ~ "^Power[[:space:]]*$") {gsub("[^0-9]*", "", $2); watts=$2; avg=1} \
		if ($1 ~ "^Power[0-9]+.*") {gsub("[^0-9]*", "", $2); if (!avg) watts+=$2} \
		if ($1 ~ "^PS[0-9]+ Input Power.*") {gsub("[^0-9]*", "", $2); if (!avg) watts+=$2} \
		if ($1 ~ "^PS[0-9]+ Power In.*") {gsub("[^0-9]*", "", $2); if (!avg) watts+=$2} \
		} END {print watts}')
}

ipmi_sensor_get () {
	WATTS=$(ipmitool sensor get PWR_SYSTEM 2>/dev/null | grep -Po "Sensor Reading\s+: \K\d+")
}

cat_file () {
    if [ "$#" -eq 1 ]; then
        P=$1
        FILE="$P/$(hostname -s)"
        if [ -f "$FILE" ]; then
            WATTS=$(cat $FILE 2>/dev/null)
        fi
    fi
}

pc_disabled () {
	WATTS=-1
}

if [ -f /etc/check_mk/power_consumption.cfg ]; then
    . /etc/check_mk/power_consumption.cfg
else
    exit 0
fi

if [[ $WATTS == -1 ]] ; then
	exit 0
fi

if [[ $WATTS =~ ^[0-9]+$ ]] ; then

	W=$WATTS

	HT=$((1+$(cat /sys/devices/system/cpu/smt/active 2>/dev/null)))

	C=$(echo "$[(101-$(vmstat 1 2 2>/dev/null |tail -1|awk '{print $15}'))*$HT]")
	[ "$C" -gt "100" ] && C=100 #can be 101 due to number rounding
	P=$(($(nproc)/$HT))

	R=$(echo "scale=2; $W/$C" | bc)
	R2=$(echo "scale=2; $W/$P" | bc)
	R3=$(printf '%.2f\n' "$(echo "scale=2; ($P*$SPEC)/$W" | bc)")

	echo "0 \"$name\" power=$W|util=$C|ratio=$R|ratioWC=$R2|ratioSW=$R3 Current power consumption is $W Watts"
else
	echo "3 \"$name\" - Current power consumption is unknown"
fi
