image_setup.in 4.12 KB
Newer Older
1 2
#!/usr/bin/perl -w
#
3
# Copyright (c) 2003-2014 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 48 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 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
#
use English;
use Getopt::Std;
use Socket;
    
#
# Fetch external image definitions and create local descriptors.
#

sub usage()
{
    print "Usage: $0 [-d] [-v] [-g] eid\n";
    print("Options:\n");
    print(" -d      - Turn on debugging\n");
    print(" -v      - Verify XML descriptions only\n");
    print(" -g      - Download image after creating descriptors\n");
 
    exit(-1);
}
my $optlist  = "dvg";
my $debug    = 0;
my $verify   = 0;
my $getimages= 0;

#
# Functions
#
sub verifyURL($);

#
# Configure variables
#
my $TB       = "@prefix@";
my $TBOPS    = "@TBOPSEMAIL@";
my $IMPORTER = "$TB/sbin/image_import";

#
# Turn off line buffering on output
#
$| = 1;

#
# Untaint the path
# 
$ENV{'PATH'} = "$TB/bin:$TB/sbin:/bin:/usr/bin:/sbin:/usr/sbin";
delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};

#
# Testbed Support libraries
#
use lib "@prefix@/lib";
use libtestbed;
use libdb;
use libtblog;
use Experiment;
use Image;
use User;

my %options = ();
if (! getopts($optlist, \%options)) {
    usage();
}
if (defined($options{"v"})) {
    $verify = 1;
}
if (defined($options{"d"})) {
    $debug = 1;
}
if (defined($options{"g"})) {
    $getimages = 1;
}
if (@ARGV != 1) {
    usage();
}

#
# Verify user and get his DB uid and other info for later.
#
my $this_user = User->ThisUser();
if (! defined($this_user)) {
    tbdie("You ($UID) do not exist!");
}
my $user_uid   = $this_user->uid();

#
# First, make sure the experiment exists
#
my $experiment = Experiment->Lookup($ARGV[0]);
if (! $experiment) {
    tbdie("There is no such experiment");
}
my $pid = $experiment->pid();
my $eid = $experiment->eid();

#
# User must have at least MODIFY permissions to use this script
#
if (!$experiment->AccessCheck($this_user, TB_EXPT_MODIFY())) {
    tbdie("You are not allowed to modify experiment $eid in project $pid");
}

#
# Look for any nodes that specify a url for the osname. 
#
my $result = $experiment->TableLookUp("virt_nodes", "vname,osname");

while (my ($vname, $osname) = $result->fetchrow()) {
    my $url;
    
    next
	if (! ($osname =~ /^(ftp|http|https):/));

    # Verify entire URL and taint check.
    if ($osname =~ /^((http|https|ftp)\:\/\/[-\w\.\/\@\:\~\?\=\&]*)$/) {
	$url = $1;
    }
    else {
	tbdie("Invalid URL $osname\n");
    }
    my $safe_url = User::escapeshellarg($url);

    #
    # See if we have already created this descriptor. If so, we
    # do not do anything until later when the experiment is
    # being swapped in. At this point, we just want to verify
    # the information and create the descriptor. Later we will
    # fetch the image file, or refetch if it is stale.
    #
    my $image = Image->LookupByURL($url);
152 153 154 155 156 157 158 159 160
    if (defined($image)) {
	#
	# LookupByURL might return a local image, which of course
	# we want to skip; later phases know its a local image.
	#
	next
	    if ($image->IsLocal());
    }
    else {
161 162 163 164 165 166 167 168 169 170 171 172 173
	my $opts = "";
	$opts .= " -d"
	    if ($debug);
	$opts .= " -v"
	    if ($verify);
	system("$IMPORTER $opts -p $pid $safe_url");
	exit(-1)
	    if ($?);
    }
    next
	if ($verify);

    if (!defined($image)) {
174 175 176 177
	$image = Image->LookupByURL($url);
	if (!defined($image)) {
	    tbdie("Could not look up image object for $url\n");
	}
178 179 180 181 182 183 184 185 186 187 188 189 190
    }
    next
	if (! $getimages);

    my $opts = "";
    $opts .= " -d"
	if ($debug);
    system("$IMPORTER $opts -g -p $pid $safe_url");
    exit(-1)
	if ($?);
}
exit(0);