#!/usr/bin/wish

#######################################################################
#
# SecPanel - Graphical user interface for managing ssh-connections
#
# Copyright (C) 1999 Steffen Leich
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
#######################################################################

#######################################################################
#
# This is Version 0.1 of SecPanel
#
# If you want to give any feedback about the program please send it to
# Steffen Leich <leich@wiwi.uni-marburg.de>
# Information about the program can be found on
# http://www2.wiwi.uni-marburg.de/~leich/soft/secpanel
#
#######################################################################

#################################
# Visual Tcl v1.20 Project
#

#################################
# GLOBAL VARIABLES
#
global agentforward; 
global algo; 
global compress; 
global compressval; 
global fork; 
global gateway; 
global nopriv; 
global quiet; 
global sites; 
global verbose; 
global widget; 
    set widget(commandent) {.top17.fra21.fra24.ent26}
    set widget(comprlev) {.top17.fra21.fra25.02}
    set widget(defsites) {.top17.fra46.fra24.fra25.01}
    set widget(distkeyent) {.top17.fra35.ent40}
    set widget(hostent) {.top17.fra21.fra24.ent20}
    set widget(identityent) {.top17.fra21.fra28.02}
    set widget(lfin) {.top43.fra45.ent46}
    set widget(lforwards) {.top43.cpd44.01}
    set widget(lfout) {.top43.fra45.ent48}
    set widget(newaddr) {.top40.fra21.ent25}
    set widget(newtit) {.top40.fra21.ent23}
    set widget(newuser) {.top40.fra21.ent27}
    set widget(portent) {.top17.fra21.fra24.ent24}
    set widget(profileent) {.top17.fra21.fra48.ent53}
    set widget(profiles) {.top17.fra21.fra48.cpd18.01}
    set widget(rev,.top17.fra21.fra24.ent18) {titleent}
    set widget(rev,.top17.fra21.fra24.ent20) {hostent}
    set widget(rev,.top17.fra21.fra24.ent22) {userent}
    set widget(rev,.top17.fra21.fra24.ent24) {portent}
    set widget(rev,.top17.fra21.fra24.ent26) {commandent}
    set widget(rev,.top17.fra21.fra25.02) {comprlev}
    set widget(rev,.top17.fra21.fra28.02) {identityent}
    set widget(rev,.top17.fra21.fra48.cpd18.01) {profiles}
    set widget(rev,.top17.fra21.fra48.ent53) {profileent}
    set widget(rev,.top17.fra35.ent40) {distkeyent}
    set widget(rev,.top17.fra46.fra24.fra25.01) {defsites}
    set widget(rev,.top17.fra46.fra26.fra27.01) {specsites}
    set widget(rev,.top40.fra21.ent23) {newtit}
    set widget(rev,.top40.fra21.ent25) {newaddr}
    set widget(rev,.top40.fra21.ent27) {newuser}
    set widget(rev,.top43.cpd44.01) {lforwards}
    set widget(rev,.top43.fra45.ent46) {lfin}
    set widget(rev,.top43.fra45.ent48) {lfout}
    set widget(specsites) {.top17.fra46.fra26.fra27.01}
    set widget(titleent) {.top17.fra21.fra24.ent18}
    set widget(userent) {.top17.fra21.fra24.ent22}
global x11forward; 

#################################
# USER DEFINED PROCEDURES
#
proc init {argc argv} {
    global env sites
    set secpaneldir "$env(HOME)/.secpanel"
    if {! [file exists $secpaneldir]} {
	puts "Creating my config-dir $secpaneldir (chmod 700)..."
	file mkdir $secpaneldir
	exec chmod 700 $secpaneldir
    }

    if {! [file exists "$secpaneldir/default.profile"]} {
	puts "Creating my default-profile $secpaneldir/default.profile ..."
	set dpf [open "$secpaneldir/default.profile" w]
	puts $dpf " #\n # SecPanel-Pofile\n # Do not edit, use SecPanel instead\n #\n set title \"Default Profile\"\n set host \"\"\n set user \"\"\n set port \"22\"\n set command \"\"\n set identity \"\"\n set agentforward \"0\"\n set x11forward \"0\"\n set nopriv \"0\"\n set verbose \"0\"\n set quiet \"0\"\n set fork \"0\"\n set gateway \"0\"\n set compress \"0\"\n set algo \"idea\"\n set compressval \"6\"\n set lfs \"\""
	close $dpf
    }

    set sitefile "$env(HOME)/.secpanel/sites"
    if [file exists $sitefile] {
	set sf [open $sitefile r]
	while {[gets $sf line] > 0} {
	    set els [split $line #]
	    set sites([lindex $els 0]) "[lindex $els 1]#[lindex $els 2]"
	}
	close $sf
    }
}

init $argc $argv


proc {add_forw} {} {
    global widget
    set lfin [$widget(lfin) get]
    set lfout [$widget(lfout) get]

    if {$lfin != "" && $lfout != ""} {
	$widget(lforwards) insert end "$lfin -> $lfout"
	$widget(lfin) delete 0 end
	$widget(lfout) delete 0 end
	focus $widget(lfin)
    }
}

proc {changetab} {mode} {
    foreach f {21 35 44 46} {
	if {[grid info .top17.fra[set f]] != ""} {
	    grid remove .top17.fra[set f]
	}
    }
    array set frames {connect 46 terminal 44 key 35 ssh 21}
    
    grid .top17.fra$frames($mode) -in .top17 \
	    -column 0 -row 1 -columnspan 1 -rowspan 1 \
	    -ipadx 2 -ipady 2 -padx 2 -pady 2 -sticky nesw
}

proc {clear_prmenu} {} {
    global env widget
    $widget(profiles) delete 0 end
    foreach prof [glob -nocomplain "$env(HOME)/.secpanel/*.profile"] {
	$widget(profiles) insert end "[file rootname [file tail $prof]]"
    }
}

proc {clear_profiles} {} {
    global env widget agentforward x11forward nopriv\
	    lfs verbose quiet fork gateway compress algo compressval

    foreach b {agentforward x11forward nopriv \
	    verbose quiet fork gateway compress} {
	set [set b] 0
    }
    
    set algo "idea"
    set compressval 6

    foreach e {host command title identity user port profile} {
	$widget([set e]ent) delete 0 end
    }
    
    if [info exists lfs] {
	unset lfs
    }

    $widget(userent) insert 0 "$env(USER)"
    $widget(portent) insert 0 "22"

    if {[winfo exists .top43]} {
	Window destroy .top43
	local_forwardings 1
    }
}

proc {connect} {mode} {
    global widget sites env

    if {$mode == "def"} {
	source "$env(HOME)/.secpanel/default.profile"
	set actconn [$widget(defsites) get active]
	set host [lindex [split $sites($actconn) #] 0]
	set user [lindex [split $sites($actconn) #] 1]
	set title $actconn
    }

    if {$mode == "spec"} {
	set actconn [retprof [$widget(specsites) get active]]
	source "$env(HOME)/.secpanel/$actconn.profile"
    }

    if {$lfs != ""} {
	foreach lf $lfs {
	    append lf_tag \
		    " -L [lindex [split $lf :] 0]:$host:[lindex [split $lf :] 1] "
	}
    } else {
	set lf_tag " "
    }

    if {$user != ""} {
	set user_tag "-l $user "
    } else {
	set user_tag " "
    }
    
    if {$port == 22 || $port == ""} {
	set port_tag " "
    } else {
	set port_tag "-p $port "
    }
    
    if {$algo != "idea" || $algo == ""} {
	set algo_tag "-c $algo "
    } else {
	set algo_tag " "
    }
    
    if {$identity != ""} {
	set ident_tag "-i $identity "
    } else {
	set ident_tag " "
    }
    
    if {$command != ""} {
	set command_tag "$command"
    } else {
	set command_tag ""
    }
    
    if $compress {
	set compressval_tag "-o CompressionLevel=$compressval "
    } else {
	set compressval_tag " "
    }
    
    array set bools {
	"agentforward" "-a"  "x11forward" "-x"   "nopriv" "-P"  "verbose" "-v"    "quiet" "-q"  "fork" "-f"  "gateway" "-g"  "compress" "-C"
    }
    
    foreach f {agentforward x11forward nopriv verbose \
	    quiet fork gateway compress } {
	if [set $f] {
	    set [set f]_tag "$bools($f) "
	} else {
	    set [set f]_tag " "
	}
    }

    set actstring "exec xterm -T \"SSH Connection - $title\" \
	    -e secpanel.wait \"ssh $user_tag \
	    $agentforward_tag $x11forward_tag $algo_tag \
	    $ident_tag $nopriv_tag $verbose_tag $quiet_tag \
	    $fork_tag $gateway_tag $compress_tag $compressval_tag \
	    $lf_tag $host $command_tag\" &"
    
    eval $actstring
}

proc {defsiteupdate} {} {
    global widget sites
    $widget(defsites) delete 0 end
    foreach s [array names sites] {
	$widget(defsites) insert end $s
    }
}

proc {del_forw} {} {
    global widget
    if {[selection own] == $widget(lforwards)} {
	$widget(lforwards) delete active
    } else {
	showmessage "No local forward selected"
    }
    selection clear
}

proc {delconn} {mode} {
    global widget env sites
    switch -exact $mode {
	def {
	    if {[selection own] == $widget(defsites)} {
		unset sites([$widget(defsites) get active])	    
		set sitefile [open "$env(HOME)/.secpanel/sites" w]
		foreach s [array names sites] {
		    puts $sitefile "$s#$sites($s)"
		}
		close $sitefile
		defsiteupdate
		selection clear
	    } else {
		showmessage "No entry selected"
	    }
	}
	spec {
	    if {[selection own] == $widget(specsites)} {
		set delprof [retprof [$widget(specsites) get active]]
		if {$delprof == "default"} {
		    showmessage "You may not delete the default profile"
		    return
		} else {
		    file delete "$env(HOME)/.secpanel/$delprof.profile"
		    specsiteupdate
		    clear_prmenu
		    selection clear
		}    
	    } else {
		showmessage "No entry selected"
	    }
	}
    }
}

proc {delete_profile} {} {
    global env widget
    set act [$widget(profileent) get]
    if {$act == ""} {
	showmessage "To delete a profile first load it"
	return
    }
    if {$act == "default"} {
	showmessage "You may not delete the default profile"
	return
    }
    file delete "$env(HOME)/.secpanel/$act.profile"
    clear_prmenu
    clear_profiles
    specsiteupdate
}

proc {distkey} {} {
    global env
    set user lin
    set host goofy
    set identfile "/home/lin/.ssh/identity.pub"
    exec xterm -e tkcomm.wait "ssh -l $user $host \"cat >> ~/.ssh/authorized_keys\" < $identfile"
}

proc {insprot} {mode} {
    global widget
    $widget(lfout) delete 0 end
    $widget(lfout) insert 0 $mode
}

proc {load_profile} {mode} {
    global env widget agentforward x11forward nopriv \
	    verbose quiet fork gateway compress algo compressval lfs
    if {$mode == "ssh"} {
	set act [$widget(profiles) get active]
    } elseif {$mode == "connects"} {
	set act [retprof [$widget(specsites) get active]]
    }

    source $env(HOME)/.secpanel/$act.profile

    foreach f {title host user port command identity} {
	$widget([set f]ent) delete 0 end
	$widget([set f]ent) insert 0 [set $f]
    }

    $widget(profileent) delete 0 end
    $widget(profileent) insert 0 $act

    if {[winfo exists .top43]} {
	Window destroy .top43
	local_forwardings 1
    }
}

proc {local_forwardings} {mode} {
    global widget lfs
    switch -exact $mode {
	1 {
	    if [winfo exists .top43] {
		return
	    }
	    Window show .top43
	    if [info exists lfs] {
		foreach lf $lfs {
		    if [regsub : $lf { -> } out] {
			$widget(lforwards) insert end $out
		    }
		}
	    }
	}
    }
}

proc {managecompr} {} {
    global widget compress
    if {$compress} {
	$widget(comprlev) config -state normal
    } else {
	$widget(comprlev) config -state disabled
    }
}

proc {newconn} {mode state} {
    global widget env sites
    switch -exact $mode {
	def {
	    switch -exact $state {
		1 {
		    Window show .top40
		    $widget(newuser) insert 0 $env(USER)
		    grab .top40
		}
		2 {
		    set newtit [$widget(newtit) get]
		    set newaddr [$widget(newaddr) get]
		    set newuser [$widget(newuser) get]
		    
		    if {$newtit != "" && $newaddr != ""} {
			set sites($newtit) "$newaddr#$newuser"
			
			set sitefile [open "$env(HOME)/.secpanel/sites" w]
			foreach s [array names sites] {
			    puts $sitefile "$s#$sites($s)"
			}
			close $sitefile
			
			defsiteupdate
			
			Window destroy .top40
		    } else {
			showmessage "Please enter address and title"
		    }
		}
	    }
	}
	spec {
	    changetab ssh
	    clear_profiles
	}
    }
}

proc {propconn} {spec mode} {
    global widget env sites
    switch -exact $spec {
	def {
	    switch -exact $mode {
		1 {
		    set act [$widget(defsites) get active]
		    Window show .top40
		    $widget(newtit) insert 0 $act
		    $widget(newaddr) insert 0 [lindex [split $sites($act) #] 0]
		    $widget(newuser) insert 0 [lindex [split $sites($act) #] 1]
		    .top40.fra45.but47 config -command "propconn def 2"
		    grab .top40
		}
		2 {
		    unset sites([$widget(defsites) get active])
		    newconn def 2
		}
	    }
	}
	spec {
	    changetab ssh
	    load_profile connects
	}
    }
}

proc {remote_forwardings} {mode} {
    switch -exact $mode {
	1 {
	    Window show .top51
	}
    }
}

proc {retprof} {tit} {
    global env
    foreach f [glob -nocomplain "$env(HOME)/.secpanel/*.profile"] {
	source $f
	if {$title == $tit} {
	    return "[file rootname [file tail $f]]"
	}
    }
}

proc {save_forwards} {mode} {
    global widget lfs
    set lfs [list]
    foreach line [$widget(lforwards) get 0 end] {
	if [regsub { -> } $line : out] {
	    lappend lfs $out
	}
    }
    Window destroy .top43
}

proc {save_profile} {} {
    global env widget agentforward x11forward \
	    nopriv verbose quiet fork gateway compress algo compressval lfs

    set prname [$widget(profileent) get]
    if {$prname == ""} {
	showmessage "Enter a name for the profile"
	return
    }

    set title [$widget(titleent) get]
    set host [$widget(hostent) get]
    set user [$widget(userent) get]
    set port [$widget(portent) get]
    set command [$widget(commandent) get]
    
    if {$prname == "default"} {
	if {$title != "Default Profile" || $host != ""  || $user != "" || $command != ""} {
	    showmessage "You may not enter host, user or command for the default profile and you may not change the title"
	    return
	}
    } else {
	if {$title == "" || $host == ""} {
	    showmessage "You must enter at least host and title"
	    return
	}
    }
    
    set identity [$widget(identityent) get]

    # ffnen der Config-Datei
    set prfile [open "$env(HOME)/.secpanel/$prname.profile" w]
    
    puts $prfile "#\n# SecPanel-Pofile\n# Do not edit, use SecPanel instead\n#"
    
    foreach ent {title host user port command identity} {
	puts $prfile "set [set ent] \"[set $ent]\""
    }
    foreach bool {agentforward x11forward nopriv verbose \
	    quiet fork gateway compress } {
	if [set $bool] {
	    puts $prfile "set [set bool] \"[set $bool]\""
	} else {
	    puts $prfile "set [set bool] \"[set $bool]\""
	}
    }
    foreach sel {algo compressval} {
	puts $prfile "set [set sel] \"[set $sel]\""
    }

    if [info exists lfs] {
	puts $prfile "set lfs \"$lfs\""
    } else {
	puts $prfile "set lfs \"\""
    }

    # Schlieen der Config-Datei
    close $prfile

    specsiteupdate    
    clear_prmenu
    clear_profiles
}

proc {seldistkey} {} {
    global env widget
    $widget(distkeyent) delete 0 end
    $widget(distkeyent) insert 0 [tk_getOpenFile -initialdir $env(HOME)/.ssh]
}

proc {select_ident} {} {
    global env widget
    set select [tk_getOpenFile  -initialdir $env(HOME)/.ssh]
    $widget(identityent) delete 0 end
    $widget(identityent) insert 0 $select
}

proc {showman} {man} {
    exec xterm -e man $man &
}

proc {showmessage} {text} {
    Window show .top18
    .top18.fra20.mes23 config -text $text
    grab .top18
    return
}

proc {specsiteupdate} {} {
    global widget env
    $widget(specsites) delete 0 end
    set profiles [glob -nocomplain "$env(HOME)/.secpanel/*.profile"]
    foreach prof $profiles {
	if {[file rootname [file tail $prof]] == "default"} {
	    continue
	}
	source $prof
	$widget(specsites) insert end $title
    }
}

proc {main} {argc argv} {
    global widget sites env
    # grid .top17.fra46 -in .top17 -column 0 -row 1 -columnspan 1 -rowspan 1 -ipadx 0 -ipady 0 -padx 0 -pady 0 -sticky nesw
    clear_prmenu
    clear_profiles
    defsiteupdate
    specsiteupdate
}

proc {Window} {args} {
    global vTcl
    set cmd [lindex $args 0]
    set name [lindex $args 1]
    set newname [lindex $args 2]
    set rest [lrange $args 3 end]
    if {$name == "" || $cmd == ""} {return}
    if {$newname == ""} {
        set newname $name
    }
    set exists [winfo exists $newname]
    switch $cmd {
        show {
            if {$exists == "1" && $name != "."} {wm deiconify $name; return}
            if {[info procs vTclWindow(pre)$name] != ""} {
                eval "vTclWindow(pre)$name $newname $rest"
            }
            if {[info procs vTclWindow$name] != ""} {
                eval "vTclWindow$name $newname $rest"
            }
            if {[info procs vTclWindow(post)$name] != ""} {
                eval "vTclWindow(post)$name $newname $rest"
            }
        }
        hide    { if $exists {wm withdraw $newname; return} }
        iconify { if $exists {wm iconify $newname; return} }
        destroy { if $exists {destroy $newname; return} }
    }
}

#################################
# VTCL GENERATED GUI PROCEDURES
#

proc vTclWindow. {base} {
    if {$base == ""} {
        set base .
    }
    ###################
    # CREATING WIDGETS
    ###################
    wm focusmodel $base passive
    wm geometry $base 1x1+0+0
    wm maxsize $base 1009 738
    wm minsize $base 1 1
    wm overrideredirect $base 0
    wm resizable $base 1 1
    wm withdraw $base
    wm title $base "vt.tcl"
    ###################
    # SETTING GEOMETRY
    ###################
}

proc vTclWindow.top17 {base} {
    if {$base == ""} {
        set base .top17
    }
    if {[winfo exists $base]} {
        wm deiconify $base; return
    }
    ###################
    # CREATING WIDGETS
    ###################
    toplevel $base -class Toplevel \
        -borderwidth "4" -menu ".top17.m17" 
    wm focusmodel $base passive
    wm geometry $base 499x482
    wm maxsize $base 1009 738
    wm minsize $base 1 1
    wm overrideredirect $base 0
    wm resizable $base 1 1
    wm deiconify $base
    wm title $base "SecPanel"
    menu $base.m17 \
        -borderwidth "1" -cursor "" -font "Helvetica -12" -tearoff "0" 
    $base.m17 add cascade \
        -label "Operations" -menu ".top17.m17.men18" 
    $base.m17 add cascade \
        -label "Help" -menu ".top17.m17.men19" 
    menu $base.m17.men18 \
        -borderwidth "1" -font "Helvetica -12" -tearoff "0" 
    $base.m17.men18 add command \
        -command "exit" -label "Exit" 
    menu $base.m17.men19 \
        -borderwidth "1" -font "Helvetica -12" -tearoff "0" 
    $base.m17.men19 add command \
        -label "Help Index (no help yet)" 
    $base.m17.men19 add cascade \
        -label "Manuals" -menu ".top17.m17.men19.men20" 
    $base.m17.men19 add separator
    $base.m17.men19 add command \
        -command "Window show .top25" -label "About SecPanel" 
    menu $base.m17.men19.men20 \
        -borderwidth "1" -font "Helvetica -12" -tearoff "0" 
    $base.m17.men19.men20 add command \
        -command "showman ssh" -label "ssh" 
    $base.m17.men19.men20 add command \
        -command "showman sshd" -label "sshd" 
    frame $base.fra21 \
        -borderwidth "2" -height "75" -relief "groove" -width "125" 
    frame $base.fra21.fra22 \
        -borderwidth "2" -height "75" -relief "groove" -width "125" 
    menubutton $base.fra21.fra22.01 \
        -borderwidth "1" -font "Helvetica -12 {}" -indicatoron "1" \
        -menu ".top17.fra21.fra22.01.02" -padx "4" -pady "3" -relief "raised" \
        -text "idea" -textvariable "algo" 
    menu $base.fra21.fra22.01.02 \
        -borderwidth "1" -cursor "" -font "Helvetica -12" -tearoff "0" 
    $base.fra21.fra22.01.02 add radiobutton \
        -label "idea" -value "idea" -variable "algo" 
    $base.fra21.fra22.01.02 add radiobutton \
        -label "des" -value "des" -variable "algo" 
    $base.fra21.fra22.01.02 add radiobutton \
        -label "3des" -value "3des" -variable "algo" 
    $base.fra21.fra22.01.02 add radiobutton \
        -label "blowfish" -value "blowfish" -variable "algo" 
    $base.fra21.fra22.01.02 add radiobutton \
        -label "arcfour" -value "arcfour" -variable "algo" 
    $base.fra21.fra22.01.02 add radiobutton \
        -label "none" -value "none" -variable "algo" 
    label $base.fra21.fra22.03 \
        -borderwidth "1" -font "Helvetica -12 {}" -relief "raised" \
        -text "Encryption Algorithm" 
    checkbutton $base.fra21.fra22.04 \
        -anchor "w" -borderwidth "1" -font "Helvetica -12 {}" \
        -text "No privileged source port" -variable "nopriv" 
    frame $base.fra21.fra23 \
        -borderwidth "2" -height "75" -relief "groove" -width "125" 
    checkbutton $base.fra21.fra23.01 \
        -anchor "w" -borderwidth "1" -font "Helvetica -12 {}" \
        -text "No auth. agent forwarding" -variable "agentforward" 
    checkbutton $base.fra21.fra23.02 \
        -anchor "w" -borderwidth "1" -font "Helvetica -12 {}" \
        -text "No X11 forwarding" -variable "x11forward" 
    frame $base.fra21.fra24 \
        -borderwidth "2" -height "75" -relief "groove" -width "125" 
    label $base.fra21.fra24.lab18 \
        -background "#6464fe" -borderwidth "1" -font "Helvetica -12 {}" \
        -foreground "#fefefe" -relief "raised" -text "Connection Properties" 
    label $base.fra21.fra24.lab17 \
        -anchor "w" -borderwidth "1" -font "Helvetica -12 {}" -text "Title:" 
    entry $base.fra21.fra24.ent18 \
        -background "#fefefe" -borderwidth "1" 
    label $base.fra21.fra24.lab19 \
        -anchor "w" -borderwidth "0" -font "Helvetica -12 {}" \
        -relief "raised" -text "Host:" 
    entry $base.fra21.fra24.ent20 \
        -background "#fefefe" -borderwidth "1" 
    label $base.fra21.fra24.lab21 \
        -anchor "w" -borderwidth "0" -font "Helvetica -12 {}" \
        -relief "raised" -text "User:" 
    entry $base.fra21.fra24.ent22 \
        -background "#fefefe" -borderwidth "1" 
    label $base.fra21.fra24.lab23 \
        -anchor "w" -borderwidth "0" -font "Helvetica -12 {}" \
        -relief "raised" -text "Port:" 
    entry $base.fra21.fra24.ent24 \
        -background "#fefefe" -borderwidth "1" 
    label $base.fra21.fra24.lab25 \
        -anchor "w" -borderwidth "0" -font "Helvetica -12 {}" \
        -relief "raised" -text "Command:" 
    entry $base.fra21.fra24.ent26 \
        -background "#fefefe" -borderwidth "1" 
    frame $base.fra21.fra25 \
        -borderwidth "2" -height "75" -relief "groove" -width "125" 
    checkbutton $base.fra21.fra25.01 \
        -borderwidth "1" -font "Helvetica -12 {}" -text "Enable Compression" \
        -variable "compress" 
    scale $base.fra21.fra25.02 \
        -borderwidth "1" -font "Helvetica -12 {}" -orient "horiz" -to "9.0" \
        -variable "compressval" 
    label $base.fra21.fra25.03 \
        -borderwidth "1" -font "Helvetica -12 {}" -relief "raised" \
        -text "Compression Level" 
    label $base.fra21.fra25.lab19 \
        -background "#6464fe" -borderwidth "1" -font "Helvetica -12 {}" \
        -foreground "#fefefe" -relief "raised" -text "Compression" 
    frame $base.fra21.fra26 \
        -borderwidth "2" -height "75" -relief "groove" -width "125" 
    button $base.fra21.fra26.01 \
        -borderwidth "1" -command "local_forwardings 1" \
        -font "Helvetica -12 {}" -padx "9" -pady "3" \
        -text "Local Forwardings" 
    button $base.fra21.fra26.02 \
        -borderwidth "1" -command "remote_forwardings 1" \
        -font "Helvetica -12 {}" -padx "9" -pady "3" -state "disabled" \
        -text "Remote forwardings" 
    checkbutton $base.fra21.fra26.03 \
        -anchor "w" -borderwidth "1" -font "Helvetica -12 {}" \
        -text "Export local forwardings" -variable "gateway" 
    label $base.fra21.fra26.lab17 \
        -background "#6464ff" -borderwidth "1" -font "Helvetica -12 {}" \
        -foreground "#fefefe" -relief "raised" -text "Forwardings" 
    frame $base.fra21.fra27 \
        -borderwidth "2" -height "75" -relief "groove" -width "125" 
    checkbutton $base.fra21.fra27.01 \
        -anchor "w" -borderwidth "1" -font "Helvetica -12 {}" -text "Verbose" \
        -variable "verbose" 
    checkbutton $base.fra21.fra27.02 \
        -anchor "w" -borderwidth "1" -font "Helvetica -12 {}" -text "Quiet" \
        -variable "quiet" 
    checkbutton $base.fra21.fra27.03 \
        -anchor "w" -borderwidth "1" -font "Helvetica -12 {}" \
        -text "Fork into background" -variable "fork" 
    frame $base.fra21.fra28 \
        -borderwidth "2" -height "75" -relief "groove" -width "125" 
    button $base.fra21.fra28.01 \
        -borderwidth "1" -command "select_ident" -font "Helvetica -12 {}" \
        -padx "9" -pady "3" -text "Select identity" 
    entry $base.fra21.fra28.02 \
        -background "#fefefe" -borderwidth "1" 
    frame $base.fra21.fra48 \
        -borderwidth "2" -height "75" -relief "groove" -width "110" 
    button $base.fra21.fra48.but50 \
        -borderwidth "1" -command "delete_profile" -font "Helvetica -12 {}" \
        -padx "9" -pady "3" -text "Delete" 
    button $base.fra21.fra48.but51 \
        -borderwidth "1" -command "save_profile" -font "Helvetica -12 {}" \
        -padx "9" -pady "3" -text "Save" 
    label $base.fra21.fra48.lab52 \
        -background "#6464ff" -borderwidth "1" -font "Helvetica -12 {}" \
        -foreground "#fefefe" -relief "raised" -text "Profile-Management" 
    entry $base.fra21.fra48.ent53 \
        -background "#fefefe" -borderwidth "1" -width "0" 
    frame $base.fra21.fra48.cpd18 \
        -height "30" -relief "raised" -width "3" 
    listbox $base.fra21.fra48.cpd18.01 \
        -background "#fefefe" -borderwidth "1" \
        -font "-Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-*" \
        -height "3" -width "10" \
        -xscrollcommand ".top17.fra21.fra48.cpd18.02 set" \
        -yscrollcommand ".top17.fra21.fra48.cpd18.03 set" 
    bind $base.fra21.fra48.cpd18.01 <Double-Button-1> {
        load_profile ssh
    }
    scrollbar $base.fra21.fra48.cpd18.02 \
        -borderwidth "1" -command ".top17.fra21.fra48.cpd18.01 xview" \
        -orient "horiz" -width "10" 
    scrollbar $base.fra21.fra48.cpd18.03 \
        -borderwidth "1" -command ".top17.fra21.fra48.cpd18.01 yview" \
        -orient "vert" -width "10" 
    button $base.fra21.fra48.but19 \
        -borderwidth "1" -command "load_profile ssh" -font "Helvetica -12 {}" \
        -padx "9" -pady "3" -text "Load" 
    button $base.fra21.fra48.but20 \
        -borderwidth "1" -command "clear_profiles" -font "Helvetica -12 {}" \
        -padx "9" -pady "3" -text "New" 
    frame $base.fra30 \
        -borderwidth "2" -height "75" -relief "groove" -width "125" 
    button $base.fra30.but31 \
        -borderwidth "1" -command "changetab connect" \
        -font "Helvetica -12 {}" -padx "9" -pady "3" -text "Connects" 
    button $base.fra30.but32 \
        -borderwidth "1" -command "changetab terminal" \
        -font "Helvetica -12 {}" -padx "9" -pady "3" \
        -text "Terminal Settings" 
    button $base.fra30.but33 \
        -borderwidth "1" -command "changetab ssh" -font "Helvetica -12 {}" \
        -padx "9" -pady "3" -text "SSH-Settings" 
    button $base.fra30.but34 \
        -borderwidth "1" -command "changetab key" -font "Helvetica -12 {}" \
        -padx "9" -pady "3" -text "SSH-Keymanagement" 
    frame $base.fra35 \
        -borderwidth "2" -height "75" -relief "groove" -width "125" 
    label $base.fra35.lab30 \
        -borderwidth "1" -relief "raised" \
        -text "SSH-Keymanagement not
yet implemented
This is version 0.1 of SecPanel" 
    frame $base.fra44 \
        -borderwidth "2" -height "75" -relief "groove" -width "125" 
    label $base.fra44.lab45 \
        -borderwidth "1" -relief "raised" \
        -text "Terminal-Settings
Not yet implemented.
This is version 0.1 of SecPanel" 
    frame $base.fra46 \
        -borderwidth "2" -height "75" -relief "groove" -width "125" 
    frame $base.fra46.fra24 \
        -borderwidth "2" -height "75" -relief "groove" -width "125" 
    frame $base.fra46.fra24.fra25 \
        -height "30" -relief "raised" -width "30" 
    listbox $base.fra46.fra24.fra25.01 \
        -background "#fefefe" -borderwidth "1" \
        -font "-Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-*" \
        -height "6" -xscrollcommand ".top17.fra46.fra24.fra25.02 set" \
        -yscrollcommand ".top17.fra46.fra24.fra25.03 set" 
    bind $base.fra46.fra24.fra25.01 <Double-Button-1> {
	connect def
    }
    scrollbar $base.fra46.fra24.fra25.02 \
        -borderwidth "1" -command ".top17.fra46.fra24.fra25.01 xview" \
        -orient "horiz" -width "10" 
    scrollbar $base.fra46.fra24.fra25.03 \
        -borderwidth "1" -command ".top17.fra46.fra24.fra25.01 yview" \
        -orient "vert" -width "10" 
    frame $base.fra46.fra24.fra28 \
        -borderwidth "2" -height "75" -relief "groove" -width "125" 
    button $base.fra46.fra24.fra28.but30 \
        -borderwidth "1" -command "newconn def 1" -font "Helvetica -12 {}" \
        -padx "9" -pady "3" -text "New" 
    button $base.fra46.fra24.fra28.but31 \
        -borderwidth "1" -command "propconn def 1" -font "Helvetica -12 {}" \
        -padx "9" -pady "3" -text "Props" 
    button $base.fra46.fra24.fra28.but32 \
        -borderwidth "1" -command "delconn def" -font "Helvetica -12 {}" \
        -padx "9" -pady "3" -text "Delete" 
    button $base.fra46.fra24.fra28.but39 \
        -borderwidth "1" -font "Helvetica -12 {}" -padx "9" -pady "3" \
        -text "Connect" -command "connect def"
    label $base.fra46.fra24.lab33 \
        -background "#6165ff" -borderwidth "1" -foreground "#fefefe" \
        -relief "raised" -text "Connects using the default profile" 
    frame $base.fra46.fra26 \
        -borderwidth "2" -height "75" -relief "groove" -width "125" 
    frame $base.fra46.fra26.fra27 \
        -height "30" -relief "raised" -width "30" 
    listbox $base.fra46.fra26.fra27.01 \
        -background "#fefefe" -borderwidth "1" \
        -font "-Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-*" \
        -height "6" -xscrollcommand ".top17.fra46.fra26.fra27.02 set" \
        -yscrollcommand ".top17.fra46.fra26.fra27.03 set"
    bind .top17.fra46.fra26.fra27.01 <Double-Button-1> {
	connect spec
    }
    scrollbar $base.fra46.fra26.fra27.02 \
        -borderwidth "1" -command ".top17.fra46.fra26.fra27.01 xview" \
        -orient "horiz" -width "10" 
    scrollbar $base.fra46.fra26.fra27.03 \
        -borderwidth "1" -command ".top17.fra46.fra26.fra27.01 yview" \
        -orient "vert" -width "10" 
    frame $base.fra46.fra26.fra29 \
        -borderwidth "2" -height "75" -relief "groove" -width "125" 
    button $base.fra46.fra26.fra29.but35 \
        -borderwidth "1" -command "newconn spec 1" -font "Helvetica -12 {}" \
        -padx "9" -pady "3" -text "New" 
    button $base.fra46.fra26.fra29.but36 \
        -borderwidth "1" -command "propconn spec 1" -font "Helvetica -12 {}" \
        -padx "9" -pady "3" -text "Props" 
    button $base.fra46.fra26.fra29.but37 \
        -borderwidth "1" -command "delconn spec" -font "Helvetica -12 {}" \
        -padx "9" -pady "3" -text "Delete" 
    button $base.fra46.fra26.fra29.but38 \
        -borderwidth "1" -font "Helvetica -12 {}" -padx "9" -pady "3" \
        -text "Connect" -command "connect spec"
    label $base.fra46.fra26.lab34 \
        -background "#6464ff" -borderwidth "1" -foreground "#fefefe" \
        -relief "raised" -text "Special connects" 
    ###################
    # SETTING GEOMETRY
    ###################
    grid columnconf $base 0 -weight 1
    grid rowconf $base 1 -weight 1

    grid columnconf $base.fra21 0 -weight 1
    grid columnconf $base.fra21 1 -weight 1

    grid rowconf $base.fra21 0 -weight 1
    grid rowconf $base.fra21 1 -weight 1
    grid rowconf $base.fra21 2 -weight 1
    grid rowconf $base.fra21 3 -weight 1

    grid $base.fra21.fra22 \
        -in ".top17.fra21" -column "0" -row "1" -columnspan "1" -rowspan "1" \
        -ipadx "2" -ipady "2" -padx "2" -pady "2" -sticky "nesw" 
    grid $base.fra21.fra22.01 \
        -in ".top17.fra21.fra22" -column "0" -row "1" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra22.03 \
        -in ".top17.fra21.fra22" -column "0" -row "0" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra22.04 \
        -in ".top17.fra21.fra22" -column "0" -row "2" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra23 \
        -in ".top17.fra21" -column "0" -row "2" -columnspan "1" -rowspan "1" \
        -ipadx "2" -ipady "2" -padx "2" -pady "2" -sticky "nesw" 
    grid $base.fra21.fra23.01 \
        -in ".top17.fra21.fra23" -column "0" -row "0" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra23.02 \
        -in ".top17.fra21.fra23" -column "0" -row "1" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra24 \
        -in ".top17.fra21" -column "1" -row "0" -columnspan "1" -rowspan "1" \
        -ipadx "2" -ipady "2" -padx "2" -pady "2" -sticky "nesw" 
    grid columnconf $base.fra21.fra24 1 -weight 1
    grid $base.fra21.fra24.lab18 \
        -in ".top17.fra21.fra24" -column "0" -row "0" -columnspan "2" \
        -rowspan "1" -padx "2" -pady "2" -sticky "ew" 
    grid $base.fra21.fra24.lab17 \
        -in ".top17.fra21.fra24" -column "0" -row "1" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra24.ent18 \
        -in ".top17.fra21.fra24" -column "1" -row "1" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra24.lab19 \
        -in ".top17.fra21.fra24" -column "0" -row "2" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra24.ent20 \
        -in ".top17.fra21.fra24" -column "1" -row "2" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra24.lab21 \
        -in ".top17.fra21.fra24" -column "0" -row "3" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra24.ent22 \
        -in ".top17.fra21.fra24" -column "1" -row "3" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra24.lab23 \
        -in ".top17.fra21.fra24" -column "0" -row "4" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra24.ent24 \
        -in ".top17.fra21.fra24" -column "1" -row "4" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra24.lab25 \
        -in ".top17.fra21.fra24" -column "0" -row "5" -columnspan "1" \
        -rowspan "1" 
    grid $base.fra21.fra24.ent26 \
        -in ".top17.fra21.fra24" -column "1" -row "5" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra25 \
        -in ".top17.fra21" -column "1" -row "3" -columnspan "1" -rowspan "1" \
        -ipadx "2" -ipady "2" -padx "2" -pady "2" -sticky "nesw" 
    grid $base.fra21.fra25.01 \
        -in ".top17.fra21.fra25" -column "0" -row "1" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra25.02 \
        -in ".top17.fra21.fra25" -column "0" -row "3" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra25.03 \
        -in ".top17.fra21.fra25" -column "0" -row "2" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra25.lab19 \
        -in ".top17.fra21.fra25" -column "0" -row "0" -columnspan "1" \
        -rowspan "1" -padx "2" -pady "2" -sticky "ew" 
    grid $base.fra21.fra26 \
        -in ".top17.fra21" -column "0" -row "3" -columnspan "1" -rowspan "1" \
        -ipadx "2" -ipady "2" -padx "2" -pady "2" -sticky "nesw" 
    grid $base.fra21.fra26.01 \
        -in ".top17.fra21.fra26" -column "0" -row "1" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra26.02 \
        -in ".top17.fra21.fra26" -column "0" -row "2" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra26.03 \
        -in ".top17.fra21.fra26" -column "0" -row "3" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra26.lab17 \
        -in ".top17.fra21.fra26" -column "0" -row "0" -columnspan "1" \
        -rowspan "1" -padx "2" -pady "2" -sticky "ew" 
    grid $base.fra21.fra27 \
        -in ".top17.fra21" -column "1" -row "2" -columnspan "1" -rowspan "1" \
        -ipadx "2" -ipady "2" -padx "2" -pady "2" -sticky "nesw" 
    grid $base.fra21.fra27.01 \
        -in ".top17.fra21.fra27" -column "0" -row "0" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra27.02 \
        -in ".top17.fra21.fra27" -column "0" -row "1" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra27.03 \
        -in ".top17.fra21.fra27" -column "0" -row "3" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra28 \
        -in ".top17.fra21" -column "1" -row "1" -columnspan "1" -rowspan "1" \
        -ipadx "2" -ipady "2" -padx "2" -pady "2" -sticky "nesw" 
    grid $base.fra21.fra28.01 \
        -in ".top17.fra21.fra28" -column "0" -row "0" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra28.02 \
        -in ".top17.fra21.fra28" -column "0" -row "1" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra48 \
        -in ".top17.fra21" -column "0" -row "0" -columnspan "1" -rowspan "1" \
        -ipadx "2" -ipady "2" -padx "2" -pady "2" -sticky "nesw" 
    grid columnconf $base.fra21.fra48 1 -weight 1
    grid columnconf $base.fra21.fra48 2 -weight 1
    grid columnconf $base.fra21.fra48 3 -weight 1
    grid rowconf $base.fra21.fra48 1 -weight 1
    grid $base.fra21.fra48.but50 \
        -in ".top17.fra21.fra48" -column "1" -row "2" -columnspan "1" \
        -rowspan "1" 
    grid $base.fra21.fra48.but51 \
        -in ".top17.fra21.fra48" -column "0" -row "2" -columnspan "1" \
        -rowspan "1" 
    grid $base.fra21.fra48.lab52 \
        -in ".top17.fra21.fra48" -column "0" -row "0" -columnspan "4" \
        -rowspan "1" -padx "2" -pady "2" -sticky "ew" 
    grid $base.fra21.fra48.ent53 \
        -in ".top17.fra21.fra48" -column "0" -row "1" -columnspan "2" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra48.cpd18 \
        -in ".top17.fra21.fra48" -column "2" -row "1" -columnspan "2" \
        -rowspan "1" -sticky "nesw" 
    grid columnconf $base.fra21.fra48.cpd18 0 -weight 1
    grid rowconf $base.fra21.fra48.cpd18 0 -weight 1
    grid $base.fra21.fra48.cpd18.01 \
        -in ".top17.fra21.fra48.cpd18" -column "0" -row "0" -columnspan "1" \
        -rowspan "1" -sticky "nesw" 
    grid $base.fra21.fra48.cpd18.02 \
        -in ".top17.fra21.fra48.cpd18" -column "0" -row "1" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra21.fra48.cpd18.03 \
        -in ".top17.fra21.fra48.cpd18" -column "1" -row "0" -columnspan "1" \
        -rowspan "1" -sticky "ns" 
    grid $base.fra21.fra48.but19 \
        -in ".top17.fra21.fra48" -column "2" -row "2" -columnspan "1" \
        -rowspan "1" 
    grid $base.fra21.fra48.but20 \
        -in ".top17.fra21.fra48" -column "3" -row "2" -columnspan "1" \
        -rowspan "1" 
    grid $base.fra30 \
        -in ".top17" -column "0" -row "0" -columnspan "1" -rowspan "1" \
        -ipadx "2" -ipady "2" -padx "2" -pady "2" -sticky "ew" 
    grid $base.fra30.but31 \
        -in ".top17.fra30" -column "0" -row "0" -columnspan "1" -rowspan "1" 
    grid $base.fra30.but32 \
        -in ".top17.fra30" -column "1" -row "0" -columnspan "1" -rowspan "1" 
    grid $base.fra30.but33 \
        -in ".top17.fra30" -column "2" -row "0" -columnspan "1" -rowspan "1" 
    grid $base.fra30.but34 \
        -in ".top17.fra30" -column "3" -row "0" -columnspan "1" -rowspan "1" 
    grid $base.fra35.lab30 \
        -in ".top17.fra35" -column "0" -row "5" -columnspan "1" -rowspan "1" 
    grid $base.fra44.lab45 \
        -in ".top17.fra44" -column "0" -row "0" -columnspan "1" -rowspan "1" 
    grid $base.fra46 \
        -in ".top17" -column "0" -row "1" -columnspan "1" -rowspan "1" \
        -ipadx "2" -ipady "2" -padx "2" -pady "2" -sticky "nesw" 
    grid columnconf $base.fra46 0 -weight 1
    grid rowconf $base.fra46 0 -weight 1
    grid rowconf $base.fra46 1 -weight 1
    grid $base.fra46.fra24 \
        -in ".top17.fra46" -column "0" -row "0" -columnspan "1" -rowspan "1" \
        -ipadx "2" -ipady "2" -padx "10" -pady "10" -sticky "nesw" 
    grid columnconf $base.fra46.fra24 0 -weight 1
    grid rowconf $base.fra46.fra24 1 -weight 1
    grid $base.fra46.fra24.fra25 \
        -in ".top17.fra46.fra24" -column "0" -row "1" -columnspan "1" \
        -rowspan "1" -padx "2" -pady "2" -sticky "nesw" 
    grid columnconf $base.fra46.fra24.fra25 0 -weight 1
    grid rowconf $base.fra46.fra24.fra25 0 -weight 1
    grid $base.fra46.fra24.fra25.01 \
        -in ".top17.fra46.fra24.fra25" -column "0" -row "0" -columnspan "1" \
        -rowspan "1" -sticky "nesw" 
    grid $base.fra46.fra24.fra25.02 \
        -in ".top17.fra46.fra24.fra25" -column "0" -row "1" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra46.fra24.fra25.03 \
        -in ".top17.fra46.fra24.fra25" -column "1" -row "0" -columnspan "1" \
        -rowspan "1" -sticky "ns" 
    grid $base.fra46.fra24.fra28 \
        -in ".top17.fra46.fra24" -column "1" -row "1" -columnspan "1" \
        -rowspan "1" -ipadx "2" -ipady "2" -padx "2" -pady "2" -sticky "ns" 
    grid $base.fra46.fra24.fra28.but30 \
        -in ".top17.fra46.fra24.fra28" -column "0" -row "0" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra46.fra24.fra28.but31 \
        -in ".top17.fra46.fra24.fra28" -column "0" -row "1" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra46.fra24.fra28.but32 \
        -in ".top17.fra46.fra24.fra28" -column "0" -row "2" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra46.fra24.fra28.but39 \
        -in ".top17.fra46.fra24.fra28" -column "0" -row "3" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra46.fra24.lab33 \
        -in ".top17.fra46.fra24" -column "0" -row "0" -columnspan "2" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra46.fra26 \
        -in ".top17.fra46" -column "0" -row "1" -columnspan "1" -rowspan "1" \
        -ipadx "2" -ipady "2" -padx "10" -pady "10" -sticky "nesw" 
    grid columnconf $base.fra46.fra26 0 -weight 1
    grid rowconf $base.fra46.fra26 1 -weight 1
    grid $base.fra46.fra26.fra27 \
        -in ".top17.fra46.fra26" -column "0" -row "1" -columnspan "1" \
        -rowspan "1" -padx "2" -pady "2" -sticky "nesw" 
    grid columnconf $base.fra46.fra26.fra27 0 -weight 1
    grid rowconf $base.fra46.fra26.fra27 0 -weight 1
    grid $base.fra46.fra26.fra27.01 \
        -in ".top17.fra46.fra26.fra27" -column "0" -row "0" -columnspan "1" \
        -rowspan "1" -sticky "nesw" 
    grid $base.fra46.fra26.fra27.02 \
        -in ".top17.fra46.fra26.fra27" -column "0" -row "1" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra46.fra26.fra27.03 \
        -in ".top17.fra46.fra26.fra27" -column "1" -row "0" -columnspan "1" \
        -rowspan "1" -sticky "ns" 
    grid $base.fra46.fra26.fra29 \
        -in ".top17.fra46.fra26" -column "1" -row "1" -columnspan "1" \
        -rowspan "1" -ipadx "2" -ipady "2" -padx "2" -pady "2" -sticky "ns" 
    grid $base.fra46.fra26.fra29.but35 \
        -in ".top17.fra46.fra26.fra29" -column "0" -row "0" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra46.fra26.fra29.but36 \
        -in ".top17.fra46.fra26.fra29" -column "0" -row "1" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra46.fra26.fra29.but37 \
        -in ".top17.fra46.fra26.fra29" -column "0" -row "2" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra46.fra26.fra29.but38 \
        -in ".top17.fra46.fra26.fra29" -column "0" -row "3" -columnspan "1" \
        -rowspan "1" -sticky "ew" 
    grid $base.fra46.fra26.lab34 \
        -in ".top17.fra46.fra26" -column "0" -row "0" -columnspan "2" \
        -rowspan "1" -sticky "ew" 
}

proc vTclWindow.top18 {base} {
    if {$base == ""} {
        set base .top18
    }
    if {[winfo exists $base]} {
        wm deiconify $base; return
    }
    ###################
    # CREATING WIDGETS
    ###################
    toplevel $base -class Toplevel  -borderwidth "4" 
    wm focusmodel $base passive
    wm geometry $base 330x138
    wm maxsize $base 1009 738
    wm minsize $base 1 1
    wm overrideredirect $base 0
    wm resizable $base 1 1
    wm title $base "SecPanel Message"
    frame $base.fra20  -borderwidth "2" -height "75" -relief "groove" -width "125" 
    message $base.fra20.mes23  -aspect "500" -font "helvetica 12 bold" -padx "5" -pady "2"  -text "Message..." 
    label $base.fra20.lab24  -bitmap "warning" -borderwidth "1" -text "label" 
    frame $base.fra21  -borderwidth "2" -height "75" -relief "groove" -width "125" 
    button $base.fra21.but22  -borderwidth "1" -command "Window destroy .top18"  -font "Helvetica 12 bold" -padx "9" -pady "3" -text "OK" 
    ###################
    # SETTING GEOMETRY
    ###################
    grid columnconf $base 0 -weight 1
    grid rowconf $base 1 -weight 1
    grid $base.fra20  -in ".top18" -column "0" -row "1" -columnspan "1" -rowspan "1"  -ipadx "2" -ipady "2" -padx "2" -pady "2" -sticky "nesw" 
    grid $base.fra20.mes23  -in ".top18.fra20" -column "0" -row "0" -columnspan "1" -rowspan "1" 
    grid $base.fra20.lab24  -in ".top18.fra20" -column "1" -row "0" -columnspan "1" -rowspan "1" 
    grid $base.fra21  -in ".top18" -column "0" -row "2" -columnspan "1" -rowspan "1"  -ipadx "2" -ipady "2" -padx "2" -pady "2" -sticky "ew" 
    grid $base.fra21.but22  -in ".top18.fra21" -column "0" -row "0" -columnspan "1" -rowspan "1"
}

proc vTclWindow.top25 {base} {
    if {$base == ""} {
        set base .top25
    }
    if {[winfo exists $base]} {
        wm deiconify $base; return
    }
    ###################
    # CREATING WIDGETS
    ###################
    toplevel $base -class Toplevel  -borderwidth "4" 
    wm focusmodel $base passive
    wm geometry $base 217x114
    wm maxsize $base 1009 738
    wm minsize $base 1 1
    wm overrideredirect $base 0
    wm resizable $base 1 1
    wm title $base "About SecPanel"
    frame $base.fra26  -borderwidth "2" -height "75" -relief "groove" -width "125" 
    message $base.fra26.mes28  -aspect "500" -font "Helvetica -12 {}" -justify "center" -padx "5"  -pady "2"  -text "SecPanel Version 0.1
Copyright (C) 1999 Steffen Leich
(leich@wiwi.uni-marburg.de)" 
    frame $base.fra27  -borderwidth "2" -height "75" -relief "groove" -width "125" 
    button $base.fra27.but29  -borderwidth "1" -command "Window destroy .top25"  -font "Helvetica -12 {}" -padx "9" -pady "3" -text "Close" 
    ###################
    # SETTING GEOMETRY
    ###################
    grid columnconf $base 0 -weight 1
    grid rowconf $base 0 -weight 1
    grid $base.fra26  -in ".top25" -column "0" -row "0" -columnspan "1" -rowspan "1"  -ipadx "2" -ipady "2" -padx "2" -pady "2" -sticky "nesw" 
    grid $base.fra26.mes28  -in ".top25.fra26" -column "0" -row "0" -columnspan "1" -rowspan "1" 
    grid $base.fra27  -in ".top25" -column "0" -row "1" -columnspan "1" -rowspan "1"  -ipadx "2" -ipady "2" -padx "2" -pady "2" -sticky "ew" 
    grid $base.fra27.but29  -in ".top25.fra27" -column "0" -row "0" -columnspan "1" -rowspan "1"
}

proc vTclWindow.top40 {base} {
    if {$base == ""} {
        set base .top40
    }
    if {[winfo exists $base]} {
        wm deiconify $base; return
    }
    ###################
    # CREATING WIDGETS
    ###################
    toplevel $base -class Toplevel  -borderwidth "4" 
    wm focusmodel $base passive
    wm geometry $base 251x146
    wm maxsize $base 1009 738
    wm minsize $base 1 1
    wm overrideredirect $base 0
    wm resizable $base 1 1
    wm title $base "Connection Entry"
    frame $base.fra45  -borderwidth "2" -height "75" -relief "groove" -width "125" 
    button $base.fra45.but46  -borderwidth "1" -command "Window destroy .top40"  -font "Helvetica -12 {}" -padx "9" -pady "3" -text "Cancel" 
    button $base.fra45.but47  -borderwidth "1" -command "newconn def 2" -font "Helvetica -12 {}"  -padx "9" -pady "3" -text "Save" 
    label $base.lab20  -background "#6464fe" -borderwidth "1" -font "Helvetica -12 {}"  -foreground "#fefefe" -relief "raised" -text "Connection entry" 
    frame $base.fra21  -borderwidth "2" -height "75" -relief "groove" -width "125" 
    label $base.fra21.lab22  -anchor "w" -borderwidth "1" -font "Helvetica -12 {}" -text "Title:" 
    entry $base.fra21.ent23  -background "#fefefe" -borderwidth "1" 
    label $base.fra21.lab24  -anchor "w" -borderwidth "1" -font "Helvetica -12 {}" -text "Adress:"  -width "4" 
    entry $base.fra21.ent25  -background "#fefefe" -borderwidth "1" 
    label $base.fra21.lab26  -anchor "w" -borderwidth "1" -font "Helvetica -12 {}" -text "User:" 
    entry $base.fra21.ent27  -background "#fefefe" -borderwidth "1" 
    ###################
    # SETTING GEOMETRY
    ###################
    grid columnconf $base 0 -weight 1
    grid rowconf $base 2 -weight 1
    grid $base.fra45  -in ".top40" -column "0" -row "2" -columnspan "1" -rowspan "1"  -ipadx "2" -ipady "2" -padx "2" -pady "2" -sticky "nesw" 
    grid $base.fra45.but46  -in ".top40.fra45" -column "0" -row "0" -columnspan "1" -rowspan "1" 
    grid $base.fra45.but47  -in ".top40.fra45" -column "1" -row "0" -columnspan "1" -rowspan "1" 
    grid $base.lab20  -in ".top40" -column "0" -row "0" -columnspan "1" -rowspan "1"  -padx "2" -pady "2" -sticky "ew" 
    grid $base.fra21  -in ".top40" -column "0" -row "1" -columnspan "1" -rowspan "1"  -ipadx "2" -ipady "2" -padx "2" -pady "2" -sticky "ew" 
    grid columnconf $base.fra21 0 -weight 1
    grid columnconf $base.fra21 1 -weight 1
    grid $base.fra21.lab22  -in ".top40.fra21" -column "0" -row "0" -columnspan "1" -rowspan "1"  -sticky "ew" 
    grid $base.fra21.ent23  -in ".top40.fra21" -column "1" -row "0" -columnspan "1" -rowspan "1"  -sticky "ew" 
    grid $base.fra21.lab24  -in ".top40.fra21" -column "0" -row "1" -columnspan "1" -rowspan "1"  -sticky "ew" 
    grid $base.fra21.ent25  -in ".top40.fra21" -column "1" -row "1" -columnspan "1" -rowspan "1"  -sticky "ew" 
    grid $base.fra21.lab26  -in ".top40.fra21" -column "0" -row "2" -columnspan "1" -rowspan "1"  -sticky "ew" 
    grid $base.fra21.ent27  -in ".top40.fra21" -column "1" -row "2" -columnspan "1" -rowspan "1"  -sticky "ew"
}

proc vTclWindow.top43 {base} {
    if {$base == ""} {
        set base .top43
    }
    if {[winfo exists $base]} {
        wm deiconify $base; return
    }
    ###################
    # CREATING WIDGETS
    ###################
    toplevel $base -class Toplevel  -borderwidth "4" 
    wm focusmodel $base passive
    wm geometry $base 230x213
    wm maxsize $base 1009 738
    wm minsize $base 1 1
    wm overrideredirect $base 0
    wm resizable $base 1 1
    wm title $base "Local Forwardings"
    frame $base.cpd44  -borderwidth "1" -width "60" 
    listbox $base.cpd44.01  -background "#fefefe" -borderwidth "1"  -font "-Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-*"  -height "5" -xscrollcommand ".top43.cpd44.02 set"  -yscrollcommand ".top43.cpd44.03 set" 
    scrollbar $base.cpd44.02  -borderwidth "1" -command ".top43.cpd44.01 xview" -orient "horiz"  -width "10" 
    scrollbar $base.cpd44.03  -borderwidth "1" -command ".top43.cpd44.01 yview" -orient "vert"  -width "10" 
    frame $base.fra45  -borderwidth "2" -height "75" -relief "groove" -width "125" 
    entry $base.fra45.ent46  -background "#fefefe" -borderwidth "1" -width "10" 
    label $base.fra45.lab47  -borderwidth "1" -relief "raised" -text "->" 
    entry $base.fra45.ent48  -background "#fefefe" -borderwidth "1" -width "10" 
    bind $base.fra45.ent48 <Key-Return> {
        add_forw
    }
    menubutton $base.fra45.men49  -borderwidth "1" -font "Helvetica -12 {}" -indicatoron "1"  -menu ".top43.fra45.men49.m" -padx "4" -pady "3" -relief "raised"  -text "Ports" 
    menu $base.fra45.men49.m  -borderwidth "1" -cursor "" -font "Helvetica -12" -tearoff "0" 
    $base.fra45.men49.m add command  -command "insprot 110" -label "pop3" 
    $base.fra45.men49.m add command  -command "insprot 143" -label "imap" 
    button $base.fra45.but21  -borderwidth "1" -command "add_forw" -font "Helvetica -12 {}"  -padx "9" -pady "3" -text "Add" 
    button $base.fra45.but17  -borderwidth "1" -command "del_forw" -font "Helvetica -12 {}"  -padx "9" -pady "3" -text "Delete" 
    label $base.lab50  -background "#6464fe" -borderwidth "1" -font "Helvetica -12 {}"  -foreground "#fefefe" -relief "raised" -text "Local forwardings" 
    button $base.but22  -borderwidth "1" -command "Window destroy .top43"  -font "Helvetica -12 {}" -padx "9" -pady "3" -text "Cancel" 
    button $base.but17  -borderwidth "1" -command "save_forwards local"  -font "Helvetica -12 {}" -padx "9" -pady "3" -text "OK" 
    ###################
    # SETTING GEOMETRY
    ###################
    grid columnconf $base 0 -weight 1
    grid columnconf $base 1 -weight 1
    grid rowconf $base 1 -weight 1
    grid $base.cpd44  -in ".top43" -column "0" -row "1" -columnspan "2" -rowspan "1"  -padx "2" -pady "2" -sticky "nesw" 
    grid columnconf $base.cpd44 0 -weight 1
    grid rowconf $base.cpd44 0 -weight 1
    grid $base.cpd44.01  -in ".top43.cpd44" -column "0" -row "0" -columnspan "1" -rowspan "1"  -sticky "nesw" 
    grid $base.cpd44.02  -in ".top43.cpd44" -column "0" -row "1" -columnspan "1" -rowspan "1"  -sticky "ew" 
    grid $base.cpd44.03  -in ".top43.cpd44" -column "1" -row "0" -columnspan "1" -rowspan "1"  -sticky "ns" 
    grid $base.fra45  -in ".top43" -column "0" -row "2" -columnspan "2" -rowspan "1"  -ipadx "2" -ipady "2" -padx "2" -pady "2" -sticky "ew" 
    grid $base.fra45.ent46  -in ".top43.fra45" -column "0" -row "0" -columnspan "1" -rowspan "1" 
    grid $base.fra45.lab47  -in ".top43.fra45" -column "1" -row "0" -columnspan "1" -rowspan "1" 
    grid $base.fra45.ent48  -in ".top43.fra45" -column "2" -row "0" -columnspan "1" -rowspan "1" 
    grid $base.fra45.men49  -in ".top43.fra45" -column "2" -row "1" -columnspan "1" -rowspan "1" 
    grid $base.fra45.but21  -in ".top43.fra45" -column "1" -row "1" -columnspan "1" -rowspan "1" 
    grid $base.fra45.but17  -in ".top43.fra45" -column "0" -row "1" -columnspan "1" -rowspan "1" 
    grid $base.lab50  -in ".top43" -column "0" -row "0" -columnspan "2" -rowspan "1"  -padx "2" -pady "2" -sticky "ew" 
    grid $base.but22  -in ".top43" -column "0" -row "3" -columnspan "1" -rowspan "1" 
    grid $base.but17  -in ".top43" -column "1" -row "3" -columnspan "1" -rowspan "1"
}

proc vTclWindow.top51 {base} {
    if {$base == ""} {
        set base .top51
    }
    if {[winfo exists $base]} {
        wm deiconify $base; return
    }
    ###################
    # CREATING WIDGETS
    ###################
    toplevel $base -class Toplevel  -borderwidth "4" 
    wm focusmodel $base passive
    wm geometry $base 230x213
    wm maxsize $base 1009 738
    wm minsize $base 1 1
    wm overrideredirect $base 0
    wm resizable $base 1 1
    wm title $base "Remote Forwardings"
    label $base.lab52  -background "#6464fe" -borderwidth "1" -font "Helvetica -12 {}"  -foreground "#fefefe" -relief "raised" -text "Remote forwardings" 
    frame $base.cpd53  -borderwidth "1" -height "30" -width "30" 
    listbox $base.cpd53.01  -background "#fefefe" -borderwidth "1"  -font "-Adobe-Helvetica-Medium-R-Normal-*-*-120-*-*-*-*-*-*"  -height "6" -xscrollcommand ".top51.cpd53.02 set"  -yscrollcommand ".top51.cpd53.03 set" 
    scrollbar $base.cpd53.02  -borderwidth "1" -command ".top51.cpd53.01 xview" -orient "horiz"  -width "10" 
    scrollbar $base.cpd53.03  -borderwidth "1" -command ".top51.cpd53.01 yview" -orient "vert"  -width "10" 
    frame $base.fra54  -borderwidth "2" -height "75" -relief "groove" -width "125" 
    entry $base.fra54.ent55  -background "#fefefe" -borderwidth "1" -width "10" 
    label $base.fra54.lab56  -borderwidth "1" -relief "raised" -text "<-" 
    entry $base.fra54.ent57  -background "#fefefe" -borderwidth "1" -width "10" 
    button $base.fra54.but27  -borderwidth "1" -font "Helvetica -12 {}" -padx "9" -pady "3"  -text "Delete" 
    button $base.fra54.but28  -borderwidth "1" -font "Helvetica -12 {}" -padx "9" -pady "3"  -text "Add" 
    menubutton $base.fra54.men29  -borderwidth "1" -font "Helvetica -12 {}" -indicatoron "1"  -menu ".top51.fra54.men29.m" -padx "4" -pady "3" -relief "raised"  -text "menu" 
    menu $base.fra54.men29.m  -borderwidth "1" -cursor "" -font "Helvetica -12" -tearoff "0" 
    button $base.but21  -borderwidth "1" -command "Window destroy .top51"  -font "Helvetica -12 {}" -padx "9" -pady "3" -text "Cancel" 
    button $base.but18  -borderwidth "1" -command "save_forwards remote"  -font "Helvetica -12 {}" -padx "9" -pady "3" -text "OK"
    ###################
    # SETTING GEOMETRY
    ###################
    grid columnconf $base 0 -weight 1
    grid columnconf $base 1 -weight 1
    grid rowconf $base 1 -weight 1
    grid $base.lab52  -in ".top51" -column "0" -row "0" -columnspan "2" -rowspan "1"  -padx "2" -pady "2" -sticky "ew" 
    grid $base.cpd53  -in ".top51" -column "0" -row "1" -columnspan "2" -rowspan "1"  -padx "2" -pady "2" -sticky "nesw" 
    grid columnconf $base.cpd53 0 -weight 1
    grid rowconf $base.cpd53 0 -weight 1
    grid $base.cpd53.01  -in ".top51.cpd53" -column "0" -row "0" -columnspan "1" -rowspan "1"  -sticky "nesw" 
    grid $base.cpd53.02  -in ".top51.cpd53" -column "0" -row "1" -columnspan "1" -rowspan "1"  -sticky "ew" 
    grid $base.cpd53.03  -in ".top51.cpd53" -column "1" -row "0" -columnspan "1" -rowspan "1"  -sticky "ns" 
    grid $base.fra54  -in ".top51" -column "0" -row "2" -columnspan "2" -rowspan "1"  -ipadx "2" -ipady "2" -padx "2" -pady "2" 
    grid $base.fra54.ent55  -in ".top51.fra54" -column "0" -row "0" -columnspan "1" -rowspan "1" 
    grid $base.fra54.lab56  -in ".top51.fra54" -column "1" -row "0" -columnspan "1" -rowspan "1" 
    grid $base.fra54.ent57  -in ".top51.fra54" -column "2" -row "0" -columnspan "1" -rowspan "1" 
    grid $base.fra54.but27  -in ".top51.fra54" -column "0" -row "1" -columnspan "1" -rowspan "1" 
    grid $base.fra54.but28  -in ".top51.fra54" -column "1" -row "1" -columnspan "1" -rowspan "1" 
    grid $base.fra54.men29  -in ".top51.fra54" -column "2" -row "1" -columnspan "1" -rowspan "1" 
    grid $base.but21  -in ".top51" -column "0" -row "3" -columnspan "1" -rowspan "1" 
    grid $base.but18  -in ".top51" -column "1" -row "3" -columnspan "1" -rowspan "1"
}

Window show .
Window show .top17

main $argc $argv
