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

#
# Standard Testbed Header
#
12
PAGEHEADER("Experiment Information Listing");
13
14
15
16
17
18
19

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

20
$isadmin     = ISADMIN($uid);
21
22
$clause      = 0;
$having      = "";
Mac Newbold's avatar
Mac Newbold committed
23
24
$active      = 0;
$idle        = 0;
25

Leigh B. Stoller's avatar
Leigh B. Stoller committed
26
27
if (! isset($showtype))
    $showtype="active";
28
29
if (! isset($sortby))
    $sortby = "normal";
Chad Barb's avatar
   
Chad Barb committed
30
31
if (! isset($thumb)) 
    $thumb = 0;
32
33
if (! isset($noignore)) 
    $noignore = 0;
34

Chad Barb's avatar
   
Chad Barb committed
35
echo "<b>Show: ";
36

Chad Barb's avatar
   
Chad Barb committed
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
if ($showtype != "active") {
    echo "<a class='static' href='showexp_list.php3?showtype=active&sortby=$sortby&thumb=$thumb'>Active</a>, ";
} else {
    echo "Active, ";
}

if ($showtype != "batch") {
    echo "<a class='static' href='showexp_list.php3?showtype=batch&sortby=$sortby&thumb=$thumb'>Batch</a>, ";
} else {
    echo "Batch, ";
}

if ($isadmin) {
    if ($showtype != "idle") {
	echo "<a class='static' href='showexp_list.php3?showtype=idle&sortby=$sortby&thumb=$thumb'>Idle</a>, ";
    } else {
	echo "Idle, ";
    }
}

if ($showtype != "all") {
    echo "<a class='static' href='showexp_list.php3?showtype=all&sortby=$sortby&thumb=$thumb'>All</a>";
} else {
    echo "All";
}

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

#echo "<b>Show:
#         <a class='static' href='showexp_list.php3?showtype=active&sortby=$sortby&thumb=$thumb'>active</a>,
#         <a class='static' href='showexp_list.php3?showtype=batch&sortby=$sortby&thumb=$thumb'>batch</a>,";
#if ($isadmin) 
#     echo "\n<a class='static' href='showexp_list.php3?showtype=idle&sortby=$sortby&thumb=$thumb'".
#       ">idle</a>,";
#
#echo "\n       <a class='static' href='showexp_list.php3?showtype=all&sortby=$sortby&thumb=$thumb'>all</a>.
#      </b><br />\n";
Chad Barb's avatar
   
Chad Barb committed
74

75
76
77
78
79
# Default value for showlastlogin is 1 for admins
$showlastlogin = $isadmin;
# Note: setting this to 1 for non-admins still doesn't make the column
# show properly... it just shows the header in the table, over the
# wrong column. 
Leigh B. Stoller's avatar
Leigh B. Stoller committed
80

81
82
# How many hours is considered idle...
$idlehours = TBGetSiteVar("idle/threshold");
83

Leigh B. Stoller's avatar
Leigh B. Stoller committed
84
85
86
87
88
89
90
#
# Handle showtype
# 
if (! strcmp($showtype, "all")) {
    $title  = "All";
}
elseif (! strcmp($showtype, "active")) {
91
92
    # Active is now defined as "having nodes reserved" - we just depend on
    # the fact that we skip expts with no nodes further down...
93
94
95
    # But for speed, explicitly exclude expts that say they are "swapped"
    # (leave in activating, swapping, etc.)
    $clause = "e.state !='$TB_EXPTSTATE_SWAPPED'";
Leigh B. Stoller's avatar
Leigh B. Stoller committed
96
    $title  = "Active";
97
    $having = "having (ncount>0)";
98
    $active = 1;
Leigh B. Stoller's avatar
Leigh B. Stoller committed
99
100
101
102
}
elseif (! strcmp($showtype, "batch")) {
    $clause = "e.batchmode=1";
    $title  = "Batch";
103
}
104
elseif ((!strcmp($showtype, "idle")) && $isadmin ) {
105
    # Do not put active in the clause for same reason as active
106
107
    # However, it takes a long time with so many swapped expts
    $clause = "e.state !='$TB_EXPTSTATE_SWAPPED'";
108
    $title  = "Idle";
109
110
    #$having = "having (lastswap>=1)"; # At least one day since swapin
    $having = "having (lastswap>=0)";
111
    $idle = 1;
112
    $showlastlogin = 0; # don't show a lastlogin column
113
}
114
else {
115
    # See active above
Leigh B. Stoller's avatar
Leigh B. Stoller committed
116
    $title  = "Active";
117
    $having = "having (ncount>0)";
118
    $active = 1;
119
}
120

Chad Barb's avatar
   
Chad Barb committed
121
122
123


if (!$idle) {
Chad Barb's avatar
   
Chad Barb committed
124
125
126
    echo "<b>View: ";

    if ($thumb != 0) {
Chad Barb's avatar
   
Chad Barb committed
127
	echo "<a class='static' href='showexp_list.php3?showtype=$showtype&sortby=$sortby&thumb=0'>";
Chad Barb's avatar
   
Chad Barb committed
128
129
130
131
132
133
134
135
	echo "List";
        echo "</a>";
    } else {
        echo "List";
    }
    echo ", ";

    if ($thumb != 1) {
Chad Barb's avatar
   
Chad Barb committed
136
	echo "<a class='static' href='showexp_list.php3?showtype=$showtype&sortby=$sortby&thumb=1'>";
Chad Barb's avatar
   
Chad Barb committed
137
138
	echo "Detailed Thumbnails";
        echo "</a>";
Chad Barb's avatar
   
Chad Barb committed
139
    } else {
Chad Barb's avatar
   
Chad Barb committed
140
        echo "Detailed Thumbnails";
Chad Barb's avatar
   
Chad Barb committed
141
    }
Chad Barb's avatar
   
Chad Barb committed
142
143
144
    echo ", ";

    if ($thumb != 2) {
Chad Barb's avatar
   
Chad Barb committed
145
	echo "<a class='static' href='showexp_list.php3?showtype=$showtype&sortby=$sortby&thumb=2'>";
Chad Barb's avatar
   
Chad Barb committed
146
147
148
149
150
151
	echo "Brief Thumbnails";
        echo "</a>";
    } else {
        echo "Brief Thumbnails";
    }
    echo "</b><br />\n";
Chad Barb's avatar
   
Chad Barb committed
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
179
180
181
182
183
184
185
186
187
188
189
190
191
192

if ($thumb && !$idle) {
    echo "<b>Sort by: ";
    if (isset($sortby) && $sortby != "normal" && $sortby != "pid") {
	echo "<a class='static' href='showexp_list.php3?showtype=$showtype&sortby=pid&thumb=$thumb'>";
	echo "Project";
        echo "</a>, ";
    } else {
        echo "Project, ";
    }	
    if ($sortby != "eid") {
	echo "<a class='static' href='showexp_list.php3?showtype=$showtype&sortby=eid&thumb=$thumb'>";
	echo "Experiment ID";
        echo "</a>, ";
    } else {
        echo "Experiment ID, ";
    }
    if ($sortby != "pcs") {
	echo "<a class='static' href='showexp_list.php3?showtype=$showtype&sortby=pcs&thumb=$thumb'>";
	echo "Node Usage";
        echo "</a>, ";
    } else {
        echo "Node Usage, ";
    }	
    if ($sortby != "name") {
	echo "<a class='static' href='showexp_list.php3?showtype=$showtype&sortby=name&thumb=$thumb'>";
	echo "Experiment Description";
        echo "</a>, ";
    } else {
        echo "Experiment Description, ";
    }	
    if ($sortby != "uid") {
	echo "<a class='static' href='showexp_list.php3?showtype=$showtype&sortby=uid&thumb=$thumb'>";
	echo "Creator";
        echo "</a>";
    } else {
        echo "Creator";
    }

    echo "</b><br />\n";
}
Chad Barb's avatar
   
Chad Barb committed
193
194
 
#    if (!$thumb) {
Chad Barb's avatar
   
Chad Barb committed
195
#	echo "<b><a class='static' href='showexp_list.php3?showtype=$showtype&sortby=$sortby&thumb=1'>".
Chad Barb's avatar
   
Chad Barb committed
196
197
198
#             "Switch to Thumbnail view".
#	     "</a></b><br />";
#    } else {
Chad Barb's avatar
   
Chad Barb committed
199
#	echo "<b><a class='static' href='showexp_list.php3?showtype=$showtype&sortby=$sortby&thumb=0'>".
Chad Barb's avatar
   
Chad Barb committed
200
201
202
#             "Switch to List view".
#	     "</a></b><br />";
#    }
Chad Barb's avatar
   
Chad Barb committed
203
204
205
206
}

echo "<br />\n";

Leigh B. Stoller's avatar
Leigh B. Stoller committed
207
208
209
#
# Handle sortby.
# 
210
211
212
213
214
215
216
217
218
if (! strcmp($sortby, "normal") ||
    ! strcmp($sortby, "pid"))
    $order = "e.pid,e.eid";
elseif (! strcmp($sortby, "eid"))
    $order = "e.eid,e.expt_head_uid";
elseif (! strcmp($sortby, "uid"))
    $order = "e.expt_head_uid,e.pid,e.eid";
elseif (! strcmp($sortby, "name"))
    $order = "e.expt_name";
219
elseif (! strcmp($sortby, "pcs"))
Chad Barb's avatar
   
Chad Barb committed
220
    $order = "ncount DESC,e.pid,e.eid";
221
222
elseif (! strcmp($sortby, "idle"))
    $order = "canbeidle desc,idle_ignore,idlesec DESC,ncount desc,e.pid,e.eid";
223
224
225
else 
    $order = "e.pid,e.eid";

226
227
228
229
#
# Show a menu of all experiments for all projects that this uid
# is a member of. Or, if an admin type person, show them all!
#
230
231
232
233
234
if ($clause) {
    $clause = "and ($clause)";
} else {
    $clause = "";
}
235
236
237
238
239

# Notes about the queries below:
# - idle is fudged by 121 seconds so that in the five minutes between 
#   slothd reports we don't get active expts showing up as idle for 0.1 hrs

240
if ($isadmin) {
Leigh B. Stoller's avatar
Leigh B. Stoller committed
241
    $experiments_result =
242
243
244
245
246
247
248
249
	DBQueryFatal("
select e.*, date_format(expt_swapped,'%Y-%m-%d') as d, 
date_format(expt_swapped,'%c/%e') as dshort, 
(to_days(now())-to_days(expt_swapped)) as lastswap, 
count(r.node_id) as ncount, swap_requests, 
round((unix_timestamp(now())-unix_timestamp(last_swap_req))/3600,1) as lastreq,
(unix_timestamp(now()) - unix_timestamp(max(greatest(
last_tty_act,last_net_act,last_cpu_act,last_ext_act)))) as idlesec,
250
(max(last_report) is not null) as canbeidle,
251
252
253
254
255
256
257
258
ve.thumb_hash as thumb_hash 
from experiments as e 
left join vis_experiments as ve on ve.pid=e.pid and ve.eid=e.eid 
left join reserved as r on e.pid=r.pid and e.eid=r.eid 
left join nodes as n on r.node_id=n.node_id
left join node_activity as na on r.node_id=na.node_id
where (n.type!='dnard' or n.type is null) $clause 
group by e.pid,e.eid $having order by $order");
259
260
}
else {
Leigh B. Stoller's avatar
Leigh B. Stoller committed
261
    $experiments_result =
262
263
264
265
266
	DBQueryFatal("
select distinct e.*, date_format(expt_swapped,'%Y-%m-%d') as d, 
date_format(expt_swapped,'%c/%e') as dshort, count(r.node_id) as ncount, 
(unix_timestamp(now()) - unix_timestamp(max(greatest(
last_tty_act,last_net_act,last_cpu_act,last_ext_act)))) as idlesec,
267
(max(last_report) is not null) as canbeidle,
268
269
270
271
272
273
274
275
276
277
ve.thumb_hash as thumb_hash 
from group_membership as g 
left join experiments as e on g.pid=e.pid and g.pid=g.gid 
left join vis_experiments as ve on ve.pid=e.pid and ve.eid=e.eid 
left join reserved as r on e.pid=r.pid and e.eid=r.eid 
left join nodes as n on r.node_id=n.node_id 
left join node_activity as na on r.node_id=na.node_id
where (n.type!='dnard' or n.type is null) and 
 g.uid='$uid' and e.pid is not null and e.eid is not null $clause 
group by e.pid,e.eid $having order by $order");    
278
}
279
if (! mysql_num_rows($experiments_result)) {
280
281
    USERERROR("There are no experiments running in any of the projects ".
              "you are a member of.", 1);
282
283
}

284
285
if (mysql_num_rows($experiments_result)) {
    echo "<center>
Leigh B. Stoller's avatar
Leigh B. Stoller committed
286
           <h2>$title Experiments</h2>
287
          </center>\n";
288

Mac Newbold's avatar
Mac Newbold committed
289
    if ($idle) {
290
      echo "<p><center><b>Experiments that have been idle at least 
291
292
293
294
295
296
$idlehours hours</b><br>\n";
      if ($noignore) {
        echo "<a class='static' href='showexp_list.php3?showtype=idle&sortby=$sortby&thumb=$thumb'>\n
Exclude idle-ignore experiments</a></center></p><br />\n";
      } else {
        echo "<a class='static' href='showexp_list.php3?showtype=idle&sortby=$sortby&thumb=$thumb&noignore=1'>\n
297
Include idle-ignore experiments</a></center></p><br />\n";
298
      }
Mac Newbold's avatar
Mac Newbold committed
299
    }
300
    
301
    $idlemark = "<b>*</b>";
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
    #
    # Okay, I decided to do this as one big query instead of a zillion
    # per-exp queries in the loop below. No real reason, except my personal
    # desire not to churn the DB.
    # 
    $total_usage  = array();
    $perexp_usage = array();

    #
    # Geta all the classes of nodes each experiment is using, and create
    # a two-D array with their counts.
    # 
    $usage_query =
	DBQueryFatal("select r.pid,r.eid,nt.class, ".
		     "  count(nt.class) as ncount ".
		     "from reserved as r ".
		     "left join nodes as n on r.node_id=n.node_id ".
		     "left join node_types as nt on n.type=nt.type ".
		     "where n.type!='dnard' ".
		     "group by r.pid,r.eid,nt.class");

    while ($row = mysql_fetch_array($usage_query)) {
	$pid   = $row[0];
	$eid   = $row[1];
	$class = $row[2];
	$count = $row[3];
	
	$perexp_usage["$pid:$eid"][$class] = $count;
    }
331
332
333
334

    #
    # Now shove out the column headers.
    #
Chad Barb's avatar
   
Chad Barb committed
335
if ($thumb && !$idle) {
Chad Barb's avatar
   
Chad Barb committed
336
337
338
339
340
    if ($thumb == 2) {
	echo "<table border=2 cols=4 cellpadding=2 cellspacing=2 align=center><tr>";
    } else {
	echo "<table border=2 cols=2 cellpadding=2 cellspacing=2 align=center><tr>";
    }
Chad Barb's avatar
   
Chad Barb committed
341
342
343
344
345
346
347
    $thumbCount = 0;
 
    while ($row = mysql_fetch_array($experiments_result)) {	
	$pid  = $row["pid"];
	$eid  = $row["eid"]; 
	$huid = $row["expt_head_uid"];
	$name = stripslashes($row["expt_name"]);
348
	$date = $row["dshort"];
349
	$thumb_hash = $row["thumb_hash"];
Chad Barb's avatar
   
Chad Barb committed
350
351
	
	if ($idle && ($str=="&nbsp;" || !$pcs)) { continue; }
Chad Barb's avatar
   
Chad Barb committed
352
353
354
355
356
357
358
359
360
361
362
363
364

	if ($TBMAINSITE) {
	    # if image is not in thumbs dir, render it!
	    if ($thumb_hash && !file_exists ($TBDIR . "www/thumbs/tn$thumb_hash.png")) {
		# we'll be paranoid, and escape pid and eid.
		$prerender_cmd = $TBDIR . "libexec/vis/prerender -t " . 
		                 escapeshellcmd($pid) . " " . escapeshellcmd($eid) .
				 " > /dev/null";
		#echo "<!-- rerendered $pid $eid -->";
		system( $prerender_cmd );
	    }
	}

Chad Barb's avatar
   
Chad Barb committed
365
366
367
368
369
#	echo "<table style=\"float: none;\" width=256 height=192><tr><td>".
#	echo "And<table align=left width=256 height=192><tr width=256><td height=192>".
#	echo "<table width=256 height=192><tr><td>".
#	echo "<td width=50%>".
#	echo "<tr
Chad Barb's avatar
   
Chad Barb committed
370

Chad Barb's avatar
   
Chad Barb committed
371
372
373
374
375
376
377
378
379
380
381
382
	if ($thumb == 2) {
	    if ($pid != "emulab-ops") {
		echo "<td align=center>".
		     "<a href='shownsfile.php3?pid=$pid&eid=$eid'>".
		     "<img border=1 width=128 height=128 class='stealth' ".
		     " src='thumbs/tn$thumb_hash.png' />".
		     "<br />\n".
		     "<b>".
		     "<a href='showproject.php3?pid=$pid'>$pid</a>/<br />".
		     "<a href='showexp.php3?pid=$pid&eid=$eid'>$eid</a>".
		     "</b>".
		     "</td>";
Chad Barb's avatar
Chad Barb committed
383
384
385

		$thumbcount++;
		if (($thumbcount % 4) == 0) { echo "</tr><tr>\n"; }
Chad Barb's avatar
   
Chad Barb committed
386
387
388
389
390
391
392
393
394
	    }
	} else {

	    echo "<td>".
		 "<table border=0 cellpadding=4 cellspacing=0>".
		 "<tr>".
		 "<td width=128 align=center>".
	         "<a href='shownsfile.php3?pid=$pid&eid=$eid'>".
		 "<img border=1 width=128 height=128 class='stealth' ".
395
396
#	     " src='top2image.php3?pid=$pid&eid=$eid&thumb=128' />".
#	     " src='thumbs/$pid.$eid.png' />".
Chad Barb's avatar
   
Chad Barb committed
397
398
399
400
401
402
403
404
405
406
407
		 " src='thumbs/tn$thumb_hash.png' />".
	         "</a>".
                 "</td>".
	         "<td align=left class='paddedcell'>".
	         "<b>".
 	         "<a href='showproject.php3?pid=$pid'>$pid</a>/".
                 "<a href='showexp.php3?pid=$pid&eid=$eid'>$eid</a>".
	         "</b>".
	         "<br />\n".
	         "<b><font size=-1>$name</font></b>".
                 "<br />\n";
Chad Barb's avatar
   
Chad Barb committed
408
409


Chad Barb's avatar
   
Chad Barb committed
410
411
412
413
414
415
416
417
418
	    if ($isadmin) {
		$swappable= $row["swappable"];
		$swapreq=$row["swap_requests"];
		$lastswapreq=$row["lastreq"];
		$lastlogin = "";
		if ($lastexpnodelogins = TBExpUidLastLogins($pid, $eid)) {
		    $daysidle=$lastexpnodelogins["daysidle"];
		    #if ($idle && $daysidle < 1)
		    #  continue;
419
		    $lastlogin .= $lastexpnodelogins["shortdate"] . " " .
Chad Barb's avatar
   
Chad Barb committed
420
421
422
			"(" . $lastexpnodelogins["uid"] . ")";
		} elseif ($state=="active") {
		    $daysidle=$row["lastswap"];
423
		    $lastlogin .= "$date swapin";
Chad Barb's avatar
   
Chad Barb committed
424
425
426
427
428
429
		}
		# if ($lastlogin=="") { $lastlogin="<td>&nbsp;</td>\n"; }
		if ($lastlogin != "") {
		    echo "<font size=-2><b>Last Login:</b> $lastlogin</font><br />\n";
		}
	    }	
Chad Barb's avatar
   
Chad Barb committed
430

Chad Barb's avatar
   
Chad Barb committed
431
432
433
	    echo "<font size=-2><b>Created by:</b> ".
		 "<a href='showuser.php3?target_uid=$huid'>$huid</a>".
		 "</font><br />\n";
Chad Barb's avatar
   
Chad Barb committed
434

Chad Barb's avatar
   
Chad Barb committed
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
	    $special = 0;
	    $pcs     = 0;
	    reset($perexp_usage);
	    if (isset($perexp_usage["$pid:$eid"])) {
		while (list ($class, $count) = each($perexp_usage["$pid:$eid"])) {
		    if (strcmp($class, "pc")) {
			$special += $count;
		    } else {
			$pcs += $count;
		    }
		}
	    }

	    if ($pcs) {
		if ($pcs == 1) { $plural = ""; } else { $plural = "s"; }  
		echo "<font size=-1><b>Using <font color=red>$pcs PC</font> Node$plural</b></font><br />\n";
	    }
	    if ($special) {
		if ($special == 1) { $plural = ""; } else { $plural = "s"; }  
		echo "<font size=-1><b>Using <font color=red>$special Special</font> Node$plural</b></font><br />\n";
	    }

Chad Barb's avatar
   
Chad Barb committed
457
458
	    echo "</td></tr></table> \n";
	    echo "</td>";
Chad Barb's avatar
   
Chad Barb committed
459

Chad Barb's avatar
Chad Barb committed
460
	    $thumbcount++;
Chad Barb's avatar
   
Chad Barb committed
461
462
	    if (($thumbcount % 2) == 0) { echo "</tr><tr>\n"; }
	}
Chad Barb's avatar
   
Chad Barb committed
463
464
465
466
    }

    echo "</tr></table>";
} else {
467
468
469

    $ni = ($noignore ? "&noignore=$noignore" : "");
    
470
471
472
    echo "<table border=2 cols=0
                 cellpadding=0 cellspacing=2 align=center>
            <tr>
Chad Barb's avatar
   
Chad Barb committed
473
              <th width=8%>
474
               <a class='static' href='showexp_list.php3?showtype=$showtype&sortby=pid$ni'>
Chad Barb's avatar
   
Chad Barb committed
475
                  PID</a></th>
Chad Barb's avatar
   
Chad Barb committed
476
              <th width=8%>
477
               <a class='static' href='showexp_list.php3?showtype=$showtype&sortby=eid$ni'>
Chad Barb's avatar
   
Chad Barb committed
478
                  EID</a></th>
Chad Barb's avatar
   
Chad Barb committed
479
              <th align=center width=3%>
480
               <a class='static' href='showexp_list.php3?showtype=$showtype&sortby=pcs$ni'>
481
482
                  PCs</a><br>[<b>1</b>]</th>
              <th align=center width=3%>
483
               <a class='static' href='showexp_list.php3?showtype=$showtype&sortby=idle$ni'>
484
               Hours Idle</th>\n";
485
    
486
    if ($showlastlogin)
Chad Barb's avatar
   
Chad Barb committed
487
        echo "<th width=17% align=center>Last Login</th>\n";
488
    if ($idle) {
Chad Barb's avatar
   
Chad Barb committed
489
        #      "<th width=4% align=center>Days Idle</th>\n";
490
491
	echo "<th width=4% align=center colspan=2>Swap Request</th>\n";
    }
492

Chad Barb's avatar
   
Chad Barb committed
493
    echo "    <th width=60%>
494
               <a class='static' href='showexp_list.php3?showtype=$showtype&sortby=name$ni'>
Chad Barb's avatar
   
Chad Barb committed
495
                  Name</a></th>
Chad Barb's avatar
   
Chad Barb committed
496
              <th width=4%>
497
               <a class='static' href='showexp_list.php3?showtype=$showtype&sortby=uid$ni'>
Chad Barb's avatar
   
Chad Barb committed
498
                  Head UID</a></th>
499
500
            </tr>\n";

501
    while ($row = mysql_fetch_array($experiments_result)) {
502
503
504
	$pid  = $row["pid"];
	$eid  = $row["eid"]; 
	$huid = $row["expt_head_uid"];
Leigh B. Stoller's avatar
Leigh B. Stoller committed
505
	$name = stripslashes($row["expt_name"]);
506
	$date = $row["dshort"];
507
	$state= $row["state"];
508
509
510
511
	$ignore = $row['idle_ignore'];
	$idlesec= $row["idlesec"];
	$swapreqs = $row["swap_requests"];
	$isidle = ($idlesec >= 3600*$idlehours);
512
	$daysidle=0;
513
514
515
516
	$idletime = ($idlesec > 300 ? round($idlesec/3600,1) : 0);
	
	if ($swapreqs && !$isidle) {
	    $swapreqs = "";
517
518
519
520
	    mysql_query("update experiments set swap_requests='' ".
			"where pid='$pid' and eid='$eid'");
	}

521
	if ($ignore) { $isidle=0; }
522
	
523
	if ($isadmin) {
524
525
526
	    $swappable= $row["swappable"];
	    $swapreq=$row["swap_requests"];
	    $lastswapreq=$row["lastreq"];
527
528
529
530
531
532
	    if ($lastswapreq > $idletime) {
		# My last request was from _before_ it was idle this time
		mysql_query("update experiments set swap_requests='' ".
			    "where pid='$pid' and eid='$eid'");
		$swapreq=0;
	    }
533
534
	    $idlemailinterval = TBGetSiteVar("idle/mailinterval");
	    # Is it toosoon to send another mail?
535
	    $toosoon = ($swapreq>0 && ($lastswapreq < $idlemailinterval));
536
	    $lastlogin = "<td>";
537
	    if ($lastexpnodelogins = TBExpUidLastLogins($pid, $eid)) {
538
	        $daysidle=$lastexpnodelogins["daysidle"];
539
540
	        #if ($idle && $daysidle < 1)
		#  continue;
541
		$lastlogin .= $lastexpnodelogins["shortdate"] . " " .
542
		 "(" . $lastexpnodelogins["uid"] . ")";
543
	    } elseif ($state=="active") {
544
	        $daysidle=$row["lastswap"];
545
	        $lastlogin .= "$date swapin";
546
	    }
547
548
	    $lastlogin.="</td>\n";
	    if ($lastlogin=="<td></td>\n") { $lastlogin="<td>&nbsp;</td>\n"; }
549
550
	}

551
	if ($idle) {
552
	    $stale = TBGetExptIdleStale($pid,$eid);
553
	    # If it is ignored, skip it now.
554
	    if ($ignore && !$noignore) { continue; }
555
	    #$lastlogin .= "<td align=center>$daysidle</td>\n";
556
557
558
559
	    if (isset($perexp_usage["$pid:$eid"]) &&
		isset($perexp_usage["$pid:$eid"]["pc"])) {
	      $pcs = $perexp_usage["$pid:$eid"]["pc"];
	    } else { $pcs=0; }
560
	    $foo = "<td align=center valign=center>\n";
561
562
563
564
565
	    $label = "";
	    if ($stale) { $label .= "stale "; }
	    if ($ignore) { $label .= "ignore "; }
	    if (!$swappable) { $label .= "unswap. "; }
	    if ($label == "") { $label = "&nbsp;"; }
566
 	    if ($isidle && !$stale && !$ignore && !$toosoon && $pcs) {
567
568
		$fooswap = "<td><a ".
		    "href=\"request_swapexp.php3?pid=$pid&eid=$eid\">".
569
		    "<img border=0 src=\"redball.gif\"></a> $label</td>\n" ;
570
	    } else {
571
572
573
		$fooswap = "<td>$label</td>";
		if (!$pcs) { $foo .= "(no PCs)\n"; }
		else { $foo .="&nbsp;"; }
574
575
	    }
	    if ($swapreq > 0) {
Chad Barb's avatar
   
Chad Barb committed
576
	      $foo .= "&nbsp;$swapreq&nbsp;sent<br />".
577
	              "<font size=-2>(${lastswapreq}&nbsp;hrs&nbsp;ago)</font>\n";
578
	    }
Chad Barb's avatar
   
Chad Barb committed
579
	    $foo .= "</td>" . $fooswap . "\n"; 
580
	}
581

582
	if ($idle && ($str=="&nbsp;" || !$pcs || !$isidle)) { continue; }
583

584
585
	$nodes   = 0;
	$special = 0;
586
587
588
589
	reset($perexp_usage);
	if (isset($perexp_usage["$pid:$eid"])) {
	    while (list ($class, $count) = each($perexp_usage["$pid:$eid"])) {
		$nodes += $count;
590
		if (strcmp($class, "pc")) {
591
		    $special = 1;
592
593
594
595
		} else {
		    $pcs = $count;
		}

596
597
598
599
600
601
602

		# Summary counts for just the experiments in the projects
		# the user is a member of.
		if (!isset($total_usage[$class]))
		    $total_usage[$class] = 0;
			
		$total_usage[$class] += $count;
603
	    }
604
	}
605
606
607

	# in idle or active, skip experiments with no nodes.
	if (($idle || $active) && $nodes == 0) { continue; }
608
609
	if ($nodes==0) { $nodes = "&nbsp;"; }
	
610
611
	echo "<tr>
                <td><A href='showproject.php3?pid=$pid'>$pid</A></td>
Leigh B. Stoller's avatar
Leigh B. Stoller committed
612
                <td><A href='showexp.php3?pid=$pid&eid=$eid'>
613
                       $eid</A></td>\n";
614
615
	
	if ($isidle) { $nodes = $nodes.$idlemark; }
616
617
618
619
620
	# If multiple classes, then hightlight the number.
	if ($special)
            echo "<td><font color=red>$nodes</font></td>\n";
	else
            echo "<td>$nodes</td>\n";
621

Chad Barb's avatar
   
Chad Barb committed
622
623
624
	if ($idletime == -1) {
	    echo "<td>&nbsp;</td>\n";
	} else {
625
626
627
628
629
	    if ($ignore && $idletime !=0) {
		echo "<td>($idletime)</td>\n";
	    } else {
		echo "<td>$idletime</td>\n";
	    }
Chad Barb's avatar
   
Chad Barb committed
630
	}
631
632
	
	if ($showlastlogin) echo "$lastlogin\n";
633
	if ($idle) echo "$foo\n";
634
635

        echo "<td>$name</td>
636
637
                <td><A href='showuser.php3?target_uid=$huid'>
                       $huid</A></td>
638
639
640
               </tr>\n";
    }
    echo "</table>\n";
641
642
643

    echo "<ol>
             <li><font color=red>Red</font> indicates nodes other than PCs.
644
645
                 A $idlemark mark by the node count indicates that the
                 experiment is currently considered idle.
646
647
648
          </ol>\n";
    
    echo "<center><b>Node Totals</b></center>\n";
649
650
651
    echo "<table border=0
                 cellpadding=1 cellspacing=1 align=center>\n";
    $total = 0;
652
    ksort($total_usage);
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
    while (list($type, $count) = each($total_usage)) {
	    $total += $count;
	    echo "<tr>
                    <td align=right>${type}:</td>
                    <td>&nbsp &nbsp &nbsp &nbsp</td>
                    <td align=center>$count</td>
                  </tr>\n";
    }
    echo "<tr>
             <td align=right><hr></td>
             <td>&nbsp &nbsp &nbsp &nbsp</td>
             <td align=center><hr></td>
          </tr>\n";
    echo "<tr>
             <td align=right><b>Total</b>:</td>
             <td>&nbsp &nbsp &nbsp &nbsp</td>
             <td align=center>$total</td>
          </tr>\n";
    
    echo "</table>\n";
Chad Barb's avatar
   
Chad Barb committed
673
674
} # if ($thumb && !$idle)
} # if (mysql_num_rows($experiments_result))
675
676
677
678
679
680

#
# Standard Testbed Footer
# 
PAGEFOOTER();
?>