#!/usr/bin/perl -w
# $Id: jail-snmp 138 2004-11-19 21:04:24Z kirk $
use strict;
use Jail;
open STDERR, '>/dev/null' or die "Couldn't redirect STDERR: $_";
my ($cmd,
$oid) = @ARGV[0,1];
my $getnext = $cmd eq '-g' ? 0 : 1;
$_ = $oid;
s/^\.//;
my @id = (split /\./);
my $max = (scalar @id) - 1;
my @jail = Jail::getJailList();
my $retval;
# I love get requests. Seriously. I love them.
if ($cmd eq '-g')
{
$retval = topLevel(8);
unless (defined $$retval{'error'})
{
print <<__EORESPONSE__;
$oid
$$retval{'type'}
$$retval{'value'}
__EORESPONSE__
}
exit;
}
# I hate getnext requests. Really. I hate them.
my $count = 0;
$retval = topLevel(8);
unless (defined $$retval{'error'})
{
$id[-1]++;
}
while (1 and ++$count < 20)
{
# $id[-1]++;
$retval = topLevel(8);
if (defined ($$retval{'error'}))
{
if ($$retval{'error'} eq 'short')
{
push @id, 1;
$max++;
}
elsif ($$retval{'error'} eq 'long')
{
pop @id;
$max--;
}
elsif ($$retval{'error'} eq 'max')
{
my $levels = $$retval{'levels'} || 1;
for (my $i = 0; $i < $levels; $i++)
{
pop @id;
$max--;
}
$id[-1]++;
exit if scalar @id < 8;
}
elsif ($$retval{'error'} eq 'quit')
{
exit;
}
}
else
{
$oid = '.' . (join '.', @id);
print <<__EORESPONSE__;
$oid
$$retval{'type'}
$$retval{'value'}
__EORESPONSE__
exit;
}
}
exit;
sub topLevel
{
my $level = shift;
return {'error'=>'short'} if $level > $max;
if ($id[$level] == 1)
{
return general($level + 1);
}
if ($id[$level] == 2)
{
return jailTable($level + 1);
}
return {'error'=>'quit'};
}
sub general
{
my $level = shift;
my $key = $id[$level];
return {'error'=>'short'} if $level > $max;
# Number of jails
if ($key == 1)
{
return {'type' => 'integer', 'value' => scalar @jail};
}
return {'error'=>'max'};
}
sub jailTable
{
my $level = shift;
return {'error'=>'short'} if ($level + 1) > $max;
return {'error'=>'long'} if ($level + 1) < $max;
my $key = $id[$level];
my $index = $id[$level + 1];
# Jail too high?
return {'error'=>'max'} if $index > scalar @jail;
my $servername = $jail[$index - 1];
# Index
if ($key == 1)
{
return {'type'=>'integer', 'value'=>$index};
}
# Servername
elsif ($key == 2)
{
return {'type'=>'string', 'value'=>$servername};
}
# Hostname
elsif ($key == 3)
{
my $temp = Jail::getJailInfo($servername);
return {'type'=>'string','value'=>$$temp{'hostname'}};
}
# IP address
elsif ($key == 4)
{
my $temp = Jail::getJailInfo($servername);
return {'type'=>'ipaddress','value'=>$$temp{'ip'}};
}
# Processes
elsif ($key == 5)
{
my %temp = Jail::getProcList($servername);
return {'type'=>'string','value'=>scalar (keys %temp) . ".0"};
}
# Back out at least two levels to get out of this table
return {'error'=>'max', 'levels'=>2};
}
syntax highlighted by Code2HTML, v. 0.9.1