6 require_once 'plc_login.php';
8 // Get session and API handles
9 require_once 'plc_session.php';
13 require_once 'plc_drupal.php';
14 include 'plc_header.php';
17 require_once 'plc_functions.php';
18 require_once 'plc_objects.php';
19 require_once 'plc_peers.php';
20 require_once 'plc_visibletags2.php';
21 require_once 'linetabs.php';
22 require_once 'table2.php';
23 require_once 'nifty.php';
24 require_once 'toggle.php';
25 require_once 'columns.php';
27 // keep css separate for now
28 drupal_set_html_head('
29 <link href="/planetlab/css/my_slice.css" rel="stylesheet" type="text/css" />
33 ini_set("memory_limit","64M");
35 // --------------------
36 // recognized URL arguments
37 $peerscope=$_GET['peerscope'];
38 $pattern=$_GET['pattern'];
39 $site_id=intval($_GET['site_id']);
40 $slice_id=intval($_GET['slice_id']);
41 $person_id=intval($_GET['person_id']);
46 $tabs []= tab_nodes();
47 if (count (plc_my_site_ids()) == 1) {
48 $tabs []= tab_nodes_mysite();
50 $tabs []= tab_nodes_all_mysite();
52 $tabs []= tab_nodes_local();
54 // --------------------
58 // performs sanity check and summarize the result in a single column
59 function node_status ($node) {
62 if ($node['node_type'] != 'regular' && $node['node_type'] != 'reservable' )
63 $messages []= $node['node_type'];
65 // checks on local nodes only
66 if ( ( ! $node['peer_id']) ) {
67 // has it got interfaces
68 if (count($node['interface_ids']) == 0)
69 $messages []= "No interface";
71 return plc_vertical_table($messages,'plc-warning');
75 $first_time_configuration = false;
78 $default_configuration = "ID:f|hostname:f|ST:f|AU:f";
80 $default_configuration = "hostname:f|ST:f|AU:f";
82 //$extra_default = "LCN|DN|R|L|OS|MS|SN";
83 $column_configuration = "";
84 $slice_column_configuration = "";
85 $show_configuration = "";
86 $show_columns_message = '1';
89 $PersonTags=$api->GetPersonTags (array('person_id'=>$plc->person['person_id']));
90 //print_r($PersonTags);
91 foreach ($PersonTags as $ptag) {
92 if ($ptag['tagname'] == 'columnconf')
94 $column_configuration = $ptag['value'];
95 $conf_tag_id = $ptag['person_tag_id'];
97 if ($ptag['tagname'] == 'showconf')
99 $show_configuration = $ptag['value'];
100 $show_tag_id = $ptag['person_tag_id'];
104 //print("column configuration = ".$column_configuration);
106 $nodesconf_exists = false;
107 if ($column_configuration == "")
109 $first_time_configuration = true;
110 $column_configuration = "nodes;default";
111 $nodesconf_exists = true;
114 $slice_conf = explode(";",$column_configuration);
115 for ($i=0; $i<count($slice_conf); $i++ ) {
116 if ($slice_conf[$i] == "nodes")
119 $slice_column_configuration = $slice_conf[$i];
120 $nodesconf_exists = true;
126 $slice_column_configuration = $slice_conf[$i];
131 if ($nodesconf_exists == false)
132 $column_configuration = $column_configuration.";nodes;default";
133 //panos: need to define an "empty" configuration here (for the moment A column
134 //will be added by default the first time
137 if ($slice_column_configuration == "" || $slice_column_configuration == "default")
138 $full_configuration = $default_configuration;
141 $full_configuration = $default_configuration."|".$slice_column_configuration;
143 //print("full configuration = ".$full_configuration);
146 $node_fixed_columns=array('node_type','site_id','boot_state','last_contact','interface_ids','peer_id', 'slice_ids');
148 $fix_columns = array();
150 $fix_columns[]=array('tagname'=>'node_id', 'header'=>'ID', 'type'=>'string', 'title'=>'The ID the node');
151 $fix_columns[]=array('tagname'=>'hostname', 'header'=>'hostname', 'type'=>'string', 'title'=>'The name of the node');
152 $fix_columns[]=array('tagname'=>'peer_id', 'header'=>'AU', 'type'=>'string', 'title'=>'Authority');
153 $fix_columns[]=array('tagname'=>'run_level', 'header'=>'ST', 'type'=>'string', 'title'=>'Status');
154 //$fix_columns[]=array('tagname'=>'node_type', 'header'=>'RES', 'type'=>'string', 'title'=>'Reservable');
157 $visibletags = new VisibleTags ($api, 'node');
158 $visibletags->columns();
159 $tag_columns = $visibletags->headers();
161 $extra_columns = array();
162 $extra_columns[]=array('tagname'=>'sitename', 'header'=>'SN', 'type'=>'string', 'title'=>'Site name', 'fetched'=>true, 'source'=>'myplc');
163 $extra_columns[]=array('tagname'=>'domain', 'header'=>'DN', 'type'=>'string', 'title'=>'Toplevel domain name', 'fetched'=>true, 'source'=>'myplc');
164 $extra_columns[]=array('tagname'=>'ipaddress', 'header'=>'IP', 'type'=>'string', 'title'=>'IP Address', 'fetched'=>true, 'source'=>'myplc');
165 $extra_columns[]=array('tagname'=>'fcdistro', 'header'=>'OS', 'type'=>'string', 'title'=>'Operating system', 'fetched'=>false, 'source'=>'myplc');
166 $extra_columns[]=array('tagname'=>'uptime', 'header'=>'UT', 'source'=>'comon', 'type'=>'sortAlphaNumericTop', 'title'=>'Continuous uptime until now', 'fetched'=>false);
167 $extra_columns[]=array('tagname'=>'date_created', 'header'=>'DA', 'source'=>'myplc', 'type'=>'date', 'title'=>'Date added', 'fetched'=>false);
168 //$extra_columns[]=array('tagname'=>'hopcount', 'header'=>'HC', 'source'=>'tophat', 'type'=>'sortAlphaNumericTop', 'title'=>'Hop count from reference node', 'fetched'=>false);
171 $ConfigureColumns =new PlekitColumns($full_configuration, $fix_columns, $tag_columns, $extra_columns);
173 $visiblecolumns = $ConfigureColumns->node_tags();
175 $node_columns=array_merge($node_fixed_columns,$visiblecolumns);
177 //$visibletags = new VisibleTags ($api, 'node');
178 //$visiblecolumns = $visibletags->column_names();
180 //print_r($visiblecolumns);
181 //$node_columns=array_merge($node_fixed_columns,$visiblecolumns);
184 // server-side filtering - set pattern in $_GET for filtering on hostname
186 $node_filter['hostname']=$pattern;
187 $title .= " matching " . $pattern;
189 $node_filter['hostname']="*";
192 // server-side selection on peerscope
193 $peerscope=new PeerScope($api,$_GET['peerscope']);
194 $node_filter=array_merge($node_filter,$peerscope->filter());
195 $title .= ' - ' . $peerscope->label();
198 $sites=$api->GetSites(array($site_id));
201 $login_base=$site['login_base'];
202 $title .= t_site($site);
203 $tabs []= tab_site($site);
204 $node_filter['site_id']=array($site_id);
208 $slices=$api->GetSlices(array($slice_id),array('node_ids','name'));
210 $title .= t_slice($slice);
211 $tabs []= tab_slice($slice);
212 $node_filter['node_id'] = $slice['node_ids'];
215 // person_id is set : this is mostly oriented towards people managing several sites
217 // avoid doing a useless call to GetPersons if the person_id is already known though $plc,
218 // as this is mostly done for the 'all my sites nodes' link
219 if ($person_id == plc_my_person_id()) {
220 $person=plc_my_person();
221 $site_ids = plc_my_site_ids();
223 // fetch the person's site_ids
224 $persons = $api->GetPersons(array('person_id'=>$person_id),array('person_id','email','site_ids'));
226 $site_ids=$person['site_ids'];
228 $title .= t_person($person);
229 $node_filter['site_id']=$site_ids;
233 //print("getting nodes ".$node_columns);
234 //print_r($node_columns);
235 $nodes=$api->GetNodes($node_filter,$node_columns);
237 //print("<p> GOT NODES </p>");
240 $ConfigureColumns->fetch_live_data($nodes);
242 $show_conf = explode(";",$show_configuration);
243 foreach ($show_conf as $ss) {
245 $show_columns_message = '0';
250 // build site_ids - interface_ids
252 $interface_ids=array();
253 if ($nodes) foreach ($nodes as $node) {
254 $site_ids []= $node['site_id'];
255 $interface_ids = array_merge ($interface_ids,$node['interface_ids']);
258 // fetch related interfaces
259 $interface_columns=array('ip','node_id','interface_id');
260 $interface_filter=array('is_primary'=>TRUE,'interface_id'=>$interface_ids);
261 $interfaces=$api->GetInterfaces($interface_filter,$interface_columns);
263 $interface_hash=array();
264 foreach ($interfaces as $interface) $interface_hash[$interface['node_id']]=$interface;
266 // fetch related sites
267 $site_columns=array('site_id','login_base');
268 $site_filter=array('site_id'=>$site_ids);
269 $sites=$api->GetSites($site_filter,$site_columns);
272 foreach ($sites as $site) $site_hash[$site['site_id']]=$site;
274 // --------------------
275 drupal_set_title($title);
277 plekit_linetabs($tabs);
280 drupal_set_message ('No node found');
284 $nifty=new PlekitNifty ('','objects-list','big');
286 $headers = array (); $offset=0;
288 $notes [] = "For information about the different columns please see the <b>node table layout</b> tab above or <b>mouse over</b> the column headers";
293 if (plc_is_admin()) {
294 $short="I"; $long="node_id"; $type='int';
295 $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
298 $short="P"; $long="Peer"; $type='string';
299 $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
300 $short="D"; $long="toplevel domain name"; $type='string';
301 $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
302 $headers["Site"]="string";
303 $headers["Hostname"]="string";
304 $short="IP"; $long="IP Address"; $type='sortIPAddress';
305 $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
306 $short="ST"; $long=Node::status_footnote(); $type='string';
307 $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
308 $short="SL"; $long="Number of slivers"; $type='int';
309 $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
311 $headers=array_merge($headers,$visibletags->headers());
312 $notes=array_merge($notes,$visibletags->notes());
313 $short="?"; $long="extra status info"; $type='string';
314 $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
317 $info_header = array();
318 $short="?"; $long="extra status info"; $type='string';
319 $info_header[$short]=array('type'=>$type,'title'=>$long, 'label'=>'?', 'header'=>'?', 'visible'=>true);
320 //$notes []= "$short = $long";
321 //$info_header["?"] = "none";
322 $headers = array_merge($ConfigureColumns->get_headers(),$info_header);
324 if ($first_time_configuration)
325 $column_conf_visible = '1';
327 $column_conf_visible = '0';
329 $toggle_nodes=new PlekitToggle('nodes-column-configuration',
331 array('visible'=>$column_conf_visible, 'info_div'=>'note_columns_div'));
332 $toggle_nodes->start();
333 print("<div id='debug'></div>");
334 print("<input type='hidden' id='slice_id' value='nodes' />");
335 print("<input type='hidden' id='person_id' value='".$plc->person['person_id']."' />");
336 print("<input type='hidden' id='conf_tag_id' value='".$conf_tag_id."' />");
337 print("<input type='hidden' id='show_tag_id' value='".$show_tag_id."' />");
338 print("<input type='hidden' id='show_configuration' value='".$show_configuration."' />");
339 print("<input type='hidden' id='column_configuration' value='".$slice_column_configuration."' />");
340 print("<br><input type='hidden' size=80 id='full_column_configuration' value='".$column_configuration."' />");
341 print("<input type='hidden' id='defaultConf' value='".$default_configuration."'></input>");
343 if ($show_columns_message == '0')
344 $note_display = "display:none;";
350 <div id='note_columns_div' style="align:center; background-color:#CAE8EA; padding:4px; width:800px; $note_display">
351 <table align=center><tr><td valign=top>
352 This tab allows you to customize the columns in the node tables, below. Information on the nodes comes from a variety of monitoring sources. If you, as either a user or a provider of monitoring data, would like to see additional columns made available, please send us your request in mail to <a href="mailto:support@myslice.info">support@myslice.info</a>. You can find more information about the MySlice project at <a href="http://trac.myslice.info">http://trac.myslice.info</a>.
353 </td><td valign=top><span onClick=closeMessage('columns')><img class='reset' src="/planetlab/icons/clear.png" alt="hide message permanently"></span>
358 $ConfigureColumns->configuration_panel_html(true);
359 $ConfigureColumns->javascript_init();
360 $toggle_nodes->end();
362 $table_options = array('notes'=>$notes,
365 'configurable'=>true);
367 # initial sort on hostnames
368 $table=new PlekitTable ("nodes",$headers,3+$offset, $table_options);
371 $peers = new Peers ($api);
373 foreach ($nodes as $node) {
374 //$node_obj = new Node ($node);
375 $hostname=$node['hostname'];
376 $node_id=$node['node_id'];
377 $site_id=$node['site_id'];
378 $site=$site_hash[$site_id];
379 $login_base = $site['login_base'];
380 $ip=$interface_hash[$node['node_id']]['ip'];
381 $interface_id=$interface_hash[$node['node_id']]['interface_id'];
382 $peer_id=$node['peer_id'];
385 $table->cell($node['node_id'], array('display'=>'none'));
386 if (plc_is_admin()) $table->cell(l_node_t($node_id,$node_id));
387 $table->cell (l_node_t($node_id,$hostname));
388 $peers->cell ($table,$peer_id);
390 //prefetch some columns
391 $node['domain'] = topdomain($hostname);
392 $node['sitename'] = l_site_t($site_id,$login_base);
394 $node['ipaddress'] = l_interface_t($interface_id,$ip);
396 $node['ipaddress'] = "n/a";
398 list($label,$class) = Node::status_label_class_($node);
399 $table->cell ($label,array('class'=>$class));
400 //$table->cell (count($node['slice_ids']));
401 //foreach ($visiblecolumns as $tagname) $table->cell($node[$tagname]);
402 $ConfigureColumns->cells($table, $node);
403 $table->cell (node_status($node));
411 //plekit_linetabs ($tabs,"bottom");
414 include 'plc_footer.php';