tertullian01 has asked for the wisdom of the Perl Monks concerning the following question:

I am currently working on script that will use the Net::SNMP module to check a service on a remote machine and if it isn't running then it will send a trap to an event manager. I can check the service successfully and I can send an empty trap successfully, however I have not been able to send a trap with any information actually in it. Here is a snippet of code I am using.
I have already successfully made the SNMP connection:
my $svSvcName = '1.3.6.1.4.1.77.1.2.3.1.1'; my $message = "THIS IS AN SNMP TEST"; my @oids = ($svSvcName, OCTET_STRING, $message); #my @oids; my $result = $session->trap( -agentaddr => '172.16.4.32', -varbindlist => \@oids #-varbindlist => [$svSvcName, OCTET_STRIN +G, "$message"] ); if (!defined($result)) { printf("ERROR: %s.\n", $session->error); $session->close; exit 1; }
This is the error I get using this code: ERROR: Unknown ASN.1 type [OCTET_STRING].

Replies are listed 'Best First'.
Re: Send SNMP trap
by LazerRed (Pilgrim) on Sep 23, 2003 at 20:49 UTC
    I've a couple quick thoughts/questions on this...

    Check where your building your Net::SNMP session, and verify what version of SNMP you are using. The docs for Net::SNMP, at the end of the traps section, states:

    NOTE: This method can only be used when the version of the object is set to SNMPv1.

    One other thing that poped into my head, is networks. I hope that your two machines are on the same subnet as your manager... Most routers drop snmp by default, just a thought. Should have read your comment more carefully, Doah!

    Update:Have you tried changing:
    my @oids = ($svSvcName, OCTET_STRING, $message);

    To:
    my @oids = ($svSvcName, 0x01, $message);

    A longshot, but I'm rather inexperienced with sending traps.

    LR

    Whip me, Beat me, Make me use Y-ModemG.
      The session is using SNMPv1. I tried changing OCTET_STRING to 0x01 and it ended in the same result.
      Unknown ASN.1 type [0x01]
      I am including the full code so anyone can take a look at what is going on:
      use strict; use Net::SNMP qw(:snmp); my ($session, $error) = Net::SNMP->session( -hostname => shift || '$ +host', -community => 'public', -version => 'snmpv1', -port => shift || 16 +2 ); if (!defined($session)) { printf("ERROR: %s.\n", $error); exit 1; } my $svSvcName = '1.3.6.1.4.1.77.1.2.3.1.1'; my $message = "THIS IS AN SNMP TEST"; my @oids = ($svSvcName, "OCTET_STRING", $message); #my @oids; my $result = $session->trap( -agentaddr => '$monitor', -varbindlist => \@oids #-varbindlist => [$svSvcName, OCTET_STRIN +G, "$message"] ); if (!defined($result)) { printf("ERROR: %s.\n", $session->error); $session->close; exit 1; } $session->close;
      Also I don't know if this is of importance but the script is running on a Windows 2000 machine with perl 5.8
        use Net::SNMP qw(:asn1); # missing $monitor? my $monitor = '192.168.254.1'; # remove quotes from OCTET_STRING, it's a constant. my @oids = ($svSvcName, OCTET_STRING, $message);

        the above changes make it work for me.

        # snmptrapd -f -P 2003-09-23 15:20:06 NET-SNMP version 5.0.6 Started. 2003-09-23 15:20:25 192.168.254.1(via 192.168.254.1) TRAP, SNMP v1, co +mmunity public SNMPv2-SMI::enterprises Enterprise Specific Trap (0) Uptime: 0 +:00:01.00 SNMPv2-SMI::enterprises.77.1.2.3.1.1 = STRING: "THIS IS AN SNM +P TEST" 2003-09-23 15:20:48 192.168.254.1(via 192.168.254.1) TRAP, SNMP v1, co +mmunity public SNMPv2-SMI::enterprises Enterprise Specific Trap (0) Uptime: 0 +:00:01.00 SNMPv2-SMI::enterprises.77.1.2.3.1.1 = STRING: "THIS IS AN SNM +P TEST" 2003-09-23 15:21:08 192.168.254.1(via 192.168.254.1) TRAP, SNMP v1, co +mmunity public SNMPv2-SMI::enterprises Enterprise Specific Trap (0) Uptime: 0 +:00:00.00 SNMPv2-SMI::enterprises.77.1.2.3.1.1 = STRING: "THIS IS AN SNM +P TEST"