Portál AbcLinuxu, 24. listopadu 2025 14:19
Ř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.