modifyexp.php3 6 KB
Newer Older
Chad Barb's avatar
 
Chad Barb committed
1 2 3
<?php
#
# EMULAB-COPYRIGHT
4
# Copyright (c) 2000-2005 University of Utah and the Flux Group.
Chad Barb's avatar
 
Chad Barb committed
5 6 7 8 9 10 11 12 13 14 15 16 17 18
# All rights reserved.
#
include("defs.php3");
include("showstuff.php3");

$parser   = "$TB/libexec/ns2ir/parse-ns";

#
# Only known and logged in users can modify experiments.
#
$uid = GETLOGIN();
LOGGEDINORDIE($uid);
$isadmin = ISADMIN($uid);

19 20 21 22 23 24 25 26
# This will not return if its a sajax request.
include("showlogfile_sup.php3");

#
# Standard Testbed Header
#
PAGEHEADER("Modify Experiment");

Chad Barb's avatar
 
Chad Barb committed
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
#
# Verify page arguments.
# 
if (!isset($pid) ||
    strcmp($pid, "") == 0) {
    USERERROR("You must provide a Project ID.", 1);
}
if (!isset($eid) ||
    strcmp($eid, "") == 0) {
    USERERROR("You must provide an Experiment ID.", 1);
}

#
# Be paranoid.
#
$pid = addslashes($pid);
$eid = addslashes($eid);

#
46 47 48 49 50
# Check to make sure this is a valid experiment.
#
if (! TBValidExperiment($pid, $eid)) {
    USERERROR("The experiment $eid is not a valid experiment ".
	      "in project $pid.", 1);
Chad Barb's avatar
 
Chad Barb committed
51 52
}

53 54
if (! TBExptAccessCheck($uid, $pid, $eid, $TB_EXPT_MODIFY)) {
    USERERROR("You do not have permission to modify this experiment.", 1);
Chad Barb's avatar
 
Chad Barb committed
55 56
}

57 58 59 60
if (TBExptLockedDown($pid, $eid)) {
    USERERROR("Cannot proceed; experiment is locked down!", 1);
}

61 62
$expstate = TBExptState($pid, $eid);

Chad Barb's avatar
 
Chad Barb committed
63 64
if (strcmp($expstate, $TB_EXPTSTATE_ACTIVE) &&
    strcmp($expstate, $TB_EXPTSTATE_SWAPPED)) {
65
    USERERROR("You cannot modify an experiment in transition.", 1);
Chad Barb's avatar
 
Chad Barb committed
66 67
}

68 69 70 71
# Okay, start.
echo "<font size=+2>Experiment <b>".
     "<a href='showproject.php3?pid=$pid'>$pid</a>/".
     "<a href='showexp.php3?pid=$pid&eid=$eid'>$eid</a></b></font>\n";
72 73
echo "<br>\n";
flush();
Chad Barb's avatar
 
Chad Barb committed
74

75 76 77
#
# Put up the modify form on first load.
# 
Chad Barb's avatar
 
Chad Barb committed
78
if (! isset($go)) {
Leigh B. Stoller's avatar
Leigh B. Stoller committed
79
    echo "<a href='faq.php3#swapmod'>".
80 81 82
	 "Modify Experiment Documentation (FAQ)</a></h3>";
    echo "<br>";

Timothy Stack's avatar
 
Timothy Stack committed
83 84 85 86 87 88 89
    if (STUDLY()) {
	echo "<font size='+1'>".
	    "<a href='clientui.php3?pid=$pid&eid=$eid'>GUI Editor</a>".
	    " - Edit the topology using a Java applet.</font>";
	echo "<br>";
    }

90
    echo "<form action='modifyexp.php3?pid=$pid&eid=$eid' method='post'>";
91
    echo "<textarea cols='100' rows='40' name='nsdata'>";
Chad Barb's avatar
 
Chad Barb committed
92

93 94 95 96 97
    $query_result =
	DBQueryFatal("SELECT nsfile from nsfiles ".
		     "where pid='$pid' and eid='$eid'");
    if (mysql_num_rows($query_result)) {
	$row    = mysql_fetch_array($query_result);
98
	$nsfile = $row[nsfile];
Chad Barb's avatar
 
Chad Barb committed
99
	    
100 101 102 103 104
	echo "$nsfile";
    }
    else {
	echo "# There was no stored NS file for $pid/$eid.\n";
    }
Chad Barb's avatar
 
Chad Barb committed
105
	
106 107 108 109
    echo "</textarea>";
    echo "<br>";
    if (!strcmp($expstate, $TB_EXPTSTATE_ACTIVE)) {
	echo "<p><b>Note!</b> It is recommended that you 
Chad Barb's avatar
 
Chad Barb committed
110
	      reboot all nodes in your experiment by checking the box below.
111 112 113 114
	      This is especially important if changing your experiment
              topology (adding or removing nodes, links, and LANs).
	      If adding/removing a delay to/from an existing link, or
              replacing a lost node <i>without modifying the experiment
115 116 117 118
              topology</i>, this won't be necessary. Restarting the
	      event system is also highly recommended since the same nodes
	      in your virtual topology may get mapped to different physical
	      nodes.</p>";
119
	echo "<input type='checkbox' name='reboot' value='1' checked='1'>
Chad Barb's avatar
 
Chad Barb committed
120
	      Reboot nodes in experiment (Highly Recommended)</input>";
121 122
	echo "<br><input type='checkbox' name='eventrestart' value='1' checked='1'>
	      Restart Event System in experiment (Highly Recommended)</input>";
123 124 125 126 127 128 129
    }
    echo "<br>";
    echo "<input type='submit' name='go' value='Modify'>";
    echo "</form>\n";
    PAGEFOOTER();
    exit();
}
Chad Barb's avatar
 
Chad Barb committed
130

131 132 133 134 135 136
#
# Okay, form has been submitted.
#
if (! isset($nsdata)) {
    USERERROR("NSdata CGI variable missing (How did that happen?)",1);
}
Chad Barb's avatar
 
Chad Barb committed
137

138 139 140 141 142 143 144 145 146 147
#
# Generate a hopefully unique filename that is hard to guess.
# See backend scripts.
# 
list($usec, $sec) = explode(' ', microtime());
srand((float) $sec + ((float) $usec * 100000));
$foo = rand();
    
$nsfile = "/tmp/$uid-$foo.nsfile";

148 149 150 151 152 153 154
if (! ($fp = fopen($nsfile, "w"))) {
    TBERROR("Could not create temporary file $nsfile", 1);
}
$nsdata_string = $nsdata;
fwrite($fp, $nsdata_string);
fclose($fp);
chmod($nsfile, 0666);
155

156 157 158 159 160 161 162 163 164
#
# Get exp group so we can get the unix_gid.
#
TBExptGroup($pid, $eid, $gid);
TBGroupUnixInfo($pid, $gid, $unix_gid, $unix_name);

#
# Do an initial parse test.
#
165
$retval = SUEXEC($uid, "$pid,$unix_gid", "webnscheck $nsfile",
166 167 168 169 170 171 172 173
		 SUEXEC_ACTION_IGNORE);

if ($retval != 0) {
    unlink($nsfile);
    
    # Send error to tbops.
    if ($retval < 0) {
	SUEXECERROR(SUEXEC_ACTION_CONTINUE);
Chad Barb's avatar
 
Chad Barb committed
174
    }
175 176 177 178 179 180
    echo "<br>";
    echo "<h3>Modified NS file contains syntax errors</h3>";
    echo "<blockquote><pre>$suexec_output<pre></blockquote>";

    PAGEFOOTER();
    exit();
181 182 183 184 185 186 187 188
}

#	
# Avoid SIGPROF in child.
# 
set_time_limit(0);

# Run the script.
189
$retval = SUEXEC($uid, "$pid,$unix_gid",
190
		 "webswapexp $rebootswitch " . ($reboot ? "-r " : "") .
191
		 ($eventrestart ? "-e " : "") .
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
		 "-s modify $pid $eid $nsfile",
		 SUEXEC_ACTION_IGNORE);
		 
# It has been copied out by the program!
unlink($nsfile);

#
# Fatal Error. Report to the user, even though there is not much he can
# do with the error. Also reports to tbops.
# 
if ($retval < 0) {
    SUEXECERROR(SUEXEC_ACTION_DIE);
    #
    # Never returns ...
    #
    die("");
}

#
# Exit status 0 means the experiment is swapping, or will be.
#
echo "<br>\n";
if ($retval) {
    echo "<h3>Experiment modify could not proceed</h3>";
    echo "<blockquote><pre>$suexec_output<pre></blockquote>";
}
else {
    #
    # Exit status 0 means the experiment is modifying.
    #
222
    echo "<b>Your experiment is being modified!</b> ";
223 224 225 226 227 228 229 230
    echo "You will be notified via email when the experiment has ".
	"finished modifying and you are able to proceed. This ".
	"typically takes less than 10 minutes, depending on the ".
	"number of nodes in the experiment. ".
	"If you do not receive email notification within a ".
	"reasonable amount time, please contact $TBMAILADDR. ".
	"<br><br>".
	"While you are waiting, you can watch the log of experiment ".
231 232
	"modification in realtime:<br>\n";
    STARTLOG($pid, $eid);    
233 234
}

Chad Barb's avatar
 
Chad Barb committed
235 236 237 238 239 240 241
#
# Standard Testbed Footer
# 
PAGEFOOTER();
?>