Added custom field type support to Form
[tcl-tlc.git] / scripts / probe.itcl
bloba5027f9f07e2d3482299372fa06380f44882c31c
1 # vim: ft=tcl foldmethod=marker foldmarker=<<<,>>> ts=4 shiftwidth=4
3 class tlc::Probe {
4 inherit tlc::Baselog
6 constructor {args} {}
7 destructor {}
9 public {
10 variable enable_probe 0
11 variable probe_port
14 private {
15 variable listen
16 variable context ""
18 method run_probe_cmd {cmd}
19 method process_probe_cmd {cmd}
20 method readable {con}
21 method accept {con clip clport}
26 body tlc::Probe::constructor {args} { #<<<1
27 log debug $this
28 eval configure $args
30 foreach reqf {probe_port} {
31 if {![info exists $reqf]} {
32 error "Must set -$reqf"
36 if {$enable_probe} {
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
44 log debug $this
45 if {[info exists proble_listen]} {
46 if {[catch {close $probe_listen} errmsg]} {
47 log error "\nError closing probe_listen: $errmsg\n$::errorInfo"
49 unset proble_listen
54 body tlc::Probe::run_probe_cmd {cmd} { #<<<1
55 log notice
56 if {[catch {
57 if {$context == ""} {
58 set res [uplevel #0 $cmd]
59 } else {
60 set res [eval [list $context proxy] $cmd]
62 } errmsg]} {
63 log error "\nError processing command: $errmsg\n$::errorInfo"
64 return "Error processing command:\n$::errorInfo"
65 } else {
66 log debug "result: ($res)"
67 return $res
71 body tlc::Probe::process_probe_cmd {cmd} { #<<<1
72 log notice
73 switch -- [lindex $cmd 0] {
74 "context" {
75 #set user [lindex $cmd 1]
76 #if {$user == ""} {
77 # set context ""
78 # return "ok: global context"
80 #foreach obj [find objects -class Session] {
81 # if {$user == [$obj fqun]} {
82 # set context $obj
83 # return "ok: $obj"
84 # }
88 "remote" {
89 return [run_probe_cmd [lrange $cmd 1 end]
92 "reload_method" -
93 "reload_methods" {
94 set fn [lindex $cmd 1]
95 set methods [lrange $cmd 2 end]
97 #if {$context != ""} {
98 # $context proxy vfs_modules refresh_md5s
100 if {[catch {
101 set fp [open $fn r]
102 set dat [read $fp]
103 close $fp
104 set saving 0
105 set code ""
106 set level 0
107 foreach line [split $dat \n] {
108 if {$saving} {
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)"
114 if {$level <= 0} {
115 # TODO: handle extra close brace chars etc after
116 # end of method
117 set saving 0
119 append code $line \n
121 if {!$saving} {
122 if {[string match "body *" $line]} {
123 set fqmethod \
124 [regsub {^body ([^\s]*) .*$} $line {\1}]
125 set method [lindex [split $fqmethod :] end]
126 if {[lsearch $methods $method] != -1} {
127 set saving 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]
132 append code $line \n
137 log notice "reload_methods: fn: ($fn) methods: ($methods) running code:\n$code"
138 if {$::context == ""} {
139 uplevel #0 $code
140 } else {
141 eval [list $::context proxy] $code
143 } errmsg]} {
144 return "Error processing reload_methods: $::errorInfo"
145 } else {
146 return "Reloaded code:\n$code"
150 "private" {
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]]
161 "privatevar" {
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]
172 default {
173 return [run_probe_cmd $cmd]
179 body tlc::Probe::readable {con} { #<<<1
180 log debug
181 set len [gets $con]
182 if {[eof $con]} {
183 close $con
184 return
186 set data [read $con $len]
187 if {[catch {
188 set res [process_probe_cmd $data]
189 }]} {
190 set msg "Error processing command:\n$::errorInfo"
191 } else {
192 set msg $res
195 puts $con [string length $msg]
196 puts -nonewline $con $msg
197 flush $con
201 body tlc::Probe::accept {con clip clport} { #<<<1
202 log notice
203 if {$clip != "127.0.0.1"} {
204 log error "rejecting connection from $clip"
205 close $con
206 return
208 fconfigure $con -blocking 1 -translation binary -encoding binary
209 fileevent $con readable [code $this readable $con]