#!/away/local/bin/wish -f
#

# Thu Jul 23, 2:06 p.m. PDT 1992
#
# This script is modified so that you can use it WITHOUT the
# tclRawTCP extension.

# This Tk program displays the output of the METASERVER program.
# If you double click on the server name a netrek will be started for
# that server.
#
# Go ahead and do anything you want with this code.
#
#                     -Sam Shen (sls@aero.org)
#

# 8/1/93 James W. Hawtin Commodore wibble
#
# jwh@cs.bham.ac.uk
#
# I have updated the script to work from port 3521 rather than 3520 this is
# so that the a correct rsa or normal blessed client will be started
# depending on which server is selected, this information (about) rsa is
# obtained from charon.
#
# I have also made the tmp file a bit more unique so that more than one
# server can be used on a machine
#
# Calvin's address has been corrected.

# 28/1/93 James W. Hawtin Commodore wibble
#
# jwh@cs.bham.ac.uk
#
# Changed the order of the servers because the metaserver has changed the
# way it displays the data, Ie. most popular last not first :-(

# 6/12/93 James W. Hawtin (wibble)
#
# cgjwh@lut.ac.uk
#
# Change the interface so that the third column would ping the netrek server
# Compiled my own telnet port reading code, which means the metaserver can
# now be used in background. Finially I changed the metaserver address, from
# amdahl.


# Make me a bit unique
catch "exec /usr/ucb/whoami" suffix

# Where is the temp File?
set tmpFile /tmp/.serverList.$suffix

# Where is metaserver running?
set server metaserver.ecst.csuchico.edu
set port 3521

# Where can I find the normal netrek executable? If you want to use an RSA
# client in compatible mode then the -o option must be added in the exec
# line at the end of the program, I know this is bad but I could not find
# a way round it ;-(
set netrekNorm /home/cgneiss/cgjwh/bin/udp

# Where can I find the RSA netrek executable?
set netrekRSA /home/cgneiss/cgjwh/bin/rsa

# Please note I do not support the use of borgs in games, but some weenies
# like them.
# Where is my borg? (Weenie support)
set borg /home/cgneiss/cgjwh/bin/gf

# Where is my paradise client?
set paradise /home/cgneiss/cgjwh/bin/paradise

# Where is my paradise borg? (Weenie support)
set paraborg /home/cgneiss/cgjwh/bin/paraborg

# Where is my telnet command?
set tnet /home/cgneiss/cgjwh/bin/tn

# For servers that lie about what host address to use.  Calvin is
# the only one I know that needs this. Correct address entered by jwh 9/1/93
set addressMap(calvin.usc.edu) 128.125.253.129

# Beyond here you shouldn't need to modify anthing.

option add borderwidth 2 interactive

label .info -text "METASERVER @ $server, port $port"
wm minsize . 100 100
wm title . "METASERVER Tk Interface 2.4"
wm iconname . "MetaServer"
wm geometry . 580x600

pack append . .info "fill expand"

label .time -relief sunken
pack append . .time "fill expand"

frame .buttons -borderwidth 6
button .buttons.update -text "Update" -command UpdateList
button .buttons.quit -text "Quit" -command exit
pack append .buttons .buttons.update "left fill expand" .buttons.quit "left fill expand"
pack append . .buttons "fill expand"

label .status -width 40 -relief sunken
pack append . .status "fill expand"

proc QuinListView {name args} {
    eval "$name.column1.list yview $args"
    eval "$name.column2.list yview $args"
    eval "$name.column4.list yview $args"
    eval "$name.column3.list yview $args"
}

proc CreateColumn {name yscroll title geometry} {
    frame $name
    label $name.label -text $title -relief raised
    listbox $name.list -yscroll $yscroll -relief raised -geometry $geometry
    pack append $name $name.label "top fill expand" \
        $name.list "bottom fill expand"
}

proc CreateQuinList {name title1 title2 title3 title4} {
        frame $name -borderwidth 6
    frame $name.column6
    label $name.column6.filler -text ""
        scrollbar $name.column6.scroll -command "QuinListView $name"
    pack append $name.column6 $name.column6.filler "top fillx" \
        $name.column6.scroll "bottom expand fill"
    CreateColumn $name.column1 "$name.column6.scroll set" $title1 34x26
    CreateColumn $name.column2 "$name.column6.scroll set" $title2 15x26
    CreateColumn $name.column3 "$name.column6.scroll set" $title4 8x26
    CreateColumn $name.column4 "$name.column6.scroll set" $title3 8x26
    CreateColumn $name.column5 "$name.column6.scroll set" "" 1x1
        pack append $name $name.column6 "right filly" \
        $name.column1 "left expand fill" \
        $name.column2 "left expand fill" \
	$name.column3 "left expand fill" \
        $name.column4 "left expand fill" \
}

CreateQuinList .servers "Servers" "Status" "Last Checked" "Server Type"
bind .servers.column1.list <Double-1> \
    {StartNetrek [.servers.column5.list get \
            [.servers.column1.list nearest %y]]}
bind .servers.column2.list <Double-1> \
    {StartBorg [.servers.column5.list get \
            [.servers.column1.list nearest %y]]}
bind .servers.column3.list <Double-1> \
    {StartPing [.servers.column5.list get \
            [.servers.column1.list nearest %y]]}
bind .servers.column4.list <Double-1> \
    {CheckNetrek [.servers.column5.list get \
            [.servers.column1.list nearest %y]]}
pack append . .servers "fill expand"

proc getline {fileid} {
    set glresult ""
    for {set tempC [read $fileid 1]} \
        {($tempC != "") && ($tempC != "\n")} \
        {set tempC [read $fileid 1]} {
        append glresult $tempC
    }
    return $glresult
}

proc UpdateList {} {
        global n server port tmpFile tnet
    .status config -text "Connecting to $server..."
    update
    catch "exec $tnet $server $port > $tmpFile"
    set of [open $tmpFile]

    set readingServers 0
    set n 0
    .servers.column1.list delete 0 end
    .servers.column2.list delete 0 end
    .servers.column3.list delete 0 end
    .servers.column4.list delete 0 end
    .servers.column5.list delete 0 end

    while {[eof $of] == 0} {
        set line [getline $of]
            if {[string first "---------------------------------------" $line] == 0} {
            set readingServers 1
            continue
            }
            if {$readingServers == 0} {
            continue
            }
            if {[string trim $line] == ""} {
            set readingServers 0
            continue
            }
        .servers.column1.list insert 0 \
            [string trim [lindex $line 1]]
        .servers.column2.list insert 0 \
            [string range $line 54 70]
	.servers.column3.list insert 0 \
	    "[if {[string trim "[string range $line 78 78]"] =="B"} {
             string trim "Bronco"} else {
               if {[string trim "[string range $line 78 78]"] =="P"} {
               string trim "Paradise"} else {
                 if {[string trim "[string range $line 78 78]"] =="C"} {
                 string trim "Choas"} else {
                   if {[string trim "[string range $line 78 78]"] =="H"} {
                   string trim "Hockey"} else {
                     if {[string trim "[string range $line 78 78]"] =="S"} {
                     string trim "Sturgeon"} else { 
             string trim "Unknown!" } } } } }]"
        .servers.column4.list insert 0 \
            "[string trim "[lindex $line 4]"] [if {[lindex $line 4] =="1"} { 
             string trim "min"} else {
             string trim "mins"}]"
	.servers.column5.list insert 0 \
	    [string trim "[lindex $line 1] [lindex $line 3]  [string range $line 78 78] [string range $line 74 74]"]
            incr n
    }
    close $of
    exec rm -f $tmpFile

    .status config -text "Read $n servers."
    .time config -text "Last update at: [exec date]"
}

UpdateList

proc StartNetrek {server} {
    global netrekNorm netrekRSA netrekNormArgs netrekRSAargs addressMap paradiseMap paradise
    set serv [lindex $server 0]
    set port [lindex $server 1]
    if {[info exists addressMap($serv)] == 1} {
        set serv $addressMap($serv)
    }

    if {[string trim "[lindex $server 2]"] == "P"} {
        .status config -text "Starting: $paradise -h $serv -p $port"
	exec $paradise -h $serv -p $port &   
    } {
       if {[llength $server] == 4} {
       .status config -text "Starting: $netrekRSA -h $serv -p $port"
       exec $netrekRSA -h $serv -p $port &
       } {
       .status config -text "Starting: $netrekNorm -h $serv -p $port"
       exec $netrekNorm -h $serv -p $port &
       }
    }
}

proc StartBorg {server} {
    global netrekNorm netrekRSA netrekNormArgs netrekRSAargs addressMap paraborg paradiseMap borg
    set serv [lindex $server 0]
    set port [lindex $server 1]
    if {[info exists addressMap($serv)] == 1} {
        set serv $addressMap($serv)
    }

    if {[string trim "[lindex $server 2]"] == "P"} {
        .status config -text "Starting: $paraborg -h $serv -p $port"
	exec $paraborg -h $serv -p $port &   
    } {
       if {[llength $server] == 3} {
        .status config -text "Starting: $borg -h $serv -p $port"
       exec $borg -h $serv -p $port &
       } {
       .status config -text "Starting: $borg -o  -h $serv -p $port"
       exec $borg -o  -h $serv -p $port &
      }
   }
}

proc CheckNetrek {server} {
    global addressMap
    set serv [lindex $server 0]
    set port [lindex $server 1]
    if {[info exists addressMap($serv)] == 1} {
        set serv $addressMap($serv)
    }

    .status config -text "Starting: check -h $serv -p $port"
     exec /home/cgneiss/cgjwh/bin/check -h $serv -p $port &
#     exec /usr3/students/se0/jwh/bin.sun4/ck $serv &
#
# ck is the simple script below, you could do something better if you like. 
#
##/bin/sh
#
#/usr/ucb/telnet $1 2591 | /bham/X11R5/bin/xmessage -file -
#

}

proc StartPing {server} {
    global addressMap
    set serv [lindex $server 0]
    set port [lindex $server 1]
    if {[info exists addressMap($serv)] == 1} {
        set serv $addressMap($serv)
    }

    .status config -text "Pinging: $serv"
     exec  ping -s $serv 1024 20 | xmessage -file - -title "Ping stats for $serv" &
}

















