1 # vim: ft=tcl foldmethod=marker foldmarker=<<<,>>> ts=4 shiftwidth=4
10 variable enable_probe
0
18 method run_probe_cmd
{cmd
}
19 method process_probe_cmd
{cmd
}
21 method accept
{con clip clport
}
26 body tlc
::Probe::constructor {args
} { #<<<1
30 foreach reqf
{probe_port
} {
31 if {![info exists
$reqf]} {
32 error "Must set -$reqf"
37 set probe_listen
[socket -server [code
$this accept
] $probe_port]
38 log debug
"opened listening socket ($probe_listen) on port ($probe_port)"
43 body tlc
::Probe::destructor {} { #<<<1
45 if {[info exists proble_listen
]} {
46 if {[catch {close $probe_listen} errmsg
]} {
47 log
error "\nError closing probe_listen: $errmsg\n$::errorInfo"
54 body tlc
::Probe::run_probe_cmd {cmd
} { #<<<1
58 set res
[uplevel #0 $cmd]
60 set res
[eval [list $context proxy
] $cmd]
63 log
error "\nError processing command: $errmsg\n$::errorInfo"
64 return "Error processing command:\n$::errorInfo"
66 log debug
"result: ($res)"
71 body tlc
::Probe::process_probe_cmd {cmd
} { #<<<1
73 switch -- [lindex $cmd 0] {
75 #set user [lindex $cmd 1]
78 # return "ok: global context"
80 #foreach obj [find objects -class Session] {
81 # if {$user == [$obj fqun]} {
89 return [run_probe_cmd
[lrange $cmd 1 end
]
94 set fn
[lindex $cmd 1]
95 set methods
[lrange $cmd 2 end
]
97 #if {$context != ""} {
98 # $context proxy vfs_modules refresh_md5s
107 foreach line
[split $dat \n] {
109 set openbraces
[regsub -all {[^
\{]*} $line {}]
110 set closebraces
[regsub -all {[^
\}]*} $line {}]
111 incr level
[string length
$openbraces]
112 incr level
-[string length
$closebraces]
113 log notice
"openbraces: ($openbraces) closebraces: ($closebraces) level: ($level)"
115 # TODO: handle extra close brace chars etc after
122 if {[string match
"body *" $line]} {
124 [regsub {^body
([^
\s
]*) .
*$} $line {\1}]
125 set method
[lindex [split $fqmethod :] end
]
126 if {[lsearch $methods $method] != -1} {
128 set openbraces
[regsub -all {[^
\{]*} $line {}]
129 set closebraces
[regsub -all {[^
\}]*} $line {}]
130 incr level
[string length
$openbraces]
131 incr level
-[string length
$closebraces]
137 log notice
"reload_methods: fn: ($fn) methods: ($methods) running code:\n$code"
138 if {$::context == ""} {
141 eval [list $::context proxy
] $code
144 return "Error processing reload_methods: $::errorInfo"
146 return "Reloaded code:\n$code"
151 set obj
[lindex $cmd 1]
153 if {![itcl
::is object
$obj]} {
154 return "Error: $obj is not an object"
157 set class
[$obj info class
]
158 return [namespace inscope
$class [lrange $cmd 1 end
]]
162 set obj
[lindex $cmd 1]
163 set var
[lindex $cmd 2]
165 if {![itcl
::is object
$obj]} {
166 return "Error: $obj is not an object"
169 return [$obj info variable $var -value]
173 return [run_probe_cmd
$cmd]
179 body tlc
::Probe::readable {con
} { #<<<1
186 set data
[read $con $len]
188 set res
[process_probe_cmd
$data]
190 set msg
"Error processing command:\n$::errorInfo"
195 puts $con [string length
$msg]
196 puts -nonewline $con $msg
201 body tlc
::Probe::accept {con clip clport
} { #<<<1
203 if {$clip != "127.0.0.1"} {
204 log
error "rejecting connection from $clip"
208 fconfigure $con -blocking 1 -translation binary -encoding binary
209 fileevent $con readable
[code
$this readable
$con]