1#!/bin/sh
2# -*-Mode: TCL;-*-
3# LIC: GPL
4
5#--------------------------------------------------------------
6#   tkpppoe
7#
8#   A graphical front-end for configuring and using rp-pppoe.
9#
10#   Copyright (C) 2001 by Roaring Penguin Software Inc.
11#   This file may be distributed under the terms of the GNU General Public
12#   License, Version 2, or (at your option) any later version.
13#
14#   The "Roaring Penguin" logo is a trademark of Roaring Penguin Software Inc.
15#
16#   http://www.roaringpenguin.com
17#
18#--------------------------------------------------------------
19
20# $Id$
21
22# the next line restarts using wish \
23umask 022; \
24exec wish "$0" "$@" || clear; echo "*****"; echo "Cannot find 'wish' -- you need Tcl/Tk installed to run this program"; exit 1
25
26# Try requiring msgcat (Tcl 8.1 and later)
27
28set problem [catch {package require msgcat} err]
29if {!$problem} {
30    set problem [catch {::msgcat::mcload [file join "@datadir_evaluated@" tkpppoe]} err]
31}
32if {$problem} {
33    puts "$problem - $err"
34    # Oops... leave as English
35    proc m { str } { return $str }
36} else {
37    proc m { str } { ::msgcat::mc $str }
38}
39# Set app name
40tk appname TkPPPoE
41
42# Set this to one if you want to allow multiple instances of TkPPPoE
43set AllowMultipleInstances 0
44
45# Check for other instances
46if {"[tk appname]" != "TkPPPoE"} {
47    # Must be another instance running...
48    if {!$AllowMultipleInstances} {
49	send TkPPPoE AnotherInstance
50	exit 0
51    }
52}
53
54# Location of config directory
55set ConfigDir /etc/ppp/rp-pppoe-gui
56
57# Are we running as root?
58set Admin 0
59
60# Location of connection info file
61set ConnectionInfoFile [file join $ConfigDir connection-info]
62
63# Location of password file
64set PasswordFile [file join $ConfigDir passwd]
65
66# Location of "already run" file
67set AlreadyRunFile [file join $ConfigDir gui-already-run]
68
69# Connection information
70set ConnectionInfo {}
71
72# Connection options
73set OPTS(nonroot) 0
74set OPTS(sync) 1
75
76# Location of wrapper
77set Wrapper "@WRAPPER@"
78
79# Timer token for UpdateConnectionState
80set UpdateToken {}
81
82# Update interval in milliseconds
83set UpdateInterval 500
84
85# Packet counters for signalling activity
86set Packets(in) 0
87set Packets(out) 0
88set Bytes(in) 0
89set Bytes(out) 0
90set MeasureTime 0
91
92# Set up some options to make it look better
93option add *Button.borderWidth 1
94option add *Button.Pad 1
95option add *Menubutton.borderWidth 1
96option add *Menubutton.Pad 1
97option add *Entry.Background white
98
99# Array holding help strings for windows
100array set HelpData {}
101
102bind HelpWin <Enter> "HelpWindowEntered %W"
103bind HelpWin <Leave> "HelpWindowLeft %W"
104
105proc AnotherInstance {} {
106    wm deiconify .
107    raise .
108}
109
110#***********************************************************************
111# %PROCEDURE: HelpWindowEntered
112# %ARGUMENTS:
113#  w -- window
114# %RETURNS:
115#  Nothing
116# %DESCRIPTION:
117#  Looks for procedure in HelpData; evals it if found.
118#***********************************************************************
119proc HelpWindowEntered { w } {
120    global HelpData
121    if {[info exists HelpData($w)]} {
122	set cmd "$HelpData($w) Enter"
123	uplevel #0 $cmd
124    }
125}
126
127#***********************************************************************
128# %PROCEDURE: HelpWindowLeft
129# %ARGUMENTS:
130#  w -- window
131# %RETURNS:
132#  Nothing
133# %DESCRIPTION:
134#  Looks for procedure in HelpData; evals it if found.
135#***********************************************************************
136proc HelpWindowLeft { w } {
137    global HelpData
138    if {[info exists HelpData($w)]} {
139	set cmd "$HelpData($w) Leave"
140	uplevel #0 $cmd
141    }
142}
143
144#***********************************************************************
145# %PROCEDURE: RegisterHelpWindow
146# %ARGUMENTS:
147#  w -- window we need help about
148#  helptext -- the help text
149#  win -- window in which to put help messages
150# %RETURNS:
151#  Nothing
152# %DESCRIPTION:
153#  Sets things up so help text appears in "$win" when mouse enters "$w"
154#***********************************************************************
155proc RegisterHelpWindow {w helptext win} {
156    global HelpData
157    set tags [bindtags $w]
158    if {[lsearch -exact $tags HelpWin] < 0} {
159	lappend tags HelpWin
160	bindtags $w $tags
161    }
162    set HelpData($w) [list HelpInTextWin $helptext $win]
163}
164
165#***********************************************************************
166# %PROCEDURE: HelpInTextWin
167# %ARGUMENTS:
168#  text -- help text
169#  tw -- window in which to write text
170#  what -- one of "Enter" or "Leave"
171# %RETURNS:
172#  Nothing
173# %DESCRIPTION:
174#  Clears out $tw; if $what is "Enter", puts $text in $tw.
175#***********************************************************************
176proc HelpInTextWin {text tw what} {
177    $tw configure -state normal
178    $tw delete 1.0 end
179    if {"$what" == "Enter"} {
180	$tw insert end $text
181    }
182    $tw configure -state disabled
183}
184
185
186#***********************************************************************
187# %PROCEDURE: drawLogo
188# %ARGUMENTS:
189#  c -- canvas to draw logo in
190#  bg -- background color of canvas
191#  pencolor -- color of the word "Penguin"
192# %RETURNS:
193#  Nothing
194# %DESCRIPTION:
195#  Draws Roaring Penguin logo in a Tcl canvas
196#***********************************************************************
197proc drawLogo { c bg {pengcolor #6699cc} } {
198    $c create polygon 372.249 5.182 361.23 5.519 \
199	    346.164 8.892 316.482 20.023 305.463 17.774 296.468 \
200	    19.573 288.935 24.97 282.864 33.177 267.348 55.102 \
201	    254.531 77.814 236.204 125.26 225.635 174.844 \
202	    221.026 226.113 213.605 228.025 208.658 232.634 \
203	    225.523 240.28 250.708 243.316 282.752 242.416 \
204	    320.079 238.818 330.985 193.17 338.181 146.735 \
205	    338.743 99.963 335.483 76.577 329.524 53.191 345.602 \
206	    48.131 353.135 45.995 359.768 41.048 342.679 43.184 \
207	    324.689 40.036 334.583 28.905 348.3 18.674 372.249 \
208	    5.182 -fill #000000 -outline {} -width 1 -tags logo
209
210    $c create line 372.249 5.182 361.23 5.519 \
211	    346.164 8.892 316.482 20.023 305.463 17.774 296.468 \
212	    19.573 288.935 24.97 282.864 33.177 267.348 55.102 \
213	    254.531 77.814 236.204 125.26 225.635 174.844 \
214	    221.026 226.113 213.605 228.025 208.658 232.634 \
215	    225.523 240.28 250.708 243.316 282.752 242.416 \
216	    320.079 238.818 330.985 193.17 338.181 146.735 \
217	    338.743 99.963 335.483 76.577 329.524 53.191 345.602 \
218	    48.131 353.135 45.995 359.768 41.048 342.679 43.184 \
219	    324.689 40.036 334.583 28.905 348.3 18.674 372.249 \
220	    5.182  -tags logo
221
222    $c create polygon 298.605 109.632 290.734 \
223	    159.328 282.752 182.939 271.958 205.65 262.851 \
224	    171.133 263.75 138.752 264.537 164.5 271.958 192.833 \
225	    286.687 157.192 298.605 109.632 -fill #ffffff \
226	    -outline {} -width 1  -tags logo
227
228    $c create line 298.605 109.632 290.734 159.328 \
229	    282.752 182.939 271.958 205.65 262.851 171.133 \
230	    263.75 138.752 264.537 164.5 271.958 192.833 286.687 \
231	    157.192 298.605 109.632  -tags logo
232
233    $c create polygon 312.546 30.592 315.132 35.876 \
234	    310.747 39.586 308.161 34.414 312.546 30.592 -fill \
235	    #ffffff -outline {} -width 1  -tags logo
236
237    $c create line 312.546 30.592 315.132 35.876 \
238	    310.747 39.586 308.161 34.414 312.546 30.592  -tags logo
239
240    $c create polygon 328.624 54.427 322.665 58.7 \
241	    314.458 61.286 289.16 59.15 284.55 74.665 285.338 \
242	    90.181 303.214 98.951 308.499 106.259 310.523 \
243	    116.378 305.913 130.208 312.771 141.563 308.049 \
244	    167.76 299.729 192.158 279.041 238.593 313.558 \
245	    233.871 327.388 185.75 335.033 139.989 335.82 96.253 \
246	    328.624 54.427 -fill #ffffff -outline {} -width 1  -tags logo
247
248    $c create line 328.624 54.427 322.665 58.7 \
249	    314.458 61.286 289.16 59.15 284.55 74.665 285.338 \
250	    90.181 303.214 98.951 308.499 106.259 310.523 \
251	    116.378 305.913 130.208 312.771 141.563 308.049 \
252	    167.76 299.729 192.158 279.041 238.593 313.558 \
253	    233.871 327.388 185.75 335.033 139.989 335.82 96.253 \
254	    328.624 54.427  -tags logo
255
256    $c create polygon 53.837 185.412 54.399 185.862 \
257	    53.837 188.223 54.399 188.673 53.837 188.673 53.837 \
258	    189.572 53.837 190.472 53.387 191.034 52.938 192.833 \
259	    50.577 195.644 49.677 196.656 49.677 197.105 48.215 \
260	    198.455 47.316 198.904 46.866 198.904 44.505 200.816 \
261	    43.606 200.366 42.594 201.265 42.144 201.715 41.245 \
262	    202.277 40.795 202.727 40.345 202.277 39.783 202.277 \
263	    36.972 203.177 36.522 203.177 36.073 203.177 35.623 \
264	    203.627 34.723 203.627 34.161 203.627 34.161 204.076 \
265	    30.901 204.526 28.54 205.538 26.291 205.088 25.729 \
266	    205.088 24.829 205.088 24.38 204.526 23.93 204.526 \
267	    23.48 204.526 22.918 205.088 22.918 206.437 22.918 \
268	    206.887 22.918 207.337 22.468 207.337 22.468 208.798 \
269	    22.018 209.248 22.018 211.16 22.018 211.609 21.569 \
270	    213.521 21.119 215.769 21.569 216.781 20.669 218.13 \
271	    20.669 219.592 20.669 220.042 20.107 220.941 20.107 \
272	    221.953 20.107 223.752 19.657 225.664 19.208 226.113 \
273	    19.657 227.013 18.308 230.835 17.858 240.167 17.296 \
274	    248.15 17.296 249.05 16.846 250.062 15.947 250.062 \
275	    15.048 250.062 15.048 250.511 12.686 251.86 12.237 \
276	    251.86 11.675 251.411 11.675 250.511 11.675 246.689 \
277	    11.225 245.339 11.225 243.878 10.775 240.617 11.225 \
278	    239.268 11.225 238.818 10.775 238.256 10.325 237.357 \
279	    10.325 236.007 9.876 232.634 9.876 231.735 9.876 \
280	    231.285 9.876 230.835 9.876 230.386 9.876 229.824 \
281	    9.426 229.374 9.426 226.113 9.876 226.113 9.876 \
282	    225.664 9.426 224.202 9.426 223.752 9.426 223.302 \
283	    10.325 221.953 9.426 220.941 9.426 219.592 9.426 \
284	    219.142 9.426 218.58 9.426 217.681 9.426 217.231 \
285	    9.426 216.781 8.864 216.332 8.864 214.42 8.864 \
286	    213.97 8.414 213.521 8.414 210.148 8.414 209.248 \
287	    7.964 207.899 8.414 205.988 8.414 204.526 7.065 \
288	    201.265 7.515 200.816 9.426 201.715 10.325 201.265 \
289	    10.775 200.816 10.775 198.904 11.225 198.005 11.225 \
290	    197.555 10.775 197.555 9.876 196.094 9.426 194.744 \
291	    7.515 194.295 6.615 193.845 6.053 193.845 5.153 \
292	    193.283 3.804 191.484 3.804 190.022 3.804 189.572 \
293	    3.804 189.123 3.242 188.673 3.242 186.762 3.804 \
294	    185.412 4.254 184.85 4.704 184.4 7.964 180.24 10.325 \
295	    178.779 11.225 178.779 12.237 177.879 14.036 176.98 \
296	    15.497 175.968 21.569 173.607 22.918 173.157 23.48 \
297	    173.157 24.38 172.707 24.829 172.707 29.102 171.808 \
298	    29.551 171.808 30.001 171.358 31.35 170.796 31.913 \
299	    171.358 32.362 170.796 39.783 171.358 40.345 170.796 \
300	    42.144 171.358 47.766 174.619 48.778 176.418 49.227 \
301	    176.418 49.677 176.98 50.127 176.98 51.588 178.329 \
302	    52.038 179.228 52.488 180.69 52.038 181.14 52.038 \
303	    181.59 52.488 182.039 52.938 182.039 53.387 182.601 \
304	    53.837 183.051 53.837 183.501 53.837 185.412 -fill \
305	    $pengcolor -outline {} -width 1  -tags logo
306
307    $c create polygon 42.594 222.853 43.156 221.953 \
308	    41.694 222.403 39.783 224.202 39.783 224.764 39.783 \
309	    225.214 40.345 225.214 41.245 224.202 41.694 223.752 \
310	    42.594 222.853 -fill $pengcolor -outline {} -width 1  -tags logo
311
312    $c create polygon 58.559 234.096 59.009 234.096 \
313	    59.009 234.546 58.559 234.995 58.559 235.445 57.21 \
314	    236.907 56.648 237.806 52.938 241.067 52.038 241.629 \
315	    52.038 242.079 51.026 242.529 50.577 242.978 50.127 \
316	    242.978 49.227 244.44 45.405 246.239 44.055 246.689 \
317	    43.606 246.689 43.606 247.251 42.144 247.251 41.694 \
318	    247.7 40.795 247.7 38.434 248.15 36.522 248.15 \
319	    35.173 247.7 34.161 246.689 33.711 246.239 32.812 \
320	    244.44 32.362 241.629 32.812 239.718 32.812 239.268 \
321	    33.711 234.995 36.522 229.824 35.623 228.474 35.623 \
322	    227.013 36.522 225.664 37.534 224.202 38.883 222.853 \
323	    41.694 220.492 42.594 219.592 43.156 219.592 43.606 \
324	    219.142 45.405 217.681 45.967 217.681 46.416 217.231 \
325	    48.778 215.769 52.038 214.87 53.387 214.42 54.849 \
326	    214.87 55.299 214.87 56.198 215.769 56.198 217.681 \
327	    56.198 218.58 54.399 221.953 53.837 222.853 53.837 \
328	    223.302 53.387 223.752 50.577 226.113 49.677 226.563 \
329	    47.316 228.474 43.156 230.386 41.245 230.835 40.795 \
330	    230.835 40.345 230.835 39.333 230.835 38.883 230.835 \
331	    38.883 229.824 39.783 229.374 40.795 228.474 41.694 \
332	    228.025 42.594 227.575 45.967 227.013 46.866 226.563 \
333	    50.127 224.764 51.588 223.302 52.488 221.953 52.488 \
334	    220.492 52.488 219.142 51.026 218.13 49.677 218.13 \
335	    48.778 218.13 47.766 219.142 47.316 219.142 47.316 \
336	    219.592 46.866 219.592 45.967 220.941 44.505 221.953 \
337	    44.055 222.403 43.606 222.853 42.594 223.752 41.694 \
338	    225.664 41.245 225.664 41.245 226.113 40.345 226.563 \
339	    39.333 227.575 39.333 228.474 38.434 229.374 36.522 \
340	    233.197 35.623 236.457 35.623 237.357 35.623 238.256 \
341	    35.173 241.067 35.623 242.079 36.522 243.428 37.534 \
342	    243.878 37.984 244.44 38.434 244.89 38.883 244.89 \
343	    39.783 245.339 43.156 245.339 45.967 244.44 49.227 \
344	    242.529 50.127 241.629 50.577 241.067 54.399 238.818 \
345	    54.399 238.256 54.399 237.806 56.198 236.907 58.559 \
346	    234.096 -fill $pengcolor -outline {} -width 1  -tags logo
347
348    $c create polygon 92.289 248.6 92.739 249.05 \
349	    92.289 249.05 91.84 249.05 90.94 248.6 90.378 248.6 \
350	    89.478 247.7 89.029 247.251 88.129 246.689 87.117 \
351	    245.789 85.768 244.89 85.318 244.44 85.768 244.44 \
352	    85.318 242.529 84.756 242.079 84.756 240.617 84.756 \
353	    240.167 84.756 239.718 84.756 239.268 83.857 236.457 \
354	    83.407 234.096 83.407 233.197 83.407 231.735 83.407 \
355	    223.302 83.407 221.391 82.957 220.941 82.508 221.953 \
356	    80.596 226.113 80.146 226.563 80.146 227.013 79.697 \
357	    228.025 79.135 228.474 79.697 228.474 76.324 234.096 \
358	    75.874 234.995 75.424 236.457 74.975 236.457 74.975 \
359	    236.907 74.975 237.357 74.075 239.268 73.513 239.718 \
360	    73.063 240.167 72.613 241.067 72.164 242.529 71.714 \
361	    242.529 71.714 243.878 70.252 245.789 69.803 246.689 \
362	    68.903 246.689 68.903 247.251 67.891 247.7 66.542 \
363	    247.7 66.092 247.7 65.643 247.7 65.08 247.251 65.08 \
364	    246.689 65.08 245.789 64.631 242.079 65.08 242.079 \
365	    64.631 241.629 65.08 241.067 65.08 238.818 64.631 \
366	    237.806 64.631 236.457 64.631 234.546 64.631 233.197 \
367	    64.631 232.634 64.631 232.185 64.631 231.735 64.631 \
368	    228.924 64.631 227.575 64.631 225.664 64.631 225.214 \
369	    64.631 224.764 64.631 223.302 64.631 217.231 65.08 \
370	    216.332 65.643 215.769 69.803 214.87 70.252 215.32 \
371	    70.252 216.332 70.252 217.681 70.252 218.58 69.803 \
372	    219.142 69.803 220.492 69.353 220.941 69.353 221.391 \
373	    68.903 221.953 68.903 225.664 68.453 226.563 68.453 \
374	    228.025 68.453 228.474 67.891 228.924 67.891 230.835 \
375	    68.453 236.457 68.453 237.806 68.453 238.818 68.453 \
376	    240.617 68.453 241.067 68.903 241.067 68.903 241.629 \
377	    69.353 241.629 70.702 241.067 70.702 240.617 71.264 \
378	    240.167 71.264 239.268 72.164 238.256 73.063 236.457 \
379	    74.525 234.546 74.975 233.197 76.324 230.835 77.336 \
380	    229.824 78.235 227.575 78.235 227.013 78.685 226.563 \
381	    78.685 225.664 79.135 225.214 79.697 224.764 79.697 \
382	    224.202 80.146 222.403 81.046 220.941 81.945 217.681 \
383	    82.957 215.769 85.318 214.87 85.768 214.87 87.567 \
384	    214.42 87.567 215.769 87.117 216.332 87.567 216.781 \
385	    88.129 219.592 87.567 219.592 87.567 220.492 87.567 \
386	    221.391 87.567 224.764 87.567 225.664 87.567 226.113 \
387	    87.117 226.113 87.117 227.575 87.567 229.374 88.579 \
388	    235.445 89.029 239.268 89.029 239.718 89.029 241.067 \
389	    89.478 242.529 89.478 242.978 89.928 243.878 89.928 \
390	    244.44 90.378 244.89 90.94 246.239 92.289 248.6 \
391	    -fill $pengcolor -outline {} -width 1  -tags logo
392
393    $c create polygon 117.587 220.492 118.037 \
394	    222.403 117.587 222.853 117.587 224.764 116.687 \
395	    226.113 116.687 227.013 116.238 228.025 114.776 \
396	    229.374 113.877 231.285 112.865 231.735 109.154 \
397	    234.995 106.343 236.457 105.444 237.357 103.982 \
398	    237.806 103.083 238.256 102.633 238.818 102.183 \
399	    238.818 101.172 239.268 99.822 239.718 98.361 \
400	    239.268 97.461 239.718 96.562 239.268 96.0 238.818 \
401	    95.55 238.818 94.201 236.907 94.201 235.445 94.201 \
402	    233.646 94.65 233.197 94.65 232.634 95.1 232.185 \
403	    95.1 231.735 95.55 231.735 96.0 230.386 97.461 \
404	    228.025 97.461 227.575 98.361 226.563 99.822 224.764 \
405	    101.172 223.302 101.172 222.853 102.633 221.391 \
406	    103.083 220.941 104.432 219.592 103.982 218.58 \
407	    103.982 217.231 103.982 216.781 103.982 215.32 \
408	    104.432 214.42 103.982 210.148 103.982 209.698 \
409	    103.982 209.248 104.432 208.798 104.432 207.899 \
410	    104.432 205.988 104.432 205.538 104.994 203.177 \
411	    104.994 202.277 104.994 201.265 104.994 200.816 \
412	    104.994 200.366 104.994 199.916 105.894 199.467 \
413	    106.343 198.904 106.793 198.455 107.243 198.904 \
414	    108.255 198.904 108.255 199.467 108.705 199.467 \
415	    108.705 202.727 108.255 204.076 108.255 205.538 \
416	    108.255 205.988 107.805 205.988 107.805 206.887 \
417	    107.805 209.698 107.243 210.71 106.793 212.059 \
418	    106.343 214.87 106.343 215.32 106.343 215.769 \
419	    105.894 217.681 106.343 217.681 106.793 217.681 \
420	    107.243 217.231 108.705 215.32 109.604 215.32 \
421	    110.054 214.42 110.054 213.97 110.616 213.97 110.616 \
422	    214.42 111.965 214.87 112.415 214.87 112.865 215.32 \
423	    114.326 216.332 116.238 217.681 116.687 218.58 \
424	    117.137 219.592 117.587 220.042 117.587 220.492 \
425	    -fill $pengcolor -outline {} -width 1  -tags logo
426
427    $c create polygon 123.658 258.944 123.658 \
428	    259.394 123.658 260.293 123.658 261.755 123.658 \
429	    262.654 123.658 263.104 123.209 266.364 123.209 \
430	    267.376 122.759 269.175 122.309 269.737 121.859 \
431	    271.087 121.859 271.536 121.859 271.986 121.297 \
432	    271.986 121.297 272.548 120.847 273.448 120.398 \
433	    273.448 120.398 273.897 118.486 276.259 118.037 \
434	    276.708 117.587 277.608 117.137 278.17 116.687 \
435	    278.17 115.675 278.62 115.675 279.069 113.427 \
436	    280.419 112.865 280.981 112.415 280.981 111.965 \
437	    281.43 110.054 282.33 109.154 282.33 108.705 282.78 \
438	    108.255 282.78 107.805 283.229 104.994 283.792 \
439	    104.432 283.792 103.982 283.792 103.533 283.792 \
440	    103.083 283.792 102.633 283.792 102.183 283.792 \
441	    101.172 283.792 100.722 283.792 99.822 283.792 98.81 \
442	    283.792 96.562 282.33 96.0 282.78 95.1 281.88 94.201 \
443	    281.43 91.84 279.969 92.289 279.519 92.289 278.62 \
444	    93.751 279.069 93.751 279.519 94.201 279.519 94.65 \
445	    279.969 95.1 279.969 96.0 280.981 98.81 281.88 \
446	    101.172 281.88 101.621 281.88 102.633 281.88 103.083 \
447	    281.88 103.533 281.88 104.432 281.43 104.994 281.88 \
448	    105.444 281.43 106.793 281.43 107.805 280.981 \
449	    108.705 280.419 109.154 280.419 109.604 279.969 \
450	    110.054 279.969 110.616 279.969 111.066 279.519 \
451	    112.865 278.17 113.427 277.608 113.877 277.608 \
452	    113.877 277.158 114.326 277.158 114.326 276.708 \
453	    114.776 276.259 115.226 276.259 116.238 274.347 \
454	    116.687 274.347 116.687 273.897 117.587 272.998 \
455	    117.587 272.548 118.037 271.986 119.498 267.826 \
456	    120.398 265.015 120.398 262.204 119.948 259.843 \
457	    119.948 259.394 119.948 258.944 119.498 257.482 \
458	    118.486 254.222 118.037 253.772 117.587 251.86 \
459	    115.675 249.05 115.226 248.6 114.776 248.15 113.877 \
460	    247.251 111.965 246.239 111.515 246.239 110.616 \
461	    246.239 110.054 246.239 109.154 246.239 107.243 \
462	    247.251 106.343 247.251 105.444 247.7 104.994 247.7 \
463	    103.083 248.15 102.183 248.6 101.621 248.6 101.172 \
464	    249.05 100.722 249.499 99.822 250.062 98.361 250.062 \
465	    97.461 249.499 97.012 249.499 96.562 249.05 96.562 \
466	    248.6 97.012 248.15 99.822 245.789 100.272 245.339 \
467	    101.621 244.44 101.621 243.878 102.183 243.428 \
468	    102.633 243.428 102.633 242.978 103.982 241.629 \
469	    103.982 241.067 103.982 240.617 103.982 240.167 \
470	    105.444 239.268 108.705 236.907 108.705 236.457 \
471	    109.154 236.457 110.054 235.445 111.066 234.546 \
472	    112.415 234.096 112.865 233.646 113.427 233.646 \
473	    113.877 233.646 113.877 234.096 114.326 234.995 \
474	    114.776 235.445 114.776 236.457 114.326 237.357 \
475	    113.427 238.818 112.415 239.268 112.415 240.167 \
476	    111.965 240.167 111.515 240.617 110.054 241.629 \
477	    110.054 242.079 109.604 242.529 108.705 242.978 \
478	    110.054 242.978 113.427 242.079 114.326 242.529 \
479	    115.226 242.978 116.687 244.44 119.048 246.689 \
480	    119.498 247.7 119.498 248.15 119.948 248.6 119.948 \
481	    249.05 120.398 249.05 120.398 249.499 120.847 \
482	    249.499 120.847 250.062 121.297 250.511 121.297 \
483	    251.411 121.859 252.31 122.759 252.872 122.759 \
484	    254.222 122.759 254.671 123.658 258.494 123.658 \
485	    258.944 -fill $pengcolor -outline {} -width 1  -tags logo
486
487    $c create polygon 147.607 215.769 148.506 215.32 \
488	    148.506 217.231 148.506 217.681 148.506 218.13 \
489	    148.956 218.58 148.506 220.492 148.506 220.941 \
490	    148.506 222.853 148.956 224.764 148.956 226.113 \
491	    148.506 226.563 148.956 226.563 148.506 228.924 \
492	    148.956 229.824 148.956 231.285 148.506 232.185 \
493	    148.956 232.634 148.956 233.646 149.405 234.995 \
494	    148.956 234.995 149.405 235.445 149.405 236.907 \
495	    149.405 237.357 149.968 238.818 150.867 240.167 \
496	    150.867 240.617 151.317 242.079 152.216 243.428 \
497	    153.228 245.339 154.128 245.789 155.027 246.239 \
498	    156.939 245.789 157.388 246.239 156.489 246.689 \
499	    155.027 247.7 154.128 247.7 153.228 247.7 152.216 \
500	    247.7 151.767 247.7 150.867 247.251 150.417 246.239 \
501	    149.405 246.239 148.056 245.339 147.607 244.44 \
502	    147.157 243.428 145.695 241.629 145.695 240.617 \
503	    145.245 240.167 145.245 239.718 144.796 238.256 \
504	    144.346 236.907 144.346 235.445 143.784 234.546 \
505	    143.784 233.197 143.784 232.185 143.784 230.835 \
506	    143.334 229.824 143.784 229.374 143.334 229.374 \
507	    143.334 228.474 142.884 230.386 141.985 231.735 \
508	    140.973 233.197 140.523 234.096 140.523 234.546 \
509	    140.523 234.995 139.624 236.457 139.174 237.806 \
510	    138.162 239.718 137.263 241.067 136.813 242.079 \
511	    135.913 242.978 134.452 244.89 134.002 245.789 \
512	    133.552 245.789 132.091 246.689 131.191 247.251 \
513	    129.73 248.15 129.28 248.15 128.38 247.7 128.38 \
514	    248.15 126.919 247.7 126.019 247.251 125.12 246.239 \
515	    125.12 245.339 124.67 244.89 124.67 244.44 124.67 \
516	    243.428 124.67 242.529 124.67 241.067 124.67 239.718 \
517	    125.12 239.268 124.67 239.268 124.67 238.256 125.12 \
518	    237.806 125.12 237.357 125.12 236.907 125.12 236.007 \
519	    125.12 234.096 125.57 233.197 125.57 232.185 126.019 \
520	    232.185 126.019 231.285 126.019 230.386 126.019 \
521	    229.374 126.469 228.474 126.469 227.013 126.469 \
522	    225.214 126.019 225.214 126.469 225.214 126.019 \
523	    223.302 126.019 221.953 126.019 220.492 125.57 \
524	    220.042 125.12 219.592 124.108 219.142 123.209 \
525	    219.142 121.859 220.042 121.297 220.042 120.398 \
526	    220.941 119.498 221.391 119.048 221.391 118.486 \
527	    221.953 118.037 221.953 118.037 221.391 118.486 \
528	    220.941 119.498 220.042 120.847 219.142 122.759 \
529	    217.681 124.108 216.781 125.12 215.769 126.469 \
530	    214.87 126.919 214.87 127.481 214.87 128.38 214.87 \
531	    128.83 214.87 129.73 214.87 129.73 215.769 130.292 \
532	    215.769 130.742 216.781 130.742 217.681 130.292 \
533	    219.142 130.292 221.953 130.292 223.302 130.292 \
534	    224.202 129.73 225.214 129.28 227.013 128.83 227.575 \
535	    129.28 227.575 129.28 228.474 128.83 229.374 129.28 \
536	    229.824 129.28 230.386 128.83 231.735 128.38 234.096 \
537	    128.38 234.995 127.931 236.457 127.931 239.268 \
538	    127.931 240.167 127.931 241.629 128.83 242.978 \
539	    129.28 243.878 129.73 244.44 130.742 244.44 131.191 \
540	    244.44 132.091 244.44 133.103 243.878 134.002 \
541	    242.978 134.902 242.079 135.351 241.067 135.913 \
542	    240.167 136.363 239.268 136.813 238.818 137.263 \
543	    237.806 137.712 236.907 138.162 235.445 138.724 \
544	    234.546 139.174 233.646 139.624 232.634 140.523 \
545	    230.835 140.973 228.924 141.535 227.013 142.435 \
546	    225.664 142.884 223.302 143.334 221.391 143.334 \
547	    220.941 143.334 219.142 144.346 217.681 144.796 \
548	    216.781 145.695 216.332 146.595 216.332 147.607 \
549	    215.769 -fill $pengcolor -outline {} -width 1  -tags logo
550
551    $c create polygon 165.371 241.067 165.371 \
552	    241.067 164.921 243.878 164.921 246.239 163.46 \
553	    246.689 161.211 247.251 160.649 247.251 160.199 \
554	    244.44 160.199 243.878 160.199 243.428 160.199 \
555	    242.079 160.199 240.167 160.199 239.718 159.749 \
556	    239.268 160.199 237.806 159.749 237.357 159.749 \
557	    236.007 159.749 230.835 159.749 229.824 159.749 \
558	    228.924 159.749 226.113 159.749 225.664 159.749 \
559	    223.752 159.749 222.853 159.749 218.58 159.749 \
560	    218.13 159.749 217.681 160.199 217.231 161.661 \
561	    216.781 162.11 216.781 162.56 216.781 163.46 216.781 \
562	    164.022 219.142 163.46 222.403 163.46 222.853 163.46 \
563	    224.202 163.46 225.664 163.46 226.563 163.46 227.013 \
564	    163.46 228.924 163.01 230.835 163.01 232.634 163.46 \
565	    233.197 164.022 232.634 164.472 232.634 164.921 \
566	    232.185 164.921 231.735 165.371 231.735 165.821 \
567	    232.185 165.371 233.646 165.821 236.007 165.371 \
568	    238.256 165.371 238.818 165.371 240.617 165.371 \
569	    241.067 -fill $pengcolor -outline {} -width 1  -tags logo
570
571    $c create polygon 165.821 214.42 166.833 215.32 \
572	    166.271 215.32 165.821 216.332 165.371 216.332 \
573	    165.371 216.781 165.821 217.681 165.821 218.13 \
574	    165.371 219.142 165.371 220.042 164.921 222.853 \
575	    165.371 224.764 164.921 225.664 165.371 227.575 \
576	    165.371 228.474 164.921 228.474 164.472 227.575 \
577	    164.472 226.113 164.022 224.764 164.472 224.202 \
578	    164.472 223.752 164.472 222.403 164.921 214.87 \
579	    164.472 213.521 164.472 212.959 164.472 212.509 \
580	    164.022 212.509 163.46 212.509 163.01 212.959 162.56 \
581	    212.959 161.661 212.959 161.211 212.059 161.211 \
582	    211.609 160.649 211.609 160.199 209.698 160.649 \
583	    208.349 163.46 206.437 164.472 206.437 165.821 \
584	    207.899 165.821 208.349 166.833 210.148 166.833 \
585	    210.71 165.821 211.609 165.371 212.059 165.371 \
586	    212.959 165.821 213.97 165.821 214.42 -fill $pengcolor \
587	    -outline {} -width 1  -tags logo
588
589    $c create polygon 201.462 248.6 201.462 249.05 \
590	    201.012 249.05 200.563 249.05 200.001 248.6 199.551 \
591	    248.6 198.651 247.7 197.752 247.251 196.74 246.689 \
592	    196.29 245.789 194.379 244.89 194.379 244.44 194.379 \
593	    242.529 193.929 242.079 193.479 240.617 193.479 \
594	    240.167 193.929 239.718 193.479 239.268 193.03 \
595	    236.457 192.58 234.096 192.58 233.197 192.58 231.735 \
596	    192.58 223.302 192.58 221.391 192.13 220.941 191.568 \
597	    221.953 189.769 226.113 189.319 226.563 189.319 \
598	    227.013 188.757 228.025 188.307 228.474 188.757 \
599	    228.474 185.497 234.096 185.047 234.995 184.597 \
600	    236.457 184.147 236.457 184.147 236.907 184.147 \
601	    237.357 183.136 239.268 182.686 239.268 182.686 \
602	    239.718 182.236 240.167 181.786 241.067 181.337 \
603	    242.529 180.887 242.529 180.887 243.878 179.425 \
604	    245.789 178.975 246.689 178.076 246.689 178.076 \
605	    247.251 177.064 247.7 175.715 247.7 175.265 247.7 \
606	    174.703 247.7 174.253 247.251 174.253 246.689 \
607	    174.253 245.789 173.804 242.079 174.253 242.079 \
608	    173.804 241.629 173.804 241.067 173.804 238.818 \
609	    173.804 237.806 173.804 236.457 173.354 234.546 \
610	    173.354 233.197 173.804 232.634 173.804 232.185 \
611	    173.804 231.735 173.804 228.924 173.354 227.575 \
612	    173.804 227.575 173.804 225.664 173.804 225.214 \
613	    173.804 224.764 173.804 223.302 173.804 217.231 \
614	    174.253 216.332 174.703 215.769 178.526 214.87 \
615	    179.425 215.32 179.425 216.332 179.425 217.681 \
616	    179.425 218.58 178.975 219.142 178.526 220.492 \
617	    178.526 220.941 178.076 221.391 178.076 221.953 \
618	    178.076 225.664 177.514 226.563 177.514 228.025 \
619	    177.064 228.474 177.064 228.924 177.064 230.835 \
620	    177.514 236.457 177.064 237.806 177.514 237.806 \
621	    177.514 238.818 177.514 240.617 177.514 241.067 \
622	    178.076 241.629 178.526 241.629 179.425 241.067 \
623	    179.875 240.617 179.875 240.167 180.325 239.268 \
624	    181.337 238.256 182.236 236.457 183.698 234.546 \
625	    184.147 233.197 185.497 230.835 186.509 229.824 \
626	    187.408 227.575 187.408 227.013 187.408 226.563 \
627	    187.858 225.664 188.307 225.214 188.757 224.764 \
628	    188.757 224.202 189.319 222.403 190.219 220.941 \
629	    191.118 217.681 192.13 215.769 194.379 214.87 \
630	    194.941 214.87 196.74 214.42 196.74 215.769 196.29 \
631	    215.769 196.29 216.332 196.29 216.781 196.74 219.592 \
632	    196.74 220.492 196.29 221.391 196.74 224.764 196.29 \
633	    225.664 196.29 226.113 196.29 227.575 196.74 229.374 \
634	    197.19 235.445 198.202 239.268 198.202 239.718 \
635	    198.202 241.067 198.202 242.529 198.651 242.978 \
636	    199.101 243.878 199.101 244.44 199.551 244.89 \
637	    200.001 246.239 201.462 248.6 -fill $pengcolor -outline \
638	    {} -width 1  -tags logo
639
640    $c create polygon 71.714 185.412 71.714 110.869 \
641	    81.496 110.869 82.845 110.981 83.969 111.431 85.094 \
642	    112.106 86.105 113.118 86.893 114.467 87.567 116.041 \
643	    88.017 117.39 88.242 118.065 88.467 118.852 88.579 \
644	    119.639 88.804 120.538 88.916 121.438 89.029 122.337 \
645	    89.141 123.349 89.254 124.361 89.366 125.485 89.366 \
646	    126.61 89.478 127.734 89.478 128.971 89.478 130.208 \
647	    89.478 131.444 89.478 132.456 89.478 133.468 89.478 \
648	    134.48 89.366 135.492 89.254 136.391 89.254 137.291 \
649	    89.141 138.19 89.029 139.09 88.916 139.877 88.804 \
650	    140.664 88.691 141.451 88.579 142.238 88.354 143.362 \
651	    88.129 144.374 87.904 145.386 87.567 146.398 87.342 \
652	    147.297 87.005 148.197 86.668 148.984 86.218 149.771 \
653	    87.005 151.233 87.342 152.02 87.68 152.919 87.904 \
654	    153.931 88.129 154.943 88.129 155.505 88.354 156.854 \
655	    88.354 157.641 88.354 158.428 88.467 159.328 88.467 \
656	    160.34 88.467 161.352 88.467 162.476 88.579 163.6 \
657	    88.579 164.837 88.579 166.186 88.579 166.973 88.691 \
658	    167.873 88.804 168.885 88.916 169.897 89.029 171.021 \
659	    89.029 172.258 89.029 173.719 89.029 175.068 89.029 \
660	    176.305 89.029 177.542 89.141 178.554 89.141 179.566 \
661	    89.141 180.353 89.141 181.14 89.254 181.814 89.366 \
662	    182.714 89.478 183.051 89.478 185.412 83.857 185.412 \
663	    83.857 184.738 83.744 183.951 83.744 183.276 83.744 \
664	    182.489 83.744 180.803 83.857 179.791 83.857 178.891 \
665	    83.857 177.879 83.857 176.867 83.857 175.743 83.857 \
666	    174.619 83.857 173.27 83.857 172.033 83.744 170.908 \
667	    83.744 170.009 83.632 169.109 83.632 168.322 83.52 \
668	    166.973 83.407 166.524 83.407 166.186 83.407 165.062 \
669	    83.407 164.05 83.295 163.151 83.295 162.251 83.295 \
670	    161.464 83.182 160.789 82.957 159.553 81.945 158.203 \
671	    80.596 157.754 76.886 157.754 76.886 185.412 71.714 \
672	    185.412 -fill #000000 -outline {} -width 1  -tags logo
673
674    $c create polygon 92.289 148.309 92.289 147.185 \
675	    92.289 146.061 92.289 145.049 92.402 143.924 92.402 \
676	    142.8 92.402 141.788 92.402 140.664 92.514 139.652 \
677	    92.514 138.64 92.627 137.628 92.627 136.616 92.739 \
678	    135.717 92.739 134.705 92.851 133.805 92.964 132.793 \
679	    92.964 131.894 93.076 130.995 93.301 129.196 93.414 \
680	    128.409 93.526 127.509 93.639 126.722 93.751 125.935 \
681	    93.863 125.148 93.976 124.361 94.313 122.787 94.426 \
682	    122.112 94.65 121.325 94.763 120.651 95.1 119.301 \
683	    95.55 117.615 96.112 116.041 96.674 114.692 97.236 \
684	    113.455 97.799 112.443 98.361 111.544 99.035 110.757 \
685	    99.71 110.082 100.385 109.632 101.059 109.295 \
686	    101.846 109.07 102.633 108.958 104.207 109.295 \
687	    104.882 109.632 105.556 110.082 106.231 110.757 \
688	    106.906 111.544 107.468 112.443 108.03 113.455 \
689	    108.592 114.692 109.154 116.041 109.604 117.615 \
690	    110.054 119.301 110.279 119.976 110.616 121.325 \
691	    110.841 122.112 110.953 122.787 111.178 123.574 \
692	    111.403 125.148 111.628 125.935 111.74 126.722 \
693	    111.853 127.622 111.965 128.409 112.078 129.308 \
694	    112.19 130.208 112.302 130.995 112.415 132.006 \
695	    112.64 133.805 112.752 134.817 112.865 135.717 \
696	    112.977 136.729 112.977 137.741 113.089 138.752 \
697	    113.089 139.764 113.202 140.776 113.202 141.788 \
698	    113.314 142.912 113.314 143.924 113.314 145.049 \
699	    113.427 146.061 113.427 147.185 113.427 148.309 \
700	    113.427 149.546 113.314 150.783 113.314 151.907 \
701	    113.314 153.032 113.314 154.156 113.202 155.28 \
702	    113.202 156.405 113.089 157.529 113.089 158.541 \
703	    112.977 159.553 112.865 160.565 112.752 161.576 \
704	    112.64 162.588 112.527 163.6 112.415 164.5 112.302 \
705	    165.512 112.19 166.411 112.078 167.311 111.965 \
706	    168.21 111.853 169.109 111.628 169.897 111.515 \
707	    170.796 111.403 171.583 111.178 172.37 111.066 \
708	    173.157 110.616 174.731 110.504 175.518 110.279 \
709	    176.193 110.054 176.98 109.604 178.666 109.154 \
710	    180.128 108.592 181.59 108.03 182.826 107.468 \
711	    183.951 106.906 184.963 106.231 185.75 105.556 \
712	    186.424 104.882 186.986 104.207 187.436 103.42 \
713	    187.661 102.633 187.661 101.846 187.661 101.059 \
714	    187.436 100.385 186.986 99.71 186.424 99.035 185.75 \
715	    98.361 184.963 97.799 183.951 97.236 182.826 96.674 \
716	    181.59 96.112 180.128 95.55 178.666 95.1 176.98 \
717	    94.988 176.193 94.763 175.518 94.538 174.731 94.426 \
718	    173.944 94.088 172.37 93.976 171.583 93.863 170.796 \
719	    93.639 169.897 93.526 169.109 93.414 168.21 93.301 \
720	    167.311 93.189 166.411 93.076 165.512 92.964 164.5 \
721	    92.964 163.6 92.851 162.588 92.739 161.576 92.627 \
722	    160.565 92.627 159.553 92.514 158.541 92.514 157.529 \
723	    92.514 156.405 92.402 155.28 92.402 154.156 92.402 \
724	    153.032 92.289 151.907 92.289 150.783 92.289 149.546 \
725	    92.289 148.309 -fill #000000 -outline {} -width 1  -tags logo
726
727    $c create polygon 121.859 110.869 127.481 \
728	    110.869 134.902 185.412 129.28 185.412 127.931 \
729	    171.808 120.847 171.808 119.948 185.412 114.326 \
730	    185.412 121.859 110.869 -fill #000000 -outline {} \
731	    -width 1  -tags logo
732
733    $c create polygon 137.263 185.412 137.263 \
734	    110.869 147.157 110.869 148.394 110.981 149.518 \
735	    111.431 150.417 112.106 151.317 113.118 152.104 \
736	    114.467 152.778 116.041 153.228 117.39 153.341 \
737	    118.065 153.566 118.852 153.903 120.538 154.015 \
738	    121.438 154.128 122.337 154.24 123.349 154.353 \
739	    124.361 154.465 125.485 154.465 126.61 154.577 \
740	    127.734 154.577 128.971 154.577 130.208 154.577 \
741	    131.444 154.577 132.456 154.577 133.468 154.577 \
742	    134.48 154.577 135.492 154.577 136.391 154.577 \
743	    137.291 154.577 138.19 154.465 139.09 154.465 \
744	    139.877 154.353 140.664 154.24 141.451 154.128 \
745	    142.238 153.903 143.362 153.678 144.374 153.341 \
746	    145.386 153.003 146.398 152.554 147.297 152.216 \
747	    148.197 151.767 148.984 151.317 149.771 152.104 \
748	    151.233 152.441 152.02 152.778 152.919 153.003 \
749	    153.931 153.228 154.943 153.341 155.505 153.453 \
750	    156.854 153.566 157.641 153.678 158.428 153.79 \
751	    159.328 153.903 160.34 154.015 161.352 154.015 \
752	    162.476 154.128 163.6 154.128 164.837 154.128 \
753	    166.186 154.128 166.973 154.128 167.873 154.128 \
754	    168.885 154.128 169.897 154.128 171.021 154.128 \
755	    172.258 154.128 173.719 154.24 175.068 154.24 \
756	    176.305 154.353 177.542 154.353 178.554 154.465 \
757	    179.566 154.577 180.353 154.69 181.14 154.69 181.814 \
758	    154.915 182.714 155.027 183.051 155.027 185.412 \
759	    149.405 185.412 149.405 184.738 149.293 183.951 \
760	    149.293 183.276 149.181 182.489 149.181 180.803 \
761	    149.068 179.791 149.068 178.891 149.068 177.879 \
762	    149.068 176.867 148.956 175.743 148.956 174.619 \
763	    148.956 173.27 148.956 172.033 148.956 170.908 \
764	    148.956 170.009 148.956 169.109 148.956 168.322 \
765	    148.956 166.973 148.956 166.524 148.956 166.186 \
766	    148.956 165.062 148.843 164.05 148.731 163.151 \
767	    148.618 162.251 148.506 161.464 148.394 160.789 \
768	    148.056 159.553 147.269 158.203 146.145 157.754 \
769	    142.435 157.754 142.435 185.412 137.263 185.412 \
770	    -fill #000000 -outline {} -width 1  -tags logo
771
772    $c create polygon 158.4 185.412 158.4 110.869 \
773	    164.022 110.869 164.022 185.412 158.4 185.412 -fill \
774	    #000000 -outline {} -width 1  -tags logo
775
776    $c create polygon 168.182 185.412 168.182 \
777	    110.869 173.804 110.869 177.514 135.267 177.739 \
778	    136.054 177.851 136.954 177.964 137.853 178.076 \
779	    138.752 178.301 139.539 178.413 140.439 178.526 \
780	    141.338 178.751 143.137 178.975 144.037 179.088 \
781	    144.824 179.2 145.723 179.313 146.623 179.425 147.41 \
782	    179.538 148.422 179.763 149.321 179.875 150.333 \
783	    180.1 151.233 180.212 152.132 180.437 153.032 180.55 \
784	    154.043 180.774 154.943 180.887 155.842 180.999 \
785	    156.742 181.224 157.754 181.337 158.653 181.337 \
786	    157.641 181.224 156.629 181.224 155.617 181.224 \
787	    154.606 181.224 153.594 181.112 152.582 181.112 \
788	    151.682 181.112 150.67 180.999 149.771 180.999 \
789	    148.759 180.999 147.86 180.887 146.96 180.887 \
790	    145.948 180.887 145.049 180.887 144.149 180.887 \
791	    143.25 180.887 142.125 180.887 141.114 180.887 \
792	    140.102 180.887 139.09 180.887 138.078 180.887 \
793	    137.178 180.887 136.166 180.887 135.267 180.887 \
794	    134.368 180.887 133.468 180.887 132.569 180.887 \
795	    131.669 180.887 130.882 180.887 130.095 180.887 \
796	    110.869 185.946 110.869 185.946 185.412 180.325 \
797	    185.412 176.165 160.565 176.052 159.778 175.94 \
798	    158.99 175.827 158.203 175.602 156.517 175.49 \
799	    155.617 175.378 154.718 175.265 153.931 175.153 \
800	    153.032 175.04 152.02 174.928 151.12 174.703 150.221 \
801	    174.591 149.321 174.478 148.422 174.366 147.41 \
802	    174.141 146.51 174.028 145.611 173.804 144.599 \
803	    173.691 143.587 173.579 142.575 173.354 141.676 \
804	    173.241 140.551 173.017 139.539 172.904 138.528 \
805	    172.904 139.539 172.904 140.551 173.017 141.563 \
806	    173.017 142.575 173.017 143.587 173.129 144.599 \
807	    173.129 145.498 173.129 146.51 173.241 147.41 \
808	    173.241 148.422 173.241 149.321 173.354 150.221 \
809	    173.354 151.233 173.354 152.132 173.354 153.144 \
810	    173.354 154.156 173.354 155.055 173.354 156.067 \
811	    173.354 156.967 173.354 157.866 173.354 158.766 \
812	    173.354 159.553 173.354 160.452 173.354 161.239 \
813	    173.354 162.026 173.354 162.926 173.354 185.412 \
814	    168.182 185.412 -fill #000000 -outline {} -width 1  -tags logo
815
816    $c create polygon 206.184 185.412 205.622 \
817	    175.968 205.397 177.092 205.172 178.217 204.948 \
818	    179.228 204.61 180.128 204.385 181.027 204.048 \
819	    181.814 203.823 182.489 203.486 183.164 203.149 \
820	    183.838 202.811 184.4 202.024 185.75 201.125 186.762 \
821	    200.113 187.436 199.101 187.661 198.089 187.549 \
822	    197.19 186.986 196.29 186.087 195.391 184.85 194.941 \
823	    184.176 194.491 183.389 194.042 182.489 193.592 \
824	    181.477 193.255 180.465 192.805 179.341 192.467 \
825	    178.217 192.13 176.98 191.905 176.193 191.68 175.406 \
826	    191.568 174.619 191.456 173.832 191.231 172.932 \
827	    191.118 172.145 191.006 171.246 190.781 169.559 \
828	    190.669 168.66 190.556 167.648 190.444 166.748 \
829	    190.331 165.736 190.219 164.725 190.106 163.825 \
830	    189.994 162.926 189.994 162.026 189.882 161.127 \
831	    189.769 160.227 189.769 159.215 189.657 158.316 \
832	    189.544 157.304 189.544 156.405 189.432 155.393 \
833	    189.432 154.381 189.319 153.369 189.319 152.357 \
834	    189.319 151.345 189.319 150.333 189.319 149.321 \
835	    189.319 148.197 189.319 146.96 189.319 145.948 \
836	    189.319 144.824 189.319 143.7 189.319 142.688 \
837	    189.432 141.563 189.432 140.551 189.544 139.539 \
838	    189.544 138.528 189.544 137.516 189.657 136.504 \
839	    189.769 135.492 189.769 134.592 189.882 133.581 \
840	    189.994 132.681 189.994 131.782 190.106 130.882 \
841	    190.219 129.983 190.331 129.083 190.556 127.397 \
842	    190.669 126.61 190.781 125.823 191.006 124.923 \
843	    191.118 124.136 191.231 123.462 191.568 121.887 \
844	    191.793 121.213 191.905 120.426 192.13 119.751 \
845	    192.58 117.952 193.142 116.378 193.704 114.917 \
846	    194.266 113.567 194.941 112.443 195.616 111.431 \
847	    196.29 110.532 196.965 109.857 197.752 109.295 \
848	    198.426 108.845 199.214 108.62 200.001 108.508 \
849	    201.799 108.958 202.699 109.407 203.374 110.194 \
850	    204.161 111.094 204.835 112.218 205.51 113.567 \
851	    206.184 115.141 206.634 116.491 206.859 117.165 \
852	    206.971 117.952 207.421 119.526 207.534 120.426 \
853	    207.758 121.325 207.871 122.225 207.983 123.124 \
854	    208.096 124.136 208.208 125.036 208.321 126.047 \
855	    208.433 127.172 208.545 128.184 208.658 129.308 \
856	    208.77 130.32 208.77 131.557 208.883 132.681 208.995 \
857	    133.805 204.273 133.805 204.161 132.681 203.936 \
858	    131.557 203.711 130.432 203.486 129.533 203.261 \
859	    128.633 202.924 127.734 202.699 126.947 202.362 \
860	    126.385 201.35 124.586 200.001 124.024 199.438 \
861	    124.136 198.989 124.361 198.426 124.923 197.977 \
862	    125.598 197.527 126.497 197.077 127.622 196.628 \
863	    128.971 196.29 130.545 196.178 131.219 195.953 \
864	    132.681 195.84 133.356 195.728 134.143 195.616 \
865	    134.93 195.503 135.829 195.278 137.516 195.278 \
866	    138.303 195.166 139.315 195.166 140.214 195.053 \
867	    141.114 195.053 142.125 194.941 143.137 194.941 \
868	    144.149 194.941 145.161 194.941 146.173 194.941 \
869	    147.297 194.941 148.309 194.941 149.546 194.941 \
870	    150.67 194.941 151.907 194.941 152.919 195.053 \
871	    154.043 195.053 155.168 195.166 156.18 195.166 \
872	    157.192 195.278 158.091 195.391 159.103 195.391 \
873	    160.002 195.503 160.902 195.616 161.801 195.728 \
874	    162.588 195.84 163.375 196.065 164.162 196.178 \
875	    164.949 196.29 165.736 196.628 167.198 197.077 \
876	    168.547 197.527 169.672 197.977 170.571 198.426 \
877	    171.246 198.989 171.808 199.438 172.145 200.001 \
878	    172.258 200.9 171.92 201.575 171.246 202.249 170.009 \
879	    202.811 168.547 203.149 167.76 203.374 166.973 \
880	    203.598 166.186 203.823 165.399 204.048 164.5 \
881	    204.273 163.488 204.385 162.476 204.498 161.464 \
882	    204.61 160.34 204.723 159.103 200.001 159.103 \
883	    200.001 145.049 209.445 145.049 209.445 185.412 \
884	    206.184 185.412 -fill #000000 -outline {} -width 1  -tags logo
885
886    $c create polygon 148.506 261.305 148.506 \
887	    263.554 143.784 263.554 143.784 261.305 143.671 \
888	    260.068 143.334 259.394 142.772 259.056 141.985 \
889	    258.944 141.085 259.056 140.523 259.394 140.074 \
890	    261.755 140.074 263.104 140.523 264.678 141.085 \
891	    265.465 141.985 266.364 146.145 270.637 147.607 \
892	    271.874 148.506 272.998 148.843 274.01 148.956 \
893	    275.359 148.956 277.158 148.843 278.507 148.506 \
894	    279.632 147.944 280.643 147.157 281.43 146.482 \
895	    281.88 145.695 282.218 144.796 282.442 143.784 \
896	    282.667 142.659 282.78 141.535 282.78 140.298 282.78 \
897	    139.286 282.78 138.387 282.667 137.6 282.442 136.925 \
898	    282.218 136.363 281.88 135.576 281.093 135.014 \
899	    280.194 134.564 278.957 134.452 277.608 134.452 \
900	    275.359 139.624 275.359 139.624 277.608 139.736 \
901	    279.069 140.074 279.969 141.535 280.419 142.659 \
902	    280.081 143.334 279.519 143.671 278.62 143.784 \
903	    277.158 143.784 275.809 143.671 275.022 143.334 \
904	    274.235 142.772 273.448 141.985 272.548 137.263 \
905	    267.376 136.251 266.364 135.351 265.465 135.014 \
906	    264.565 134.902 263.554 134.902 261.755 135.014 \
907	    260.518 135.464 259.506 136.026 258.719 136.813 \
908	    257.932 137.488 257.595 138.275 257.145 139.174 \
909	    256.92 140.186 256.695 141.31 256.583 142.435 \
910	    256.583 143.447 256.583 144.458 256.583 145.245 \
911	    256.695 145.92 256.92 147.157 257.482 147.719 \
912	    258.157 148.169 258.944 148.394 260.068 148.506 \
913	    261.305 -fill #000000 -outline {} -width 1  -tags logo
914
915    $c create polygon 165.821 270.187 165.821 \
916	    276.708 165.821 277.833 165.708 278.957 165.483 \
917	    279.856 165.259 280.643 164.921 281.318 164.472 \
918	    281.88 163.909 282.218 163.235 282.555 162.448 \
919	    282.667 161.548 282.78 160.536 282.78 159.3 282.78 \
920	    158.175 282.78 157.051 282.78 156.151 282.667 \
921	    155.364 282.555 154.69 282.218 154.128 281.88 \
922	    153.678 281.318 153.341 280.643 153.116 279.856 \
923	    152.891 278.845 152.778 277.833 152.778 276.708 \
924	    152.778 270.187 152.778 269.063 152.891 268.051 \
925	    153.116 267.264 153.341 266.589 154.128 265.465 \
926	    155.364 264.678 156.151 264.453 157.051 264.228 \
927	    158.063 264.116 159.3 264.116 160.424 264.116 \
928	    161.548 264.228 162.448 264.453 163.235 264.678 \
929	    163.909 265.015 164.472 265.465 164.921 265.915 \
930	    165.483 267.264 165.708 268.051 165.821 269.063 \
931	    165.821 270.187 -fill #000000 -outline {} -width 1  -tags logo
932
933    $c create polygon 177.514 256.583 177.514 \
934	    258.494 177.064 258.494 176.165 258.606 175.715 \
935	    258.944 175.378 259.281 175.265 259.843 175.265 \
936	    264.565 177.514 264.565 177.514 266.927 175.265 \
937	    266.927 175.265 282.78 170.543 282.78 170.543 \
938	    266.927 168.632 266.927 168.632 264.565 170.543 \
939	    264.565 170.543 261.305 170.655 259.843 170.993 \
940	    258.606 171.442 257.707 171.892 257.032 173.579 \
941	    256.358 174.703 256.133 176.165 256.133 176.727 \
942	    256.133 177.064 256.133 177.514 256.583 -fill \
943	    #000000 -outline {} -width 1  -tags logo
944
945    $c create polygon 185.946 259.843 185.946 \
946	    264.565 188.757 264.565 188.757 266.927 185.946 \
947	    266.927 185.946 278.62 186.171 279.407 186.509 \
948	    279.969 187.071 280.306 187.858 280.419 188.307 \
949	    280.419 188.757 280.419 188.757 282.78 188.645 \
950	    282.78 188.307 282.78 187.183 282.78 186.509 282.78 \
951	    185.159 282.78 183.923 282.555 182.911 282.33 \
952	    182.236 281.88 181.786 281.206 181.561 280.419 \
953	    181.337 279.407 181.337 278.17 181.337 266.927 \
954	    179.425 266.927 179.425 264.565 181.337 264.565 \
955	    181.337 261.305 185.946 259.843 -fill #000000 \
956	    -outline {} -width 1  -tags logo
957
958    $c create polygon 190.219 264.565 194.379 \
959	    264.565 196.29 279.519 196.74 279.519 199.101 \
960	    264.565 204.723 264.565 207.084 279.519 207.534 \
961	    279.519 209.895 264.565 213.605 264.565 209.895 \
962	    282.78 204.723 282.78 201.912 267.376 201.462 \
963	    267.376 199.101 282.78 193.479 282.78 190.219 \
964	    264.565 -fill #000000 -outline {} -width 1  -tags logo
965
966    $c create polygon 229.121 269.175 229.121 282.78 \
967	    224.848 282.78 224.848 280.981 224.061 281.768 \
968	    223.049 282.33 221.925 282.667 220.688 282.78 \
969	    219.564 282.78 218.44 282.555 217.54 282.33 216.866 \
970	    281.88 216.528 281.318 216.191 280.531 216.079 \
971	    279.632 215.966 278.62 215.966 275.359 216.079 \
972	    274.347 216.978 272.998 217.877 272.548 218.44 \
973	    272.211 219.114 271.986 219.789 271.761 220.688 \
974	    271.536 221.588 271.424 222.6 271.311 223.724 \
975	    271.199 224.848 271.087 224.848 269.175 224.736 \
976	    267.826 224.399 266.927 223.612 266.477 222.487 \
977	    266.364 221.7 266.477 221.138 266.927 220.688 \
978	    268.726 220.688 269.175 216.416 269.175 216.528 \
979	    267.938 216.753 266.702 217.203 265.69 217.877 \
980	    265.015 218.44 264.678 219.114 264.453 219.901 \
981	    264.228 220.801 264.116 221.925 264.116 223.049 \
982	    264.116 224.061 264.116 225.073 264.116 225.86 \
983	    264.228 226.535 264.453 227.659 265.015 228.334 \
984	    265.69 228.783 266.702 229.008 267.938 229.121 \
985	    269.175 -fill #000000 -outline {} -width 1  -tags logo
986
987    $c create polygon 243.175 264.565 243.175 \
988	    266.927 242.725 266.927 241.601 266.927 240.701 \
989	    267.151 239.914 267.489 239.352 267.826 239.015 \
990	    268.276 238.678 268.95 238.565 269.737 238.453 \
991	    270.637 238.453 282.78 233.731 282.78 233.731 \
992	    264.565 238.453 264.565 238.453 265.915 239.352 \
993	    265.128 240.364 264.565 242.163 264.116 242.725 \
994	    264.565 243.175 264.565 -fill #000000 -outline {} \
995	    -width 1  -tags logo
996
997    $c create polygon 258.129 270.187 258.129 \
998	    274.347 249.696 274.347 249.696 278.17 249.809 \
999	    279.294 250.146 279.969 250.708 280.643 251.607 \
1000	    280.981 252.732 280.643 253.406 279.969 253.744 \
1001	    279.294 253.969 278.17 253.969 276.708 258.129 \
1002	    276.708 258.129 277.608 258.129 278.957 257.904 \
1003	    280.081 257.454 281.093 256.779 281.88 256.217 \
1004	    282.218 254.643 282.667 253.744 282.78 252.732 \
1005	    282.78 251.607 282.78 250.371 282.78 249.359 282.78 \
1006	    248.459 282.667 247.672 282.442 246.436 281.88 \
1007	    245.986 281.318 245.649 280.643 245.424 279.856 \
1008	    245.199 278.957 245.086 277.833 244.974 276.708 \
1009	    244.974 270.187 245.086 269.063 245.199 268.051 \
1010	    245.311 267.264 245.649 266.589 245.986 265.915 \
1011	    246.436 265.465 246.998 265.015 247.672 264.678 \
1012	    248.459 264.453 249.359 264.228 250.371 264.116 \
1013	    251.607 264.116 252.732 264.116 253.744 264.228 \
1014	    254.756 264.453 255.543 264.678 256.217 265.015 \
1015	    256.779 265.465 257.229 265.915 257.566 266.589 \
1016	    257.791 267.264 258.016 268.051 258.129 269.063 \
1017	    258.129 270.187 -fill #000000 -outline {} -width 1  -tags logo
1018
1019    $c create polygon 272.183 256.583 277.355 \
1020	    256.583 277.355 282.78 272.183 282.78 272.183 \
1021	    256.583 -fill #000000 -outline {} -width 1  -tags logo
1022
1023    $c create polygon 295.569 268.726 295.569 282.78 \
1024	    290.959 282.78 290.959 269.175 290.847 268.051 \
1025	    290.509 267.376 289.947 266.702 289.048 266.364 \
1026	    287.923 266.702 287.136 267.376 287.024 268.051 \
1027	    287.136 269.175 287.136 282.78 282.527 282.78 \
1028	    282.527 264.565 286.687 264.565 287.136 265.915 \
1029	    288.036 265.128 289.048 264.565 290.172 264.228 \
1030	    291.409 264.116 292.533 264.116 293.433 264.341 \
1031	    294.107 264.565 294.669 265.015 295.344 266.477 \
1032	    295.569 267.489 295.569 268.726 -fill #000000 \
1033	    -outline {} -width 1  -tags logo
1034
1035    $c create polygon 312.434 269.737 312.434 \
1036	    270.637 308.274 270.637 308.274 269.175 308.161 \
1037	    267.826 307.824 266.927 307.262 266.477 306.363 \
1038	    266.364 305.576 266.477 305.013 266.927 304.676 \
1039	    267.826 304.564 269.175 304.564 278.17 304.676 \
1040	    279.294 305.013 279.969 306.363 280.981 307.262 \
1041	    280.643 307.824 279.969 307.937 279.294 307.824 \
1042	    278.17 307.824 276.259 312.434 276.259 312.434 \
1043	    277.608 312.434 278.957 312.209 280.081 311.759 \
1044	    281.093 311.085 281.88 310.523 282.218 309.173 \
1045	    282.667 308.386 282.78 307.374 282.78 306.363 282.78 \
1046	    305.238 282.78 304.226 282.78 303.327 282.667 \
1047	    302.427 282.442 301.753 282.218 301.191 281.88 \
1048	    300.853 281.318 300.516 280.643 300.179 279.856 \
1049	    299.954 278.957 299.841 277.833 299.841 276.708 \
1050	    299.841 270.187 299.841 269.063 299.954 268.051 \
1051	    300.179 267.264 300.404 266.589 301.191 265.465 \
1052	    302.427 264.678 303.327 264.453 304.226 264.228 \
1053	    305.238 264.116 306.363 264.116 307.374 264.116 \
1054	    308.386 264.228 309.173 264.453 309.96 264.678 \
1055	    310.523 265.015 311.085 265.465 311.759 266.252 \
1056	    312.209 267.264 312.434 268.388 312.434 269.737 \
1057	    -fill #000000 -outline {} -width 1  -tags logo
1058
1059    $c create polygon 316.706 279.069 320.866 \
1060	    279.069 320.866 282.78 316.706 282.78 316.706 \
1061	    279.069 -fill #000000 -outline {} -width 1  -tags logo
1062
1063    $c create polygon 48.215 186.312 48.215 185.412 \
1064	    47.766 184.4 47.766 183.501 47.316 183.501 47.316 \
1065	    182.601 46.416 181.59 46.416 181.14 45.967 180.24 \
1066	    45.405 179.791 44.955 179.228 44.055 178.329 43.606 \
1067	    177.879 43.156 177.43 42.144 176.98 41.694 176.418 \
1068	    41.245 175.968 38.883 175.068 36.972 174.169 36.522 \
1069	    174.169 35.173 173.607 34.723 174.169 31.913 173.607 \
1070	    31.913 174.169 29.551 173.607 29.551 174.169 28.54 \
1071	    174.169 28.09 174.619 27.19 174.169 27.19 174.619 \
1072	    26.741 174.619 25.729 175.068 23.93 175.518 22.918 \
1073	    175.068 22.468 175.518 20.669 176.418 19.657 176.418 \
1074	    15.048 178.779 14.036 179.228 12.686 180.24 12.237 \
1075	    180.69 11.225 181.59 10.775 182.039 10.325 182.601 \
1076	    10.775 182.601 10.325 184.4 10.775 184.85 11.225 \
1077	    186.312 14.036 188.223 14.485 188.673 16.846 190.022 \
1078	    17.296 190.472 17.296 191.034 15.947 191.933 15.048 \
1079	    192.383 14.485 192.833 14.036 193.283 13.136 193.845 \
1080	    12.237 194.295 12.686 195.644 12.686 196.094 12.237 \
1081	    197.555 12.237 198.005 11.675 198.904 12.237 200.816 \
1082	    12.237 202.277 12.237 204.526 11.675 205.988 12.237 \
1083	    205.988 12.237 206.437 12.237 207.337 12.686 208.349 \
1084	    12.686 209.248 13.136 209.698 12.686 211.16 13.136 \
1085	    212.509 13.136 213.521 13.586 215.32 13.586 216.781 \
1086	    13.586 217.681 14.036 220.492 14.485 222.403 15.048 \
1087	    222.853 15.947 222.853 15.947 222.403 16.397 221.953 \
1088	    16.846 216.781 17.296 215.32 17.858 211.609 18.308 \
1089	    210.71 18.308 210.148 18.308 209.248 17.858 208.798 \
1090	    17.858 207.899 18.308 206.437 18.308 205.538 18.308 \
1091	    205.088 18.308 203.627 16.846 203.627 15.947 203.177 \
1092	    15.947 202.727 15.947 202.277 16.397 201.715 16.846 \
1093	    201.715 17.858 201.715 18.308 201.715 18.758 201.265 \
1094	    18.308 200.816 17.858 199.916 18.308 198.455 17.858 \
1095	    198.455 17.858 193.283 19.208 192.383 20.107 191.933 \
1096	    21.569 191.484 22.018 191.484 22.918 192.383 22.918 \
1097	    192.833 23.48 192.833 23.93 198.005 23.48 199.467 \
1098	    23.93 202.277 25.279 202.277 29.551 202.727 30.001 \
1099	    202.277 30.901 202.277 31.913 202.277 35.623 201.265 \
1100	    36.522 201.265 36.972 200.816 37.984 200.816 38.883 \
1101	    200.816 39.333 200.366 40.345 199.916 40.795 199.916 \
1102	    42.594 198.455 44.055 198.005 44.055 197.555 44.505 \
1103	    197.105 46.416 195.644 46.416 194.744 46.866 194.295 \
1104	    47.316 193.845 47.766 193.283 47.316 192.833 48.215 \
1105	    190.472 48.215 190.022 48.215 189.572 48.215 188.673 \
1106	    48.215 187.211 48.215 186.762 48.215 186.312 -fill \
1107	    $bg -outline {} -width 1  -tags logo
1108
1109    $c create polygon 76.886 142.688 81.046 142.688 \
1110	    82.508 142.35 83.407 140.889 83.632 140.327 83.969 \
1111	    138.865 84.082 137.965 84.194 137.066 84.307 136.054 \
1112	    84.307 134.93 84.307 133.805 84.307 132.456 84.194 \
1113	    131.332 84.082 130.208 83.857 129.308 83.632 128.409 \
1114	    83.407 127.734 82.395 126.272 81.046 125.823 76.886 \
1115	    125.823 76.886 142.688 -fill $bg -outline {} -width \
1116	    1  -tags logo
1117
1118    $c create polygon 97.461 148.309 97.461 149.546 \
1119	    97.461 150.783 97.461 152.02 97.574 153.144 97.574 \
1120	    154.268 97.686 155.28 97.686 156.405 97.799 157.416 \
1121	    97.799 158.316 97.911 159.328 98.023 160.227 98.136 \
1122	    161.127 98.361 162.701 98.473 163.488 98.586 164.275 \
1123	    98.698 164.949 98.81 165.736 99.373 167.535 99.822 \
1124	    169.109 100.497 170.234 101.059 171.133 101.846 \
1125	    171.583 102.633 171.808 104.095 171.133 104.769 \
1126	    170.234 105.332 169.109 105.894 167.535 106.343 \
1127	    165.736 106.456 164.949 106.681 164.275 106.793 \
1128	    163.488 106.906 162.701 107.018 161.914 107.243 \
1129	    160.227 107.355 159.328 107.355 158.316 107.468 \
1130	    157.416 107.58 156.405 107.58 155.28 107.693 154.268 \
1131	    107.693 153.144 107.693 152.02 107.693 150.783 \
1132	    107.805 149.546 107.805 148.309 107.805 147.073 \
1133	    107.693 145.836 107.693 144.711 107.693 143.587 \
1134	    107.693 142.463 107.58 141.338 107.58 140.327 \
1135	    107.468 139.315 107.355 138.303 107.355 137.403 \
1136	    107.243 136.504 107.131 135.604 106.906 133.918 \
1137	    106.793 133.131 106.681 132.456 106.456 131.669 \
1138	    106.343 130.995 105.894 129.196 105.332 127.622 \
1139	    104.769 126.497 104.095 125.598 103.42 125.148 \
1140	    102.633 124.923 101.846 125.148 101.059 125.598 \
1141	    100.497 126.497 99.822 127.622 99.373 129.196 98.81 \
1142	    130.995 98.698 131.669 98.586 132.456 98.473 133.131 \
1143	    98.361 133.918 98.248 134.817 98.023 136.504 97.911 \
1144	    137.403 97.799 138.303 97.799 139.315 97.686 140.327 \
1145	    97.686 141.338 97.574 142.463 97.574 143.587 97.461 \
1146	    144.711 97.461 145.836 97.461 147.073 97.461 148.309 \
1147	    -fill $bg -outline {} -width 1  -tags logo
1148
1149    $c create polygon 122.309 156.292 126.919 \
1150	    156.292 124.67 130.545 122.309 156.292 -fill $bg \
1151	    -outline {} -width 1  -tags logo
1152
1153    $c create polygon 142.435 142.688 146.145 \
1154	    142.688 147.607 142.35 148.506 140.889 148.731 \
1155	    140.327 149.068 138.865 149.181 137.965 149.293 \
1156	    137.066 149.405 136.054 149.405 134.93 149.405 \
1157	    133.805 149.405 132.456 149.405 131.332 149.405 \
1158	    130.208 149.293 129.308 149.181 128.409 148.956 \
1159	    127.734 148.056 126.272 146.595 125.823 142.435 \
1160	    125.823 142.435 142.688 -fill $bg -outline {} -width \
1161	    1  -tags logo
1162
1163    $c create polygon 111.515 228.924 111.515 \
1164	    227.575 111.066 225.664 108.705 221.391 108.255 \
1165	    220.042 108.255 219.142 108.255 218.58 108.255 \
1166	    218.13 107.805 217.681 106.793 218.58 104.994 \
1167	    220.941 104.432 221.953 102.633 224.202 102.183 \
1168	    224.764 101.621 225.214 99.822 228.474 97.461 \
1169	    233.197 97.461 234.096 97.461 234.995 97.911 235.445 \
1170	    98.361 236.007 99.822 236.457 102.633 236.457 \
1171	    104.432 235.445 105.894 234.995 106.343 234.546 \
1172	    106.793 234.546 107.805 233.646 110.616 230.835 \
1173	    111.515 229.824 111.515 229.374 111.515 228.924 \
1174	    -fill $bg -outline {} -width 1  -tags logo
1175
1176    $c create polygon 161.211 269.175 160.986 \
1177	    267.826 160.649 266.927 160.199 266.477 159.3 \
1178	    266.364 158.4 266.477 157.838 266.927 157.613 \
1179	    267.826 157.388 269.175 157.388 278.17 157.613 \
1180	    279.294 157.838 279.969 159.3 280.981 160.199 \
1181	    280.643 160.649 279.969 160.986 279.294 161.211 \
1182	    278.17 161.211 269.175 -fill $bg -outline {} -width \
1183	    1  -tags logo
1184
1185    $c create polygon 224.848 273.448 223.836 \
1186	    273.448 222.825 273.56 222.15 273.673 221.588 \
1187	    273.897 220.913 274.684 220.688 275.809 220.688 \
1188	    278.17 220.801 279.294 221.138 279.969 221.7 280.643 \
1189	    222.487 280.981 223.612 280.643 224.399 279.969 \
1190	    224.736 279.294 224.848 278.17 224.848 273.448 -fill \
1191	    $bg -outline {} -width 1  -tags logo
1192
1193    $c create polygon 253.969 269.175 253.744 \
1194	    267.826 253.406 266.927 252.732 266.477 251.607 \
1195	    266.364 250.708 266.477 250.146 266.927 249.696 \
1196	    269.175 249.696 272.548 253.969 272.548 253.969 \
1197	    269.175 -fill $bg -outline {} -width 1  -tags logo
1198
1199}
1200
1201#***********************************************************************
1202# %PROCEDURE: LoadConnectionInfo
1203# %ARGUMENTS:
1204#  None
1205# %RETURNS:
1206#  Nothing
1207# %DESCRIPTION:
1208#  Loads the connection information into the global ConnectionInfo variable
1209#***********************************************************************
1210proc LoadConnectionInfo {} {
1211    global ConnectionInfoFile ConnectionInfo PasswordFile
1212    set ConnectionInfo {}
1213    if {![file exists $ConnectionInfoFile]} {
1214	return
1215    }
1216    set problem [catch {
1217	set fp [open $ConnectionInfoFile "r"]
1218	while {1} {
1219	    if {[gets $fp line] < 0} {
1220		break
1221	    }
1222	    set line [string trim $line]
1223	    if {[string match "#*" $line]} {
1224		continue
1225	    }
1226	    if {"$line" == ""} {
1227		continue
1228	    }
1229	    set ConnectionInfo $line
1230	    break
1231	}
1232	close $fp
1233    } err]
1234    if {$problem} {
1235	tk_dialog .err Error "[m {Error loading configuration file:}] $err" error 0 OK
1236    }
1237    # Try loading and merging passwords if the password file is readable
1238    set passwords {}
1239    if {![file readable $PasswordFile]} {
1240	return
1241    }
1242
1243    set fp [open $PasswordFile "r"]
1244    while {1} {
1245	if {[gets $fp line] < 0} {
1246	    break
1247	}
1248	set line [string trim $line]
1249	if {[string match "#*" $line]} {
1250	    continue
1251	}
1252	if {"$line" == ""} {
1253	    continue
1254	}
1255	set passwords $line
1256	break
1257    }
1258    close $fp
1259
1260    # Merge passwords
1261    foreach thing $passwords {
1262	set name [value $thing ConnectionName]
1263	set password [value $thing Password]
1264	set conn [GetConnection $name]
1265	if {"$conn" != ""} {
1266	    lappend conn Password $password
1267	    ReplaceConnection $conn
1268	}
1269    }
1270}
1271
1272#***********************************************************************
1273# %PROCEDURE: GetConnection
1274# %ARGUMENTS:
1275#  name -- name of connection
1276# %RETURNS:
1277#  key/value pair listing connection configuration, or "" if not found.
1278#***********************************************************************
1279proc GetConnection { name } {
1280    global ConnectionInfo
1281    foreach thing $ConnectionInfo {
1282	if {[value $thing ConnectionName] == "$name"} {
1283	    return $thing
1284	}
1285    }
1286    return ""
1287}
1288
1289
1290#***********************************************************************
1291# %PROCEDURE: DeleteConnection
1292# %ARGUMENTS:
1293#  name -- name of connection
1294# %RETURNS:
1295#  Nothing, but deletes connection named "$name"
1296#***********************************************************************
1297proc DeleteConnection { name } {
1298    global ConnectionInfo ConfigDir
1299    set newInfo {}
1300    set found 0
1301    foreach thing $ConnectionInfo {
1302	if {[value $thing ConnectionName] == "$name"} {
1303	    set found 1
1304	} else {
1305	    lappend newInfo $thing
1306	}
1307    }
1308    if {!$found} {
1309	return
1310    }
1311    set ConnectionInfo $newInfo
1312    SaveConnectionInfo
1313
1314    # Delete the config file
1315    set fname [file join $ConfigDir conf.$name]
1316    catch { file delete $fname }
1317
1318    BuildConnectionMenu
1319    if {[GetCurrentConnection] == $name} {
1320	if {[llength $ConnectionInfo] == 0} {
1321	    SwitchConnection ""
1322	} else {
1323	    set name [value [lindex $ConnectionInfo 0] ConnectionName]
1324	    SwitchConnection $name
1325	}
1326    }
1327}
1328
1329#***********************************************************************
1330# %PROCEDURE: ReplaceConnection
1331# %ARGUMENTS:
1332#  conn -- new name/value pairs
1333# %RETURNS:
1334#  Nothing, but replaces connection in ConnectionInfo.  If no such
1335#  connection exists, appends new connection.
1336#***********************************************************************
1337proc ReplaceConnection { conn } {
1338    global ConnectionInfo
1339    set name [value $conn ConnectionName]
1340    set newInfo {}
1341    set found 0
1342    foreach thing $ConnectionInfo {
1343	if {[value $thing ConnectionName] == "$name"} {
1344	    lappend newInfo $conn
1345	    set found 1
1346	} else {
1347	    lappend newInfo $thing
1348	}
1349    }
1350    if {!$found} {
1351	lappend newInfo $conn
1352    }
1353    set ConnectionInfo $newInfo
1354}
1355
1356proc DeletePPPoEConnection {} {
1357    set conn [GetCurrentConnection]
1358    if {"$conn" == ""} {
1359	return
1360    }
1361    set ans [tk_dialog .confirm "[m {Confirm Deletion - RP-PPPoE}]" "[m {Are you sure you wish to delete the connection}] `$conn'?" warning 0 No Yes]
1362    if {$ans} {
1363	DeleteConnection $conn
1364    }
1365}
1366
1367#***********************************************************************
1368# %PROCEDURE: CreateMainDialog
1369# %ARGUMENTS:
1370#  None
1371# %RETURNS:
1372#  Nothing
1373# %DESCRIPTION:
1374#  Creates the main window
1375#***********************************************************************
1376proc CreateMainDialog {} {
1377    global ConnectionInfoFile
1378    global ConnectionInfo
1379    global Admin
1380    wm title . "RP-PPPoE"
1381    wm iconname . "PPPoE"
1382    frame .f1
1383    label .l1 -text "Connection: "
1384    menubutton .m1 -text "" -indicatoron 1 -menu .m1.menu -relief raised
1385    menu .m1.menu -tearoff 0
1386    pack .l1 .m1 -in .f1 -side left -expand 0 -fill x
1387    canvas .c -width 40 -height 20
1388    pack .c -in .f1 -side left -expand 0 -fill none
1389
1390    # Draw the LED's
1391    .c create rectangle 10 1 30 8 -outline "#808080" -fill "#A0A0A0" -tags xmitrect
1392    .c create rectangle 10 10 30 18 -outline "#808080" -fill "#A0A0A0" -tags recvrect
1393
1394    frame .buttons
1395    button .start -text "[m {Start}]" -command "StartPPPoEConnection"
1396    button .stop -text "[m {Stop}]" -command "StopPPPoEConnection"
1397    button .exit -text "[m {Exit}]" -command "exit"
1398    canvas .graph -width 1 -height 1
1399    if {[file writable $ConnectionInfoFile]} {
1400	set Admin 1
1401	pack .f1 -side top -expand 1 -fill both
1402	pack .buttons -side top -expand 0 -fill x
1403	button .delete -text "[m {Delete}]" -command "DeletePPPoEConnection"
1404	button .new -text "[m {New Connection...}]" -command "NewPPPoEConnection"
1405	button .props -text "[m {Properties...}]" -command "EditConnectionProps"
1406	pack .graph -in .f1 -side left -expand 1 -fill both
1407	pack .start .stop .delete .props .new .exit -in .buttons -side left -expand 0 -fill none
1408    } else {
1409	set Admin 0
1410	pack .f1 -side top -expand 0 -fill x
1411	pack .buttons -side top -expand 1 -fill both
1412	pack .start .stop .exit -in .buttons -side left -expand 0 -fill none
1413	pack .graph -in .buttons -side left -expand 1 -fill both
1414    }
1415
1416    LoadConnectionInfo
1417    BuildConnectionMenu
1418    # If no connections exist, pop up new connection dialog
1419    if {[llength $ConnectionInfo] == 0} {
1420	SwitchConnection ""
1421	if {$Admin} {
1422	    update idletasks
1423	    NewPPPoEConnection
1424	} else {
1425	    tk_dialog .note [m {Note}] "[m {Note: There are no connections defined.  You must run this program as root to define connections}]" warning 0 OK
1426	}
1427    } else {
1428	set con [lindex $ConnectionInfo 0]
1429	set name [value $con ConnectionName]
1430	SwitchConnection $name
1431    }
1432}
1433
1434#***********************************************************************
1435# %PROCEDURE: GetCurrentConnection
1436# %ARGUMENTS:
1437#  None
1438# %RETURNS:
1439#  The name of the current connection in the GUI.
1440#***********************************************************************
1441proc GetCurrentConnection {} {
1442    .m1 cget -text
1443}
1444
1445#***********************************************************************
1446# %PROCEDURE: value
1447# %ARGUMENTS:
1448#  lst -- a list of key/value pairs
1449#  key -- key we're looking for
1450# %RETURNS:
1451#  value corresponding to $key, or "" if not found.
1452#***********************************************************************
1453proc value { lst key } {
1454    set idx [lsearch -exact $lst $key]
1455    if {$idx >= 0} {
1456	return [lindex $lst [expr $idx+1]]
1457    }
1458    return ""
1459}
1460
1461#***********************************************************************
1462# %PROCEDURE: SwitchConnection
1463# %ARGUMENTS:
1464#  name -- new connection name
1465# %DESCRIPTION:
1466#  Makes $name the active connection
1467#***********************************************************************
1468proc SwitchConnection { name } {
1469    .m1 configure -text $name
1470    SetButtonStates
1471    UpdateConnectionState 0
1472}
1473
1474#***********************************************************************
1475# %PROCEDURE: EditConnectionProps
1476# %ARGUMENTS:
1477#  None
1478# %DESCRIPTION:
1479#  Pops up edit window for current connection
1480#***********************************************************************
1481proc EditConnectionProps {} {
1482    global ConnectionInfo
1483    set conn [GetCurrentConnection]
1484    NewPPPoEConnection $conn
1485}
1486
1487#***********************************************************************
1488# %PROCEDURE: FillConnectionGui
1489# %ARGUMENTS:
1490#  w -- connection property GUI
1491#  name -- name of connection
1492# %DESCRIPTION:
1493#  Fills GUI with values corresponding to $name.
1494#***********************************************************************
1495proc FillConnectionGui { w name } {
1496    global ConnectionInfo
1497    set found [GetConnection $name]
1498    if {"$found" != ""} {
1499	ListToSetupGui $w $found
1500    }
1501}
1502
1503#***********************************************************************
1504# %PROCEDURE: BuildConnectionMenu
1505# %ARGUMENTS:
1506#  None
1507# %RETURNS:
1508#  Nothing
1509# %DESCRIPTION:
1510#  Builds the connection menu
1511#***********************************************************************
1512proc BuildConnectionMenu {} {
1513    global ConnectionInfo
1514    .m1.menu delete 0 end
1515    foreach connection $ConnectionInfo {
1516	set name [value $connection ConnectionName]
1517	.m1.menu add command -label $name -command [list SwitchConnection $name]
1518    }
1519    .m1.menu add separator
1520    .m1.menu add command -label "User's Manual" -command Help
1521}
1522
1523#***********************************************************************
1524# %PROCEDURE: SetButtonStates
1525# %ARGUMENTS:
1526#  None
1527# %RETURNS:
1528#  Nothing
1529# %DESCRIPTION:
1530#  Enables or disables buttons, as appropriate
1531#***********************************************************************
1532proc SetButtonStates {} {
1533    global Admin
1534    set conn [GetCurrentConnection]
1535    if {"$conn" == ""} {
1536	.start configure -state disabled
1537	.stop configure -state disabled
1538	catch {
1539	    .delete configure -state disabled
1540	    .props configure -state disabled
1541	    .new configure -state normal
1542	}
1543    } else {
1544	foreach {startstop updown interface} [GetConnectionStatus $conn] {break}
1545	if {"$startstop" == "started"} {
1546	    .start configure -state disabled
1547	    .stop configure -state normal
1548	} else {
1549	    .start configure -state normal
1550	    .stop configure -state disabled
1551	}
1552	catch {
1553	    .delete configure -state normal
1554	    .props configure -state normal
1555	    .new configure -state normal
1556	}
1557	if {!$Admin} {
1558	    set ok [value [GetConnection $conn] NonrootOK]
1559	    if {!$ok} {
1560		.start configure -state disabled
1561		.stop configure -state disabled
1562	    }
1563	}
1564    }
1565}
1566
1567#***********************************************************************
1568# %PROCEDURE: GetEthernetInterfaces
1569# %ARGUMENTS:
1570#  None
1571# %RETURNS:
1572#  A list of Ethernet interfaces
1573#***********************************************************************
1574proc GetEthernetInterfaces {} {
1575    set ifs {}
1576    set fp [open "|/sbin/ifconfig" "r"]
1577    while {[gets $fp line] >= 0} {
1578	if {[regexp {^eth[0-9]+} $line eth]} {
1579	    lappend ifs $eth
1580	}
1581    }
1582    return $ifs
1583}
1584
1585#***********************************************************************
1586# %PROCEDURE: StartPPPoEConnection
1587# %ARGUMENTS:
1588#  None
1589# %RETURNS:
1590#  Nothing
1591# %DESCRIPTION:
1592#  Starts currently-selected PPPoE connection.
1593#***********************************************************************
1594proc StartPPPoEConnection {} {
1595    global Wrapper
1596    global StartState
1597    global UpdateToken
1598
1599    set conn [GetCurrentConnection]
1600    if {"$conn" == ""} {
1601	return
1602    }
1603
1604    if {"$UpdateToken" != ""} {
1605	after cancel $UpdateToken
1606	set UpdateToken ""
1607    }
1608
1609    catch { unset StartState }
1610    set StartState(chars) ""
1611    set StartState(status) ""
1612    set StartState(msg) ""
1613    set StartState(flip) 0
1614
1615    set fp [open "|$Wrapper start $conn" "r"]
1616
1617    # Set fileevent
1618    fileevent $fp readable [list StartFPReadable $fp]
1619
1620    LockGui $fp
1621    vwait StartState(status)
1622    UnlockGui
1623
1624    if {$StartState(status) == "failed"} {
1625	tk_dialog .err Error "[m {Error starting connection:}] $StartState(msg)" error 0 OK
1626    }
1627    SetButtonStates
1628    UpdateConnectionState 0
1629}
1630
1631proc LockGui { fp } {
1632    .start configure -state disabled
1633    .stop configure -state normal -command [list AbortConnection $fp]
1634    .exit configure -state disabled
1635    .m1 configure -state disabled
1636    grab set .stop
1637}
1638
1639proc UnlockGui {} {
1640    .start configure -state normal
1641    .stop configure -state disabled -command StopPPPoEConnection
1642    .exit configure -state normal
1643    .m1 configure -state normal
1644    grab release .stop
1645}
1646
1647proc AbortConnection { fp } {
1648    global StartState
1649    catch { StopPPPoEConnection }
1650    catch { close $fp }
1651    set StartState(msg) "[m {Connection aborted by user}]"
1652    set StartState(status) "[m {failed}]"
1653}
1654
1655#***********************************************************************
1656# %PROCEDURE: StartFPReadable
1657# %ARGUMENTS:
1658#  fp -- file handle
1659# %RETURNS:
1660#  Nothing
1661# %DESCRIPTION:
1662#  Called when the "pppoe-start" file handle is readable.
1663#***********************************************************************
1664proc StartFPReadable { fp } {
1665    global StartState
1666    set char [read $fp 1]
1667    if {$char == ""} {
1668	set uhoh [catch {close $fp} err]
1669	if {$uhoh} {
1670	    set StartState(status) "[m {failed}]"
1671	    set StartState(msg) $err
1672	} else {
1673	    set StartState(status) "[m {succeeded}]"
1674	}
1675	return
1676    }
1677    append StartState(chars) $char
1678    if {$StartState(flip)} {
1679	ConnectionStateDown
1680    } else {
1681	ConnectionStateOff
1682    }
1683    set StartState(flip) [expr 1 - $StartState(flip)]
1684}
1685
1686#***********************************************************************
1687# %PROCEDURE: StopPPPoEConnection
1688# %ARGUMENTS:
1689#  None
1690# %RETURNS:
1691#  Nothing
1692# %DESCRIPTION:
1693#  Stops currently-selected PPPoE connection.
1694#***********************************************************************
1695proc StopPPPoEConnection {} {
1696    global Wrapper
1697    set conn [GetCurrentConnection]
1698    if {"$conn" == ""} {
1699	return
1700    }
1701    set fp [open "|$Wrapper stop $conn" "r"]
1702    while {1} {
1703	set char [read $fp 1]
1704	if {"$char" == ""} {
1705	    break;
1706	}
1707    }
1708    set uhoh [catch {close $fp} err]
1709    if {$uhoh} {
1710	# Ignore a common error
1711	if {![string match "*appears to have died*" $err]} {
1712	    tk_dialog .err Error "[m {Error stopping connection:}] $err" error 0 OK
1713	}
1714    }
1715    SetButtonStates
1716    UpdateConnectionState 0
1717}
1718
1719#***********************************************************************
1720# %PROCEDURE: NewPPPoEConnection
1721# %ARGUMENTS:
1722#  name -- if supplied, we're editing the existing connection "name"
1723# %RETURNS:
1724#  Nothing
1725# %DESCRIPTION:
1726#  Creates a new PPPoE connection
1727#***********************************************************************
1728proc NewPPPoEConnection {{name ""}} {
1729    set w .newcon
1730    if {[winfo exists $w]} {
1731	wm deiconify $w
1732	raise $w
1733	return
1734    }
1735
1736    toplevel $w
1737    if {"$name" == ""} {
1738	wm title $w "[m {New Connection}] - RP-PPPoE"
1739	wm iconname $w "[m {New Connection}]"
1740    } else {
1741	wm title $w "[m {Edit Connection}] - RP-PPPoE"
1742	wm iconname $w "[m {Edit Connection}]"
1743    }
1744    wm withdraw $w
1745
1746    tabnotebook_create $w.tn
1747    set basic [tabnotebook_page $w.tn "[m {Basic}]"]
1748    set interface [tabnotebook_page $w.tn "[m {NIC and DNS}]"]
1749    set opts [tabnotebook_page $w.tn "[m {Options}]"]
1750    set advanced [tabnotebook_page $w.tn "[m {Advanced}]"]
1751
1752    # ----------- BASIC PAGE -------------
1753    label $w.lconName -text "[m {Connection Name:}] " -anchor e
1754    if {"$name" != ""} {
1755	label $w.conName -text $name -anchor w
1756    } else {
1757	entry $w.conName -width 15
1758	RegisterHelpWindow $w.lconName "[m {Enter a name for this connection.  It can contain letters, numbers, undescores and the minus-sign.}]" $w.help
1759	RegisterHelpWindow $w.conName "[m {Enter a name for this connection.  It can contain letters, numbers, undescores and the minus-sign.}]" $w.help
1760    }
1761
1762    label $w.luser -text "[m {User Name:}] " -anchor e
1763    entry $w.user -width 15
1764    RegisterHelpWindow $w.luser "[m {Enter your user name.  Do not add a domain-name after the user name.}]" $w.help
1765    RegisterHelpWindow $w.user "[m {Enter your user name.  Do not add a domain-name after the user name.}]" $w.help
1766
1767    label $w.lnet -text "[m {Network:}] " -anchor e
1768    entry $w.network -width 15
1769    RegisterHelpWindow $w.lnet "[m {Some ISP's require you to enter their domain-name here (e.g. "sympatico.ca").}]" $w.help
1770    RegisterHelpWindow $w.network "[m {Some ISP's require you to enter their domain-name here (e.g. "sympatico.ca").}]" $w.help
1771
1772    label $w.lpass -text "[m {Password:}] " -anchor e
1773    entry $w.pass -width 15 -show "*"
1774    RegisterHelpWindow $w.lpass "[m {Enter your password.}]" $w.help
1775    RegisterHelpWindow $w.pass "[m {Enter your password.}]" $w.help
1776
1777    grid $w.lconName $w.conName -in $basic -sticky nsew
1778    grid $w.luser $w.user -in $basic -sticky nsew
1779    grid $w.lnet $w.network -in $basic -sticky nsew
1780    grid $w.lpass $w.pass -in $basic -sticky nsew
1781    grid columnconfigure $basic 1 -weight 1
1782
1783    # ----------- INTERFACES PAGE -------------
1784    set ifs {}
1785    catch {set ifs [GetEthernetInterfaces]}
1786
1787    label $w.lifname -text "[m {Ethernet Interface:}] " -anchor e
1788    entry $w.ifname -width 8
1789    RegisterHelpWindow $w.lifname "[m {Enter Ethernet interface to which DSL modem is attached.}]" $w.help
1790    RegisterHelpWindow $w.ifname "[m {Enter Ethernet interface to which DSL modem is attached.}]" $w.help
1791
1792    if {[llength $ifs] > 0} {
1793	menubutton $w.ifmb -relief raised -text "..." -menu $w.ifmb.menu
1794	RegisterHelpWindow $w.ifmb "[m {Browse detected Ethernet interface names.}]" $w.help
1795	menu $w.ifmb.menu -tearoff 0
1796	foreach if $ifs {
1797	    $w.ifmb.menu add command -label $if -command "$w.ifname delete 0 end; $w.ifname insert end [list $if]"
1798	}
1799	grid $w.lifname $w.ifname $w.ifmb -in $interface -sticky nsew
1800    } else {
1801	grid $w.lifname $w.ifname - -in $interface -sticky nsew
1802    }
1803
1804    label $w.ldns -text "[m {DNS Setup:}] " -anchor e
1805    menubutton $w.dns -text "[m {From Server}]" -menu $w.dns.menu -relief raised -indicatoron 1
1806    menu $w.dns.menu -tearoff 0
1807    foreach thing [list "[m {From Server}]" "[m {Specify}]" "[m {Do not Adjust}]"] {
1808	$w.dns.menu add command -label $thing -command [list SetDNSOption $w $thing]
1809    }
1810    RegisterHelpWindow $w.ldns [m "DNS server options:\n'From Server'   - Let PPPoE server specify DNS servers\n'Specify'       - Enter IP addresses of DNS servers yourself\n'Do not Adjust' - Leave your DNS setup alone."] $w.help
1811    RegisterHelpWindow $w.dns [m "DNS server options:\n'From Server'   - Let PPPoE server specify DNS servers\n'Specify'       - Enter IP addresses of DNS servers yourself\n'Do not Adjust' - Leave your DNS setup alone."] $w.help
1812
1813    label $w.ldns1 -text "[m {Primary DNS:}] " -anchor e
1814    entry $w.dns1 -width 16
1815    RegisterHelpWindow $w.ldns1 "[m {Enter the IP address of the primary DNS server.}]" $w.help
1816    RegisterHelpWindow $w.dns1 "[m {Enter the IP address of the primary DNS server.}]" $w.help
1817    label $w.ldns2 -text "[m {Secondary DNS:}] " -anchor e
1818    entry $w.dns2 -width 16
1819    RegisterHelpWindow $w.ldns2 "[m {Enter the IP address of the secondary DNS server.}]" $w.help
1820    RegisterHelpWindow $w.dns2 "[m {Enter the IP address of the secondary DNS server.}]" $w.help
1821
1822    SetDNSOption $w "[m {From Server}]"
1823    grid $w.ldns $w.dns - -in $interface -sticky nsew
1824    grid $w.ldns1 $w.dns1 - -in $interface -sticky nsew
1825    grid $w.ldns2 $w.dns2 - -in $interface -sticky nsew
1826
1827    # If only one Ethernet interface, select it by default
1828    if {[llength $ifs] == 1} {
1829	$w.ifname insert end [lindex $ifs 0]
1830    }
1831
1832    grid columnconfigure $interface 1 -weight 1
1833    # ----------- OPTS PAGE -------------
1834    checkbutton $w.nonroot -text "[m {Allow use by non-root users}]" -variable OPTS(nonroot) -anchor w
1835    RegisterHelpWindow $w.nonroot "[m {If enabled, ordinary users can start and stop this connection.}]" $w.help
1836    checkbutton $w.sync -text "[m {Use synchronous PPP}]" -variable OPTS(sync) -anchor w
1837    RegisterHelpWindow $w.sync "[m {Use synchronous PPP (recommended -- easier on the CPU.)}]" $w.help
1838    label $w.lfw -text "[m {Firewalling:}] " -anchor e
1839    if {[llength $ifs] == 1} {
1840	set defaultFW "[m {Stand-Alone}]"
1841    } else {
1842	set defaultFW "[m {Masquerading}]"
1843    }
1844    menubutton $w.fw -text $defaultFW -menu $w.fw.menu -indicatoron 1 -relief raised
1845    menu $w.fw.menu -tearoff 0
1846    foreach type [list [m "Stand-Alone"] [m "Masquerading"] [m "None"]] {
1847	$w.fw.menu add command -label $type -command [list $w.fw configure -text $type]
1848    }
1849
1850    RegisterHelpWindow $w.lfw [m "Firewalling options:\nStand-Alone  - A stand-alone machine.\nMasquerading - A gateway machine used for Internet sharing.\nNone         - Use if you already have your own firewall rules or want to run servers."] $w.help
1851    RegisterHelpWindow $w.fw [m "Firewalling options:\nStand-Alone  - A stand-alone machine.\nMasquerading - A gateway machine used for Internet sharing.\nNone         - Use if you already have your own firewall rules or want to run servers."] $w.help
1852    grid $w.nonroot - -in $opts -sticky nsew
1853    grid $w.sync - -in $opts -sticky nsew
1854    grid $w.lfw $w.fw -in $opts -sticky nsw
1855    grid columnconfigure $opts 1 -weight 1
1856
1857    # ----------- ADVANCED PAGE -------------
1858    label $w.lsn -text "[m {Service-Name:}] " -anchor e
1859    entry $w.servicename -width 24
1860
1861    label $w.lac -text "[m {AC-Name:}] " -anchor e
1862    entry $w.acname -width 24
1863
1864    RegisterHelpWindow $w.lac [m "Enter access concentrator name if required.  Most ISPs do not require this; try leaving it blank."] $w.help
1865    RegisterHelpWindow $w.acname [m "Enter access concentrator name if required.  Most ISPs do not require this; try leaving it blank."] $w.help
1866    grid $w.lsn $w.servicename -in $advanced -sticky nsew
1867    grid $w.lac $w.acname -in $advanced -sticky nsew
1868    RegisterHelpWindow $w.lsn [m "Enter service name if required.  Most ISPs do not require this; try leaving it blank."] $w.help
1869    RegisterHelpWindow $w.servicename [m "Enter service name if required.  Most ISPs do not require this; try leaving it blank."] $w.help
1870
1871    grid columnconfigure $advanced 1 -weight 1
1872
1873    # ----------- BUTTONS -------------
1874    frame $w.buttons
1875    button $w.ok -text [m "OK"] -command [list NewPPPoEConnectionOK $name $w]
1876    button $w.cancel -text [m "Cancel"] -command [list destroy $w]
1877    pack $w.ok $w.cancel -in $w.buttons -expand 0 -fill none -side left
1878
1879    pack $w.tn -side top -expand 1 -fill both
1880
1881    text $w.help -width 60 -wrap word -state disabled -height 6
1882    pack $w.help -side top -expand 0 -fill both
1883    pack $w.buttons -side top -expand 0 -fill x
1884
1885    # If we're editing existing connection, fill GUI with current values
1886    if {"$name" != ""} {
1887	FillConnectionGui $w $name
1888    }
1889    wm deiconify $w
1890    update idletasks
1891    raise $w
1892}
1893
1894#***********************************************************************
1895# %PROCEDURE: SetDNSOption
1896# %ARGUMENTS:
1897#  w -- connection-editing window
1898#  opt -- value of DNS option
1899# %RETURNS:
1900#  Nothing
1901# %DESCRIPTION:
1902#  Adjusts GUI for specified option
1903#***********************************************************************
1904proc SetDNSOption { w opt } {
1905    $w.dns configure -text $opt
1906    if {"$opt" == "[m Specify]"} {
1907	$w.dns1 configure -state normal -background white
1908	$w.dns2 configure -state normal -background white
1909    } else {
1910	$w.dns1 configure -state disabled -background "#d9d9d9"
1911	$w.dns2 configure -state disabled -background "#d9d9d9"
1912    }
1913}
1914
1915# ----------------------------------------------------------------------
1916# Tabbed notebook code from "Effective Tcl/Tk Programming"
1917# ----------------------------------------------------------------------
1918#  EXAMPLE: tabnotebook that can dial up pages
1919# ----------------------------------------------------------------------
1920#  Effective Tcl/Tk Programming
1921#    Mark Harrison, DSC Communications Corp.
1922#    Michael McLennan, Bell Labs Innovations for Lucent Technologies
1923#    Addison-Wesley Professional Computing Series
1924# ======================================================================
1925#  Copyright (c) 1996-1997  Lucent Technologies Inc. and Mark Harrison
1926# ======================================================================
1927
1928option add *Tabnotebook.tabs.background #666666 widgetDefault
1929option add *Tabnotebook.margin 6 widgetDefault
1930option add *Tabnotebook.tabColor #a6a6a6 widgetDefault
1931option add *Tabnotebook.activeTabColor #d9d9d9 widgetDefault
1932option add *Tabnotebook.tabFont \
1933    -*-helvetica-bold-r-normal--*-120-* widgetDefault
1934
1935proc tabnotebook_create {win} {
1936    global tnInfo
1937
1938    frame $win -class Tabnotebook
1939    canvas $win.tabs -highlightthickness 0
1940    pack $win.tabs -fill x
1941
1942    notebook_create $win.notebook
1943    pack $win.notebook -expand yes -fill both
1944
1945    set tnInfo($win-tabs) ""
1946    set tnInfo($win-current) ""
1947    set tnInfo($win-pending) ""
1948    return $win
1949}
1950
1951proc tabnotebook_page {win name} {
1952    global tnInfo
1953
1954    set page [notebook_page $win.notebook $name]
1955    lappend tnInfo($win-tabs) $name
1956
1957    if {$tnInfo($win-pending) == ""} {
1958	set id [after idle [list tabnotebook_refresh $win]]
1959	set tnInfo($win-pending) $id
1960    }
1961    return $page
1962}
1963
1964proc tabnotebook_refresh {win} {
1965    global tnInfo
1966
1967    $win.tabs delete all
1968
1969    set margin [option get $win margin Margin]
1970    set color [option get $win tabColor Color]
1971    set font [option get $win tabFont Font]
1972    set x 2
1973    set maxh 0
1974
1975    foreach name $tnInfo($win-tabs) {
1976	set id [$win.tabs create text \
1977	    [expr $x+$margin+2] [expr -0.5*$margin] \
1978	    -anchor sw -text $name -font $font \
1979	    -tags [list $name]]
1980
1981	set bbox [$win.tabs bbox $id]
1982	set wd [expr [lindex $bbox 2]-[lindex $bbox 0]]
1983	set ht [expr [lindex $bbox 3]-[lindex $bbox 1]]
1984	if {$ht > $maxh} {
1985	    set maxh $ht
1986	}
1987
1988	$win.tabs create polygon 0 0  $x 0 \
1989	    [expr $x+$margin] [expr -$ht-$margin] \
1990	    [expr $x+$margin+$wd] [expr -$ht-$margin] \
1991	    [expr $x+$wd+2*$margin] 0 \
1992	    2000 0  2000 10  0 10 \
1993	    -outline black -fill $color \
1994	    -tags [list $name tab tab-$name]
1995
1996	$win.tabs raise $id
1997
1998	$win.tabs bind $name <ButtonPress-1> \
1999	    [list tabnotebook_display $win $name]
2000
2001	set x [expr $x+$wd+2*$margin]
2002    }
2003    set height [expr $maxh+2*$margin]
2004    $win.tabs move all 0 $height
2005
2006    $win.tabs configure -width $x -height [expr $height+4]
2007
2008    if {$tnInfo($win-current) != ""} {
2009	tabnotebook_display $win $tnInfo($win-current)
2010    } else {
2011	tabnotebook_display $win [lindex $tnInfo($win-tabs) 0]
2012    }
2013    set tnInfo($win-pending) ""
2014}
2015
2016proc tabnotebook_display {win name} {
2017    global tnInfo
2018
2019    notebook_display $win.notebook $name
2020
2021    set normal [option get $win tabColor Color]
2022    $win.tabs itemconfigure tab -fill $normal
2023
2024    set active [option get $win activeTabColor Color]
2025    $win.tabs itemconfigure tab-$name -fill $active
2026    $win.tabs raise $name
2027
2028    set tnInfo($win-current) $name
2029}
2030
2031# ----------------------------------------------------------------------
2032#  EXAMPLE: simple notebook that can dial up pages
2033# ----------------------------------------------------------------------
2034#  Effective Tcl/Tk Programming
2035#    Mark Harrison, DSC Communications Corp.
2036#    Michael McLennan, Bell Labs Innovations for Lucent Technologies
2037#    Addison-Wesley Professional Computing Series
2038# ======================================================================
2039#  Copyright (c) 1996-1997  Lucent Technologies Inc. and Mark Harrison
2040# ======================================================================
2041
2042option add *Notebook.borderWidth 2 widgetDefault
2043option add *Notebook.relief sunken widgetDefault
2044
2045proc notebook_create {win} {
2046    global nbInfo
2047
2048    frame $win -class Notebook
2049    pack propagate $win 0
2050
2051    set nbInfo($win-count) 0
2052    set nbInfo($win-pages) ""
2053    set nbInfo($win-current) ""
2054    return $win
2055}
2056
2057proc notebook_page {win name} {
2058    global nbInfo
2059
2060    set page "$win.page[incr nbInfo($win-count)]"
2061    lappend nbInfo($win-pages) $page
2062    set nbInfo($win-page-$name) $page
2063
2064    frame $page
2065
2066    if {$nbInfo($win-count) == 1} {
2067	after idle [list notebook_display $win $name]
2068    }
2069    return $page
2070}
2071
2072proc notebook_display {win name} {
2073    global nbInfo
2074
2075    set page ""
2076    if {[info exists nbInfo($win-page-$name)]} {
2077	set page $nbInfo($win-page-$name)
2078    } elseif {[winfo exists $win.page$name]} {
2079	set page $win.page$name
2080    }
2081    if {$page == ""} {
2082	error "bad notebook page \"$name\""
2083    }
2084
2085    notebook_fix_size $win
2086
2087    if {$nbInfo($win-current) != ""} {
2088	pack forget $nbInfo($win-current)
2089    }
2090    pack $page -expand yes -fill both
2091    set nbInfo($win-current) $page
2092}
2093
2094proc notebook_fix_size {win} {
2095    global nbInfo
2096
2097    update idletasks
2098
2099    set maxw 0
2100    set maxh 0
2101    foreach page $nbInfo($win-pages) {
2102	set w [winfo reqwidth $page]
2103	if {$w > $maxw} {
2104	    set maxw $w
2105	}
2106	set h [winfo reqheight $page]
2107	if {$h > $maxh} {
2108	    set maxh $h
2109	}
2110    }
2111    set bd [$win cget -borderwidth]
2112    set maxw [expr $maxw+2*$bd]
2113    set maxh [expr $maxh+2*$bd]
2114    $win configure -width $maxw -height $maxh
2115}
2116
2117#***********************************************************************
2118# %PROCEDURE: SetupGuiToList
2119# %ARGUMENTS:
2120#  w -- the PPPoE connection setup window
2121# %RETURNS:
2122#  A list of (name value) pairs for the connection.
2123# %DESCRIPTION:
2124#  Reads values from the GUI; makes a list.
2125#***********************************************************************
2126proc SetupGuiToList { w } {
2127    global OPTS
2128    set ans {}
2129    if {[catch {lappend ans ConnectionName [$w.conName get]}]} {
2130	lappend ans ConnectionName [$w.conName cget -text]
2131    }
2132    lappend ans UserName       [$w.user get]
2133    lappend ans NetworkName    [$w.network get]
2134    lappend ans Password       [$w.pass get]
2135    lappend ans Interface      [$w.ifname get]
2136    lappend ans DNSType        [$w.dns cget -text]
2137    lappend ans DNS1           [$w.dns1 get]
2138    lappend ans DNS2           [$w.dns2 get]
2139    lappend ans NonrootOK      $OPTS(nonroot)
2140    lappend ans Sync           $OPTS(sync)
2141    lappend ans FirewallType   [$w.fw cget -text]
2142    lappend ans ServiceName    [$w.servicename get]
2143    lappend ans ACName         [$w.acname get]
2144
2145    # Validate
2146    set name [value $ans ConnectionName]
2147    if {![regexp -nocase {^[-a-z0-9_]+$} $name]} {
2148	error [m "Connection name must be non-blank and contain only letters, digits, `_' and `-'"]
2149    }
2150
2151    # Check DNS
2152    set type [value $ans DNSType]
2153    if {"$type" == [m "Specify"]} {
2154	set dns [value $ans DNS1]
2155	if {![regexp {[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+} "$dns"]} {
2156	    error [m "Primary DNS entry must consist of four dot-separated decimal numbers"]
2157	}
2158	set dns [value $ans DNS2]
2159	if {"$dns" != "" && ![regexp {[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+} "$dns"]} {
2160	    error [m "Secondary DNS entry must consist of four dot-separated decimal numbers"]
2161	}
2162    }
2163    return $ans
2164}
2165
2166#***********************************************************************
2167# %PROCEDURE: ListToSetupGui
2168# %ARGUMENTS:
2169#  w -- the PPPoE connection setup window
2170#  lst -- a list of name/value pairs
2171# %RETURNS:
2172#  Nothing
2173# %DESCRIPTION:
2174#  Updates GUI to reflect lst
2175#***********************************************************************
2176proc ListToSetupGui { w lst } {
2177    global OPTS
2178    foreach {key value} $lst {
2179	switch -exact -- $key {
2180	    ConnectionName {
2181		catch {
2182		    $w.conName delete 0 end
2183		    $w.conName insert end $value
2184		}
2185		catch {
2186		    $w.conName configure -text $value
2187		}
2188	    }
2189	    UserName {
2190		$w.user delete 0 end
2191		$w.user insert end $value
2192	    }
2193	    NetworkName {
2194		$w.network delete 0 end
2195		$w.network insert end $value
2196	    }
2197	    Password {
2198		$w.pass delete 0 end
2199		$w.pass insert end $value
2200	    }
2201	    Interface {
2202		$w.ifname delete 0 end
2203		$w.ifname insert end $value
2204	    }
2205	    DNSType {
2206		SetDNSOption $w $value
2207	    }
2208	    DNS1 {
2209		set oldstate [$w.dns1 cget -state]
2210		$w.dns1 configure -state normal
2211		$w.dns1 delete 0 end
2212		$w.dns1 insert end $value
2213		$w.dns1 configure -state $oldstate
2214	    }
2215	    DNS2 {
2216		set oldstate [$w.dns2 cget -state]
2217		$w.dns2 configure -state normal
2218		$w.dns2 delete 0 end
2219		$w.dns2 insert end $value
2220		$w.dns2 configure -state $oldstate
2221	    }
2222	    NonrootOK {
2223		set OPTS(nonroot) $value
2224	    }
2225	    Sync {
2226		set OPTS(sync) $value
2227	    }
2228	    FirewallType {
2229		$w.fw configure -text $value
2230	    }
2231	    ServiceName {
2232		$w.servicename delete 0 end
2233		$w.servicename insert end $value
2234	    }
2235	    ACName {
2236		$w.acname delete 0 end
2237		$w.acname insert end $value
2238	    }
2239	}
2240    }
2241}
2242
2243proc NewPPPoEConnectionOK { name w } {
2244    if {[catch {set conn [SetupGuiToList $w]} err]} {
2245	tk_dialog .err "Invalid Parameters" "$err" error 0 OK
2246	return
2247    }
2248    if {"$name" == ""} {
2249	set name [value $conn ConnectionName]
2250	set tmp [GetConnection $name]
2251	if {"$tmp" != ""} {
2252	    tk_dialog .err [m "Connection Exists"] [m "The connection already exists.  Pick another name."] error 0 OK
2253	return
2254	}
2255    }
2256    ReplaceConnection $conn
2257    SaveConnectionInfo
2258    BuildConnectionMenu
2259    SwitchConnection $name
2260    destroy $w
2261}
2262
2263proc SaveConnectionInfo {} {
2264    global ConnectionInfo ConnectionInfoFile PasswordFile
2265    set fp [open "$ConnectionInfoFile.new" "w"]
2266    puts $fp "# RP-PPPoE GUI Configuration Information."
2267    puts $fp "# This file may *look* human-editable, but it is NOT."
2268    puts $fp "# So, you with the text editor:  Keep away from this file."
2269    puts $fp "#"
2270    set expunged {}
2271    set passwords {}
2272    foreach thing $ConnectionInfo {
2273	set name [value $thing ConnectionName]
2274	set password [value $thing Password]
2275	set pwindex [lsearch -exact $thing Password]
2276	set safe [lreplace $thing $pwindex [expr $pwindex+1]]
2277	set pwd [list ConnectionName $name Password $password]
2278	lappend expunged $safe
2279	lappend passwords $pwd
2280    }
2281    puts $fp $expunged
2282    close $fp
2283    set fp [open "$PasswordFile.new" "w"]
2284    exec chmod 600 "$PasswordFile.new"
2285    puts $fp "# RP-PPPoE GUI Configuration Information."
2286    puts $fp "# This file may *look* human-editable, but it is NOT."
2287    puts $fp "# So, you with the text editor:  Keep away from this file."
2288    puts $fp "#"
2289    puts $fp $passwords
2290    close $fp
2291    file rename -force "$ConnectionInfoFile.new" "$ConnectionInfoFile"
2292    file rename -force "$PasswordFile.new" "$PasswordFile"
2293
2294    # Generate config files for pppoe-start for each connection
2295    foreach thing $ConnectionInfo {
2296	GenerateConfigFile $thing
2297    }
2298
2299    # Now update /etc/ppp/pap-secrets and /etc/ppp/chap-secrets
2300    foreach thing $ConnectionInfo {
2301	GenerateSecretsEntry $thing
2302    }
2303}
2304
2305#***********************************************************************
2306# %PROCEDURE: ReadShellEscapedWord
2307# %ARGUMENTS:
2308#  str -- a string
2309# %RETURNS:
2310#  A two-element list -- the first element is a shell-escaped word
2311#  extracted from $str, just the way pppd parses /etc/ppp/pap-secrets.
2312#  The second element is the remaining portion of $str
2313#***********************************************************************
2314proc ReadShellEscapedWord { str } {
2315    set ans {}
2316    set rest $str
2317
2318    # Chew up leading spaces
2319    set rest [string trimleft $rest]
2320
2321    # If first char is a quote, read until a quote
2322    if {"[string index $rest 0]" == "\""} {
2323	set rest [string range $rest 1 end]
2324	set nextquote [string first "\"" $rest]
2325	# If no following quote, pretend we haven't seen a quote, I guess.
2326	if {$nextquote >= 0} {
2327	    set ans [string range $rest 0 [expr $nextquote-1]]
2328	    set rest [string range $rest [expr $nextquote+1] end]
2329	    return [list $ans $rest]
2330	}
2331    }
2332
2333    # Not a quote; chew through the string until an unescaped space
2334    while {[string length $rest] > 0} {
2335	set char [string index $rest 0]
2336	set rest [string range $rest 1 end]
2337	# Sneaky test for whitespace in Tcl 8.0
2338	if {"[string trim $char]" == ""} {
2339	    return [list $ans $rest]
2340	}
2341	if {"$char" == "\\"} {
2342	    set char [string index $rest 0]
2343	    set rest [string range $rest 1 end]
2344	}
2345	append ans $char
2346    }
2347    return [list $ans $rest]
2348}
2349
2350
2351#***********************************************************************
2352# %PROCEDURE: GenerateSecretsEntry
2353# %ARGUMENTS:
2354#  conn -- a connection key/value list
2355# %RETURNS:
2356#  Nothing
2357# %DESCRIPTION:
2358#  Adds entries to /etc/ppp/pap-secrets and /etc/ppp/chap-secrets.
2359#***********************************************************************
2360proc GenerateSecretsEntry { conn } {
2361    set user [value $conn UserName]
2362    set net [value $conn NetworkName]
2363    set password [value $conn Password]
2364    if {"$net" != ""} {
2365	set user "$user@$net"
2366    }
2367    GenerateSecretsEntryForFile $user $password "/etc/ppp/pap-secrets"
2368    GenerateSecretsEntryForFile $user $password "/etc/ppp/chap-secrets"
2369}
2370
2371#***********************************************************************
2372# %PROCEDURE: GenerateSecretsEntryForFile
2373# %ARGUMENTS:
2374#  user -- user name
2375#  password -- password
2376#  fname -- file to add entry to.
2377# %RETURNS:
2378#  Nothing
2379# %DESCRIPTION:
2380#  Adds entries to /etc/ppp/pap-secrets or /etc/ppp/chap-secrets.
2381#***********************************************************************
2382proc GenerateSecretsEntryForFile { user password fname } {
2383    # Copy $fname to $fname.new
2384    set out [open "$fname.new" "w"]
2385    exec chmod go-rwx "$fname.new"
2386    if {[file exists $fname]} {
2387	set in [open $fname "r"]
2388	while {[gets $in line] >= 0} {
2389	    set trimmed [string trim $line]
2390	    if {"$trimmed" == ""} {
2391		puts $out $line
2392		continue
2393	    }
2394	    if {[string match "#*" $trimmed]} {
2395		puts $out $line
2396		continue
2397	    }
2398
2399	    # Read the user name off the line; copy it unless it's our
2400	    # user name.
2401	    foreach {word dummy} [ReadShellEscapedWord $line] {break}
2402	    if {$word != $user} {
2403		puts $out $line
2404	    }
2405	}
2406	close $in
2407    }
2408
2409    # Now add our line
2410    set user [ShellEscape $user]
2411    set password [ShellEscape $password]
2412    puts $out "$user\t*\t$password\t*"
2413    close $out
2414    file rename -force $fname.new $fname
2415}
2416
2417#***********************************************************************
2418# %PROCEDURE: ShellEscape
2419# %ARGUMENTS:
2420#  str
2421# %RETURNS:
2422#  A version of $str with shell meta-characters escaped
2423#***********************************************************************
2424proc ShellEscape { str } {
2425    set ans ""
2426    foreach char [split $str ""] {
2427	if {[string first $char "01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_+=-@./"] >= 0} {
2428	    append ans $char
2429	} else {
2430	    append ans "\\$char"
2431	}
2432    }
2433    return $ans
2434}
2435
2436
2437#***********************************************************************
2438# %PROCEDURE: GenerateConfigFile
2439# %ARGUMENTS:
2440#  conn -- a connection key/value list
2441# %RETURNS:
2442#  Nothing
2443# %DESCRIPTION:
2444#  Generates a configuration file for pppoe-start and friends under
2445#  /etc/ppp/rp-pppoe-gui
2446#***********************************************************************
2447proc GenerateConfigFile { conn } {
2448    global ConfigDir
2449    set name [value $conn ConnectionName]
2450    set fname [file join $ConfigDir conf.$name]
2451    set fp [open "$fname.new" w]
2452    puts $fp "# Configuration file for connection `$name'."
2453    puts $fp "# Automatically generated.  Do not edit by hand."
2454    puts $fp ""
2455    foreach {var val} $conn {
2456	switch -exact $var {
2457	    UserName {
2458		set net [value $conn NetworkName]
2459		if {"$net" != ""} {
2460		    set user "$val@$net"
2461		} else {
2462		    set user "$val"
2463		}
2464		puts $fp [ShellEscape "USER=$user"]
2465	    }
2466	    Interface {
2467		puts $fp [ShellEscape "ETH=$val"]
2468	    }
2469	    DNSType {
2470		if {"$val" == "[m {From Server}]"} {
2471		    puts $fp "DNSTYPE=SERVER"
2472		    puts $fp "PEERDNS=yes"
2473		} elseif {"$val" == "[m {Specify}]"} {
2474		    puts $fp "DNSTYPE=SPECIFY"
2475		    puts $fp "PEERDNS=no"
2476		} else {
2477		    puts $fp "DNSTYPE=NOCHANGE"
2478		    puts $fp "PEERDNS=no"
2479		}
2480	    }
2481	    DNS1 {
2482		puts $fp [ShellEscape "DNS1=$val"]
2483	    }
2484	    DNS2 {
2485		puts $fp [ShellEscape "DNS2=$val"]
2486	    }
2487	    NonrootOK {
2488		if {$val} {
2489		    puts $fp "NONROOT=OK"
2490		}
2491	    }
2492	    ACName {
2493		puts $fp [ShellEscape "ACNAME=$val"]
2494	    }
2495	    ServiceName {
2496		puts $fp [ShellEscape "SERVICENAME=$val"]
2497	    }
2498	    FirewallType {
2499		if {"$val" == "[m {None}]"} {
2500		    puts $fp "FIREWALL=NONE"
2501		} elseif {"$val" == "[m {Masquerading}]"} {
2502		    puts $fp "FIREWALL=MASQUERADE"
2503		} else {
2504		    puts $fp "FIREWALL=STANDALONE"
2505		}
2506	    }
2507	    Sync {
2508		if {$val} {
2509		    puts $fp "SYNCHRONOUS=yes"
2510		} else {
2511		    puts $fp "SYNCHRONOUS=no"
2512		}
2513	    }
2514	}
2515    }
2516    puts $fp "CONNECT_TIMEOUT=30"
2517    puts $fp "CONNECT_POLL=1"
2518    puts $fp "FORCEPING=\".\""
2519    puts $fp "PIDFILE=/var/run/pppoe-$name.pid"
2520    puts $fp "CLAMPMSS=1412"
2521    puts $fp "LCP_INTERVAL=20"
2522    puts $fp "LCP_FAILURE=3"
2523    puts $fp "PPPOE_TIMEOUT=80"
2524    puts $fp "LINUX_PLUGIN="
2525    puts $fp "DEMAND=no"
2526    puts $fp "DEFAULTROUTE=yes"
2527    close $fp
2528    file rename -force "$fname.new" "$fname"
2529}
2530
2531#***********************************************************************
2532# %PROCEDURE: GetConnectionStatus
2533# %ARGUMENTS:
2534#  conn -- connection name
2535# %RETURNS:
2536#  A three-element list:
2537#  {started/stopped up/down if}
2538#  If first element is "started", then connection has been started.
2539#  If second element is "up", then connection is up.
2540#  If connection is up, third element is PPP interface.
2541#***********************************************************************
2542proc GetConnectionStatus { conn } {
2543    set pidfile "/var/run/pppoe-$conn.pid"
2544
2545    # Check for PID file
2546    if {![file readable $pidfile]} {
2547	return {stopped down ""}
2548    }
2549    set fp [open $pidfile "r"]
2550    gets $fp pid
2551    close $fp
2552
2553    # Check if process is dead
2554    if {![file exists "/proc/$pid"]} {
2555	# The pppd might still be running... doh...
2556	if {![file readable "$pidfile.pppd"]} {
2557	    return {stopped down ""}
2558	}
2559	set fp [open "$pidfile.pppd" "r"]
2560	gets $fp pid
2561	close $fp
2562	if {![file exists "/proc/$pid"]} {
2563	    return {stopped down ""}
2564	}
2565    }
2566
2567    # Now get PID of pppd
2568    if {![file readable "$pidfile.pppd"]} {
2569	return {started down ""}
2570    }
2571    set fp [open "$pidfile.pppd" "r"]
2572    gets $fp pid
2573    close $fp
2574
2575    # Find interface to which it corresponds
2576    set pppdfiles [glob -nocomplain "/var/run/ppp*.pid"]
2577    set found {}
2578    foreach file $pppdfiles {
2579	set fp [open $file "r"]
2580	gets $fp ifpid
2581	close $fp
2582	if {$ifpid == $pid} {
2583	    set found [file rootname [file tail $file]]
2584	    break
2585	}
2586    }
2587    if {"$found" == ""} {
2588	return {started down ""}
2589    }
2590    return [list started up $found]
2591}
2592
2593#***********************************************************************
2594# %PROCEDURE: UpdateConnectionState
2595# %ARGUMENTS:
2596#  fromAfter -- if 1, was called from an "after" callback.
2597# %RETURNS:
2598#  Nothing
2599# %DESCRIPTION:
2600#  Updates the "LED" displays; periodically reschedules itself to keep
2601#  updating display.
2602#***********************************************************************
2603proc UpdateConnectionState {{fromAfter 1}} {
2604    global UpdateToken
2605    global Packets
2606    global Bytes
2607    global UpdateInterval
2608    global MeasureTime
2609    if {$fromAfter} {
2610	set UpdateToken ""
2611    }
2612
2613    set conn [GetCurrentConnection]
2614    if {"$conn" == ""} {
2615	ConnectionStateOff
2616	ResetGraph
2617	if {"$UpdateToken" != ""} {
2618	    after cancel $UpdateToken
2619	    set UpdateToken {}
2620	}
2621	return
2622    }
2623
2624    foreach {startstop updown interface} [GetConnectionStatus $conn] {break}
2625    if {"$startstop" == "stopped"} {
2626	ConnectionStateOff
2627	ResetGraph
2628    } elseif {"$updown" == "down"} {
2629	ConnectionStateDown
2630	ResetGraph
2631    } else {
2632	# Get the packet counts
2633	set found 0
2634	set fp [open "/proc/net/dev" "r"]
2635	while {[gets $fp line] >= 0} {
2636	    if {![string match "*$interface:*" $line]} {
2637		continue
2638	    }
2639	    set colon [string first ":" $line]
2640	    if {$colon < 0} {
2641		continue
2642	    }
2643	    set line [string range $line [expr $colon+1] end]
2644	    set found 1
2645	    set MeasureTime [clock seconds]
2646	    break
2647	}
2648	close $fp
2649	if {$found} {
2650	    foreach {rbytes rpacks rerrs rdrop rfifo rframe rcomp rmulti tbytes tpacks} $line {break}
2651	    if {!$fromAfter} {
2652		set Packets(in) $rpacks
2653		set Packets(out) $tpacks
2654		set Bytes(in) $rbytes
2655		set Bytes(out) $tbytes
2656		ConnectionStateUp
2657		ResetGraph
2658	    } else {
2659		if {$rpacks != $Packets(in)} {
2660		    ConnectionReceiveActive
2661		} else {
2662		    ConnectionReceiveUp
2663		}
2664		if {$tpacks != $Packets(out)} {
2665		    ConnectionTransmitActive
2666		} else {
2667		    ConnectionTransmitUp
2668		}
2669		set Packets(in) $rpacks
2670		set Packets(out) $tpacks
2671		set Bytes(in) $rbytes
2672		set Bytes(out) $tbytes
2673		UpdateGraph
2674	    }
2675	} else {
2676	    ConnectionStateUp
2677	    ResetGraph
2678	}
2679    }
2680    if {"$UpdateToken" == ""} {
2681	set UpdateToken [after $UpdateInterval UpdateConnectionState]
2682    }
2683    if {$fromAfter} {
2684	SetButtonStates
2685    }
2686}
2687
2688proc ConnectionStateOff {} {
2689    .c itemconfigure xmitrect -fill "#A0A0A0"
2690    .c itemconfigure recvrect -fill "#A0A0A0"
2691}
2692
2693proc ConnectionStateDown {} {
2694    .c itemconfigure xmitrect -fill "#A00000"
2695    .c itemconfigure recvrect -fill "#A00000"
2696}
2697
2698proc ConnectionStateUp {} {
2699    .c itemconfigure xmitrect -fill "#00D000"
2700    .c itemconfigure recvrect -fill "#00D000"
2701}
2702
2703proc ConnectionTransmitActive {} {
2704    .c itemconfigure xmitrect -fill "#FFFF00"
2705}
2706
2707proc ConnectionTransmitUp {} {
2708    .c itemconfigure xmitrect -fill "#00D000"
2709}
2710
2711proc ConnectionReceiveActive {} {
2712    .c itemconfigure recvrect -fill "#FFFF00"
2713}
2714
2715proc ConnectionReceiveUp {} {
2716    .c itemconfigure recvrect -fill "#00D000"
2717}
2718
2719proc ResetGraph {} {
2720    global GraphPoints
2721    set GraphPoints(in) {}
2722    set GraphPoints(out) {}
2723    set GraphPoints(times) {}
2724    .graph delete all
2725    UpdateGraph
2726}
2727
2728proc UpdateGraph {} {
2729    global GraphPoints Bytes UpdateInterval MeasureTime
2730    lappend GraphPoints(times) $MeasureTime
2731    lappend GraphPoints(in) $Bytes(in)
2732    lappend GraphPoints(out) $Bytes(out)
2733
2734    set w [winfo width .graph]
2735    set w2 [expr $w/2]
2736
2737    set h [winfo height .graph]
2738    set toChop [expr [llength $GraphPoints(in)] - $w2 - 1]
2739    if {$toChop > 0} {
2740	set GraphPoints(in) [lrange $GraphPoints(in) $toChop end]
2741    }
2742    set toChop [expr [llength $GraphPoints(out)] - $w2 - 1]
2743    if {$toChop > 0} {
2744	set GraphPoints(out) [lrange $GraphPoints(out) $toChop end]
2745    }
2746    set toChop [expr [llength $GraphPoints(times)] - $w2 - 1]
2747    if {$toChop > 0} {
2748	set GraphPoints(times) [lrange $GraphPoints(times) $toChop end]
2749    }
2750
2751    set prev [lindex $GraphPoints(in) 0]
2752    set incoords {}
2753    set outcoords {}
2754    set inmax 0
2755    set outmax 0
2756    foreach thing [lrange $GraphPoints(in) 1 end] {
2757	set diff [expr $thing - $prev]
2758	set prev $thing
2759	lappend incoords $diff
2760	if {$diff > $inmax} {
2761	    set inmax $diff
2762	}
2763    }
2764
2765    set prev [lindex $GraphPoints(out) 0]
2766    foreach thing [lrange $GraphPoints(out) 1 end] {
2767	set diff [expr $thing - $prev]
2768	set prev $thing
2769	lappend outcoords $diff
2770	if {$diff > $outmax} {
2771	    set outmax $diff
2772	}
2773    }
2774
2775    if {$inmax == 0} { set inmax 1 }
2776    if {$outmax == 0} { set outmax 1 }
2777    # Draw the transmit line
2778    set x 0
2779    set hh [expr $h-4]
2780    set scaled {}
2781    foreach thing $outcoords {
2782	lappend scaled $x [expr double($h) - 2 - (double($hh) * double($thing) / double($outmax))]
2783	incr x
2784    }
2785
2786    .graph delete all
2787    if {[llength $scaled] >= 4} {
2788	eval ".graph create line $scaled -fill #A00000"
2789	set bits [expr 8.0 * ([lindex $GraphPoints(out) end] - [lindex $GraphPoints(out) 0])]
2790	set timediff [expr [lindex $GraphPoints(times) end] - [lindex $GraphPoints(times) 0]]
2791	if {$timediff != 0} {
2792	    set bps [Pretty [expr double($bits) / $timediff]]
2793	    .graph create text 2 2 -anchor nw -font fixed -text "$bps"
2794	}
2795    }
2796
2797    # Draw the receive line
2798    set x $w2
2799    set scaled {}
2800    foreach thing $incoords {
2801	lappend scaled $x [expr double($h) - 2 - (double($hh) * double($thing) / double($inmax))]
2802	incr x
2803    }
2804
2805    if {[llength $scaled] >= 4} {
2806	eval ".graph create line $scaled -fill #00A000"
2807	set bits [expr 8.0 * ([lindex $GraphPoints(in) end] - [lindex $GraphPoints(in) 0])]
2808	set timediff [expr [lindex $GraphPoints(times) end] - [lindex $GraphPoints(times) 0]]
2809	if {$timediff != 0} {
2810	    set bps [Pretty [expr double($bits) / $timediff]]
2811	    .graph create text [expr $w2+2] 2 -anchor nw -font fixed -text "$bps"
2812	}
2813    }
2814}
2815
2816proc Pretty { n } {
2817    if {$n < 0} {
2818	return "***"
2819    }
2820    if {$n < 1000} {
2821	return [format "%.1f" $n]
2822    }
2823    set n [expr $n/1000.0]
2824    if {$n < 1000} {
2825	return [format "%.1fk" $n]
2826    }
2827    set n [expr $n/1000.0]
2828    if {$n < 1000} {
2829	return [format "%.1fM" $n]
2830    }
2831    set n [expr $n/1000.0]
2832    return [format "%.1fG" $n]
2833}
2834
2835#***********************************************************************
2836# %PROCEDURE: Help
2837# %ARGUMENTS:
2838#  None
2839# %RETURNS:
2840#  Nothing
2841# %DESCRIPTION:
2842#  Opens help page
2843#***********************************************************************
2844proc Help {} {
2845    set file [file join "@datadir_evaluated@" tkpppoe tkpppoe.html]
2846    if {![file readable $file]} {
2847	tk_dialog .err [m "Error"] [m "Help file is not installed"] error 0 OK
2848	return
2849    }
2850    catch { exec /bin/sh -c "netscape -remote 'openURL($file)' || netscape $file" > /dev/null 2>/dev/null & }
2851}
2852
2853
2854
2855#***********************************************************************
2856# %PROCEDURE: doLogo
2857# %ARGUMENTS:
2858#  None
2859# %RETURNS:
2860#  Nothing
2861# %DESCRIPTION:
2862#  Does the logo thing
2863#***********************************************************************
2864proc doLogo {} {
2865    global AlreadyRunFile ConfigDir
2866    if {[file exists $AlreadyRunFile]} {
2867	return
2868    }
2869    catch { file mkdir $ConfigDir }
2870    catch { close [open $AlreadyRunFile "w"] }
2871    canvas .c -width 374 -height 286 -bg #FFFFCC
2872    pack .c
2873    drawLogo .c #FFFFCC
2874
2875    # Funky effect
2876    .c create text 4 4 -anchor nw -text [m "Welcome to RP-PPPoE"] \
2877	    -fill red -font {-family times -size -24 -weight bold} -tags pppoe
2878    .c lower pppoe
2879
2880    .c move logo -300 0
2881
2882    update idletasks
2883
2884    for {set i 0} {$i < 15} {incr i} {
2885	.c move logo 20 0
2886	update idletasks
2887	after 25
2888    }
2889
2890    .c create text 4 28 -anchor nw -text "http://www.roaringpenguin.com" \
2891	    -fill red -font {-family courier -size -14 -weight bold}
2892    update idletasks
2893    after 2500
2894}
2895
2896# If config dir is not readable, die
2897if {![file readable $ConfigDir]} {
2898    wm withdraw .
2899    tk_dialog .err Error "Error: Cannot read the directory $ConfigDir.  You must have permission to read this directory to use tkpppoe" error 0 OK
2900    exit 1
2901}
2902
2903doLogo
2904catch { destroy .c }
2905
2906# Try creating an empty config file if none exists
2907if {![file readable $ConnectionInfoFile]} {
2908    catch { file mkdir $ConfigDir }
2909    catch {
2910	set fp [open $ConnectionInfoFile "w"]
2911	close $fp
2912    }
2913}
2914
2915CreateMainDialog
2916