Schrift
[thread]12356[/thread]

zählen und ausgeben von Geräten über SNMP

Leser: 1


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
benjo
 2008-08-15 12:53
#113525 #113525
User since
2007-05-12
13 Artikel
BenutzerIn
[default_avatar]
Hallo Leute,

ich muss alle Drucker bei uns im Netz zählen, da ich keine lust habe über mehrere Stockwerke zulaufen habe ich mir folgendes Script zusammengebastelt.
Leider ist die Ausgabe etwas komisch ich glaube das zählen und ausgeben stimmt nicht so richtig.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl 
use strict;
use warnings;

my $SNMP_Target = "192.168.100";  # IP´s Hardcoded 
my $i = 20;
my $snmp_value;
my @a;

while ($i <= 254){
        $snmp_value = `snmpget -c public -v1 -OvQ $SNMP_Target.$i HOST-RESOURCES-MIB::hrDeviceDescr.1 2>1`;
        $snmp_value =~ s/\"//g;
        push(@a, $snmp_value);
        $i++;
}

my %hash;
$hash{$_}++ for @a;

my @sortiert = map{ "$_ $hash{$_} ;" }sort{ $hash{$b} <=> $hash{$a} }keys %hash;
print join " ", @sortiert; 



Ausgabe:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
134 ; NRG DSm415
16 ; HP LaserJet 4050 Series
13 ; hp LaserJet 4200
8 ; HP LaserJet P2015 Series
8 ; NRG MP 161
7 ; hp LaserJet 2420
6 ; HP LaserJet 4000 Series
6 ; HP LaserJet 4100 Series
5 ; hp LaserJet 4350
3 ; NRG MP 7500
3 ; hp LaserJet 2300 series
3 ; RICOH Aficio MP 161
3 ; HP LaserJet M3027 MFP
2 ; HP LaserJet P3005
2 ;
2 ; HP Color LaserJet 4700
2 ; Samsung CLP-660 Series; OS 1.29.01.08 12-18-2007, 1.01.16,
1 ; MFP Type 104; OS 1.06.00.02 06-08-2007, V4.01.01(Type 104) 06-
1 ; hp color LaserJet 4600
1 ; LANIER LP235c
1 ; RICOH Aficio MP 7500
1 ; hp 9200C Digital Sender
1 ; hp LaserJet 4250
1 ; Canon MF4690PL
1 ; HP LaserJet 2200
1 ; LANIER LD015
1 ; RICOH Aficio MP 5000
1 ; hp color LaserJet 2500
1 ;


Sind die 134 die gesamtzahl der Drucker, da ich mir nicht vorstellen kann das wir soviele von diesen druckern haben.


//ModEdit GwenDragon: Titel erweitert
Jedenfalls wäre es super wenn mir jemand ein Tip geben kann wie ich die Ausgabe Optimieren kann.

gruss Benjo
GwenDragon
 2008-08-15 14:08
#113527 #113527
User since
2005-01-17
14600 Artikel
Admin1
[Homepage]
user image
Du musst überprüfen, ob ein Drucker mit der IP sich nicht schon gemeldet hat.

Ausschnitt:
Code: (dl )
1
2
3
4
5
6
7
8
9
$printer_ip = $SNMP_Target.$i;
$printer_name = $snmp_value;
# der Hash ist wie folgt aufgebaut:
# %printers = (Druckername => { IP => Anzahl, Gesamtzahl => Anzahl} );

# Zählen der Vorkommen des Druckers
$printers{$printer_name}->{$printer_ip}++;
# Gesamtanzahl bei Druckenamen nur erhöhen, wenn Drucker mit IP noch nicht gezählt
$printers{$printer_name}->{'Gesamt'}++ if $printers{$printer_name}->{$printer_ip}==1;


Und wenn ich deinen SNMPWalk so ansehe, scheinst du auch irgendwelche leeren Strings zu haben, die snmpget da liefert.
Schreib doch mal die Ausgabe von snmpvalue in eine Logdatei, damit du siehst, was dir geliefert wird.
benjo
 2008-08-15 14:35
#113528 #113528
User since
2007-05-12
13 Artikel
BenutzerIn
[default_avatar]
Danke für die schnelle antwort aber irgend wie verstehe ich dein Lösungsansatz nicht ganz,

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
while ($i <= 120){
        my $printer_ip = $SNMP_Target.$i;
        $snmp_value = `snmpget -c public -v1 -OvQ $printer_ip HOST-RESOURCES-MIB::hrDeviceDescr.1 2>1`;
        $snmp_value =~ s/\"//g;
        my $printer_name = $snmp_value;
        # Zählen der Vorkommen des Druckers
        $printers{$printer_name}->{$printer_ip}++;
        # Gesamtanzahl bei Druckenamen nur erhöhen, wenn Drucker mit IP noch nicht gezählt
        $printers{$printer_name}->{'Gesamt'}++ if $printers{$printer_name}->{$printer_ip}==1;
        $i++;
}


meinst du das so ?, Danke für deine Hilfe

Die Leeren strings, werden von Scannern die am Netzhängen, die SNMP können aber in diesem Fall leere Strings zurückgeben.
GwenDragon
 2008-08-15 14:44
#113529 #113529
User since
2005-01-17
14600 Artikel
Admin1
[Homepage]
user image
benjo+2008-08-15 12:35:04--
aber irgend wie verstehe ich dein Lösungsansatz nicht ganz,

Du darfst mich doch fragen ;)
Was verstehst du nicht?
benjo
 2008-08-15 15:01
#113532 #113532
User since
2007-05-12
13 Artikel
BenutzerIn
[default_avatar]
wenn ich dich richtig verstanden habe dann schreibe ich die werte die ich habe
Druckertyp und IP in ein ein Hash

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
my $SNMP_Target = "192.168.100";  # IP´s Hardcoded 
my $i = 20;
my $snmp_value;

my %printers;
my $count = 0;
my $total = 0;

while ($i <= 120){
        my $printer_ip = $SNMP_Target.$i;
        $snmp_value = `snmpget -c public -v1 -OvQ $printer_ip HOST-RESOURCES-MIB::hrDeviceDescr.1 2>1`;
        $snmp_value =~ s/\"//g;
        my $printer_name = $snmp_value;
        %printers = ($printer_name => { $printer_ip => $count, $total => $count} );
        $i++;
}


Dann sortiere ich mein Hash

Code: (dl )
1
2
3
4
# Zählen der Vorkommen des Druckers
$printers{$printer_name}->{$printer_ip}++;
# Gesamtanzahl bei Druckenamen nur erhöhen, wenn Drucker mit IP noch nicht gezählt
$printers{$printer_name}->{'Gesamt'}++ if $printers{$printer_name}->{$printer_ip}==1;


nur das klappt nicht, mach ich hier ein Denk fehler und muss das nochmal in eine Schleife reinsetzen ?, denn so durchläuft er doch denn Hash nicht.
GwenDragon
 2008-08-15 15:33
#113534 #113534
User since
2005-01-17
14600 Artikel
Admin1
[Homepage]
user image
benjo+2008-08-15 12:35:04--

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
while ($i <= 120){
        my $printer_ip = $SNMP_Target.$i;
        $snmp_value = `snmpget -c public -v1 -OvQ $printer_ip HOST-RESOURCES-MIB::hrDeviceDescr.1 2>1`;
        $snmp_value =~ s/\"//g;
        my $printer_name = $snmp_value;
        # Zählen der Vorkommen des Druckers
        $printers{$printer_name}->{$printer_ip}++;
        # Gesamtanzahl bei Druckenamen nur erhöhen, wenn Drucker mit IP noch nicht gezählt
        $printers{$printer_name}->{'Gesamt'}++ if $printers{$printer_name}->{$printer_ip}==1;
        $i++;
}


meinst du das so ?, Danke für deine Hilfe

Ja, so meine ich das.

Und Ausgeben kannst du das mit:

Code: (dl )
print $printers{$_}->{'Gesamt'} . " " . $_ for keys %printers;


Ich hoffe, ich habe da keinen Programmier-/Denkfehler drin, da ich gerade keine snmp-Geräte hier im Netz laufen habe.
benjo
 2008-08-15 15:59
#113536 #113536
User since
2007-05-12
13 Artikel
BenutzerIn
[default_avatar]
Code (perl): (dl )
print $printers{$printer_name}->{'Gesamt'} . " " . $_ for keys %printers;


als Ausgabe bekomme ich die anzahl der IP´s die ich teste,
also bei einer range von 103 bis 120 => 18

also im ideal habe ich folgende ausgabe:
Code: (dl )
1
2
3
4
5
6
13 x NRG DSm415
16 x HP LaserJet 4050 Series
13 x hp LaserJet 4200
8 x HP LaserJet P2015 Series
8 x NRG MP 161
[...]


Hm hätte nicht gedacht das es so schwer ist in einem Array/Hash nach gleichen Strings zu suchen und diese zu zählen, irgendwie tue ich mich heute schwerdamit.
benjo
 2008-08-15 17:31
#113547 #113547
User since
2007-05-12
13 Artikel
BenutzerIn
[default_avatar]
Hm, ich bin das nochmal durchgegangen, die IP´s zu zählen bringt ja nichts,
ich möchte doch nur die Strings zählen die mehr als ein mal in einem Array/Hash vorkommen oder wieso dieser umständliche weg über die IP ?
Dubu
 2008-08-16 20:20
#113577 #113577
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
benjo+2008-08-15 10:53:54--
Code (perl): (dl )
        $snmp_value = `snmpget -c public -v1 -OvQ $SNMP_Target.$i HOST-RESOURCES-MIB::hrDeviceDescr.1 2>1`;


Ich hoffe dir ist klar, dass du damit Fehlermeldungen in eine Datei namens '1' umleitest.
Gast Gast
 2008-08-17 16:38
#113600 #113600
Ja, das ist eine seltsame Umleitung von STDERR/STDOUT ;)
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2008-08-15 12:53.