コード例 #1
0
ファイル: node_defs.php プロジェクト: mahyuddin/emulab-stable
 function Show($flags = 0)
 {
     $node_id = $this->node_id();
     $short = $flags & SHOWNODE_SHORT ? 1 : 0;
     $noperm = $flags & SHOWNODE_NOPERM ? 1 : 0;
     $query_result = DBQueryFatal("select n.*,na.*,r.vname,r.pid,r.eid,i.IP, " . "greatest(last_tty_act,last_net_act,last_cpu_act," . "last_ext_act) as last_act, " . "  t.isvirtnode,t.isremotenode,t.isplabdslice, " . "  r.erole as rsrvrole, pi.IP as phys_IP, loc.*, " . "  util.*,n.uuid as node_uuid, " . "  mi.IP as mngmnt_IP " . " from nodes as n " . "left join reserved as r on n.node_id=r.node_id " . "left join node_activity as na on " . "     n.node_id=na.node_id " . "left join node_types as t on t.type=n.type " . "left join interfaces as i on " . "     i.node_id=n.node_id and " . "     i.role='" . TBDB_IFACEROLE_CONTROL . "' " . "left join interfaces as pi on " . "     pi.node_id=n.phys_nodeid and " . "     pi.role='" . TBDB_IFACEROLE_CONTROL . "' " . "left join interfaces as mi on " . "     mi.node_id=n.node_id and " . "     mi.role='" . TBDB_IFACEROLE_MANAGEMENT . "' " . "left join location_info as loc on " . "     loc.node_id=n.node_id " . "left join node_utilization as util on " . "     util.node_id=n.node_id " . "where n.node_id='{$node_id}'");
     if (mysql_num_rows($query_result) == 0) {
         TBERROR("The node {$node_id} is not a valid nodeid!", 1);
     }
     $row = mysql_fetch_array($query_result);
     $phys_nodeid = $row["phys_nodeid"];
     $type = $row["type"];
     $vname = $row["vname"];
     $pid = $row["pid"];
     $eid = $row["eid"];
     $def_boot_osid = $row["def_boot_osid"];
     $def_boot_cmd_line = $row["def_boot_cmd_line"];
     $next_boot_osid = $row["next_boot_osid"];
     $temp_boot_osid = $row["temp_boot_osid"];
     $next_boot_cmd_line = $row["next_boot_cmd_line"];
     $rpms = $row["rpms"];
     $tarballs = $row["tarballs"];
     $startupcmd = $row["startupcmd"];
     $routertype = $row["routertype"];
     $eventstate = $row["eventstate"];
     $state_timestamp = $row["state_timestamp"];
     $allocstate = $row["allocstate"];
     $allocstate_timestamp = $row["allocstate_timestamp"];
     $op_mode = $row["op_mode"];
     $op_mode_timestamp = $row["op_mode_timestamp"];
     $IP = $row["IP"];
     $isvirtnode = $row["isvirtnode"];
     $isremotenode = $row["isremotenode"];
     $isplabdslice = $row["isplabdslice"];
     $ipport_low = $row["ipport_low"];
     $ipport_next = $row["ipport_next"];
     $ipport_high = $row["ipport_high"];
     $sshdport = $row["sshdport"];
     $last_act = $row["last_act"];
     $last_tty_act = $row["last_tty_act"];
     $last_net_act = $row["last_net_act"];
     $last_cpu_act = $row["last_cpu_act"];
     $last_ext_act = $row["last_ext_act"];
     $last_report = $row["last_report"];
     $rsrvrole = $row["rsrvrole"];
     $phys_IP = $row["phys_IP"];
     $mngmnt_IP = $row["mngmnt_IP"];
     $battery_voltage = $row["battery_voltage"];
     $battery_percentage = $row["battery_percentage"];
     $battery_timestamp = $row["battery_timestamp"];
     $boot_errno = $row["boot_errno"];
     $reserved_pid = $row["reserved_pid"];
     $inception = $row["inception"];
     $alloctime = $row["allocated"];
     $downtime = $row["down"];
     $uuid = $row["node_uuid"];
     if (!$def_boot_cmd_line) {
         $def_boot_cmd_line = " ";
     }
     if (!$next_boot_cmd_line) {
         $next_boot_cmd_line = " ";
     }
     if (!$rpms) {
         $rpms = " ";
     }
     if (!$tarballs) {
         $tarballs = " ";
     }
     if (!$startupcmd) {
         $startupcmd = " ";
     } else {
         $startupcmd = CleanString($startupcmd);
     }
     if ($node_id != $phys_nodeid) {
         if (!($phys_this = Node::Lookup($phys_nodeid))) {
             TBERROR("Cannot map physical node {$phys_nodeid} to object", 1);
         }
     }
     if (!$short) {
         #
         # Location info.
         #
         if (isset($row["loc_x"]) && isset($row["loc_y"]) && isset($row["floor"]) && isset($row["building"])) {
             $floor = $row["floor"];
             $building = $row["building"];
             $room = $row["room"];
             $loc_x = $row["loc_x"];
             $loc_y = $row["loc_y"];
             $orient = $row["orientation"];
             $contact = $row["contact"];
             $email = $row["email"];
             $phone = $row["phone"];
             $query_result = DBQueryFatal("select * from floorimages " . "where scale=1 and " . "      floor='{$floor}' and " . "      building='{$building}'");
             if (mysql_num_rows($query_result)) {
                 $row = mysql_fetch_array($query_result);
                 if (isset($row["pixels_per_meter"]) && ($pixels_per_meter = $row["pixels_per_meter"]) != 0.0) {
                     $meters_x = sprintf("%.3f", $loc_x / $pixels_per_meter);
                     $meters_y = sprintf("%.3f", $loc_y / $pixels_per_meter);
                     if (isset($orient)) {
                         $orientation = sprintf("%.3f", $orient);
                     }
                 }
             }
         }
     }
     echo "<table border=2 cellpadding=0 cellspacing=2\n                 align=center>\n";
     echo "<tr>\n              <td>Node ID:</td>\n              <td class=left>{$node_id}</td>\n          </tr>\n";
     if ($isvirtnode) {
         if (strcmp($node_id, $phys_nodeid)) {
             echo "<tr>\n                      <td>Phys ID:</td>\n                      <td class=left>\n\t   \t          <a href='shownode.php3?node_id={$phys_nodeid}'>\n                             {$phys_nodeid}</a></td>\n                  </tr>\n";
         }
     }
     if (!$short && !$noperm) {
         if ($vname) {
             echo "<tr>\n                      <td>Virtual Name:</td>\n                      <td class=left>{$vname}</td>\n                  </tr>\n";
         }
         if ($pid) {
             echo "<tr>\n                      <td>Project: </td>\n                      <td class=\"left\">\n                          <a href='showproject.php3?pid={$pid}'>{$pid}</a></td>\n                  </tr>\n";
             echo "<tr>\n                      <td>Experiment:</td>\n                      <td><a href='showexp.php3?pid={$pid}&eid={$eid}'>\n                             {$eid}</a></td>\n                  </tr>\n";
         }
     }
     echo "<tr>\n              <td>Node Type:</td>\n              <td class=left>\n  \t          <a href='shownodetype.php3?node_type={$type}'>{$type}</td>\n          </tr>\n";
     $feat_result = DBQueryFatal("select * from node_features " . "where node_id='{$node_id}'");
     if (mysql_num_rows($feat_result) > 0) {
         $features = "";
         $count = 0;
         while ($row = mysql_fetch_array($feat_result)) {
             if ($count > 0 && $count % 2 == 0) {
                 $features .= "<br>";
             }
             $features .= " " . $row["feature"];
             $count += 1;
         }
         echo "<tr><td>Features:</td><td class=left>{$features}</td></tr>";
     }
     if (!$short && !$noperm) {
         echo "<tr>\n                  <td>Def Boot OS:</td>\n                  <td class=left>";
         SpitOSIDLink($def_boot_osid);
         echo "    </td>\n              </tr>\n";
         if ($eventstate) {
             $when = strftime("20%y-%m-%d %H:%M:%S", $state_timestamp);
             echo "<tr>\n                     <td>EventState:</td>\n                     <td class=left>{$eventstate} ({$when})</td>\n                  </tr>\n";
         }
         if ($op_mode) {
             $when = strftime("20%y-%m-%d %H:%M:%S", $op_mode_timestamp);
             echo "<tr>\n                     <td>Operating Mode:</td>\n                     <td class=left>{$op_mode} ({$when})</td>\n                  </tr>\n";
         }
         if ($allocstate) {
             $when = strftime("20%y-%m-%d %H:%M:%S", $allocstate_timestamp);
             echo "<tr>\n                     <td>AllocState:</td>\n                     <td class=left>{$allocstate} ({$when})</td>\n                  </tr>\n";
         }
     }
     if (!$short) {
         #
         # Location info.
         #
         if (isset($building)) {
             echo "<tr>\n                      <td>Location (bldg/floor/room):</td>\n                      <td class=left>{$building}";
             if (isset($floor)) {
                 echo "/{$floor}";
             }
             if (isset($room)) {
                 echo "/{$room}";
             }
             echo "</td>\n                      </tr>\n";
         }
         if (isset($meters_x) && isset($meters_y)) {
             echo "<tr>\n                      <td>Location Coordinates:</td>\n                      <td class=left>x={$meters_x}, y={$meters_y} meters";
             if (isset($orientation)) {
                 echo " (o={$orientation} degrees)";
             }
             echo "</td>\n                  </tr>\n";
         }
         if (OPSGUY() && (isset($contact) || isset($email))) {
             $lcstr = "";
             if (isset($contact)) {
                 $lcstr .= "{$contact}:";
             }
             if (isset($email)) {
                 $lcstr .= " <a href='mailto:{$email}'>{$email}</a>";
             }
             if (isset($phone)) {
                 $lcstr .= " {$phone}";
             }
             echo "<tr>\n                      <td>Location Contact:</td>\n                      <td class=left>{$lcstr}\n                      </td>\n                  </tr>\n";
         }
     }
     if (!$short && !$noperm) {
         #
         # We want the last login for this node, but only if its *after*
         # the experiment was created (or swapped in).
         #
         if ($lastnodeuidlogin = TBNodeUidLastLogin($node_id)) {
             $foo = $lastnodeuidlogin["date"] . " " . $lastnodeuidlogin["time"] . " " . "(" . $lastnodeuidlogin["uid"] . ")";
             echo "<tr>\n                      <td>Last Login:</td>\n                      <td class=left>{$foo}</td>\n                 </tr>\n";
         }
         if ($last_act) {
             echo "<tr>\n                      <td>Last Activity:</td>\n                      <td class=left>{$last_act}</td>\n                  </tr>\n";
             $idletime = $this->IdleTime();
             echo "<tr>\n                      <td>Idle Time:</td>\n                      <td class=left>{$idletime} hours</td>\n                  </tr>\n";
             echo "<tr>\n                      <td>Last Act. Report:</td>\n                      <td class=left>{$last_report}</td>\n                  </tr>\n";
             echo "<tr>\n                      <td>Last TTY Act.:</td>\n                      <td class=left>{$last_tty_act}</td>\n                  </tr>\n";
             echo "<tr>\n                      <td>Last Net. Act.:</td>\n                      <td class=left>{$last_net_act}</td>\n                  </tr>\n";
             echo "<tr>\n                      <td>Last CPU Act.:</td>\n                      <td class=left>{$last_cpu_act}</td>\n                  </tr>\n";
             echo "<tr>\n                      <td>Last Ext. Act.:</td>\n                      <td class=left>{$last_ext_act}</td>\n                  </tr>\n";
         }
     }
     if (!$short && !$noperm) {
         if (!$isvirtnode && !$isremotenode) {
             echo "<tr>\n                      <td>Def Boot Command&nbsp;Line:</td>\n                      <td class=left>{$def_boot_cmd_line}</td>\n                  </tr>\n";
             echo "<tr>\n                      <td>Next Boot OS:</td>\n                      <td class=left>";
             if ($next_boot_osid) {
                 SpitOSIDLink($next_boot_osid);
             } else {
                 echo "&nbsp;";
             }
             echo "    </td>\n                  </tr>\n";
             echo "<tr>\n                      <td>Next Boot Command Line:</td>\n                      <td class=left>{$next_boot_cmd_line}</td>\n                  </tr>\n";
             echo "<tr>\n                      <td>Temp Boot OS:</td>\n                      <td class=left>";
             if ($temp_boot_osid) {
                 SpitOSIDLink($temp_boot_osid);
             } else {
                 echo "&nbsp;";
             }
             echo "    </td>\n                  </tr>\n";
         } elseif ($isvirtnode) {
             if (!$isplabdslice) {
                 echo "<tr>\n                          <td>IP Port Low:</td>\n                          <td class=left>{$ipport_low}</td>\n                      </tr>\n";
                 echo "<tr>\n                          <td>IP Port Next:</td>\n                          <td class=left>{$ipport_next}</td>\n                      </tr>\n";
                 echo "<tr>\n                          <td>IP Port High:</td>\n                          <td class=left>{$ipport_high}</td>\n                      </tr>\n";
             }
             echo "<tr>\n                      <td>SSHD Port:</td>\n                     <td class=left>{$sshdport}</td>\n                  </tr>\n";
         }
         echo "<tr>\n                  <td>Startup Command:</td>\n                  <td class=left>{$startupcmd}</td>\n              </tr>\n";
         echo "<tr>\n                  <td>Tarballs:</td>\n                  <td class=left>{$tarballs}</td>\n              </tr>\n";
         echo "<tr>\n                  <td>RPMs:</td>\n                  <td class=left>{$rpms}</td>\n              </tr>\n";
         echo "<tr>\n                  <td>Boot Errno:</td>\n                  <td class=left>{$boot_errno}</td>\n              </tr>\n";
         if (!$isvirtnode && !$isremotenode) {
             echo "<tr>\n                      <td>Router Type:</td>\n                      <td class=left>{$routertype}</td>\n                  </tr>\n";
         }
         if ($IP) {
             echo "<tr>\n                      <td>Control Net IP:</td>\n                      <td class=left>{$IP}</td>\n                  </tr>\n";
             if ($mngmnt_IP) {
                 echo "<tr>\n                          <td>Management IP:</td>\n                          <td class=left>{$mngmnt_IP}</td>\n                       </tr>\n";
             }
         } elseif ($phys_IP) {
             echo "<tr>\n                      <td>Physical IP:</td>\n                      <td class=left>{$phys_IP}</td>\n                  </tr>\n";
         }
         if ($rsrvrole) {
             echo "<tr>\n                      <td>Role:</td>\n                      <td class=left>{$rsrvrole}</td>\n                  </tr>\n";
         }
         if ($reserved_pid) {
             echo "<tr>\n                      <td>Reserved Pid:</td>\n                      <td class=left>\n                          <a href='showproject.php3?pid={$reserved_pid}'>\n                               {$reserved_pid}</a></td>\n                  </tr>\n";
         }
         if ($uuid) {
             echo "<tr>\n                      <td>UUID:</td>\n                      <td class=left>{$uuid}</td>\n                  </tr>\n";
         }
         #
         # Show battery stuff
         #
         if (isset($battery_voltage) && isset($battery_percentage)) {
             echo "<tr>\n    \t              <td>Battery Volts/Percent</td>\n\t\t      <td class=left>";
             printf("%.2f/%.2f ", $battery_voltage, $battery_percentage);
             if (isset($battery_timestamp)) {
                 echo "(" . date("m/d/y H:i:s", $battery_timestamp) . ")";
             }
             echo "    </td>\n\t\t  </tr>\n";
         }
         if ($isplabdslice) {
             $query_result = DBQueryFatal("select leaseend from plab_slice_nodes " . "where node_id='{$node_id}'");
             if (mysql_num_rows($query_result) != 0) {
                 $row = mysql_fetch_array($query_result);
                 $leaseend = $row["leaseend"];
                 echo "<tr>\n                     <td>Lease Expiration:</td>\n                     <td class=left>{$leaseend}</td>\n                 </tr>\n";
             }
         }
         if ($isremotenode) {
             if ($isvirtnode) {
                 $phys_this->ShowWideAreaNode(1);
             } else {
                 $this->ShowWideAreaNode(1);
             }
         }
         #
         # Show any auxtypes the node has
         #
         $query_result = DBQueryFatal("select type, count from node_auxtypes " . "where node_id='{$node_id}'");
         if (mysql_num_rows($query_result) != 0) {
             echo "<tr>\n                      <td align=center colspan=2>\n                      Auxiliary Types\n                      </td>\n                  </tr>\n";
             echo "<tr><th>Type</th><th>Count</th>\n";
             while ($row = mysql_fetch_array($query_result)) {
                 $type = $row["type"];
                 $count = $row["count"];
                 echo "<tr>\n    \t    \t          <td>{$type}</td>\n\t\t          <td class=left>{$count}</td>\n\t\t      </td>\n";
             }
         }
     }
     if (!$short) {
         #
         # Get interface info.
         #
         echo "<tr>\n                  <td align=center colspan=2>Interface Info</td>\n              </tr>\n";
         echo "<tr><th>Interface</th><th>Model; protocols</th>\n";
         $query_result = DBQueryFatal("select i.*,it.*,c.*,s.capval as channel " . "  from interfaces as i " . "left join interface_types as it on " . "     i.interface_type=it.type " . "left join interface_capabilities as c on " . "     i.interface_type=c.type and " . "     c.capkey='protocols' " . "left join interface_settings as s on " . "     s.node_id=i.node_id and s.iface=i.iface and " . "     s.capkey='channel' " . "where i.node_id='{$node_id}' and " . "      i.role='" . TBDB_IFACEROLE_EXPERIMENT . "'" . "order by iface");
         while ($row = mysql_fetch_array($query_result)) {
             $iface = $row["iface"];
             $type = $row["type"];
             $man = $row["manufacturer"];
             $model = $row["model"];
             $protocols = $row["capval"];
             $channel = $row["channel"];
             if (isset($channel)) {
                 $channel = " (channel {$channel})";
             } else {
                 $channel = "";
             }
             echo "<tr>\n                      <td>{$iface}:&nbsp; {$channel}</td>\n                      <td class=left>{$type} ({$man} {$model}; {$protocols})</td>\n                  </tr>\n";
         }
         #
         # Get subboss info.
         #
         echo "<tr>\n              <td align=center colspan=2>Subboss Info</td>\n            </tr>\n";
         echo "<tr><th>Service</th><th>Subboss Node ID</th>\n";
         $query_result = DBQueryFatal("select service,subboss_id from subbosses " . "where node_id ='{$node_id}' and disabled=0");
         while ($row = mysql_fetch_array($query_result)) {
             $service = $row["service"];
             $subboss = $row["subboss_id"];
             echo "<tr>\n                  <td>{$service}</td>\n                  <td class=left>{$subboss}</td>\n                 </tr>\n";
         }
         #
         # Switch info. Very useful for debugging.
         #
         if (!$noperm) {
             $query_result = DBQueryFatal("select i.*,w.* from interfaces as i " . "left join wires as w on i.node_id=w.node_id1 " . "   and i.card=w.card1 and i.port=w.port1 " . "where i.node_id='{$node_id}' and " . "      w.node_id1 is not null " . "order by iface");
             echo "<tr></tr><tr>\n                    <td align=center colspan=2>Switch Info</td>\n                  </tr>\n";
             echo "<tr><th>Iface:role &nbsp; card,port</th>\n                      <th>Switch &nbsp; card,port</th>\n";
             while ($row = mysql_fetch_array($query_result)) {
                 $iface = $row["iface"];
                 $role = $row["role"];
                 $card = $row["card1"];
                 $port = $row["port1"];
                 $switch = $row["node_id2"];
                 $switch_card = $row["card2"];
                 $switch_port = $row["port2"];
                 echo "<tr>\n                      <td>{$iface}:{$role} &nbsp; {$card},{$port}</td>\n                      <td class=left>" . "{$switch}: &nbsp; {$switch_card},{$switch_port}</td>\n                  </tr>\n";
             }
         }
     }
     #
     # Spit out node attributes
     #
     $query_result = DBQueryFatal("select attrkey,attrvalue from node_attributes " . "where node_id='{$node_id}' " . ($noperm ? "and attrkey!='root_password'" : ""));
     if (!$short && mysql_num_rows($query_result)) {
         echo "<tr>\n                    <td align=center colspan=2>Node Attributes</td>\n                  </tr>\n";
         echo "<tr><th>Attribute</th><th>Value</th>\n";
         while ($row = mysql_fetch_array($query_result)) {
             $attrkey = $row["attrkey"];
             $attrvalue = $row["attrvalue"];
             echo "<tr>\n                        <td>{$attrkey}</td>\n                        <td>{$attrvalue}</td>\n                      </td>\n";
         }
     }
     if (!($short || $noperm || $isvirtnode)) {
         $query_result = DBQueryFatal("select n.node_id,pid,eid,exptidx " . " from nodes as n " . "left join reserved as r on r.node_id=n.node_id " . "where n.phys_nodeid='{$node_id}' and " . "      n.node_id!=n.phys_nodeid");
         if (mysql_num_rows($query_result)) {
             echo "<tr>\n                       <td align=center colspan=2>Virtual/Sub Nodes</td>\n                      </tr>\n";
             echo "<tr><th>Node ID</th><th>Experiment</th>\n";
             while ($row = mysql_fetch_array($query_result)) {
                 $vnodeid = $row["node_id"];
                 $vpid = $row["pid"];
                 $veid = $row["eid"];
                 $vidx = $row["exptidx"];
                 $url1 = CreateURL("shownode", URLARG_NODEID, $vnodeid);
                 echo "<tr>\n                            <td><a href='{$url1}'>{$vnodeid}</a></td>\n";
                 if (isset($veid)) {
                     $url2 = CreateURL("showexp", URLARG_EID, $vidx);
                     echo "<td><a href='{$url2}'>{$vpid}/{$veid}</a></td>\n";
                 } else {
                     echo "<td>No Experiment</a></td>\n";
                 }
                 echo "</td>\n";
             }
         }
     }
     echo "</table>\n";
 }
コード例 #2
0
 function Show($showperms = 0)
 {
     global $TBBASE;
     $imageid = $this->imageid();
     $imagename = $this->imagename();
     $pid = $this->pid();
     $gid = $this->gid();
     $description = $this->description();
     $loadpart = $this->loadpart();
     $loadlength = $this->loadlength();
     $part1_osid = $this->part1_osid();
     $part2_osid = $this->part2_osid();
     $part3_osid = $this->part3_osid();
     $part4_osid = $this->part4_osid();
     $default_osid = $this->default_osid();
     $path = $this->path();
     $shared = $this->shared();
     $globalid = $this->isglobal();
     $creator = $this->creator();
     $creator_urn = $this->creator_urn();
     $created = $this->created();
     $updated = $this->updated();
     $updater = $this->updater();
     $updater_urn = $this->updater_urn();
     $uuid = $this->uuid();
     $mbr_version = $this->mbr_version();
     $hash = $this->hash();
     #
     # An imported image has a metadata_url, and at the moment I
     # do want to worry about exporting an imported image.
     #
     $imagefile_url = $this->imagefile_url();
     $metadata_url = $this->metadata_url();
     if (!$metadata_url) {
         $metadata_url = "{$TBBASE}/image_metadata.php?uuid={$uuid}";
     }
     if (!$description) {
         $description = "&nbsp;";
     }
     if (!$path) {
         $path = "&nbsp;";
     }
     if (!$created) {
         $created = "N/A";
     }
     #
     # Generate the table.
     #
     echo "<table align=center border=2 cellpadding=2 cellspacing=2>\n";
     echo "<tr>\n                <td>Image Name: </td>\n                <td class=\"left\">{$imagename}</td>\n              </tr>\n";
     echo "<tr>\n                <td>Description: </td>\n                <td class=left>\n";
     echo "{$description}";
     echo "   </td>\n \t      </tr>\n";
     echo "<tr>\n                <td>Project: </td>\n                <td class=\"left\">\n                  <a href='showproject.php3?pid={$pid}'>{$pid}</a></td>\n              </tr>\n";
     echo "<tr>\n                  <td>Group: </td>\n                  <td class=\"left\">\n                    <a href='showgroup.php3?pid={$pid}&gid={$gid}'>{$gid}</a></td>\n              </tr>\n";
     echo "<tr>\n                <td>Created: </td>\n                <td class=left>{$created}</td>\n \t      </tr>\n";
     echo "<tr>\n                <td>Creator: </td>\n                <td class=left>{$creator}</td>\n     \t      </tr>\n";
     if ($creator_urn) {
         echo "<tr>\n                    <td>Creator URN: </td>\n                    <td class=left>{$creator_urn}</td>\n         \t  </tr>\n";
     }
     if ($updated) {
         echo "<tr>\n                    <td>Updated: </td>\n                    <td class=left>{$updated}</td>\n     \t          </tr>\n";
         echo "<tr>\n                    <td>Updated By: </td>\n                    <td class=left>{$updater}</td>\n     \t          </tr>\n";
         if ($updater_urn) {
             echo "<tr>\n                        <td>Updater URN: </td>\n                        <td class=left>{$updater_urn}</td>\n         \t          </tr>\n";
         }
     }
     #
     # Find the last time this image was used.
     #
     $usage_result = DBQueryFatal("select FROM_UNIXTIME(stamp) as lastused " . "  from image_history " . "where action='os_setup' and imageid='{$imageid}' " . "order by stamp desc limit 1");
     if (mysql_num_rows($usage_result)) {
         $urow = mysql_fetch_array($usage_result);
         $lastused = $urow['lastused'];
         echo "<tr>\n                    <td>Last Used: </td>\n                    <td class=\"left\">{$lastused}</td>\n                  </tr>\n";
     }
     echo "<tr>\n                <td>Load Partition: </td>\n                <td class=\"left\">{$loadpart}</td>\n              </tr>\n";
     echo "<tr>\n                <td>Load Length: </td>\n                <td class=\"left\">{$loadlength}</td>\n              </tr>\n";
     if ($part1_osid) {
         echo "<tr>\n                     <td>Partition 1 OS: </td>\n                     <td class=\"left\">";
         SpitOSIDLink($part1_osid);
         echo "   </td>\n                  </tr>\n";
     }
     if ($part2_osid) {
         echo "<tr>\n                     <td>Partition 2 OS: </td>\n                     <td class=\"left\">";
         SpitOSIDLink($part2_osid);
         echo "   </td>\n                  </tr>\n";
     }
     if ($part3_osid) {
         echo "<tr>\n                     <td>Partition 3 OS: </td>\n                     <td class=\"left\">";
         SpitOSIDLink($part3_osid);
         echo "   </td>\n                  </tr>\n";
     }
     if ($part4_osid) {
         echo "<tr>\n                     <td>Partition 4 OS: </td>\n                     <td class=\"left\">";
         SpitOSIDLink($part4_osid);
         echo "   </td>\n                  </tr>\n";
     }
     if ($default_osid) {
         echo "<tr>\n                     <td>Boot OS: </td>\n                     <td class=\"left\">";
         SpitOSIDLink($default_osid);
         echo "   </td>\n                  </tr>\n";
     }
     echo "<tr>\n                <td>Filename: </td>\n                <td class=left>\n";
     echo "{$path}";
     echo "  </td>\n              </tr>\n";
     echo "<tr>\n                  <td>Types: </td>\n                  <td class=left>\n";
     echo "&nbsp;";
     foreach ($this->Types() as $type) {
         echo "{$type} &nbsp; ";
     }
     echo "  </td>\n              </tr>\n";
     echo "<tr>\n                <td>Shared?: </td>\n                <td class=left>\n";
     if ($shared) {
         echo "Yes";
     } else {
         echo "No";
     }
     echo "  </td>\n              </tr>\n";
     echo "<tr>\n                <td>Global?: </td>\n                <td class=left>\n";
     $globalflip = $globalid ? 0 : 1;
     $globalval = $globalid ? "Yes" : "No";
     echo "{$globalval} (<a href=toggle.php?imageid={$imageid}" . "&type=imageglobal&value={$globalflip}>Toggle</a>)";
     echo "  </td>\n              </tr>\n";
     echo "<tr>\n                <td>Internal ID: </td>\n                <td class=left>{$imageid}</td>\n              </tr>\n";
     echo "<tr>\n                <td>MBR Version: </td>\n                <td class=left>{$mbr_version}</td>\n              </tr>\n";
     # Until I change the schema.
     if ($mbr_version == 99) {
         echo "<tr>\n                    <td>XEN Package: </td>\n                    <td class=left>Yes</td>\n                  </tr>\n";
     }
     if ($this->ezid()) {
         $doesxen = 0;
         $osinfo = OSinfo::Lookup($imageid);
         if ($osinfo && $osinfo->def_parentosid()) {
             $parentosinfo = OSinfo::Lookup($osinfo->def_parentosid());
             if ($parentosinfo && $parentosinfo->FeatureSupported("xen-host")) {
                 $doesxen = 1;
             }
         }
         $xenval = $doesxen ? "Yes" : "No";
         $xenflip = $doesxen ? 0 : 1;
         echo "<tr>\n                  <td>XEN Capable?:</td>\n   \t          <td class=left>\n                     {$xenval} (<a href=toggle.php?imageid={$imageid}" . "&type=imagedoesxen&value={$xenflip}>Toggle</a>\n                      if you know this image can run\n               as a XEN guest. More info\n               <a target=_blank\n                  href='https://wiki.emulab.net/wiki/Emulab/wiki/xen'>here</a>)\n              </td>\n             </tr>\n";
     }
     if ($hash) {
         echo "<tr>\n                    <td>SHA1 Hash: </td>\n                    <td class=left>{$hash}</td>\n                  </tr>\n";
     }
     echo "<tr>\n                <td>UUID: </td>\n                <td class=left>{$uuid}</td>\n              </tr>\n";
     echo "<tr>\n                <td>Metadata URL: </td>\n                <td class=left><a href='{$metadata_url}'>https:// ...</a></td>\n              </tr>\n";
     if ($imagefile_url) {
         echo "<tr>\n                   <td>Image File URL: </td>\n                   <td class=left><a href='{$imagefile_url}'>https:// ...</a></td>\n                  </tr>\n";
     }
     #
     # Show who all can access this image outside the project.
     #
     if ($showperms) {
         $query_result = DBQueryFatal("select * from image_permissions " . "where imageid='{$imageid}' " . "order by permission_type,permission_id");
         if (mysql_num_rows($query_result)) {
             echo "<tr>\n                      <td align=center colspan=2>\n                      External permissions\n                      </td>\n                  </tr>\n";
             while ($row = mysql_fetch_array($query_result)) {
                 $perm_type = $row['permission_type'];
                 $perm_idx = $row['permission_idx'];
                 $writable = $row['allow_write'];
                 if ($writable) {
                     $writable = "(read/write)";
                 } else {
                     $writable = "(read only)";
                 }
                 if ($perm_type == "user") {
                     $user = User::Lookup($perm_idx);
                     if (isset($user)) {
                         $uid = $user->uid();
                         echo "<tr>\n                                    <td>User: </td>\n                                    <td class=left>{$uid} {$writable}</td>\n                                  </tr>\n";
                     }
                 } elseif ($perm_type == "group") {
                     $group = Group::Lookup($perm_idx);
                     if (isset($group)) {
                         $pid = $group->pid();
                         $gid = $group->gid();
                         echo "<tr>\n                                    <td>Group: </td>\n                                    <td class=left>{$pid}/{$gid} {$writable}</td>\n                                  </tr>\n";
                     }
                 }
             }
         }
     }
     echo "</table>\n";
 }