tkmib
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:30k
- #!/usr/bin/perl
- #!/usr/bin/perl -w
- require 5;
- # attempt to determine if they have the proper modules installed.
- # SNMP
- my $havesnmp = eval {require SNMP;};
- # the Tk packages
- my $havetk = eval {require Tk;
- require Tk::Table;
- require Tk::HList;
- require Tk::FileSelect;
- require Tk::Dialog;};
- if (!$havesnmp) {
- print "
- ERROR: You don't have the SNMP perl module installed. Please obtain this by
- getting the latest source release of the net-snmp toolkit from
- http://www.net-snmp.org/download/ . The perl module is contained in
- the perl/SNMP directory. See the INSTALL file there for
- instructions.
- ";
- }
- if (!$havetk) {
- print "
- ERROR: You don't have the Tk module installed. You should be able to
- install this by running (as root):
- perl -MCPAN -e 'install Tk'
- ";
- }
- if (!$havetk || !$havesnmp) {
- print "n";
- exit;
- }
- if ($havetk) {
- # Tk doesn't seem to like require so we force use here.
- eval {import Tk;
- import Tk::Table;
- import Tk::HList;
- import Tk::FileSelect;
- import Tk::Dialog;
- import SNMP;};
- }
- use Getopt::Std;
- use Data::Dumper;
- $host = 'localhost';
- $OID = '.1.3.6.1';
- $opts{'C'}=$ENV{'HOME'} . "/.snmp/tkmibrc";
- # default session options
- if (test_version(1,5,0,0)) {
- print "setting optsn";
- %opts = (
- 'c' => "public",
- 'p' => 161,
- 't' => 5000000,
- 'r' => 5,
- 'v' => 1,
- 'a' => 'MD5',
- 'x' => 'DES',
- 'A' => '',
- 'X' => '',
- 'n' => '',
- 'u' => 'initial',
- 'l' => 'authNoPriv',
- );
- }
- getopts("hp:v:a:A:x:X:n:u:l:r:t:o:c:C", %opts);
- sub usage {
- print "
- tkmib [-C] [-o OID] [SNMPCMD arguments] [host]
- -C CONFIG_FILE load CONFIG_FILE after starting up. (default: ~/.snmp/tkmibrc)
- (use -C /dev/null to not read one).
- See the snmpcmd manual page for related SNMPCMD arguments. (Not all
- options are currently supported.)
- ";
- exit();
- }
- usage() if ($opts{'h'});
- # initialize defaults, may be overridden by config file below
- @displayInfo=qw(type access status units hint moduleID enums indexes);
- @saveoptions = ('displayoidas', 'writecolor', 'graphtime', 'graphdelta');
- $displayoidas='full';
- $writecolor = "blue";
- $graphtime=5;
- $graphdelta=1;
- foreach $i (@displayInfo) {
- $displayInfoStates{$i} = 1;
- }
- # source config file
- do $opts{'C'} if ($opts{'C'} && -f $opts{'C'});
- $session_opts{'UseLongNames'} => 1;
- $session_opts{'RemotePort'} = $opts{'p'} if ($opts{'p'});
- $session_opts{'Community'} = $opts{'c'} if ($opts{'c'});
- $session_opts{'Version'} = $opts{'v'} if ($opts{'v'});
- $session_opts{'AuthProto'} = $opts{'a'} if ($opts{'a'});
- $session_opts{'AuthPass'} = $opts{'A'} if ($opts{'A'});
- $session_opts{'PrivProto'} = $opts{'x'} if ($opts{'x'});
- $session_opts{'PrivPass'} = $opts{'X'} if ($opts{'X'});
- $session_opts{'Context'} = $opts{'n'} if ($opts{'n'});
- $session_opts{'SecName'} = $opts{'u'} if ($opts{'u'});
- $session_opts{'SecLevel'} = $opts{'l'} if ($opts{'l'});
- $session_opts{'Retries'} = $opts{'r'} if ($opts{'r'});
- $session_opts{'Timeout'} = $opts{'t'} if ($opts{'t'});
- $host = shift if ($#ARGV > -1);
- $session_opts{'Community'} = shift if ($#ARGV > -1);
- @graphcolors=qw(blue red green yellow purple);
- # initialize SNMP module
- $SNMP::save_descriptions=1;
- $SNMP::use_long_names=1;
- $SNMP::use_enums=1;
- $SNMP::verbose = 1;
- my $tmpbd = 1;
- $top = MainWindow->new();
- $top->title("tkmib");
- #Menus
- $MenuFrame = $top->Frame(-relief => "raised",-borderwidth => 2);
- $MenuFrame->pack(-fill => "x",-expand => 1);
- $FileMenuBut = $MenuFrame->Menubutton(-pady => $tmpbd, -padx => $tmpbd, -text => "File",
- -menuitems =>
- [
- # [Button => "Save Output", -command => [&saveOutput]],
- [Button => "Quit", -command => [&exit]]
- ]);
- $FileMenuBut->pack(-side => 'left');
- $MibMenuBut = $MenuFrame->Menubutton(-pady => $tmpbd, -padx => $tmpbd, -text => "Mib",
- -menuitems =>
- [[Button => "Find a mib node",
- -command => sub { my $var;
- entryBox("Find a Mib Node",
- "Enter a mib node name to search for:",
- $var, &findANode );}],
- [Button => "Load a New Mib File", -command => [&loadNewMibFile]],
- [Button => "Load a New Mib Module",
- -command => sub { my $var;
- entryBox("Load a Module",
- "Enter a SNMP MIB module name to load:",
- $var, &loadIt);}]
- ]);
- $MibMenuBut->pack(-side => 'left');
- $OptMenuBut = $MenuFrame->Menubutton(-pady => $tmpbd, -padx => $tmpbd, -text => "Options",
- -menuitems =>
- [[Cascade => "~Display", -menuitems =>
- [
- [Cascade => "~MIB Information"],
- [Cascade => "~OID Display", -menuitems =>
- [
- [Radiobutton => 'full', -variable => $displayoidas],
- [Radiobutton => 'numeric', -variable => $displayoidas],
- [Radiobutton => 'short', -variable => $displayoidas],
- [Radiobutton => 'module', -variable => $displayoidas]
- ]
- ],
- [Button => "Writable Color",
- -command => [&entryBox,"Writable Color",
- "Color for writable objects:",
- $writecolor]]
- ]],
- [Cascade => "Use SNMP Version", -menuitems =>
- [
- [Radiobutton => '1', -variable => $session_opts{'Version'}],
- [Radiobutton => '2c', -variable => $session_opts{'Version'}],
- [Radiobutton => '3', -variable => $session_opts{'Version'}]
- ]
- ], # ends version number specification
- [Cascade => "SNMPv1/2c options", -menuitems =>
- [
- [Button => "Community Name",
- -command => [&entryBox,"Community Name", "Community name to use:",
- $session_opts{'Community'}]]
- ]
- ],
- [Cascade => "SNMP3 options", -menuitems =>
- [
- [Button => "Security Name",
- -command => [&entryBox,"Security Name", "Security Name to use:",
- $session_opts{'SecName'}]],
- [Cascade => "Security Level", -menuitems =>
- [
- [Radiobutton => 'noAuthNoPriv',
- -variable => $session_opts{'SecLevel'}],
- [Radiobutton => 'authNoPriv',
- -variable => $session_opts{'SecLevel'}],
- [Radiobutton => 'authPriv',
- -variable => $session_opts{'SecLevel'}]
- ]
- ],
- [Button => "Authentication Passphrase",
- -command => [&entryBox,"Authentication Passphrase",
- "Authentication Passphrase to use:",
- $session_opts{'AuthPass'}]],
- [Cascade => "Authentication Type", -menuitems =>
- [
- [Radiobutton => 'MD5',
- -variable => $session_opts{'AuthProto'}],
- [Radiobutton => 'SHA',
- -variable => $session_opts{'AuthProto'}],
- ]
- ],
- [Button => "Privacy Passphrase",
- -command => [&entryBox,"Privacy Passphrase",
- "Privacy Passphrase to use:",
- $session_opts{'PrivPass'}]],
- [Cascade => "Privacy Type", -menuitems =>
- [
- [Radiobutton => 'DES',
- -variable => $session_opts{'PrivProto'}],
- ]
- ],
- ]
- ],
- [Button => "Time between graph polls",
- -command => sub { entryBox("graph polls", "Time between graph polls:",
- $graphtime);}],
- [Button => "Port number",
- -command => sub { entryBox("Port Number", "SNMP Port number to use:",
- $session_opts{'RemotePort'});}],
- [Button => "TimeOut",
- -command => sub { entryBox("Time Out", "Timeout for SNMP requests:",
- $session_opts{'Timeout'});}],
- [Button => "Retries",
- -command => sub { entryBox("Retries",
- "Number of Times to Retransmit Requests:",
- $session_opts{'Retries'});}],
- [Button => "Save Options",
- -command => &save_options]
- ])->pack(-side => 'left');
-
- $tmp = $OptMenuBut->cget(-menu);
- $OptMenuWidgets = $tmp->entrycget("Display", -menu);
- $OptMenuWidgets = $OptMenuWidgets->entrycget("MIB Information", -menu);
- $hlist=$top->Scrolled(qw(HList -itemtype imagetext -browsecmd main::showInfo
- -command main::showChildren -width 80 -height 15));
- $hlist->pack(-side => 'top', -expand => 1, -fill => 'both');
- my $sFrame = $top->Frame(-relief => 'raised', -borderwidth => $tmpbd);
- $sFrame->pack(-side => 'top', -fill => 'x');
- $sFrame->Label(-pady => $tmpbd, -padx => $tmpbd, -text => 'OID: ', -relief => 'raised', -borderwidth => $tmpbd)
- ->pack(-side => 'left');
- $mibOID = $sFrame->Entry(-textvariable => $OID, -relief => 'flat', -width => 40);
- $mibOID->pack(-side => 'left');
- $mibTextOID = $sFrame->Label(-pady => $tmpbd, -padx => $tmpbd, -text => '');
- $mibTextOID->pack(-side => 'right');
- $dispFrame=$top->Frame(-relief => 'raised', -borderwidth => $tmpbd);
- $dispFrame->pack(-side => 'top', -fill =>'x');
- for($i=0;$i<= $#displayInfo;$i++) {
- createRow($i) if ($displayInfoStates{$displayInfo[$i]});
- optionalWidget($i,$OptMenuWidgets, $displayInfoStates{$displayInfo[$i]});
- }
-
- $descrFrame=$top->Frame(-relief => 'raised', -borderwidth => $tmpbd);
- $descrFrame->pack(-side => 'top', -fill =>'x');
- $descrFrame->Label(-pady => $tmpbd, -padx => $tmpbd, -text => 'Description:', -anchor => 'w')->pack(-side => 'top',
- -fill => 'x');
- $descr = $descrFrame->Scrolled(qw(Text -width 80 -height 4));
- $descr->pack(-side => 'top', -fill => 'x');
- $bFrame = $top->Frame(-relief => 'raised', -borderwidth => $tmpbd);
- $bFrame->pack(-side => 'top', -fill => 'x');
- $hostEntry = $bFrame->Entry(-textvariable => $host, -width => 12);
- $hostEntry->pack(-side => 'left');
- $bFrame->Button(-pady => $tmpbd, -padx => $tmpbd, -text => 'graph', -command => &snmpgraph)->pack(-side => 'right');
- $tablebutton = $bFrame->Button(-pady => $tmpbd, -padx => $tmpbd, -text => 'table', -command => &snmptable);
- $tablebutton->pack(-side => 'right');
- $bFrame->Button(-pady => $tmpbd, -padx => $tmpbd, -text => 'walk', -command => &snmpwalk)->pack(-side => 'right');
- $bFrame->Button(-pady => $tmpbd, -padx => $tmpbd, -text => 'getnext', -command => &snmpgetnext)->pack(-side => 'right');
- $bFrame->Button(-pady => $tmpbd, -padx => $tmpbd, -text => 'get', -command => &snmpget)->pack(-side => 'right');
- $bFrame->Button(-pady => $tmpbd, -padx => $tmpbd, -text => 'set', -command => [&snmpsetbegin, 'OID'])->pack(-side => 'right');
- $stopBut = $bFrame->Button(-pady => $tmpbd, -padx => $tmpbd, -text => 'stop', -command => sub { stop(1) },
- -state => 'disabled');
- $stopBut->pack(-side => 'right');
- $oFrame = $top->Frame(-borderwidth => $tmpbd, -relief => 'raised');
- $oFrame->pack(-side => 'top', -fill => 'both');
- $output = $oFrame->Scrolled(qw(Text -width 80 -height 14));
- $output->pack(-side => 'top', -fill => 'both', -expand => 1);
- $tmpFrame = $top->Frame(-relief => 'raised', -borderwidth => $tmpbd);
- $tmpFrame->pack(-side => 'top', -fill => 'x');
- $tmpFrame->Label(-pady => $tmpbd, -padx => $tmpbd, -text => "Status: ", -anchor => 'w')
- # -relief => 'raised', -borderwidth => $tmpbd)
- ->pack(-side => 'left');
- $status = $tmpFrame->Label(-pady => $tmpbd, -padx => $tmpbd, -anchor => 'w');
- $status->pack(-side => 'left', -fill => 'x');
- # initialize the browser
- foreach $i (qw(.1 .1.3 .1.3.6 .1.3.6.1)) {
- addMibOID($i);
- }
- showChildren("$OID");
- if (defined($opts{'o'})) {
- findANode($opts{'o'});
- }
- MainLoop();
- sub insertresult {
- my $oid = shift;
- my $val = shift;
- $oid = $OID if ($oid eq "OID");
- $output->insert('end', $oid, "oid:$oid");
- $output->tagBind("oid:$oid", '<1>', [sub{shift;
- my $oid = shift;
- findANode($oid);
- my $tag = SNMP::translateObj($oid);
- showInfo($tag);},$oid]);
- $output->insert('end', " = ");
- my $mib = $SNMP::MIB{format_oid("$oid",'numeric')};
- $output->insert('end', $val, "value:$oid");
- if ($mib->{'access'} =~ /(Write|Create)/) {
- $output->tagConfigure("value:$oid", -foreground => $writecolor);
- $output->tagBind("value:$oid", '<1>', [sub{shift;
- my $oid = shift;
- my $value = shift;
- snmpsetmaybebegin($oid, $value);
- findANode($oid);
- my $tag = SNMP::translateObj($oid);
- showInfo($tag);},format_oid($oid,'full'), $val]);
- }
- $output->insert('end', "n");
- }
- sub insertvar {
- my $var = shift;
- my $name = get_oid($var);
- insertresult($name,"$var->[$SNMP::Varbind::val_f]");
- }
- sub snmpsetup {
- my $oid = $OID;
- my $tag = SNMP::translateObj($oid);
- my $sess = new SNMP::Session(DestHost => $host, %session_opts);
- my $var = new SNMP::Varbind([$oid]);
- if (!defined($var)) {
- print "ack: $@ $SNMP::ErrorStr $!n";
- }
- stop(0);
- initText();
- $oid = "." . $oid if ($oid !~ /^./);
- return ($oid, $sess, $var);
- }
- sub initText {
- if (ref($output) eq "Tk::Frame" && defined($$output{'_#text'})) {
- $output->delete('0.0','end');
- } else {
- $output->destroy();
- $output = $oFrame->Scrolled(qw(Text -width 80 -height 14));
- $output->pack(-side => 'top', -fill => 'both', -expand => 1);
- }
- }
- sub initTable {
- $output->destroy();
- $oFrame->packPropagate(0);
- $output = $oFrame->Table(-columns => shift, -width => 80, -height => 14,
- -fixedrows => 2, -fixedcolumns => 1);
- $output->pack(-side => 'top', -fill => 'both', -expand => 1);
- }
- sub initCanvas {
- $output->destroy();
- $oFrame->packPropagate(0);
- $output = $oFrame->Scrolled(qw(Canvas -width 80c -height 14c));
- $output->pack(-side => 'top', -fill => 'both', -expand => 1);
- }
- sub snmpget {
- (my $oid, my $sess, my $var) = snmpsetup();
- $status->configure(-text => "getting: $host $community $oid");
- $top->update();
- my $val = $sess->get($var);
- if ($sess->{ErrorStr}) {
- $status->configure(-text => $sess->{ErrorStr});
- } else {
- insertvar($var);
- $status->configure(-text => "");
- }
- }
- sub snmpsetbegin {
- my $startoid = shift;
- my $startval = shift;
- my $setwin = MainWindow->new();
- $setwin->title("SNMP set");
- my $varswin = $setwin->Frame(-relief => "raised",-borderwidth => $tmpbd);
- my $vars = new SNMP::VarList;
- $varswin->pack(-side => 'top');
- my $buttons = $setwin->Frame(-relief => "raised")->pack(-side => 'top', -fill => "x",-expand => 1);
- $buttons->Button(-pady => $tmpbd, -padx => $tmpbd, -text => 'Add a varbind', -command => [&snmpsetbegin_addvar, $vars, $varswin, 'OID'])->pack(-side => 'left', -fill => "x",-expand => 1);
- $buttons->Button(-pady => $tmpbd, -padx => $tmpbd, -text => 'perform set', -command => [&snmpsetbegin_ok, $vars, $setwin, $varswin])->pack(-side => 'left');
- $buttons->Button(-pady => $tmpbd, -padx => $tmpbd, -text => 'Cancel', -command => [sub { my $widget = shift; $varswin = shift; if ($setmain == $varswin) { $setmain = undef; } $widget->destroy();}, $setwin, $varswin])->pack(-side => 'right');
- if ($startoid ne "") {
- snmpsetbegin_addvar($vars, $varswin, $startoid, $startval);
- }
- if (!$setmain) {
- $setmain = $varswin;
- $setvars = $vars;
- }
- }
- sub make_enum_button {
- my $win = shift;
- my $var = shift;
- my @objs;
- foreach my $i (@_) {
- push @objs,[Radiobutton => $i, -variable => $var];
- }
- return $win->Menubutton(-pady => $tmpbd, -padx => $tmpbd, -textvariable => $var,
- -relief => raised,
- -menuitems => @objs);
- }
- sub snmpsetmaybebegin {
- my ($oid, $val) = @_;
- if ($setmain) {
- snmpsetbegin_addvar($setvars, $setmain, $oid, $val);
- } else {
- snmpsetbegin($oid, $val);
- }
- }
- sub snmpsetbegin_addvar {
- my ($vars, $place, $oid, $val) = @_;
- $oid = $OID if ($oid eq "OID");
- my $mib = $SNMP::MIB{format_oid("$oid",'numeric')};
- my $var = new SNMP::Varbind([$oid, '', $val, $mib->{'type'} || 'INTEGER']);
- push @$vars,$var;
- my $frame = $place->Frame();
- $frame->Entry(-textvariable => $var->[0], -width => 20)->pack(-side => 'left');
- make_enum_button($frame, $var->[3], qw(OBJECTID OCTETSTR INTEGER NETADDR IPADDR COUNTER COUNTER64 GAUGE UINTEGER TICKS OPAQUE NULL))->pack(-side => 'left');
- if (ref($mib->{'enums'}) eq HASH && scalar(keys(%{$mib->{'enums'}})) > 0) {
- make_enum_button($frame, $var->[2], keys(%{$mib->{'enums'}}))->pack(-side => 'left');
- } else {
- $frame->Entry(-textvariable => $var->[2])->pack(-side => 'left');
- }
- $frame->pack(-expand => 1, -fill => 'x');
- }
- sub snmpsetbegin_ok {
- my ($vars, $win, $frame) = @_;
- snmpset($vars);
- $setmain = undef if ($setmain == $frame);
- $win->destroy();
- }
- sub snmpset {
- my $vars = shift;
- (my $oid, my $sess, my $var) = snmpsetup();
- $status->configure(-text => "setting: $host -> " . Dumper($vars) . "n");
- $top->update();
- my $val = $sess->set($vars);
- if ($sess->{ErrorStr}) {
- $output->insert('end', "Set failed.nReason: $sess->{ErrorStr}");
- $status->configure(-text => $sess->{ErrorStr});
- } else {
- foreach my $i (@$vars) {
- insertvar($i);
- }
- $status->configure(-text => "");
- }
- }
- sub snmpgetnext {
- (my $oid, my $sess, my $var) = snmpsetup();
- $status->configure(-text => "get next: $host $community $oid");
- $top->update();
- my $val = $sess->getnext($var);
- if ($sess->{ErrorStr}) {
- $status->configure(-text => $sess->{ErrorStr});
- } else {
- insertvar($var);
- $status->configure(-text => "");
- }
- }
- sub snmpwalk {
- (my $oid, my $sess, my $var) = snmpsetup();
- $status->configure(-text => "walking: $host $community $oid");
- $top->update();
- while (!$sess->{ErrorStr} && !$stopit) {
- my $val = $sess->getnext($var);
- last if (!defined($var->tag) ||
- $sess->{ErrorStr} ||
- $val eq "ENDOFMIBVIEW" ||
- !is_in_subtree($oid, $var->tag . "." . $var->iid));
- insertvar($var);
- $top->update();
- }
- if ($sess->{ErrorStr}) {
- $status->configure(-text => $sess->{ErrorStr});
- $output->insert('end',"$sess->{ErrorStr} ($sess->{ErrorNum})n");
- } else {
- $status->configure(-text => "");
- }
- stop(1);
- }
- sub snmptable {
- (my $oid, my $sess, my $var) = snmpsetup();
- $status->configure(-text => "collecting data: $host $community $oid");
- $top->update();
- my (%tb, @tags, @index, %tboids);
- while (!$sess->{ErrorStr} && !$stopit) {
- my $val = $sess->getnext($var);
- last if (!defined($var->tag) ||
- $sess->{ErrorStr} ||
- $val eq "ENDOFMIBVIEW" ||
- !is_in_subtree($oid, $var->tag . "." . $var->iid));
- $newoid = "$var->[$SNMP::Varbind::tag_f].$var->[$SNMP::Varbind::iid_f]";
- insertvar($var);
- $top->update();
- $newoid =~ /([^.]+).([0-9.]+)$/;
- if (!grep(/$1/,@tags)) {
- push @tags,$1;
- }
- if (!grep(/$2/,@index)) {
- push @index,$2;
- }
- $tb{$2}{$1} = $var->val;
- # $tboids{$2}{$1} = $var->tag;
- $tboids{$2}{$1} = $newoid;
- }
- initTable($#tags+1);
- for(my $k=0;$k <= $#tags;$k++) {
- $output->put(1,$k+2,$tags[$k]);
- }
- $output->put(1,1,"Index");
- for(my $i=0;$i <= $#index;$i++) {
- $output->put($i+2,1,$index[$i]);
- }
- for(my $i=0;$i <= $#index; $i++) {
- for(my $k=0;$k <= $#tags;$k++) {
- my $mib = $SNMP::MIB{format_oid("$tboids{$index[$i]}{$tags[$k]}",'numeric')};
- if ($mib->{'access'} =~ /(Write|Create)/) {
- $output->put($i+2,$k+2,$output->Button(-fg => $writecolor, -pady => $tmpbd, -padx => $tmpbd, -text => $tb{$index[$i]}{$tags[$k]}, -command => [&snmpsetmaybebegin, $tboids{$index[$i]}{$tags[$k]}, $tb{$index[$i]}{$tags[$k]}], -padx => 0, -pady => 0));
- } else {
- $output->put($i+2,$k+2,$tb{$index[$i]}{$tags[$k]});
- }
- }
- }
- $status->configure(-text => "");
- stop(1);
- }
- sub snmpgraph {
- ($graphoid, $graphsess, my $graphvar) = snmpsetup();
- $top->update();
- %graphtb = ();
- @graphvars = ();
- initCanvas();
- $gcount=0;
- $max=-1;
- $min=2**32-1;
- updateGraph();
- $output->repeat($graphtime*1000, &updateGraph);
- }
- sub updateGraph() {
- $status->configure(-text => "collecting data: $host $community $graphoid");
- my $oid = $graphoid;
- my $tag = SNMP::translateObj($graphoid,0);
- my $var = new SNMP::Varbind([$oid]);
- $graphsess->{ErrorStr} = "";
- while (!$graphsess->{ErrorStr} && !$stopit) {
- my $val = $graphsess->getnext($var);
- if ($#graphvars == -1 && SNMP::translateObj($var->tag) !~ /^$oid/) {
- # if an exact oid, do a get instead.
- $var = new SNMP::Varbind([$oid]);
- $val = $graphsess->get($var);
- }
- if ($graphsess->{ErrorStr} ||
- !defined($var->tag) ||
- SNMP::translateObj($var->tag) !~ /^$oid/) {
- last;
- }
- my $newoid = SNMP::translateObj("$var->[$SNMP::Varbind::tag_f].$var->[$SNMP::Varbind::iid_f]");
- $top->update();
- $newoid =~ /$oid.([0-9.]+)$/;
- if (defined($1)) {
- if (!grep(/$1/,@graphvars)) {
- push @graphvars,$1;
- }
- if ($graphdelta) {
- if ($gcount > 0) {
- $graphtb{$1}[$gcount-1] = $var->val - $prev{$1};
- }
- $prev{$1} = $var->val;
- } else {
- $graphtb{$1}[$gcount] = $var->val;
- }
- $max = $graphtb{$1}[$#{$graphtb{$1}}]
- if ($#{$graphtb{$1}} >= 0 &&
- $graphtb{$1}[$#{$graphtb{$1}}] > $max);
- $min = $graphtb{$1}[$#{$graphtb{$1}}]
- if ($#{$graphtb{$1}} >= 0 &&
- $graphtb{$1}[$#{$graphtb{$1}}] < $min);
- }
- }
- if ($gcount > 1) {
- $output->delete('all');
- my $canvas = $$output{'SubWidget'}{'canvas'};
- my $h=$canvas->cget(-height);
- foreach $i (@graphvars) {
- my @a = ();
- for(my $j=0; $j <= $#{$graphtb{$i}}; $j++) {
- $a[$j*2] = $j;
- $a[$j*2+1] = $h-(($h-3)*($graphtb{$i}[$j]-$min))/($max-$min)-3;
- }
- $output->createLine(@a, -fill => $graphcolors[$i%$#graphcolors]);
- }
- $output->create('text',5, $h-3, -text => "$max");
- $output->create('text',5, 3, -text => "$min");
- }
- $gcount++;
- $status->configure(-text => "sleeping for $graphtime seconds");
- }
- sub addMibOID {
- my $i = shift;
- $i = ".$i" if ($i !~ /^./);
- my $name = SNMP::translateObj($i,1);
- if (defined($name)) {
- $name =~ s/.*.([^.]+)$/$1/;
- } else {
- return;
- }
- $i =~ s/^.//;
- $hlist->add($i, -text => $name);
- }
- sub showInfo {
- my $full = shift;
- $full = ".$full" if ($full !~ /^./);
- my $oid = $full;
- my $tag = $oid;
- if ($tag =~ /^[.0-9]+$/) {
- # strip off index in case there is one
- $tag = SNMP::translateObj("$oid");
- $tag = ".iso.org.dod.internet.private.$tag" if $tag =~ /^enterprises/;
- } else {
- $full = SNMP::translateObj("$oid");
- }
- $tag =~ s/[.0-9]+$//;
- $oid = SNMP::translateObj($tag);
-
- if (!defined($last) || "$last" ne $oid) {
- updateInfo($oid);
- }
- $OID = $full;
- $mibOID->configure(-textvariable => $OID);
- $mibOID->update();
- $last = $oid;
- }
-
- sub showAllChildren {
- my $id = shift;
- $id =~ s/^.//;
- my @pieces = split(/./,$id);
- my ($i, $lastvalid);
- for($i = 0; $i <= $#pieces; $i++) {
- my $a = join(".", @pieces[0..$i]);
- if ($hlist->infoExists($a) && !($hlist->infoChildren($a))) {
- showChildren(join(".", $a));
- }
- if ($hlist->infoExists($a)) {
- $lastvalid = $a;
- } else {
- last;
- }
- }
- $hlist->see($lastvalid);
- $hlist->selectionClear($hlist->selectionGet);
- $hlist->selectionSet($lastvalid);
- }
- sub showChildren {
- $OID = shift;
- $OID =~ s/^.//;
- my $oid = $OID;
- $mibOID->configure(-textvariable => $OID);
- if ($hlist->infoChildren($oid)) {
- my @a = $hlist->infoChildren($oid);
- my $i;
- foreach $i (@a) {
- $hlist->deleteEntry($i);
- }
- } else {
- $oid = ".$oid";
- my $mib = $SNMP::MIB{format_oid($oid,'full')};
- if (defined($mib)) {
- my $children = $$mib{'children'};
- if (ref($children) eq "ARRAY") {
- foreach $i (sort {$$a{'subID'} <=> $$b{'subID'}} @{$children}) {
- addMibOID($$i{'objectID'});
- }
- } else {
- $status->configure(-text => SNMP::translateObj($oid,1) .
- " has no children");
- return;
- }
- }
- }
- $status->configure(-text => "");
- }
- sub updateInfo {
- $OID = shift;
- my $oid = $OID;
- my $mib = $SNMP::MIB{format_oid("$oid",'numeric')};
- if (!defined($mib->{'description'}) || $mib->{'description'} eq "") {
- $oid =~ s/[.0-9]+$//;
- $mib = $SNMP::MIB{format_oid("$oid",'numeric')};
- }
- if (defined($mib)) {
- if ($mib->{'label'} =~ /Table$/) {
- $tablebutton->configure(-state => 'normal');
- } else {
- $tablebutton->configure(-state => 'disabled');
- }
- $mibOID->configure(-text => $mib->{'objectID'});
- $mibTextOID->configure(-text =>
- SNMP::translateObj($mib->{'objectID'},1));
- $descr->delete('0.0','end');
- if (defined($mib->{'description'}) &&
- $mib->{'description'} ne "") {
- my $desc = $mib->{'description'};
- $desc =~ s/n[ t]+/n/g;
- $desc =~ s/^n//;
- $descr->insert('end',$desc);
- }
- for($i=0; $i<= $#displayInfo;$i++) {
- $dpyInfo[$i] = $mib->{$displayInfo[$i]};
- if (ref($dpyInfo[$i]) eq HASH) {
- my %hash = %{$dpyInfo[$i]};
- $dpyInfo[$i] = "";
- foreach $j (sort { $hash{$a} <=> $hash{$b} } keys(%hash)) {
- $dpyInfo[$i] .= "$j = $hash{$j},";
- }
- } elsif (ref($dpyInfo[$i]) eq ARRAY) {
- $dpyInfo[$i] = join(", ", @{$dpyInfo[$i]});
- }
- }
- }
- }
- sub optionalWidget {
- my $num = shift;
- my $menu = shift;
- my $var = shift;
- $menu->checkbutton(-label => $displayInfo[$num],
- -variable => $var,
- -command => [&toggleWidgetShown, $num, $var]);
- }
- sub createRow {
- my $i = shift;
- if (!$displayLabels[$i]) {
- $displayLabels[$i] = $dispFrame->Label(-pady => $tmpbd, -padx => $tmpbd,
- -text => $displayInfo[$i],
- -anchor => 'w',
- -borderwidth => $tmpbd);
- }
- if (!$displayEntries[$i]) {
- $displayEntries[$i] = $dispFrame->Entry(-textvariable => $dpyInfo[$i],
- -width => 40, -relief => 'flat',
- -borderwidth => $tmpbd);
- }
- $displayLabels[$i]->grid(-ipady => $tmpbd, -ipadx => $tmpbd,
- -column => ($i%2)*2, -row => int($i/2),
- -sticky => 'w');
- $dpyInfo[$i] = "" if (!defined($dpyInfo[$i]));
- $displayEntries[$i]->grid(-ipady => $tmpbd, -ipadx => $tmpbd, -column => ($i%2)*2 + 1, -row => int($i/2), -sticky => 'w');
- }
- sub toggleWidgetShown {
- my ($num, $var) = @_;
- if ($$var) {
- createRow($num);
- } else {
- $displayLabels[$num]->gridForget();
- $displayEntries[$num]->gridForget()
- }
- # my @widgets = $dispFrame->gridSlaves(-row => $num);
- }
- sub loadNewMibFile {
- my $sel = $top->FileSelect();
- my $file = $sel->Show();
- if (defined($file)) {
- SNMP::addMibFiles($file);
- showChildren("1.3.6.1");
- showChildren("1.3.6.1");
- }
- }
- sub loadNewMibModule {
- my $tmptop = MainWindow->new();
- my $var = "";
- $tmptop->Label(-pady => $tmpbd, -padx => $tmpbd, -text => "Enter a SNMP MIB module name")
- ->pack(-side => 'top');
- my $e = $tmptop->Entry(-textvariable => $var);
- $e->pack(-side => 'top');
- $e->bind('<Return>',[&loadIt,$var,$tmptop]);
- my $f = $tmptop->Frame();
- $f->pack(-side => 'top');
- $f->Button(-pady => $tmpbd, -padx => $tmpbd, -text => 'Ok', -command => [&loadIt,"",$var,$tmptop])
- ->pack(-side => 'left');
- $f->Button(-pady => $tmpbd, -padx => $tmpbd, -text => 'Cancel', -command => [sub { my $wid = shift;
- $wid->destroy(); },
- $tmptop])
- ->pack(-side => 'left');
- }
- sub loadIt {
- my $var = shift;
- if ($var ne "") {
- my $ret = SNMP::loadModules($var);
- if ($ret) {
- showChildren("1.3.6.1");
- showChildren("1.3.6.1");
- return 1;
- } else {
- $status->configure(-text => "Failed reading module $var");
- return 0;
- }
- }
- return 0;
- }
- sub stop {
- $stopit = shift;
- if ($stopit) {
- $stopBut->configure(-state => 'disabled');
- } else {
- $stopBut->configure(-state => 'normal');
- }
- }
- sub entryBox {
- my $title = shift;
- my $text = shift;
- my $var = shift;
- my $callback = shift;
- my $top = MainWindow->new();
- my $newvar = $$var if defined($var);
- $top->title($title);
- my $f = $top->Frame();
- $f->pack(-side => 'top');
- $f->Label(-pady => $tmpbd, -padx => $tmpbd,
- -text => $text)->pack(-side => 'left');
- my $e = $f->Entry(-textvariable => $newvar);
- $e->pack(-side => 'left');
- $f = $top->Frame();
- $f->pack(-side => 'bottom');
- my $b = $f->Button(-pady => $tmpbd, -padx => $tmpbd, -text => 'Ok',
- -command => [sub { my $w = shift;
- my $v1 = shift;
- my $v2 = shift;
- my $call = shift;
- my $ret = 1;
- $$v1 = $$v2 if defined($v1);
- $ret = $call->($$v2)
- if defined($call);
- $w->destroy() if ($ret);}, $top, $var,
- $newvar, $callback]);
- $b->pack(-side => 'left');
- $e->bind('<Return>',[$b,'invoke']);
- $b = $f->Button(-pady => $tmpbd, -padx => $tmpbd,
- -text => 'Cancel', -command => [sub { my $w = shift;
- $w->destroy();}, $top
- ]);
- $b->pack(-side => 'right');
- $e->bind('<Escape>',[$b,'invoke']);
-
- }
- sub findANode {
- my $val = shift;
- my $tag = SNMP::translateObj($val);
- if ($tag) {
- showAllChildren($tag);
- return 1;
- } else {
- $top->Dialog(-text => "$val not found")->Show();
- return 0;
- }
- }
- sub test_version {
- my ($gt, $major, $minor, $sub) = @_;
- $SNMP::VERSION =~ /(d).(d).(d)/;
- if ($gt) {
- if ($1 > $major || ($1 == $major && $2 > $minor) ||
- ($1 == $major && $2 == $minor && $3 >= $sub)) {
- return 1;
- }
- } else {
- if ($1 < $major || ($1 == $major && $2 < $minor) || ($1 == $major && $2 == $minor && $3 < $sub)) {
- return 1;
- }
- }
- return 0;
- }
- sub save_options {
- my $umask = umask();
- umask 0077; # make sure its not readable by the world by default.
- if (!open(O,">$opts{C}")) {
- warn "can't save to $opts{C}n";
- umask $umask;
- return;
- }
- umask $umask;
- print O Data::Dumper->Dump([%session_opts], [qw(*session_opts)]);
- print O Data::Dumper->Dump([%displayInfoStates], [qw(*displayInfoStates)]);
- foreach my $var (@saveoptions) {
- print O Data::Dumper->Dump([$$var], [$var]);
- }
- close(O);
- $status->configure(-text => "saved options to $opts{C}");
- }
- # returns 1 if $oid2 is below $oid1 in the hierarchy
- sub is_in_subtree {
- my ($oid1, $oid2) = @_;
- # get pure numeric
- $oid1 = SNMP::translateObj($oid1) if ($oid1 !~ /^[d.]*$/);
- $oid2 = SNMP::translateObj($oid2) if ($oid2 !~ /^[d.]*$/);
- # has more on it or is exactly the same
- return 1 if ($oid2 =~ /^$oid1./ || $oid2 =~ /^$oid1$/);
- return 0;
- }
- sub format_oid {
- my ($oid, $type) = @_;
- $oid =~ s/.$//;
- $type = $displayoidas if ($type eq "");
- if ($type eq 'numeric') {
- return SNMP::translateObj($oid) if ($oid !~ /^[d.]*$/);
- return $oid;
- } elsif ($type eq 'full') {
- return SNMP::translateObj($oid, 1) if ($oid =~ /^[d.]*$/);
- return SNMP::translateObj(SNMP::translateObj($oid), 1) if ($oid !~ /^./);
- return $oid;
- } elsif ($type eq 'short' || $type eq 'module') {
- $oid = SNMP::translateObj($oid) if ($oid =~ /^[d.]*$/);
- $oid =~ s/.*.([a-zA-Z]w+).(.*)/$1.$2/;
- if ($type eq 'module') {
- $oid = $SNMP::MIB{format_oid($oid,'numeric')}->{'moduleID'} . "::" . $oid;
- }
- return $oid;
- } elsif ($type eq 'module') {
- $oid = SNMP::translateObj($oid) if ($oid =~ /^[d.]*$/);
- $oid =~ s/.*.([a-zA-Z]w+).(.*)/$1.$2/;
- return $oid;
- } else {
- warn 'unknown oid translation type: $type';
- return $oid;
- }
- }
- sub get_oid {
- my ($var, $type) = @_;
- return format_oid($var->tag . "." . $var->iid, $type);
- }