#!/usr/bin/perl # Setup: if you don't have ds9, xpaset, xpaget, wget # in your path, give absolute names below: $DS9="ds9"; $XPASET="xpaset"; $XPAGET="xpaget"; $WGET="wget"; # these programs can be obtained from: # ds9: http://hea-www.harvard.edu/RD/ds9/ # XPA: http://hea-www.harvard.edu/saord/xpa/ # wget: http://ftp.gnu.org/pub/gnu/wget/ -- MOST UNIX DISTRIBUTIONS # HAVE IT ALREADY! $TMP="/tmp"; # place to store temp. files # Options for ds9: $DS9OPT="-geometry 890x1000+40+10"; # Message program: $MSGPROG = "xmessage -nearmouse -geometry 500x310 -bg MistyRose2"; # *************** END CUSTOMIZE **********************************" $allow_system_call = 0; # Read command line args while ( $ARGV[0] =~ /^-/ ) { if ( $ARGV[0] eq "--allow-system-call" ) { $allow_system_call = 1; shift @ARGV; next; } die "Unknown option: $ARGV[0]\n"; } #400d command file: # $DS9COMFILE = $ARGV[0]; if ( ! ( $DS9COMFILE =~ /^([\/:=\w-.\+]+)$/ ) ) { die "Bad ds9com file name: $DS9COMFILE\n"; } $ID="ds9$$"; $ROOTURL = ""; @COORDS = (); $PASSWORD = ""; $USER = ""; $PASSWD = ""; $WGETSECURITY=""; $DS9_RUNNING = 0; open (COMMAND,$DS9COMFILE) || die "$DS9COMFILE: $!\n"; while () { chomp; ($com,@arg) = split; if ( ! $com ) { next; } # skip empty lines if ( $com =~ /^#/ ) { next; } # skip comments if ( $com eq "system" ) { if ( ! $allow_system_call ) { die "SECURITY BREACH: system calls not allowed\n"; } else { $com = join(' ',@arg); system ($com) && die "$com: $!\n"; next; } } if ($com eq "TITLE") { $ID = &untain_url ($arg[0]); next; } if ($com eq "ROOTURL") { $ROOTURL = &untain_url ($arg[0]); if ( ! ( $ROOTURL =~ m@/$@ ) ) { $ROOTURL = $ROOTURL."/"; } next; } if ($com eq "USER") { $USER = &untain_url ($arg[0]); $WGETSECURITY = "$WGETSECURITY --http-user=$USER"; next; } if ($com eq "PASSWD") { $PASSWD = &untain_url ($arg[0]); $WGETSECURITY = "$WGETSECURITY --http-passwd=$PASSWD"; next; } if ($com eq "CENTER") { @COORDS = @arg; next; } if ($com eq "LOADFITS") { $addr = &untain_url ($arg[0]); if (! $DS9_RUNNING ) { &start_ds9; } &download_and_run ($addr,"$XPASET $ID fits"); if ( $#COORDS > 0 ) { system ($XPASET,"-p",$ID,"pan","to",@COORDS) && &msgdie ("$XPASET failed: $!"); system ($XPASET,"-p",$ID,"crosshair",@COORDS) && &msgdie ("$XPASET failed: $!"); } next; } if ($com eq "LOADREGIONS") { $addr = &untain_url ($arg[0]); if (! $DS9_RUNNING ) { &start_ds9; } &download_and_run ($addr,"$XPASET $ID regions"); next; } if ($com eq "LOADURL") { $addr = &untain_url ($arg[0]); if ( ! &absolute_url($addr)) { $addr = $ROOTURL.$addr; } if (! $DS9_RUNNING ) { &start_ds9; } system ($XPASET,"-p",$ID,"web",$addr) && &msgdie ("$XPASET failed: $!"); next; } if ($com eq "LOADCONTOURS") { $addr = &untain_url ($arg[0]); if ( ! &absolute_url($addr)) { $addr = $ROOTURL.$addr; } if ( &is_url($addr) ) { system ("$WGET $WGETSECURITY -q -O - $addr > $TMP/ds9$$.con") && &msgdie ("$WGET failed: $!"); } else { if ( $addr =~ /^file:/ ) { $addr =~ s/^file://; } system ("cp",$addr,"$TMP/ds9$$.con"); } if (! $DS9_RUNNING ) { &start_ds9; } shift @arg; if ( $#arg != 2 ) { # doesn't look like contour pars were set explicitly @arg=("wcs","fk5","red"); } system ($XPASET,"-p",$ID,"contour","load","$TMP/ds9$$.con",@arg) && &msgdie ("$XPASET failed: $!"); unlink ("$TMP/ds9$$.con"); next; } # Nothing known. execute xpaset as is; it should be safe if (! $DS9_RUNNING ) { &start_ds9; } system ($XPASET,"-p",$ID,$com,@arg) && &msgdie ("$XPASET -p $ID\n $com",@arg,"\nfailed.","Most likely, you need to\ndownload a new version of ds9-400d from\nhttp://hea-www.harvard.edu/400d/misc/ds9displ.html"); } close (COMMAND); print "OK\n"; if ( $USER || $PASSWD ) { unlink ($ARGV[0]); } exit (0); #################################################### sub untain_url { my ($addr)=@_; if ($addr =~ /^([\/:=\w-.\+]+)$/) { $addr = $1; # $addr now untainted } else { &msgdie ("Encountered malformed file name\n"); # log this somewhere } return $addr; } sub absolute_url { my ($addr)=@_; if ( $addr =~ /^file:/ || $addr =~ /^ftp:/ || $addr =~ /^http:/ ) { return 1; } else { return 0; } } sub start_ds9 { my $iid=0; do { if ($iid>0) { $IDi = "$ID-$iid"; } else { $IDi = $ID; } $iid ++; } while (! system ("xpaget $IDi version > /dev/null 2> /dev/null")); $ID = $IDi; system ("$DS9 $DS9OPT -title $ID &") && &msgdie ("Could not launch $DS9: $!"); # Wait until it's read to accept connections select(undef, undef, undef, 0.25); while (system ("xpaget $ID version > /dev/null 2> /dev/null")) { print "$ID\n"; select(undef, undef, undef, 0.25); } $DS9_RUNNING=1; } sub download_and_run { my ($addr,$command) = @_; if ( ! &absolute_url($addr)) { $addr = $ROOTURL.$addr; } if ( $addr =~ /^file:/ ) { $addr =~ s/^file://; } if ( &is_url($addr) ) { print " ... downloading $addr ... "; system ("$WGET $WGETSECURITY -q -O $TMP/ds9$$.dat $addr") && &msgdie ("$WGET failed: $!"); system ("$command < $TMP/ds9$$.dat") && &msgdie ("$command failed: $!"); unlink ("$TMP/ds9$$.dat"); print "done\n"; } else { system ("$command < $addr") && &msgdie ("$command failed: $!"); } } sub is_url { my ($addr) = @_; if ($addr =~ /^http:\/\/\w/i || $addr =~ /^ftp:\/\/\w/i) { return 1; } else { return 0; } } sub msgdie { my @msgarr = split (' ',$MSGPROG); system (@msgarr,@_); die; }