Tonerstand via SNMP auslesen - Problem

S

`shl

Grünschnabel
Hoi,

ich hab ein Problem mit einem Shellscript.
Und zwar will ich den aktuellen Tonerstand via SNMP abfragen.
Es funktionier soweit auch:
Code:
#!/bin/bash
#
# yessir
#

#Eingabeparameter (IP und Community) erkennen und als Variable setzen
IP=`echo $1`
community=`echo $2`

#OiD-Variablen festlegen
#Cyan
oid_maximumcyan='1.3.6.1.2.1.43.11.1.1.8.1.1'
oid_currentcyan='1.3.6.1.2.1.43.11.1.1.9.1.1'

#Magenta
oid_maximummagenta='1.3.6.1.2.1.43.11.1.1.8.1.2'
oid_currentmagenta='1.3.6.1.2.1.43.11.1.1.9.1.2'

#Gelb
oid_maximumyellow='1.3.6.1.2.1.43.11.1.1.8.1.3'
oid_currentyellow='1.3.6.1.2.1.43.11.1.1.9.1.3'

#Schwarz
oid_maximumblack='1.3.6.1.2.1.43.11.1.1.8.1.4'
oid_currentblack='1.3.6.1.2.1.43.11.1.1.9.1.4'

#Bildtrommel
oid_maximumbildtrommel='1.3.6.1.2.1.43.11.1.1.8.1.5'
oid_currentbildtrommel='1.3.6.1.2.1.43.11.1.1.9.1.5'

#Uebertragungswalze
oid_maximumwalze='1.3.6.1.2.1.43.11.1.1.8.1.6'
oid_currentwalze='1.3.6.1.2.1.43.11.1.1.9.1.6'

#Fixierer
oid_maximumfuser='1.3.6.1.2.1.43.11.1.1.8.1.7'
oid_currentfuser='1.3.6.1.2.1.43.11.1.1.9.1.7'

#Fehleranzahl
oid_fehler='1.3.6.1.2.1.43.5.1.1.18.1'

#Werte auslesen
#maximum
maximumcyan_val=`snmpget -v 1 -c $community $IP $oid_maximumcyan | awk -F' ' '{print $4}'`
maximummagenta_val=`snmpget -v 1 -c $community $IP $oid_maximummagenta | awk -F' ' '{print $4}'`
maximumyellow_val=`snmpget -v 1 -c $community $IP $oid_maximumyellow | awk -F' ' '{print $4}'`
maximumblack_val=`snmpget -v 1 -c $community $IP $oid_maximumblack | awk -F' ' '{print $4}'`
maximumbildtrommel_val=`snmpget -v 1 -c $community $IP $oid_maximumbildtrommel | awk -F' ' '{print $4}'`
maximumwalze_val=`snmpget -v 1 -c $community $IP $oid_maximumwalze | awk -F' ' '{print $4}'`
maximumfuser_val=`snmpget -v 1 -c $community $IP $oid_maximumfuser | awk -F' ' '{print $4}'`

#current
currentcyan_val=`snmpget -v 1 -c $community $IP $oid_currentcyan | awk -F' ' '{print $4}'`
currentmagenta_val=`snmpget -v 1 -c $community $IP $oid_currentmagenta | awk -F' ' '{print $4}'`
currentyellow_val=`snmpget -v 1 -c $community $IP $oid_currentyellow | awk -F' ' '{print $4}'`
currentblack_val=`snmpget -v 1 -c $community $IP $oid_currentblack | awk -F' ' '{print $4}'`
currentbildtrommel_val=`snmpget -v 1 -c $community $IP $oid_currentbildtrommel | awk -F' ' '{print $4}'`
currentwalze_val=`snmpget -v 1 -c $community $IP $oid_currentwalze | awk -F' ' '{print $4}'`
currentfuser_val=`snmpget -v 1 -c $community $IP $oid_currentfuser | awk -F' ' '{print $4}'`


#Fuellstand in Prozent berechnen
#cyan
cyan=`expr \( $currentcyan_val \* 100 \) \/ $maximumcyan_val`

#magenta
magenta=`expr \( $currentmagenta_val \* 100 \) \/ $maximummagenta_val`

#yellow
yellow=`expr \( $currentyellow_val \* 100 \) \/ $maximumyellow_val`

#black
black=`expr \( $currentblack_val \* 100 \) \/ $maximumblack_val`

#bildtrommel
bildtrommel=`expr \( $currentbildtrommel_val \* 100 \) \/ $maximumbildtrommel_val`

#uebertragungswalze
walze=`expr \( $currentwalze_val \* 100 \) \/ $maximumwalze_val`

#fuser
fuser=`expr \( $currentfuser_val \* 100 \) \/ $maximumfuser_val`


#Fehleranzahl ausgeben
error=`snmpget -v 1 -c $community $IP $oid_fehler | awk -F' ' '{print $4}'`

#TEST:
#Werte zurueckgeben
#echo "$cyan | $magenta | $yellow | $black | $bildtrommel | $walze | $fuser | $error"

#Exit-Codes ausgeben
if [ $cyan -le 5 -o $magenta -le 5 -o $yellow -le 5 -o $black -le 5 -o $bildtrommel -le 5 -o $walze -le 5 -o $fuser -le 10 -o $error -ne 0 ]
then echo 'Schwerer Fehler aufgetreten (Verbrauchsmaterial: Cyan:'`echo $cyan`'%/Magenta:'`echo $magenta`'%/Gelb:'`echo $yellow`'%/Schwarz:'`echo $black`'%/Trommel:'`echo $bildtrommel`'%/Walze:'`echo $walze`'%/Fixierer:'`echo $fuser`'%/Status:'`echo $error`')'
exit 2
elif [ $cyan -le 10 -o $magenta -le 10 -o $yellow -le 10 -o $black -le 10 -o $bildtrommel -le 10 -o $walze -le 10 -o $fuser -le 10 -o $error -eq 0 ]
then echo 'Fehler aufgetreten (Verbrauchsmaterial: Cyan:'`echo $cyan`'%/Magenta:'`echo $magenta`'%/Gelb:'`echo $yellow`'%/Schwarz:'`echo $black`'%/Trommel:'`echo $bildtrommel`'%/Walze:'`echo $walze`'%/Fixierer:'`echo $fuser`'%/Status:'`echo $error`')'
exit 1
else
echo 'Keine Fehler (Verbrauchsmaterial: Cyan:'`echo $cyan`'%/Magenta:'`echo $magenta`'%/Gelb:'`echo $yellow`'%/Schwarz:'`echo $black`'%/Trommel:'`echo $bildtrommel`'%/Walze:'`echo $walze`'%/Fixierer:'`echo $fuser`'%/Status:'`echo $error`')'
exit 0
fi

allerdings will ich beim Werte auslesen eine "for.. in.. do.. done.."-Funktion verwenden, was dann so aussehen wuerde:

Code:
...
...
#Werte auslesen
#maximum
for i in cyan magenta yellow black bildtrommel walze fuser; do
current`echo ip`_val=`snmpget -v 1 -c $community $IP $oid_current`echo $i` | awk -F' ' '{print $4}'`
done

#current
for p in cyan magenta yellow black bildtrommel walze fuser; do
current`echo $p`_val=`snmpget -v 1 -c $community $IP $oid_current`echo $p` | awk -F' ' '{print $4}'`
done
...
...

Das kann allerdings nicht ausgefuehrt werden, da er folgende "`" nicht richtig setzt (current`echo $p`_val=`snmpget -v 1 -c $community $IP $oid_current`echo $p` | awk -F' ' '{print $4}'`

Habe mich bereits etwa 4 Stunden damit rumgespielt, und bekomms einfach nicht zum laufen.

Hat jemand eine Loesung?

Vielen Dank & viele Grueße,

shl
 
schon mal versucht $() anstatt `´ zu verwenden?

Etwa 2-3 mal sogar...:

Code:
#Werte auslesen
#maximum
for i in cyan magenta yellow black bildtrommel walze fuser; do
current`echo ip`_val=$(snmpget -v 1 -c $community $IP "$oid_current`echo $i`" | awk -F' ' '{print $4}')
done
--> Error
 
hmm und bei allen `´ - für mich schauts so aus als wär da was in der Syntax net ganz ok - aber ich kann mich auch täuschen :/
 
Code:
echo `echo \`echo \\\`echo foo\\\`\``
So gehen nested-backticks. Aber mach mal bitte aus allen backticks diese $(...) Konstruktion. (Hast du nicht gemacht in deinem grade geposteten Beispiel...)
Dann wird aus obigem Grusel nur noch dieses unschöne (aber wesentlich besser wartbare) Konstrukt:
Code:
echo $(echo $(echo $(echo foo)))

Deine ganzen `echo $foo` Konstrukte kannst du übrigens einfach durch $foo (oder besser "$foo") ersetzen. `echo ip` meint höchstwahrscheinlich `echo $ip` und kann einfach durch "$ip" ersetzt werden. Mehr ist mir erstmal nicht aufgefallen...

edit²:
Code:
cyan=`expr \( $currentcyan_val \* 100 \) \/ $maximumcyan_val`
geht auch lesbarer (mit bash, die du ja schließlich verwendest...)
Code:
cyan="$(( ($currentcyan_val * 100) / $maximumcyan_val ))"

edit³:
Achso, die Fehlermeldung. Sach das doch gleich. Dann ist ganz klar bei deinem Fluxkondensator das Plutonium alle. Füll mal nach und lass das Skript dann nochmal laufen.
 
Zuletzt bearbeitet:
Du solltest dir mal das "eval"-Builtin in der Shell näher ansehen: wenn du die Variablennamen erst zur Laufzeit in der Schleife zusammenbastelst ($current_cyan_val, $cyan etc.), brauchst du das. Das könnte ganz grob etwa so funktionieren:

Code:
MAX_OID=1.3.6.1.2.1.43.11.1.1.8.1
CURR_OID=1.3.6.1.2.1.43.11.1.1.9.1

PARAMS="cyan magenta yellow black drum transer fuser"

E=echo      # Testen
# E=eval    # Ausführen

I=1
for PARAM in $PARAMS; do
        $E "max_${PARAM}_val=\`snmpget -v 1 -c $COMMUNITY $MAX_OID.$I | awk -F ' ' '{ print \$4 }'\`"
        $E "curr_${PARAM}_val=\`snmpget -v 1 -c $COMMUNITY $CURR_OID.$I | awk -F ' ' '{ print \$4 }'\`"
        $E "$PARAM=\`expr \$curr_${PARAM}_val * 100 / \$max_${PARAM}_val\`"
        $E "echo $PARAM=\$$PARAM"

        I=`expr $I + 1`
done

(Und, ja, ich kenne die $(...)-Schreibweise, aber ich stolpere immer noch ab und zu über so eine alte Kiste, die keine bash oder ksh drauf hat ... muss wohl am Alter liegen :oldman)

Gruss ...
 

Ähnliche Themen

Debian Routing Problem

Shellskript - Fehler in Cron

Queue für copy Script

skript zum löschen doppelter dateien

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Zurück
Oben