PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MIB und TRAP (snmpd)



joey.brunner
09.01.03, 12:47
Hi,

hat einer von euch schon eine MIB und einen passenden TRAP fuer eine URL-Benachrichtigung. Die Sache ist die. Ich hab ein Tool gebaut, das etwas bestimmtes ueberprueft. Sobald die Ueberpruefung fertig ist, wuerde ich gerne einen TRAP zum HPOpenView schicken. Da ich ASN noch nicht maechtig bin, wollte ich halt mal nachfragen, ob von euch das schon mal einer gemacht hat. SNMPd wuerde auch gehen...

joey

Jorge
09.01.03, 13:46
Was willst Du denn genau machen? Was soll der Trap den an OV senden (OV ist nur die Bezeichnung für eine große Software Suite, aber ich denke mal es geht um OV's NNM)? Was verstehst Du unter URL Benachrichtigung?

Ein sehr zu empfehlendes Buch für den Einstieg in SNMP: Essential SNMP (http://www.lfs-tipps.de/forums/showthread.php?s=&threadid=291)

Und ich verrate Dir am besten nicht, wo ich arbeite...

joey.brunner
09.01.03, 13:56
Hi

also schau her. ich hab einen security scanner bzw. eine security kb geschrieben, jetzt kann der amdin hergehen und sagen: scanne bitte rechner 1, 32 und 123. dann wird der scan durchgefuerht. es wird ein html-docu erstellt und jetzt muss der admin noch informiert werden, dass der test fertig ist. zu anfang hab ich das via email realisisert, das geht aber nicht, da die meisten leute den mailverkehr blocken. snmp ist aber oftmals erlaubt. jetzt muss ich bis montag einen snmp trap schreiben, der an seine managementstation einen trap schickt, sobald der test fertig ist. in diesem trap muss nur stehen: hallo der test is feddich, hier die url. die url ergibt sich aus der sessionid, die dem trap von einem perlskript uebergeben werden kann. am liebsten waere mir, wenn ich das ganze mit perl realisieren koennte. doch wenn ich die perl-cpan-module fuer snmp benutzte brauche ich eine MIB dazu...

joey

Jorge
09.01.03, 14:10
Tja, dafür, denke ich, gibt es noch keine MIB. Das hieße, Du gehst nach http://www.iana.org/cgi-bin/enterprise.pl und 'beantragst' Dir eine eigene Private Enterprise number (.1.3.6.1.4) und schreibst dann Deine eigene MIB dazu.

joey.brunner
09.01.03, 14:17
danke ...

wofuer brauche ich die private enterprise nummer ?

und jetzt zum problem.. wie schreibe ich mir die mib dazu brauche ich ASN oder? die mib sollte ja nicht so schwer sein oder, geht ja bloss um ein paar kleinigkeiten, muss ja nicht viel machen.

hast du da quellen?


joey

joey.brunner
09.01.03, 14:24
das mit der privaten enterprise number kann man ja soweit ich das sehe nur ueber ein unternehmen machen... das waere zwar kein problem, dennoch waere es nicht schlecht, wenn das programm die number bekommen wuerde, es ist ja schliesslich oss und wenn ich mal keinen bock mehr hab... geht das ?

joey

Jorge
09.01.03, 21:28
Original geschrieben von joey.brunner

wofuer brauche ich die private enterprise nummer ?

Damit Du Dir Deine eingenen MIB's schreiben kannst.


das mit der privaten enterprise number kann man ja soweit ich das sehe nur ueber ein unternehmen machen... das

Jeder kann eine Enterprise number beantragen, Jeder.


waere zwar kein problem, dennoch waere es nicht schlecht, wenn das programm die number bekommen wuerde, es ist ja schliesslich oss und wenn ich mal keinen bock mehr hab... geht das ?

Die Enterprise ID hat nichts mit dem Programm/Trap/whatever zu tun. Sie ermöglicht Dir lediglich eine eigene MIB zu schreiben, um Dein Vorhaben zu realisieren.

joey.brunner
10.01.03, 11:59
hi

also ich hab hier jetzt mal eine neue example mib in meinen snmpd kompiliert:

#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>

/*
* contains prototypes
*/
#include "notification.h"

/*
* our alarm prototype
*/


/*
* our initialization routine
* (to get called, the function name must match init_FILENAME()
*/
void
init_notification(void)
{
DEBUGMSGTL(("example_notification",
"initializing (setting callback alarm)\n"));
snmp_alarm_register(30, /* seconds */
SA_REPEAT, /* repeat (every 30 seconds). */
send_example_notification, /* our callback */
NULL /* no callback data needed */
);
}

void
send_example_notification(unsigned int clientreg, void *clientarg)
{
/*
* define the OID for the notification we're going to send
* NET-SNMP-EXAMPLES-MIB::netSnmpExampleNotification
*/
oid notification_oid[] =
{ 1, 3, 6, 1, 4, 1, 8072, 2, 3, 1 };
size_t notification_oid_len = OID_LENGTH(notification_oid);

/*
* In the notification, we have to assign our notification OID to
* the snmpTrapOID.0 object. Here is it's definition.
*/
oid objid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 };
size_t objid_snmptrap_len = OID_LENGTH(objid_snmptrap);

/*
* here is where we store the variables to be sent in the trap
*/
static netsnmp_variable_list *notification_vars = NULL;

DEBUGMSGTL(("example_notification", "defining the trap\n"));

/*
* add in the trap definition object
*/
snmp_varlist_add_variable(&notification_vars,
/*
* the snmpTrapOID.0 variable
*/
objid_snmptrap, objid_snmptrap_len,
/*
* value type is an OID
*/
ASN_OBJECT_ID,
/*
* value contents is our notification OID
*/
(u_char *) notification_oid,
/*
* size in bytes = oid length * sizeof(oid)
*/
notification_oid_len * sizeof(oid));

/*
* if we wanted to insert additional objects, we'd do it here
*/

/*
* send the trap out. This will send it to all registered
* receivers (see the "SETTING UP TRAP AND/OR INFORM DESTINATIONS"
* section of the snmpd.conf manual page.
*/
DEBUGMSGTL(("example_notification", "sending the trap\n"));
send_v2trap(notification_vars);

/*
* free the created notification variable list
*/
DEBUGMSGTL(("example_notification", "cleaning up\n"));
snmp_free_varbind(notification_vars);
}


Dieses Ding schickt mir jetzt alle 30 Sekunden folgende Meldung:

2002-05-08 08:57:05 localhost.localdomain [udp:127.0.0.1:32865]: sysUpTimeInstance = Timeticks: (3803) 0:00:38.03 snmpTrapOID.0 = OID: netSnmpExampleNotification

Gut, So wie ich das jetzt verstanden habe, gibt die OID an, welche Meldung kommt. Da ich ja eine eigene Meldung brauche, muss ich ja auch noch eine eigene OID erstellen mit der URL... Hast du da ne Ahnung wie ich das realisieren kann?

Danke

Joey

Jorge
10.01.03, 13:55
Original geschrieben von joey.brunner
Dieses Ding schickt mir jetzt alle 30 Sekunden folgende Meldung:

2002-05-08 08:57:05 localhost.localdomain [udp:127.0.0.1:32865]: sysUpTimeInstance = Timeticks: (3803) 0:00:38.03 snmpTrapOID.0 = OID: netSnmpExampleNotification

Gut, So wie ich das jetzt verstanden habe, gibt die OID an, welche Meldung kommt. Da ich ja eine eigene Meldung brauche, muss ich ja auch noch eine eigene OID erstellen mit der URL... Hast du da ne Ahnung wie ich das realisieren kann?


Also schau her. Ich bekomme folgenden Trap, wenn ich auf meinem Linux Server den snmpd neu starte (kill -HUP $SNMPD_PID):

http://lfs-tipps.de/misc/trap.gif

Die Trap-ID ist also .1.3.6.1.4.1.8072.4.0.3. Weiter sieht man daraus, daß es sich hierbei um einen Trap der Kategorie 6 (generic:6) handelt und das eigentliche Event hat die specific number 3 (welche über eine MIB definiert ist).

Es gibt 6 Trap Kategorien (generic traps):

coldstart (0)
warmStart (1)
linkDown (2)
linkUp (3)
authenticationFailure (4)
egpNeighborLoss (5)
enterpriseSpecific (6)


In der Regel sind die Generic Trap 0-5 uninteressant, da diese 'fest verdrahtet' sind in den entsprechenden Standard MIB's. Du möchtest/mußt einen enterpriseSpecific Trap generieren, da das von Dir gewünschte Event (diese URL Benachrichtigung) in keiner Standard MIB vorkommt.

So, um das zu realisieren, benötigst Du als erstes eine eigene Enterprise Number, welche Du unter dem von mir oben genannten Link bekommen kannst. Wenn Du diese hast, kannst Du per snmptrap einen Trap versenden. Ohne MIB sieht der Trap dann wie oben dargestellt aus. Um jetzt lesbare Informationen zu erhalten mußt Du Dir eine MIB schreiben. Wenn ich im NNM z.B. die NET-SNMP-MIB und NET-SNMP-AGENT-MIB lade, sehe ich bei einem restart wie oben erst mal keinen Trap mehr, da folgendes durch das laden der MIB's in die trapd.conf eingetragen wurde:



EVENT nsNotifyStart .1.3.6.1.4.1.8072.4.0.1 "LOGONLY" Normal
FORMAT NO FORMAT DEFINED
SDESC
Long Descr.:
"An indication that the agent has started running."
EDESC
#
#
#
EVENT nsNotifyShutdown .1.3.6.1.4.1.8072.4.0.2 "LOGONLY" Normal
FORMAT NO FORMAT DEFINED
SDESC
Long Descr.:
"An indication that the agent is in the process of being shut down."
EDESC
#
#
#
EVENT nsNotifyRestart .1.3.6.1.4.1.8072.4.0.3 "LOGONLY" Normal
FORMAT NO FORMAT DEFINED
SDESC
Long Descr.:
"An indication that the agent has been restarted.
This does not imply anything about whether the configuration has
changed or not (unlike the standard coldStart or warmStart traps)"
EDESC


Im Node Manager sieht das dann so aus:

http://lfs-tipps.de/misc/event.gif

Wenn Du diesen Trap jetzt im NNM Alarmbrowser wieder sehen möchtest, mußt Du in den ACtion von 'Log only' auf 'Log and display $Kategorie' umstellen, sowie eine entsprechende 'Event Log Message' einstellen. Zu dieser solltest Du Dir unbedingt die Hilfe durchlesen, da man dort mit sehr vielen Variablen arbeiten kann.

So, ich hoffe das war jetzt verständlich genug um daraus Informationen ziehen zu können.

joey.brunner
10.01.03, 14:39
hi,

danke fuer die Antwort ! War sehr hilfreich... Leider habe ich ein Problem. Ich muss diese snmp Sache bis Montag implementieren. Meine enterprise nummer bekomme ich aber erst freitag naechste woche (vorrausichtlich, so stand es in der mail)...

Jetzt muss ich dich nochmal wegen eines workarounds nerven, bis die nummer da ist...
Ich habe doch in der snmpd.conf die möglichkeit exteren programme auszufuehren oder? Bei mir sieht dsa so aus:

#exec echotest /bin/echo hello world
usw.

das heisst, dass wenn der befehl

snmptable localhost.localdomain cummunity [prviate enterpreisenummer] ausgefuerht wird, dass dann dieses skript ausgefuehrt wird.

wenn das skript nun ueberprueft ob neue tests vorhanden sind, bekommt man doch auch das richtige ergebnis oder? habe ich wieder was falsch verstanden

joey

EDIT:
Ganz dicken dank fuer deine hilfe!

Jorge
10.01.03, 16:24
Original geschrieben von joey.brunner
danke fuer die Antwort ! War sehr hilfreich... Leider habe ich ein Problem. Ich muss diese snmp Sache bis Montag implementieren. Meine enterprise nummer bekomme ich aber erst freitag naechste woche (vorrausichtlich, so stand es in der mail)...

Na dann, mal sehen...


#exec echotest /bin/echo hello world
usw.

das heisst, dass wenn der befehl

snmptable localhost.localdomain cummunity [prviate enterpreisenummer] ausgefuerht wird, dass dann dieses skript ausgefuehrt wird.

wenn das skript nun ueberprueft ob neue tests vorhanden sind, bekommt man doch auch das richtige ergebnis oder? habe ich wieder was falsch verstanden

Nein, das stimmt schon so. Schau Dir mal die EXAMPLE.conf an die den Sourcen beiliegt, bei mir finde ich da folgendes:


##############################################
# Executables/scripts
#

#
# You can also have programs run by the agent that return a single
# line of output and an exit code. Here are two examples.
#
# exec NAME PROGRAM [ARGS ...]
#
# NAME: A generic name.
# PROGRAM: The program to run. Include the path!
# ARGS: optional arguments to be passed to the program

# a simple hello world
exec echotest /bin/echo hello world

# Run a shell script containing:
#
# #!/bin/sh
# echo hello world
# echo hi there
# exit 35
#
# Note: this has been specifically commented out to prevent
# accidental security holes due to someone else on your system writing
# a /tmp/shtest before you do. Uncomment to use it.
#
#exec shelltest /bin/sh /tmp/shtest

# Then,
# % snmpwalk -v 1 -c public localhost .EXTENSIBLEDOTMIB.SHELLMIBNUM
# enterprises.ucdavis.extTable.extEntry.extIndex.1 = 1
# enterprises.ucdavis.extTable.extEntry.extIndex.2 = 2
# enterprises.ucdavis.extTable.extEntry.extNames.1 = "echotest"
# enterprises.ucdavis.extTable.extEntry.extNames.2 = "shelltest"
# enterprises.ucdavis.extTable.extEntry.extCommand.1 = "/bin/echo hello world"
# enterprises.ucdavis.extTable.extEntry.extCommand.2 = "/bin/sh /tmp/shtest"
# enterprises.ucdavis.extTable.extEntry.extResult.1 = 0
# enterprises.ucdavis.extTable.extEntry.extResult.2 = 35
# enterprises.ucdavis.extTable.extEntry.extOutput.1 = "hello world."
# enterprises.ucdavis.extTable.extEntry.extOutput.2 = "hello world."
# enterprises.ucdavis.extTable.extEntry.extErrFix.1 = 0
# enterprises.ucdavis.extTable.extEntry.extErrFix.2 = 0

# Note that the second line of the /tmp/shtest shell script is cut
# off. Also note that the exit status of 35 was returned.

# -----------------------------------------------------------------------------

Dort siehst Du auch, welche OID's Du abfragen kannst/mußt.


EDIT:
Ganz dicken dank fuer deine hilfe!

Wenn es Dir hilft ist das ja gut. Ich befasse mich selbst erst seit kurzem mit der SNMP Thematik da ich das in der Firma brauche. Danke für das Lob!

joey.brunner
10.01.03, 16:50
hi,

danke... hab das skript jetzt fertig, aber leider hilft mir das nicht viel ;), da ich immer wenn ich den snmpwalk oder den snmptable durchfuehre, die fehlermeldung kommt, ich haette keine community angegeben. ich hab aber public uebergeben.. hast ne idee?

kannst du es evtl. mal bei dir probieren, waere super... danke

joey

joey.brunner
11.01.03, 19:44
hi, noch ne frage, warum bringt dieser befehlscode immer einen fehler:

snmpget localhost -c public .1.3.6.1.4.1.2021.8 enterprises.ucdavis.extTable.extEntry.extIndex.1
Error in packet
Reason: (noSuchName) There is no such variable name in this MIB.
Failed object: UCD-SNMP-MIB::extIndex.1

Error in packet
Reason: (noSuchName) There is no such variable name in this MIB.
Failed object: UCD-SNMP-MIB::extTable

snmpwalk bringt nur immer End of Mib, egal was ich eingebe...

danke


Ich hab das doch in meiner config stehen:

# % snmpwalk -v 1 localhost public .1.3.6.1.4.1.2021.8
enterprises.ucdavis.extTable.extEntry.extIndex.1 = 1
enterprises.ucdavis.extTable.extEntry.extIndex.2 = 2
enterprises.ucdavis.extTable.extEntry.extNames.1 = "echotest"
enterprises.ucdavis.extTable.extEntry.extNames.2 = "shelltest"
# enterprises.ucdavis.extTable.extEntry.extCommand.1 = "/bin/echo hello world"
# enterprises.ucdavis.extTable.extEntry.extCommand.2 = "/bin/sh /tmp/shtest"
enterprises.ucdavis.extTable.extEntry.extResult.1 = 0
enterprises.ucdavis.extTable.extEntry.extResult.2 = 35
# enterprises.ucdavis.extTable.extEntry.extOutput.1 = "hello world."
# enterprises.ucdavis.extTable.extEntry.extOutput.2 = "hello world."
# enterprises.ucdavis.extTable.extEntry.extErrFix.1 = 0
# enterprises.ucdavis.extTable.extEntry.extErrFix.2 = 0

# Note that the second line of the /tmp/shtest shell script is cut
# off. Also note that the exit status of 35 was returned.

Jorge
12.01.03, 09:42
http://www.net-snmp.org/tutorial-5/commands/snmpget.html:



A common mistake when using the snmpget command is to leave off the index into the data you're looking for. In
the above commands, the variable requested by the OID is a scalar and the index to scalars is always a simple '0'
(zero), hence the trailing '.0' in all the oids above. If you had left it off, you would have gotten an error. Note that
the errrors differ slightly between SNMPv1 and SNMPv2c:

% snmpget -v 1 -c demopublic test.net-snmp.org sysUpTime
Error in packet Reason: (noSuchName)
There is no such variable name in this MIB. This name doesn't exist: system.sysUpTime
% snmpget -v 2c -c demopublic test.net-snmp.org sysUpTime
system.sysUpTime = No Such Instance currently exists

joey.brunner
12.01.03, 11:31
hi danke fuer das posting, aber das hatte ich auch schon gelesen, hab immer noch die selben fehlermeldungen, auch wenn ich die bsp aus der man nehme und die stellen in de snmpd.conf abaendere:(

joey

joey.brunner
12.01.03, 11:45
tu mir doch bitte einen gefallen, versuch mal mit snmpwalk und deiner snmpd.conf einen befehl erfolgreich zu uebergeben, oder mit snmpget oder aehnlichem. wenn das funktioniert, waere ich dir sehr dankbar, wenn du mir den befehl u evtl deine config schicken koenntest... ich hab langsam das gefuehl, dass er die config nicht einliest.... naja, waer mir sehr geholfe damit ... danke

joey

Jorge
12.01.03, 14:18
carsten@[cws-lx:~]# vi /tmp/shtest
carsten@[cws-lx:~]# chmod 777 /tmp/shtest
carsten@[cws-lx:~]# ll /tmp/shtest
-rwxrwxrwx 1 carsten users 49 Jan 12 14:03 /tmp/shtest
carsten@[cws-lx:~]# su -c "vi /usr/local/share/snmp/snmpd.conf"
Kennwort:
carsten@[cws-lx:~]# su -c "/etc/rc.d/init.d/snmpd stop"
Kennwort:
Stopping SNMP Agent [ OK ]
carsten@[cws-lx:~]# su -c "/etc/rc.d/init.d/snmpd start"
Kennwort:
Starting SNMP AGENT [ OK ]
carsten@[cws-lx:~]# snmpwalk -v 1 -c public localhost 1.3.6.1.4.1.2021.8.1
UCD-SNMP-MIB::extIndex.1 = INTEGER: 1
UCD-SNMP-MIB::extNames.1 = STRING: shelltest
UCD-SNMP-MIB::extCommand.1 = STRING: /bin/sh /tmp/shtest
UCD-SNMP-MIB::extResult.1 = INTEGER: 35
UCD-SNMP-MIB::extOutput.1 = STRING: hello world
UCD-SNMP-MIB::extErrFix.1 = INTEGER: 0
UCD-SNMP-MIB::extErrFixCmd.1 = STRING:
carsten@[cws-lx:~]# snmpwalk -v 1 -c public localhost 1.3.6.1.4.1.2021.8.1.100
UCD-SNMP-MIB::extResult.1 = INTEGER: 35
carsten@[cws-lx:~]# snmpwalk -v 1 -c public localhost 1.3.6.1.4.1.2021.8.1.101
UCD-SNMP-MIB::extOutput.1 = STRING: hello world
carsten@[cws-lx:~]# grep exec /usr/local/share/snmp/snmpd.conf
exec shelltest /bin/sh /tmp/shtest
carsten@[cws-lx:~]# cat /tmp/shtest
#!/bin/sh
echo hello world
echo hi there
exit 35
carsten@[cws-lx:~]#

Jorge
12.01.03, 14:22
carsten@[cws-lx:~]# cat /tmp/shtest
#!/bin/sh
ls -l /tmp/shtest
exit 35
carsten@[cws-lx:~]# snmpwalk -v 1 -c public localhost 1.3.6.1.4.1.2021.8.1.101
UCD-SNMP-MIB::extOutput.1 = STRING: -rwxrwxrwx 1 carsten users 36 Jan 12 14:21 /tmp/shtest
carsten@[cws-lx:~]#

joey.brunner
12.01.03, 14:50
hi super danke... das heisst meine config ist verbockt.. ich hab das die ganze zeit auf meiner workstation verscuht. ich werd jetzt mal snmp saugen und es auf meine lfs server ausprobieren. kannst du vielleicht deine config noch ranhaengen. waere super danke

joey

Jorge
12.01.03, 14:59
Original geschrieben von joey.brunner
mal snmp saugen und es auf meine lfs server ausprobieren.

Von mir verwendete net-snmp Version 5.0.6.


kannst du vielleicht deine config noch ranhaengen.

Eigentlich ungerne, aus zwei Gründen:

- es steht nichts Weltbewegendes darin,
- sollstest Du vielleicht auch noch einwenig selbst etwas zu Deiner Problemlösung beitragen ;).

joey.brunner
12.01.03, 15:05
ja stimmt schon, ich meinte auch nur die exec zeile und den community string.. wenn das ok ist, wie gesagt, ich steh etwas unter zeitdruck ;)

waer cool, wenn nicht, ist auch nicht sooooooooooooooooooo schlimm

joey

Jorge
12.01.03, 15:09
Die exec Zeile findest Du in meinem "ersten" snmpwalk Post, Antworten genauer lesen. Der communitystring ist per rocommunity gesetzt.

joey.brunner
12.01.03, 15:18
ok dann versuch ich das mal

danke

joey