blob: e4ac040d688591bbc3cab2641f15e10c95abe44a [file] [log] [blame]
package NetSNMPTest;
use File::Temp qw(tempfile tempdir);
use IO::File;
use Data::Dumper;
use strict;
sub new {
my $type = shift;
my ($class) = ref($type) || $type;
my $self = {};
%$self = @_;
bless($self, $class);
$self->init();
return $self;
}
sub init {
my ($self) = @_;
$self->{'dir'} = tempdir();
print "# using tempdir $self->{dir}\n";
foreach my $suffix (qw(conf pid log out)) {
$self->{"snmpd.$suffix"} ||= $self->{'dir'} . "/snmpd.$suffix";
}
$self->{'snmp.conf'} ||= $self->{'dir'} . "/snmp.conf";
$self->{'confdir'} ||= $self->{'dir'};
$self->{'persistentdir'} ||= $self->{'dir'} . "/persistent";
}
sub config_file {
my ($self, $file, $string) = @_;
my $fh = new IO::File (">> $file");
$fh->print($string);
if ($string !~ /\n$/) {
$fh->print("\n");
}
$fh->close();
}
sub config_agent {
my ($self, $string) = @_;
$self->config_file($self->{'snmpd.conf'}, $string);
}
sub config_app {
my ($self, $string) = @_;
$self->config_file($self->{'snmp.conf'}, $string);
}
sub require_feature {
my ($self, $feature) = @_;
my $srcdir = $ENV{'srcdir'} || "..";
my $fh = new IO::File("$srcdir/include/net-snmp/net-snmp-config.h");
while (<$fh>) {
if (/#define $feature 1/) {
$fh->close();
return 1;
}
}
print "1..0 # SKIP missing $feature\n";
exit;
}
sub start_agent {
my ($self, $flags) = @_;
$flags ||= $self->{'snmpdflags'};
$ENV{'SNMPCONFPATH'} = $self->{'confdir'};
$ENV{'SNMP_PERSISTENT_DIR'} = $self->{'peristentdir'};
my $cmd = "snmpd $flags -r -U -p $self->{'snmpd.pid'} -Lf $self->{'snmpd.log'} $self->{'agentaddress'} > $self->{'snmpd.out'} 2>&1";
System("$cmd &");
sleep(1);
return $self->wait_for($self->{'snmpd.log'}, "NET-SNMP version");
}
sub stop_agent {
my ($self) = @_;
my $pidfile = new IO::File "$self->{'snmpd.pid'}";
my $pid = <$pidfile>;
kill("TERM", $pid);
$self->wait_for($self->{'snmpd.log'}, 'shutting down');
}
# returns 1 on success, 0 on failure
sub wait_for {
my ($self, $filename, $regexp, $maxtime) = @_;
my $fh = new IO::File "$filename";
return 0 if (!$fh);
$maxtime = 10 if (!defined($maxtime));
my $timecount = 0;
# print "# reading from: $filename\n";
while (1) {
my $line = <$fh>;
# print "# line: $line\n";
if ($line eq "") {
if ($timecount == $maxtime) {
return 0;
}
sleep(1);
print "# sleeping ...\n";
$fh->clearerr();
$timecount++;
} else {
chomp($line);
if ($line =~ /$regexp/) {
return 1;
}
}
}
return 0;
}
sub Debug {
print "# " . join(" ",@_);
}
sub System {
my ($cmd) = @_;
Debug("running: ", $cmd, "\n");
system($cmd);
}
sub DIE {
my $self = shift;
$self->stop_agent();
die @_;
}
1;
=pod
=head1 NAME
NetSNMPTest - simple testing module for testing perl tests
=head1 USAGE
use NetSNMPTest;
use Test;
use SNMP;
my $destination = "udp:localhost:9876";
my $test = new NetSNMPTest(agentaddress => $destination);
$test->require_feature("SOME_IFDEF_FROM_NET_SNMP_CONFIG_H");
$test->config_agent("rocommunity public");
$test->config_agent("syscontact testvalue");
$test->DIE("failed to start the agent") if (!$test->start_agent());
my $session = new SNMP::Session(DestHost => $destination,
Version => '2c',
Community => 'public');
my $value = $session->get('sysContact.0');
plan(tests => 1);
ok($value, 'testvalue');
$test->stop_agent();
=cut