#!/usr/local/bin/wishx # tkremote - Ask the user where to go and how to get there, then go there # # Rob Funk # 23 Jan 1997 # # Yes, I know it's horrible tcl, but hey, it's my first try, and it works. # # Modified by rfunk 01 Oct 1999 # Now dockable in Window Maker (at least) # # Modified by rfunk 20 Oct 1999 # Now requires TclX # Allows both ssh1 and ssh2 # Detects ssh programs rather than .ssh directory # Uses FQDN of target host # Modified by rfunk 21 Oct 1999: # Allow arguments in XTERM/xterm environment variable # Tix makes it look a bit cooler, and may allow pixmaps, but makes it slower # catch {package require Tix} set path [split $env(PATH) :] # initial program list and defaults -- everybody has these set proglist [list telnet rlogin] set defaultprogram rlogin # look for ssh set searchlist [list ssh1 ssh2] foreach p $searchlist { if {[string length [searchpath $path $p]]} { lappend proglist $p set defaultprogram $p } } if {[lsearch $proglist *ssh*] < 0 && [string length [searchpath $path ssh]]} { lappend proglist ssh set defaultprogram ssh } set promptfont "-*-lucida-bold-r-normal-sans-*-120-*-*-*-*-iso8859-*" if {[info exists env(XTERM)]} { set xterm [set env(XTERM)] } { if {[info exists env(xterm)]} { set xterm [set env(xterm)] } { set xterm xterm } } set xtermargs [lrange [split $xterm] 1 end] set xterm [lindex [split $xterm] 0] # puts $xterm # puts $xtermargs proc Cancel {} { destroy . } proc Go {p h args} { global xterm global xtermargs # Don't do anything if we don't know where to go if [string length $h] { # Find FQDN set h [host_info official_name \ [lindex [host_info addresses $h] 0]] if {[llength $args] && [string length [lindex $args 0]]} { set user [list -l [lindex $args 0]] } { set user [] } destroy . lappend xtermargs -ut -title $h \ -e sh -c "echo 'Connecting to $h...';$p $user $h || sleep 2 ; sleep 1" # puts $xtermargs execl $xterm $xtermargs } {Cancel} } proc Center w { wm withdraw $w set x [expr [winfo screenwidth $w]/2 - [winfo reqwidth $w]/2] set y [expr [winfo screenheight $w]/2 - [winfo reqheight $w]/2] wm geom $w +$x+$y wm deiconify $w } proc PromptPanel {w txt} { global hostname global user global promptfont label $w.prompt -text $txt -font $promptfont entry $w.hostname -width 45 -textvariable hostname bind $w.hostname {Go $program $hostname $user} pack $w.prompt -side top -padx 5 -pady 2 pack $w.hostname -side bottom -ipadx 1m -ipady 1m -padx 2c -pady 6 } proc LoginSelect {w proglist defaultprogram} { global program global hostname global user frame $w.center frame $w.user pack $w.center $w.user -side left -expand 1 set program $defaultprogram foreach r $proglist { radiobutton $w.center.$r -text $r \ -variable program -value $r -relief flat pack $w.center.$r -side left -padx 2 -anchor w } label $w.user.label -text "User:" entry $w.user.entry -width 8 -textvariable user bind $w.user.entry {Go $program $hostname $user} pack $w.user.entry -side right \ -ipadx 5 -ipady 1 pack $w.user.label -side right } proc OKCancel w { global program global hostname global user # OK button button $w.button0 -text OK -command {Go $program $hostname $user} bind $w.button0 {Go $program $hostname $user} frame $w.default -relief sunken -bd 1 raise $w.button0 $w.default pack $w.default -side left -expand 1 -padx 3m -pady 1m pack $w.button0 -in $w.default -ipadx 1c -padx 2 -pady 2 # Cancel button button $w.button1 -text Cancel -command {Cancel} bind $w.button1 {Cancel} bind . {Cancel} pack $w.button1 -side left -expand 1 -ipadx 1c -padx 3m -pady 1m } Center . wm title . "Remote Host ..." wm command . [concat $argv0 $argv] wm group . . wm iconname . [file tail $argv0] set w "" frame $w.top -relief raised -bd 1 frame $w.mid -relief raised -bd 1 frame $w.bot -relief raised -bd 1 pack $w.top $w.mid $w.bot -fill both # set prompt and text box in top PromptPanel $w.top "Enter remote hostname:" # make and set radio buttons in middle LoginSelect $w.mid $proglist $defaultprogram # make buttons on bottom OKCancel $w.bot # Now give the text box the focus, and we're set focus $w.top.hostname