Portál AbcLinuxu, 5. května 2025 05:20
Řešení dotazu:
./check_snmp -P 2c -C sdsxpublic -m ALL -H ip -o sdsSoCtempValue.0
a dostanu odpověď SNMP OK - 485
. Jenže tohle číslo mi je na prd, protože se musí ještě přepočítat vzorcem ((5*(59-30*((3/1024)*485)))/2)
, abych dostal stupně Celsia. Proto jsem myslel, že spustím nějaký skript, který si stáhne snmp data a přepočítá to pro potřeby centreonu/nagiosu.
TEMPFULL=`snmpwalk -v2c -c $COMMUNITY $IP 1.3.6.1.4.1.33283.1.2.6.1.5.1 | cut -d ' ' -f 4` DELENOSTO=100 FINALTEMP=$((TEMPFULL / DELENOSTO))Poradíte mi prosím?
./check_snmp_temp: řádek 113: [: 13.93: očekáván celočíselný výraz Not recieving a sane temperature!Skript:
#!/bin/bash # Exit codes STATE_OK=0 STATE_WARNING=1 STATE_CRITICAL=2 STATE_UNKNOWN=3 #This will check the temperature and compare it to #supplied warning and critical levels. Output will be parsable by nagios. # #Options: # #-w INTEGER # Exit with WARNING status if the temp is less than INTEGER # #-c INTEGER # Exit with CRITICAL status if the temp is less than INTEGER # #-i STRING # IP to check # #-C STRING # SNMP community to check WARNINGFLAG=false CRITICALFLAG=false IPFLAG=false COMMUNITYFLAG=false ARGUEMENTFLAG=false #This block will test the arguements as parsed while getopts 'w:c:i:C:' opt; do case $opt in w) WARNING=$OPTARG if ! [ $WARNING -eq $WARNING ] 2>/dev/null; then echo "Warning value is not an integer!" >&2 ARGUEMENTFLAG=true fi WARNINGFLAG=true ;; c) CRITICAL=$OPTARG if ! [ $CRITICAL -eq $CRITICAL ] 2>/dev/null; then echo "Critical value is not an integer!" >&2 ARGUEMENTFLAG=true fi CRITICALFLAG=true ;; i) IP=$OPTARG #Tests if ip is in correct format #First check if basic format is correct if [[ $IP =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then #Then test if IP is in sensible range iterator=1 while [ $iterator -le 4 ]; do number=`echo $IP | cut -d . -f $iterator` if [ $number -ge 256 ]; then echo "The IP supplied is not in a valid format" >&2 ARGUEMENTFLAG=true fi iterator=$(($iterator+1)) done else echo "The IP supplied is not in a valid format" >&2 exit 1 fi IPFLAG=true ;; C) COMMUNITY=$OPTARG COMMUNITYFLAG=true ;; \?) echo "Invalid option: -$OPTARG" >&2 exit 1 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done #Checks to see if any arguments are missing: if ! $WARNINGFLAG; then echo "A Warning level is required!" >&2 ARGUEMENTFLAG=true fi if ! $CRITICALFLAG; then echo "A Critical level is required!" >&2 ARGUEMENTFLAG=true fi if ! $IPFLAG; then echo "An IP address is required!" >&2 ARGUEMENTFLAG=true fi if ! $COMMUNITYFLAG; then echo "A community name is required!" >&2 ARGUEMENTFLAG=true fi if $ARGUEMENTFLAG; then exit $STATE_UNKNOWN fi #Checks for sane Warning/Critical levels if [ $WARNING -gt $CRITICAL ]; then echo "Warning level should not be higher than Critical level" exit $STATE_UNKNOWN fi #grabs the current temperature using snmpwalk from the ip and snmp community provided FULLTEMP=`snmpwalk -v2c -c $COMMUNITY $IP 1.3.6.1.4.1.33283.1.2.6.1.5.1 | cut -d ' ' -f 4` CURRENTTEMP=$(echo "scale=2; $FULLTEMP/100" | bc) #Checks for sane temperature if ! [ $CURRENTTEMP -eq $CURRENTTEMP ]; then echo "Not recieving a sane temperature!" exit $STATE_UNKNOWN fi #Checks the temperature against the warning and critical levels and gives a nagios compatible response if [ $CURRENTTEMP -lt $WARNING ]; then echo "TEMP OK - Current Temperature is $CURRENTTEMP" exit $STATE_OK elif [ $CURRENTTEMP -lt $CRITICAL ]; then echo "TEMP WARNING - Current Temperature is $CURRENTTEMP" exit $STATE_WARNING else echo "TEMP CRITICAL - Current Temperature is $CURRENTTEMP" exit $STATE_CRITICAL fi
if ! (( $(echo "$CURRENTTEMP == $CURRENTTEMP" | bc) )); then .. if (( $(echo "$CURRENTTEMP < $WARNING" | bc) )); then ..etc.
-n, --sensor_names=STRING[,STRING[..]]
, tak můžu zapsat víc hodnot. Nějak ale nerozumím té syntaxi. Zkoušel jsem např. -n sensor1,sensor2
, ale to nejde.
@ar_sensornames = split(/,/, $o_sensornames);Co to napise?
./check_snmp_temperature.pl -H 10.0.14.111 -C sdsxpublic -n sensor1,sensor2 -d .1.3.6.1.4.1.33283.1.2.6.1.5.1,.1.3.6.1.4.1.33283.1.2.6.1.5.2 -i 100C -o C -f -a sensor1 -w 85 -c 90 OK - sensor1 Temperature is 10.68C | sensor1=10.68;85;90Ideálně bych chtěl ale docílit toho, že OID nebudu vyplňovat ručně, ale už ho přidělím sensorům přímo ve skriptu.
sdmicro" => [ "", "", "C", ['Sensor1', 'Sensor2', 'Sensor3', 'Sensor4'], ['.1.3.6.1.4.1.33283.1.2.6.1.5.1','.1.3.6.1.4.1.33283.1.2.6.1.5.2','.1.3.6.1.4.1.33283.1.2.6.1.5.3','.1.3.6.1.4.1.33283.1.2.6.1.5.4'] ],
sdmicro" => [ "", "", "100C", ['Sensor1', 'Sensor2', 'Sensor3', 'Sensor4'], ['.1.3.6.1.4.1.33283.1.2.6.1.5.1','.1.3.6.1.4.1.33283.1.2.6.1.5.2','.1.3.6.1.4.1.33283.1.2.6.1.5.3','.1.3.6.1.4.1.33283.1.2.6.1.5.4'] ]
. Koukám, že to má takto ten "alteon". Moc díky.
./check_snmp -C sdsxpublic -H 10.0.14.111 -o .1.3.6.1.4.1.33283.1.2.9.1.6.3 -u kWh -l spotreba -w 50 -c 90
SNMP OK - spotreba 22 kWh | spotreba=22
, resp. kompletní performance data z ./check_snmp -C sdsxpublic -H 10.0.14.111 -o .1.3.6.1.4.1.33283.1.2.9.1.6.3
SNMP OK - "22.809 kWh" |
, jako např. spotreba=22.809,50,90
./check_snmp -C sdsxpublic -H 10.0.14.111 -o sdsS0actualEnergyFlow.3 -l spotrebaa výstup je
SNMP OK - spotreba "0.001 kW" |. Za znaménkem roury | nic není. Tam by měly být perfdata pro generování grafů. Zadám tedy
./check_snmp -C sdsxpublic -H 10.0.14.111 -o sdsS0actualEnergyFlow.3 -u kW -l spotreba -w 100 -c 200a výstup je
SNMP OK - spotreba 0 kW | spotreba=0. Takže mám za rourou petrdata. Jenže ty jsou ořízlé jen na celé číslo bez desetiných míst. Jak tedy docílím, aby výstup bypadal takto:
SNMP OK - spotreba 0.001 kW | spotreba=0.001nebo ideálně takto
SNMP OK - spotreba 0.001 kW | spotreba=0.001,100,200Mooc díky za pomoc:)
Tenhle dotaz jsem přesunul do Linuxové poradny a tak prosím o případné zamčení toho vlákna. Moc díky.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.