#!/local/bin/wishnm -f

set dev ""
canvas .c 
set c .c

set color(0) "#00ff00"
set color(1) "#00c000"
set color(2) "#60c000"
set color(3) "#c0c000"
set color(4) "#c06000"
set color(5) "#c00000"
set color(6) "#ff0000"
set color(7) "#ffff00"

set p0 [snmp mkpdu {
    system.sysUpTime.0
    }]

proc sysUptime {dev args} {
    global sess pdu cnt
    #puts stdout "<< <$dev> <$args> <$sess> <$pdu>"
    set cnt($dev) 0
    }

proc action {dev args} {
    global sess pdu cnt color
    #puts stdout "<< <$args> <$sess> <$pdu>"
    if {$cnt($dev) == 6} {
	set cnt($dev) 7
    } else {
	set cnt($dev) 6
    }
    .c itemconfigure G_$dev -background $color($cnt($dev))
}

proc poll {dev} {
    global sn p0 cnt color
    #puts stdout "poll $dev"
    if {$sn($dev) == ""} {
        set z [catch "snmp open $dev" y]
        if {$z == 0} { 
            #puts stdout "** $dev"
            set sn($dev) $y 
            set cnt($dev) 0
            snmp callback $sn($dev) pdu sess "sysUptime $dev"
          } else {
            .c itemconfigure G_$dev -background blue
            }
        }
    if {$sn($dev) != ""} { 
        #puts stdout ">> $dev"
        if {$cnt($dev) > 5 } {
            action $dev
	} else {
	    .c itemconfigure G_$dev -background $color($cnt($dev))
	    incr cnt($dev)
	}
        snmp send $sn($dev) -P get $p0
    }
    after 5000 poll $dev
}

proc mean {args} {
	set m 0
	set n 0
	foreach i $args {
		incr m $i
		incr n
	}
	return [expr $m/$n]
}

proc CreateGlyph {name glyph x y} {
	global sn dev
	lappend dev $name
	.c create bitmap $x $y \
		-bitmap @${glyph}.bmp -tags "T_$name G_$name"

	set l [.c bbox T_$name]
	.c create text [mean [lindex $l 0] [lindex $l 2]] [lindex $l 3] \
		-text "$name" -anchor n -tags "T_$name L_$name"
	set sn($name) ""
	poll $name
}

proc Line {from to} {
	.c lower [eval .c create line [.c coords G_$from] [.c coords G_$to] \
		-width 2 -fill #ff8000
	]
}

set x0 35
set dx 70
set y0 35
set dy 50
set nx 10
set ix 0
set iy 0

proc NextPos {} {
    global x0 dx y0 dy nx ix iy
    set r "[expr $ix*$dx+$x0] [expr $iy*$dy+$y0]"
    incr ix
    if {$ix == $nx} {
	set ix 0
	incr iy
    }
    return $r
}


foreach i { fls-gw1 fls-gw2 
	} { eval CreateGlyph $i router [NextPos] }

foreach i { nm-hx nm-hx1 nm-sa nm-sc nm-e01 nm-e04 nm-e07 nm-e10 nm-e10a
    nm-b0s nm-b03 nm-a02 nm-a05 nm-d nm-g01 nm-spt 
	} { eval CreateGlyph $i conc [NextPos] }

foreach i { term1-hx term2-hx term1-sa term1-sc term1-e04 term1-e07 term1-b0s
    term1-b03 term1-g01 term2-g01 
	} { eval CreateGlyph $i term-srv [NextPos] }

foreach i { elrond elros frodo samwise data gimli smaug thorin thrain 
	gollum
	} { eval CreateGlyph $i file-srv [NextPos] }


.c configure -width [expr $x0*2+$nx*$dx-$dx]
.c configure -height [expr $y0*2+$iy*$dy]

#Line fls-gw1 nm-hx
#Line fls-gw1 nm-hx1

#.c create bitmap 50 50 -bitmap @router.bmp -background "#00ff00"
#.c create bitmap 150 50 -bitmap @conc.bmp -background "#ff0000"

pack append . \
	.c { fill expand }

set c .c
#after 5000 { .c postscript -file tmp.ps -colormode color exit 0 }

wm minsize . 10 10

foreach i $dev {
    set jobs($i) ""
    if {[snmp get $sn($i) -v -mf "" system.sysObjectID.0 d]} {
	continue;
    }
    set e [split $d .]
    if {[lrange $e 0 7] == "{} 1 3 6 1 4 1 45"} {
	    lappend jobs($i) {Synoptics/_syn3000_show_conf}
    }
    puts stdout "$i $d"
    menu .pop_$i
    foreach j $jobs($i) {
	.pop_$i add command -label $j \
	    -command ".pop_$i unpost ; launch $i $j"
    }
    bind .pop_$i <Leave> ".pop_$i unpost"
}

proc launch {host pgm} {
    global sn
    set wtop [string tolower .${pgm}/${host}]
    set sdsc $sn($host)
    source /local/lib/tclnm/tools/$pgm
    }

proc post_for {host x y} {
	.pop_$host post [expr $x-1] [expr $y-1]
}

foreach i $dev { .c bind G_$i <1> "post_for $i %X %Y" }
