From: Thierry Parmentelat Date: Mon, 2 Feb 2009 17:51:54 +0000 (+0000) Subject: ckp X-Git-Tag: PLEWWW-4.3-1~64 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;ds=sidebyside;h=affa7b7ae6c08a5499398a6e11c3ca01708e93a4;p=plewww.git ckp --- diff --git a/modules/planetlab.module b/modules/planetlab.module index 5bb1355..be8293e 100644 --- a/modules/planetlab.module +++ b/modules/planetlab.module @@ -111,6 +111,17 @@ function planetlab_block($op = 'list', $delta = 0, $edit = array()) { $is_user = in_array(30,$plc->person['role_ids']); $is_tech = in_array(40,$plc->person['role_ids']); + //////////////////// Log out + if ($user->uid) { + // Drupal logout (destroys the session and cleans up $user) + // Thierry unclear when this triggers, I suspect this is obsolete + $items[] = leaf (l(t('Log out of %s', + array('%s' => variable_get('site_name', 'local'))), 'logout')); + } else { + // PlanetLab logout (just destroy the session) + $items[] = leaf ( href (l_logout(),'Log out')); + } + //////////////////// Sites $site_item = ''; $site_item .= href(l_sites(),"Sites"); @@ -179,19 +190,8 @@ function planetlab_block($op = 'list', $delta = 0, $edit = array()) { $doc_item .= ul_end(); $items[] = expanded($doc_item); - if ($user->uid) { - // Drupal logout (destroys the session and cleans up $user) - // Thierry unclear when this triggers, I suspect this is obsolete - $items[] = leaf (l(t('Log out of %s', - array('%s' => variable_get('site_name', 'local'))), 'logout')); - } else { - // PlanetLab logout (just destroy the session) - $items[] = leaf ( href (l_logout(),'Log out')); - } - //$block['content'] = theme('list_item', $items); $block['content'] = menu_theme($items); - // plc_debug("content",$block['content']); } /* diff --git a/planetlab/actions.php b/planetlab/actions.php index 1d7123b..564ada2 100644 --- a/planetlab/actions.php +++ b/planetlab/actions.php @@ -42,6 +42,8 @@ $known_actions []= "update-tag-type"; // expects: tag_type_id & name & description & category & min_role_id $known_actions []= "add-tag-type"; // expects: tag_type_id & name & description & category & min_role_id +$known_actions []= "delete-site"; +// expects: site_id $known_actions []= "expire-all-slices-in-site"; // expects: slice_ids @@ -229,6 +231,16 @@ switch ($action) { exit(); } + case 'delete-site': { + $site_id = intval($_POST['site_id']); + if ($api->DeleteSite($site_id) ==1) + drupal_set_message ("Site $site_id deleted"); + else + drupal_set_error("Failed to delete site $site_id"); + header ("location: " . l_sites()); + exit(); + } + case 'expire-all-slices-in-site': { drupal_set_message("action $action not implemented in actions.php -- need tweaks and test"); return; diff --git a/planetlab/css/plc_style.css b/planetlab/css/plc_style.css index 2d2a0e0..cc99aef 100644 --- a/planetlab/css/plc_style.css +++ b/planetlab/css/plc_style.css @@ -2,286 +2,27 @@ expanding links */ -.example {padding:10px; color:#000; background:#fcf7ff; width:80%; clear:left; margin:2em auto 3em auto; border:1px solid #69c} -a.expandlink {color:#00c} +.example { + padding:10px; + color:#000; + background:#fcf7ff; + width:80%; + clear:left; + margin:2em auto 3em auto; + border:1px solid #69c; +} +a.expandlink { + color:#00c +} a:active.expandlink, a:focus.expandlink, -a:hover.expandlink {color:#fff} - -/* -body styles -*/ -/* -body { - font-family: sans-serif; - } - -#container { - - } - -#topcontent { - position: relative; - width:100%; - height:30px; - } - -#loginbar { - padding:1px; - float:right; - font-size:14px; - border:2px solid #072F6F; - } - -#menu { - position: relative; - } - -#links { - top: 15px; - float:right; - } - -#boxcontainer { - margin-top:5px; - width:100%; - } - -#topbox { - width:100%; - height:49%; - top:50px; - } - -#topleftcontent { - float:left; - width:49%; - height:98%; - background:#fff; - padding:4px; - } - -#toprightcontent { - float:right; - width:49%; - height:98%; - background:#fff; - padding:4px; - } - -#bottombox { - margin-top:1%; - width: 100%; - height: 49%; - } - -#bottomleftcontent { - float: left; - width:49%; - height:98%; - background:#fff; - padding:4px; - } - -#bottomrightcontent { - float: right; - width:49%; - height:98%; - background:#fff; - padding:4px; - } - -#toprightcontent, #bottomrightcontent, #topleftcontent, #bottomleftcontent{ - border:2px solid #072F6F; - } -*/ -/* -form styles -*/ -/* -form { - border: 1px solid #072F6F; - padding: 5px; - } - -.textarea_input { - background-color: #ddd; - color: #072F6F; - font-size:12px; - } - -.select_input { - background-color: #ddd; - color: #072F6F; - font-size:12px; - } - -.text_input { - font-size: 10px; - background-color: #CCCCCC; - border: 1px solid #666666; - } - -.input { - font-size:10px; - color:#072F6F; - background-color: #ddd; - } -*/ -/* -autocomplete -*/ - -body -{ - position: relative; -} - -ul.autosuggest -{ - position: absolute; - list-style: none; - margin: 0; - padding: 0; - overflow-y: auto; -} - -ul.autosuggest li.autosuggest -{ - text-align: left; - border-bottom: 1px solid #ccc; - border-left: 1px solid #ccc; - border-right: 1px solid #ccc; +a:hover.expandlink { + color:#fff } -ul.autosuggest li.autosuggest a:link, -ul.autosuggest li.autosuggest a:visited -{ - display: block; - padding: 2px; - text-decoration: none; - background-color: #eee; -} - -ul.autosuggest li.autosuggest a:hover, -ul.autosuggest li.autosuggest a:active -{ - color: #fff; - background-color: #f30; -} - - -ul.autosuggest li.highlight a:link, -ul.autosuggest li.highlight a:visited -{ - color: #fff; - background-color: #f30; -} - - -/* -drop down -*/ -/* -#csstopmenu, #csstopmenu ul{ - padding: 0; - margin: 0; - list-style: none; -} - -#csstopmenu li{ - float: left; - position: relative; -} - -#csstopmenu a{ - text-decoration: none; -} - -.mainitems{ - border: 0px solid black; - border-left-width: 0; - width: 96px; - height: 16px; - padding-top: 7px; - background-repeat: no-repeat; -} - -.mainitems:hover{ - /*border-left-width: 1; - background-repeat: no-repeat; -} -/* -.headerlinks a{ - display:block; - padding:3px; - margin-right:2px; - font-size: 14px; - font-weight: bold; - text-align:center; - color: black; - background: #eee; - border:1px solid #072F6F; - -} - -.headerlinks a:hover{ - background: #ddd; -} - -.submenus{ - display: none; - width: 10em; - position: absolute; - - background-color: #E4E6EA; - border: 1px solid #072F6F; -} - -.submenus li{ - margin-top: 2px; - margin-bottom: 2px; - font-size:14px; - margin-left:10px; -} - -.submenus li a{ - display: block; - color: black; -} - -html>body .submenus li a{ /* non IE browsers - width: auto; -} - -.submenus li a:hover{ - background-color: #072F6F; - color: white; -} - -#csstopmenu li>ul {/* non IE browsers - top: auto; - left: auto; -} - -#csstopmenu li:hover ul, li.over ul { - display: block; -} - -html>body #clearmenu{ /* non IE browsers - height: 3px; +body { + position: relative; } -*/ -/* - * TODO: CSS for PlanetLab admin pages. - * Must remain compatible with Drupal standard CSS names. - * - * Reid Moran - * Mark Huang - * Copyright (C) 2006-2007 The Trustees of Princeton University - * - * $Id$ - */ h2.plc { text-align: center; @@ -289,11 +30,11 @@ h2.plc { .plc-foreign { - background: #d0d0d0; + background: #e0e0e0; } .plc-warning { - background: orange; + background: orange; } .plc-error { background: red; diff --git a/planetlab/css/plc_tables.css b/planetlab/css/plc_tables.css index 508b7ff..973ad97 100644 --- a/planetlab/css/plc_tables.css +++ b/planetlab/css/plc_tables.css @@ -5,11 +5,11 @@ table.plc_table { margin: 0 auto 1.5em auto; border-collapse:collapse; } -table.plc_table thead tr, table.plc_table tbody tr { +table.plc_table>thead>tr, table.plc_table>tbody>tr { border-left: 1px solid #C1DAD7; } /* remove border for search/pagesize area */ -table.plc_table thead tr.pagesize_area, table.plc_table thead tr.search_area { +table.plc_table>thead>tr.pagesize_area, table.plc_table>thead>tr.search_area { border-left: 0px; } @@ -218,19 +218,22 @@ tr.invisibleRow { p.paginationText { font-style:oblique; } -p.plc_filter_note { +p.plc_table_note { font-style:oblique; font-size:0.6em; font-family: georgia; - text-align: center + text-align: center; +} +span.plc_table_note_title { + font-weight:bold; + font-size:1.5em; + font-family: georgia; + text-align: center; } - +table.plc_table { border-bottom:1px solid #C1DAD7; } diff --git a/planetlab/events/index.php b/planetlab/events/index.php index 625ae3c..647b6b7 100644 --- a/planetlab/events/index.php +++ b/planetlab/events/index.php @@ -153,10 +153,6 @@ function parse_dates () { return array($from_date,$from_time,$until_date,$until_time); } -function my_is_int ($x) { - return (is_numeric($x) ? intval($x) == $x : false); -} - //////////////////////////////////////////////////////////// layout function truncate ($text,$numb,$etc = "...") { if (strlen($text) > $numb) { @@ -390,7 +386,7 @@ if ( ! plc_is_admin()) { // $message=sprintf('%s',$message,$message); $message=truncate($event['message'],40); - plc_table_row_start($event['event_id']); + plc_table_row_start(); plc_table_cell(e_event($event['event_id'])); plc_table_cell(date('M/d/Y H:i', $event['time'])); plc_table_cell($event['call_name']); diff --git a/planetlab/includes/plc_forms.php b/planetlab/includes/plc_forms.php index e67a2fd..ff86ec3 100644 --- a/planetlab/includes/plc_forms.php +++ b/planetlab/includes/plc_forms.php @@ -18,7 +18,6 @@ function plc_form_start ($full_url, $values, $options=array()) { if ( $url_values ) $values=array_merge($values,$url_values); $method = array_key_exists('method',$options) ? $options['method'] : 'POST'; print "
"; - // plc_debug('values',$values); if ($values) foreach ($values as $key=>$value) { print plc_form_hidden_text($key,$value); } diff --git a/planetlab/includes/plc_functions.php b/planetlab/includes/plc_functions.php index b23e86a..03a8756 100644 --- a/planetlab/includes/plc_functions.php +++ b/planetlab/includes/plc_functions.php @@ -5,6 +5,10 @@ // will trash this eventually require_once 'plc_functions_trash.php'; +// utility +function my_is_int ($x) { + return (is_numeric($x) ? intval($x) == $x : false); +} //////////////////////////////////////////////////////////// roles & other checks on global $plc function plc_is_admin () { global $plc; @@ -45,7 +49,7 @@ function href ($url,$text) { return "" . $text . ""; function l_actions () { return "/db/actions.php"; } function l_nodes () { return "/db/nodes/index.php"; } -function l_nodes_local () { return "/db/nodes/index.php?peerscope=local"; } +function l_nodes_peer ($peer_id) { return "/db/nodes/index.php?peerscope=$peer_id"; } function l_node ($node_id) { return "/db/nodes/node.php?id=$node_id"; } function l_node_t ($node_id,$text) { return href (l_node($node_id),$text); } function l_node_add () { return "/db/nodes/node_add.php"; } @@ -57,12 +61,13 @@ function l_interface_t ($interface_id,$text) { function l_interface_add($node_id) { return "/db/nodes/interfaces.php?node_id=$node_id"; } function l_sites () { return "/db/sites/index.php"; } -function l_sites_local () { return "/db/sites/index.php?peerscope=local"; } +function l_sites_peer ($peer_id) { return "/db/sites/index.php?peerscope=$peer_id"; } function l_site ($site_id) { return "/db/sites/index.php?id=$site_id"; } function l_site_t ($site_id,$text) { return href (l_site($site_id),$text); } function l_site_update($site_id) { return "/xxx-undefined"; } function l_slices () { return "/db/slices/index.php"; } +function l_slices_peer ($peer_id) { return "/db/slices/index.php?peerscope=$peer_id"; } function l_slice ($slice_id) { return "/db/slices/index.php?id=$slice_id"; } function l_slice_t ($slice_id,$text) { return href (l_slice($slice_id),$text); } function l_slice_add () { return "/db/slices/add_slice.php"; } @@ -75,6 +80,7 @@ function l_sliver_t ($node_id,$slice_id,$text) { return href (l_sliver($node_id,$slice_id),$text) ; } function l_persons () { return "/db/persons/index.php"; } +function l_persons_peer ($peer_id) { return "/db/persons/index.php?peerscope=$peer_id"; } function l_person ($person_id) { return "/db/persons/index.php?id=$person_id"; } function l_person_t ($person_id,$text) { return href (l_person($person_id),$text); } function l_persons_site ($site_id) { return "/db/persons/index.php?site_id=$site_id"; } @@ -94,6 +100,7 @@ function l_event ($type,$param,$id) { return "/db/events/index.php?type=$type&$p function l_peers() { return "/db/peers/index.php"; } function l_peer($peer_id) { return "/db/peers/index.php?id=$peer_id"; } +function l_peer_t($peer_id,$text) { return href(l_peer($peer_id),$text); } function l_comon($id_name,$id_value) { return "/db/nodes/comon.php?$id_name=$id_value"; } function l_sirius() { return "/db/sirius/index.php"; } @@ -207,7 +214,7 @@ function is_reserved_network_addr($network_addr) { return false; } -//////////////////////////////////////////////////////////// peer & peerscopes +//////////////////////////////////////////////////////////// roles function plc_role_global_hash ($api) { $hash=array(); $roles=$api->GetRoles(); @@ -217,88 +224,6 @@ function plc_role_global_hash ($api) { return $hash; } -//////////////////////////////////////////////////////////// peer & peerscopes -// when shortnames are needed on peers -function plc_peer_global_hash ($api) { - $peer_columns=array('peer_id','shortname'); - $peer_filter=array(); - $peers = $api->GetPeers($peer_filter,$peer_columns); - - $peer_hash=array(); - if ($peers) foreach ($peers as $peer) { - $peer_hash[$peer['peer_id']]=$peer; - } -} - -function plc_peer_shortname ($peer_hash,$peer_id) { - if ( ! $peer_id ) { - return PLC_SHORTNAME; - } else { - return $peer_hash[$node['peer_id']]['shortname']; - } -} - -function plc_peer_label ($peer) { - if (! $peer) { - return "Local object on " . PLC_NAME . " (" . PLC_SHORTNAME . ")"; - } - $result= $peer['peername'] . " (" . $peer['shortname'] . ")"; - $result= href(l_peer($peer['peer_id']),$result); - return plc_foreign_text($result); -} - -// to set the background to grey on foreign objects -// return true if the peer is local -function plc_peer_block_start ($peer_hash,$peer_id) { - if ( ! $peer_id ) { - print "
"; - return true; - } else { - // set two classes, one eneraic to all foreign, and one based on the peer's shortname for finer grain tuning - printf ('
\n"; -} - -// interpret standard syntax for peerscope -function plc_peer_info ($api,$peerscope) { - switch ($peerscope) { - case '': - $peer_filter=array(); - $peer_label="all peers"; - break; - case 'local': - $peer_filter=array("peer_id"=>NULL); - $peer_label=PLC_SHORTNAME; - break; - case 'foreign': - $peer_filter=array("~peer_id"=>NULL); - $peer_label="foreign peers"; - break; - default: - if (is_int ($peerscope)) { - $peer_id=intval($peerscope); - $peers=$api->GetPeers(array("peer_id"=>$peer_id)); - } else { - $peers=$api->GetPeers(array("shortname"=>$peerscope)); - } - if ($peers) { - $peer=$peers[0]; - $peer_id=$peer['peer_id']; - $peer_filter=array("peer_id"=>$peer_id); - $peer_label='peer "' . $peer['shortname'] . '"'; - } else { - $peer_filter=array(); - $peer_label="[no such peer " . $peerscope . "]"; - } - break; - } - return array ($peer_filter,$peer_label); -} //////////////////////////////////////////////////////////// nodegroups // hash by 'tagname=value' @@ -325,39 +250,7 @@ function tabs_node($node) { return array('Node ' . $node['hostname']=>l_node($no function tabs_site($site) { return array('Site ' . $site['name']=>l_site($site_id)); } function tabs_slice($slice) { return array('Slice ' . $slice['name']=>l_slice($slice_id)); } -//////////////////////////////////////////////////////////// presentation -// builds a table from an array of strings, with the given class -// attempt to normalize the delete buttons and confirmations -function plc_delete_button($width=15) { - return 'Delete this entry'; -} - -function plc_js_confirm($message) { - return "onclick=\"javascript:return confirm('Are you sure you want to delete " . $message . " ?')\""; -} - -function plc_delete_link($url,$delete_message,$visible) { - return "" . $visible . ""; -} - -function plc_delete_link_button($url,$delete_message,$width=15) { - return "" . plc_delete_button($width) . ""; -} - -function plc_event_button($type,$param,$id) { - return ' '; -} - -function plc_comon_button ($id_name, $id_value,$target="") { - $result=''; - $result.=' '; - return $result; -} - +//////////////////////////////////////////////////////////// html fragments function plc_vertical_table ($messages, $class="") { // pretty print the cell if ( empty( $messages) ) return ""; @@ -372,12 +265,6 @@ function plc_vertical_table ($messages, $class="") { return $formatted; } -//////////////////////////////////////////////////////////// various mappers -// could not figure how to use anonymous lambdas.. -function get_site_id ($site) { return $site['site_id'];} -function get_tagname ($tag) { return $tag['tagname'];} - -//////////////////////////////////////////////////////////// function plc_section ($text,$line=true) { if ($line) { print "
";} print "

$text

\n"; @@ -409,5 +296,44 @@ function plc_debug ($message,$object) { print ""; } +if (! function_exists ("drupal_set_error")) { + function drupal_set_error ($text) { + drupal_set_message ("$text"); + } + } + +//////////////////////////////////////////////////////////// sort out for obsolete / trash +// builds a table from an array of strings, with the given class +// attempt to normalize the delete buttons and confirmations +function plc_delete_button($width=15) { + return 'Delete this entry'; +} + +function plc_js_confirm($message) { + return "onclick=\"javascript:return confirm('Are you sure you want to delete " . $message . " ?')\""; +} + +function plc_delete_link($url,$delete_message,$visible) { + return "" . $visible . ""; +} + +function plc_delete_link_button($url,$delete_message,$width=15) { + return "" . plc_delete_button($width) . ""; +} + +function plc_event_button($type,$param,$id) { + return ' '; +} + +function plc_comon_button ($id_name, $id_value,$target="") { + $result=''; + $result.=' '; + return $result; +} + ?> diff --git a/planetlab/includes/plc_functions_trash.php b/planetlab/includes/plc_functions_trash.php index d277c5c..4ef99b5 100644 --- a/planetlab/includes/plc_functions_trash.php +++ b/planetlab/includes/plc_functions_trash.php @@ -188,41 +188,6 @@ function paginate_trash ( $fn_array, $table_id, $caption, $limit, $main_field, $ } - - -function plc_peers_option_list ($api) { - - // get list of peers - $peers=$api->GetPeers(NULL,array('peer_id','peername')); - if (count($peers)==0) { - $predef=array(array("peer_id"=>"","peername"=>"All (no known peers)")); - } else { - $predef=array(array("peer_id"=>"","peername"=>"All peers"), - array("peer_id"=>"local","peername"=>"Local only")); - // show a 'foreign' button only if that makes sense - if (count($peers) >= 2) { - $predef [] = array("peer_id"=>"foreign","peername"=>"Foreign peers"); - } - } - - $result=""; - foreach ($predef as $a) { - $peer_line = "\n"; - $result .= $peer_line; - } - - if (!empty($peers)) { - foreach ($peers as $a) { - $peer_line = "\n"; - $result .= $peer_line; - } - } - - return $result; -} - - - // function for getting the diff of multi dimention array function arr_diff( $a1, $a2 ) { $diff= array(); diff --git a/planetlab/includes/plc_peers.php b/planetlab/includes/plc_peers.php new file mode 100644 index 0000000..e63552e --- /dev/null +++ b/planetlab/includes/plc_peers.php @@ -0,0 +1,144 @@ + PLC_NAME, + 'shortname' => PLC_SHORTNAME, + 'peer_id'=>'local'); + $hash['local']=$local_fake_peer; + // remote + $peer_columns=array('peer_id','shortname','peername'); + $peer_filter=NULL; + $peers = $api->GetPeers($peer_filter,$peer_columns); + if ($peers) foreach ($peers as $peer) { + $hash[$peer['peer_id']]=$peer; + } + $this->hash=$hash; + } + + public static function is_local ($peer) { + return $peer['peer_id'] == 'local'; + } + + function peer ($peer_id) { + // use the fake local entry + if (!$peer_id) + $peer_id='local'; + return $this->hash[$peer_id]; + } + + public function peername ($peer_id) { + $peer = $this->peer ($peer_id); + return $peer['peername']; + } + + public function shortname ($peer_id) { + $peer = $this->peer ($peer_id); + return $peer['shortname']; + } + + public function label ($peer_id) { + $peer = $this->peer ($peer_id); + $result = $peer['peername'] . " (" . $peer['shortname'] . ")"; + if (Peers::is_local ($peer)) + $result = "[local] " . $result; + return $result; + } + + public function link ($peer_id,$text) { + if (! $peer_id) + return href("/",$text); + $peer = $this->peer ($peer_id); + return l_peer_t($peer['peer_id'],$text); + } + + public function peer_link ($peer_id) { + if (! $peer_id) + return href("/",$this->label($peer_id)); + $peer = $this->peer ($peer_id); + return l_peer_t($peer['peer_id'],$this->label($peer_id)); + } + + function classname ($peer_id) { + if ( ! $peer_id) + return ""; + $peer = $this->peer ($peer_id); + $shortname=$peer['shortname']; + return "plc-$shortname"; + } + + function block_start ($peer_id) { + // to set the background to grey on foreign objects + // return true if the peer is local + if ( ! $peer_id ) { + print "
"; + return true; + } else { + $classname=strtolower($this->classname($peer_id)); + // set two classes, one generic to all foreign, and one based on the peer's shortname for finer grain tuning + printf ("
",$classname); + return false; + } + } + + function block_end ($peer_id) { + print "
\n"; + } +} + +class PeerScope { + var $filter; + var $label; + + function PeerScope ($api, $peerscope) { + switch ($peerscope) { + case '': + $this->filter=array(); + $this->label="all peers"; + break; + case 'local': + $this->filter=array("peer_id"=>NULL); + $this->label=PLC_SHORTNAME; + break; + case 'foreign': + $this->filter=array("~peer_id"=>NULL); + $this->label="foreign peers"; + break; + default: + if (my_is_int ($peerscope)) { + $peer_id=intval($peerscope); + $peers=$api->GetPeers(array("peer_id"=>$peer_id)); + } else { + $peers=$api->GetPeers(array("shortname"=>$peerscope)); + } + if ($peers) { + $peer=$peers[0]; + $peer_id=$peer['peer_id']; + $this->filter=array("peer_id"=>$peer_id); + $this->label='peer "' . $peer['shortname'] . '"'; + } else { + $this->filter=array(); + $this->label="[no such peerscope " . $peerscope . "]"; + } + break; + } + } + + public function filter() { + return $this->filter; + } + public function label() { + return $this->label; + } +} + +?> diff --git a/planetlab/includes/plc_tables.php b/planetlab/includes/plc_tables.php index 5eb0726..02b591b 100644 --- a/planetlab/includes/plc_tables.php +++ b/planetlab/includes/plc_tables.php @@ -149,28 +149,29 @@ function plc_table_foot ($options) { //////////////////////////////////////// function plc_table_notes ($options) { - print <<< EOF -

-Notes: Enter & or | in the search area to alternate between AND and OR search modes -
-Hold down the shift key to select multiple columns to sort -EOF; - if (array_key_exists('notes',$options)) { - foreach ($options['notes'] as $line) { - print "
" . $line . "\n"; - } - } + $plc_table_default_notes = array( + "Enter & or | in the search area to alternate between AND and OR search modes", + "Hold down the shift key to select multiple columns to sort"); + + if (array_key_exists('notes',$options)) + $notes=$options['notes']; + else + $notes=array(); + $notes=array_merge($notes,$plc_table_default_notes); + print "

Notes\n"; + foreach ($notes as $note) + print "
$note\n"; print "

"; } //////////////////////////////////////// -function plc_table_row_start ($id="") { - if ( $id) { - printf ('',$id); - } else { - print ''; - } +function plc_table_row_start ($id=NULL,$class=NULL) { + print "\n"; } + function plc_table_row_end () { print "\n"; } diff --git a/planetlab/js/plc_tables.js b/planetlab/js/plc_tables.js index 9207def..90edc81 100644 --- a/planetlab/js/plc_tables.js +++ b/planetlab/js/plc_tables.js @@ -104,19 +104,25 @@ function plc_table_filter (table_id,pattern_id,and_id) { // remove whitespaces at the beginning and end pattern_text = pattern_text.replace(/[ \t]+$/,""); pattern_text = pattern_text.replace(/^[ \t]+/,""); + // normnalize to lowercase + pattern_text = pattern_text.toLowerCase(); if (pattern_text.indexOf ("&") != -1) { - pattern_text = pattern_text.replace(/&$/,"").replace(/&/," "); + pattern_text = pattern_text.replace(/&/," "); pattern_area.value=pattern_text; and_button.checked=true; return; } else if (pattern_text.indexOf ("|") != -1 ) { - pattern_text = pattern_text.replace(/\|$/,"").replace(/\|/," "); + pattern_text = pattern_text.replace(/\|/," "); pattern_area.value=pattern_text; and_button.checked=false; return; } + // var counter=0; + // window.console.log ("entering plc_table_filter " + table_id); + + var re_brackets = new RegExp ('<[^>]*>','g'); var patterns = pattern_text.split(" "); for (row_index = 0; row=rows[row_index]; row_index++) { @@ -130,9 +136,13 @@ function plc_table_filter (table_id,pattern_id,and_id) { visible=true; for (i in patterns) { var pattern_matched=false; - pattern=patterns[i]; + pattern=new RegExp(patterns[i],"i"); for (cell_index = 0; cell=cells[cell_index]; cell_index++) { - if ( cell.innerHTML.match(pattern)) { + var against=cell.innerHTML; + against=against.replace(re_brackets,''); + //counter++; + //window.console.log ("plc_table_filter is matching " + against + " against " + pattern); + if ( against.match(pattern)) { pattern_matched=true; // alert ('AND matched! p='+pattern+' c='+cell.innerHTML); break; @@ -146,7 +156,8 @@ function plc_table_filter (table_id,pattern_id,and_id) { for (cell_index = 0; cell=cells[cell_index]; cell_index++) { for (i in patterns) { pattern=patterns[i]; - if (cell.innerHTML.match(pattern)) { + //counter++; + if (cell.innerHTML.toLowerCase().match(pattern)) { visible=true; // alert ('OR matched! p='+pattern+' c='+cell.innerHTML); break; @@ -154,6 +165,7 @@ function plc_table_filter (table_id,pattern_id,and_id) { } } } + //window.console.log ("plc_table_filter has done " + counter + " matches"); plc_table_row_visible(row,visible); if (visible) matching_entries +=1; } diff --git a/planetlab/nodes/comon.php b/planetlab/nodes/comon.php index 3524eb9..2406c1c 100644 --- a/planetlab/nodes/comon.php +++ b/planetlab/nodes/comon.php @@ -93,8 +93,6 @@ foreach ($nns as $nn) { $local_ips[] = $nn['ip']; } -//plc_debug('locals',$local_ips); - // for foreign hosts we're left with dns resolving them $remote_ips=array(); foreach ($hostnames as $hostname) { @@ -106,15 +104,11 @@ foreach ($hostnames as $hostname) { } } -//plc_debug('remote ips',$remote_ips); - - // add both lists $all_ips=$local_ips+$remote_ips; // compute comon URL $url = plc_comon_url_from_ips("http://comon.cs.princeton.edu",$all_ips); -//plc_debug('url',$url); // redirect to comon header("Location: " . $url); diff --git a/planetlab/nodes/node.php b/planetlab/nodes/node.php index 0c15c8a..8bb3bfb 100644 --- a/planetlab/nodes/node.php +++ b/planetlab/nodes/node.php @@ -15,6 +15,7 @@ include 'plc_header.php'; // Common functions require_once 'plc_functions.php'; +require_once 'plc_peers.php'; require_once 'plc_minitabs.php'; require_once 'plc_tables.php'; require_once 'plc_details.php'; @@ -50,12 +51,9 @@ $interface_ids= $node['interface_ids']; $nodegroup_ids= $node['nodegroup_ids']; $pcu_ids= $node['pcu_ids']; -// get peer +// get peers $peer_id = $node['peer_id']; -if ($peer_id) { - $peers=$api->GetPeers(array($peer_id)); - $peer=$peers[0]; - } +$peers=new Peers ($api); // gets site info $sites= $api->GetSites( array( $site_id ) ); @@ -99,11 +97,6 @@ if( !empty( $pcu_ids ) ) //////////////////// display node info -// fetches peers and initialize hash peer_id->peer -$peer_hash = plc_peer_global_hash ($api); -// show gray background on foreign objects : start a
with proper class -$local_peer = plc_peer_block_start ($peer_hash,$peer_id); - drupal_set_title("Details for node " . $hostname); // extra privileges to admins, and (pi||tech) on this site @@ -137,15 +130,22 @@ $tabs["All nodes"]=l_nodes(); plc_tabs($tabs); +// show gray background on foreign objects : start a
with proper class +$local_peer = $peers->block_start ($peer_id); + plc_details_start (); +if ( ! $local_peer) { + plc_details_line("Peer",$peers->peer_link($peer_id)); + plc_details_space_line(); + } + plc_details_line("Hostname",$hostname); plc_details_line("Type",$node_type); plc_details_line("Model",$model); plc_details_line("Version",$version); -plc_details_line("Peer",plc_peer_label($peer)); - // no tool to implement this multiple-choice setting yet // xxx would need at least to use the proper class, like plc_details_class() or something +plc_details_space_line (); echo "Boot State: "; if ( ! $local_peer) { echo $boot_state; @@ -205,32 +205,33 @@ plc_details_end (); //////////////////////////////////////////////////////////// Tags // get tags -$tags=$api->GetNodeTags (array('node_id'=>$node_id)); -$tagnames = array_map ("get_tagname",$tags); -//plc_debug('tagnames',$tagnames); -$nodegroups_hash=plc_nodegroup_global_hash($api,$tagnames); -//plc_debug('hash',$nodegroups_hash); - -plc_section("Tags"); -$headers=array("Name"=>"string", - "Value"=>"string", - "Nodegroup"=>"string"); - -$table_options=array("notes_area"=>false,"pagesize_area"=>false,"search_width"=>10); -plc_table_start("node_tags",$headers,0,$table_options); -if ($tags) foreach ($tags as $tag) { - // does this match a nodegroup ? - $nodegroup_name="n/a"; - $nodegroup_key=$tag['tagname'] . "=" . $tag['value']; - $nodegroup=$nodegroups_hash[$nodegroup_key]; - if ($nodegroup) $nodegroup_name=l_nodegroup_t($nodegroup['nodegroup_id'],$nodegroup['groupname']); - plc_table_row_start(); - plc_table_cell($tag['tagname']); - plc_table_cell($tag['value']); - plc_table_cell($nodegroup_name); - plc_table_row_end(); -} -plc_table_end("node_tags"); +if ( $local_peer ) { + $tags=$api->GetNodeTags (array('node_id'=>$node_id)); + function get_tagname ($tag) { return $tag['tagname'];} + $tagnames = array_map ("get_tagname",$tags); + $nodegroups_hash=plc_nodegroup_global_hash($api,$tagnames); + + plc_section("Tags"); + $headers=array("Name"=>"string", + "Value"=>"string", + "Nodegroup"=>"string"); + + $table_options=array("notes_area"=>false,"pagesize_area"=>false,"search_width"=>10); + plc_table_start("node_tags",$headers,0,$table_options); + if ($tags) foreach ($tags as $tag) { + // does this match a nodegroup ? + $nodegroup_name="n/a"; + $nodegroup_key=$tag['tagname'] . "=" . $tag['value']; + $nodegroup=$nodegroups_hash[$nodegroup_key]; + if ($nodegroup) $nodegroup_name=l_nodegroup_t($nodegroup['nodegroup_id'],$nodegroup['groupname']); + plc_table_row_start(); + plc_table_cell($tag['tagname']); + plc_table_cell($tag['value']); + plc_table_cell($nodegroup_name); + plc_table_row_end(); + } + plc_table_end("node_tags"); + } //////////////////////////////////////////////////////////// slices // display slices @@ -252,8 +253,8 @@ if ( ! $slices ) { plc_table_start ("node_slices",$headers,1,$table_options); foreach ($slices as $slice) { - plc_table_row_start($slice['name']); - plc_table_cell (plc_peer_shortname($peer_hash,$slice['peer_id'])); + plc_table_row_start(); + plc_table_cell ($peers->shortname($peer_id)); plc_table_cell (l_slice_t ($slice['slice_id'],$slice['name'])); plc_table_cell (l_sliver_t ($node_id,$slice['slice_id'],'view')); plc_table_row_end(); @@ -300,7 +301,7 @@ if ( $local_peer ) { $interface_type= $interface['type']; $interface_method= $interface['method']; - plc_table_row_start($interface['ip']); + plc_table_row_start(); if ( $privileges ) { if (!$interface_primary) { // xxx @@ -326,7 +327,7 @@ if ( $local_peer ) { } //////////////////////////////////////////////////////////// -plc_peer_block_end(); +$peers->block_end($peer_id); // Print footer diff --git a/planetlab/nodes/nodes.php b/planetlab/nodes/nodes.php index 13e61c2..7916444 100644 --- a/planetlab/nodes/nodes.php +++ b/planetlab/nodes/nodes.php @@ -15,6 +15,7 @@ include 'plc_header.php'; // Common functions require_once 'plc_functions.php'; +require_once 'plc_peers.php'; require_once 'plc_minitabs.php'; require_once 'plc_tables.php'; @@ -63,8 +64,9 @@ if ($pattern) { } // server-side selection on peerscope -list ( $peer_filter, $peer_label) = plc_peer_info($api,$_GET['peerscope']); -$node_filter=array_merge($node_filter,$peer_filter); +$peerscope=new PeerScope($api,$_GET['peerscope']); +$node_filter=array_merge($node_filter,$peerscope->filter()); +$title .= ' - ' . $peerscope->label(); if ($site_id) { $sites=$api->GetSites(array($site_id),array("name","login_base")); @@ -135,7 +137,7 @@ $headers = array ("Peer"=>"string", # initial sort on hostnames plc_table_start("nodes",$headers,4); -$peer_hash = plc_peer_global_hash ($api); +$peers = new Peers ($api); // write rows foreach ($nodes as $node) { $hostname=$node['hostname']; @@ -146,11 +148,12 @@ foreach ($nodes as $node) { $node_id=$node['node_id']; $ip=$interface_hash[$node['node_id']]['ip']; $interface_id=$interface_hash[$node['node_id']]['interface_id']; - $shortname = plc_peer_shortname ($peer_hash,$node['peer_id']); + $peer_id=$node['peer_id']; + $shortname = $peers->shortname($peer_id); $node_type = $node['node_type']; - plc_table_row_start($hostname); - plc_table_cell ($shortname); + plc_table_row_start(); + plc_table_cell ($peers->link($peer_id,$shortname)); plc_table_cell (topdomain($hostname)); plc_table_cell (l_site_t($site_id,$login_base)); plc_table_cell ($node['boot_state']); diff --git a/planetlab/peers/peer.php b/planetlab/peers/peer.php index 7deca56..d21c051 100644 --- a/planetlab/peers/peer.php +++ b/planetlab/peers/peer.php @@ -36,6 +36,7 @@ if ( ! $peer_id ) { plc_error('Malformed URL - id not set'); return; } // make the api call to pull that peers DATA $peers= $api->GetPeers( array( $peer_id ) ); $peer = $peers[0]; +$peer_id=$peer['peer_id']; drupal_set_title("Details for Peer " . $peername); @@ -45,10 +46,14 @@ plc_details_line("Short name",$peer['shortname']); plc_details_line("Hierarchical name",$peer['hrn_root']); plc_details_line("API URL",$peer['peer_url']); -plc_details_line("Number of sites",sizeof($peer['site_ids'])); -plc_details_line("Number of nodes",sizeof($peer['node_ids'])); -plc_details_line("Number of persons",sizeof($peer['person_ids'])); -plc_details_line("Number of slices",sizeof($peer['slice_ids'])); +$nb=sizeof($peer['site_ids']); +plc_details_line("Number of sites",href(l_sites_peer($peer_id),"$nb sites")); +$nb=sizeof($peer['node_ids']); +plc_details_line("Number of nodes",href(l_nodes_peer($peer_id),"$nb nodes")); +$nb=sizeof($peer['person_ids']); +plc_details_line("Number of users",href(l_persons_peer($peer_id),"$nb users")); +$nb=sizeof($peer['slice_ids']); +plc_details_line("Number of slices",href(l_slices_peer($peer_id),"$nb slices")); plc_details_end(); // Print footer diff --git a/planetlab/persons/person.php b/planetlab/persons/person.php index 74dd797..11bcd15 100644 --- a/planetlab/persons/person.php +++ b/planetlab/persons/person.php @@ -15,6 +15,7 @@ include 'plc_header.php'; // Common functions require_once 'plc_functions.php'; +require_once 'plc_peers.php'; require_once 'plc_minitabs.php'; require_once 'plc_tables.php'; require_once 'plc_details.php'; @@ -64,13 +65,9 @@ $keys= $api->GetKeys( $key_ids ); drupal_set_title("Details for account " . $first_name . " " . $last_name); -$plc_hash=plc_peer_global_hash($api); -if ($peer_id) { - $peers=$api->GetPeers(array($peer_id)); - $peer=$peers[0]; -} +$peers = new Peers ($api); -$local_peer = plc_peer_block_start ($peer_hash,$peer_id); +$local_peer = $peers->block_start ($peer_id); $is_my_account = plc_my_person_id() == $person_id; $privileges = plc_is_admin () || ( plc_in_site($site_id) && plc_is_pi()); @@ -144,7 +141,7 @@ plc_details_line("URL",$url); plc_details_line("Phone",$phone); plc_details_line("Title",$title); plc_details_line("Bio",wordwrap($bio,50,"
")); -plc_details_line("Peer",plc_peer_label($peer)); +plc_details_line("Peer",$peers->peer_link($peer_id)); plc_details_end(); //////////////////// slices @@ -173,11 +170,8 @@ if( ! $slices) { } // we don't set 'action', but use the submit button name instead -plc_form_start(l_actions(), - array("person_id"=>$person_id, - // uncomment this to run the 'debug' action - //"action"=>"debug", - )); +plc_form_start(l_actions(), + array("person_id"=>$person_id,)); //////////////////// keys plc_section ("Keys"); @@ -197,7 +191,7 @@ plc_table_start("person_keys",$headers,"1",$table_options); if ($keys) foreach ($keys as $key) { $key_id=$key['key_id']; - plc_table_row_start($key_id); + plc_table_row_start(); plc_table_cell ($key['key_type']); plc_table_cell(wordwrap( $key['key'], 60, "
\n", 1 )); if ($can_manage_keys) @@ -256,6 +250,7 @@ if ($can_manage_sites) { // add a site : the button $add_site_right_area=plc_form_submit_text("add-person-to-site","Add in site"); // get list of local sites that the person is not in + function get_site_id ($site) { return $site['site_id'];} $person_site_ids=array_map("get_site_id",$sites); $relevant_sites= $api->GetSites( array("peer_id"=>NULL,"~site_id"=>$person_site_ids), $site_columns); @@ -324,7 +319,7 @@ plc_table_end("person_roles",array("footers"=>$footers)); ////////////////////////////// plc_form_end(); -plc_peer_block_end(); +$peers->block_end($peer_id); // Print footer include 'plc_footer.php'; diff --git a/planetlab/persons/persons.php b/planetlab/persons/persons.php index f5ac603..e4f5a39 100644 --- a/planetlab/persons/persons.php +++ b/planetlab/persons/persons.php @@ -15,6 +15,7 @@ include 'plc_header.php'; // Common functions require_once 'plc_functions.php'; +require_once 'plc_peers.php'; require_once 'plc_minitabs.php'; require_once 'plc_tables.php'; @@ -79,8 +80,9 @@ if ($pattern) { } // server-side selection on peerscope -list ( $peer_filter, $peer_label) = plc_peer_info($api,$_GET['peerscope']); -$person_filter=array_merge($person_filter,$peer_filter); +$peerscope=new PeerScope ($api,$_GET['peerscope']); +$person_filter=array_merge($person_filter,$peerscope->filter()); +$title .= ' - ' . $peerscope->label(); if ($site_id) { $sites=$api->GetSites(array($site_id),array("name","login_base","person_ids")); @@ -138,25 +140,26 @@ $headers = array ("Peer"=>"string", "Last"=>"string", "Email"=>"string", "Site" => "string", + "S" => "int", "Status"=>"string", ); // initial sort on email plc_table_start("persons",$headers,4); -$peer_hash = plc_peer_global_hash ($api); +$peers=new Peers ($api); // write rows foreach ($persons as $person) { $person_id=$person['person_id']; $email=$person['email']; - $shortname = plc_peer_shortname ($peer_hash,$person['peer_id']); + $shortname = $peers->shortname($person['peer_id']); $site_id=$person['site_ids'][0]; $site=$site_hash[$site_id]; $login_base = $site['login_base']; $roles = plc_vertical_table ($person['roles']); - plc_table_row_start($email); + plc_table_row_start(); plc_table_cell($shortname); plc_table_cell($roles); @@ -164,12 +167,13 @@ foreach ($persons as $person) { plc_table_cell ($person['last_name']); plc_table_cell(l_person_t($person_id,$email)); plc_table_cell($login_base); + plc_table_cell(count($person['slice_ids'])); plc_table_cell(person_status($person)); plc_table_row_end(); } - -plc_table_end("persons"); +$notes=array("The S column shows the number of slices for the given user"); +plc_table_end("persons",array('notes'=>$notes)); // Print footer include 'plc_footer.php'; diff --git a/planetlab/sites/site.php b/planetlab/sites/site.php index cdce78e..67a6783 100644 --- a/planetlab/sites/site.php +++ b/planetlab/sites/site.php @@ -15,6 +15,7 @@ include 'plc_header.php'; // Common functions require_once 'plc_functions.php'; +require_once 'plc_peers.php'; require_once 'plc_minitabs.php'; require_once 'plc_tables.php'; require_once 'plc_details.php'; @@ -36,8 +37,8 @@ if (empty($sites)) { $site=$sites[0]; // var names to api return -$sitename= $site['name']; -$abbrev_name= $site['abbreviated_name']; +$sitename= htmlentities($site['name']); +$abbrev_name= htmlentities($site['abbreviated_name']); $site_url= $site['url']; $login_base= $site['login_base']; $site_lat= $site['latitude']; @@ -47,12 +48,12 @@ $max_slices= $site['max_slices']; $enabled = $site['enabled']; +// extra privileges to admins, and (pi||tech) on this site +$privileges = plc_is_admin () || ( plc_in_site($site_id) && ( plc_is_pi() || plc_is_tech())); + // get peer details $peer_id= $site['peer_id']; -if ($peer_id) { - $peers=$api->GetPeers(array("peer_id"=>$peer_id)); - $peer=$peers[0]; - } +$peers = new Peers ($api); $adress_ids= $site['address_ids']; $pcu_ids= $site['pcu_ids']; @@ -65,7 +66,8 @@ $api->begin(); $api->GetAddresses( $adress_ids ); // gets pcu info -$api->GetPCUs( $pcu_ids ); +// GetPCUs is not accessible to the 'user' role +//$api->GetPCUs( $pcu_ids ); // gets node info $api->GetNodes( $node_ids, array( "node_id", "hostname", "boot_state" ) ); @@ -75,7 +77,8 @@ $api->GetPersons( $person_ids, array( "role_ids", "person_id", "first_name", "la $api->GetSlices ( $slice_ids, array ("slice_id", "name", "instantiation" ) ); -list( $addresses, $pcus, $nodes, $persons, $slices )= $api->commit(); +//list( $addresses, $pcus, $nodes, $persons, $slices )= $api->commit(); +list( $addresses, $nodes, $persons, $slices )= $api->commit(); $techs = array(); $pis = array(); @@ -90,10 +93,6 @@ foreach( $persons as $person ) { } // fetches peers and initialize hash peer_id->peer -$peer_hash = plc_peer_global_hash ($api); -// show gray background on foreign objects : start a
with proper class -plc_peer_block_start ($peer_hash,$peer_id); - drupal_set_title("Details for site " . $sitename); // extra privileges to admins, and pi on this site @@ -107,12 +106,14 @@ if ( ! $peer_id && $privileges ) { 'bubble'=>"Update details of $sitename"); // not avail to PI $tabs['Expire slices'] = array('url'=>l_actions(), + 'method'=>'POST', 'values'=>array('site_id'=>$site_id, 'action'=>'expire-all-slices-in-site'), 'bubble'=>"Expire all slices and prevent creation of new slices", 'confirm'=>"Suspend all slices in $login_base"); if (plc_is_admin()) $tabs['Delete']=array('url'=>l_actions(), + 'method'=>'POST', 'values'=>array('site_id'=>$site_id, 'action'=>'delete-site'), 'bubble'=>"Delete site $sitename", @@ -133,6 +134,9 @@ $tabs["All sites"]=l_sites(); plc_tabs($tabs); +// show gray background on foreign objects : start a
with proper class +$peers->block_start ($peer_id); + if ( ! $enabled ) plc_warning ("This site is not enabled - Please visit " . href (l_sites_pending(),"this page") . @@ -145,7 +149,7 @@ plc_details_line("Abbreviated name",$abbrev_name); plc_details_line("URL",$site_url); plc_details_line("Latitude",$site_lat); plc_details_line("Longitude",$site_long); -plc_details_line("Peer",plc_peer_label($peer)); +plc_details_line("Peer",$peers->peer_link($peer_id)); if ( ! $peer_id ) { @@ -155,13 +159,13 @@ if ( ! $peer_id ) { plc_details_line("Addresses",""); foreach ($addresses as $address) { plc_details_line(plc_vertical_table($address['address_types']), - plc_vertical_table($address['line1'], - $address['line2'], - $address['line3'], - $address['city'], - $address['state'], - $address['postalcode'], - $address['country'])); + plc_vertical_table(array($address['line1'], + $address['line2'], + $address['line3'], + $address['city'], + $address['state'], + $address['postalcode'], + $address['country']))); } } @@ -206,7 +210,7 @@ if ( ! $peer_id ) { plc_details_end(); //////////////////////////////////////// -plc_peer_block_end(); +$peers->block_end($peer_id); // Print footer include 'plc_footer.php'; diff --git a/planetlab/sites/sites.php b/planetlab/sites/sites.php index 81ba30c..9a84876 100644 --- a/planetlab/sites/sites.php +++ b/planetlab/sites/sites.php @@ -15,6 +15,7 @@ include 'plc_header.php'; // Common functions require_once 'plc_functions.php'; +require_once 'plc_peers.php'; require_once 'plc_minitabs.php'; require_once 'plc_tables.php'; @@ -80,8 +81,9 @@ if ($pattern) { } // server-side selection on peerscope -list ( $peer_filter, $peer_label) = plc_peer_info($api,$_GET['peerscope']); -$site_filter=array_merge($site_filter,$peer_filter); +$peerscope = new PeerScope ($api,$peerscope); +$site_filter=array_merge($site_filter,$peerscope->filter()); +$title .= ' - ' . $peerscope->label(); if (! plc_is_admin()) { $site_columns = array("site_id", "name", "abbreviated_name", "login_base" , "peer_id" ); @@ -92,7 +94,7 @@ if (! plc_is_admin()) { } $tabs['My site'] = array('url'=>l_site(plc_my_site_id())); -$tabs['Local sites'] = array('url'=>l_sites_local()); +$tabs['Local sites'] = array('url'=>l_sites_peer('local')); if (plc_is_admin()) $tabs['Pending'] = array ('url'=>l_sites_pending(), 'bubble'=>'Review pending join requests'); @@ -103,7 +105,7 @@ plc_tabs($tabs); // go $sites= $api->GetSites( $site_filter , $site_columns); -$peer_hash = plc_peer_global_hash ($api); +$peers=new Peers($api); $headers['Peer']="string"; $headers['Full Name']="string"; @@ -117,9 +119,10 @@ if (plc_is_admin()) { } plc_table_start("sites",$headers,2); + if ($sites) foreach ($sites as $site) { - $shortname = plc_peer_shortname ($peer_hash,$site['peer_id']); - plc_table_row_start($site['login_base']); + $shortname = $peers->shortname($site['peer_id']); + plc_table_row_start(); plc_table_cell($shortname); plc_table_cell (l_site_t($site['site_id'],$site['name'])); plc_table_cell ($site['login_base']); @@ -132,7 +135,9 @@ if ($sites) foreach ($sites as $site) { } plc_table_row_end(); } -plc_table_end("sites"); +$notes=array("N = number of sites / U = number of users / S = number of slices"); + +plc_table_end("sites",array('notes'=>$notes)); // Print footer include 'plc_footer.php';