fixes; first version
[rrq/hourglass.git] / sitetool / sitetool.tcl
1 #!/usr/bin/wish
2
3 # Tell newlisp embedding to exit on window close
4
5 bind . <Destroy> {puts {newLISP: (exit)}}
6
7 proc loadsite {} {
8     set f [open hourglass.conf]
9     set data [read $f]
10     close $f
11     global site
12     foreach line [split $data \n] {
13         if [regexp {(\S[^ =]*)\s*=\s*(.*)} $line all key value] {
14             set site($key) [string trim $value]
15         }
16     }
17 }
18
19 loadsite
20
21 proc savesite {} {
22     set f [open hourglass.conf w]
23     puts saving
24     global site
25     foreach key [lsort [array names site]] {
26         if {$key != ""} {
27             set v [string trimright $site($key)]
28             puts "$key = >>>$v<<<"
29             puts $f "$key = $v"
30         }
31     }
32     close $f
33 }
34
35 proc tooltipOn {w name} {
36     if {![winfo exist .balloon]} {
37         toplevel .balloon
38         wm overrideredirect .balloon 1
39         label .balloon.l -foreground blue -background lightyellow \
40             -highlightthick 0 -relief solid -borderwidth 1 \
41             -font {sanserif} -textvariable balloon_text \
42             -justify left -wrap 480 -padx 10
43         pack .balloon.l
44     }
45     global desc
46     set ::balloon_text $desc($name)
47     set x [expr {[winfo rootx $w]+10}]
48     set y [expr {[winfo rooty $w]+[winfo height $w]+5}]
49     set g [format +%d+%d $x $y]
50     # This is probably overdoing it, but better too much than too little
51     wm geometry .balloon $g
52     wm deiconify .balloon
53     wm geometry .balloon $g
54     raise .balloon
55     after idle "[list wm geometry .balloon $g]; raise .balloon"
56 }
57
58 proc tooltipOff {} {
59     if {[winfo exist .balloon]} {
60         wm withdraw .balloon
61     }
62 }
63
64 proc leaving {w} {
65     set i [string first value $w]
66     set k [string replace $w $i [expr $i + 4] name]
67     set key [$k cget -text]
68     set value [$w get 1.0 end]
69     global site
70     set site($key) $value
71 }
72
73 #
74 set count 0
75
76 proc setting {name defval} {
77     global count;
78     global site;
79     incr count;
80     if {[array names site $name] != ""} {
81         set defval "$site($name)"
82     } else {
83         set site($name) $defval
84     }
85     set wname .fr.settings.name$count ;
86     set wvalue .fr.settings.value$count ;
87     set weq .fr.settings.eq$count ;
88     label $wname -text "$name" -font sanserif;
89     label $weq -text { };
90     text $wvalue -height 1 -wrap none -padx 4 -font sanserif -width 30;
91     $wvalue insert end "$defval";
92     bind $wvalue <Leave> [list leaving $wvalue]
93     grid $wname -row $count -column 0;
94     grid $weq -row $count -column 1;
95     grid $wvalue -row $count -column 2;
96     #pack .fr.settings ; #grid $me -row $count -column 0 -sticky w;
97     bind $wname <Enter> [list tooltipOn $wname $name]
98     bind $wname <Leave> {tooltipOff}
99 }
100
101 wm title . {Hourglass sitetool}
102
103 frame .fr
104 frame .fr.settings 
105 grid columnconfigure .fr.settings 0 -weight 1 -uniform A;
106
107 setting {listener.net} {192.168.255}
108 setting {listener.ports} {80 443 1080}
109 setting {listener.activity.dir} {activity}
110 setting {listener.tap} {hourglass}
111
112 setting {control.action} {ipset-control.lsp}
113 setting {control.dat} {control.dat}
114 setting {control.net} {10.0.0.0/24}
115 setting {control.extra.dat} {control-extra.dat}
116 setting {control.usage.dat} {usage.dat}
117 setting {control.usage.tmp} {.usage.dat}
118 setting {control.activity.gap} {10}
119 setting {control.activity.clip} {1000}
120
121 setting {ipset.bin} {/usr/sbin/ipset}
122 setting {ipset.table} {TIMO}
123
124 setting {wui.port} {1070}
125 setting {wui.passwd} {htpasswd}
126
127 pack .fr.settings
128
129 frame .fr.buttons
130
131 button .fr.buttons.save -text save -command {savesite}
132 button .fr.buttons.exit -text "done" -command {exit}
133
134 grid .fr.buttons.save -column 0 -row 0
135 grid .fr.buttons.exit -column 1 -row 0
136 pack .fr.buttons
137
138 grid .fr -column 0 -row 0 -sticky w -padx {10 4} -pady {12 0}