ssh-mime.pl 4.35 KB
Newer Older
1 2
#!/usr/bin/perl -w
#
3
# Copyright (c) 2000-2003, 2006 University of Utah and the Flux Group.
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
# 
# {{{EMULAB-LICENSE
# 
# This file is part of the Emulab network testbed software.
# 
# This file is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or (at
# your option) any later version.
# 
# This file 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 Affero General Public
# License for more details.
# 
# You should have received a copy of the GNU Affero General Public License
# along with this file.  If not, see <http://www.gnu.org/licenses/>.
# 
# }}}
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
#
use English;
use Getopt::Std;

#
# This is a helper program for your web browser. It allows you to ssh
# to an experimental node by clicking on a menu option in the shownode
# page. Its extremely helpful with jailed nodes, where sshd is either
# running on another port, or on a private IP. Please see the Emulab FAQ
# for instructions on how to install this helper program. 
#
# Obviously, it helps to have an ssh agent running.
# 
sub usage()
{
    print(STDERR "ssh-mime.pl <control-file>\n");
39
    exit(1);
40 41 42 43 44 45 46 47 48 49
}
my $optlist = "";
my $config;

# Locals
my $hostname;
my $gateway;
my $port    = "";
my $login   = "";

50 51 52 53 54
# Protos
sub DoOSX();
sub StartXterm();
sub StartOSXTerm();

55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
#
# Turn off line buffering on output
#
$| = 1;

#
# Parse command arguments. Once we return from getopts, all that should be
# left are the required arguments.
#
%options = ();
if (! getopts($optlist, \%options)) {
    usage();
}
if (@ARGV != 1) {
    usage();
}
$config = $ARGV[0];

#
# Open up the config file. It tells us what to do.
#
open(CONFIG, "< $config")
    or die("Could not open config file $config: $!\n");

while (<CONFIG>) {
    chomp();
    SWITCH1: {
	/^port:\s*(\d+)$/ && do {
	    $port = "-p $1";
	    last SWITCH1;
	};
	/^hostname:\s*([-\w\.]+)$/ && do {
	    $hostname = $1;
	    last SWITCH1;
	};
	/^gateway:\s*([-\w\.]+)$/ && do {
	    $gateway = $1;
	    last SWITCH1;
	};
	/^login:\s*([-\w]+)$/ && do {
	    $login = "-l $1";
	    last SWITCH1;
	};
    }
}
close(CONFIG);

#
# Must have a hostip. Port is optional.
#
if (!defined($hostname)) {
    die("Config file must specify a hostname\n");
}
108
if ($OSNAME eq "darwin") {
109 110 111 112 113 114
    # Path is all screwey on the Mac.
    $ENV{'PATH'} .= ":/usr/X11R6/bin";

    # Cause its a folder action ...
    system("/bin/rm -f $config");
    
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
    DoOSX();
    exit(0);
}
StartXterm();
exit(0);

#
# Start up the xterms.
#
sub StartXterm()
{
    if (!defined($gateway)) {
	exec "xterm -T $hostname -e ssh $port $login $hostname ".
	    "\|\| read userinput";
    }
    else {
131 132 133 134 135 136 137
	my $sshcmd = "ssh -o StrictHostKeyChecking=no $port";

	# for IXPs at Utah Emulab
	if ($gateway =~ /^ixp\d+-gw\.emulab\.net$/) {
	    $sshcmd = "telnet -l root";
	}

138
	exec "xterm -T $hostname -e ssh $login -tt $gateway ".
139
	    "$sshcmd $hostname ".
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
	    "\|\| read userinput";
    }
}

#
# Mac OSX support; try to deduce the DISPLAY variable.
#
sub DoOSX()
{
    my $display;
    
    for (my $i = 0; $i < 20; $i++) {
	if (-e "/tmp/.X${i}-lock") {
	    $display = ":${i}.0";
	    last;
	}
    }
    if (!defined($display)) {
	StartOSXTerm();
	return;
    }

    $ENV{'DISPLAY'} = $display;
163

164 165 166
    # Tell X to activate.
    system("osascript -e 'tell application \"X11\" to activate'");
    StartXterm();
167
}
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183

#
# This is going to start up Terminal.app ... but it depends on you
# having your SSH agent available. The easies way to do that is to
# go here: http://www.sshkeychain.org ... install this application
# and following the instructions to make sure it is launched when
# you log in. 
#
sub StartOSXTerm()
{
    my $command;
    
    if (!defined($gateway)) {
	$command = "ssh $port $login $hostname";
    }
    else {
184 185 186 187 188 189 190
	my $sshcmd = "ssh -o StrictHostKeyChecking=no $port";

	# for IXPs at Utah Emulab
	if ($gateway =~ /^ixp\d+-gw\.emulab\.net$/) {
	    $sshcmd = "telnet -l root";
	}

191
	$command = "ssh $login -tt $gateway ".
192
	    "$sshcmd $hostname";
193 194 195 196 197 198 199 200 201
    }
    
    exec "osascript -e 'tell application \"Terminal\" \n".
	 " activate \n".
	 " do script with command \"$command ; exit\" \n".
	 " tell window 1 \n".
	 "    set custom title to \"$hostname\" \n".
	 " end tell \n".
	 "end tell'";
202
}