nodecontrol_list.php3 14 KB
Newer Older
1
<?php
Leigh B. Stoller's avatar
Leigh B. Stoller committed
2 3
#
# EMULAB-COPYRIGHT
4
# Copyright (c) 2000-2005 University of Utah and the Flux Group.
Leigh B. Stoller's avatar
Leigh B. Stoller committed
5 6
# All rights reserved.
#
7 8
include("defs.php3");

9 10 11 12 13 14
#
# This page is used for both admin node control, and for mere user
# information purposes. Be careful about what you do outside of
# $isadmin tests.
# 

15 16 17
#
# Standard Testbed Header
#
18
PAGEHEADER("Node Control Center");
19

20 21 22
#
# Only known and logged in users can do this.
#
23
$uid = GETLOGIN();
24
LOGGEDINORDIE($uid);
25
$isadmin = ISADMIN($uid);
26 27

#
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
# Verify page arguments.
# 
if (isset($target_uid)) {
    if ($target_uid == "") {
	$target_uid = $uid;
    }
    elseif (! TBvalid_uid($target_uid)) {
	PAGEARGERROR("Invalid characters in '$target_uid'");
    }
    elseif (! TBUserInfoAccessCheck($uid, $target_uid, $TB_USERINFO_READINFO)) {
	USERERROR("You do not have permission to view this user's ".
		  "information!", 1);
    }
}
else {
    $target_uid = $uid;
}
45

46 47
echo "<b>Show: <a href='nodecontrol_list.php3?showtype=summary'>summary</a>,
               <a href='nodecontrol_list.php3?showtype=pcs'>pcs</a>,
48 49 50
               <a href='floormap.php3'>wireless maps</a>,
               <a href='nodecontrol_list.php3?showtype=wireless'>
                                                        wireless list</a>,
51
               <a href='robotmap.php3'>robot maps</a>,
52 53 54 55 56 57 58
               <a href='nodecontrol_list.php3?showtype=widearea'>widearea</a>";

if ($isadmin) {
    echo    ", <a href='nodecontrol_list.php3?showtype=virtnodes'>virtual</a>,
               <a href='nodecontrol_list.php3?showtype=physical'>physical</a>,
               <a href='nodecontrol_list.php3?showtype=all'>all</a>";
}
59
echo ".</b><br>\n";
60 61

if (!isset($showtype)) {
62
    $showtype='summary';
63 64
}

Chad Barb's avatar
 
Chad Barb committed
65 66 67
$additionalVariables = "";
$additionalLeftJoin  = "";

68 69 70 71 72 73 74
if (! strcmp($showtype, "summary")) {
    # Separate query below.
    $role   = "";
    $clause = "";
    $view   = "Free Node Summary";
}
elseif (! strcmp($showtype, "all")) {
75 76 77
    $role   = "(role='testnode' or role='virtnode')";
    $clause = "";
    $view   = "All";
78 79
}
elseif (! strcmp($showtype, "pcs")) {
80 81 82
    $role   = "(role='testnode')";
    $clause = "and (nt.class='pc')";
    $view   = "PCs";
83
}
84 85 86 87
elseif (! strcmp($showtype, "sharks")) {
    $role   = "(role='testnode')";
    $clause = "and (nt.class='shark')";
    $view   = "Sharks";
88 89
}
elseif (! strcmp($showtype, "virtnodes")) {
90 91 92 93
    $role   = "(role='virtnode')";
    $clause = "";
    $view   = "Virtual Nodes";
}
94 95 96 97 98
elseif (! strcmp($showtype, "physical")) {
    $role   = "";
    $clause = "(nt.isvirtnode=0)";
    $view   = "Physical Nodes";
}
99 100 101
elseif (! strcmp($showtype, "widearea")) {
    $role   = "(role='testnode')";
    $clause = "and (nt.isremotenode=1)";
Chad Barb's avatar
 
Chad Barb committed
102 103 104 105 106 107 108

    $additionalVariables = ",".
			   "wani.machine_type,".
			   "REPLACE(CONCAT_WS(', ',".
			   "wani.city,wani.state,wani.country,wani.zip), ".
		 	   "'USA, ','')".
			   "AS location, ".
109 110
	 		   "wani.connect_type, ".
			   "wani.hostname";
Chad Barb's avatar
 
Chad Barb committed
111 112 113
    $additionalLeftJoin = "LEFT JOIN widearea_nodeinfo AS wani ".
			  "ON n.node_id=wani.node_id";

114
    $view   = "Widearea";
115
}
116 117 118 119 120 121 122 123 124
elseif (! strcmp($showtype, "wireless")) {
    $role   = "(role='testnode')";
    $clause = "and (loc.node_id is not null)";

    $additionalLeftJoin = "LEFT JOIN location_info AS loc ".
			  "ON n.node_id=loc.node_id";

    $view   = "Wireless";
}
125
else {
126 127 128
    $role   = "(role='testnode')";
    $clause = "and (nt.class='pc')";
    $view   = "PCs";
129
}
130 131 132 133 134
# If admin or widearea, show the vname too. 
$showvnames = 0;
if ($isadmin || !strcmp($showtype, "widearea")) {
    $showvnames = 1;
}
135

136 137 138 139 140 141 142 143
#
# Summary info very different.
# 
if (! strcmp($showtype, "summary")) {
    # Get permissions table so as not to show nodes the user is not allowed
    # to see.
    $perms = array();
    
144
    if (!$isadmin || isset($bypid)) {
145 146 147 148 149 150
	$query_result =
	    DBQueryFatal("select type from nodetypeXpid_permissions");

	while ($row = mysql_fetch_array($query_result)) {
	    $perms{$row[0]} = 0;
	}
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178

	$pidclause = "";
	if (isset($bypid)) {
	    if ($bypid == "" || !TBvalid_pid($bypid)) {
		PAGEARGERROR("Invalid characters in 'bypid' argument!");
	    }
	    if (! TBValidProject($bypid)) {
		PAGEARGERROR("No such project '$bypid'!");
	    }
	    if (! TBProjAccessCheck($target_uid,
				    $bypid, $bypid, $TB_PROJECT_READINFO)){
		USERERROR("You are not a member of project '$bypid!", 1);
	    }
	    $pidclause = "and g.pid='$bypid'";
	}
	if ($isadmin) {
	    $query_result =
		DBQueryFatal("select distinct type ".
			     "  from nodetypeXpid_permissions ".
			     "where pid='$bypid'");
	}
	else {
	    $query_result =
		DBQueryFatal("select distinct type from group_membership as g ".
			     "left join nodetypeXpid_permissions as p ".
			     "     on g.pid=p.pid ".
			     "where uid='$target_uid' $pidclause");
	}
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
	
	while ($row = mysql_fetch_array($query_result)) {
	    $perms{$row[0]} = 1;
	}
    }
    
    # Get totals by type.
    $query_result =
	DBQueryFatal("select n.type,count(*) from nodes as n ".
		     "left join node_types as nt on n.type=nt.type ".
		     "where (role='testnode') and ".
		     "      (nt.class!='shark' and nt.class!='pcRemote' ".
		     "      and nt.class!='pcplabphys') ".
		     "group BY n.type");

194 195
    $alltotal  = 0;
    $allfree   = 0;
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 222 223 224
    $totals    = array();
    $freecount = array();

    while ($row = mysql_fetch_array($query_result)) {
	$type  = $row[0];
	$count = $row[1];

	$totals[$type]    = $count;
	$freecounts[$type] = 0;
    }

    # Get free totals by type.
    $query_result =
	DBQueryFatal("select n.type,count(*) from nodes as n ".
		     "left join node_types as nt on n.type=nt.type ".
		     "left join reserved as r on r.node_id=n.node_id ".
		     "where (role='testnode') and ".
		     "      (nt.class!='shark' and nt.class!='pcRemote' ".
		     "      and nt.class!='pcplabphys') ".
		     "      and r.pid is null ".
		     "group BY n.type");

    while ($row = mysql_fetch_array($query_result)) {
	$type  = $row[0];
	$count = $row[1];

	$freecounts[$type] = $count;
    }

225 226 227 228 229 230 231 232 233 234 235 236 237
    $projlist = TBProjList($target_uid, $TB_PROJECT_CREATEEXPT);
    if (count($projlist) > 1) {
	echo "<b>By Project Permission: ";
	while (list($project) = each($projlist)) {
	    echo "<a href='nodecontrol_list.php3?".
		"showtype=summary&bypid=$project'>$project</a>,\n";
	}
	echo "<a href='nodecontrol_list.php3?showtype=summary'>".
	    "combined membership</a>.\n";
	echo "</b><br>\n";
    }

    echo "<br><center>
238
          <b>Free Node Summary</b>
239 240 241 242 243
          <br>\n";
    if (isset($bypid)) {
	echo "($bypid)<br><br>\n";
    }
    echo "<table>
244 245 246 247 248 249 250 251 252 253 254 255
          <tr>
             <th>Type</th>
             <th align=center>Free<br>Nodes</th>
             <th align=center>Total<br>Nodes</th>
          </tr>\n";

    foreach($totals as $key => $value) {
	$freecount = $freecounts[$key];

	# Check perm entry.
	if (isset($perms[$key]) && !$perms[$key])
	    continue;
256 257 258

	$allfree   += $freecount;
	$alltotal  += $value;
259
	
260 261 262 263 264 265
	echo "<tr>\n";
	if ($isadmin)
	    echo "<td><a href=editnodetype.php3?node_type=$key>\n";
	else
	    echo "<td><a href=shownodetype.php3?node_type=$key>\n";
	echo "           $key</a></td>
266 267 268 269
              <td align=center>$freecount</td>
              <td align=center>$value</td>
              </tr>\n";
    }
270 271 272 273 274 275
    echo "<tr></tr>\n";
    echo "<tr>
            <td><b>Totals</b></td>
              <td align=center>$allfree</td>
              <td align=center>$alltotal</td>
              </tr>\n";
276 277
    if ($isadmin) {
	# Give admins the option to create a new type
278 279 280 281
	echo "<tr></tr>\n";
	echo "<th colspan=3 align=center>
                <a href=editnodetype.php3?new_type=1>Create a new type</a>
              </th>\n";
282
    }
283 284 285 286 287
    echo "</table>\n";
    PAGEFOOTER();
    exit();
}

288 289 290
#
# Suck out info for all the nodes.
# 
Leigh B. Stoller's avatar
Leigh B. Stoller committed
291
$query_result =
292
    DBQueryFatal("select distinct n.node_id,n.phys_nodeid,n.type,ns.status, ".
293
		 "   n.def_boot_osid,r.pid,r.eid,nt.class,r.vname ".
Chad Barb's avatar
 
Chad Barb committed
294 295
		 "$additionalVariables ".
		 "from nodes as n ".
296
		 "left join node_types as nt on n.type=nt.type ".
297
		 "left join node_status as ns on n.node_id=ns.node_id ".
298
		 "left join reserved as r on n.node_id=r.node_id ".
Chad Barb's avatar
 
Chad Barb committed
299
		 "$additionalLeftJoin ".
300 301
		 "where $role $clause ".
		 "ORDER BY priority");
302 303 304 305

if (mysql_num_rows($query_result) == 0) {
    echo "<center>Oops, no nodes to show you!</center>";
    PAGEFOOTER();
306
    exit();
307
}
308

309
#
310
# First count up free nodes as well as status counts.
311
#
312 313 314 315 316
$num_free = 0;
$num_up   = 0;
$num_pd   = 0;
$num_down = 0;
$num_unk  = 0;
317
$freetypes= array();
318

319 320 321
while ($row = mysql_fetch_array($query_result)) {
    $pid                = $row[pid];
    $status             = $row[status];
322
    $type               = $row[type];
323

324 325 326
    if (! isset($freetypes[$type])) {
	$freetypes[$type] = 0;
    }
327 328 329
    if (!$pid) {
	$num_free++;
	$freetypes[$type]++;
330
	continue;
331
    }
332 333 334 335 336 337 338 339 340 341 342 343 344 345
    switch ($status) {
    case "up":
	$num_up++;
	break;
    case "possibly down":
    case "unpingable":
	$num_pd++;
	break;
    case "down":
	$num_down++;
	break;
    default:
	$num_unk++;
	break;
346 347
    }
}
348
$num_total = ($num_free + $num_up + $num_down + $num_pd + $num_unk);
349 350
mysql_data_seek($query_result, 0);

351 352 353 354 355 356
if (! strcmp($showtype, "widearea")) {
    echo "<a href=tutorial/docwrapper.php3?docname=widearea.html>
             Widearea Usage Notes</a>\n";
}

echo "<br><center><b>
357
       View: $view\n";
358 359 360

if (! strcmp($showtype, "widearea")) {
    echo "<br>
361
          <a href=widearea_nodeinfo.php3>(Widearea Link Metrics)</a><br>
Leigh B. Stoller's avatar
Leigh B. Stoller committed
362
          <a href=plabmetrics.php3>(PlanetLab Node Metrics)</a>\n";
363 364 365
}

echo "</b></center><br>\n";
366

367 368 369
SUBPAGESTART();

echo "<table>
370 371 372
       <tr><td align=right>
           <img src='/autostatus-icons/greenball.gif' alt=up>
           <b>Up</b></td>
373 374
           <td align=left>$num_up</td>
       </tr>
375 376 377
       <tr><td align=right nowrap>
           <img src='/autostatus-icons/yellowball.gif' alt='possibly down'>
           <b>Possibly Down</b></td>
378 379
           <td align=left>$num_pd</td>
       </tr>
380 381 382
       <tr><td align=right>
           <img src='/autostatus-icons/blueball.gif' alt=unknown>
           <b>Unknown</b></td>
383 384
           <td align=left>$num_unk</td>
       </tr>
385 386 387
       <tr><td align=right>
           <img src='/autostatus-icons/redball.gif' alt=down>
           <b>Down</b></td>
388 389
           <td align=left>$num_down</td>
       </tr>
390 391 392
       <tr><td align=right>
           <img src='/autostatus-icons/whiteball.gif' alt=free>
           <b>Free</b></td>
393 394
           <td align=left>$num_free</td>
       </tr>
395 396 397
       <tr><td align=right><b>Total</b></td>
           <td align=left>$num_total</td>
       </tr>
398 399 400 401 402
       <tr><td colspan=2 nowrap align=center>
               <b>Free Subtotals</b></td></tr>\n";

foreach($freetypes as $key => $value) {
    echo "<tr>
403
           <td align=right><a href=shownodetype.php3?node_type=$key>
404
                           $key</a></td>
405 406 407 408
           <td align=left>$value</td>
          </tr>\n";
}
echo "</table>\n";
409 410 411
SUBMENUEND_2B();

echo "<table border=2 cellpadding=2 cellspacing=2>\n";
412 413

echo "<tr>
414 415 416 417 418 419 420
          <th align=center>ID</th>\n";

if ($showvnames) {
    echo "<th align=center>Name</th>\n";
}

echo "    <th align=center>Type (Class)</th>
Chad Barb's avatar
 
Chad Barb committed
421
          <th align=center>Up?</th>\n";
422 423

if ($isadmin) {
Chad Barb's avatar
 
Chad Barb committed
424 425 426
    echo "<th align=center>PID</th>
          <th align=center>EID</th>
          <th align=center>Default<br>OSID</th>\n";
427
}
428 429
elseif (strcmp($showtype, "widearea")) {
    # Widearea nodes are always "free"
Chad Barb's avatar
 
Chad Barb committed
430
    echo "<th align=center>Free?</th>\n";
Chad Barb's avatar
 
Chad Barb committed
431 432 433 434 435 436 437 438
}

if (!strcmp($showtype, "widearea")) {
    echo "<th align=center>Processor</th>
	  <th align=center>Connection</th>
	  <th align=center>Location</th>\n";
}
    
439
echo "</tr>\n";
440

441 442
while ($row = mysql_fetch_array($query_result)) {
    $node_id            = $row[node_id]; 
443
    $phys_nodeid        = $row[phys_nodeid]; 
444
    $type               = $row[type];
445
    $class              = $row["class"];
446
    $def_boot_osid      = $row[def_boot_osid];
Leigh B. Stoller's avatar
Leigh B. Stoller committed
447 448
    $pid                = $row[pid];
    $eid                = $row[eid];
449
    $vname              = $row[vname];
450
    $hostname           = $row[hostname];
451
    $status             = $row[status];
452

Chad Barb's avatar
 
Chad Barb committed
453 454 455 456
    if (!strcmp($showtype, "widearea")) {	
	$machine_type = $row[machine_type];
	$location = $row[location];
	$connect_type = $row[connect_type];
457
	$vname        = $row[hostname];
Chad Barb's avatar
 
Chad Barb committed
458 459
    } 

460
    echo "<tr>";
461

462
    # Admins get a link to expand the node.
463 464
    if ($isadmin ||
	(OPSGUY() && (!$pid || $pid == $TBOPSPID))) {
465 466 467 468
	echo "<td><A href='shownode.php3?node_id=$node_id'>$node_id</a> " .
	    (!strcmp($node_id, $phys_nodeid) ? "" :
	     "(<A href='shownode.php3?node_id=$phys_nodeid'>$phys_nodeid</a>)")
	    . "</td>\n";
469 470
    }
    else {
471 472 473
	echo "<td>$node_id " .
  	      (!strcmp($node_id, $phys_nodeid) ? "" : "($phys_nodeid)") .
	      "</td>\n";
474
    }
475 476 477 478 479 480 481

    if ($showvnames) {
	if ($vname)
	    echo "<td>$vname</td>\n";
	else
	    echo "<td>--</td>\n";
    }
482
    
483 484
    echo "   <td>$type ($class)</td>\n";

485 486 487 488
    if (!$pid)
	echo "<td align=center>
                  <img src='/autostatus-icons/whiteball.gif' alt=free></td>\n";
    elseif (!$status)
489 490 491
	echo "<td align=center>
                  <img src='/autostatus-icons/blueball.gif' alt=unk></td>\n";
    elseif ($status == "up")
492 493
	echo "<td align=center>
                  <img src='/autostatus-icons/greenball.gif' alt=up></td>\n";
494
    elseif ($status == "down")
495 496
	echo "<td align=center>
                  <img src='/autostatus-icons/redball.gif' alt=down></td>\n";
497 498 499
    else
	echo "<td align=center>
                  <img src='/autostatus-icons/yellowball.gif' alt=unk></td>\n";
500 501 502 503

    # Admins get pid/eid/vname, but mere users yes/no.
    if ($isadmin) {
	if ($pid) {
Mike Hibler's avatar
Mike Hibler committed
504 505
	    echo "<td><a href=showproject.php3?pid=$pid>$pid</a></td>
                  <td><a href=showexp.php3?pid=$pid&eid=$eid>$eid</a></td>\n";
506 507 508 509 510 511 512 513 514 515
	}
	else {
	    echo "<td>--</td>
   	          <td>--</td>\n";
	}
	if ($def_boot_osid && TBOSInfo($def_boot_osid, $osname, $ospid))
	    echo "<td>$osname</td>\n";
	else
	    echo "<td>&nbsp</td>\n";
    }
516
    elseif (strcmp($showtype, "widearea")) {
517
	if ($pid)
518
	    echo "<td>--</td>\n";
519 520 521
	else
	    echo "<td>Yes</td>\n";
    }
Chad Barb's avatar
 
Chad Barb committed
522 523 524 525 526 527

    if (!strcmp($showtype, "widearea")) {	
	echo "<td>$machine_type</td>
	      <td>$connect_type</td>
	      <td><font size='-1'>$location</font></td>\n";
    }
528
    
529
    echo "</tr>\n";
530 531 532
}

echo "</table>\n";
533
SUBPAGEEND();
534 535 536 537 538

#
# Standard Testbed Footer
# 
PAGEFOOTER();
539 540 541
?>