From 974f052a77328c907fea65fb2c4d30898ab2e3ef Mon Sep 17 00:00:00 2001 From: VaninPetr Date: Sun, 12 Nov 2023 14:12:50 +0300 Subject: [PATCH] FIrst Commit --- README.md | 77 +++++++ Screenshot_20231112_014602.png | Bin 0 -> 56533 bytes apc_read_sql_strings.sh | 18 ++ apc_snmp_metrics.sh | 109 ++++++++++ apcups_telegram.service | 16 ++ apcups_telegram.sh | 32 +++ check_snmp_apc_ups_state/README.md | 44 ++++ .../check_snmp_apc_ups_state.sh | 199 ++++++++++++++++++ 8 files changed, 495 insertions(+) create mode 100644 README.md create mode 100644 Screenshot_20231112_014602.png create mode 100644 apc_read_sql_strings.sh create mode 100644 apc_snmp_metrics.sh create mode 100644 apcups_telegram.service create mode 100644 apcups_telegram.sh create mode 100644 check_snmp_apc_ups_state/README.md create mode 100644 check_snmp_apc_ups_state/check_snmp_apc_ups_state.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..d82fa85 --- /dev/null +++ b/README.md @@ -0,0 +1,77 @@ +## About + +**Bash APC scripts** - other method for APC AP96xx than apcupsd or nut. + +*I express my gratitude to [Alexey Maksimov](https://blog.it-kb.ru/about-this-blog/) for examples of working snmp handlers - (fork of [his code](https://github.com/Aleksey-Maksimov/check_snmp_apc_ups_state) is in the attachment)* + +### This apc_snmp_metrics.sh script can show current state from networked APC UPS. + +Tested on **Centos 7 GNU/Linux** with **AP9618** in **SURTD3000XLI**, with external termistor **AP9512TBLK** + +
+ +## Usage + To start you need: + 1. add IP (string number 14 variable IPS) + 2. add the user (string number 15 variable SUSER) + 3. add the bot token (string number 20 variable TOKEN) + 4. add chat ID (string number 21 variable CHAT_ID) + 5. add the directory (optional - defalts creates in ```$(pwd)``` dir) + 6. create an init file (optional, see the example **apcups_telegram.service** file) + +#### For one-shot (non-interactive) - simple run in bash: + +``` +~# bash apc_snmp_metrics.sh +``` +And there is example of success result (database not created, only verbosed hypothetic name with path) : + +``` +DB 2023.1112.0043_apc-metric.db +WATTS 16 +AMPRS 2 +CBATT 17 +CEEXT 22 +INPWA 221 +PRBAT 100 +REMAT 1:15:05.00 +BAREP 1 +DATES 1699739034 +DATEN 491653013 +EXITS 0 +``` + +**WATTS** - percent of UPS load in watts +**AMPRS** - current load in amperes +**CBATT** - internal battery temperature +**CEEXT** - external AP9512TBLK temperature +**INPWA** - input line voltage +**PRBAT** - percent of charge batteries +**REMAT** - remain time for current load if 220/230 line turns off +**BAREP** - battery replasing key - 1 is OK, 2 is REPLACE +**DATES** - unix-seconds (date) of local machine +**DATEN** - nano-seconds, each string need for being unique +**EXITS** - exit-code from snmpget utility, used in Telegram function + +
+ +### For daemonized use ```--run``` argument (mode for systemd unit) + +#### This mode creates sqlite database file, than you can get logged data from it. +The database is created anew every time you start it, create a separate directory within /usr/share/ for example. +``` +$ bash apc_snmp_metrics.sh --run +DB /root/2023.1112.0043_apc-metric.db +``` +### Warning! Monitor the disk usage, this script cat write more than 2 MB of data per hour! + +#### For reading sqlite database (daemonized data-log) - run + +```~# bash apc_read_sql_strings.sh``` +This script searching for last writed .db file in specified folder and SELECTing from + +
+ +### Also have fun! Bash rules! + +![picture](https://sources.krechet.tech/vaninpetr/apc_bash/raw/branch/main/Screenshot_20231112_014602.png) \ No newline at end of file diff --git a/Screenshot_20231112_014602.png b/Screenshot_20231112_014602.png new file mode 100644 index 0000000000000000000000000000000000000000..49dfc236a3615f3da4b0662d51f60e3d593d9d67 GIT binary patch literal 56533 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/dev/null + sqlwritetable + funcsend &>/dev/null + done +else + funcrun &>/dev/null + funcsend &>/dev/null + echo WATTS $WATTS + echo AMPRS $AMPRS + echo CBATT $CBATT + echo CEEXT $CEEXT + echo INPWA $INPWA + echo PRBAT $PRBAT + echo REMAT $REMAT + echo BAREP $BAREP + echo DATES $DATES + echo DATEN $DATEN + echo EXITS $EXITS +fi diff --git a/apcups_telegram.service b/apcups_telegram.service new file mode 100644 index 0000000..2773751 --- /dev/null +++ b/apcups_telegram.service @@ -0,0 +1,16 @@ + +[Unit] +Description=APC SNMP TRIGGER +Requires=network-online.target + +[Service] +Type=simple +User=root +Group=root +ExecStart=/bin/bash /root/apcups_telegram.sh +Restart=always +RestartSec=10 +TimeoutSec=10 + +[Install] +WantedBy=multi-user.target diff --git a/apcups_telegram.sh b/apcups_telegram.sh new file mode 100644 index 0000000..770cfa3 --- /dev/null +++ b/apcups_telegram.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +IPS='' # add ip of APC AP module +SUSER1='' # add snmp user + +funcsnmp(){ + cd check_snmp_apc_ups_state + bash check_snmp_apc_ups_state.sh -H $IPS -P 1 -C $SUSER1 +} + +funcsend(){ + TOKEN="" # write Telegrambot token + CHAT_ID="" # write Telegram chat id + curl -s -X POST \ + https://api.telegram.org/bot"$TOKEN"/sendMessage \ + -d chat_id="$CHAT_ID" \ + -d text="$varfuncsnmp" +} + +varf=$( funcsnmp | md5sum ) + while :; do + sleep 1 + varfuncsnmp="$( funcsnmp )" + vars=$( echo "$varfuncsnmp" | md5sum ) + + if [[ $vars != $varf ]]; then + # echo EDITED $(date "+%F_%s") + funcsend > /dev/null + fi + varf=$vars + # sleep 5 + done diff --git a/check_snmp_apc_ups_state/README.md b/check_snmp_apc_ups_state/README.md new file mode 100644 index 0000000..4f4c5d5 --- /dev/null +++ b/check_snmp_apc_ups_state/README.md @@ -0,0 +1,44 @@ +## About +### this is [fork of original](https://github.com/Aleksey-Maksimov/check_snmp_apc_ups_state) by Alexey Maximov +### + +**check_snmp_apc_ups_state** - Icinga Plugin Script (Check Command). + +It calculate APC UPS current state from SNMP data in upsBasicStateOutputState + +Tested on **Debian GNU/Linux 9.11 (Stretch)** with **Icinga r2.10.5-1** + +Put here: /usr/lib/nagios/plugins/check_snmp_apc_ups_state.sh + +PreReq: **snpmget** tool + +## Usage + +Options: + +``` +$ /usr/lib/nagios/plugins/check_snmp_apc_ups_state.sh [OPTIONS] + +Option GNU long option Meaning +------ -------------- ------- +-H --hostname Host name, IP Address +-P --protocol SNMP protocol version. Possible values: 1|2c|3 +-C --community SNMPv1/2c community string for SNMP communication (for example,public) +-L --seclevel SNMPv3 securityLevel. Possible values: noAuthNoPriv|authNoPriv|authPriv +-a --authproto SNMPv3 auth proto. Possible values: MD5|SHA +-x --privproto SNMPv3 priv proto. Possible values: DES|AES +-U --secname SNMPv3 username +-A --authpassword SNMPv3 authentication password +-X --privpasswd SNMPv3 privacy password +-q --help Show this message +-v --version Print version information and exit + +``` +Example for all UPS types: + +``` +$ ./check_snmp_apc_ups_state.sh -H ups001.holding.com -P 2c -C public +``` +Icinga Director integration manual (in Russian): + +[Icinga плагин check_snmp_apc_ups_state для расширенного отслеживания аварийных состояний ИБП APC по данным, полученным по протоколу SNMP из параметра upsBasicStateOutputState](https://blog.it-kb.ru/2019/09/20/icinga-plugin-check_snmp_apc_ups_state-for-abnormal-conditions-monitoring-of-apc-ups-from-snmp-in-flags-from-upsbasicstateoutputstate/) diff --git a/check_snmp_apc_ups_state/check_snmp_apc_ups_state.sh b/check_snmp_apc_ups_state/check_snmp_apc_ups_state.sh new file mode 100644 index 0000000..ce318f0 --- /dev/null +++ b/check_snmp_apc_ups_state/check_snmp_apc_ups_state.sh @@ -0,0 +1,199 @@ +#!/bin/bash +# +# Icinga Plugin Script (Check Command). It calculate APC UPS current state from SNMP data in upsBasicStateOutputState +# Aleksey Maksimov +# Tested on Debian GNU/Linux 9.11 (Stretch) with Icinga r2.10.5-1 +# Put here: /usr/lib/nagios/plugins/check_snmp_apc_ups_state.sh +# Usage example: +# ./check_snmp_apc_ups_state.sh -H ups-nmc-01.holding.com -P 2c -C public +# +PLUGIN_NAME="Icinga Plugin Check Command to calculate APC UPS current state (from SNMP data)" +PLUGIN_VERSION="2019.09.16" +PRINTINFO=`printf "\n%s, version %s\n \n" "$PLUGIN_NAME" "$PLUGIN_VERSION"` +# +# Exit codes +# +codeOK=0 +codeWARNING=1 +codeCRITICAL=2 +codeUNKNOWN=3 +# +# OID +# +checkOID="1.3.6.1.4.1.318.1.1.1.11.1.1.0" +# +Usage() { + echo "$PRINTINFO" + echo "Usage: $0 [OPTIONS] + +Option GNU long option Meaning +------ --------------- ------- + -H --hostname Host name, IP Address + -P --protocol SNMP protocol version. Possible values: 1|2c|3 + -C --community SNMPv1/2c community string for SNMP communication (for example,"public") + -L --seclevel SNMPv3 securityLevel. Possible values: noAuthNoPriv|authNoPriv|authPriv + -a --authproto SNMPv3 auth proto. Possible values: MD5|SHA + -x --privproto SNMPv3 priv proto. Possible values: DES|AES + -U --secname SNMPv3 username + -A --authpassword SNMPv3 authentication password + -X --privpasswd SNMPv3 privacy password + -q --help Show this message + -v --version Print version information and exit + +" +} +# +# Parse arguments +# +if [ -z $1 ]; then + Usage; exit $codeUNKNOWN; +fi +# +OPTS=`getopt -o H:P:C:L:a:x:U:A:X:qv -l hostname:,protocol:,community:,seclevel:,authproto:,privproto:,secname:,authpassword:,privpasswd:,help,version -- "$@"` +eval set -- "$OPTS" +while true; do + case $1 in + -H|--hostname) HOSTNAME=$2 ; shift 2 ;; + -P|--protocol) + case "$2" in + "1"|"2c"|"3") PROTOCOL=$2 ; shift 2 ;; + *) printf "Unknown value for option %s. Use '1' or '2c' or '3'\n" "$1" ; exit $codeUNKNOWN ;; + esac ;; + -C|--community) COMMUNITY=$2 ; shift 2 ;; + -L|--seclevel) + case "$2" in + "noAuthNoPriv"|"authNoPriv"|"authPriv") v3SECLEVEL=$2 ; shift 2 ;; + *) printf "Unknown value for option %s. Use 'noAuthNoPriv' or 'authNoPriv' or 'authPriv'\n" "$1" ; exit $codeUNKNOWN ;; + esac ;; + -a|--authproto) + case "$2" in + "MD5"|"SHA") v3AUTHPROTO=$2 ; shift 2 ;; + *) printf "Unknown value for option %s. Use 'MD5' or 'SHA'\n" "$1" ; exit $codeUNKNOWN ;; + esac ;; + -x|--privproto) + case "$2" in + "DES"|"AES") v3PRIVPROTO=$2 ; shift 2 ;; + *) printf "Unknown value for option %s. Use 'DES' or 'AES'\n" "$1" ; exit $codeUNKNOWN ;; + esac ;; + -U|--secname) v3SECNAME=$2 ; shift 2 ;; + -A|--authpassword) v3AUTHPWD=$2 ; shift 2 ;; + -X|--privpasswd) v3PRIVPWD=$2 ; shift 2 ;; + -q|--help) Usage ; exit $codeOK ;; + -v|--version) echo "$PRINTINFO" ; exit $codeOK ;; + --) shift ; break ;; + *) Usage ; exit $codeUNKNOWN ;; + esac +done +# +# Set SNMP connection paramaters +# +vCS=$( echo " -O qvn -v $PROTOCOL" ) +if [ "$PROTOCOL" = "1" ] || [ "$PROTOCOL" = "2c" ] +then + vCS=$vCS$( echo " -c $COMMUNITY" ); +elif [ "$PROTOCOL" = "3" ] +then + vCS=$vCS$( echo " -l $v3SECLEVEL" ); + vCS=$vCS$( echo " -a $v3AUTHPROTO" ); + vCS=$vCS$( echo " -x $v3PRIVPROTO" ); + vCS=$vCS$( echo " -A $v3AUTHPWD" ); + vCS=$vCS$( echo " -X $v3PRIVPWD" ); + vCS=$vCS$( echo " -u $v3SECNAME" ); +fi +# +# Calculate APC UPS State +# +vOIDOut=$( snmpget $vCS $HOSTNAME $checkOID ) +vOIDOut=$( echo $vOIDOut | tr -d '"' ) +if [ ${#vOIDOut} -ne 64 ]; then + echo "The string length obtained from the SNMP parameter 'upsBasicStateOutputState' is not equal to 64 characters. So we cannot parse the data." + exit $codeUNKNOWN +fi + +declare -a vFlags=( +"Flag 01: Abnormal Condition Present" +"Flag 02: On Battery" +"Flag 03: Low Battery" +"Flag 04: On Line" +"Flag 05: Replace Battery" +"Flag 06: Serial Communication Established" +"Flag 07: AVR Boost Active" +"Flag 08: AVR Trim Active" +"Flag 09: Overload" +"Flag 10: Runtime Calibration" +"Flag 11: Batteries Discharged" +"Flag 12: Manual Bypass" +"Flag 13: Software Bypass" +"Flag 14: In Bypass due to Internal Fault" +"Flag 15: In Bypass due to Supply Failure" +"Flag 16: In Bypass due to Fan Failure" +"Flag 17: Sleeping on a Timer" +"Flag 18: Sleeping until Utility Power Returns" +"Flag 19: On" +"Flag 20: Rebooting" +"Flag 21: Battery Communication Lost" +"Flag 22: Graceful Shutdown Initiated" +"Flag 23: Smart Boost or Smart Trim Fault" +"Flag 24: Bad Output Voltage" +"Flag 25: Battery Charger Failure" +"Flag 26: High Battery Temperature" +"Flag 27: Warning Battery Temperature" +"Flag 28: Critical Battery Temperature" +"Flag 29: Self Test In Progress" +"Flag 30: Low Battery / On Battery" +"Flag 31: Graceful Shutdown Issued by Upstream Device" +"Flag 32: Graceful Shutdown Issued by Downstream Device" +"Flag 33: No Batteries Attached" +"Flag 34: Synchronized Command is in Progress" +"Flag 35: Synchronized Sleeping Command is in Progress" +"Flag 36: Synchronized Rebooting Command is in Progress" +"Flag 37: Inverter DC Imbalance" +"Flag 38: Transfer Relay Failure" +"Flag 39: Shutdown or Unable to Transfer" +"Flag 40: Low Battery Shutdown" +"Flag 41: Electronic Unit Fan Failure" +"Flag 42: Main Relay Failure" +"Flag 43: Bypass Relay Failure" +"Flag 44: Temporary Bypass" +"Flag 45: High Internal Temperature" +"Flag 46: Battery Temperature Sensor Fault" +"Flag 47: Input Out of Range for Bypass" +"Flag 48: DC Bus Overvoltage" +"Flag 49: PFC Failure" +"Flag 50: Critical Hardware Fault" +"Flag 51: Green Mode/ECO Mode" +"Flag 52: Hot Standby" +"Flag 53: Emergency Power Off (EPO) Activated" +"Flag 54: Load Alarm Violation" +"Flag 55: Bypass Phase Fault" +"Flag 56: UPS Internal Communication Failure" +"Flag 57: Efficiency Booster Mode" +"Flag 58: Off" +"Flag 59: Standby" +"Flag 60: Minor or Environment Alarm") + + +vFlag1=$( echo $vOIDOut | awk '{print substr($0,0,1)}' ) + +vFlagsStr="" +vIndex=0 +for vFlag in "${vFlags[@]}"; do + + vFlagN=$( echo ${vOIDOut:vIndex:1} ) + if [ "$vFlagN" -eq "1" ]; then + vFlagsStr=$vFlagsStr$( echo "\n${vFlag}" ); + fi + let vIndex=${vIndex}+1 +done + +# +# Icinga Check Plugin output +# +if [ "$vFlag1" -eq "1" ]; then + echo -e "APC UPS State CRITICAL \nCurrent active flags:$vFlagsStr" + exit $codeCRITICAL +elif [ "$vFlag1" -eq "0" ]; then + echo -e "APC UPS State OK \nCurrent active flags:$vFlagsStr" + exit $codeOK +fi +exit $codeUNKNOWN