REBOL [
    Title: "Handy Server Monitor Window"
    Date: 2-May-2002
    Version: 1.0.0
    File: %monitor.r
    Author: "Carl Sassenrath"
    Purpose: {A handy script that  monitors various servers (such as
web and email servers) and displays them in a nice little
status window.
}
    Email: carl@rebol.com
    library: [
        level: none 
        platform: none 
        type: none 
        domain: [other-net tcp web GUI] 
        tested-under: none 
        support: none 
        license: none 
        see-also: none
    ]
]

sleep-time: 60

;-- Main window layout:
window: layout [
    style lab text 100x24 right middle
    style inf info 200 font-color white
    style err info 40 center

    across origin 8 space 4x4
    h2 "Server Monitor" return
    lab "Status:" t1: info 200 "Initializing"
    text "Errs" center bottom 40x24 bold return
    l2: lab "Email Port:"  t2: inf  200 e2: err return
    l3: lab "Web Server:"  t3: inf  200 e3: err return
    l4: lab "Docs Server:" t4: inf  200 e4: err return
    l5: lab "CGI Script:"  t5: inf  200 e5: err return
]

;-- Set error counts:
foreach face [e2 e3 e4 e5] [set in get face 'text 0]

;-- Window update functions:
start: func [lab str] [
    stat none none str
    lab/color: gold
    show lab
]

done: func [lab] [
    lab/color: none
    show lab
]

count-error: func [face] [
    face/text: face/text + 1
    show face
]

stat: func [face 'status str] [
    t1/text: str
    show t1
    if face [
        face/text: str
        face/color: select [ok 0.130.0 bad 150.0.0] status
        show face
    ]
]

check: func [face title block /local info err] [
    if none? info: find window/pane face [exit]
    set [info err] next info
    start face reform ["Connecting to" title] 
    either error? try block [
        stat info bad reform ["Failed:" title]
        count-error err
    ][
        stat info ok reform [title "Ok"]
    ]
    done face
]

view/new window

forever [

    ;-- Clear all status boxes:
    foreach face [t2 t3 t4 t5] [
        face: get face
        face/color: black
        face/text: ""
        show face
    ]

    ;-- Try to connect via tcp to known address:
    check l2 "TCP Email Port" [
        close open [
            scheme: 'tcp
            host: 208.201.243.114
            port-id: 25
        ]
    ]

    ;-- Try connect and request from HTTP servers:
    check l3 "REBOL Web Server" [read http://www.rebol.com]

    check l4 "REBOL Tech Server" [read http://www.reboltech.com]

    check l5 "CGI Test" [
        read http://demo.rebol.net/cgi-bin/test.r
    ]

    ;-- Count down to next check:
    repeat n sleep-time [
        wait 1
        if not viewed? window [quit] ; in case window was closed
        stat none none reform ["Checking in" sleep-time - n "seconds"]
    ]
]