From 0777db4df3d599ed06170e1b36ae1b5838686ab0 Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Mon, 19 Jan 2009 12:38:44 +0000 Subject: [PATCH] checkpoint --- planetlab/includes/plc_functions.php | 73 +++- planetlab/includes/plc_minitabs.php | 4 +- planetlab/includes/plc_session.php | 1 - planetlab/includes/plc_tables.php | 15 + planetlab/nodes/all_hosts.php | 5 - planetlab/nodes/all_ips.php | 5 - planetlab/nodes/alpha_hosts.php | 5 - planetlab/nodes/alpha_ips.php | 5 - planetlab/nodes/beta_hosts.php | 5 - planetlab/nodes/beta_ips.php | 5 - planetlab/nodes/etc_hosts.php | 5 - planetlab/nodes/node.php | 324 ++++++++++++++++++ planetlab/nodes/{newindex.php => nodes.php} | 36 +- planetlab/nodes/production_hosts.php | 5 - planetlab/nodes/production_ips.php | 5 - planetlab/{slices/tags.php => tags/index.php} | 0 .../node_groups.php => tags/nodegroups.php} | 0 planetlab/{slices => tags}/tag_action.php | 0 18 files changed, 420 insertions(+), 78 deletions(-) delete mode 100644 planetlab/nodes/all_hosts.php delete mode 100644 planetlab/nodes/all_ips.php delete mode 100644 planetlab/nodes/alpha_hosts.php delete mode 100644 planetlab/nodes/alpha_ips.php delete mode 100644 planetlab/nodes/beta_hosts.php delete mode 100644 planetlab/nodes/beta_ips.php delete mode 100644 planetlab/nodes/etc_hosts.php create mode 100644 planetlab/nodes/node.php rename planetlab/nodes/{newindex.php => nodes.php} (87%) delete mode 100644 planetlab/nodes/production_hosts.php delete mode 100644 planetlab/nodes/production_ips.php rename planetlab/{slices/tags.php => tags/index.php} (100%) rename planetlab/{nodes/node_groups.php => tags/nodegroups.php} (100%) rename planetlab/{slices => tags}/tag_action.php (100%) diff --git a/planetlab/includes/plc_functions.php b/planetlab/includes/plc_functions.php index a0f3e59..2dde891 100644 --- a/planetlab/includes/plc_functions.php +++ b/planetlab/includes/plc_functions.php @@ -86,7 +86,60 @@ function is_reserved_network_addr($network_addr) { return false; } -//////////////////////////////////////////////////////////// peerscopes +//////////////////////////////////////////////////////////// roles & other checks on global $plc +function plc_is_admin () { + global $plc; + return in_array( 10, $plc->person['role_ids']); +} +function plc_is_pi () { + global $plc; + return in_array( 20, $plc->person['role_ids']); +} +function plc_is_tech () { + global $plc; + return in_array( 40, $plc->person['role_ids']); +} +function plc_in_site ($site_id) { + global $plc; + return in_array( $site_id, $plc->person['site_ids']); +} + +//////////////////////////////////////////////////////////// peer & peerscopes +// when shortnames are needed on peers +function plc_peer_get_hash ($api) { + $peer_columns=array('peer_id','shortname'); + $peer_filter=array(); + $peers = $api->GetPeers($peer_filter,$peer_columns); + + $peer_hash=array(); + 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']; + } +} + +// to set the background to grey on foreign objects +function plc_peer_block_start ($peer_hash,$peer_id) { + if ( ! $peer_id ) { + print "
"; + } else { + // set two classes, one eneraic to all foreign, and one based on the peer's shortname for finer grain tuning + printf ('
\n"; +} + +//// standard peerscope syntax function plc_peer_info ($api,$peerscope) { switch ($_GET['peerscope']) { case '': @@ -119,26 +172,32 @@ function l_node_u ($node_id) { return "/db/nodes/node.php?id=" . $node_id; } function l_node ($node_id) { return href (l_node_u($node_id),$node_id); } function l_node2 ($node_id,$text) { return href (l_node_u($node_id),$text); } +function l_interface_u ($interface_id) { return "/db/nodes/interfaces.php?id=" . $interface_id; } +function l_interface_add_u($node_id) { return "/db/nodes/interfaces.php?node_id=" . $node_id; } +function l_interface ($interface_id) { return href (l_interface_u($interface_id),$interface_id); } +function l_interface2 ($interface_id,$text) { return href (l_interface_u($interface_id),$text); } + +function l_nodegroup_u ($nodegroup_id) { return "/db/nodes/node_groups.php?id=" . $nodegroup_id; } +function l_nodegroup2 ($nodegroup_id,$text) { return href(l_nodegroup_u($nodegroup_id),$text); } + function l_sites () { return "/db/sites/index.php"; } function l_site_u ($site_id) { return "/db/persons/index.php?id=" . $site_id; } function l_site ($site_id) { return href (l_site_u($site_id),$site_id); } function l_site2 ($site_id,$text) { return href (l_site_u($site_id),$text); } function l_slices () { return "/db/slices/index.php"; } -function l_slice_u ($slice_id) { return "/db/persons/index.php?id=" . $slice_id; } +function l_slice_u ($slice_id) { return "/db/slices/index.php?id=" . $slice_id; } function l_slice ($slice_id) { return href (l_slice_u($slice_id),$slice_id); } function l_slice2 ($slice_id,$text) { return href (l_slice_u($slice_id),$text); } +function l_sliver_u ($node_id,$slice_id) { return "/db/nodes/slivers.php?node_id=" . $node_id. "&slice_id=" . $slice_id; } +function l_sliver3 ($node_id,$slice_id,$text) { return href (l_sliver_u($node_id,$slice_id),$text) ; } + function l_persons () { return "/db/persons/index.php"; } function l_person_u ($person_id) { return "/db/persons/index.php?id=" . $person_id; } function l_person ($person_id) { return href (l_person_u($person_id),$person_id); } function l_person2 ($person_id,$text) { return href (l_person_u($person_id),$text); } -function l_interfaces () { return "/db/interfaces/index.php"; } -function l_interface_u ($interface_id) { return "/db/interfaces/index.php?id=" . $interface_id; } -function l_interface ($interface_id) { return href (l_interface_u($interface_id),$interface_id); } -function l_interface2 ($interface_id,$text) { return href (l_interface_u($interface_id),$text); } - function l_event ($type,$param,$id) { return '/db/events/index.php?type=' . $type . '&' . $param . '=' . $id; } function l_comon($id_name,$id_value) { return '/db/nodes/comon.php?' . $id_name . "=" . $id_value; } diff --git a/planetlab/includes/plc_minitabs.php b/planetlab/includes/plc_minitabs.php index 2df465f..00cb870 100644 --- a/planetlab/includes/plc_minitabs.php +++ b/planetlab/includes/plc_minitabs.php @@ -10,8 +10,10 @@ drupal_set_html_head(' function plc_tabs($array) { print '
'; print '
    '; + print "\n"; foreach ($array as $name=>$url) { - print "
  • " . $name . "
  • \n"; + printf ('
  • %s
  • ',$url,$name); + print "\n"; } print '
'; print '
'; diff --git a/planetlab/includes/plc_session.php b/planetlab/includes/plc_session.php index afd008b..c0f9656 100644 --- a/planetlab/includes/plc_session.php +++ b/planetlab/includes/plc_session.php @@ -8,7 +8,6 @@ // To use, include this file and declare the global variable // $plc. This object contains the following members: // -// admin: Admin API handle. Use cautiously. // person: If logged in, the user's GetPersons() details // api: If logged in, the user's API handle // diff --git a/planetlab/includes/plc_tables.php b/planetlab/includes/plc_tables.php index 7bdcf51..7deb794 100644 --- a/planetlab/includes/plc_tables.php +++ b/planetlab/includes/plc_tables.php @@ -126,6 +126,21 @@ Hold down the shift key to select multiple columns to sort EOF; } +//////////////////////////////////////// +function plc_table_title ($text) { + print "

$text

\n"; +} + +function plc_table_row_start ($id="") { + if ( $id) { + printf ('',$id); + } else { + print ''; + } +} +function plc_table_row_end () { + print "\n"; +} ?> diff --git a/planetlab/nodes/all_hosts.php b/planetlab/nodes/all_hosts.php deleted file mode 100644 index a838f14..0000000 --- a/planetlab/nodes/all_hosts.php +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/planetlab/nodes/all_ips.php b/planetlab/nodes/all_ips.php deleted file mode 100644 index eeb5d7d..0000000 --- a/planetlab/nodes/all_ips.php +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/planetlab/nodes/alpha_hosts.php b/planetlab/nodes/alpha_hosts.php deleted file mode 100644 index ee0f2eb..0000000 --- a/planetlab/nodes/alpha_hosts.php +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/planetlab/nodes/alpha_ips.php b/planetlab/nodes/alpha_ips.php deleted file mode 100644 index c8e5b7f..0000000 --- a/planetlab/nodes/alpha_ips.php +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/planetlab/nodes/beta_hosts.php b/planetlab/nodes/beta_hosts.php deleted file mode 100644 index 6637731..0000000 --- a/planetlab/nodes/beta_hosts.php +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/planetlab/nodes/beta_ips.php b/planetlab/nodes/beta_ips.php deleted file mode 100644 index 081ce1a..0000000 --- a/planetlab/nodes/beta_ips.php +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/planetlab/nodes/etc_hosts.php b/planetlab/nodes/etc_hosts.php deleted file mode 100644 index c3ee907..0000000 --- a/planetlab/nodes/etc_hosts.php +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/planetlab/nodes/node.php b/planetlab/nodes/node.php new file mode 100644 index 0000000..78b3059 --- /dev/null +++ b/planetlab/nodes/node.php @@ -0,0 +1,324 @@ +person; +$_roles= $_person['role_ids']; + +// -------------------- +// recognized URL arguments +$node_id=intval($_GET['id']); +if ( ! $node_id ) { plc_error('Malformed URL - id not set'); return; } + +//////////////////// +// Get all columns as we focus on only one entry +$nodes= $api->GetNodes( array($node_id)); + +if (empty($nodes)) { + drupal_set_message ("Node " . $node_id . " not found"); + } else { + $node=$nodes[0]; + // node info + $hostname= $node['hostname']; + $boot_state= $node['boot_state']; + $site_id= $node['site_id']; + $model= $node['model']; + $version= $node['version']; + $node_type = $node['node_type']; + + // arrays of ids of node info + $slice_ids= $node['slice_ids']; + $conf_file_ids= $node['conf_file_ids']; + $interface_ids= $node['interface_ids']; + $nodegroup_ids= $node['nodegroup_ids']; + $pcu_ids= $node['pcu_ids']; + + // get peer + $peer_id= $node['peer_id']; + + // gets site info + $sites= $api->GetSites( array( $site_id ) ); + $site=$sites[0]; + $site_name= $site['name']; + $site_node_ids= $site['node_ids']; + + $site_node_hash=array(); + if( !empty( $site_node_ids ) ) { + // get site node info basics + $site_nodes= $api->GetNodes( $site_node_ids ); + + foreach( $site_nodes as $site_node ) { + $site_node_hash[$site_node['node_id']]= $site_node['hostname']; + } + } + + // gets slice info for each slice + if( !empty( $slice_ids ) ) + $slices= $api->GetSlices( $slice_ids, array( "slice_id", "name" , "peer_id" ) ); + + // gets conf file info + if( !empty( $conf_file_ids ) ) + $conf_files= $api->GetConfFiles( $conf_file_ids ); + + // get interface info + if( !empty( $interface_ids ) ) + $interfaces= $api->GetInterfaces( $interface_ids ); + + // gets nodegroup info + if( !empty( $nodegroup_ids ) ) + $nodegroups= $api->GetNodeGroups( $nodegroup_ids, array("groupname","tag_type_id","value")); + + // xxx Thierry : disabling call to GetEvents, that gets the session deleted in the DB + // needs being reworked + + // gets pcu and port info key to both is $pcu_id + if( !empty( $pcu_ids ) ) + $PCUs= $api->GetPCUs( $pcu_ids ); + + + // display node info + 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 + $extra_privileges = plc_is_admin () || ( plc_in_site($site_id) && ( plc_is_pi() || plc_is_tech())); + + $tabs=array(); + // available actions + if ( ! $peer_id && $extra_privileges ) { + + $tabs["All nodes"]=l_nodes(); + // xxx subject to roles + $tabs["Add Interface"]=l_interface_add_u($node_id); + $tabs["Comon"]=l_comon("node_id",$node_id); + if ($extra_privileges) { + $tabs["Events"]=l_event("Node","node",$node_id); + } + plc_tabs($tabs); + + // the javascript callback we set on the form; this + // (*) checks whether we clicked on 'delete' + // (*) in this case performs a javascript 'confirm' + // (*) then, notice that if we select delete, then cancel, we can select back 'Choose action' + // so submit only when value is not empty + $change='if (document.actions.action.value=="delete") if (! confirm("Are you sure you want to delete ' . $hostname . ' ? ") ) return false; if (document.actions.action.value!="") submit();'; + + echo "
"; + echo ""; + echo "
\n"; + echo "\n"; + echo "
\n"; + + echo "
"; + } + + echo "
"; + echo "\n"; + + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + echo "\n"; + + if ( ! $peer_id && $extra_privileges) { + + echo "\n"; + + } + + // site info and all site nodes + echo "\n"; + echo "\n"; + echo "\n"; + + echo "
Hostname: $hostname
Type: $node_type
Model: $model
Version: $version
Boot State: "; + if ($peer_id) { + echo $boot_state; + } else { + echo "
\n"; + echo "\n"; + echo "\n"; + echo "
"; + } + echo "
Download "; + echo "
\n"; + echo "\n"; + echo "
"; + echo "
 
Site: $site_name
All site nodes: "; + if (empty($site_node_hash)) { + echo "Site has no node"; + } else { + foreach( $site_node_hash as $key => $val ) { + echo "$val
"; + } + } + echo "

\n"; + + //////////////////////////////////////////////////////////// interfaces + if ( ! $peer_id ) { + + // display interfaces + if( ! $interfaces ) { + echo "

No interface. Please add an interface to make this a usable PLC node

.\n"; + } else { + $columns=array(); + if ( $extra_privileges ) { + // a single symbol, marking 'p' for primary and a delete button for non-primary + $columns[' ']='string'; + } + + $columns["IP"]="IPAddress"; + $columns["Method"]="string"; + $columns["Type"]="string"; + $columns["MAC"]="string"; + $columns["bw limit"]="FileSize"; + + print "
\n"; + plc_table_title('Interfaces'); + plc_table_start("interfaces",$columns,2,false); + + foreach ( $interfaces as $interface ) { + $interface_id= $interface['interface_id']; + $interface_ip= $interface['ip']; + $interface_broad= $interface['broadcast']; + $interface_primary= $interface['is_primary']; + $interface_network= $interface['network']; + $interface_dns1= $interface['dns1']; + $interface_dns2= $interface['dns2']; + $interface_hostname= $interface['hostname']; + $interface_netmaks= $interface['netmask']; + $interface_gatewary= $interface['gateway']; + $interface_mac= $interface['mac']; + $interface_bwlimit= $interface['bwlimit']; + $interface_type= $interface['type']; + $interface_method= $interface['method']; + + plc_table_row_start($interface['ip']); + if ( $extra_privileges ) { + if (!$interface_primary) { + // xxx + plc_table_cell (plc_delete_link_button ('interfaces.php?id=' . $interface_id . '&delete=1&submitted=1', + '\\nInterface ' . $interface_ip)); + } else { + plc_table_cell('p'); + } + } + plc_table_cell(l_interface2($interface_id,$interface_ip)); + plc_table_cell($interface_method); + plc_table_cell($interface_type); + plc_table_cell($interface_mac); + plc_table_cell($interface_bwlimit); + plc_table_row_end(); + } + plc_table_end(); + } + + } + + //////////////////////////////////////////////////////////// slices + // display slices + $peer_hash = plc_peer_get_hash ($api); + + print "
\n"; + plc_table_title ("Slices"); + if ( ! $slices ) { + echo "

This node is not associated to any slice.

\n"; + } else { + $columns=array(); + $columns['Peer']="string"; + $columns['Name']="string"; + $columns['Slivers']="string"; + plc_table_start ("slivers",$columns,1); + + foreach ($slices as $slice) { + plc_table_row_start($slice['name']); + plc_table_cell (plc_peer_shortname($peer_hash,$slice['peer_id'])); + plc_table_cell (l_slice2 ($slice['slice_id'],$slice['name'])); + plc_table_cell (l_sliver3 ($node_id,$slice['slice_id'],'view')); + plc_table_row_end(); + } + plc_table_end(); + } + + //////////////////////////////////////////////////////////// nodegroups + // display node group info + if ( ! $nodegroups ) { + echo "

This node is not in any nodegroup.

\n"; + } else { + $columns=array(); + $columns['Name']="string"; + $columns['Tag']="string"; + $columns['Value']="string"; + + print "
\n"; + plc_table_title("Nodegroups"); + plc_table_start("nodegroups",$columns,0,false); + + foreach( $nodegroups as $nodegroup ) { + plc_table_row_start(); + plc_table_cell(l_nodegroup2($nodegroup_id,$nodegroup['groupname'])); + $tag_types=$api->GetTagTypes(array($nodegroup['tag_type_id'])); + plc_table_cell($tag_types[0]['tagname']); + plc_table_cell($nodegroup['value']); + plc_table_row_end(); + } + plc_table_end(); + } + + //////////////////////////////////////////////////////////// + plc_peer_block_end(); +} + +// Print footer +include 'plc_footer.php'; + +?> diff --git a/planetlab/nodes/newindex.php b/planetlab/nodes/nodes.php similarity index 87% rename from planetlab/nodes/newindex.php rename to planetlab/nodes/nodes.php index ddbdda9..8e13d37 100644 --- a/planetlab/nodes/newindex.php +++ b/planetlab/nodes/nodes.php @@ -38,7 +38,6 @@ $tabs=array("Old page"=>l_nodes(), $peer_filter=array(); $node_filter=array(); - ////////////////// // performs sanity check and summarize the result in a single column function node_status ($node) { @@ -57,7 +56,7 @@ function node_status ($node) { // fetch nodes - set pattern in the url for server-side filtering -$node_columns=array('hostname','site_id','node_id','boot_state','interface_ids','peer_id'); +$node_columns=array('hostname','node_type','site_id','node_id','boot_state','interface_ids','peer_id'); if ($pattern) { $node_filter['hostname']=$pattern; $title .= " matching " . $pattern; @@ -118,16 +117,6 @@ foreach ($sites as $site) { $site_hash[$site['site_id']]=$site; } -// fetch peers -$peer_columns=array('peer_id','shortname'); -$peer_filter=array(); -$peers = $api->GetPeers($peer_filter,$peer_columns); - -$peer_hash=array(); -foreach ($peers as $peer) { - $peer_hash[$peer['peer_id']]=$peer; -} - // -------------------- drupal_set_title($title); @@ -144,13 +133,15 @@ $columns = array ("Peer"=>"string", "State"=>"string", "Hostname"=>"string", "IP"=>"IPAddress", - "Load"=>"int", - "Avg Load"=>"float", - "Status"=>"string"); + "Type"=>"string", + "?"=>"string", + "Int"=>"int", + "Float"=>"float"); # initial sort on hostnames plc_table_start("nodes",$columns,4); +$peer_hash = plc_peer_get_hash ($api); // write rows $fake1=1; $fake2=3.14; $fake_i=0; foreach ($nodes as $node) { @@ -162,24 +153,21 @@ 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']; - if ( ! $node['peer_id'] ) { - $shortname=PLC_SHORTNAME; - } else { - $shortname=$peer_hash[$node['peer_id']]['shortname']; - } - printf ('',$hostname); + $shortname = plc_peer_shortname ($peer_hash,$node['peer_id']); + $node_type = $node['node_type']; + plc_table_row_start($hostname); plc_table_cell ($shortname); plc_table_cell (topdomain($hostname)); plc_table_cell (l_site2($site_id,$login_base)); plc_table_cell ($node['boot_state']); plc_table_cell (l_node2($node_id,$hostname)); plc_table_cell (l_interface2($interface_id,$ip)); + plc_table_cell ($node_type); + plc_table_cell (node_status($node)); plc_table_cell ($fake1); plc_table_cell ($fake2); - plc_table_cell (node_status($node)); - - printf ( ''); + plc_table_row_end(); if ($fake_i % 5 == 0) $fake1 += 3; if ($fake_i % 3 == 0) $fake2 +=5; else $fake2 -= $fake_i; diff --git a/planetlab/nodes/production_hosts.php b/planetlab/nodes/production_hosts.php deleted file mode 100644 index e384416..0000000 --- a/planetlab/nodes/production_hosts.php +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/planetlab/nodes/production_ips.php b/planetlab/nodes/production_ips.php deleted file mode 100644 index e5ee49e..0000000 --- a/planetlab/nodes/production_ips.php +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/planetlab/slices/tags.php b/planetlab/tags/index.php similarity index 100% rename from planetlab/slices/tags.php rename to planetlab/tags/index.php diff --git a/planetlab/nodes/node_groups.php b/planetlab/tags/nodegroups.php similarity index 100% rename from planetlab/nodes/node_groups.php rename to planetlab/tags/nodegroups.php diff --git a/planetlab/slices/tag_action.php b/planetlab/tags/tag_action.php similarity index 100% rename from planetlab/slices/tag_action.php rename to planetlab/tags/tag_action.php -- 2.43.0