#!/usr/local/bin/tclsh
global env gv

if {![info exists env(ECLIPSE)]} {
	if {[file exists $env(HOME)/ECLIPSE]} {
		set env(ECLIPSE) $env(HOME)/ECLIPSE
	} elseif {[file exists /opt/ECLIPSE]} {
		set env(ECLIPSE) /opt/ECLIPSE
	} elseif {[file exists /apps/ECLIPSE]} {
		set env(ECLIPSE) /apps/ECLIPSE
	} elseif {[file exists /usr/local/ECLIPSE]} {
		set env(ECLIPSE) /usr/local/ECLIPSE
	} else {
		puts stdout "Please define the ECLIPSE environment variable"
		exit 1
	}
}

if {[file exists /tmp/eclipse_web.pid]} {
	set fp [open /tmp/eclipse_web.pid r]
	set pid [read -nonewline $fp]
	close $fp
	regsub -all {[^0-9]} $pid {} pid
	if {$pid!=""} {
		catch {exec ps ax$pid} junk
		if {[regexp {eclipse_web} $junk]} {
			puts stdout "already running...pid=$pid"
			exit 0
		}
	}
}

# write the lock file
set fp [open /tmp/eclipse_web.pid w]
puts $fp [pid]
close $fp

############################################################################
#	Procedures
############################################################################

proc LoadHosts { } {
	global env gv

	if {![file exists $env(ECLIPSE)/etc/hosts]} {
		puts stdout "Hosts file $env(ECLIPSE)/etc/hosts not found"
		exit 1
	}
	set fp [open $env(ECLIPSE)/etc/hosts r]
	while {[gets $fp line]>=0} {
		set line [string trim $line]
		if {[string index $line 0]=="#"} {continue}
		regsub -all {[ 	]+} $line { } line
		set fields [split [string trim $line]]
		if {[llength $fields]<2} {continue}
		set gv(host:[lindex $fields 0]) [lindex $fields 1]
	}
	close $fp
}


##########################################################################
#	Main Program
##########################################################################

set gv(localhost) [string tolower [info hostname]]
set gv(localhost.short) [lindex [split $gv(localhost) "."] 0]

# maxkeep controls the maximum number of log files retained per host
set gv(maxkeep) 12

#
#       Default the stuff that must be in the server file
#
set gv(servers) {}

set serverfile [lindex $argv 0]
if {"x$serverfile"!="x" && [file exists $serverfile]} {
	source $serverfile
} elseif {[file exists $env(ECLIPSE)/etc/server.$gv(localhost)]} {
	source $env(ECLIPSE)/etc/server.$gv(localhost)
} elseif {[file exists $env(ECLIPSE)/etc/server.$gv(localhost.short)]} {
	source $env(ECLIPSE)/etc/server.$gv(localhost.short)
} elseif {[file exists $env(ECLIPSE)/etc/server]} {
	source $env(ECLIPSE)/etc/server
}

if {![file exists $env(ECLIPSE)/logs]} {
	puts stdout "Directory $env(ECLIPSE)/logs is missing"
	exit 1
}
if {![file exists $env(ECLIPSE)/www]} {
	puts stdout "Directory $env(ECLIPSE)/www is missing"
	exit 1
}

#
#	Get the list of hosts that have reported
#
LoadHosts

set dirs [lsort [glob -nocomplain $env(ECLIPSE)/logs/*]]
if {[llength $dirs]<1} {
	catch {exec rm /tmp/eclipse_web.pid} junk
	exit 0
}


set maxlevel 0
set cnt 0
foreach dir $dirs {
	set hostname [file tail $dir]
	set plainhost [lindex [split $hostname "."] 0]
	puts stdout "...processing $hostname"

	# age off the old reports
	set files [lsort [glob -nocomplain $dir/*]]
	if {[llength $files]>$gv(maxkeep)} {
		set i [expr [llength $files] - $gv(maxkeep)]
		catch {eval exec rm [lrange $files 0 $i]} junk
	}

	set files [lsort [glob -nocomplain $dir/*]]
	if {[llength $files]<1} {continue}

	set file [lindex $files end]
	set age [expr [clock seconds] - [file mtime $file]]

	foreach name [array names gv stats:*] {unset gv($name)}

	foreach file $files {
		set age [expr [clock seconds] - [file mtime $file]]
		set fp [open $file r]
		set logdata [read -nonewline $fp]
		close $fp
		set logdata [split $logdata "\n"]
		set fieldlist {}
		foreach line $logdata {
			if {[llength $line]<6} {continue}
			set host [lindex $line 0]
			set timestamp [lindex $line 1]
			set alarm [string toupper [lindex $line 2]]
			set label [lindex $line 3]
			set command [lindex $line 4]
			set result [lindex $line 5]
			set gv(stats:$command:$timestamp) $line
			lappend fieldlist $command
		}
	}

	set flag false
	set pagelevel 0
	set button "<IMG SRC=gifs/green.gif border=0 alt=green>"

	set gv(page:header) ""
	if {$age>600} {
		set temp $age
		set days [expr $temp / 86400]
		set temp [expr $temp - $days * 86400]
		set hours [expr $temp / 3600]
		set temp [expr $temp - $hours * 3600]
		set minutes [expr $temp / 60]
		set temp ""
		if {$age>=86400} { append temp "$days days, " }
		if {$age>=3600} { append temp "$hours hours, and " }
		append temp "$minutes minutes"

		append gv(page:header) "<P><B>WARNING : No response from $hostname for $temp</B><P>\n"
		set flag true
		if {$pagelevel<5} {set pagelevel 5}
		set button "<IMG SRC=gifs/red.gif border=0 alt=red>"
		set output "<TR>"
		append output "<TD><A HREF=$hostname.htm>$hostname</A></TD>"
		append output "<TD><A HREF=$hostname.htm>$button</A></TD>"
		append output "<TD><A HREF=$hostname.htm>No response for $temp</A></TD>"
		append output "<TD><A HREF=$hostname.htm>WARNING</A></TD>"
		append output "</TR>"
		set gv(table:$hostname:$cnt) $output
		set output "<TR>"
		append output "<TD><A HREF=$hostname.all.htm>$hostname</A></TD>"
		append output "<TD><A HREF=$hostname.all.htm>$button</A></TD>"
		append output "<TD><A HREF=$hostname.all.htm>No response for $temp</A></TD>"
		append output "<TD><A HREF=$hostname.all.htm>WARNING</A></TD>"
		append output "</TR>"
		set gv(fulltable:$hostname:$cnt) $output
		incr cnt
	}

	append gv(page:header) "<TABLE BORDER=0>"
	append gv(page:header) "<TR>"
	append gv(page:header) "	<TD><IMG SRC=gifs/green.gif ALT=green>"
	append gv(page:header) "		<B><I>OK</I></B></TD>"
	append gv(page:header) "	<TD><IMG SRC=gifs/yellow.gif ALT=yellow>"
	append gv(page:header) "		<B><I>Warning</I></B></TD>"
	append gv(page:header) "	<TD><IMG SRC=gifs/red.gif ALT=red>"
	append gv(page:header) "		<B><I>Problem</I></B></TD>"
	append gv(page:header) "</TR>"
	append gv(page:header) "</TABLE>"

	append gv(page:header) "<TABLE BORDER=3>\n"
	append gv(page:header) "<TR>"
	append gv(page:header) "<TD>Description</TD>\n"
	append gv(page:header) "<TD>Alarm</TD>\n"
	append gv(page:header) "<TD>Value</TD>\n"
	append gv(page:header) "<TD><IMG SRC=gifs/green.gif border=0 alt=green></TD>\n"
	append gv(page:header) "<TD><IMG SRC=gifs/yellow.gif border=0 alt=yellow></TD>\n"
	append gv(page:header) "<TD><IMG SRC=gifs/red.gif border=0 alt=red></TD>\n"
	append gv(page:header) "<TD>Timestamp</TD>"
	append gv(page:header) "</TR>\n"

	set gv(page:table) ""
	set gv(page:alltable) ""

	#
	#	Open up the history file.  Eventually this should produce
	#	a graphic instead.
	#
	set fphist [open $env(ECLIPSE)/www/$hostname.hist.htm w]
	puts $fphist "<HTML>"
	puts $fphist "<HEAD>"
	puts $fphist "<TITLE>History for $hostname</TITLE>"
	puts $fphist "</HEAD>"
	puts $fphist "<BODY>"
	puts $fphist "<H1>History for $hostname<H1>"
	foreach field $fieldlist {
		set names [lsort -decreasing [array names gv stats:$field:*]]
		if {[llength $names]<1} {
puts stdout "host $hostname, field=$field, fieldlist=$fieldlist, names=$names"
			continue
		}
		set latest [lindex $names 0]
		puts $fphist "<H2>$field</H2>"
		puts $fphist "<PRE>"
		foreach name $names {
			set line $gv($name)
			set timestamp [lindex $line 1]
			set alarm [string toupper [lindex $line 2]]
			set result [lindex $line 5]
			puts $fphist "[clock format $timestamp -format "%H:%M %d %b %Y"]	$alarm	$result"
		}
		puts $fphist "</PRE>"

		set line $gv($latest)
		set host [lindex $line 0]
		set timestamp [lindex $line 1]
		set alarm [string toupper [lindex $line 2]]
		set label [lindex $line 3]
		set command [lindex $line 4]
		set result [lindex $line 5]
		set helpurl [lindex $line 6]
		set greenlimit ""
		set yellowlimit ""
		set redlimit ""
		foreach limit [lrange $line 7 end] {
			if {[lindex $limit 0]=="green"} {
				set greenlimit "[lindex $limit 1] [lindex $limit 2]"
			} elseif {[lindex $limit 0]=="yellow"} {
				set yellowlimit "[lindex $limit 1] [lindex $limit 2]"
			} elseif {[lindex $limit 0]=="red"} {
				set redlimit "[lindex $limit 1] [lindex $limit 2]"
			}
		}
		if {$alarm=="GREEN"} {
			set button "<IMG SRC=gifs/green.gif border=0 alt=green>"
		} elseif {$alarm=="ERROR"} {
			set button "<IMG SRC=gifs/purple.gif border=0 alt=purple>"
			if {$pagelevel<1} {set pagelevel 1}
		} elseif {$alarm=="YELLOW"} {
			set button "<IMG SRC=gifs/yellow.gif border=0 alt=yellow>"
			if {$pagelevel<4} {set pagelevel 4}
		} elseif {$alarm=="RED"} {
			set button "<IMG SRC=gifs/red.gif border=0 alt=red>"
			if {$pagelevel<5} {set pagelevel 5}
		} else {
			if {$pagelevel<2} {set pagelevel 2}
			set button "<IMG SRC=gifs/blue.gif border=0 alt=blue>"
		}

		set output "<TR>"
		if {[string index $helpurl 0]=="#"} {
			if {[file exists $env(ECLIPSE)/www/host/$hostname.htm]} {
				set newlabel "<A HREF=host/$hostname.htm$helpurl>$label</A>"
			} elseif {[file exists $env(ECLIPSE)/www/host/$plainhost.htm]} {
				set newlabel "<A HREF=host/$plainhost.htm$helpurl>$label</A>"
			} else {
				set newlabel "<A HREF=info/standard.htm$helpurl>$label</A>"
			}
		} else {
			set newlabel "<A HREF=$helpurl>$label</A>"
		}
		append output "<TD>$newlabel</TD>"
		append output "<TD>$button</TD>"
		append output "<TD>$result</TD>"
		append output "<TD>$greenlimit</TD>"
		append output "<TD>$yellowlimit</TD>"
		append output "<TD>$redlimit</TD>"
		append output "<TD>[clock format $timestamp -format {%H:%M:%S %d-%b-%Y}]</TD>"
		append output "</TR>"
		append gv(page:alltable) $output

		if {$alarm!="GREEN"} {
			append gv(page:table) $output
			set flag true
			set output "<TR>"
			append output "<TD><A HREF=$hostname.htm>$hostname</A></TD>"
			append output "<TD><A HREF=$hostname.htm>$button</A></TD>"
			append output "<TD>$newlabel</TD>"
			append output "<TD>$result</TD>"
			append output "</TR>"
			set gv(table:$hostname:$cnt) $output
			set output "<TR>"
			append output "<TD><A HREF=$hostname.all.htm>$hostname</A></TD>"
			append output "<TD><A HREF=$hostname.all.htm>$button</A></TD>"
			append output "<TD>$newlabel</TD>"
			append output "<TD>$result</TD>"
			append output "</TR>"
			set gv(fulltable:$hostname:$cnt) $output
			incr cnt
		}
	}
	puts $fphist "</BODY>"
	puts $fphist "</HTML>"
	close $fphist

	if {[string length $gv(page:alltable)]<1} {
		set gv(page:alltable) "<TR><TD></TD><TD>Host is not configured</TD></TR>"
	}
	if {[string length $gv(page:table)]<1} {
		set gv(page:table) "<TR><TD><IMG SRC=gifs/green.gif border=0 alt=green></TD><TD>No reported problems</TD></TR>"
	}
	set gv(page:trailer) ""
	append gv(page:trailer) "</TABLE>\n"
	append gv(page:trailer) "</CENTER>\n"
	append gv(page:trailer) "</BODY>\n"
	append gv(page:trailer) "</HTML>\n"

	if {$flag=="false"} {
		set output "<TR>"
		append output "<TD><A HREF=$hostname.htm>$hostname</A></TD>"
		append output "<TD><A HREF=$hostname.htm>$button</A></TD>"
		append output "<TD><A HREF=$hostname.htm>All OK</A></TD>"
		append output "<TD><A HREF=$hostname.htm>OK</A></TD>"
		append output "</TR>"
		set gv(tableall:$hostname:$cnt) $output
		set output "<TR>"
		append output "<TD><A HREF=$hostname.all.htm>$hostname</A></TD>"
		append output "<TD><A HREF=$hostname.all.htm>$button</A></TD>"
		append output "<TD><A HREF=$hostname.all.htm>All OK</A></TD>"
		append output "<TD><A HREF=$hostname.all.htm>OK</A></TD>"
		append output "</TR>"
		set gv(fulltableall:$hostname:$cnt) $output
		incr cnt
	}

	if {$pagelevel==5} {
		set bgfile gifs/bkg-red.gif
	} elseif {$pagelevel==4} {
		set bgfile gifs/bkg-yellow.gif
	} else {
		set bgfile gifs/bkg-purple.gif
	}
	if {$pagelevel>$maxlevel} {set maxlevel $pagelevel}

	set fp [open $env(ECLIPSE)/www/$hostname.htm w]
	puts $fp "<HTML>"
	puts $fp "<HEAD>"
	puts $fp "<META HTTP-EQUIV=REFRESH CONTENT=60>"
	puts $fp "<META HTTP-EQUIV=EXPIRES CONTENT=\"[clock format [clock seconds]]\">"
	puts $fp "<TITLE>ECLIPSE Problem Report for $hostname</TITLE>"
	puts $fp "</HEAD>"
	puts $fp "<BODY BACKGROUND=$bgfile TEXT=#FFFFFF LINK=#00FFAA VLINK=#FFFF44>"
	puts $fp "<CENTER>"
	puts $fp "<H2>ECLIPSE Problem Report for $hostname</H2>"
	puts $fp "<A HREF=normal.htm>Back to Server Screen</A><BR>"
	puts $fp "<A HREF=info/standard.htm>Standard Host Info</A><BR>"
	if {[file exists $env(ECLIPSE)/www/host/$hostname.htm]} {
		puts $fp "<A HREF=host/$hostname.htm>Info for $hostname</A><BR>"
	} elseif {[file exists $env(ECLIPSE)/www/host/$plainhost.htm]} {
		puts $fp "<A HREF=host/$plainhost.htm>Info for $plainhost</A><BR>"
	}
	puts $fp "<A HREF=telnet://$hostname>Telnet to $hostname</A><BR>"
	puts $fp "<A HREF=$hostname.hist.htm>View Complete History</A><BR>"
	puts $fp "<A HREF=$hostname.all.htm>View All Reports</A>"
	puts $fp "<P><B>Updated : [clock format [clock seconds] -format {%H:%M:%S %d-%b-%Y}]</B>"
	puts $fp $gv(page:header)
	puts $fp $gv(page:table)
	puts $fp $gv(page:trailer)
	close $fp

	set fp [open $env(ECLIPSE)/www/$hostname.all.htm w]
	puts $fp "<HTML>"
	puts $fp "<HEAD>"
	puts $fp "<META HTTP-EQUIV=REFRESH CONTENT=60>"
	puts $fp "<META HTTP-EQUIV=EXPIRES CONTENT=\"[clock format [clock seconds]]\">"
	puts $fp "<TITLE>ECLIPSE Problem Report for $hostname</TITLE>"
	puts $fp "</HEAD>"
	puts $fp "<BODY BACKGROUND=$bgfile TEXT=#FFFFFF LINK=#00FFAA VLINK=#FFFF44>"
	puts $fp "<CENTER>"
	puts $fp "<H2>ECLIPSE Problem Report for $hostname</H2>"
	puts $fp "<A HREF=full.htm>Back to Server Screen</A><BR>"
	puts $fp "<A HREF=info/standard.htm>Standard Host Info</A><BR>"
	if {[file exists $env(ECLIPSE)/www/host/$hostname.htm]} {
		puts $fp "<A HREF=host/$hostname.htm>Info for $hostname</A><BR>"
	} elseif {[file exists $env(ECLIPSE)/www/host/$plainhost.htm]} {
		puts $fp "<A HREF=host/$plainhost.htm>Info for $plainhost</A><BR>"
	}
	puts $fp "<A HREF=telnet://$hostname>Telnet to $hostname</A><BR>"
	puts $fp "<A HREF=$hostname.hist.htm>View Complete History</A><BR>"
	puts $fp "<A HREF=$hostname.htm>View Problem Reports Only</A>"
	puts $fp "<P><B>Updated : [clock format [clock seconds] -format {%H:%M:%S %d-%b-%Y}]</B>"
	puts $fp $gv(page:header)
	puts $fp $gv(page:alltable)
	puts $fp $gv(page:trailer)
	close $fp
}

if {$maxlevel==5} {
	set bgfile gifs/bkg-red.gif
} elseif {$maxlevel==4} {
	set bgfile gifs/bkg-yellow.gif
} else {
	set bgfile gifs/bkg-purple.gif
}

#
#	Write the index file (frames)
#
set fp [open $env(ECLIPSE)/www/index.htm w]
puts $fp "<HTML>"
puts $fp "<HEAD>"
puts $fp "<TITLE>ECLIPSE Host Monitor</TITLE>"
puts $fp "</HEAD>"
puts $fp "<FRAMESET COLS=\"220,*\">"
puts $fp "	<FRAME NAME=links SRC=links.htm>"
puts $fp "	<FRAME NAME=main SRC=normal.htm>"
puts $fp "</FRAMESET>"
puts $fp "</HTML>"
close $fp

#
#       Write the links file
#
set fp [open $env(ECLIPSE)/www/links.htm w]
puts $fp "<HTML>"
puts $fp "<HEAD>"
puts $fp "<TITLE>Links page</TITLE>"
puts $fp "</HEAD>"
puts $fp "<BODY BGCOLOR=#000000 TEXT=#FFFFFF LINK=#00FFAA VLINK=#FFFF44>"
puts $fp "<CENTER>"
puts $fp "<H1>ECLIPSE</H1>"
puts $fp "<IMG SRC=gifs/eclipse.gif ALT=ECLIPSE BORDER=0>"
puts $fp "</CENTER>"
puts $fp "<A TARGET=main HREF=info/help.htm>Eclipse Help</A><BR>"
puts $fp "<A TARGET=main HREF=info/standard.htm>Standard Host Info</A><BR>"
puts $fp "<BR>"
puts $fp "<A TARGET=main HREF=normal.htm>View Problems Only</A><BR>"
puts $fp "<A TARGET=main HREF=full.htm>View All Clients</A><BR>"
puts $fp "<BR>"
if {[llength $gv(servers)]>0} {
	puts $fp "<B>Alternate servers :</B>"
	foreach server $gv(servers) {
		set name [lindex $server 0]
		set link [lindex $server 1]
		puts $fp "<A TARGET=_top HREF=$link>$name</A><BR>"
	}
	puts $fp "<BR>"
}
puts $fp "</BODY>"
puts $fp "</HTML>"
close $fp

#
#	Write the Normal view
#
set fp [open $env(ECLIPSE)/www/normal.htm w]
puts $fp "<HTML>"
puts $fp "<HEAD>"
puts $fp "<META HTTP-EQUIV=REFRESH CONTENT=60>"
puts $fp "<META HTTP-EQUIV=EXPIRES CONTENT=\"[clock format [clock seconds]]\">"
puts $fp "<TITLE>ECLIPSE Server [info hostname]</TITLE>"
puts $fp "</HEAD>"
puts $fp "<BODY BACKGROUND=$bgfile TEXT=#FFFFFF LINK=#00FFAA VLINK=#FFFF44>"
puts $fp "<CENTER>"
puts $fp "<H1>ECLIPSE Server [info hostname]</H1>"
puts $fp "<B>Updated : [clock format [clock seconds] -format {%H:%M:%S %d-%b-%Y}]</B><BR>"

if {[llength [array names gv table:*]]>0} {
	puts $fp "<P><B><I>Clients with problems :</I></B>"
	puts $fp "<TABLE BORDER=0>"
	puts $fp "<TR>"
	puts $fp "	<TD><IMG SRC=gifs/green.gif ALT=green>"
	puts $fp "		<B><I>OK</I></B></TD>"
	puts $fp "	<TD><IMG SRC=gifs/yellow.gif ALT=yellow>"
	puts $fp "		<B><I>Warning</I></B></TD>"
	puts $fp "	<TD><IMG SRC=gifs/red.gif ALT=red>"
	puts $fp "		<B><I>Problem</I></B></TD>"
	puts $fp "</TR>"
	puts $fp "</TABLE>"
	puts $fp "<TABLE BORDER=3>"
	puts $fp "<TR><TD>Hostname</TD><TD>Alarm</TD><TD>Description</TD><TD>Value</TD></TR>"
	foreach name [lsort [array names gv table:*]] { puts $fp $gv($name) }
	puts $fp "</TABLE>"
} else {
	puts $fp "<H2>All clients report OK</H2>"
}

puts $fp "</CENTER>"
puts $fp "</BODY>"
puts $fp "</HTML>"
close $fp

#
#	Write the Full view
#
set fp [open $env(ECLIPSE)/www/full.htm w]
puts $fp "<HTML>"
puts $fp "<HEAD>"
puts $fp "<META HTTP-EQUIV=REFRESH CONTENT=60>"
puts $fp "<META HTTP-EQUIV=EXPIRES CONTENT=\"[clock format [clock seconds]]\">"
puts $fp "<TITLE>ECLIPSE Server [info hostname]</TITLE>"
puts $fp "</HEAD>"
puts $fp "<BODY BACKGROUND=$bgfile TEXT=#FFFFFF LINK=#00FFAA VLINK=#FFFF44>"
puts $fp "<CENTER>"
puts $fp "<H1>ECLIPSE Server [info hostname]</H1>"
puts $fp "<B>Updated : [clock format [clock seconds] -format {%H:%M:%S %d-%b-%Y}]</B><BR>"

if {[llength [array names gv fulltable:*]]>0} {
	puts $fp "<P><B><I>Clients with problems :</I></B>"
	puts $fp "<TABLE BORDER=0>"
	puts $fp "<TR>"
	puts $fp "	<TD><IMG SRC=gifs/green.gif ALT=green>"
	puts $fp "		<B><I>OK</I></B></TD>"
	puts $fp "	<TD><IMG SRC=gifs/yellow.gif ALT=yellow>"
	puts $fp "		<B><I>Warning</I></B></TD>"
	puts $fp "	<TD><IMG SRC=gifs/red.gif ALT=red>"
	puts $fp "		<B><I>Problem</I></B></TD>"
	puts $fp "</TR>"
	puts $fp "</TABLE>"
	puts $fp "<TABLE BORDER=3>"
	puts $fp "<TR><TD>Hostname</TD><TD>Alarm</TD><TD>Description</TD><TD>Value</TD></TR>"
	foreach name [lsort [array names gv fulltable:*]] { puts $fp $gv($name) }
	puts $fp "</TABLE>"
} else {
	puts $fp "<H2>All clients report OK</H2>"
}

puts $fp "<P><B><I>Clients with no reported problems :</I></B>"
puts $fp "<TABLE BORDER=3>"
puts $fp "<TR><TD>Hostname</TD><TD>Alarm</TD><TD>Description</TD><TD>Value</TD></TR>"
foreach name [lsort [array names gv fulltableall:*]] { puts $fp $gv($name) }
puts $fp "</TABLE>"

puts $fp "</CENTER>"
puts $fp "</BODY>"
puts $fp "</HTML>"
close $fp

catch {exec rm /tmp/eclipse_web.pid} junk

