#!/usr/bin/perl -w
#
# Copyright (c) 2000-2003 University of Utah and the Flux Group.
#
# {{{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 .
#
# }}}
#
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 \n");
}
my $optlist = "";
my $config;
# Locals
my $hostname;
my $gateway;
my $port = "";
my $login = "";
my $pswd = "";
#
# 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 () {
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;
};
/^password:\s*(.+)$/ && do {
$pswd = "-p '$1'";
last SWITCH1;
};
}
}
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.
#
# 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.
#
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";
if (!defined($gateway)) {
exec "$rdcmd $rdargs $login $pswd $hostname &";
}
else {
die("rdp-mime.pl: No proxying yet.\n");
}