Hi to all net-snmp coders,

   I am developing some MIB handlers using pass_persist perl script. I try
the example(local/pass_persist) you provide in your packege(version
5.1), and encounted some problems. The example is as following:

#!/usr/bin/perl

# Persistant perl script to respond to pass-through smnp requests

# put the following in your snmpd.conf file to call this script:
#
# pass_persist .1.3.6.1.4.1.2021.255 /path/to/pass_persisttest

# Forces a buffer flush after every echo
$|=1;

use strict;

my $counter = 0;
my $place = ".1.3.6.1.4.1.2021.255";

while (<>){
  if (m!^PING!){
    print "PONG\n";
    next;
  }
  my $cmd = $_;
  my $req = <>;
  my $ret;
  chomp($cmd);
  chomp($req);

  if ( $cmd eq "set" ) {            # i add
        print "wrong-type\n";       # these lines
        next;                       # to try
  }                                 # how to handle set command

  if ( $cmd eq "getnext" ) {
    if ($req eq $place) {
      $ret = "$place.1";
    } elsif ($req eq "$place.1") {
      $ret = "$place.2.1";
    } elsif ($req eq "$place.2.1") {
      $ret = "$place.2.2";
    } elsif ($req eq "$place.2.2") {
      $ret = "$place.3";
    } elsif ($req eq "$place.3") {
      $ret = "$place.4";
    } elsif ($req eq "$place.4") {
      $ret = "$place.5";
    } elsif ($req eq "$place.5") {
      $ret = "$place.6";
    } else {
      print "NONE\n";
      next;
    }
  } else {
    if ($req eq $place) {
      print "NONE\n";
      next;
    } else {
      $ret = $req;
    }
  }

  print "$ret\n";

  if ($ret eq "$place.1") {
    print "string\nlife the universe and everything\n";
  } elsif ($ret eq "$place.2.1") {
    print "integer\n423\n";
  } elsif ($ret eq "$place.2.2") {
    print "objectid\n.1.3.6.1.4.42.42.42\n";
  } elsif ($ret eq "$place.3") {
    print "timeticks\n363136200\n";
  } elsif ($ret eq "$place.4") {
    print "ipaddress\n127.0.0.1\n";
  } elsif ($ret eq "$place.5") {
    $counter++;
    print "counter\n$counter\n";
  } elsif ($ret eq "$place.6") {
    print "gauge\n42\n";
  } else {
    print "string\nack... $ret $req\n";
  }
}

When i run the command as following:
[EMAIL PROTECTED] snmp]# snmpset -v 2c -c private localhost
1.3.6.1.4.1.2021.255.1.1 i 5

I expect to get output something like:

Error in packet.
Reason: wrongType (The set datatype does not match the data type the agent
expects)

But in fact, the output is:
UCD-SNMP-MIB::ucdavis.255.1.1 = INTEGER: 5

In addition, when i run the command a second time, the process running the
pass_persist script will exit. It seems that such a script aren't
"persist"
as it was called:)

So, my questions are:
1)how to write script to handle snmp set command;
2)how to let such scripts to return correct error message.


PS:
If we resive the script as following:

#!/usr/bin/perl

# Persistant perl script to respond to pass-through smnp requests

# put the following in your snmpd.conf file to call this script:
#
# pass_persist .1.3.6.1.4.1.2021.255 /path/to/pass_persisttest

# Forces a buffer flush after every echo
$|=1;

use strict;

my $counter = 0;
my $place = ".1.3.6.1.4.1.2021.255";

while (<>){
  if (m!^PING!){
    print "PONG\n";
    next;
  }
  my $cmd = $_;
  my $req = <>;
  my $ret;
  chomp($cmd);
  chomp($req);

  if ( $cmd eq "set" ) {            # i add
        print "wrong-type";         # these lines
        print "PONG\n";             #####################note this line
        next;                       # to try
  }                                 # how to handle set command

  if ( $cmd eq "getnext" ) {
    if ($req eq $place) {
      $ret = "$place.1";
    } elsif ($req eq "$place.1") {
      $ret = "$place.2.1";
    } elsif ($req eq "$place.2.1") {
      $ret = "$place.2.2";
    } elsif ($req eq "$place.2.2") {
      $ret = "$place.3";
    } elsif ($req eq "$place.3") {
      $ret = "$place.4";
    } elsif ($req eq "$place.4") {
      $ret = "$place.5";
    } elsif ($req eq "$place.5") {
      $ret = "$place.6";
    } else {
      print "NONE\n";
      next;
    }
  } else {
    if ($req eq $place) {
      print "NONE\n";
      next;
    } else {
      $ret = $req;
    }
  }

  print "$ret\n";

  if ($ret eq "$place.1") {
    print "string\nlife the universe and everything\n";
  } elsif ($ret eq "$place.2.1") {
    print "integer\n423\n";
  } elsif ($ret eq "$place.2.2") {
    print "objectid\n.1.3.6.1.4.42.42.42\n";
  } elsif ($ret eq "$place.3") {
    print "timeticks\n363136200\n";
  } elsif ($ret eq "$place.4") {
    print "ipaddress\n127.0.0.1\n";
  } elsif ($ret eq "$place.5") {
    $counter++;
    print "counter\n$counter\n";
  } elsif ($ret eq "$place.6") {
    print "gauge\n42\n";
  } else {
    print "string\nack... $ret $req\n";
  }
}

we can run snmpset command mentioned before for any times. The process
running the pass_persist script will NOT exit now! But we still cannot get
the the correct error reports.

Thanks.


Best regards,

Su Zhiyong




-------------------------------------------------------
SF.Net email is sponsored by:
Tame your development challenges with Apache's Geronimo App Server. Download
it for free - -and be entered to win a 42" plasma tv or your very own
Sony(tm)PSP.  Click here to play: http://sourceforge.net/geronimo.php
_______________________________________________
Net-snmp-coders mailing list
Net-snmp-coders@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/net-snmp-coders

Reply via email to