Subj : [fidoperl] tracking @home To : All From : tony summerfelt Date : Wed Nov 08 2000 01:39 pm in my quest for total sarcasm, i decided a few months ago to track @home's downtime and send them a copy when the bill came in. i used the following tcl/tk code. you can compile it as a standalone exe. it runs under win98 and windows 2000 without a problem (i run it as a service under win2k.) it's the gui version, but all you have to do is comment out the tk stuff for a command line version. unfortunately it doesn't seem to run under linux here (suse 6.4). and instead of debugging it i rewrote it using expect (next message). set begin [clock seconds] set start [clock format [clock seconds] -format "%c"] set timetowait 5 set newsession 1 set logname "c:/wave.log" set logid "--" set command "ping members.home.net" set up 0 proc getargs {} { global argc argv logname if {$argc!=1} { logmsg "Using default log file: $logname" after 3000 return } else { logmsg "Using log: $logname" } } proc quit {} { uptime exit } proc uptime {} { global begin start totaldown up newsession justloaded longestdown set uptime [duration 0] if {$up} {set begin [clock seconds]} set end [clock seconds] set elapsed [expr $end-$begin] set totaldown [expr $totaldown + $elapsed] set fb [open "totaldown" "w"] puts $fb $totaldown close $fb if {$elapsed > $longestdown} { set fb [open "longest" "w"] set longestdown $elapsed puts $fb $longestdown close $fb } set firstd [expr ($totaldown / 3600) / 24] set longd [expr ($longestdown / 3600) / 24] set firsth [expr ($totaldown / 3600) % 24] set longh [expr ($longestdown / 3600) % 24] if {$firsth<1} { set firsth "0" } if {$firsth>=1 && $firsth<10} { set firsth "0$firsth" } if {$longh<1} { set longh "0" } if {$longh>=1 && $longh<10} { set longh "0$longh" } set firstm [expr ($totaldown % 3600) / 60] set longm [expr ($longestdown % 3600) / 60] if {$firstm<1} { set firstm "0" } if {$longm<1} { set longm "0" } logmsg "longest downtime -- $longd\d $longh\h $longm\m" logmsg "total downtime -- $firstd\d $firsth\h $firstm\m" } proc duration { int_time } { global timetowait up lappend timeList "" if {[set d [expr ($int_time / 3600) / 24]] > 1} { lappend timeList "$d\d" } else { if {$d<1} { lappend timeList "0d" } } if {[set h [expr ($int_time / 3600) % 24]] > 1} { lappend timeList "$h\h" } else { if {$h<1} { lappend timeList "0h" } } if {[set m [expr ($int_time % 3600) / 60]] > 1} { if {$m<5 && $up==0} {set timetowait 1} if {$m>5 && $up} {set timetowait 5} lappend timeList "$m\m" } else { if {$m<1} { lappend timeList "0m" } } if {[set s [expr ($int_time % 3600) % 60]] > 1} { lappend timeList "$s\s" } else { if {$s<=1} { lappend timeList "0s" } } return [join $timeList] } proc logwindow {} { wm geometry . +265+285 wm title . "tping messages" wm resizable . 0 0 wm minsize . 325 100 frame .logwindow text .logwindow.buffer -yscrollcommand ".logwindow.sb set" -width 55 -height 15 -wrap word -bg black -fg green -takefocus 1 scrollbar .logwindow.sb -command ".logwindow.buffer yview" frame .bf button .bf.exit -text "Exit" -command {quit} button .bf.uptime -text "Uptime" -command {uptime} pack .bf -side bottom pack .bf.uptime -side left -ipadx 67 pack .bf.exit -side right -ipadx 67 pack .logwindow pack .logwindow.sb -side right -fill y pack .logwindow.buffer -side left raise . } proc logmsg {msg} { global logname logid newsession set timestamp [clock format [clock seconds] -format "%d %b %H:%M:%S"] set logfile [open $logname a+] if {$newsession==1} { puts $logfile "\n $timestamp $logid $msg" .logwindow.buffer insert end "\n $timestamp $logid $msg\n" .logwindow.buffer see end; update idle } else { puts $logfile " $timestamp $logid $msg" .logwindow.buffer insert end " $timestamp $logid $msg\n" .logwindow.buffer see end; update idle } close $logfile; set newsession 0; } proc output {pipe} { global up begin timetowait justloaded if [eof $pipe] { catch {close $pipe} return } gets $pipe line set waiting [expr $timetowait * 60000] if {[regexp -nocase {unknown} $line] || [regexp -nocase {failed} $line]} { logmsg "wave is down" set lastcheck [clock format [clock seconds] -format "%c"] set lastcheck [lindex $lastcheck 3] wm title . "wave is down Lastcheck -- $lastcheck" if {$up} {set begin [clock seconds]} set up 0 after $waiting {tping} } elseif {[regexp -nocase {round} $line]} { set lastcheck [clock format [clock seconds] -format "%c"] set lastcheck [lindex $lastcheck 3] wm title . "WAVE IS UP Lastcheck -- $lastcheck" if {$up==0} { logmsg "WAVE IS UP" uptime set up 1 } after $waiting {tping} } } proc tping {} { global command if [catch {open "|$command "} input] { logmsg "$input" } else { fileevent $input readable [list output $input] } } set begin [clock seconds] if {[file exists "totaldown"]} { set fb [open "totaldown" "r"] set totaldown [read $fb] } else {set totaldown 0} if {[file exists "longest"]} { set fb [open "longest" "r"] set longestdown [read $fb] } else {set longestdown 0} logwindow getargs tping -- *---------------------------------------- | |http://www.biosys.net/snowzone | |remove myspleen to email | *----------------------- -------------------------- eGroups Sponsor -------------------------~-~> eGroups eLerts It's Easy. It's Fun. Best of All, it's Free! http://click.egroups.com/1/9698/1/_/318106/_/973716141/ ---------------------------------------------------------------------_-> To Post a message, send it to: fidoperl@eGroups.com To Unsubscribe, send a blank message to: fidoperl-unsubscribe@eGroups.com --- * Origin: madcat <-> internet gateway (2:280/1126.99) .