[host1]
hostname=host1.yourcompany.com
username=wkocjan
keyfile=C:/mykey.ppk
tunnel1=local:127.0.0.1:5901:127.0.0.1:5900
[host2]
hostname=host2.yourcompany.com
username=wkocjan
keyfile=C:/mykey.ppk
tunnel1=local:127.0.0.1:5902:127.0.0.1:5900
package require starkit
starkit::startup
package require sshtunnels
package require registry
package require twapi
package require inifile
set appdir [file dirname [info nameofexecutable]]
cd $appdir
set appdir [pwd]
catch {wm withdraw .}
set servicename SSHTunnels
switch -- [string trimleft [lindex $argv 0] -/] {
install {
foreach binary {plink.exe srvany.exe} {
set sbinary [file join -- $starkit::topdir bin $binary]
set dbinary [file join -- $appdir $binary]
if {![file exists $dbinary]} {
file copy -force -- $sbinary $dbinary
}
}
if {[catch {
twapi::create_service $servicename \
[file nativename [file join $appdir srvany.exe]] \
-interactive 1 -starttype demand_start \
-displayname "SSH tunnelling service"
} error]} {
tk_messageBox -icon error -message "Error while registering service: $error"
exit 1
}
set regkey "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\$servicename"
registry set $regkey Description \
"Allows configuring one or more SSH tunnels that can be started as a service"
registry set "$regkey\\Parameters" Application \
[file nativename [info nameofexecutable]]
registry set "$regkey\\Parameters" AppParameters service
tk_messageBox -message "Service installed successfully"
exit 0
}
uninstall {
catch {
twapi::stop_service $servicename
}
if {[catch {
twapi::delete_service $servicename
}]} {
tk_messageBox -icon error -message \
"Error while unregistering service: $error"
exit 1
}
tk_messageBox -message "Service uninstalled successfully"
exit 0
}
service {
set configfile [file rootname [info nameofexecutable]].ini
if {[catch {
set ini [ini::open $configfile r]
}]} {
tk_messageBox -icon error -message \
"Unable to read configuration file:\n[file nativename $configfile]"
exit 0
}
foreach section [ini::sections $ini] {
set obj ::tun$section
set cmd [list sshtunnels::sshtunnel $obj]
set tunnels [list]
foreach {n v} [ini::get $ini $section] {
if {[regexp "^tunnel\[0-9\]+\$" $n]} {
lappend tunnels [split $v :]
} else {
lappend cmd -$n $v
}
}
lappend cmd -tunnels $tunnels
if {[catch {
eval $cmd
$obj connect
}]} {
tk_messageBox -icon warning -message "Unable to read section $section - skipping"
}
}
}
C> sdx wrap sshtunnels.exe -runtime tclkit.exe
C> sshtunnels.exe install
C> net start "SSHTunnels"