File: apache.tcl

package info (click to toggle)
moodss 9.0-2
  • links: PTS
  • area: main
  • in suites: potato
  • size: 1,540 kB
  • ctags: 609
  • sloc: sh: 8,869; tcl: 6,909; ansic: 113; makefile: 44
file content (96 lines) | stat: -rw-r--r-- 4,965 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# copyright (C) 1997-1999 Jean-Luc Fontaine (mailto:jfontain@multimania.com)
# this program is free software: please read the COPYRIGHT file enclosed in this package or use the Help Copyright menu

set rcsId {$Id: apache.tcl,v 1.8 1999/07/20 19:05:55 jfontain Exp $}

package provide apache 1.2
package require apacheutilities 1.1


namespace eval apache {

    # use an empty hidden column as index since there is only a single row
    array set data {
        updates 0
        0,label {} 0,type ascii 0,message {} 0,0 {}
        1,label accesses 1,type real 1,message {total number of accesses}
        2,label kilobytes 2,type real 2,message {total number of kilobytes served}
        3,label {CPU load} 3,type real 3,message {CPU load in percent}
        4,label {up time} 4,type dictionary 4,message {total running time in d(ays), h(ours), m(inutes) and s(econds)}
        5,label requests 5,type real 5,message {averaged number of requests per second}
        6,label bytes 6,type integer 6,message {averaged number of bytes per second}
        7,label bytes/request 7,type integer 7,message {average number of bytes per requests}
        8,label busy 8,type integer 8,message {number of busy servers}
        9,label idle 9,type integer 9,message {number of idle servers}
        10,label accesses/second 10,type real 10,message {current number of accesses per second}
        11,label kilobytes/second 11,type real 11,message {current kilobytes served per second}
        pollTimes {10 5 20 30 60 120 300}
        views {
            {visibleColumns {3 4 8 9} sort {3 increasing}}
            {visibleColumns {1 2 5 6 7 10 11} sort {1 increasing}}
        }
        switches {-r 1 --remote 1}
    }
    set file [open [file join $::packageDirectory(apache) apache.htm]]
    set data(helpText) [read $file]                                                           ;# initialize HTML help data from file
    close $file

    proc initialize {optionsName} {
        upvar $optionsName options
        variable url
        variable data

        set url [url options host apache ?auto]
        set data(identifier) apache($host)
    }

    proc update {} {
        variable url
        variable transaction

        if {[info exists transaction]} return                                                                                ;# busy
        set transaction [::http::geturl $url -command ::apache::completed]
    }

    proc completed {token} {
        variable data
        variable last
        variable transaction

        set valid [expr {[lindex [set ${token}(http)] 1]==200}]                               ;# sole HTTP code for good transaction
        if {$valid} {
            foreach line [split [set ${token}(body)] \n] {
                if {![regexp {^(.+): (.+)$} $line dummy name value]} break                             ;# stop at first invalid line
                set current($name) $value
            }
            # check that all statistics are present (per second values are not always returned when server was just (re)started)
            set valid [expr {[array size current]==10}]
        }
        unset $token                                                     ;# free transaction data array (fully qualified and global)
        if {$valid} {
            set data(0,1) $current(Total Accesses)
            set data(0,2) $current(Total kBytes)
            set data(0,3) [format %.2f $current(CPULoad)]
            set data(0,4) [formattedTime $current(Uptime)]
            set data(0,5) [format %.2f $current(ReqPerSec)]
            set data(0,6) [expr {round($current(BytesPerSec))}]
            set data(0,7) [expr {round($current(BytesPerReq))}]
            set data(0,8) $current(BusyServers)
            set data(0,9) $current(IdleServers)
            if {[info exists last]} {
                set interval [expr {double($current(Uptime)-$last(uptime))}]                    ;# force floating point calculations
                set data(0,10) [format %.2f [expr {($current(Total Accesses)-$last(accesses))/$interval}]]
                set data(0,11) [format %.2f [expr {($current(Total kBytes)-$last(kilobytes))/$interval}]]
            } else {                                                                                                   ;# first poll
                array set data {0,10 0 0,11 0}
            }
            array set last [list accesses $current(Total Accesses) kilobytes $current(Total kBytes) uptime $current(Uptime)]
        } else {                                                                                            ;# an HTTP error occured
            array set data {0,1 0 0,2 0 0,3 0 0,4 ? 0,5 0 0,6 0 0,7 0 0,8 0 0,9 0 0,10 0 0,11 0}          ;# show meaningless values
            catch {unset last}
        }
        unset transaction                                                                              ;# ready for next transaction
        incr data(updates)
    }

}