Re: Any SNMP MIB Browsers?

David Engel (david@elo.ods.com)
Tue, 19 Mar 1996 10:17:30 -0600 (CST)

> David, I know this is old, but did you get any information on this.
> Now that I am looking for one too, i thought I'd ask you first before
> I go looking....

I wound up hacking one together myself. I'm including it below. The
code is pretty ugly and there is only limited error checking, but it
does what we need it to do. Also, the user-interface isn't that great.
Suggestions are welcome.

David

-- 
David Engel                        Optical Data Systems, Inc.
david@ods.com                      1101 E. Arapaho Road
(214) 234-6400                     Richardson, TX  75081

browser: ---cut here--- #!/bin/sh # The next line is executed by /bin/sh, but not Tcl \ exec scwish -f $0 ${1+"$@"}

#tk_bisque

if {[llength $argv] != 2} { puts stderr "usage: $argv0 agent community" exit 1 }

set mibfont "-Adobe-Helvetica-Bold-R-Normal--*-160-*-*-*-*-*-*" set txtfont "-Adobe-Helvetica-Bold-R-Normal--*-160-*-*-*-*-*-*" set butfont "-Adobe-Helvetica-Bold-R-Normal--*-160-*-*-*-*-*-*" set logfont "-Adobe-Helvetica-Bold-R-Normal--*-160-*-*-*-*-*-*"

if {[catch {snmp session -address [lindex $argv 0] \ -community [lindex $argv 1]} s]} { puts stderr $s exit 1 }

proc any_accessible_children { name } { foreach child [mib successor $name] { if {[string compare [mib access $child] not-accessible] != 0} { return 1 } } return 0 }

proc get_accessible_children { name } { set result {} foreach child [mib successor $name] { if {[string compare [mib access $child] not-accessible] != 0} { lappend result $child } } return $result }

frame .mibfr listbox .mibfr.grlist -relief sunken -height 12 -width 35 \ -yscroll ".mibfr.grsb set" -font $mibfont scrollbar .mibfr.grsb -command ".mibfr.grlist yview" pack .mibfr.grlist -side left -fill both pack .mibfr.grsb -side left -fill y -expand yes listbox .mibfr.chlist -relief sunken -height 12 -width 35 \ -yscroll ".mibfr.chsb set" -font $mibfont scrollbar .mibfr.chsb -command ".mibfr.chlist yview" pack .mibfr.chlist -side left -fill both pack .mibfr.chsb -side left -fill y -expand yes pack .mibfr -side top

frame .butfr button .butfr.set -text Set -font $butfont -command do_set pack .butfr.set -side left button .butfr.get -text Get -font $butfont -command do_get pack .butfr.get -side left button .butfr.wfirst -text First -font $butfont -command do_first pack .butfr.wfirst -side left button .butfr.wnext -text Next -font $butfont -command do_next pack .butfr.wnext -side left button .butfr.walk -text Walk -font $butfont -command do_walk pack .butfr.walk -side left button .butfr.cont -text Cont -font $butfont -command do_cont pack .butfr.cont -side left button .butfr.stop -text Stop -font $butfont -command do_stop pack .butfr.stop -side left button .butfr.getnext -text GetNext -font $butfont -command do_getnext pack .butfr.getnext -side left pack .butfr -side top

frame .objfr label .objfr.label -text "ObjectID" -font $txtfont entry .objfr.entry -width 60 -font $txtfont pack .objfr.label -side left pack .objfr.entry -side left -fill x -expand yes pack .objfr -side top

frame .valfr label .valfr.label -text "Value" -font $txtfont entry .valfr.entry -width 60 -font $txtfont pack .valfr.label -side left pack .valfr.entry -side left -fill x -expand yes pack .valfr -side top

frame .logfr text .logfr.text -relief sunken -height 14 -width 74 \ -yscroll ".logfr.sb set" -font $logfont scrollbar .logfr.sb -command ".logfr.text yview" pack .logfr.text -side left pack .logfr.sb -side left -fill y -expand yes pack .logfr -side top

proc set_objectid { name } { set base [.objfr.entry get] set start [string first . $base] .objfr.entry delete 0 end .objfr.entry insert 0 $name if {$start != -1} { .objfr.entry insert end [string range $base $start end] } }

proc show_accessible_children {var} { .mibfr.chlist delete 0 end foreach child [get_accessible_children $var] { .mibfr.chlist insert end $child } set_objectid $var }

set any_log_entries 0 proc add_log_entry {what} { global any_log_entries if {$any_log_entries} { .logfr.text insert end "\n" } { set any_log_entries 1 } .logfr.text insert end $what .logfr.text see end }

proc do_set {} { global s set name [.objfr.entry get] set value [.valfr.entry get] set vb "$name \"$value\"" if {[catch {$s set [list $vb]} vbl]} { bell add_log_entry "$vbl" } { set vb [lindex $vbl 0] set oid [lindex $vb 0] set val [lindex $vb 2] set name [mib name $oid] .objfr.entry delete 0 end .objfr.entry insert 0 $name .valfr.entry delete 0 end .valfr.entry insert 0 $val add_log_entry "$name = $val" } }

proc do_get {} { global s set name [.objfr.entry get] if {[catch {$s get $name} vbl]} { bell add_log_entry "$vbl" } { set vb [lindex $vbl 0] set oid [lindex $vb 0] set val [lindex $vb 2] set name [mib name $oid] .objfr.entry delete 0 end .objfr.entry insert 0 $name .valfr.entry delete 0 end .valfr.entry insert 0 $val add_log_entry "$name = $val" } }

proc do_getnext {} { global s set name [.objfr.entry get] if {[catch {$s getnext $name} vbl]} { bell add_log_entry "$vbl" } { set vb [lindex $vbl 0] set oid [lindex $vb 0] set val [lindex $vb 2] set name [mib name $oid] .objfr.entry delete 0 end .objfr.entry insert 0 $name .valfr.entry delete 0 end .valfr.entry insert 0 $val add_log_entry "$name = $val" } }

proc do_first {} { global s set name [.objfr.entry get] set start [string first . $name] if {$start != -1} { set name [string range $name 0 [expr $start-1]] } set base1 $name if {[catch {$s getnext $name} vbl]} { bell add_log_entry "$vbl" } { set vb [lindex $vbl 0] set oid [lindex $vb 0] set val [lindex $vb 2] set name [mib name $oid] set start [string first . $name] set base2 $name if {$start != -1} { set base2 [string range $name 0 [expr $start-1]] } if {[string compare $base1 $base2] == 0} { .objfr.entry delete 0 end .objfr.entry insert 0 $name .valfr.entry delete 0 end .valfr.entry insert 0 $val add_log_entry "$name = $val" } { add_log_entry "no more instances" } } }

proc do_next {} { global s set name [.objfr.entry get] set start [string first . $name] set base1 $name if {$start != -1} { set base1 [string range $name 0 [expr $start-1]] } if {[catch {$s getnext $name} vbl]} { bell add_log_entry "$vbl" } { set vb [lindex $vbl 0] set oid [lindex $vb 0] set val [lindex $vb 2] set name [mib name $oid] set start [string first . $name] set base2 $name if {$start != -1} { set base2 [string range $name 0 [expr $start-1]] } if {[string compare $base1 $base2] == 0} { .objfr.entry delete 0 end .objfr.entry insert 0 $name .valfr.entry delete 0 end .valfr.entry insert 0 $val add_log_entry "$name = $val" } { add_log_entry "no more instances" } } }

proc do_stop {} { global stop_walk set stop_walk 1 }

proc walk_it {base1 name} { global s stop_walk set stop_walk 0 set any_found 0 while {$stop_walk == 0} { if {[catch {$s getnext $name} vbl]} { bell add_log_entry "$vbl" set stop_walk 1 } { set vb [lindex $vbl 0] set oid [lindex $vb 0] set val [lindex $vb 2] set name [mib name $oid] set start [string first . $name] set base2 $name if {$start != -1} { set base2 [string range $name 0 [expr $start-1]] } if {[string compare $base1 $base2] == 0} { set any_found 1 .objfr.entry delete 0 end .objfr.entry insert 0 $name .valfr.entry delete 0 end .valfr.entry insert 0 $val add_log_entry "$name = $val" update } { if {$any_found == 0} { add_log_entry "no more instances" } set stop_walk 1 } } } }

proc do_walk {} { set name [.objfr.entry get] set start [string first . $name] if {$start == -1} { set base $name } { set base [string range $name 0 [expr $start-1]] } walk_it $base $base }

proc do_cont {} { set name [.objfr.entry get] set start [string first . $name] if {$start == -1} { set base $name } { set base [string range $name 0 [expr $start-1]] } walk_it $base $name }

bind all <Control-c> {destroy .}

bind .mibfr.grlist <Double-Button-1> {show_accessible_children \ [.mibfr.grlist get [.mibfr.grlist curselection]]} bind .mibfr.chlist <Double-Button-1> {set_objectid \ [.mibfr.chlist get [.mibfr.chlist curselection]]}

show_accessible_children system set_objectid sysDescr

update

mib walk var iso { if {[any_accessible_children $var]} { .mibfr.grlist insert end $var } }

--cut here--