From 9766c630514e291c219115f5d6113da0fc64c4ad Mon Sep 17 00:00:00 2001 From: David Schroeder Date: Thu, 14 Dec 2023 13:45:27 -0600 Subject: [PATCH] update --- defaults.inc | 1 + inc/power.inc.sh | 624 +++++++++++++++++++++++++ inc/temp.inc.sh | 515 +++++++++++++++++++++ powerwall.sh | 1146 +--------------------------------------------- 4 files changed, 1144 insertions(+), 1142 deletions(-) create mode 100644 inc/power.inc.sh create mode 100644 inc/temp.inc.sh diff --git a/defaults.inc b/defaults.inc index 90157270..cd3e4c30 100755 --- a/defaults.inc +++ b/defaults.inc @@ -2,6 +2,7 @@ VERS='2.5.23-12142023' noheader=' update service dailytemp confsync ' + HC_CW=60 # mqtt_conn='/usr/bin/mosquitto_sub -h 127.0.0.1 -u emonpi -P emonpimqtt' diff --git a/inc/power.inc.sh b/inc/power.inc.sh new file mode 100644 index 00000000..392df4a8 --- /dev/null +++ b/inc/power.inc.sh @@ -0,0 +1,624 @@ +AVERAGEPOWER(){ + watttotal=0 + sensorid=${1} + daysback=${2} + logsfound=0; + while IFS=$'\t' read date watt ;do + watttotal=$(bc <<< "scale=2; ${watttotal}+${watt}") + ((logsfound++)) + done < <(${mysql_conn} -se "USE servermonitor; SELECT date,watt from power_data WHERE sensorid=${sensorid} AND date BETWEEN DATE_SUB(DATE(NOW()), INTERVAL ${daysback} DAY) AND NOW() ORDER BY id DESC;") + [ "${logsfound}" != "0" ] && average=$(bc <<< "scale=2; ${watttotal}/${logsfound}") || average=0 + # echo "$watttotal-$logsfound=${average}" + # echo "${average}-(${logsfound})" + echo ${average} +} + +CHECKPOWER(){ + start=`date +%s` + rm -f ${PW_TMPFOLDER}/*.hostpower* + while [ $# -gt 0 ]; do + case "$1" in + -a|-avg) avgdays=${2};; + -o|-offsite) STYPE=offsite;; + -m|-mainsite) STYPE=mainsite;; + -e|-esxi) PTYPE=esxi;; + -p|-power) PTYPE=power;; + esac + shift 1 + done + [ "${avgdays}" == "0" ] && unset avgdays + [ "${avgdays}" != "" ] && avgdayshdr="${avgdays}-Day-Avg" || avgdayshdr="" + + if ([ "${STYPE}" == "" ] || [ "${STYPE}" == "mainsite" ]) && [ "${PTYPE}" != "esxi" ]; then + echo + DIVIDER . yellow 75 + echo -e "${idsCL[Yellow]}Mainsite Power Information ${idsCL[LightYellow]}${avgdayshdr}" + DIVIDER . yellow 75 + + echo -en "${idsCL[Yellow]}Pulling data from 'Powerwall' ... " + + INVSTATSINFO=$(curl -s "http://${PW_INVERTER_IP}/stats.json") + if [ "${INVSTATSINFO}" != "" ]; then + INPUTV=`echo ${INVSTATSINFO} | jq '.inputs .inV'` + INPUTA=`echo ${INVSTATSINFO} | jq '.inputs .inA'` + INV_ALARM=`echo ${INVSTATSINFO} | jq '.errors .Alms'` + [ "${INV_ALARM}" == "0" ] && INV_ALARM_disp="${idsCL[Green]}No Alarms (${INV_ALARM})" || INV_ALARM_disp="${idsCL[LightRed]}${PW_INVERTER_ALARMS[${INV_ALARM}]}" + INV_ERROR=`echo ${INVSTATSINFO} | jq '.errors .Err'` + [ "${INV_ERROR}" == "0" ] && INV_ERROR_disp="${idsCL[Green]}No Errors (${INV_ERROR})" || INV_ERROR_disp="${idsCL[LightRed]}${PW_INVERTER_ERRORS[${INV_ERROR}]}" + INV_STATE=`echo ${INVSTATSINFO} | jq '.stats .invSTATES'` + [ "${INV_STATE}" != "0" ] && INV_STATE_disp="${idsCL[Green]}${PW_INVERTER_STATES[${INV_STATE}]}" || INV_STATE_disp="${idsCL[LightRed]}${PW_INVERTER_STATES[${INV_STATE}]}" + INV_MODE=`echo ${INVSTATSINFO} | jq '.stats .power'` + ([ "${INV_MODE}" != "3" ] && [ "${INV_MODE}" != "4" ] && [ "${INV_MODE}" != "E" ]) && INV_MODE_disp="${idsCL[Green]}${PW_INVERTER_MODES[${INV_MODE}]}" || INV_MODE_disp="${idsCL[LightRed]}${PW_INVERTER_MODES[${INV_MODE}]}" + OUTPUTV=`echo ${INVSTATSINFO} | jq '.outputs .outV'` + OUTPUTV2=`echo "scale=2; ${OUTPUTV}/2" | bc` + OUTPUTA=`echo ${INVSTATSINFO} | jq '.outputs .outA'` + OUTPUTA2=`echo "scale=2; ${OUTPUTA}*2" | bc` + OUTPUTW=`echo ${INVSTATSINFO} | jq '.outputs .outW'` + BATTV=`echo ${INVSTATSINFO} | jq '.inputs .battV'` + BATTA=`echo ${INVSTATSINFO} | jq '.inputs .xfA'` + BATTLIFE=`echo "scale=2; (${BATTV}*100)/${BATT_FULL}" | bc` + if (( $(bc <<<"${BATTV} > ${FLOAT_CHARGE}") )); then + if (( $(bc <<<"${BATTV} > ${BULK_CHARGE}") )); then + BATTA_disp="${idsCL[Green]}`IDS_NUMBER_FORMAT ${BATTA}`'amps ${idsCL[LightCyan]}- Bulk Charging" + else + BATTA_disp="${idsCL[Green]}`IDS_NUMBER_FORMAT ${BATTA}`'amps ${idsCL[LightCyan]}- Float Charging" + fi + elif [ "${BATTA}" == "-0.1" ] || [ "${BATTA}" == "-0.2" ] || [ "${BATTA}" == "-0.3" ]; then + BATTA_disp="${idsCL[LightCyan]}`IDS_NUMBER_FORMAT ${BATTA}`'amps ${idsCL[LightCyan]}- Standby" + else + BATTA_disp="${idsCL[LightRed]}`IDS_NUMBER_FORMAT ${BATTA}`'amps ${idsCL[LightCyan]}- Discharging" + fi + fi + + echo -en "\r\033[K" + echo -e "${idsCL[White]}Inverter State ${idsCL[Default]}: ${INV_STATE_disp}" + echo -e "${idsCL[White]}Inverter Mode ${idsCL[Default]}: ${INV_MODE_disp}" + echo -e "${idsCL[White]}Inverter Alarms ${idsCL[Default]}: ${INV_ALARM_disp}" + echo -e "${idsCL[White]}Inverter Errors ${idsCL[Default]}: ${INV_ERROR_disp}" + echo + echo -e "${idsCL[White]}Inverter Input Volts ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${INPUTV}`'volts" + echo -e "${idsCL[White]}Inverter Input Amps ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${INPUTA}`'amps" + echo + echo -e "${idsCL[White]}Inverter Output Volts ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${OUTPUTV}`'volts / `IDS_NUMBER_FORMAT ${OUTPUTV2}`'volts" + echo -e "${idsCL[White]}Inverter Output Amps ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${OUTPUTA}`'amps / `IDS_NUMBER_FORMAT ${OUTPUTA2}`'amps" + echo -e "${idsCL[White]}Inverter Output Watts ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${OUTPUTW}`'watts" + echo + echo -e "${idsCL[White]}Battery Voltage ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${BATTV}`'volts ~ `IDS_NUMBER_FORMAT ${BATTLIFE}`%" + echo -e "${idsCL[White]}Battery Amps Chg/DChg ${idsCL[Default]}: ${BATTA_disp}${idsCL[Default]}" + + # echo + DIVIDER . lightCyan 75 + + echo -en "${idsCL[Yellow]}Pulling data from 'ServerRoom' ... " + + # if [ "$(CHECK_HOST ${PW_UPS_IP})" != "false" ]; then + SVRRM_VOLTIN=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_UPS_IP} iso.3.6.1.4.1.850.1.1.3.1.3.2.2.1.3.1.1 | sed 's/.*: //') + SVRRM_VOLTIN=`echo "scale=2; ${SVRRM_VOLTIN}/10" | bc` + SVRRM_VOLTOUT=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_UPS_IP} iso.3.6.1.4.1.850.1.1.3.1.3.3.2.1.2.1.1 | sed 's/.*: //') + SVRRM_VOLTOUT=`echo "scale=2; ${SVRRM_VOLTOUT}/10" | bc` + + SVRRM_WATT=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_UPS_IP} iso.3.6.1.4.1.850.1.1.3.1.3.3.2.1.4.1.1 | sed 's/.*: //') + SVRRM_AMP=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_UPS_IP} iso.3.6.1.4.1.850.1.1.3.1.3.3.2.1.3.1.1 | sed 's/.*: //') + SVRRM_AMP=`echo "scale=2; ${SVRRM_AMP}/100" | bc` + # fi + # + # if [ "$(CHECK_HOST ${PW_APCPDU_IP})" != "false" ]; then + APCPDU_AMP=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_APCPDU_IP} .1.3.6.1.4.1.318.1.1.12.2.3.1.1.2.1 | sed 's/.*: //') + APCPDU_AMP=`echo "scale=2; ${APCPDU_AMP}/10" | bc` + APCPDU_WATT2=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_APCPDU_IP} .1.3.6.1.4.1.318.1.1.12.1.16.0 | sed 's/.*: //') + APCPDU_WATT=`echo "scale=2; ${APCPDU_AMP}*${SVRRM_VOLTOUT}" | bc` + # fi + + if [ "${SVRRM_VOLTOUT}" != "" ]; then + if [ "${APCPDU_AMP}" != "" ]; then + NETRK_AMP=`echo "scale=2; ${SVRRM_AMP}-${APCPDU_AMP}" | bc` + NETRK_WATT=`echo "scale=2; ${SVRRM_WATT}-${APCPDU_WATT}" | bc` + NETRK_WATT2=`echo "scale=2; ${SVRRM_WATT}-${APCPDU_WATT2}" | bc` + fi + VOLT_DROP=`echo "scale=1; ${OUTPUTV2}-${SVRRM_VOLTIN}" | bc` + fi + + echo -en "\r\033[K" + echo -e "${idsCL[White]}ServerRack Amps ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${APCPDU_AMP}`'amps${idsCL[Default]}" + + MSG="${idsCL[White]}ServerRack Wattage ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${APCPDU_WATT}`'watts ${idsCL[Default]}~ estimate" + echo -en "${MSG}" + if [ "${avgdays}" != "" ]; then + echo -en "${idsCL[LightYellow]} Calculating average ...${idsCL[Default]}" + average=$(AVERAGEPOWER ${PW_POWERSENSOR_ID['server-rack']} ${avgdays}); average_disp="${idsCL[LightYellow]} `IDS_NUMBER_FORMAT ${average}`'watts" + echo -en "\r\033[K"; echo -en "${MSG}${idsCL[LightYellow]}${average_disp}" + else + echo -en " ${idsCL[LightCyan]}(`IDS_NUMBER_FORMAT ${APCPDU_WATT2}` watts)" + fi + echo -e "${idsCL[Default]}" + + DIVIDER . lightCyan 75 + + echo -e "${idsCL[White]}NetworkRack Amps ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${NETRK_AMP}`'amps ${idsCL[Default]}~ estimate${idsCL[Green]}${idsCL[Default]}" + MSG="${idsCL[White]}NetworkRack Wattage ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${NETRK_WATT} 2 true`'watts ${idsCL[Default]}~ estimate" + echo -en "${MSG}" + if [ "${avgdays}" != "" ]; then + echo -en "${idsCL[LightYellow]} Calculating average ...${idsCL[Default]}" + average=$(AVERAGEPOWER ${PW_POWERSENSOR_ID['network-rack']} ${avgdays}); average_disp="${idsCL[LightYellow]} `IDS_NUMBER_FORMAT ${average}`'watts" + echo -en "\r\033[K"; echo -en "${MSG}${idsCL[LightYellow]}${average_disp}" + else + echo -en " ${idsCL[LightCyan]}(`IDS_NUMBER_FORMAT ${NETRK_WATT2}` watts)" + fi + echo -e "${idsCL[Default]}" + + # echo + DIVIDER . lightCyan 75 + + echo -e "${idsCL[White]}Server Room Voltage IN ${idsCL[Default]}: ${idsCL[Green]}${SVRRM_VOLTIN}'volts${idsCL[Default]}" + echo -e "${idsCL[White]}Server Room Voltage OUT ${idsCL[Default]}: ${idsCL[Green]}${SVRRM_VOLTOUT}'volts${idsCL[Default]}" + echo -e "${idsCL[LightCyan]}Voltage Drop ${idsCL[Default]}: ${idsCL[LightRed]}${VOLT_DROP}'volts${idsCL[Default]}" + echo -e "${idsCL[White]}Server Room Amps ${idsCL[Default]}: ${idsCL[Green]}${SVRRM_AMP}'amps${idsCL[Default]}" + + MSG="${idsCL[White]}Server Room Wattage ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${SVRRM_WATT}`'watts" + echo -en "${MSG}" + if [ "${avgdays}" != "" ]; then + echo -en "${idsCL[LightYellow]} Calculating average ...${idsCL[Default]}" + average=$(AVERAGEPOWER ${PW_POWERSENSOR_ID['total']} ${avgdays}); average_disp="${idsCL[LightYellow]} `IDS_NUMBER_FORMAT ${average}`'watts" + echo -en "\r\033[K"; echo -e "${MSG}${idsCL[LightYellow]}${average_disp}${idsCL[Default]}" + else + echo -e "${idsCL[Default]}" + fi + echo + + fi + + if ([ "${STYPE}" == "" ] || [ "${STYPE}" == "offsite" ]) && [ "${PTYPE}" != "esxi" ]; then + + DIVIDER . yellow 75 + echo -e "${idsCL[Yellow]}Offsite Power Information ${idsCL[LightYellow]}${avgdayshdr}" + DIVIDER . yellow 75 + + echo -en "${idsCL[Yellow]}Pulling data from 'Offsite' ... " + + upsinfo=$(ssh -q -o ConnectTimeout=1 -o ConnectionAttempts=1 admin@10.2.1.1 'upsc CP1500PFCLCD') + if [ "$(echo "${upsinfo}" | grep 'input.voltage:')" != "" ]; then + OFFSITE_VOLTIN=$(echo "${upsinfo}" | grep 'input.voltage:' | sed 's/.*: //') + OFFSITE_VOLTOUT=$(echo "${upsinfo}" | grep 'output.voltage:' | sed 's/.*: //') + OFFSITE_LOAD=$(echo "${upsinfo}" | grep 'ups.load:' | sed 's/.*: //') + OFFSITE_LOAD=`echo "scale=2; ${OFFSITE_LOAD}/100" | bc` + OFFSITE_WATTS=`echo "scale=2; ${OFFSITE_LOAD}*$(echo "${upsinfo}" | grep 'ups.realpower.nominal:' | sed 's/.*: //')" | bc` + OFFSITE_AMPS=`echo "scale=2; ${OFFSITE_WATTS}/${OFFSITE_VOLTOUT}" | bc` + (( $(bc <<<"${OFFSITE_AMPS} < 1") )) && [[ "${OFFSITE_AMPS}" = *"."* ]] && OFFSITE_AMPS="0${OFFSITE_AMPS}" + OFFSITE_BATT_RUNTIME=$(echo "${upsinfo}" | grep 'battery.runtime:' | sed 's/.*: //') + OFFSITE_BATT_RUNTIME=`echo "scale=2; ${OFFSITE_BATT_RUNTIME}/60" | bc` + OFFSITE_BATT_CAP=$(echo "${upsinfo}" | grep 'battery.charge:' | sed 's/.*: //') + + # vHOSTFAN=$(ssh root@${PW_RACADM_ACCESS} racadm -r 10.2.1.21 -u ${PW_ESXI_USER} -p "'${PW_ESXI_PASS}'" getsensorinfo | grep "System Board Fan1" 2>&1) + # FanSpeed=$(echo ${vHOSTFAN} | awk '/ / {print $8}' | sed -e 's/%//g') + + # OFFSITE_VOLTIN=$(snmpwalk -t 1 -r 0 -v 1 -c public 10.2.1.100 iso.3.6.1.4.1.3808.1.1.1.3.2.1.0 | sed 's/.*: //') + # OFFSITE_VOLTIN=`echo "scale=2; ${OFFSITE_VOLTIN}/10" | bc` + # OFFSITE_VOLTOUT=$(snmpwalk -t 1 -r 0 -v 1 -c public 10.2.1.100 iso.3.6.1.4.1.3808.1.1.1.4.2.1.0 | sed 's/.*: //') + # OFFSITE_VOLTOUT=`echo "scale=2; ${OFFSITE_VOLTOUT}/10" | bc` + # OFFSITE_LOAD=$(snmpwalk -t 1 -r 0 -v 1 -c public 10.2.1.100 iso.3.6.1.4.1.3808.1.1.1.4.2.3.0 | sed 's/.*: //') + # OFFSITE_LOAD=`echo "scale=2; ${OFFSITE_LOAD}/100" | bc` + # OFFSITE_WATTS=`echo "scale=2; ${OFFSITE_LOAD}*900" | bc` + # OFFSITE_AMPS=`echo "scale=2; ${OFFSITE_WATTS}/${OFFSITE_VOLTOUT}" | bc` + # OFFSITE_BATT_RUNTIME=$(snmpwalk -t 1 -r 0 -v 1 -c public 10.2.1.100 iso.3.6.1.2.1.33.1.2.3.0 | sed 's/.*: //') + # OFFSITE_BATT_CAP=$(snmpwalk -t 1 -r 0 -v 1 -c public 10.2.1.100 iso.3.6.1.2.1.33.1.2.4.0 | sed 's/.*: //') + + fi + + echo -en "\r\033[K" + echo -e "${idsCL[White]}UPS Voltage In ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${OFFSITE_VOLTIN}`'volts${idsCL[Default]}" + echo -e "${idsCL[White]}UPS Voltage Out ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${OFFSITE_VOLTOUT}`'volts${idsCL[Default]}" + echo + + echo -e "${idsCL[White]}Battery Capacity ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${OFFSITE_BATT_CAP}`%${idsCL[Default]}" + echo -e "${idsCL[White]}Battery Runtime ${idsCL[Default]}: ${idsCL[Green]}${OFFSITE_BATT_RUNTIME}'Mins${idsCL[Default]}" + echo + + echo -e "${idsCL[White]}Total Amps ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${OFFSITE_AMPS}`'amps ${idsCL[Default]}~ estimate${idsCL[Green]}${idsCL[Default]}" + MSG="${idsCL[White]}Total Wattage ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${OFFSITE_WATTS}`'watts ${idsCL[Default]}~ estimate" + echo -en "${MSG}" + if [ "${avgdays}" != "" ]; then + echo -en "${idsCL[LightYellow]} Calculating average ...${idsCL[Default]}" + average=$(AVERAGEPOWER ${PW_POWERSENSOR_ID['offsite-ups']} ${avgdays}); average_disp="${idsCL[LightYellow]} `IDS_NUMBER_FORMAT ${average}`'watts" + echo -en "\r\033[K"; echo -e "${MSG}${idsCL[LightYellow]}${average_disp}" + fi + echo -e "${idsCL[Default]}\n" + + # echo -e "${idsCL[LightCyan]}Current Fan Speed ${idsCL[Default]}: ${idsCL[Green]}${FanSpeed}'%${idsCL[Default]}" + # echo + fi + + if [ "${PTYPE}" != "power" ]; then + DIVIDER . yellow 75 + echo -e "${idsCL[Yellow]}ESXi Host Power Information ${avgdayshdr}" + DIVIDER . yellow 75 + + for SENSOR in ${PW_SENSOR_ORD[@]}; do + if [ "${PW_HOST_IDRACS[${SENSOR}]}" != "" ]; then + gochk=0 + if [ "${STYPE}" == "" ] || ([ "${STYPE}" == "mainsite" ] && [[ "${PW_HOST_IDRACS[${SENSOR}]}" = *"10.10."* ]]) || ([ "${STYPE}" == "offsite" ] && [[ "${PW_HOST_IDRACS[${SENSOR}]}" = *"10.2.1."* ]]); then + gochk=1 + fi + if [ ${gochk} -eq 1 ]; then + echo -en "${idsCL[Yellow]}Pulling data for '${SENSOR}' ... " + + HOST_WATT_SENSORS=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_HOST_IDRACS[${SENSOR}]} iso.3.6.1.4.1.674.10892.5.4.600.30.1.8.1 -O vq 2> /dev/null | sed -e 's/"//g') + IFS=$'\n' + read -rd '' -a HOST_WATT_SENSORS <<<"${HOST_WATT_SENSORS}" + unset IFS + PS1='0.0'; PS2='0.0'; HOST_WATTS=0 + if [ "${HOST_WATT_SENSORS}" != "" ]; then + found=0 + for s in {1..5}; do + DP=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_HOST_IDRACS[${SENSOR}]} iso.3.6.1.4.1.674.10892.5.4.600.30.1.8.1.${s} | sed 's/.*: //') + if [[ "${DP}" = *"System Board"* ]]; then + found=1 + HOST_WATTS=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_HOST_IDRACS[${SENSOR}]} iso.3.6.1.4.1.674.10892.5.4.600.30.1.6.1.${s} | sed 's/.*: //') + + elif [[ "${DP}" = *"PS1"* ]]; then + PS1=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_HOST_IDRACS[${SENSOR}]} iso.3.6.1.4.1.674.10892.5.4.600.30.1.6.1.${s} | sed 's/.*: //') + elif [[ "${DP}" = *"PS2"* ]]; then + PS2=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_HOST_IDRACS[${SENSOR}]} iso.3.6.1.4.1.674.10892.5.4.600.30.1.6.1.${s} | sed 's/.*: //') + fi + done + if [ ${found} -eq 1 ] && [ "${HOST_WATTS}" != "0" ] && [ "${HOST_WATTS}" != "" ]; then + [ "${PS1}" != "0.0" ] && PS1=`echo "scale=1; ${PS1}/10" | bc` && (( $(bc <<<"${PS1} < 1") )) && [[ "${PS1}" = *"."* ]] && PS1="0${PS1}" + [ "${PS2}" != "0.0" ] && PS2=`echo "scale=1; ${PS2}/10" | bc` && (( $(bc <<<"${PS2} < 1") )) && [[ "${PS2}" = *"."* ]] && PS2="0${PS2}" + HOST_AMPS=`echo "scale=1; ${PS1}+${PS2}" | bc` + HOST_WATTS_disp="${idsCL[Green]}${HOST_AMPS}'amps - `IDS_NUMBER_FORMAT ${HOST_WATTS}`'watts" + + elif [ "$(ipmitool -I lanplus -H ${PW_HOST_IDRACS[${SENSOR}]} -U ${PW_ESXI_USER} -P "${PW_ESXI_PASS}" chassis power status | grep off)" != "" ]; then + HOST_WATTS_disp="${idsCL[LightRed]}Host powered down" + HOST_WATTS=-1 + + elif [ "${HOST_WATTS}" == "0" ]; then + HOST_WATTS_disp="${idsCL[Yellow]}Host PSU not capable" + + else + HOST_WATTS_disp="${idsCL[LightRed]}Could not pull data" + + fi + + [ "${HOST_WATTS}" == "" ] && HOST_WATTS=0 + + else + HOST_WATTS_disp="${idsCL[LightRed]}Host offline" + fi + + MSG="${idsCL[White]}${SENSOR} ${idsCL[Default]}: ${HOST_WATTS_disp}" + echo -en "\r\033[K${MSG}" + + if [ "${HOST_WATT_SENSORS}" != "" ]; then + if [ "${avgdays}" != "" ] && [ ${HOST_WATTS} -gt 0 ]; then + echo -en "${idsCL[LightYellow]} Calculating average ...${idsCL[Default]}" + average=$(AVERAGEPOWER ${PW_POWERSENSOR_ID[${SENSOR}]} ${avgdays}); average_disp="${idsCL[LightYellow]} `IDS_NUMBER_FORMAT ${average}`'watts" + echo -en "\r\033[K"; echo -en "${MSG}${idsCL[LightYellow]}${average_disp}" + elif [ ${HOST_WATTS} -gt 0 ]; then + echo -en "${idsCL[Cyan]} [PS1=${idsCL[LightCyan]}${PS1}'A${idsCL[Cyan]}, PS2=${idsCL[LightCyan]}${PS2}'A${idsCL[Cyan]}]" + fi + if [ "${PW_HOST_IDRACS[${SENSOR}]}" == "10.2.1.21" ] && [ ${HOST_WATTS} -ge 0 ]; then + vHOSTFAN=$(snmpwalk -v 1 -c public -t 2 ${PW_HOST_IDRACS[${SENSOR}]} .1.3.6.1.4.1.674.10892.5.4.700.12.1.6.1.3 -O vq) + FanSpeed=`echo "scale=2; ${vHOSTFAN}/21200" | bc`; FanSpeed=`echo "scale=0; ${FanSpeed}*100/1" | bc` + # vHOSTFAN=$(ssh root@${PW_RACADM_ACCESS} racadm -r ${PW_HOST_IDRACS[${SENSOR}]} -u ${PW_ESXI_USER} -p "'${PW_ESXI_PASS}'" getsensorinfo | grep "System Board Fan1" 2>&1) + # FanSpeed=$(echo ${vHOSTFAN} | awk '/ / {print $8}' | sed -e 's/%//g') + echo -en "${idsCL[LightCyan]} [FanSpeed=${FanSpeed}'%]" + fi + fi + + echo -e "${idsCL[Default]}" + fi + fi + done + fi + + + end=`date +%s`; runtime=$((end-start)); echo -e "\nruntime: ${runtime}" + [ "${PW_ACTION}" != "" ] && echo +} + +CHECKPOWER_SERVICE(){ + touch ${PW_TMPFOLDER}/power.ac.start + touch ${PW_TMPFOLDER}/power.dc.start + while true; do + INVSTATSINFO=$(curl -s "http://${PW_INVERTER_IP}/stats.json") + SVRRM_UPS_INPUTACV=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_UPS_IP} iso.3.6.1.4.1.850.1.1.3.1.3.2.2.1.3.1.1 | sed 's/.*: //') + + if (( $(bc <<<"${SVRRM_UPS_INPUTACV} < ${min_acvolt}") )); then + if [ ! -f ${PW_TMPFOLDER}/power.ups.low ]; then + touch ${PW_TMPFOLDER}/power.ups.low + + elif [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/power.ups.low)) -ge 60 ]; then + SENDNOTICE "POWER ALERT - UPS POWER OFF/LOW POWER!!" "UPS has no power for 1min, shutting all servers down!" 1 + + + ######################### FINISH + + + fi + + elif [ -f ${PW_TMPFOLDER}/power.ups.low ]; then + rm -f ${PW_TMPFOLDER}/power.ups.low + fi + + if [ "${INVSTATSINFO}" != "" ]; then + INPUTACV=$(echo ${INVSTATSINFO} | jq '.inputs .inV') + BATTVOLT=$(echo ${INVSTATSINFO} | jq '.inputs .battV') + [ ! "${last_battvolt}" ] && last_battvolt=${BATTVOLT} + + if (( $(bc <<<"${INPUTACV} >= ${min_acvolt}") )); then + [ "${last_battvolt}" != "${BATTVOLT}" ] && last_battvolt=${BATTVOLT} + if [ -f ${PW_TMPFOLDER}/power.ac.low ]; then + echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${INPUTACV}'volts / ${BATTVOLT}'volts - Back to Normal Voltage" >> ${PW_LOGPOWER} + SENDNOTICE "POWER NOMINAL AGAIN" "Normal voltage detected +VOLTAGE: ${INPUTACV}'volts" + else + [ $(expr `date +%s` - $(stat -c %Y ${PW_LOGPOWER})) -ge $(echo "scale=0; ${PW_LOG_INTERVAL_NORMAL}*60" | bc) ] && echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${INPUTACV}'volts - Normal Voltage" >> ${PW_LOGPOWER} + if [ -f ${PW_TMPFOLDER}/power.ac.start ]; then + SENDNOTICE "Power Nominal" "Service Startup +Normal voltage detected +VOLTAGE: ${INPUTACV}'volts +BATT VOLTAGE: ${BATTVOLT}'volts" + echo "($(date +'%Y-%m-%d %H:%M:%S')) - Input: ${INPUTACV}'volts - 'Check Power' Service Startup - Normal voltage detected" >> ${PW_LOGFILE} + echo "($(date +'%Y-%m-%d %H:%M:%S')) - Input: ${INPUTACV}'volts - 'Check Power' Service Startup - Normal voltage detected" >> ${PW_LOGPOWER} + rm -f ${PW_TMPFOLDER}/power.ac.start + fi + fi + if [ ! -f ${PW_TMPFOLDER}/power.ac.good ]; then + + if [ -f ${PW_TMPFOLDER}/power.sys.off ] || [ -f ${PW_TMPFOLDER}/power.main.off ] || [ -f ${PW_TMPFOLDER}/power.ac.conserve ]; then + SENDNOTICE "HOSTS POWER" "Power restored! Will wait ${PW_WAIT_TO_POWER_SERVERS}'mins before turning host(s) back on" + touch ${PW_TMPFOLDER}/.power.restored + fi + + rm -f ${PW_TMPFOLDER}/power.ac.* + touch ${PW_TMPFOLDER}/power.ac.good + + elif [ -f ${PW_TMPFOLDER}/.power.restored ] && [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/.power.restored)) -ge $(echo "scale=0; ${PW_WAIT_TO_POWER_SERVERS}*60" | bc) ]; then + HOSTMGMT mainsite -p on >/dev/null 2>&1 + rm -f ${PW_TMPFOLDER}/.power.restored + fi + + # UPDATE APC-PDU LINE TO LINE VOLTAGE + CURRENT_VOLTAGE=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_APCPDU_IP} .1.3.6.1.4.1.318.1.1.12.1.15.0 | sed 's/.*: //') + SET_VOLTAGE=`echo "scale=2; $(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_UPS_IP} iso.3.6.1.4.1.850.1.1.3.1.3.3.2.1.2.1.1 | sed 's/.*: //')/10" | bc | awk '{print int($1+0.5)}'` + [ "${SET_VOLTAGE}" ] && [ ${CURRENT_VOLTAGE} -ne ${SET_VOLTAGE} ] && run=$(snmpset -v 1 -c private ${PW_APCPDU_IP} .1.3.6.1.4.1.318.1.1.12.1.15.0 i ${SET_VOLTAGE} >/dev/null 2>&1) && echo -e "($(date +'%Y-%m-%d %H:%M:%S')) - ${CURRENT_VOLTAGE}'volts --> ${SET_VOLTAGE}'volts - LINE-TO-LINE VOLTAGE UPDATED ON APC-PDU" >> ${PW_LOGPOWER} + + else + [ $(expr `date +%s` - $(stat -c %Y ${PW_LOGPOWER})) -ge 300 ] && echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${INPUTACV}'volts / ${BATTVOLT}'volts - Power OFF or LOW" >> ${PW_LOGPOWER} + if [ -f ${PW_TMPFOLDER}/power.ac.good ]; then + echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${INPUTACV}'volts / ${BATTVOLT}'volts - Power OFF or LOW voltage detected" >> ${PW_LOGPOWER} + SENDNOTICE "POWER ALERT - POWER OFF/LOW!!" "Power off or low voltage detected +VOLTAGE: ${INPUTACV}'volts +BATT VOLTAGE: ${BATTVOLT}'volts" 1 + rm -f ${PW_TMPFOLDER}/power.ac.good + touch ${PW_TMPFOLDER}/power.ac.low + + ##### SHUTDOWN OFFSITE SERVER WHILE ITS AT MAINSITE + SHUTDOWN_SERVER 10.2.1.11 & + + + fi + if [ ! -f ${PW_TMPFOLDER}/power.ac.conserve ] && [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/power.ac.low)) -ge $(echo "scale=0; ${PW_CONSERVE_AFTER}*60" | bc) ]; then + echo -e "($(date +'%Y-%m-%d %H:%M:%S')) - ${INPUTACV}'volts / ${BATTVOLT}'volts - Shutting down iSCSI VM's and Host to conserve power" >> ${PW_LOGPOWER} + SENDNOTICE "POWER ALERT - Conserving Power" "Shutting down iSCSI VM's and Host to conserve power" 1 + SHUTDOWN_SERVER ${PW_HOST_IDRACS['iDS-vMS-Host0']} & + touch ${PW_TMPFOLDER}/power.ac.conserve + fi + fi + + if (( $(bc <<<"${BATTVOLT} >= ${min_battvolt}") )); then + [ $(expr `date +%s` - $(stat -c %Y ${PW_LOGPOWER})) -ge $(echo "scale=0; ${PW_LOG_INTERVAL_NORMAL}*60" | bc) ] && echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${BATTVOLT}'volts - Battery Voltage" >> ${PW_LOGPOWER} + if [ -f ${PW_TMPFOLDER}/power.dc.start ]; then + echo "($(date +'%Y-%m-%d %H:%M:%S')) - Battery: ${BATTVOLT}'volts - Service Startup - Normal voltage detected" >> ${PW_LOGPOWER} + rm -f ${PW_TMPFOLDER}/power.dc.start + fi + if [ ! -f ${PW_TMPFOLDER}/power.dc.good ]; then + rm -f ${PW_TMPFOLDER}/power.dc.* + touch ${PW_TMPFOLDER}/power.dc.good + fi + + else + [ -f ${PW_TMPFOLDER}/power.dc.good ] && rm -f ${PW_TMPFOLDER}/power.dc.good + [ $(expr `date +%s` - $(stat -c %Y ${PW_LOGPOWER})) -ge $(echo "scale=0; ${PW_LOG_INTERVAL_ABNORMAL}*60" | bc) ] && echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${BATTVOLT}'volts - LOW BATTERY Voltage" >> ${PW_LOGPOWER} + + if (( $(bc <<<"${BATTVOLT} <= ${min_battvolt_sys}") )); then + [ ! -f ${PW_TMPFOLDER}/power.dc.critlow ] && touch ${PW_TMPFOLDER}/power.dc.critlow + + if [ ! -f ${PW_TMPFOLDER}/power.sys.off ] && (( $(bc <<<"${INPUTACV} < ${min_acvolt}") )); then + echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${BATTVOLT}'volts - Shutting down all remaining servers..." >> ${PW_LOGFILE} + echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${BATTVOLT}'volts - Shutting down all remaining servers..." >> ${PW_LOGPOWER} + SENDNOTICE "BATT-VOLT REALLY LOW: SHUTDOWN SYS SERVERS" "Battery Voltage REALLY LOW: ${BATTVOLT}'volts +Shutting down all remaining servers" 1 + SHUTDOWN_SYS POWER & + + fi + + elif (( $(bc <<<"${BATTVOLT} < ${min_battvolt}") )); then + [ ! -f ${PW_TMPFOLDER}/power.dc.low ] && touch ${PW_TMPFOLDER}/power.dc.low + + if [ ! -f ${PW_TMPFOLDER}/power.main.off ] && (( $(bc <<<"${INPUTACV} < ${min_acvolt}") )); then + echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${BATTVOLT}'volts - Shutting down main servers..." >> ${PW_LOGFILE} + echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${BATTVOLT}'volts - Shutting down main servers..." >> ${PW_LOGPOWER} + SENDNOTICE "BATT-VOLT LOW: SHUTDOWN MAIN SERVERS" "Battery Voltage LOW: ${BATTVOLT}'volts +Shutting down main servers" 1 + SHUTDOWN_MAIN POWER & + + fi + + elif [ ! -f ${PW_TMPFOLDER}/power.main.off ] && [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/power.dc.low)) -ge $(echo "scale=0; ${PW_SHUTDOWN_MAINSERVERS_AFTER}*60" | bc) ]; then + echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${BATTVOLT}'volts - Shutting down main servers..." >> ${PW_LOGFILE} + echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${BATTVOLT}'volts - Shutting down main servers..." >> ${PW_LOGPOWER} + SENDNOTICE "BATT-VOLT LOW: SHUTDOWN MAIN SERVERS" "Battery Voltage LOW: ${BATTVOLT}'volts +Shutting down main servers" 1 + SHUTDOWN_MAIN POWER & + fi + + volt_diff=`echo "scale=1; ${last_battvolt}-${BATTVOLT}" | bc` + (( $(bc <<<"${volt_diff} < 0") )) && volt_diff=`echo "scale=1; ${volt_diff} * -1" | bc` + if (( $(bc <<<"${volt_diff} > 0.5") )); then + SENDNOTICE "BATTERY VOLTAGE CHANGE" "Battery Voltage: ${BATTVOLT}'volts" + echo -e "($(date +'%Y-%m-%d %H:%M:%S')) - ${BATTVOLT}'volts - Battery Voltage Change" >> ${PW_LOGPOWER} + last_battvolt=${BATTVOLT} + fi + + fi + + else + sleep 20s + fi + + ######offsite check + +# if [ "$(CHECK_HOST 10.2.1.1)" != "false" ]; then +# upsinfo=$(ssh admin@10.2.1.1 'upsc CP1500PFCLCD') +# OFFSITE_VOLTIN=$(echo "${upsinfo}" | grep 'input.voltage:' | sed 's/.*: //') +# OFFSITE_BATT_RUNTIME=$(echo "${upsinfo}" | grep 'battery.runtime:' | sed 's/.*: //') +# OFFSITE_BATT_RUNTIME=`echo "scale=2; ${OFFSITE_BATT_RUNTIME}/60" | bc` +# OFFSITE_BATT_CAP=$(echo "${upsinfo}" | grep 'battery.charge:' | sed 's/.*: //') +# +# if (( $(bc <<<"${OFFSITE_VOLTIN} >= ${min_acvolt}") )); then +# if [ -f ${PW_TMPFOLDER}/power.offsite.ac.low ]; then +# echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${OFFSITE_VOLTIN}'volts - Offsite Back to Normal Voltage" >> ${PW_LOGPOWER} +# echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${OFFSITE_VOLTIN}'volts - OFFSITE POWER NOMINAL AGAIN" >> ${PW_LOGFILE} +# SENDNOTICE "OFFSITE POWER NOMINAL AGAIN" "Normal voltage detected +# VOLTAGE: ${OFFSITE_VOLTIN}'volts" +# rm -f ${PW_TMPFOLDER}/power.offsite.ac.* +# fi +# if [ -f ${PW_TMPFOLDER}/power.offsite.off ]; then +# if [ ! -f ${PW_TMPFOLDER}/power.offsite.restored ]; then +# touch ${PW_TMPFOLDER}/power.offsite.restored +# +# elif [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/power.offsite.restored)) -ge 60 ]; then +# SENDNOTICE "OFFSITE HOST POWER" "Powering offsite host(s) back on after power was restored" +# for offsite_host in "${PW_OFFSITEHOSTS[@]}"; do +# HOSTPOWER ${offsite_host} on >/dev/null 2>&1 +# done +# rm -f ${PW_TMPFOLDER}/power.offsite.* +# fi +# +# else +# [ $(expr `date +%s` - $(stat -c %Y ${PW_LOGPOWER})) -le 300 ] && echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${OFFSITE_VOLTIN}'volts - Offsite Normal Voltage" >> ${PW_LOGPOWER} +# fi +# else +# echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${OFFSITE_VOLTIN}'volts - OFFSITE POWER OFF/LOW POWER" >> ${PW_LOGPOWER} +# echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${OFFSITE_VOLTIN}'volts - OFFSITE POWER OFF/LOW POWER" >> ${PW_LOGFILE} +# +# if [ ! -f ${PW_TMPFOLDER}/power.offsite.ac.low ] || [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/power.offsite.ac.low)) -ge 240 ]; then +# SENDNOTICE "OFFSITE POWER ALERT - POWER OFF/LOW!!" "Power off or low voltage detected +# BATT CAPACITY: ${OFFSITE_BATT_CAP}'%25 +# BATT RUNTIME: ${OFFSITE_BATT_RUNTIME}'Mins" 1 +# touch ${PW_TMPFOLDER}/power.offsite.ac.low +# fi +# +# if (( $(bc <<<"${OFFSITE_BATT_CAP} <= 95") )) && [ ! -f ${PW_TMPFOLDER}/power.offsite.off ]; then +# SENDNOTICE "OFFSITE HOST POWER" "Powering DOWN offsite host(s) due to power outage" 1 +# SHUTDOWN_OFFSITE & +# touch ${PW_TMPFOLDER}/power.offsite.off +# fi +# fi +# +# +# fi + + sleep 10s + done # & +} + +POWERLOGGER_SERVICE(){ + while true; do + LogDataTime=`date +'%Y-%m-%d %H:%M:%S'` + + INVSTATSINFO=$(curl -s "http://${PW_INVERTER_IP}/stats.json") + if [ "${INVSTATSINFO}" != "" ]; then + INPUTV=`echo ${INVSTATSINFO} | jq '.inputs .inV'` + INPUTA=`echo ${INVSTATSINFO} | jq '.inputs .inA'` + OUTPUTV=`echo ${INVSTATSINFO} | jq '.outputs .outV'` + OUTPUTA=`echo ${INVSTATSINFO} | jq '.outputs .outA'` + OUTPUTW=`echo ${INVSTATSINFO} | jq '.outputs .outW'` + BATTV=`echo ${INVSTATSINFO} | jq '.inputs .battV'` + BATTA=`echo ${INVSTATSINFO} | jq '.inputs .xfA'` + + QRY="INSERT INTO power_data (\`sensorid\`, \`date\`, \`volt\`, \`amp\`) VALUES ('${PW_POWERSENSOR_ID['inv-in']}','${LogDataTime}','${INPUTV}','${INPUTA}')" + ${mysql_conn} -e "USE servermonitor; ${QRY}" + QRY="INSERT INTO power_data (\`sensorid\`, \`date\`, \`volt\`, \`amp\`, \`watt\`) VALUES ('${PW_POWERSENSOR_ID['inv-out']}','${LogDataTime}','${OUTPUTV}','${OUTPUTA}','${OUTPUTW}')" + ${mysql_conn} -e "USE servermonitor; ${QRY}" + QRY="INSERT INTO power_data (\`sensorid\`, \`date\`, \`volt\`, \`amp\`) VALUES ('${PW_POWERSENSOR_ID['battery']}','${LogDataTime}','${BATTV}','${BATTA}')" + ${mysql_conn} -e "USE servermonitor; ${QRY}" + + QRY="INSERT INTO inv_jsonstats (\`date\`, \`data\`) VALUES ('${LogDataTime}','${INVSTATSINFO}')" + ${mysql_conn} -e "USE servermonitor; ${QRY}" + fi + + if [ "$(CHECK_HOST ${PW_UPS_IP})" != "false" ]; then + SVRRM_VOLT=$(snmpwalk -v 1 -c public ${PW_UPS_IP} iso.3.6.1.4.1.850.1.1.3.1.3.3.2.1.2.1.1 | sed 's/.*: //') + SVRRM_VOLT=`echo "scale=1; ${SVRRM_VOLT}/10" | bc` + SVRRM_WATT=$(snmpwalk -v 1 -c public ${PW_UPS_IP} iso.3.6.1.4.1.850.1.1.3.1.3.3.2.1.4.1.1 | sed 's/.*: //') + SVRRM_AMP=$(snmpwalk -v 1 -c public ${PW_UPS_IP} iso.3.6.1.4.1.850.1.1.3.1.3.3.2.1.3.1.1 | sed 's/.*: //') + SVRRM_AMP=`echo "scale=2; ${SVRRM_AMP}/100" | bc` + + QRY="INSERT INTO power_data (\`sensorid\`, \`date\`, \`volt\`, \`amp\`, \`watt\`) VALUES ('${PW_POWERSENSOR_ID['total']}','${LogDataTime}','${SVRRM_VOLT}','${SVRRM_AMP}','${SVRRM_WATT}')" + ${mysql_conn} -e "USE servermonitor; ${QRY}" + fi + + if [ "$(CHECK_HOST ${PW_APCPDU_IP})" != "false" ]; then + APCPDU_AMP=$(snmpwalk -v 1 -c public ${PW_APCPDU_IP} .1.3.6.1.4.1.318.1.1.12.2.3.1.1.2.1 | sed 's/.*: //') + APCPDU_AMP=`echo "scale=1; ${APCPDU_AMP}/10" | bc` + if [ "${SVRRM_VOLT}" != "" ]; then + APCPDU_WATT=`echo "scale=2; ${APCPDU_AMP}*${SVRRM_VOLT}" | bc` + QRY="INSERT INTO power_data (\`sensorid\`, \`date\`, \`volt\`, \`amp\`, \`watt\`) VALUES ('${PW_POWERSENSOR_ID['server-rack']}','${LogDataTime}','${SVRRM_VOLT}','${APCPDU_AMP}','${APCPDU_WATT}')" + else + QRY="INSERT INTO power_data (\`sensorid\`, \`date\`, \`amp\`) VALUES ('12','${LogDataTime}','${APCPDU_AMP}')" + fi + ${mysql_conn} -e "USE servermonitor; ${QRY}" + fi + + if [ "${SVRRM_VOLT}" != "" ] && [ "${APCPDU_AMP}" != "" ]; then + NETRK_AMP=`echo "scale=2; ${SVRRM_AMP}-${APCPDU_AMP}" | bc` + NETRK_WATT=`echo "scale=0; ${SVRRM_WATT}-${APCPDU_WATT}" | bc` + + QRY="INSERT INTO power_data (\`sensorid\`, \`date\`, \`volt\`, \`amp\`, \`watt\`) VALUES ('${PW_POWERSENSOR_ID['network-rack']}','${LogDataTime}','${SVRRM_VOLT}','${NETRK_AMP}','${NETRK_WATT}')" + ${mysql_conn} -e "USE servermonitor; ${QRY}" + fi + + upsinfo=$(ssh -q -o ConnectTimeout=1 -o ConnectionAttempts=1 admin@10.2.1.1 'upsc CP1500PFCLCD') + if [ "$(echo "${upsinfo}" | grep 'input.voltage:')" != "" ]; then + OFFSITE_VOLTOUT=$(echo "${upsinfo}" | grep 'output.voltage:' | sed 's/.*: //') + OFFSITE_LOAD=$(echo "${upsinfo}" | grep 'ups.load:' | sed 's/.*: //') + OFFSITE_LOAD=`echo "scale=2; ${OFFSITE_LOAD}/100" | bc` + OFFSITE_WATTS=`echo "scale=2; ${OFFSITE_LOAD}*$(echo "${upsinfo}" | grep 'ups.realpower.nominal:' | sed 's/.*: //')" | bc` + OFFSITE_AMPS=`echo "scale=2; ${OFFSITE_WATTS}/${OFFSITE_VOLTOUT}" | bc` + + QRY="INSERT INTO power_data (\`sensorid\`, \`date\`, \`volt\`, \`amp\`, \`watt\`) VALUES ('${PW_POWERSENSOR_ID['offsite-ups']}','${LogDataTime}','${OFFSITE_VOLTOUT}','${OFFSITE_AMPS}','${OFFSITE_WATTS}')" + ${mysql_conn} -e "USE servermonitor; ${QRY}" + fi + + for SENSOR in ${PW_SENSOR_ORD[@]}; do + if [ "${PW_HOST_IDRACS[${SENSOR}]}" != "" ]; then + HOST_WATT_SENSORS=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_HOST_IDRACS[${SENSOR}]} iso.3.6.1.4.1.674.10892.5.4.600.30.1.8.1 -O vq | sed -e 's/"//g') + if [ "${HOST_WATT_SENSORS}" != "" ]; then + IFS=$'\n' + read -rd '' -a HOST_WATT_SENSORS <<<"${HOST_WATT_SENSORS}" + unset IFS + + for s in {1..5}; do + if [[ "$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_HOST_IDRACS[${SENSOR}]} iso.3.6.1.4.1.674.10892.5.4.600.30.1.8.1.${s} | sed 's/.*: //')" = *"System Board"* ]]; then + HOST_WATTS=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_HOST_IDRACS[${SENSOR}]} iso.3.6.1.4.1.674.10892.5.4.600.30.1.6.1.${s} | sed 's/.*: //') + if [[ "${HOST_WATTS}" != *"Timeout"* ]] && [ "${HOST_WATTS}" != "0" ]; then + QRY="INSERT INTO power_data (\`sensorid\`, \`date\`, \`watt\`) VALUES ('${PW_POWERSENSOR_ID[${SENSOR}]}','${LogDataTime}','${HOST_WATTS}')" + ${mysql_conn} -e "USE servermonitor; ${QRY}" + fi + break + fi + done + fi + fi + done + + if [ "$(compgen -G "${PW_TMPFOLDER}/temp.*")" != "" ] || [ "$(compgen -G "${PW_TMPFOLDER}/power.*")" != "" ]; then + sleep ${PW_MYSQL_LOG_INTERVAL_ABNORMAL}m + + else + sleep ${PW_MYSQL_LOG_INTERVAL_NORMAL}m + fi + + done +} \ No newline at end of file diff --git a/inc/temp.inc.sh b/inc/temp.inc.sh new file mode 100644 index 00000000..e7e35f91 --- /dev/null +++ b/inc/temp.inc.sh @@ -0,0 +1,515 @@ +CHECKTEMP(){ + start=`date +%s` + cw=25; + while [ $# -gt 0 ]; do + case "$1" in + -a|-avg) avgdays=${2};; + -S|-sensors) temptype="sensors";; + -e|-esxi) temptype="esxi";; + -s|-search) search=${2};; + esac + shift 1 + done + echo + if [ "${avgdays}" != "" ]; then + [ ${avgdays} -lt 10 ] && avgdays_disp=" ${avgdays}" || avgdays_disp=${avgdays} + echo -e "${idsCL[Cyan]}Sensor Temperature(s) Current / ${idsCL[LightYellow]}${avgdays_disp}DayAVG ${idsCL[Yellow]}warning${idsCL[Default]} / ${idsCL[LightRed]}critical${idsCL[Default]}" + else + avgdays=noavg + echo -e "${idsCL[Cyan]}Sensor Temperature(s) Current ${idsCL[Yellow]}warning${idsCL[Default]} / ${idsCL[LightRed]}critical${idsCL[Default]}" + fi + DIVIDER . yellow 90 + + for SENSOR in ${PW_SENSOR_ORD[@]}; do + + if [ "${search}" == "" ] || [[ "${SENSOR,,}" = *"${search,,}"* ]]; then + + if [ "${PW_SENSOR_TYPE[${SENSOR}]}" == "esxi" ] && [ "${temptype}" != "sensors" ]; then + vHOSTiDRACIP=${PW_HOST_IDRACS[${SENSOR}]} + vHOSTIP=${PW_HOST_ADDRESSES[${SENSOR}]} + vHOSTNAME=${PW_ESXI_HOST_NAMES[${vHOSTiDRACIP}]} + echo -e "\r\033[K${idsCL[White]}${idsST[Bold]}${SENSOR} Host Sensors ${idsST[Reset]}${idsCL[White]}[${vHOSTiDRACIP}]${idsCL[Default]}" + echo -en "${idsCL[Yellow]}Pulling data for '${SENSOR}' ... " + + if [ "$(CHECK_HOST ${vHOSTIP})" != "false" ]; then + vHOST_TEMPNAMES=$(snmpwalk -v 1 -c public -t 2 ${vHOSTiDRACIP} .1.3.6.1.4.1.674.10892.5.4.700.20.1.8 -O vq | sed -e 's/"//g' | sed -e 's/ Temp//g') + IFS=$'\n' + read -rd '' -a vHOST_TEMPNAMES <<<"${vHOST_TEMPNAMES}" + unset IFS + echo -en "\r\033[K" + if [ ${#vHOST_TEMPNAMES[@]} > 1 ]; then + t=1 + for sensorname in "${vHOST_TEMPNAMES[@]}"; do + temp_c=$(snmpwalk -v 1 -c public -t 2 ${vHOSTiDRACIP} .1.3.6.1.4.1.674.10892.5.4.700.20.1.6.1.${t} -O vq | sed -e 's/"//g') + temp_c=`echo "scale=1; ${temp_c}/10" | bc` + temp_warn=$(snmpwalk -v 1 -c public -t 2 ${vHOSTiDRACIP} .1.3.6.1.4.1.674.10892.5.4.700.20.1.11.1.${t} -O vq | sed -e 's/"//g') + temp_warn=`echo "scale=1; ${temp_warn}/10" | bc` + temp_crit=$(snmpwalk -v 1 -c public -t 2 ${vHOSTiDRACIP} .1.3.6.1.4.1.674.10892.5.4.700.20.1.10.1.${t} -O vq | sed -e 's/"//g') + temp_crit=`echo "scale=1; ${temp_crit}/10" | bc` + + c=0; spc=''; spc1=`expr ${cw} - ${#sensorname} - 1`; until [ ${c} = ${spc1} ]; do spc="${spc} "; c=`expr ${c} + 1`; done + + [ "${avgdays}" != "noavg" ] && echo -en "${idsCL[LightCyan]} ${sensorname}${spc}${idsCL[Default]}: ${idsCL[Yellow]}Calculating ${avgdays} Day average ... " + reading=$(CHECKTEMPSENSOR ${SENSOR} ${temp_c} ${temp_warn} ${temp_crit} ${sensorname// /_} ${avgdays}) + [ "${avgdays}" != "noavg" ] && echo -en "\r\033[K" + echo -e "${idsCL[LightCyan]} ${sensorname}${spc}${idsCL[Default]}: ${reading}" + + ((t++)) + done + else + echo -e "${idsCL[LightCyan]} ${vHOSTNAME}${spc}${idsCL[Default]}: No Data" + fi + + else #host down + echo -e "\r\033[K${idsCL[LightRed]}${SENSOR} Host is down" + + # if [ ! -f ${PW_TMPFOLDER}/${SENSOR}.down ] || [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/${SENSOR}.down)) -ge 1800 ]; then + # SENDNOTICE "${vHOSTiDRACIP} ERROR" "${vHOSTNAME} Host is down" 1 + # echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${vHOSTiDRACIP} - ${vHOSTNAME} Host is down" >> ${logtemp} + # touch ${PW_TMPFOLDER}/${EHOST}.down + # fi + fi + echo + + elif [ "${PW_SENSOR_TYPE[${SENSOR}]}" != "esxi" ] && [ "${temptype}" != "esxi" ]; then + [[ "${SENSOR}" == *"CPU-Usage"* ]] && echo -en "\033[1A" + c=0; spc=''; spc1=`expr ${cw} - ${#SENSOR}`; until [ ${c} = ${spc1} ]; do spc="${spc} "; c=`expr ${c} + 1`; done + echo -en "\r\033[K${idsCL[White]}${idsST[Bold]}${SENSOR}${idsST[Reset]}${spc}${idsCL[Default]}: ${idsCL[Yellow]}" + [ "${avgdays}" != "noavg" ] && echo -en "Pulling data and calculating ${avgdays} Day average ... " || echo -en "Pulling data ... " + reading=$(CHECKTEMPSENSOR ${SENSOR} . . . . ${avgdays}) + echo -e "\r\033[K${idsCL[White]}${idsST[Bold]}${SENSOR}${idsST[Reset]}${spc}${idsCL[Default]}: ${reading}" + echo + fi + fi + done + end=`date +%s`; runtime=$((end-start)); echo -e "\nruntime: ${runtime}" + [ "${PW_ACTION}" != "" ] && echo +} + +CHECKTEMPSENSOR(){ + echo ${PW_THRESHOLDS[${1}]} | cut -d',' -f 1 | read temp_warn + echo ${PW_THRESHOLDS[${1}]} | cut -d',' -f 2 | read temp_crit + [ "${PW_SENSOR_TYPE[${1}]}" == "cpu" ] && GAUGESH="'%" || GAUGESH="'F" + + if [ "${6}" != "noavg" ]; then + [ "${6}" != "" ] && [[ "${6}" =~ ^[0-9]+$ ]] && avgdays=${6} || avgdays=3 + if [ "${PW_SENSOR_TYPE[${1}]}" != "esxi" ]; then + average=$(AVERAGETEMP ${PW_SENSOR_ID[${1}]} ${avgdays}) + else + average=$(AVERAGETEMP ${PW_SENSOR_ID[${1}]} ${avgdays} ${5}) + fi + else + average='' + fi + + if [ "${PW_SENSOR_TYPE[${1}]}" == "mqtt" ]; then + mqtt_message=`${mqtt_conn} -t tele/${1}/SENSOR -C 1` + echo ${mqtt_message} | cut -d':' -f 6 | cut -d',' -f 1 | read temp_c + + elif [ "${PW_SENSOR_TYPE[${1}]}" == "system" ]; then + temp_c=$(vcgencmd measure_temp) + temp_c=${temp_c%\'*}; temp_c=${temp_c#*=} + + elif [ "${PW_SENSOR_TYPE[${1}]}" == "remotesystem" ]; then + temp_c=$(ssh -q -o ConnectTimeout=1 -o ConnectionAttempts=1 root@${PW_REMOTE_SENSORS[${1}]} vcgencmd measure_temp) + if [ "${temp_c}" != "" ]; then + temp_c=${temp_c%\'*}; temp_c=${temp_c#*=} + + fi + elif [ "${PW_SENSOR_TYPE[${1}]}" == "esxi" ]; then + temp_c=${2} + temp_warn=`echo $(bc <<< "scale=2; (${3}*1.8+32)/1") | awk '{print int($1+0.5)}'` + temp_crit=`echo $(bc <<< "scale=2; (${4}*1.8+32)/1") | awk '{print int($1+0.5)}'` + + elif [ "${PW_SENSOR_TYPE[${1}]}" == "cpu" ]; then + if [ "${1}" == "Powerwall-CPU-Usage" ]; then + temp_c=$(awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1) "%"; }' <(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat) | sed -e 's/%//g') + else + temp_c=$(ssh -q -o ConnectTimeout=1 -o ConnectionAttempts=1 root@${PW_REMOTE_SENSORS[${1}]} "/opt/idssys/defaults/get-data.sh cpu-usage") + fi + fi + + if [ "${temp_c}" != "null" ] && [ "${temp_c}" != "" ]; then + [ "${PW_SENSOR_TYPE[${1}]}" == "cpu" ] && temp_f=$(echo "scale=2; $temp_c/1" | bc -l) || temp_f=$(bc <<< "scale=1; ${temp_c}*1.8+32") + (( $(bc <<<"${temp_f} < 1") )) && [[ "${temp_f}" = *"."* ]] && temp_f="0${temp_f}" + [ "${1}" == "ServerRoomTH" ] && temp_f=`echo "scale=1; ${temp_f}+${PW_ServerRoomTH_Dev}" | bc` + # echo "HERE: '${temp_c}' -> '${temp_f}'" + # echo -en "" + c=0; spct=''; spc1=`expr 6 - ${#temp_f}`; until [ ${c} = ${spc1} ]; do spct="${spct} "; c=`expr ${c} + 1`; done + + if [ "${average}" != "" ]; then + c=0; spca=''; spc1=`expr 6 - ${#average}`; until [ ${c} = ${spc1} ]; do spca="${spca} "; c=`expr ${c} + 1`; done + if [ "${average}" == "" ]; then + averagedisp="${idsCL[Green]}" + elif [ $(bc -l <<< "${average} >= ${temp_warn}") -eq 1 ] && [ $(bc -l <<< "${average} < ${temp_crit}") -eq 1 ]; then + averagedisp="${idsCL[Yellow]}${average}" + elif [ $(bc -l <<< "${average} >= ${temp_crit}") -eq 1 ]; then + averagedisp="${idsCL[LightRed]}${average}" + else + averagedisp="${idsCL[Green]}${average}" + fi + fi + + if [ $(bc -l <<< "${temp_f} >= ${temp_warn}") -eq 1 ] && [ $(bc -l <<< "${temp_f} < ${temp_crit}") -eq 1 ]; then + [ "${average}" != "" ] && echo -en "${idsCL[Yellow]}WARNING ${spct}${temp_f}${GAUGESH} /${spca}${averagedisp}${GAUGESH}${idsCL[Default]}" || echo -en "${idsCL[Yellow]}WARNING ${spct}${temp_f}${GAUGESH}${idsCL[Default]}" + elif [ $(bc -l <<< "${temp_f} >= ${temp_crit}") -eq 1 ]; then + [ "${average}" != "" ] && echo -en "${idsCL[LightRed]}CRITICAL${spct}${temp_f}${GAUGESH} /${spca}${averagedisp}${GAUGESH}${idsCL[Default]}" || echo -en "${idsCL[LightRed]}CRITICAL${spct}${temp_f}${GAUGESH}${idsCL[Default]}" + else + [ "${average}" != "" ] && echo -en "${idsCL[Green]}Normal ${spct}${temp_f}${GAUGESH} /${spca}${averagedisp}${GAUGESH}${idsCL[Default]}" || echo -en "${idsCL[Green]}Normal ${spct}${temp_f}${GAUGESH}${idsCL[Default]}" + fi + + tmp="${spct}${temp_f}" + c=0; spc=''; spc1=`expr 10 - ${#tmp}`; until [ ${c} = ${spc1} ]; do spc="${spc} "; c=`expr ${c} + 1`; done + [ ${#temp_warn} == 2 ] && spcw=' ' || spcw=' ' + [ ${#temp_crit} == 2 ] && spcc=' ' || spcc=' ' + echo -e "${spc}[${spcw}${idsCL[Yellow]}${temp_warn}${GAUGESH}${idsCL[Default]} /${spcc}${idsCL[LightRed]}${temp_crit}${GAUGESH}=>${idsCL[Default]} ]" + fi +} +AVERAGETEMP(){ + temptotal=0 + daysback=${2} + sensorid=${1} + logsfound=0; + if [ "${3}" != "" ]; then + entityid=($(${mysql_conn} -e "SELECT id FROM servermonitor.entities WHERE BINARY name='${3}' AND sensorid='${sensorid}'")) + entityid=${entityid[1]} + WHERE="sensorid=${sensorid} AND entity=${entityid}" + else + WHERE="sensorid=${sensorid}" + fi + + while IFS=$'\t' read date temp hum ;do + temptotal=$(bc <<< "scale=1; ${temptotal}+${temp}") + ((logsfound++)) + done < <(${mysql_conn} -se "USE servermonitor; SELECT date,temp,hum from sensor_data WHERE ${WHERE} AND date BETWEEN DATE_SUB(DATE(NOW()), INTERVAL ${daysback} DAY) AND NOW() ORDER BY id DESC;") + average=$(bc <<< "scale=1; ${temptotal}/${logsfound}") + (( $(bc <<<"${average} < 1") )) && [[ "${average}" = *"."* ]] && average="0${average}" + echo ${average} + # echo ${logsfound} +} + +SENDDAILY(){ + dailtemp=$(DAILYTEMP) + SENDNOTICE "Daily Temp Readings" "${dailtemp}" +} + +CHECKTEMP_SERVICE(){ + cw=20 + declare -A last_temp + echo -e "($(date +'%Y-%m-%d %H:%M:%S')) - 'Check Temp' Service Startup" >> ${PW_LOGFILE} + while true; do + # start=`date +%s` + # time="$(date +%H)$(date +%M)" + # if [ ! -f ${PW_TMPFOLDER}/temp.* ] && [ $(date +%H)$(date +%M) -ge 0700 ] && [ $(date +%H)$(date +%M) -lt 0705 ]; then + # if [ ! -f ${PW_TMPFOLDER}/.sentdaily ] || [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/.sentdaily)) -gt 600 ]; then + # touch ${PW_TMPFOLDER}/.sentdaily + # SENDDAILY & + # fi + # fi + for SENSORa in ${PW_SENSOR_ORD[@]}; do + logtemp=${PW_LOGFOLDER}/log-temp-${SENSORa} + [ ! -f ${logtemp} ] && touch ${logtemp} + [ $(expr `date +%s` - $(stat -c %Y ${logtemp})) -ge $(echo "scale=0; ${PW_LOG_INTERVAL_NORMAL}*60" | bc) ] && relog=1 || relog=0 + + if ([ "${PW_REMOTE_SENSORS[${SENSORa}]}" != "" ] && [ "$(CHECK_HOST ${PW_REMOTE_SENSORS[${SENSORa}]})" != "false" ]) || ([ "${PW_HOST_ADDRESSES[${SENSORa}]}" != "" ] && [ "$(CHECK_HOST ${PW_HOST_ADDRESSES[${SENSORa}]})" != "false" ]); then + # if ([ "${PW_REMOTE_SENSORS[${SENSORa}]}" != "" ] && [ "$(CHECK_HOST ${PW_REMOTE_SENSORS[${SENSORa}]})" != "false" ]); then + if [ -f ${PW_TMPFOLDER}/${SENSORa}.down ]; then + SENDNOTICE "${SENSORa} Online" "${SENSORa} Sensor is back online" + echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${SENSORa} - Sensor is back online" >> ${logtemp} + rm -f ${PW_TMPFOLDER}/${SENSORa}.down + fi + if [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "esxi" ]; then + vHOST_TEMPNAMES=$(snmpwalk -v 1 -c public -t 2 ${PW_HOST_IDRACS[${SENSORa}]} .1.3.6.1.4.1.674.10892.5.4.700.20.1.8 -O vq | sed -e 's/"//g' | sed -e 's/ Temp//g') + IFS=$'\n' + read -rd '' -a SENSORS_CHECK <<<"${vHOST_TEMPNAMES}" + unset IFS + [ -f ${PW_TMPFOLDER}/power.${SENSORa}.off ] && [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/power.${SENSORa}.off)) -ge 300 ] && rm-f ${PW_TMPFOLDER}/power.${SENSORa}.off + t=1 + + else + SENSORS_CHECK=(${SENSORa}) + fi + if [ "${SENSORS_CHECK}" != "" ]; then + for SENSOR in "${SENSORS_CHECK[@]}"; do + if [ "${PW_THRESHOLDS[${SENSORa}]}" != "" ]; then + echo ${PW_THRESHOLDS[${SENSORa}]} | cut -d',' -f 1 | read temp_warn + echo ${PW_THRESHOLDS[${SENSORa}]} | cut -d',' -f 2 | read temp_crit + [ "$(echo ${PW_THRESHOLDS[${SENSORa}]} | cut -d',' -f 3)" != "" ] && echo ${PW_THRESHOLDS[${SENSORa}]} | cut -d',' -f 3 | read temp_crit_sys || temp_crit_sys=${temp_crit} + fi + + if [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "mqtt" ]; then + mqtt_message=`${mqtt_conn} -t tele/${SENSOR}/SENSOR -C 1` + echo ${mqtt_message} | cut -d':' -f 7 | cut -d',' -f 1 | read temp_h + echo ${mqtt_message} | cut -d':' -f 6 | cut -d',' -f 1 | read temp_c + + elif [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "system" ]; then + temp_c=$(vcgencmd measure_temp) + temp_c=${temp_c%\'*}; temp_c=${temp_c#*=} + temp_h='' + + elif [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "remotesystem" ]; then + temp_c=$(ssh root@${PW_REMOTE_SENSORS[${SENSOR}]} vcgencmd measure_temp) + temp_c=${temp_c%\'*}; temp_c=${temp_c#*=} + temp_h='' + + elif [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "esxi" ]; then + temp_c=$(snmpwalk -v 1 -c public -t 2 ${PW_HOST_IDRACS[${SENSORa}]} .1.3.6.1.4.1.674.10892.5.4.700.20.1.6.1.${t} -O vq | sed -e 's/"//g') + temp_c=`echo "scale=1; ${temp_c}/10" | bc` + temp_warn=$(snmpwalk -v 1 -c public -t 2 ${PW_HOST_IDRACS[${SENSORa}]} .1.3.6.1.4.1.674.10892.5.4.700.20.1.11.1.${t} -O vq | sed -e 's/"//g') + temp_warn=`echo "scale=1; ${temp_warn}/10" | bc` + temp_warn=$(echo "scale=2; ${temp_warn}*1.8 + 32" | bc) + temp_crit=$(snmpwalk -v 1 -c public -t 2 ${PW_HOST_IDRACS[${SENSORa}]} .1.3.6.1.4.1.674.10892.5.4.700.20.1.10.1.${t} -O vq | sed -e 's/"//g') + temp_crit=`echo "scale=1; ${temp_crit}/10" | bc` + temp_crit=$(echo "scale=2; ${temp_crit}*1.8 + 32" | bc) + temp_crit_sys=${temp_crit} + temp_h='' + vSENSOR=${SENSOR} + SENSOR="${SENSORa}-${vSENSOR// /_}" + ((t++)) + + elif [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "cpu" ]; then + if [ "${SENSORa}" == "Powerwall-CPU-Usage" ]; then + temp_c=$(awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1) "%"; }' <(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat) | sed -e 's/%//g') + else + temp_c=$(ssh -q -o ConnectTimeout=1 -o ConnectionAttempts=1 root@${PW_REMOTE_SENSORS[${SENSORa}]} "/opt/idssys/defaults/get-data.sh cpu-usage") + fi + temp_h='' + + fi + [ "${last_temp[${SENSOR//-/}]}" == "" ] && last_temp[${SENSOR//-/}]=0 + + logtemp=${PW_LOGFOLDER}/log-temp-${SENSOR} + if [ "${temp_c}" != "null" ] && [ "${temp_c}" != "" ]; then + [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "cpu" ] && GAUGE="CPU-USAGE" || GAUGE="TEMP" + [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "cpu" ] && GAUGESH='%' || GAUGESH="'F" + if [ -f ${PW_TMPFOLDER}/${SENSOR}-error.reading ]; then + SENDNOTICE "${SENSOR} Data" "${SENSOR} is reporting data again" + echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${SENSOR} - Sensor is reporting data again" >> ${logtemp} + rm -f ${PW_TMPFOLDER}/${SENSOR}-error.reading + + fi + + [ "${PW_SENSOR_TYPE[${SENSOR}]}" == "cpu" ] && temp_f=$(echo "scale=2; $temp_c/1" | bc -l) || temp_f=$(echo "scale=2; ${temp_c}*1.8 + 32" | bc) + [ "${SENSOR}" == "ServerRoomTH" ] && temp_f=`echo "scale=2; ${temp_f}+${PW_ServerRoomTH_Dev}" | bc` + # echo "HERE: [${SENSOR//-/}] - ${last_temp[${SENSOR//-/}]} - ${temp_c} - ${temp_f} - ${temp_warn} - ${temp_crit} - ${temp_crit_sys}" + # [ ! "${temp_c}" ] || [ ! "${temp_f}" ] || [ ! "${temp_warn}" ] || [ ! "${temp_crit}" ] || [ ! "${temp_crit_sys}" ] && echo "VALUE NOT FOUND" + + if [ "${PW_SENSOR_TYPE[${SENSORa}]}" != "esxi" ]; then + echo ${PW_THRESHOLDS[${SENSOR}]} | cut -d',' -f 1 | read temp_warn + echo ${PW_THRESHOLDS[${SENSOR}]} | cut -d',' -f 2 | read temp_crit + echo ${PW_THRESHOLDS[${SENSOR}]} | cut -d',' -f 3 | read temp_crit_sys + fi + + if (( $(bc <<< "${temp_f} < ${temp_warn}") )); then + if (( $(bc <<< "${last_temp[${SENSOR//-/}]} > 1") )); then + SENDNOTICE "${SENSOR} BACK TO NORMAL" "NORMAL TEMP: ${temp_f}${GAUGESH} +Previous Temp: ${last_temp[${SENSOR//-/}]}${GAUGESH}" + echo -e "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - Back to NORMAL ${GAUGE} - Previous ${GAUGE}: ${last_temp[${SENSOR//-/}]}${GAUGESH}" >> ${logtemp} + echo -e "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - ${SENSOR} - Back to NORMAL ${GAUGE}" >> ${PW_LOGFILE} + # [ "$(compgen -G "${PW_TMPFOLDER}/power.*.off")" != "" ] && rm -f ${PW_TMPFOLDER}/power.*.off + + elif [ "${last_temp[${SENSOR//-/}]}" == "0" ]; then + # SENDNOTICE "${SENSOR} TEMP NORMAL" "Service Startup +# NORMAL TEMP: ${temp_f}${GAUGESH}" + echo -e "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - Service Startup - NORMAL ${GAUGE}" >> ${logtemp} + echo -e "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - ${SENSOR} - Service Startup" >> ${PW_LOGFILE} + # [ "$(compgen -G "${PW_TMPFOLDER}/power.*.off")" != "" ] && rm -f ${PW_TMPFOLDER}/power.*.off + + elif [ "${relog}" == "1" ]; then + echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - Normal ${GAUGE}" >> ${logtemp} + + fi + rm -f ${PW_TMPFOLDER}/temp.* + rm -f ${PW_TMPFOLDER}/power.${SENSORa}.off + last_temp[${SENSOR//-/}]=1 + + # iDS-vMS-Offsite Fan Issue Workaround + if [ "${PW_HOST_IDRACS[${SENSORa}]}" == "10.2.1.21" ]; then + vHOSTFAN=$(snmpwalk -v 1 -c public -t 2 ${PW_HOST_IDRACS[${SENSORa}]} .1.3.6.1.4.1.674.10892.5.4.700.12.1.6.1.3 -O vq) + # vHOSTFAN=$(ssh -q -o ConnectTimeout=1 -o ConnectionAttempts=1 root@${PW_RACADM_ACCESS} racadm -r ${PW_HOST_IDRACS[${SENSORa}]} -u ${PW_ESXI_USER} -p "'${PW_ESXI_PASS}'" getsensorinfo | grep "System Board Fan1" 2>&1) + if [ "${vHOSTFAN}" != "" ]; then + FanSpeed=`echo "scale=2; ${vHOSTFAN}/21200" | bc`; FanSpeed=`echo "scale=0; ${FanSpeed}*100" | bc | sed -e 's/.00//g'` + # FanSpeed=$(echo ${vHOSTFAN} | awk '/ / {print $8}' | sed -e 's/%//g') + if [ ${FanSpeed} -lt 26 ] || [ ${FanSpeed} -gt 34 ]; then + # if [ ${FanSpeed} -ne 30 ]; then + SENDNOTICE "${PW_HOST_IDRACS[${SENSORa}]} Fan Issue" "Settings fans back to normal 30%25" + ipmitool -I lanplus -H ${PW_HOST_IDRACS[${SENSORa}]} -U ${PW_ESXI_USER} -P "${PW_ESXI_PASS}" raw 0x30 0x30 0x01 0x00 >/dev/null 2>&1 + ipmitool -I lanplus -H ${PW_HOST_IDRACS[${SENSORa}]} -U ${PW_ESXI_USER} -P "${PW_ESXI_PASS}" raw 0x30 0x30 0x02 0xff 0x1E >/dev/null 2>&1 + fi + fi + fi + + else + ([ ! "${last_temp[${SENSOR//-/}]}" ] || (( $(bc <<< "${last_temp[${SENSOR//-/}]} < 2") ))) && last_temp[${SENSOR//-/}]=${temp_f} + temp_diff=`echo "scale=2; ${last_temp[${SENSOR//-/}]}-${temp_f}" | bc` + [ $(bc -l <<< "${temp_diff} < 0") -eq 1 ] && temp_diff=`echo "scale=2; ${temp_diff}*-1" | bc` + + if [ $(bc -l <<< "${temp_f} >= ${temp_warn}") -eq 1 ] && [ $(bc -l <<< "${temp_f} < ${temp_crit}") -eq 1 ]; then + touch ${PW_TMPFOLDER}/temp.warn + if (( $(bc <<< "${temp_diff} > 1") )) || (( $(bc <<< "${temp_diff} = 1") )); then + SENDNOTICE "${SENSOR} ${GAUGE} WARNING" "WARNING ${GAUGE}: ${temp_f}${GAUGESH} - (Difference of ${temp_diff}')" 1 + last_temp[${SENSOR//-/}]=${temp_f} + echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - WARNING ${GAUGE} - (Difference of ${temp_diff}')" >> ${logtemp} + + # iDS-vMS-Offsite Fan Issue Workaround + if [ "${PW_HOST_IDRACS[${SENSORa}]}" == "10.2.1.21" ] && [ ${FanSpeed} -ne 80 ]; then + SENDNOTICE "${PW_HOST_IDRACS[${SENSORa}]} SERVER WARM" "Setting fan speeds to 80%25" 1 + ipmitool -I lanplus -H ${PW_HOST_IDRACS[${SENSORa}]} -U ${PW_ESXI_USER} -P "${PW_ESXI_PASS}" raw 0x30 0x30 0x01 0x00 >/dev/null 2>&1 + ipmitool -I lanplus -H ${PW_HOST_IDRACS[${SENSORa}]} -U ${PW_ESXI_USER} -P "${PW_ESXI_PASS}" raw 0x30 0x30 0x02 0xff 0x50 >/dev/null 2>&1 + fi + fi + + elif [ $(bc -l <<< "${temp_f} >= ${temp_crit}") -eq 1 ] && [ $(bc -l <<< "${temp_f} < ${temp_crit_sys}") -eq 1 ]; then + if (( $(bc <<< "${temp_diff} > 1") )) || (( $(bc <<< "${temp_diff} = 1") )); then + SENDNOTICE "${SENSOR} ${GAUGE} CRITICAL" "CRITICAL ${GAUGE}: ${temp_f}${GAUGESH} - (Difference of ${temp_diff}')" 1 + echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - CRITICAL - (Difference of ${temp_diff}${GAUGESH})" >> ${logtemp} + echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${SENSOR} - ${temp_f}${GAUGESH} - CRITICAL ${GAUGE} - (Difference of ${temp_diff}')" >> ${PW_LOGFILE} + last_temp[${SENSOR//-/}]=${temp_f} + + if [ "${SENSOR}" == "ServerRoomTH" ] && [ ! -f touch ${PW_TMPFOLDER}/temp.crit ]; then + touch ${PW_TMPFOLDER}/temp.crit + SHUTDOWN_MAIN ${SENSOR} & + echo -e "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - Shutting down MAIN servers" >> ${logtemp} + + # elif [ ! -f ${PW_TMPFOLDER}/power.${SENSORa}.off ]; then + # SENDNOTICE "${SENSORa} TEMP CRITICAL" "Host system and VMs shutting down!!" 1 + # SHUTDOWN_SERVER ${SENSORa} & + # touch ${PW_TMPFOLDER}/power.${SENSORa}.off + + fi + fi + elif [ $(bc -l <<< "${temp_f} >= ${temp_crit_sys}") -eq 1 ]; then + if (( $(bc <<< "${temp_diff} > 1") )) || (( $(bc <<< "${temp_diff} = 1") )); then + SENDNOTICE "${SENSOR} TEMP CRITICAL" "SYSTEM CRITICAL ${GAUGE}: ${temp_f}${GAUGESH} - (Difference of ${temp_diff}')" 1 + echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - SYSTEM CRITICAL - (Difference of ${temp_diff})" >> ${logtemp} + echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - ${SENSOR} - CRITICAL ${GAUGE} SYSTEM - (Difference of ${temp_diff}')" >> ${PW_LOGFILE} + last_temp[${SENSOR//-/}]=${temp_f} + if [ ! -f touch ${PW_TMPFOLDER}/temp.critsys ]; then + touch ${PW_TMPFOLDER}/temp.critsys + [ "${SENSOR}" == "ServerRoomTH" ] && SHUTDOWN_SYS ${SENSOR} TEMP & + SHUTDOWN_CRIT ${SENSOR} & + echo -e "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - Sending system shutdown signals, if applicable. Check main Powerwall Logs" >> ${logtemp} + fi + fi + fi + fi + + [ -f ${PW_TMPFOLDER}/${SENSOR}.insert ] && lastinsert=$(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/${SENSOR}.insert)) || lastinsert=100000 + if [ "$(compgen -G "${PW_TMPFOLDER}/temp.*")" != "" ] || [ "$(compgen -G "${PW_TMPFOLDER}/power.ac.*")" != "" ] || [ "$(compgen -G "${PW_TMPFOLDER}/power.dc.*")" != "" ]; then + wait=$(echo "scale=0; ${PW_MYSQL_LOG_INTERVAL_ABNORMAL}*60" | bc) + else + wait=$(echo "scale=0; ${PW_MYSQL_LOG_INTERVAL_NORMAL}*60" | bc) + fi + + if [ "${PW_SENSOR_ID[${SENSORa}]}" != "" ] && [ ${lastinsert} -ge ${wait} ]; then + if [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "esxi" ]; then + entityid=($(${mysql_conn} -e "SELECT id FROM servermonitor.entities WHERE BINARY name='${vSENSOR// /_}' AND sensorid='${PW_SENSOR_ID[${SENSORa}]}'")) + if [ "${entityid[1]}" == "" ]; then + ${mysql_conn} -e "USE servermonitor; INSERT INTO entities (\`sensorid\`, \`name\`) VALUES ('${PW_SENSOR_ID[${SENSORa}]}','${vSENSOR// /_}')" + entityid=($(${mysql_conn} -e "SELECT id FROM servermonitor.entities WHERE BINARY name='${vSENSOR// /_}' AND sensorid='${PW_SENSOR_ID[${SENSORa}]}'")) + fi + entityid=${entityid[1]} + + QRY="USE servermonitor; INSERT INTO sensor_data (\`sensorid\`, \`entity\`, \`date\`, \`temp\`) VALUES ('${PW_SENSOR_ID[${SENSORa}]}','${entityid}','$(date +'%Y-%m-%d %H:%M:%S')','${temp_f}')" + if [ "${PW_HOST_IDRACS[${SENSORa}]}" == "10.2.1.21" ] && [ "${vSENSOR// /_}" == "System_Board_Inlet" ] && [ "${vHOSTFAN}" != "" ]; then + ${mysql_conn} -e "USE servermonitor; INSERT INTO sensor_data (\`sensorid\`, \`date\`, \`speed\`) VALUES ('14','$(date +'%Y-%m-%d %H:%M:%S')','${FanSpeed}')" + fi + elif [ "${temp_h}" != "" ]; then + QRY="USE servermonitor; INSERT INTO sensor_data (\`sensorid\`, \`date\`, \`temp\`, \`hum\`) VALUES ('${PW_SENSOR_ID[${SENSORa}]}','$(date +'%Y-%m-%d %H:%M:%S')','${temp_f}','${temp_h}')" + else + QRY="USE servermonitor; INSERT INTO sensor_data (\`sensorid\`, \`date\`, \`temp\`) VALUES ('${PW_SENSOR_ID[${SENSORa}]}','$(date +'%Y-%m-%d %H:%M:%S')','${temp_f}')" + fi + ${mysql_conn} -e "${QRY}" + touch ${PW_TMPFOLDER}/${SENSOR}.insert + fi + else + if [ ! -f ${PW_TMPFOLDER}/${SENSOR}-error.reading ] || [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/${SENSOR}-error.reading)) -ge 1800 ]; then + SENDNOTICE "${SENSOR} Sensor ERROR" "ERROR reading sensor data" 1 + echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${SENSOR} Sensor - ERROR reading sensor data" >> ${logtemp} + touch ${PW_TMPFOLDER}/${SENSOR}-error.reading + fi + + fi + + done + + fi + + elif [ "${PW_HOST_ADDRESSES[${SENSORa}]}" == "" ]; then #sensor down + if [ ! -f ${PW_TMPFOLDER}/${SENSORa}.down ] || [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/${SENSORa}.down)) -ge 1800 ]; then + SENDNOTICE "${SENSORa} ERROR" "${SENSORa} Sensor is down" 1 + echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${SENSORa} - ${SENSORa} Sensor is down" >> ${logtemp} + touch ${PW_TMPFOLDER}/${SENSORa}.down + + fi + + fi + + done + + # end=`date +%s`; runtime=$((end-start)); echo "runtime: ${runtime}, pausing for 60secs..." + sleep 10 + done # & +} + +DAILYTEMP(){ + cw=35; + echo + echo -e "Sensor Temperature(s) Now / 1DayAVG / 7DayAVG" + DIVIDER . . 60 + for SENSORa in ${PW_SENSOR_ORD[@]}; do + if [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "esxi" ]; then + vHOST_TEMPNAMES=$(snmpwalk -v 1 -c public -t 2 ${PW_HOST_IDRACS[${SENSORa}]} .1.3.6.1.4.1.674.10892.5.4.700.20.1.8 -O vq | sed -e 's/"//g' | sed -e 's/ Temp//g') + IFS=$'\n' + read -rd '' -a SENSORS_CHECK <<<"${vHOST_TEMPNAMES}" + unset IFS + t=1 + else + SENSORS_CHECK=(${SENSORa}) + fi + + for SENSOR in "${SENSORS_CHECK[@]}"; do + + if [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "mqtt" ]; then + mqtt_message=`${mqtt_conn} -t tele/${SENSOR}/SENSOR -C 1` + temp_c=$(echo ${mqtt_message} | cut -d':' -f 6 | cut -d',' -f 1) + + elif [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "system" ]; then + temp_c=$(vcgencmd measure_temp) + temp_c=${temp_c%\'*}; temp_c=${temp_c#*=} + + elif [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "remotesystem" ]; then + temp_c=$(ssh root@${PW_REMOTE_SENSORS[${SENSOR}]} vcgencmd measure_temp) + temp_c=${temp_c%\'*}; temp_c=${temp_c#*=} + + elif [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "esxi" ]; then + temp_c=$(snmpwalk -v 1 -c public -t 2 ${PW_HOST_IDRACS[${SENSORa}]} .1.3.6.1.4.1.674.10892.5.4.700.20.1.6.1.${t} -O vq | sed -e 's/"//g') + temp_c=`echo "scale=1; ${temp_c}/10" | bc` + vSENSOR=${SENSOR} + SENSOR="${SENSORa}-${vSENSOR// /_}" + ((t++)) + else + temp_c='' + + fi + if [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "esxi" ]; then + average1=$(AVERAGETEMP ${PW_SENSOR_ID[${SENSORa}]} 1 ${vSENSOR// /_}) + average7=$(AVERAGETEMP ${PW_SENSOR_ID[${SENSORa}]} 7 ${vSENSOR// /_}) + else + average1=$(AVERAGETEMP ${PW_SENSOR_ID[${SENSORa}]} 1) + average7=$(AVERAGETEMP ${PW_SENSOR_ID[${SENSORa}]} 7) + fi + + c=0; spc=''; spc1=`expr ${cw} - ${#SENSOR}`; until [ ${c} = ${spc1} ]; do spc="${spc} "; c=`expr ${c} + 1`; done + if [ "${temp_c}" != "null" ] && [ "${temp_c}" != "" ]; then + temp_f=`echo "scale=2; ${temp_c}*1.8 + 32" | bc` + echo -e "${SENSOR}${spc}${temp_f}'F / ${average1}'F / ${average7}'F" + + else + echo -e "${SENSOR}${spc}No Data" + + fi + done + [ "${temp_c}" != "null" ] && [ "${temp_c}" != "" ] && echo + done +} \ No newline at end of file diff --git a/powerwall.sh b/powerwall.sh index f2e0de7e..dd179472 100755 --- a/powerwall.sh +++ b/powerwall.sh @@ -6,7 +6,10 @@ PW_ACTION="${1}" source /opt/idssys/defaults/colors.inc source /opt/idssys/defaults/default.inc source /opt/idssys/powerwall/defaults.inc -source ${PW_FOLDER}/shutdown-test.sh + +source ${PW_FOLDER}/inc/power.inc.sh +source ${PW_FOLDER}/inc/temp.inc.sh + # TEST=true @@ -15,1147 +18,6 @@ shopt -s lastpipe VERBOSE=false -CHECKTEMP(){ - start=`date +%s` - cw=25; - while [ $# -gt 0 ]; do - case "$1" in - -a|-avg) avgdays=${2};; - -S|-sensors) temptype="sensors";; - -e|-esxi) temptype="esxi";; - -s|-search) search=${2};; - esac - shift 1 - done - echo - if [ "${avgdays}" != "" ]; then - [ ${avgdays} -lt 10 ] && avgdays_disp=" ${avgdays}" || avgdays_disp=${avgdays} - echo -e "${idsCL[Cyan]}Sensor Temperature(s) Current / ${idsCL[LightYellow]}${avgdays_disp}DayAVG ${idsCL[Yellow]}warning${idsCL[Default]} / ${idsCL[LightRed]}critical${idsCL[Default]}" - else - avgdays=noavg - echo -e "${idsCL[Cyan]}Sensor Temperature(s) Current ${idsCL[Yellow]}warning${idsCL[Default]} / ${idsCL[LightRed]}critical${idsCL[Default]}" - fi - DIVIDER . yellow 90 - - for SENSOR in ${PW_SENSOR_ORD[@]}; do - - if [ "${search}" == "" ] || [[ "${SENSOR,,}" = *"${search,,}"* ]]; then - - if [ "${PW_SENSOR_TYPE[${SENSOR}]}" == "esxi" ] && [ "${temptype}" != "sensors" ]; then - vHOSTiDRACIP=${PW_HOST_IDRACS[${SENSOR}]} - vHOSTIP=${PW_HOST_ADDRESSES[${SENSOR}]} - vHOSTNAME=${PW_ESXI_HOST_NAMES[${vHOSTiDRACIP}]} - echo -e "\r\033[K${idsCL[White]}${idsST[Bold]}${SENSOR} Host Sensors ${idsST[Reset]}${idsCL[White]}[${vHOSTiDRACIP}]${idsCL[Default]}" - echo -en "${idsCL[Yellow]}Pulling data for '${SENSOR}' ... " - - if [ "$(CHECK_HOST ${vHOSTIP})" != "false" ]; then - vHOST_TEMPNAMES=$(snmpwalk -v 1 -c public -t 2 ${vHOSTiDRACIP} .1.3.6.1.4.1.674.10892.5.4.700.20.1.8 -O vq | sed -e 's/"//g' | sed -e 's/ Temp//g') - IFS=$'\n' - read -rd '' -a vHOST_TEMPNAMES <<<"${vHOST_TEMPNAMES}" - unset IFS - echo -en "\r\033[K" - if [ ${#vHOST_TEMPNAMES[@]} > 1 ]; then - t=1 - for sensorname in "${vHOST_TEMPNAMES[@]}"; do - temp_c=$(snmpwalk -v 1 -c public -t 2 ${vHOSTiDRACIP} .1.3.6.1.4.1.674.10892.5.4.700.20.1.6.1.${t} -O vq | sed -e 's/"//g') - temp_c=`echo "scale=1; ${temp_c}/10" | bc` - temp_warn=$(snmpwalk -v 1 -c public -t 2 ${vHOSTiDRACIP} .1.3.6.1.4.1.674.10892.5.4.700.20.1.11.1.${t} -O vq | sed -e 's/"//g') - temp_warn=`echo "scale=1; ${temp_warn}/10" | bc` - temp_crit=$(snmpwalk -v 1 -c public -t 2 ${vHOSTiDRACIP} .1.3.6.1.4.1.674.10892.5.4.700.20.1.10.1.${t} -O vq | sed -e 's/"//g') - temp_crit=`echo "scale=1; ${temp_crit}/10" | bc` - - c=0; spc=''; spc1=`expr ${cw} - ${#sensorname} - 1`; until [ ${c} = ${spc1} ]; do spc="${spc} "; c=`expr ${c} + 1`; done - - [ "${avgdays}" != "noavg" ] && echo -en "${idsCL[LightCyan]} ${sensorname}${spc}${idsCL[Default]}: ${idsCL[Yellow]}Calculating ${avgdays} Day average ... " - reading=$(CHECKTEMPSENSOR ${SENSOR} ${temp_c} ${temp_warn} ${temp_crit} ${sensorname// /_} ${avgdays}) - [ "${avgdays}" != "noavg" ] && echo -en "\r\033[K" - echo -e "${idsCL[LightCyan]} ${sensorname}${spc}${idsCL[Default]}: ${reading}" - - ((t++)) - done - else - echo -e "${idsCL[LightCyan]} ${vHOSTNAME}${spc}${idsCL[Default]}: No Data" - fi - - else #host down - echo -e "\r\033[K${idsCL[LightRed]}${SENSOR} Host is down" - - # if [ ! -f ${PW_TMPFOLDER}/${SENSOR}.down ] || [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/${SENSOR}.down)) -ge 1800 ]; then - # SENDNOTICE "${vHOSTiDRACIP} ERROR" "${vHOSTNAME} Host is down" 1 - # echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${vHOSTiDRACIP} - ${vHOSTNAME} Host is down" >> ${logtemp} - # touch ${PW_TMPFOLDER}/${EHOST}.down - # fi - fi - echo - - elif [ "${PW_SENSOR_TYPE[${SENSOR}]}" != "esxi" ] && [ "${temptype}" != "esxi" ]; then - [[ "${SENSOR}" == *"CPU-Usage"* ]] && echo -en "\033[1A" - c=0; spc=''; spc1=`expr ${cw} - ${#SENSOR}`; until [ ${c} = ${spc1} ]; do spc="${spc} "; c=`expr ${c} + 1`; done - echo -en "\r\033[K${idsCL[White]}${idsST[Bold]}${SENSOR}${idsST[Reset]}${spc}${idsCL[Default]}: ${idsCL[Yellow]}" - [ "${avgdays}" != "noavg" ] && echo -en "Pulling data and calculating ${avgdays} Day average ... " || echo -en "Pulling data ... " - reading=$(CHECKTEMPSENSOR ${SENSOR} . . . . ${avgdays}) - echo -e "\r\033[K${idsCL[White]}${idsST[Bold]}${SENSOR}${idsST[Reset]}${spc}${idsCL[Default]}: ${reading}" - echo - fi - fi - done - end=`date +%s`; runtime=$((end-start)); echo -e "\nruntime: ${runtime}" - [ "${PW_ACTION}" != "" ] && echo -} - -CHECKTEMPSENSOR(){ - echo ${PW_THRESHOLDS[${1}]} | cut -d',' -f 1 | read temp_warn - echo ${PW_THRESHOLDS[${1}]} | cut -d',' -f 2 | read temp_crit - [ "${PW_SENSOR_TYPE[${1}]}" == "cpu" ] && GAUGESH="'%" || GAUGESH="'F" - - if [ "${6}" != "noavg" ]; then - [ "${6}" != "" ] && [[ "${6}" =~ ^[0-9]+$ ]] && avgdays=${6} || avgdays=3 - if [ "${PW_SENSOR_TYPE[${1}]}" != "esxi" ]; then - average=$(AVERAGETEMP ${PW_SENSOR_ID[${1}]} ${avgdays}) - else - average=$(AVERAGETEMP ${PW_SENSOR_ID[${1}]} ${avgdays} ${5}) - fi - else - average='' - fi - - if [ "${PW_SENSOR_TYPE[${1}]}" == "mqtt" ]; then - mqtt_message=`${mqtt_conn} -t tele/${1}/SENSOR -C 1` - echo ${mqtt_message} | cut -d':' -f 6 | cut -d',' -f 1 | read temp_c - - elif [ "${PW_SENSOR_TYPE[${1}]}" == "system" ]; then - temp_c=$(vcgencmd measure_temp) - temp_c=${temp_c%\'*}; temp_c=${temp_c#*=} - - elif [ "${PW_SENSOR_TYPE[${1}]}" == "remotesystem" ]; then - temp_c=$(ssh -q -o ConnectTimeout=1 -o ConnectionAttempts=1 root@${PW_REMOTE_SENSORS[${1}]} vcgencmd measure_temp) - if [ "${temp_c}" != "" ]; then - temp_c=${temp_c%\'*}; temp_c=${temp_c#*=} - - fi - elif [ "${PW_SENSOR_TYPE[${1}]}" == "esxi" ]; then - temp_c=${2} - temp_warn=`echo $(bc <<< "scale=2; (${3}*1.8+32)/1") | awk '{print int($1+0.5)}'` - temp_crit=`echo $(bc <<< "scale=2; (${4}*1.8+32)/1") | awk '{print int($1+0.5)}'` - - elif [ "${PW_SENSOR_TYPE[${1}]}" == "cpu" ]; then - if [ "${1}" == "Powerwall-CPU-Usage" ]; then - temp_c=$(awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1) "%"; }' <(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat) | sed -e 's/%//g') - else - temp_c=$(ssh -q -o ConnectTimeout=1 -o ConnectionAttempts=1 root@${PW_REMOTE_SENSORS[${1}]} "/opt/idssys/defaults/get-data.sh cpu-usage") - fi - fi - - if [ "${temp_c}" != "null" ] && [ "${temp_c}" != "" ]; then - [ "${PW_SENSOR_TYPE[${1}]}" == "cpu" ] && temp_f=$(echo "scale=2; $temp_c/1" | bc -l) || temp_f=$(bc <<< "scale=1; ${temp_c}*1.8+32") - (( $(bc <<<"${temp_f} < 1") )) && [[ "${temp_f}" = *"."* ]] && temp_f="0${temp_f}" - [ "${1}" == "ServerRoomTH" ] && temp_f=`echo "scale=1; ${temp_f}+${PW_ServerRoomTH_Dev}" | bc` - # echo "HERE: '${temp_c}' -> '${temp_f}'" - # echo -en "" - c=0; spct=''; spc1=`expr 6 - ${#temp_f}`; until [ ${c} = ${spc1} ]; do spct="${spct} "; c=`expr ${c} + 1`; done - - if [ "${average}" != "" ]; then - c=0; spca=''; spc1=`expr 6 - ${#average}`; until [ ${c} = ${spc1} ]; do spca="${spca} "; c=`expr ${c} + 1`; done - if [ "${average}" == "" ]; then - averagedisp="${idsCL[Green]}" - elif [ $(bc -l <<< "${average} >= ${temp_warn}") -eq 1 ] && [ $(bc -l <<< "${average} < ${temp_crit}") -eq 1 ]; then - averagedisp="${idsCL[Yellow]}${average}" - elif [ $(bc -l <<< "${average} >= ${temp_crit}") -eq 1 ]; then - averagedisp="${idsCL[LightRed]}${average}" - else - averagedisp="${idsCL[Green]}${average}" - fi - fi - - if [ $(bc -l <<< "${temp_f} >= ${temp_warn}") -eq 1 ] && [ $(bc -l <<< "${temp_f} < ${temp_crit}") -eq 1 ]; then - [ "${average}" != "" ] && echo -en "${idsCL[Yellow]}WARNING ${spct}${temp_f}${GAUGESH} /${spca}${averagedisp}${GAUGESH}${idsCL[Default]}" || echo -en "${idsCL[Yellow]}WARNING ${spct}${temp_f}${GAUGESH}${idsCL[Default]}" - elif [ $(bc -l <<< "${temp_f} >= ${temp_crit}") -eq 1 ]; then - [ "${average}" != "" ] && echo -en "${idsCL[LightRed]}CRITICAL${spct}${temp_f}${GAUGESH} /${spca}${averagedisp}${GAUGESH}${idsCL[Default]}" || echo -en "${idsCL[LightRed]}CRITICAL${spct}${temp_f}${GAUGESH}${idsCL[Default]}" - else - [ "${average}" != "" ] && echo -en "${idsCL[Green]}Normal ${spct}${temp_f}${GAUGESH} /${spca}${averagedisp}${GAUGESH}${idsCL[Default]}" || echo -en "${idsCL[Green]}Normal ${spct}${temp_f}${GAUGESH}${idsCL[Default]}" - fi - - tmp="${spct}${temp_f}" - c=0; spc=''; spc1=`expr 10 - ${#tmp}`; until [ ${c} = ${spc1} ]; do spc="${spc} "; c=`expr ${c} + 1`; done - [ ${#temp_warn} == 2 ] && spcw=' ' || spcw=' ' - [ ${#temp_crit} == 2 ] && spcc=' ' || spcc=' ' - echo -e "${spc}[${spcw}${idsCL[Yellow]}${temp_warn}${GAUGESH}${idsCL[Default]} /${spcc}${idsCL[LightRed]}${temp_crit}${GAUGESH}=>${idsCL[Default]} ]" - fi -} -AVERAGETEMP(){ - temptotal=0 - daysback=${2} - sensorid=${1} - logsfound=0; - if [ "${3}" != "" ]; then - entityid=($(${mysql_conn} -e "SELECT id FROM servermonitor.entities WHERE BINARY name='${3}' AND sensorid='${sensorid}'")) - entityid=${entityid[1]} - WHERE="sensorid=${sensorid} AND entity=${entityid}" - else - WHERE="sensorid=${sensorid}" - fi - - while IFS=$'\t' read date temp hum ;do - temptotal=$(bc <<< "scale=1; ${temptotal}+${temp}") - ((logsfound++)) - done < <(${mysql_conn} -se "USE servermonitor; SELECT date,temp,hum from sensor_data WHERE ${WHERE} AND date BETWEEN DATE_SUB(DATE(NOW()), INTERVAL ${daysback} DAY) AND NOW() ORDER BY id DESC;") - average=$(bc <<< "scale=1; ${temptotal}/${logsfound}") - (( $(bc <<<"${average} < 1") )) && [[ "${average}" = *"."* ]] && average="0${average}" - echo ${average} - # echo ${logsfound} -} - -SENDDAILY(){ - dailtemp=$(DAILYTEMP) - SENDNOTICE "Daily Temp Readings" "${dailtemp}" -} - -CHECKTEMP_SERVICE(){ - cw=20 - declare -A last_temp - echo -e "($(date +'%Y-%m-%d %H:%M:%S')) - 'Check Temp' Service Startup" >> ${PW_LOGFILE} - while true; do - # start=`date +%s` - # time="$(date +%H)$(date +%M)" - # if [ ! -f ${PW_TMPFOLDER}/temp.* ] && [ $(date +%H)$(date +%M) -ge 0700 ] && [ $(date +%H)$(date +%M) -lt 0705 ]; then - # if [ ! -f ${PW_TMPFOLDER}/.sentdaily ] || [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/.sentdaily)) -gt 600 ]; then - # touch ${PW_TMPFOLDER}/.sentdaily - # SENDDAILY & - # fi - # fi - for SENSORa in ${PW_SENSOR_ORD[@]}; do - logtemp=${PW_LOGFOLDER}/log-temp-${SENSORa} - [ ! -f ${logtemp} ] && touch ${logtemp} - [ $(expr `date +%s` - $(stat -c %Y ${logtemp})) -ge $(echo "scale=0; ${PW_LOG_INTERVAL_NORMAL}*60" | bc) ] && relog=1 || relog=0 - - if ([ "${PW_REMOTE_SENSORS[${SENSORa}]}" != "" ] && [ "$(CHECK_HOST ${PW_REMOTE_SENSORS[${SENSORa}]})" != "false" ]) || ([ "${PW_HOST_ADDRESSES[${SENSORa}]}" != "" ] && [ "$(CHECK_HOST ${PW_HOST_ADDRESSES[${SENSORa}]})" != "false" ]); then - # if ([ "${PW_REMOTE_SENSORS[${SENSORa}]}" != "" ] && [ "$(CHECK_HOST ${PW_REMOTE_SENSORS[${SENSORa}]})" != "false" ]); then - if [ -f ${PW_TMPFOLDER}/${SENSORa}.down ]; then - SENDNOTICE "${SENSORa} Online" "${SENSORa} Sensor is back online" - echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${SENSORa} - Sensor is back online" >> ${logtemp} - rm -f ${PW_TMPFOLDER}/${SENSORa}.down - fi - if [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "esxi" ]; then - vHOST_TEMPNAMES=$(snmpwalk -v 1 -c public -t 2 ${PW_HOST_IDRACS[${SENSORa}]} .1.3.6.1.4.1.674.10892.5.4.700.20.1.8 -O vq | sed -e 's/"//g' | sed -e 's/ Temp//g') - IFS=$'\n' - read -rd '' -a SENSORS_CHECK <<<"${vHOST_TEMPNAMES}" - unset IFS - [ -f ${PW_TMPFOLDER}/power.${SENSORa}.off ] && [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/power.${SENSORa}.off)) -ge 300 ] && rm-f ${PW_TMPFOLDER}/power.${SENSORa}.off - t=1 - - else - SENSORS_CHECK=(${SENSORa}) - fi - if [ "${SENSORS_CHECK}" != "" ]; then - for SENSOR in "${SENSORS_CHECK[@]}"; do - if [ "${PW_THRESHOLDS[${SENSORa}]}" != "" ]; then - echo ${PW_THRESHOLDS[${SENSORa}]} | cut -d',' -f 1 | read temp_warn - echo ${PW_THRESHOLDS[${SENSORa}]} | cut -d',' -f 2 | read temp_crit - [ "$(echo ${PW_THRESHOLDS[${SENSORa}]} | cut -d',' -f 3)" != "" ] && echo ${PW_THRESHOLDS[${SENSORa}]} | cut -d',' -f 3 | read temp_crit_sys || temp_crit_sys=${temp_crit} - fi - - if [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "mqtt" ]; then - mqtt_message=`${mqtt_conn} -t tele/${SENSOR}/SENSOR -C 1` - echo ${mqtt_message} | cut -d':' -f 7 | cut -d',' -f 1 | read temp_h - echo ${mqtt_message} | cut -d':' -f 6 | cut -d',' -f 1 | read temp_c - - elif [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "system" ]; then - temp_c=$(vcgencmd measure_temp) - temp_c=${temp_c%\'*}; temp_c=${temp_c#*=} - temp_h='' - - elif [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "remotesystem" ]; then - temp_c=$(ssh root@${PW_REMOTE_SENSORS[${SENSOR}]} vcgencmd measure_temp) - temp_c=${temp_c%\'*}; temp_c=${temp_c#*=} - temp_h='' - - elif [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "esxi" ]; then - temp_c=$(snmpwalk -v 1 -c public -t 2 ${PW_HOST_IDRACS[${SENSORa}]} .1.3.6.1.4.1.674.10892.5.4.700.20.1.6.1.${t} -O vq | sed -e 's/"//g') - temp_c=`echo "scale=1; ${temp_c}/10" | bc` - temp_warn=$(snmpwalk -v 1 -c public -t 2 ${PW_HOST_IDRACS[${SENSORa}]} .1.3.6.1.4.1.674.10892.5.4.700.20.1.11.1.${t} -O vq | sed -e 's/"//g') - temp_warn=`echo "scale=1; ${temp_warn}/10" | bc` - temp_warn=$(echo "scale=2; ${temp_warn}*1.8 + 32" | bc) - temp_crit=$(snmpwalk -v 1 -c public -t 2 ${PW_HOST_IDRACS[${SENSORa}]} .1.3.6.1.4.1.674.10892.5.4.700.20.1.10.1.${t} -O vq | sed -e 's/"//g') - temp_crit=`echo "scale=1; ${temp_crit}/10" | bc` - temp_crit=$(echo "scale=2; ${temp_crit}*1.8 + 32" | bc) - temp_crit_sys=${temp_crit} - temp_h='' - vSENSOR=${SENSOR} - SENSOR="${SENSORa}-${vSENSOR// /_}" - ((t++)) - - elif [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "cpu" ]; then - if [ "${SENSORa}" == "Powerwall-CPU-Usage" ]; then - temp_c=$(awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1) "%"; }' <(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat) | sed -e 's/%//g') - else - temp_c=$(ssh -q -o ConnectTimeout=1 -o ConnectionAttempts=1 root@${PW_REMOTE_SENSORS[${SENSORa}]} "/opt/idssys/defaults/get-data.sh cpu-usage") - fi - temp_h='' - - fi - [ "${last_temp[${SENSOR//-/}]}" == "" ] && last_temp[${SENSOR//-/}]=0 - - logtemp=${PW_LOGFOLDER}/log-temp-${SENSOR} - if [ "${temp_c}" != "null" ] && [ "${temp_c}" != "" ]; then - [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "cpu" ] && GAUGE="CPU-USAGE" || GAUGE="TEMP" - [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "cpu" ] && GAUGESH='%' || GAUGESH="'F" - if [ -f ${PW_TMPFOLDER}/${SENSOR}-error.reading ]; then - SENDNOTICE "${SENSOR} Data" "${SENSOR} is reporting data again" - echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${SENSOR} - Sensor is reporting data again" >> ${logtemp} - rm -f ${PW_TMPFOLDER}/${SENSOR}-error.reading - - fi - - [ "${PW_SENSOR_TYPE[${SENSOR}]}" == "cpu" ] && temp_f=$(echo "scale=2; $temp_c/1" | bc -l) || temp_f=$(echo "scale=2; ${temp_c}*1.8 + 32" | bc) - [ "${SENSOR}" == "ServerRoomTH" ] && temp_f=`echo "scale=2; ${temp_f}+${PW_ServerRoomTH_Dev}" | bc` - # echo "HERE: [${SENSOR//-/}] - ${last_temp[${SENSOR//-/}]} - ${temp_c} - ${temp_f} - ${temp_warn} - ${temp_crit} - ${temp_crit_sys}" - # [ ! "${temp_c}" ] || [ ! "${temp_f}" ] || [ ! "${temp_warn}" ] || [ ! "${temp_crit}" ] || [ ! "${temp_crit_sys}" ] && echo "VALUE NOT FOUND" - - if [ "${PW_SENSOR_TYPE[${SENSORa}]}" != "esxi" ]; then - echo ${PW_THRESHOLDS[${SENSOR}]} | cut -d',' -f 1 | read temp_warn - echo ${PW_THRESHOLDS[${SENSOR}]} | cut -d',' -f 2 | read temp_crit - echo ${PW_THRESHOLDS[${SENSOR}]} | cut -d',' -f 3 | read temp_crit_sys - fi - - if (( $(bc <<< "${temp_f} < ${temp_warn}") )); then - if (( $(bc <<< "${last_temp[${SENSOR//-/}]} > 1") )); then - SENDNOTICE "${SENSOR} BACK TO NORMAL" "NORMAL TEMP: ${temp_f}${GAUGESH} -Previous Temp: ${last_temp[${SENSOR//-/}]}${GAUGESH}" - echo -e "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - Back to NORMAL ${GAUGE} - Previous ${GAUGE}: ${last_temp[${SENSOR//-/}]}${GAUGESH}" >> ${logtemp} - echo -e "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - ${SENSOR} - Back to NORMAL ${GAUGE}" >> ${PW_LOGFILE} - # [ "$(compgen -G "${PW_TMPFOLDER}/power.*.off")" != "" ] && rm -f ${PW_TMPFOLDER}/power.*.off - - elif [ "${last_temp[${SENSOR//-/}]}" == "0" ]; then - # SENDNOTICE "${SENSOR} TEMP NORMAL" "Service Startup -# NORMAL TEMP: ${temp_f}${GAUGESH}" - echo -e "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - Service Startup - NORMAL ${GAUGE}" >> ${logtemp} - echo -e "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - ${SENSOR} - Service Startup" >> ${PW_LOGFILE} - # [ "$(compgen -G "${PW_TMPFOLDER}/power.*.off")" != "" ] && rm -f ${PW_TMPFOLDER}/power.*.off - - elif [ "${relog}" == "1" ]; then - echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - Normal ${GAUGE}" >> ${logtemp} - - fi - rm -f ${PW_TMPFOLDER}/temp.* - rm -f ${PW_TMPFOLDER}/power.${SENSORa}.off - last_temp[${SENSOR//-/}]=1 - - # iDS-vMS-Offsite Fan Issue Workaround - if [ "${PW_HOST_IDRACS[${SENSORa}]}" == "10.2.1.21" ]; then - vHOSTFAN=$(snmpwalk -v 1 -c public -t 2 ${PW_HOST_IDRACS[${SENSORa}]} .1.3.6.1.4.1.674.10892.5.4.700.12.1.6.1.3 -O vq) - # vHOSTFAN=$(ssh -q -o ConnectTimeout=1 -o ConnectionAttempts=1 root@${PW_RACADM_ACCESS} racadm -r ${PW_HOST_IDRACS[${SENSORa}]} -u ${PW_ESXI_USER} -p "'${PW_ESXI_PASS}'" getsensorinfo | grep "System Board Fan1" 2>&1) - if [ "${vHOSTFAN}" != "" ]; then - FanSpeed=`echo "scale=2; ${vHOSTFAN}/21200" | bc`; FanSpeed=`echo "scale=0; ${FanSpeed}*100" | bc | sed -e 's/.00//g'` - # FanSpeed=$(echo ${vHOSTFAN} | awk '/ / {print $8}' | sed -e 's/%//g') - if [ ${FanSpeed} -lt 26 ] || [ ${FanSpeed} -gt 34 ]; then - # if [ ${FanSpeed} -ne 30 ]; then - SENDNOTICE "${PW_HOST_IDRACS[${SENSORa}]} Fan Issue" "Settings fans back to normal 30%25" - ipmitool -I lanplus -H ${PW_HOST_IDRACS[${SENSORa}]} -U ${PW_ESXI_USER} -P "${PW_ESXI_PASS}" raw 0x30 0x30 0x01 0x00 >/dev/null 2>&1 - ipmitool -I lanplus -H ${PW_HOST_IDRACS[${SENSORa}]} -U ${PW_ESXI_USER} -P "${PW_ESXI_PASS}" raw 0x30 0x30 0x02 0xff 0x1E >/dev/null 2>&1 - fi - fi - fi - - else - ([ ! "${last_temp[${SENSOR//-/}]}" ] || (( $(bc <<< "${last_temp[${SENSOR//-/}]} < 2") ))) && last_temp[${SENSOR//-/}]=${temp_f} - temp_diff=`echo "scale=2; ${last_temp[${SENSOR//-/}]}-${temp_f}" | bc` - [ $(bc -l <<< "${temp_diff} < 0") -eq 1 ] && temp_diff=`echo "scale=2; ${temp_diff}*-1" | bc` - - if [ $(bc -l <<< "${temp_f} >= ${temp_warn}") -eq 1 ] && [ $(bc -l <<< "${temp_f} < ${temp_crit}") -eq 1 ]; then - touch ${PW_TMPFOLDER}/temp.warn - if (( $(bc <<< "${temp_diff} > 1") )) || (( $(bc <<< "${temp_diff} = 1") )); then - SENDNOTICE "${SENSOR} ${GAUGE} WARNING" "WARNING ${GAUGE}: ${temp_f}${GAUGESH} - (Difference of ${temp_diff}')" 1 - last_temp[${SENSOR//-/}]=${temp_f} - echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - WARNING ${GAUGE} - (Difference of ${temp_diff}')" >> ${logtemp} - - # iDS-vMS-Offsite Fan Issue Workaround - if [ "${PW_HOST_IDRACS[${SENSORa}]}" == "10.2.1.21" ] && [ ${FanSpeed} -ne 80 ]; then - SENDNOTICE "${PW_HOST_IDRACS[${SENSORa}]} SERVER WARM" "Setting fan speeds to 80%25" 1 - ipmitool -I lanplus -H ${PW_HOST_IDRACS[${SENSORa}]} -U ${PW_ESXI_USER} -P "${PW_ESXI_PASS}" raw 0x30 0x30 0x01 0x00 >/dev/null 2>&1 - ipmitool -I lanplus -H ${PW_HOST_IDRACS[${SENSORa}]} -U ${PW_ESXI_USER} -P "${PW_ESXI_PASS}" raw 0x30 0x30 0x02 0xff 0x50 >/dev/null 2>&1 - fi - fi - - elif [ $(bc -l <<< "${temp_f} >= ${temp_crit}") -eq 1 ] && [ $(bc -l <<< "${temp_f} < ${temp_crit_sys}") -eq 1 ]; then - if (( $(bc <<< "${temp_diff} > 1") )) || (( $(bc <<< "${temp_diff} = 1") )); then - SENDNOTICE "${SENSOR} ${GAUGE} CRITICAL" "CRITICAL ${GAUGE}: ${temp_f}${GAUGESH} - (Difference of ${temp_diff}')" 1 - echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - CRITICAL - (Difference of ${temp_diff}${GAUGESH})" >> ${logtemp} - echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${SENSOR} - ${temp_f}${GAUGESH} - CRITICAL ${GAUGE} - (Difference of ${temp_diff}')" >> ${PW_LOGFILE} - last_temp[${SENSOR//-/}]=${temp_f} - - if [ "${SENSOR}" == "ServerRoomTH" ] && [ ! -f touch ${PW_TMPFOLDER}/temp.crit ]; then - touch ${PW_TMPFOLDER}/temp.crit - SHUTDOWN_MAIN ${SENSOR} & - echo -e "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - Shutting down MAIN servers" >> ${logtemp} - - # elif [ ! -f ${PW_TMPFOLDER}/power.${SENSORa}.off ]; then - # SENDNOTICE "${SENSORa} TEMP CRITICAL" "Host system and VMs shutting down!!" 1 - # SHUTDOWN_SERVER ${SENSORa} & - # touch ${PW_TMPFOLDER}/power.${SENSORa}.off - - fi - fi - elif [ $(bc -l <<< "${temp_f} >= ${temp_crit_sys}") -eq 1 ]; then - if (( $(bc <<< "${temp_diff} > 1") )) || (( $(bc <<< "${temp_diff} = 1") )); then - SENDNOTICE "${SENSOR} TEMP CRITICAL" "SYSTEM CRITICAL ${GAUGE}: ${temp_f}${GAUGESH} - (Difference of ${temp_diff}')" 1 - echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - SYSTEM CRITICAL - (Difference of ${temp_diff})" >> ${logtemp} - echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - ${SENSOR} - CRITICAL ${GAUGE} SYSTEM - (Difference of ${temp_diff}')" >> ${PW_LOGFILE} - last_temp[${SENSOR//-/}]=${temp_f} - if [ ! -f touch ${PW_TMPFOLDER}/temp.critsys ]; then - touch ${PW_TMPFOLDER}/temp.critsys - [ "${SENSOR}" == "ServerRoomTH" ] && SHUTDOWN_SYS ${SENSOR} TEMP & - SHUTDOWN_CRIT ${SENSOR} & - echo -e "($(date +'%Y-%m-%d %H:%M:%S')) - ${temp_f}${GAUGESH} - Sending system shutdown signals, if applicable. Check main Powerwall Logs" >> ${logtemp} - fi - fi - fi - fi - - [ -f ${PW_TMPFOLDER}/${SENSOR}.insert ] && lastinsert=$(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/${SENSOR}.insert)) || lastinsert=100000 - if [ "$(compgen -G "${PW_TMPFOLDER}/temp.*")" != "" ] || [ "$(compgen -G "${PW_TMPFOLDER}/power.ac.*")" != "" ] || [ "$(compgen -G "${PW_TMPFOLDER}/power.dc.*")" != "" ]; then - wait=$(echo "scale=0; ${PW_MYSQL_LOG_INTERVAL_ABNORMAL}*60" | bc) - else - wait=$(echo "scale=0; ${PW_MYSQL_LOG_INTERVAL_NORMAL}*60" | bc) - fi - - if [ "${PW_SENSOR_ID[${SENSORa}]}" != "" ] && [ ${lastinsert} -ge ${wait} ]; then - if [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "esxi" ]; then - entityid=($(${mysql_conn} -e "SELECT id FROM servermonitor.entities WHERE BINARY name='${vSENSOR// /_}' AND sensorid='${PW_SENSOR_ID[${SENSORa}]}'")) - if [ "${entityid[1]}" == "" ]; then - ${mysql_conn} -e "USE servermonitor; INSERT INTO entities (\`sensorid\`, \`name\`) VALUES ('${PW_SENSOR_ID[${SENSORa}]}','${vSENSOR// /_}')" - entityid=($(${mysql_conn} -e "SELECT id FROM servermonitor.entities WHERE BINARY name='${vSENSOR// /_}' AND sensorid='${PW_SENSOR_ID[${SENSORa}]}'")) - fi - entityid=${entityid[1]} - - QRY="USE servermonitor; INSERT INTO sensor_data (\`sensorid\`, \`entity\`, \`date\`, \`temp\`) VALUES ('${PW_SENSOR_ID[${SENSORa}]}','${entityid}','$(date +'%Y-%m-%d %H:%M:%S')','${temp_f}')" - if [ "${PW_HOST_IDRACS[${SENSORa}]}" == "10.2.1.21" ] && [ "${vSENSOR// /_}" == "System_Board_Inlet" ] && [ "${vHOSTFAN}" != "" ]; then - ${mysql_conn} -e "USE servermonitor; INSERT INTO sensor_data (\`sensorid\`, \`date\`, \`speed\`) VALUES ('14','$(date +'%Y-%m-%d %H:%M:%S')','${FanSpeed}')" - fi - elif [ "${temp_h}" != "" ]; then - QRY="USE servermonitor; INSERT INTO sensor_data (\`sensorid\`, \`date\`, \`temp\`, \`hum\`) VALUES ('${PW_SENSOR_ID[${SENSORa}]}','$(date +'%Y-%m-%d %H:%M:%S')','${temp_f}','${temp_h}')" - else - QRY="USE servermonitor; INSERT INTO sensor_data (\`sensorid\`, \`date\`, \`temp\`) VALUES ('${PW_SENSOR_ID[${SENSORa}]}','$(date +'%Y-%m-%d %H:%M:%S')','${temp_f}')" - fi - ${mysql_conn} -e "${QRY}" - touch ${PW_TMPFOLDER}/${SENSOR}.insert - fi - else - if [ ! -f ${PW_TMPFOLDER}/${SENSOR}-error.reading ] || [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/${SENSOR}-error.reading)) -ge 1800 ]; then - SENDNOTICE "${SENSOR} Sensor ERROR" "ERROR reading sensor data" 1 - echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${SENSOR} Sensor - ERROR reading sensor data" >> ${logtemp} - touch ${PW_TMPFOLDER}/${SENSOR}-error.reading - fi - - fi - - done - - fi - - elif [ "${PW_HOST_ADDRESSES[${SENSORa}]}" == "" ]; then #sensor down - if [ ! -f ${PW_TMPFOLDER}/${SENSORa}.down ] || [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/${SENSORa}.down)) -ge 1800 ]; then - SENDNOTICE "${SENSORa} ERROR" "${SENSORa} Sensor is down" 1 - echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${SENSORa} - ${SENSORa} Sensor is down" >> ${logtemp} - touch ${PW_TMPFOLDER}/${SENSORa}.down - - fi - - fi - - done - - # end=`date +%s`; runtime=$((end-start)); echo "runtime: ${runtime}, pausing for 60secs..." - sleep 10 - done # & -} - -DAILYTEMP(){ - cw=35; - echo - echo -e "Sensor Temperature(s) Now / 1DayAVG / 7DayAVG" - DIVIDER . . 60 - for SENSORa in ${PW_SENSOR_ORD[@]}; do - if [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "esxi" ]; then - vHOST_TEMPNAMES=$(snmpwalk -v 1 -c public -t 2 ${PW_HOST_IDRACS[${SENSORa}]} .1.3.6.1.4.1.674.10892.5.4.700.20.1.8 -O vq | sed -e 's/"//g' | sed -e 's/ Temp//g') - IFS=$'\n' - read -rd '' -a SENSORS_CHECK <<<"${vHOST_TEMPNAMES}" - unset IFS - t=1 - else - SENSORS_CHECK=(${SENSORa}) - fi - - for SENSOR in "${SENSORS_CHECK[@]}"; do - - if [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "mqtt" ]; then - mqtt_message=`${mqtt_conn} -t tele/${SENSOR}/SENSOR -C 1` - temp_c=$(echo ${mqtt_message} | cut -d':' -f 6 | cut -d',' -f 1) - - elif [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "system" ]; then - temp_c=$(vcgencmd measure_temp) - temp_c=${temp_c%\'*}; temp_c=${temp_c#*=} - - elif [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "remotesystem" ]; then - temp_c=$(ssh root@${PW_REMOTE_SENSORS[${SENSOR}]} vcgencmd measure_temp) - temp_c=${temp_c%\'*}; temp_c=${temp_c#*=} - - elif [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "esxi" ]; then - temp_c=$(snmpwalk -v 1 -c public -t 2 ${PW_HOST_IDRACS[${SENSORa}]} .1.3.6.1.4.1.674.10892.5.4.700.20.1.6.1.${t} -O vq | sed -e 's/"//g') - temp_c=`echo "scale=1; ${temp_c}/10" | bc` - vSENSOR=${SENSOR} - SENSOR="${SENSORa}-${vSENSOR// /_}" - ((t++)) - else - temp_c='' - - fi - if [ "${PW_SENSOR_TYPE[${SENSORa}]}" == "esxi" ]; then - average1=$(AVERAGETEMP ${PW_SENSOR_ID[${SENSORa}]} 1 ${vSENSOR// /_}) - average7=$(AVERAGETEMP ${PW_SENSOR_ID[${SENSORa}]} 7 ${vSENSOR// /_}) - else - average1=$(AVERAGETEMP ${PW_SENSOR_ID[${SENSORa}]} 1) - average7=$(AVERAGETEMP ${PW_SENSOR_ID[${SENSORa}]} 7) - fi - - c=0; spc=''; spc1=`expr ${cw} - ${#SENSOR}`; until [ ${c} = ${spc1} ]; do spc="${spc} "; c=`expr ${c} + 1`; done - if [ "${temp_c}" != "null" ] && [ "${temp_c}" != "" ]; then - temp_f=`echo "scale=2; ${temp_c}*1.8 + 32" | bc` - echo -e "${SENSOR}${spc}${temp_f}'F / ${average1}'F / ${average7}'F" - - else - echo -e "${SENSOR}${spc}No Data" - - fi - done - [ "${temp_c}" != "null" ] && [ "${temp_c}" != "" ] && echo - done -} - -AVERAGEPOWER(){ - watttotal=0 - sensorid=${1} - daysback=${2} - logsfound=0; - while IFS=$'\t' read date watt ;do - watttotal=$(bc <<< "scale=2; ${watttotal}+${watt}") - ((logsfound++)) - done < <(${mysql_conn} -se "USE servermonitor; SELECT date,watt from power_data WHERE sensorid=${sensorid} AND date BETWEEN DATE_SUB(DATE(NOW()), INTERVAL ${daysback} DAY) AND NOW() ORDER BY id DESC;") - [ "${logsfound}" != "0" ] && average=$(bc <<< "scale=2; ${watttotal}/${logsfound}") || average=0 - # echo "$watttotal-$logsfound=${average}" - # echo "${average}-(${logsfound})" - echo ${average} -} - -CHECKPOWER(){ - start=`date +%s` - rm -f ${PW_TMPFOLDER}/*.hostpower* - while [ $# -gt 0 ]; do - case "$1" in - -a|-avg) avgdays=${2};; - -o|-offsite) STYPE=offsite;; - -m|-mainsite) STYPE=mainsite;; - -e|-esxi) PTYPE=esxi;; - -p|-power) PTYPE=power;; - esac - shift 1 - done - [ "${avgdays}" == "0" ] && unset avgdays - [ "${avgdays}" != "" ] && avgdayshdr="${avgdays}-Day-Avg" || avgdayshdr="" - - if ([ "${STYPE}" == "" ] || [ "${STYPE}" == "mainsite" ]) && [ "${PTYPE}" != "esxi" ]; then - echo - DIVIDER . yellow 75 - echo -e "${idsCL[Yellow]}Mainsite Power Information ${idsCL[LightYellow]}${avgdayshdr}" - DIVIDER . yellow 75 - - echo -en "${idsCL[Yellow]}Pulling data from 'Powerwall' ... " - - INVSTATSINFO=$(curl -s "http://${PW_INVERTER_IP}/stats.json") - if [ "${INVSTATSINFO}" != "" ]; then - INPUTV=`echo ${INVSTATSINFO} | jq '.inputs .inV'` - INPUTA=`echo ${INVSTATSINFO} | jq '.inputs .inA'` - INV_ALARM=`echo ${INVSTATSINFO} | jq '.errors .Alms'` - [ "${INV_ALARM}" == "0" ] && INV_ALARM_disp="${idsCL[Green]}No Alarms (${INV_ALARM})" || INV_ALARM_disp="${idsCL[LightRed]}${PW_INVERTER_ALARMS[${INV_ALARM}]}" - INV_ERROR=`echo ${INVSTATSINFO} | jq '.errors .Err'` - [ "${INV_ERROR}" == "0" ] && INV_ERROR_disp="${idsCL[Green]}No Errors (${INV_ERROR})" || INV_ERROR_disp="${idsCL[LightRed]}${PW_INVERTER_ERRORS[${INV_ERROR}]}" - INV_STATE=`echo ${INVSTATSINFO} | jq '.stats .invSTATES'` - [ "${INV_STATE}" != "0" ] && INV_STATE_disp="${idsCL[Green]}${PW_INVERTER_STATES[${INV_STATE}]}" || INV_STATE_disp="${idsCL[LightRed]}${PW_INVERTER_STATES[${INV_STATE}]}" - INV_MODE=`echo ${INVSTATSINFO} | jq '.stats .power'` - ([ "${INV_MODE}" != "3" ] && [ "${INV_MODE}" != "4" ] && [ "${INV_MODE}" != "E" ]) && INV_MODE_disp="${idsCL[Green]}${PW_INVERTER_MODES[${INV_MODE}]}" || INV_MODE_disp="${idsCL[LightRed]}${PW_INVERTER_MODES[${INV_MODE}]}" - OUTPUTV=`echo ${INVSTATSINFO} | jq '.outputs .outV'` - OUTPUTV2=`echo "scale=2; ${OUTPUTV}/2" | bc` - OUTPUTA=`echo ${INVSTATSINFO} | jq '.outputs .outA'` - OUTPUTA2=`echo "scale=2; ${OUTPUTA}*2" | bc` - OUTPUTW=`echo ${INVSTATSINFO} | jq '.outputs .outW'` - BATTV=`echo ${INVSTATSINFO} | jq '.inputs .battV'` - BATTA=`echo ${INVSTATSINFO} | jq '.inputs .xfA'` - BATTLIFE=`echo "scale=2; (${BATTV}*100)/${BATT_FULL}" | bc` - if (( $(bc <<<"${BATTV} > ${FLOAT_CHARGE}") )); then - if (( $(bc <<<"${BATTV} > ${BULK_CHARGE}") )); then - BATTA_disp="${idsCL[Green]}`IDS_NUMBER_FORMAT ${BATTA}`'amps ${idsCL[LightCyan]}- Bulk Charging" - else - BATTA_disp="${idsCL[Green]}`IDS_NUMBER_FORMAT ${BATTA}`'amps ${idsCL[LightCyan]}- Float Charging" - fi - elif [ "${BATTA}" == "-0.1" ] || [ "${BATTA}" == "-0.2" ] || [ "${BATTA}" == "-0.3" ]; then - BATTA_disp="${idsCL[LightCyan]}`IDS_NUMBER_FORMAT ${BATTA}`'amps ${idsCL[LightCyan]}- Standby" - else - BATTA_disp="${idsCL[LightRed]}`IDS_NUMBER_FORMAT ${BATTA}`'amps ${idsCL[LightCyan]}- Discharging" - fi - fi - - echo -en "\r\033[K" - echo -e "${idsCL[White]}Inverter State ${idsCL[Default]}: ${INV_STATE_disp}" - echo -e "${idsCL[White]}Inverter Mode ${idsCL[Default]}: ${INV_MODE_disp}" - echo -e "${idsCL[White]}Inverter Alarms ${idsCL[Default]}: ${INV_ALARM_disp}" - echo -e "${idsCL[White]}Inverter Errors ${idsCL[Default]}: ${INV_ERROR_disp}" - echo - echo -e "${idsCL[White]}Inverter Input Volts ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${INPUTV}`'volts" - echo -e "${idsCL[White]}Inverter Input Amps ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${INPUTA}`'amps" - echo - echo -e "${idsCL[White]}Inverter Output Volts ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${OUTPUTV}`'volts / `IDS_NUMBER_FORMAT ${OUTPUTV2}`'volts" - echo -e "${idsCL[White]}Inverter Output Amps ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${OUTPUTA}`'amps / `IDS_NUMBER_FORMAT ${OUTPUTA2}`'amps" - echo -e "${idsCL[White]}Inverter Output Watts ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${OUTPUTW}`'watts" - echo - echo -e "${idsCL[White]}Battery Voltage ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${BATTV}`'volts ~ `IDS_NUMBER_FORMAT ${BATTLIFE}`%" - echo -e "${idsCL[White]}Battery Amps Chg/DChg ${idsCL[Default]}: ${BATTA_disp}${idsCL[Default]}" - - # echo - DIVIDER . lightCyan 75 - - echo -en "${idsCL[Yellow]}Pulling data from 'ServerRoom' ... " - - # if [ "$(CHECK_HOST ${PW_UPS_IP})" != "false" ]; then - SVRRM_VOLTIN=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_UPS_IP} iso.3.6.1.4.1.850.1.1.3.1.3.2.2.1.3.1.1 | sed 's/.*: //') - SVRRM_VOLTIN=`echo "scale=2; ${SVRRM_VOLTIN}/10" | bc` - SVRRM_VOLTOUT=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_UPS_IP} iso.3.6.1.4.1.850.1.1.3.1.3.3.2.1.2.1.1 | sed 's/.*: //') - SVRRM_VOLTOUT=`echo "scale=2; ${SVRRM_VOLTOUT}/10" | bc` - - SVRRM_WATT=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_UPS_IP} iso.3.6.1.4.1.850.1.1.3.1.3.3.2.1.4.1.1 | sed 's/.*: //') - SVRRM_AMP=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_UPS_IP} iso.3.6.1.4.1.850.1.1.3.1.3.3.2.1.3.1.1 | sed 's/.*: //') - SVRRM_AMP=`echo "scale=2; ${SVRRM_AMP}/100" | bc` - # fi - # - # if [ "$(CHECK_HOST ${PW_APCPDU_IP})" != "false" ]; then - APCPDU_AMP=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_APCPDU_IP} .1.3.6.1.4.1.318.1.1.12.2.3.1.1.2.1 | sed 's/.*: //') - APCPDU_AMP=`echo "scale=2; ${APCPDU_AMP}/10" | bc` - APCPDU_WATT2=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_APCPDU_IP} .1.3.6.1.4.1.318.1.1.12.1.16.0 | sed 's/.*: //') - APCPDU_WATT=`echo "scale=2; ${APCPDU_AMP}*${SVRRM_VOLTOUT}" | bc` - # fi - - if [ "${SVRRM_VOLTOUT}" != "" ]; then - if [ "${APCPDU_AMP}" != "" ]; then - NETRK_AMP=`echo "scale=2; ${SVRRM_AMP}-${APCPDU_AMP}" | bc` - NETRK_WATT=`echo "scale=2; ${SVRRM_WATT}-${APCPDU_WATT}" | bc` - NETRK_WATT2=`echo "scale=2; ${SVRRM_WATT}-${APCPDU_WATT2}" | bc` - fi - VOLT_DROP=`echo "scale=1; ${OUTPUTV2}-${SVRRM_VOLTIN}" | bc` - fi - - echo -en "\r\033[K" - echo -e "${idsCL[White]}ServerRack Amps ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${APCPDU_AMP}`'amps${idsCL[Default]}" - - MSG="${idsCL[White]}ServerRack Wattage ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${APCPDU_WATT}`'watts ${idsCL[Default]}~ estimate" - echo -en "${MSG}" - if [ "${avgdays}" != "" ]; then - echo -en "${idsCL[LightYellow]} Calculating average ...${idsCL[Default]}" - average=$(AVERAGEPOWER ${PW_POWERSENSOR_ID['server-rack']} ${avgdays}); average_disp="${idsCL[LightYellow]} `IDS_NUMBER_FORMAT ${average}`'watts" - echo -en "\r\033[K"; echo -en "${MSG}${idsCL[LightYellow]}${average_disp}" - else - echo -en " ${idsCL[LightCyan]}(`IDS_NUMBER_FORMAT ${APCPDU_WATT2}` watts)" - fi - echo -e "${idsCL[Default]}" - - DIVIDER . lightCyan 75 - - echo -e "${idsCL[White]}NetworkRack Amps ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${NETRK_AMP}`'amps ${idsCL[Default]}~ estimate${idsCL[Green]}${idsCL[Default]}" - MSG="${idsCL[White]}NetworkRack Wattage ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${NETRK_WATT} 2 true`'watts ${idsCL[Default]}~ estimate" - echo -en "${MSG}" - if [ "${avgdays}" != "" ]; then - echo -en "${idsCL[LightYellow]} Calculating average ...${idsCL[Default]}" - average=$(AVERAGEPOWER ${PW_POWERSENSOR_ID['network-rack']} ${avgdays}); average_disp="${idsCL[LightYellow]} `IDS_NUMBER_FORMAT ${average}`'watts" - echo -en "\r\033[K"; echo -en "${MSG}${idsCL[LightYellow]}${average_disp}" - else - echo -en " ${idsCL[LightCyan]}(`IDS_NUMBER_FORMAT ${NETRK_WATT2}` watts)" - fi - echo -e "${idsCL[Default]}" - - # echo - DIVIDER . lightCyan 75 - - echo -e "${idsCL[White]}Server Room Voltage IN ${idsCL[Default]}: ${idsCL[Green]}${SVRRM_VOLTIN}'volts${idsCL[Default]}" - echo -e "${idsCL[White]}Server Room Voltage OUT ${idsCL[Default]}: ${idsCL[Green]}${SVRRM_VOLTOUT}'volts${idsCL[Default]}" - echo -e "${idsCL[LightCyan]}Voltage Drop ${idsCL[Default]}: ${idsCL[LightRed]}${VOLT_DROP}'volts${idsCL[Default]}" - echo -e "${idsCL[White]}Server Room Amps ${idsCL[Default]}: ${idsCL[Green]}${SVRRM_AMP}'amps${idsCL[Default]}" - - MSG="${idsCL[White]}Server Room Wattage ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${SVRRM_WATT}`'watts" - echo -en "${MSG}" - if [ "${avgdays}" != "" ]; then - echo -en "${idsCL[LightYellow]} Calculating average ...${idsCL[Default]}" - average=$(AVERAGEPOWER ${PW_POWERSENSOR_ID['total']} ${avgdays}); average_disp="${idsCL[LightYellow]} `IDS_NUMBER_FORMAT ${average}`'watts" - echo -en "\r\033[K"; echo -e "${MSG}${idsCL[LightYellow]}${average_disp}${idsCL[Default]}" - else - echo -e "${idsCL[Default]}" - fi - echo - - fi - - if ([ "${STYPE}" == "" ] || [ "${STYPE}" == "offsite" ]) && [ "${PTYPE}" != "esxi" ]; then - - DIVIDER . yellow 75 - echo -e "${idsCL[Yellow]}Offsite Power Information ${idsCL[LightYellow]}${avgdayshdr}" - DIVIDER . yellow 75 - - echo -en "${idsCL[Yellow]}Pulling data from 'Offsite' ... " - - upsinfo=$(ssh -q -o ConnectTimeout=1 -o ConnectionAttempts=1 admin@10.2.1.1 'upsc CP1500PFCLCD') - if [ "$(echo "${upsinfo}" | grep 'input.voltage:')" != "" ]; then - OFFSITE_VOLTIN=$(echo "${upsinfo}" | grep 'input.voltage:' | sed 's/.*: //') - OFFSITE_VOLTOUT=$(echo "${upsinfo}" | grep 'output.voltage:' | sed 's/.*: //') - OFFSITE_LOAD=$(echo "${upsinfo}" | grep 'ups.load:' | sed 's/.*: //') - OFFSITE_LOAD=`echo "scale=2; ${OFFSITE_LOAD}/100" | bc` - OFFSITE_WATTS=`echo "scale=2; ${OFFSITE_LOAD}*$(echo "${upsinfo}" | grep 'ups.realpower.nominal:' | sed 's/.*: //')" | bc` - OFFSITE_AMPS=`echo "scale=2; ${OFFSITE_WATTS}/${OFFSITE_VOLTOUT}" | bc` - (( $(bc <<<"${OFFSITE_AMPS} < 1") )) && [[ "${OFFSITE_AMPS}" = *"."* ]] && OFFSITE_AMPS="0${OFFSITE_AMPS}" - OFFSITE_BATT_RUNTIME=$(echo "${upsinfo}" | grep 'battery.runtime:' | sed 's/.*: //') - OFFSITE_BATT_RUNTIME=`echo "scale=2; ${OFFSITE_BATT_RUNTIME}/60" | bc` - OFFSITE_BATT_CAP=$(echo "${upsinfo}" | grep 'battery.charge:' | sed 's/.*: //') - - # vHOSTFAN=$(ssh root@${PW_RACADM_ACCESS} racadm -r 10.2.1.21 -u ${PW_ESXI_USER} -p "'${PW_ESXI_PASS}'" getsensorinfo | grep "System Board Fan1" 2>&1) - # FanSpeed=$(echo ${vHOSTFAN} | awk '/ / {print $8}' | sed -e 's/%//g') - - # OFFSITE_VOLTIN=$(snmpwalk -t 1 -r 0 -v 1 -c public 10.2.1.100 iso.3.6.1.4.1.3808.1.1.1.3.2.1.0 | sed 's/.*: //') - # OFFSITE_VOLTIN=`echo "scale=2; ${OFFSITE_VOLTIN}/10" | bc` - # OFFSITE_VOLTOUT=$(snmpwalk -t 1 -r 0 -v 1 -c public 10.2.1.100 iso.3.6.1.4.1.3808.1.1.1.4.2.1.0 | sed 's/.*: //') - # OFFSITE_VOLTOUT=`echo "scale=2; ${OFFSITE_VOLTOUT}/10" | bc` - # OFFSITE_LOAD=$(snmpwalk -t 1 -r 0 -v 1 -c public 10.2.1.100 iso.3.6.1.4.1.3808.1.1.1.4.2.3.0 | sed 's/.*: //') - # OFFSITE_LOAD=`echo "scale=2; ${OFFSITE_LOAD}/100" | bc` - # OFFSITE_WATTS=`echo "scale=2; ${OFFSITE_LOAD}*900" | bc` - # OFFSITE_AMPS=`echo "scale=2; ${OFFSITE_WATTS}/${OFFSITE_VOLTOUT}" | bc` - # OFFSITE_BATT_RUNTIME=$(snmpwalk -t 1 -r 0 -v 1 -c public 10.2.1.100 iso.3.6.1.2.1.33.1.2.3.0 | sed 's/.*: //') - # OFFSITE_BATT_CAP=$(snmpwalk -t 1 -r 0 -v 1 -c public 10.2.1.100 iso.3.6.1.2.1.33.1.2.4.0 | sed 's/.*: //') - - fi - - echo -en "\r\033[K" - echo -e "${idsCL[White]}UPS Voltage In ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${OFFSITE_VOLTIN}`'volts${idsCL[Default]}" - echo -e "${idsCL[White]}UPS Voltage Out ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${OFFSITE_VOLTOUT}`'volts${idsCL[Default]}" - echo - - echo -e "${idsCL[White]}Battery Capacity ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${OFFSITE_BATT_CAP}`%${idsCL[Default]}" - echo -e "${idsCL[White]}Battery Runtime ${idsCL[Default]}: ${idsCL[Green]}${OFFSITE_BATT_RUNTIME}'Mins${idsCL[Default]}" - echo - - echo -e "${idsCL[White]}Total Amps ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${OFFSITE_AMPS}`'amps ${idsCL[Default]}~ estimate${idsCL[Green]}${idsCL[Default]}" - MSG="${idsCL[White]}Total Wattage ${idsCL[Default]}: ${idsCL[Green]}`IDS_NUMBER_FORMAT ${OFFSITE_WATTS}`'watts ${idsCL[Default]}~ estimate" - echo -en "${MSG}" - if [ "${avgdays}" != "" ]; then - echo -en "${idsCL[LightYellow]} Calculating average ...${idsCL[Default]}" - average=$(AVERAGEPOWER ${PW_POWERSENSOR_ID['offsite-ups']} ${avgdays}); average_disp="${idsCL[LightYellow]} `IDS_NUMBER_FORMAT ${average}`'watts" - echo -en "\r\033[K"; echo -e "${MSG}${idsCL[LightYellow]}${average_disp}" - fi - echo -e "${idsCL[Default]}\n" - - # echo -e "${idsCL[LightCyan]}Current Fan Speed ${idsCL[Default]}: ${idsCL[Green]}${FanSpeed}'%${idsCL[Default]}" - # echo - fi - - if [ "${PTYPE}" != "power" ]; then - DIVIDER . yellow 75 - echo -e "${idsCL[Yellow]}ESXi Host Power Information ${avgdayshdr}" - DIVIDER . yellow 75 - - for SENSOR in ${PW_SENSOR_ORD[@]}; do - if [ "${PW_HOST_IDRACS[${SENSOR}]}" != "" ]; then - gochk=0 - if [ "${STYPE}" == "" ] || ([ "${STYPE}" == "mainsite" ] && [[ "${PW_HOST_IDRACS[${SENSOR}]}" = *"10.10."* ]]) || ([ "${STYPE}" == "offsite" ] && [[ "${PW_HOST_IDRACS[${SENSOR}]}" = *"10.2.1."* ]]); then - gochk=1 - fi - if [ ${gochk} -eq 1 ]; then - echo -en "${idsCL[Yellow]}Pulling data for '${SENSOR}' ... " - - HOST_WATT_SENSORS=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_HOST_IDRACS[${SENSOR}]} iso.3.6.1.4.1.674.10892.5.4.600.30.1.8.1 -O vq 2> /dev/null | sed -e 's/"//g') - IFS=$'\n' - read -rd '' -a HOST_WATT_SENSORS <<<"${HOST_WATT_SENSORS}" - unset IFS - PS1='0.0'; PS2='0.0'; HOST_WATTS=0 - if [ "${HOST_WATT_SENSORS}" != "" ]; then - found=0 - for s in {1..5}; do - DP=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_HOST_IDRACS[${SENSOR}]} iso.3.6.1.4.1.674.10892.5.4.600.30.1.8.1.${s} | sed 's/.*: //') - if [[ "${DP}" = *"System Board"* ]]; then - found=1 - HOST_WATTS=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_HOST_IDRACS[${SENSOR}]} iso.3.6.1.4.1.674.10892.5.4.600.30.1.6.1.${s} | sed 's/.*: //') - - elif [[ "${DP}" = *"PS1"* ]]; then - PS1=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_HOST_IDRACS[${SENSOR}]} iso.3.6.1.4.1.674.10892.5.4.600.30.1.6.1.${s} | sed 's/.*: //') - elif [[ "${DP}" = *"PS2"* ]]; then - PS2=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_HOST_IDRACS[${SENSOR}]} iso.3.6.1.4.1.674.10892.5.4.600.30.1.6.1.${s} | sed 's/.*: //') - fi - done - if [ ${found} -eq 1 ] && [ "${HOST_WATTS}" != "0" ] && [ "${HOST_WATTS}" != "" ]; then - [ "${PS1}" != "0.0" ] && PS1=`echo "scale=1; ${PS1}/10" | bc` && (( $(bc <<<"${PS1} < 1") )) && [[ "${PS1}" = *"."* ]] && PS1="0${PS1}" - [ "${PS2}" != "0.0" ] && PS2=`echo "scale=1; ${PS2}/10" | bc` && (( $(bc <<<"${PS2} < 1") )) && [[ "${PS2}" = *"."* ]] && PS2="0${PS2}" - HOST_AMPS=`echo "scale=1; ${PS1}+${PS2}" | bc` - HOST_WATTS_disp="${idsCL[Green]}${HOST_AMPS}'amps - `IDS_NUMBER_FORMAT ${HOST_WATTS}`'watts" - - elif [ "$(ipmitool -I lanplus -H ${PW_HOST_IDRACS[${SENSOR}]} -U ${PW_ESXI_USER} -P "${PW_ESXI_PASS}" chassis power status | grep off)" != "" ]; then - HOST_WATTS_disp="${idsCL[LightRed]}Host powered down" - HOST_WATTS=-1 - - elif [ "${HOST_WATTS}" == "0" ]; then - HOST_WATTS_disp="${idsCL[Yellow]}Host PSU not capable" - - else - HOST_WATTS_disp="${idsCL[LightRed]}Could not pull data" - - fi - - [ "${HOST_WATTS}" == "" ] && HOST_WATTS=0 - - else - HOST_WATTS_disp="${idsCL[LightRed]}Host offline" - fi - - MSG="${idsCL[White]}${SENSOR} ${idsCL[Default]}: ${HOST_WATTS_disp}" - echo -en "\r\033[K${MSG}" - - if [ "${HOST_WATT_SENSORS}" != "" ]; then - if [ "${avgdays}" != "" ] && [ ${HOST_WATTS} -gt 0 ]; then - echo -en "${idsCL[LightYellow]} Calculating average ...${idsCL[Default]}" - average=$(AVERAGEPOWER ${PW_POWERSENSOR_ID[${SENSOR}]} ${avgdays}); average_disp="${idsCL[LightYellow]} `IDS_NUMBER_FORMAT ${average}`'watts" - echo -en "\r\033[K"; echo -en "${MSG}${idsCL[LightYellow]}${average_disp}" - elif [ ${HOST_WATTS} -gt 0 ]; then - echo -en "${idsCL[Cyan]} [PS1=${idsCL[LightCyan]}${PS1}'A${idsCL[Cyan]}, PS2=${idsCL[LightCyan]}${PS2}'A${idsCL[Cyan]}]" - fi - if [ "${PW_HOST_IDRACS[${SENSOR}]}" == "10.2.1.21" ] && [ ${HOST_WATTS} -ge 0 ]; then - vHOSTFAN=$(snmpwalk -v 1 -c public -t 2 ${PW_HOST_IDRACS[${SENSOR}]} .1.3.6.1.4.1.674.10892.5.4.700.12.1.6.1.3 -O vq) - FanSpeed=`echo "scale=2; ${vHOSTFAN}/21200" | bc`; FanSpeed=`echo "scale=0; ${FanSpeed}*100/1" | bc` - # vHOSTFAN=$(ssh root@${PW_RACADM_ACCESS} racadm -r ${PW_HOST_IDRACS[${SENSOR}]} -u ${PW_ESXI_USER} -p "'${PW_ESXI_PASS}'" getsensorinfo | grep "System Board Fan1" 2>&1) - # FanSpeed=$(echo ${vHOSTFAN} | awk '/ / {print $8}' | sed -e 's/%//g') - echo -en "${idsCL[LightCyan]} [FanSpeed=${FanSpeed}'%]" - fi - fi - - echo -e "${idsCL[Default]}" - fi - fi - done - fi - - - end=`date +%s`; runtime=$((end-start)); echo -e "\nruntime: ${runtime}" - [ "${PW_ACTION}" != "" ] && echo -} - -CHECKPOWER_SERVICE(){ - touch ${PW_TMPFOLDER}/power.ac.start - touch ${PW_TMPFOLDER}/power.dc.start - while true; do - INVSTATSINFO=$(curl -s "http://${PW_INVERTER_IP}/stats.json") - SVRRM_UPS_INPUTACV=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_UPS_IP} iso.3.6.1.4.1.850.1.1.3.1.3.2.2.1.3.1.1 | sed 's/.*: //') - - if (( $(bc <<<"${SVRRM_UPS_INPUTACV} < ${min_acvolt}") )); then - if [ ! -f ${PW_TMPFOLDER}/power.ups.low ]; then - touch ${PW_TMPFOLDER}/power.ups.low - - elif [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/power.ups.low)) -ge 60 ]; then - SENDNOTICE "POWER ALERT - UPS POWER OFF/LOW POWER!!" "UPS has no power for 1min, shutting all servers down!" 1 - - - ######################### FINISH - - - fi - - elif [ -f ${PW_TMPFOLDER}/power.ups.low ]; then - rm -f ${PW_TMPFOLDER}/power.ups.low - fi - - if [ "${INVSTATSINFO}" != "" ]; then - INPUTACV=$(echo ${INVSTATSINFO} | jq '.inputs .inV') - BATTVOLT=$(echo ${INVSTATSINFO} | jq '.inputs .battV') - [ ! "${last_battvolt}" ] && last_battvolt=${BATTVOLT} - - if (( $(bc <<<"${INPUTACV} >= ${min_acvolt}") )); then - [ "${last_battvolt}" != "${BATTVOLT}" ] && last_battvolt=${BATTVOLT} - if [ -f ${PW_TMPFOLDER}/power.ac.low ]; then - echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${INPUTACV}'volts / ${BATTVOLT}'volts - Back to Normal Voltage" >> ${PW_LOGPOWER} - SENDNOTICE "POWER NOMINAL AGAIN" "Normal voltage detected -VOLTAGE: ${INPUTACV}'volts" - else - [ $(expr `date +%s` - $(stat -c %Y ${PW_LOGPOWER})) -ge $(echo "scale=0; ${PW_LOG_INTERVAL_NORMAL}*60" | bc) ] && echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${INPUTACV}'volts - Normal Voltage" >> ${PW_LOGPOWER} - if [ -f ${PW_TMPFOLDER}/power.ac.start ]; then - SENDNOTICE "Power Nominal" "Service Startup -Normal voltage detected -VOLTAGE: ${INPUTACV}'volts -BATT VOLTAGE: ${BATTVOLT}'volts" - echo "($(date +'%Y-%m-%d %H:%M:%S')) - Input: ${INPUTACV}'volts - 'Check Power' Service Startup - Normal voltage detected" >> ${PW_LOGFILE} - echo "($(date +'%Y-%m-%d %H:%M:%S')) - Input: ${INPUTACV}'volts - 'Check Power' Service Startup - Normal voltage detected" >> ${PW_LOGPOWER} - rm -f ${PW_TMPFOLDER}/power.ac.start - fi - fi - if [ ! -f ${PW_TMPFOLDER}/power.ac.good ]; then - - if [ -f ${PW_TMPFOLDER}/power.sys.off ] || [ -f ${PW_TMPFOLDER}/power.main.off ] || [ -f ${PW_TMPFOLDER}/power.ac.conserve ]; then - SENDNOTICE "HOSTS POWER" "Power restored! Will wait ${PW_WAIT_TO_POWER_SERVERS}'mins before turning host(s) back on" - touch ${PW_TMPFOLDER}/.power.restored - fi - - rm -f ${PW_TMPFOLDER}/power.ac.* - touch ${PW_TMPFOLDER}/power.ac.good - - elif [ -f ${PW_TMPFOLDER}/.power.restored ] && [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/.power.restored)) -ge $(echo "scale=0; ${PW_WAIT_TO_POWER_SERVERS}*60" | bc) ]; then - HOSTMGMT mainsite -p on >/dev/null 2>&1 - rm -f ${PW_TMPFOLDER}/.power.restored - fi - - # UPDATE APC-PDU LINE TO LINE VOLTAGE - CURRENT_VOLTAGE=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_APCPDU_IP} .1.3.6.1.4.1.318.1.1.12.1.15.0 | sed 's/.*: //') - SET_VOLTAGE=`echo "scale=2; $(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_UPS_IP} iso.3.6.1.4.1.850.1.1.3.1.3.3.2.1.2.1.1 | sed 's/.*: //')/10" | bc | awk '{print int($1+0.5)}'` - [ "${SET_VOLTAGE}" ] && [ ${CURRENT_VOLTAGE} -ne ${SET_VOLTAGE} ] && run=$(snmpset -v 1 -c private ${PW_APCPDU_IP} .1.3.6.1.4.1.318.1.1.12.1.15.0 i ${SET_VOLTAGE} >/dev/null 2>&1) && echo -e "($(date +'%Y-%m-%d %H:%M:%S')) - ${CURRENT_VOLTAGE}'volts --> ${SET_VOLTAGE}'volts - LINE-TO-LINE VOLTAGE UPDATED ON APC-PDU" >> ${PW_LOGPOWER} - - else - [ $(expr `date +%s` - $(stat -c %Y ${PW_LOGPOWER})) -ge 300 ] && echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${INPUTACV}'volts / ${BATTVOLT}'volts - Power OFF or LOW" >> ${PW_LOGPOWER} - if [ -f ${PW_TMPFOLDER}/power.ac.good ]; then - echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${INPUTACV}'volts / ${BATTVOLT}'volts - Power OFF or LOW voltage detected" >> ${PW_LOGPOWER} - SENDNOTICE "POWER ALERT - POWER OFF/LOW!!" "Power off or low voltage detected -VOLTAGE: ${INPUTACV}'volts -BATT VOLTAGE: ${BATTVOLT}'volts" 1 - rm -f ${PW_TMPFOLDER}/power.ac.good - touch ${PW_TMPFOLDER}/power.ac.low - - ##### SHUTDOWN OFFSITE SERVER WHILE ITS AT MAINSITE - SHUTDOWN_SERVER 10.2.1.11 & - - - fi - if [ ! -f ${PW_TMPFOLDER}/power.ac.conserve ] && [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/power.ac.low)) -ge $(echo "scale=0; ${PW_CONSERVE_AFTER}*60" | bc) ]; then - echo -e "($(date +'%Y-%m-%d %H:%M:%S')) - ${INPUTACV}'volts / ${BATTVOLT}'volts - Shutting down iSCSI VM's and Host to conserve power" >> ${PW_LOGPOWER} - SENDNOTICE "POWER ALERT - Conserving Power" "Shutting down iSCSI VM's and Host to conserve power" 1 - SHUTDOWN_SERVER ${PW_HOST_IDRACS['iDS-vMS-Host0']} & - touch ${PW_TMPFOLDER}/power.ac.conserve - fi - fi - - if (( $(bc <<<"${BATTVOLT} >= ${min_battvolt}") )); then - [ $(expr `date +%s` - $(stat -c %Y ${PW_LOGPOWER})) -ge $(echo "scale=0; ${PW_LOG_INTERVAL_NORMAL}*60" | bc) ] && echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${BATTVOLT}'volts - Battery Voltage" >> ${PW_LOGPOWER} - if [ -f ${PW_TMPFOLDER}/power.dc.start ]; then - echo "($(date +'%Y-%m-%d %H:%M:%S')) - Battery: ${BATTVOLT}'volts - Service Startup - Normal voltage detected" >> ${PW_LOGPOWER} - rm -f ${PW_TMPFOLDER}/power.dc.start - fi - if [ ! -f ${PW_TMPFOLDER}/power.dc.good ]; then - rm -f ${PW_TMPFOLDER}/power.dc.* - touch ${PW_TMPFOLDER}/power.dc.good - fi - - else - [ -f ${PW_TMPFOLDER}/power.dc.good ] && rm -f ${PW_TMPFOLDER}/power.dc.good - [ $(expr `date +%s` - $(stat -c %Y ${PW_LOGPOWER})) -ge $(echo "scale=0; ${PW_LOG_INTERVAL_ABNORMAL}*60" | bc) ] && echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${BATTVOLT}'volts - LOW BATTERY Voltage" >> ${PW_LOGPOWER} - - if (( $(bc <<<"${BATTVOLT} <= ${min_battvolt_sys}") )); then - [ ! -f ${PW_TMPFOLDER}/power.dc.critlow ] && touch ${PW_TMPFOLDER}/power.dc.critlow - - if [ ! -f ${PW_TMPFOLDER}/power.sys.off ] && (( $(bc <<<"${INPUTACV} < ${min_acvolt}") )); then - echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${BATTVOLT}'volts - Shutting down all remaining servers..." >> ${PW_LOGFILE} - echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${BATTVOLT}'volts - Shutting down all remaining servers..." >> ${PW_LOGPOWER} - SENDNOTICE "BATT-VOLT REALLY LOW: SHUTDOWN SYS SERVERS" "Battery Voltage REALLY LOW: ${BATTVOLT}'volts -Shutting down all remaining servers" 1 - SHUTDOWN_SYS POWER & - - fi - - elif (( $(bc <<<"${BATTVOLT} < ${min_battvolt}") )); then - [ ! -f ${PW_TMPFOLDER}/power.dc.low ] && touch ${PW_TMPFOLDER}/power.dc.low - - if [ ! -f ${PW_TMPFOLDER}/power.main.off ] && (( $(bc <<<"${INPUTACV} < ${min_acvolt}") )); then - echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${BATTVOLT}'volts - Shutting down main servers..." >> ${PW_LOGFILE} - echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${BATTVOLT}'volts - Shutting down main servers..." >> ${PW_LOGPOWER} - SENDNOTICE "BATT-VOLT LOW: SHUTDOWN MAIN SERVERS" "Battery Voltage LOW: ${BATTVOLT}'volts -Shutting down main servers" 1 - SHUTDOWN_MAIN POWER & - - fi - - elif [ ! -f ${PW_TMPFOLDER}/power.main.off ] && [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/power.dc.low)) -ge $(echo "scale=0; ${PW_SHUTDOWN_MAINSERVERS_AFTER}*60" | bc) ]; then - echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${BATTVOLT}'volts - Shutting down main servers..." >> ${PW_LOGFILE} - echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${BATTVOLT}'volts - Shutting down main servers..." >> ${PW_LOGPOWER} - SENDNOTICE "BATT-VOLT LOW: SHUTDOWN MAIN SERVERS" "Battery Voltage LOW: ${BATTVOLT}'volts -Shutting down main servers" 1 - SHUTDOWN_MAIN POWER & - fi - - volt_diff=`echo "scale=1; ${last_battvolt}-${BATTVOLT}" | bc` - (( $(bc <<<"${volt_diff} < 0") )) && volt_diff=`echo "scale=1; ${volt_diff} * -1" | bc` - if (( $(bc <<<"${volt_diff} > 0.5") )); then - SENDNOTICE "BATTERY VOLTAGE CHANGE" "Battery Voltage: ${BATTVOLT}'volts" - echo -e "($(date +'%Y-%m-%d %H:%M:%S')) - ${BATTVOLT}'volts - Battery Voltage Change" >> ${PW_LOGPOWER} - last_battvolt=${BATTVOLT} - fi - - fi - - else - sleep 20s - fi - - ######offsite check - -# if [ "$(CHECK_HOST 10.2.1.1)" != "false" ]; then -# upsinfo=$(ssh admin@10.2.1.1 'upsc CP1500PFCLCD') -# OFFSITE_VOLTIN=$(echo "${upsinfo}" | grep 'input.voltage:' | sed 's/.*: //') -# OFFSITE_BATT_RUNTIME=$(echo "${upsinfo}" | grep 'battery.runtime:' | sed 's/.*: //') -# OFFSITE_BATT_RUNTIME=`echo "scale=2; ${OFFSITE_BATT_RUNTIME}/60" | bc` -# OFFSITE_BATT_CAP=$(echo "${upsinfo}" | grep 'battery.charge:' | sed 's/.*: //') -# -# if (( $(bc <<<"${OFFSITE_VOLTIN} >= ${min_acvolt}") )); then -# if [ -f ${PW_TMPFOLDER}/power.offsite.ac.low ]; then -# echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${OFFSITE_VOLTIN}'volts - Offsite Back to Normal Voltage" >> ${PW_LOGPOWER} -# echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${OFFSITE_VOLTIN}'volts - OFFSITE POWER NOMINAL AGAIN" >> ${PW_LOGFILE} -# SENDNOTICE "OFFSITE POWER NOMINAL AGAIN" "Normal voltage detected -# VOLTAGE: ${OFFSITE_VOLTIN}'volts" -# rm -f ${PW_TMPFOLDER}/power.offsite.ac.* -# fi -# if [ -f ${PW_TMPFOLDER}/power.offsite.off ]; then -# if [ ! -f ${PW_TMPFOLDER}/power.offsite.restored ]; then -# touch ${PW_TMPFOLDER}/power.offsite.restored -# -# elif [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/power.offsite.restored)) -ge 60 ]; then -# SENDNOTICE "OFFSITE HOST POWER" "Powering offsite host(s) back on after power was restored" -# for offsite_host in "${PW_OFFSITEHOSTS[@]}"; do -# HOSTPOWER ${offsite_host} on >/dev/null 2>&1 -# done -# rm -f ${PW_TMPFOLDER}/power.offsite.* -# fi -# -# else -# [ $(expr `date +%s` - $(stat -c %Y ${PW_LOGPOWER})) -le 300 ] && echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${OFFSITE_VOLTIN}'volts - Offsite Normal Voltage" >> ${PW_LOGPOWER} -# fi -# else -# echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${OFFSITE_VOLTIN}'volts - OFFSITE POWER OFF/LOW POWER" >> ${PW_LOGPOWER} -# echo "($(date +'%Y-%m-%d %H:%M:%S')) - ${OFFSITE_VOLTIN}'volts - OFFSITE POWER OFF/LOW POWER" >> ${PW_LOGFILE} -# -# if [ ! -f ${PW_TMPFOLDER}/power.offsite.ac.low ] || [ $(expr `date +%s` - $(stat -c %Y ${PW_TMPFOLDER}/power.offsite.ac.low)) -ge 240 ]; then -# SENDNOTICE "OFFSITE POWER ALERT - POWER OFF/LOW!!" "Power off or low voltage detected -# BATT CAPACITY: ${OFFSITE_BATT_CAP}'%25 -# BATT RUNTIME: ${OFFSITE_BATT_RUNTIME}'Mins" 1 -# touch ${PW_TMPFOLDER}/power.offsite.ac.low -# fi -# -# if (( $(bc <<<"${OFFSITE_BATT_CAP} <= 95") )) && [ ! -f ${PW_TMPFOLDER}/power.offsite.off ]; then -# SENDNOTICE "OFFSITE HOST POWER" "Powering DOWN offsite host(s) due to power outage" 1 -# SHUTDOWN_OFFSITE & -# touch ${PW_TMPFOLDER}/power.offsite.off -# fi -# fi -# -# -# fi - - sleep 10s - done # & -} - -POWERLOGGER_SERVICE(){ - while true; do - LogDataTime=`date +'%Y-%m-%d %H:%M:%S'` - - INVSTATSINFO=$(curl -s "http://${PW_INVERTER_IP}/stats.json") - if [ "${INVSTATSINFO}" != "" ]; then - INPUTV=`echo ${INVSTATSINFO} | jq '.inputs .inV'` - INPUTA=`echo ${INVSTATSINFO} | jq '.inputs .inA'` - OUTPUTV=`echo ${INVSTATSINFO} | jq '.outputs .outV'` - OUTPUTA=`echo ${INVSTATSINFO} | jq '.outputs .outA'` - OUTPUTW=`echo ${INVSTATSINFO} | jq '.outputs .outW'` - BATTV=`echo ${INVSTATSINFO} | jq '.inputs .battV'` - BATTA=`echo ${INVSTATSINFO} | jq '.inputs .xfA'` - - QRY="INSERT INTO power_data (\`sensorid\`, \`date\`, \`volt\`, \`amp\`) VALUES ('${PW_POWERSENSOR_ID['inv-in']}','${LogDataTime}','${INPUTV}','${INPUTA}')" - ${mysql_conn} -e "USE servermonitor; ${QRY}" - QRY="INSERT INTO power_data (\`sensorid\`, \`date\`, \`volt\`, \`amp\`, \`watt\`) VALUES ('${PW_POWERSENSOR_ID['inv-out']}','${LogDataTime}','${OUTPUTV}','${OUTPUTA}','${OUTPUTW}')" - ${mysql_conn} -e "USE servermonitor; ${QRY}" - QRY="INSERT INTO power_data (\`sensorid\`, \`date\`, \`volt\`, \`amp\`) VALUES ('${PW_POWERSENSOR_ID['battery']}','${LogDataTime}','${BATTV}','${BATTA}')" - ${mysql_conn} -e "USE servermonitor; ${QRY}" - - QRY="INSERT INTO inv_jsonstats (\`date\`, \`data\`) VALUES ('${LogDataTime}','${INVSTATSINFO}')" - ${mysql_conn} -e "USE servermonitor; ${QRY}" - fi - - if [ "$(CHECK_HOST ${PW_UPS_IP})" != "false" ]; then - SVRRM_VOLT=$(snmpwalk -v 1 -c public ${PW_UPS_IP} iso.3.6.1.4.1.850.1.1.3.1.3.3.2.1.2.1.1 | sed 's/.*: //') - SVRRM_VOLT=`echo "scale=1; ${SVRRM_VOLT}/10" | bc` - SVRRM_WATT=$(snmpwalk -v 1 -c public ${PW_UPS_IP} iso.3.6.1.4.1.850.1.1.3.1.3.3.2.1.4.1.1 | sed 's/.*: //') - SVRRM_AMP=$(snmpwalk -v 1 -c public ${PW_UPS_IP} iso.3.6.1.4.1.850.1.1.3.1.3.3.2.1.3.1.1 | sed 's/.*: //') - SVRRM_AMP=`echo "scale=2; ${SVRRM_AMP}/100" | bc` - - QRY="INSERT INTO power_data (\`sensorid\`, \`date\`, \`volt\`, \`amp\`, \`watt\`) VALUES ('${PW_POWERSENSOR_ID['total']}','${LogDataTime}','${SVRRM_VOLT}','${SVRRM_AMP}','${SVRRM_WATT}')" - ${mysql_conn} -e "USE servermonitor; ${QRY}" - fi - - if [ "$(CHECK_HOST ${PW_APCPDU_IP})" != "false" ]; then - APCPDU_AMP=$(snmpwalk -v 1 -c public ${PW_APCPDU_IP} .1.3.6.1.4.1.318.1.1.12.2.3.1.1.2.1 | sed 's/.*: //') - APCPDU_AMP=`echo "scale=1; ${APCPDU_AMP}/10" | bc` - if [ "${SVRRM_VOLT}" != "" ]; then - APCPDU_WATT=`echo "scale=2; ${APCPDU_AMP}*${SVRRM_VOLT}" | bc` - QRY="INSERT INTO power_data (\`sensorid\`, \`date\`, \`volt\`, \`amp\`, \`watt\`) VALUES ('${PW_POWERSENSOR_ID['server-rack']}','${LogDataTime}','${SVRRM_VOLT}','${APCPDU_AMP}','${APCPDU_WATT}')" - else - QRY="INSERT INTO power_data (\`sensorid\`, \`date\`, \`amp\`) VALUES ('12','${LogDataTime}','${APCPDU_AMP}')" - fi - ${mysql_conn} -e "USE servermonitor; ${QRY}" - fi - - if [ "${SVRRM_VOLT}" != "" ] && [ "${APCPDU_AMP}" != "" ]; then - NETRK_AMP=`echo "scale=2; ${SVRRM_AMP}-${APCPDU_AMP}" | bc` - NETRK_WATT=`echo "scale=0; ${SVRRM_WATT}-${APCPDU_WATT}" | bc` - - QRY="INSERT INTO power_data (\`sensorid\`, \`date\`, \`volt\`, \`amp\`, \`watt\`) VALUES ('${PW_POWERSENSOR_ID['network-rack']}','${LogDataTime}','${SVRRM_VOLT}','${NETRK_AMP}','${NETRK_WATT}')" - ${mysql_conn} -e "USE servermonitor; ${QRY}" - fi - - upsinfo=$(ssh -q -o ConnectTimeout=1 -o ConnectionAttempts=1 admin@10.2.1.1 'upsc CP1500PFCLCD') - if [ "$(echo "${upsinfo}" | grep 'input.voltage:')" != "" ]; then - OFFSITE_VOLTOUT=$(echo "${upsinfo}" | grep 'output.voltage:' | sed 's/.*: //') - OFFSITE_LOAD=$(echo "${upsinfo}" | grep 'ups.load:' | sed 's/.*: //') - OFFSITE_LOAD=`echo "scale=2; ${OFFSITE_LOAD}/100" | bc` - OFFSITE_WATTS=`echo "scale=2; ${OFFSITE_LOAD}*$(echo "${upsinfo}" | grep 'ups.realpower.nominal:' | sed 's/.*: //')" | bc` - OFFSITE_AMPS=`echo "scale=2; ${OFFSITE_WATTS}/${OFFSITE_VOLTOUT}" | bc` - - QRY="INSERT INTO power_data (\`sensorid\`, \`date\`, \`volt\`, \`amp\`, \`watt\`) VALUES ('${PW_POWERSENSOR_ID['offsite-ups']}','${LogDataTime}','${OFFSITE_VOLTOUT}','${OFFSITE_AMPS}','${OFFSITE_WATTS}')" - ${mysql_conn} -e "USE servermonitor; ${QRY}" - fi - - for SENSOR in ${PW_SENSOR_ORD[@]}; do - if [ "${PW_HOST_IDRACS[${SENSOR}]}" != "" ]; then - HOST_WATT_SENSORS=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_HOST_IDRACS[${SENSOR}]} iso.3.6.1.4.1.674.10892.5.4.600.30.1.8.1 -O vq | sed -e 's/"//g') - if [ "${HOST_WATT_SENSORS}" != "" ]; then - IFS=$'\n' - read -rd '' -a HOST_WATT_SENSORS <<<"${HOST_WATT_SENSORS}" - unset IFS - - for s in {1..5}; do - if [[ "$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_HOST_IDRACS[${SENSOR}]} iso.3.6.1.4.1.674.10892.5.4.600.30.1.8.1.${s} | sed 's/.*: //')" = *"System Board"* ]]; then - HOST_WATTS=$(snmpwalk -t 1 -r 0 -v 1 -c public ${PW_HOST_IDRACS[${SENSOR}]} iso.3.6.1.4.1.674.10892.5.4.600.30.1.6.1.${s} | sed 's/.*: //') - if [[ "${HOST_WATTS}" != *"Timeout"* ]] && [ "${HOST_WATTS}" != "0" ]; then - QRY="INSERT INTO power_data (\`sensorid\`, \`date\`, \`watt\`) VALUES ('${PW_POWERSENSOR_ID[${SENSOR}]}','${LogDataTime}','${HOST_WATTS}')" - ${mysql_conn} -e "USE servermonitor; ${QRY}" - fi - break - fi - done - fi - fi - done - - if [ "$(compgen -G "${PW_TMPFOLDER}/temp.*")" != "" ] || [ "$(compgen -G "${PW_TMPFOLDER}/power.*")" != "" ]; then - sleep ${PW_MYSQL_LOG_INTERVAL_ABNORMAL}m - - else - sleep ${PW_MYSQL_LOG_INTERVAL_NORMAL}m - fi - - done -} - RESTARTALL_SERVICES(){ echo STOPALL_SERVICES