rdp-mime.pl 3.32 KB
Newer Older
1 2 3
#!/usr/bin/perl -w
#
# Copyright (c) 2000-2003 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 39 40 41 42 43 44 45 46 47
#
use English;
use Getopt::Std;

#
# This is a helper program for your web browser. It allows you to rdp
# 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 "rdp-mime.pl <control-file>\n");
}
my $optlist = "";
my $config;

# Locals
my $hostname;
my $gateway;
my $port    = "";
my $login   = "";
48
my $pswd    = "";
49 50 51 52 53 54 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

#
# 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 = "-u $1";
	    last SWITCH1;
	};
93 94 95 96
	/^password:\s*(.+)$/ && do {
	    $pswd = "-p '$1'";
	    last SWITCH1;
	};
97 98 99 100 101 102 103 104 105 106 107 108
    }
}
close(CONFIG);

#
# Must have a hostip. Port is optional.
#
if (!defined($hostname)) {
    die("Config file must specify a hostname\n");
}

# Run rdesktop in its own directory so it finds the keymaps subdirectory.
109 110 111 112 113 114 115 116
#
# You can specify any display resolution you want; it doesn't have to be
# one of the "normal" ones.  And you can switch back and forth by just starting
# a new rdesktop and "grabbing" the rlogin session away from the previous one.
# 
# But once an rdesktop is started up, its display resolution is fixed.  If you make it
# smaller than the previous one, it will push your windows around to fit.
#
117 118 119 120 121 122 123 124 125 126 127 128
my $rdir = "/usr/local/share/rdesktop";
my $rdcmd = "rdesktop";
if (! -d $rdir) {
    $rdir = "~fish/misc/rdesktop/rdesktop-1.3.1";
    my $rdcmd = "cd $rdir; ./rdesktop";
}
die("rdp-mime.pl: No rdesktop directory found.\n")
    if (! -d $rdir);

# Customize -g resolution and -a colordepth to taste.
my $rdargs = "-K -g 1280x1024 -a 16";

129
if (!defined($gateway)) {
130
    exec "$rdcmd $rdargs $login $pswd $hostname &";
131 132
}
else {
133
    die("rdp-mime.pl: No proxying yet.\n");
134
}