admin db search rewritten + removed some obsolete action files
[plewww.git] / planetlab / common / adminsearch.php
1 <?php
2
3   // $Id$
4
5 // Require login
6 require_once 'plc_login.php';
7
8 // Get session and API handles
9 require_once 'plc_session.php';
10 global $plc, $api;
11
12 // Print header
13 require_once 'plc_drupal.php';
14 // set default 
15 drupal_set_title('DB Search');
16 include 'plc_header.php'; 
17
18 // Common functions
19 require_once 'plc_functions.php';
20 require_once 'plc_objects.php';
21 require_once 'table.php';
22 require_once 'form.php';
23 require_once 'toggle.php';
24
25 ini_set("memory_limit","256M");
26
27 if ( ! plc_is_admin()) {
28   plc_warning ("DB Search is available to admins only");
29   return;
30  }
31
32 $pattern="";
33 if (isset($_GET['pattern'])) { $pattern=$_GET['pattern']; }
34 if (isset($_POST['pattern'])) { $pattern=$_POST['pattern']; }
35 $tokens=split(" ",$pattern);
36
37 ////////////////////
38 // from a single search form, extract all tokens entered 
39 // and then show all entities that match one of that tokens among
40 // nodes - persons - sites - slices
41 ////////////////////
42 function display_form ($pattern) {
43   if ($pattern) {
44     $title="Searching for $pattern";
45     $visible=false;
46   } else {
47     $title="Search for what";
48     $visible=true;
49   }
50   $toggle=new PlekitToggle("admin-search",$title,array('start-visible'=>$visible));
51   $toggle->start();
52   print <<< EOF
53     <p id='admin-search-message'> This form searches for any entry in the database matching a name fragment, or token. Specifically it searches for persons, slices, nodes or slices. You can specify a space-separated list of tokens, entries matching any token would then get listed.
54 </p>
55 EOF;
56   print "<div id='admin-search-form'>";
57   $form=new PlekitForm ('/db/common/adminsearch.php',array());
58   $form->start();
59   print $form->label_html('pattern',"Enter space-separated tokens");
60   print $form->text_html('pattern',$pattern);
61   print $form->submit_html('submit','Submit');
62   $form->end();
63   print "</div>\n";
64   $toggle->end();
65 }
66
67 // just look for *token*
68 function token_pattern ($token) {
69   return "*" . $token . "*";
70 }
71
72 // $type is e.g. 'Persons' -- $field is e.g. 'email'
73 function generic_search ($type,$field,$tokens) {
74   global $api;
75   $results=array();
76   $methodname='Get'.$type;
77   if ( ! method_exists($api,$methodname)) {
78     plc_error("generic_search failed with methodname=$methodname");
79     return $results;
80   }
81   foreach ($tokens as $token) {
82     $filter=array($field=>token_pattern($token));
83     $results = 
84       array_merge ($results,$api->$methodname($filter));
85   }
86   return $results;
87 }
88
89 // $objects is e.g. a collection of persons
90 // then, e.g. on slice,  $key='site_id'  & $plural=false
91 // or,   e.g. on person, $key='site_ids'  & $plural=true
92 function generic_gather_related ($objects, $key, $plural) {
93   if ( empty ($objects)) 
94     return array();
95   // else, look for either 'site_id' or 'site_ids' in the first object
96   $sample=$objects[0];
97   if ( array_key_exists($key,$sample)) {
98     $result=array();
99     foreach ($objects as $object) {
100       if ($plural) {
101         $result = array_merge ($result, $object[$key]);
102       } else {
103         $result []= $object[$key];
104       }
105     }
106     return $result;
107   } else {
108     plc_debug("gather_related failed with $key",$sample);
109     return array();
110   }
111 }
112
113 ////////// 
114 // create link from an id, using the various global hashes
115 function plc_person_link ($person_id) {global $persons_hash; return l_person_obj($persons_hash[$person_id]);}
116 function plc_slice_link ($slice_id) {global $slices_hash; return l_slice_obj($slices_hash[$slice_id]);}
117 function plc_site_link ($site_id) {global $sites_hash; return l_site_obj($sites_hash[$site_id]);}
118 function plc_node_link ($node_id) {global $nodes_hash; return l_node_obj($nodes_hash[$node_id]);}
119
120 function display_persons ($persons) {
121   if ( ! $persons) return;
122   
123   $toggle=new PlekitToggle('persons-area',"Persons");
124   $toggle->start();
125
126   $headers=array('id'=>'int',
127                  'email'=>'string',
128                  'sites'=>'string',
129                  'slices'=>'string',
130                  'roles'=>'string');
131   $table=new PlekitTable('persons',$headers,1);
132   $table->start();
133   foreach ($persons as $person) {
134     $table->row_start();        
135     $table->cell($person['person_id']);
136     $table->cell(l_person_obj($person));
137     $table->cell(plc_vertical_table(array_map("plc_site_link",$person['site_ids'])));
138     $table->cell(plc_vertical_table(array_map("plc_slice_link",$person['slice_ids'])));
139     $table->cell(plc_vertical_table($person['roles']));
140     $table->row_end();
141   }
142   $table->end();
143   $toggle->end();
144 }
145
146 function display_slices ($slices) {
147   if ( ! $slices) return;
148   
149   $toggle=new PlekitToggle('slices-area',"Slices");
150   $toggle->start();
151
152   $headers=array('id'=>'int',
153                  'name'=>'string',
154                  'site'=>'string',
155                  'persons'=>'string',
156                  'N'=>'string');
157   $table=new PlekitTable('slices',$headers,1);
158   $table->start();
159   foreach ($slices as $slice) {
160     $table->row_start();        
161     $table->cell($slice['slice_id']);
162     $table->cell(l_slice_obj($slice));
163     global $sites_hash;
164     $site=$sites_hash[$slice['site_id']];
165     $table->cell(l_site_obj($site));
166     $table->cell(plc_vertical_table(array_map("plc_person_link",$slice['person_ids'])));
167     // this makes really long tables, use the slice link to see details
168     //$table->cell(plc_vertical_table(array_map("plc_node_link",$slice['node_ids'])));
169     $table->cell(count($slice['node_ids']));
170     $table->row_end();
171   }
172   $table->end();
173   $toggle->end();
174 }
175
176 function display_sites ($sites) {
177   if ( ! $sites) return;
178   
179   $toggle=new PlekitToggle('sites-area',"Sites");
180   $toggle->start();
181
182   $headers=array('id'=>'int',
183                  'name'=>'string',
184                  'url'=>'string',
185                  'persons'=>'string',
186                  'slices'=>'string',
187                  'nodes'=>'string');
188   $table=new PlekitTable('sites',$headers,1);
189   $table->start();
190   foreach ($sites as $site) {
191     $table->row_start();        
192     $table->cell($site['site_id']);
193     $table->cell(l_site_obj($site));
194     $table->cell(href($site['url'],$site['url']));
195     $table->cell(plc_vertical_table(array_map("plc_person_link",$site['person_ids'])));
196     $table->cell(plc_vertical_table(array_map("plc_slice_link",$site['slice_ids'])));
197     $table->cell(plc_vertical_table(array_map("plc_node_link",$site['node_ids'])));
198     $table->row_end();
199   }
200   $table->end();
201   $toggle->end();
202 }
203
204 function display_nodes ($nodes) {
205   if ( ! $nodes) return;
206   
207   $toggle=new PlekitToggle('nodes-area',"Nodes");
208   $toggle->start();
209
210   $headers=array('id'=>'int',
211                  'hostname'=>'string',
212                  'site'=>'string',
213                  'slices'=>'string');
214   $table=new PlekitTable('nodes',$headers,1);
215   $table->start();
216   foreach ($nodes as $node) {
217     $table->row_start();        
218     $table->cell($node['node_id']);
219     $table->cell(l_node_obj($node));
220     global $sites_hash;
221     $site=$sites_hash[$node['site_id']];
222     $table->cell(l_site_obj($site));
223     $table->cell(plc_vertical_table(array_map("plc_slice_link",$node['slice_ids'])));
224     $table->row_end();
225   }
226   $table->end();
227   $toggle->end();
228 }
229
230
231 ////////////////////////////////////////////////////////////
232 display_form($pattern);
233
234 if ($pattern) {
235
236   ////////// search database
237   // search persons on email
238   $persons = array();
239   $persons = array_merge ($persons, generic_search ('Persons','email',$tokens));
240
241   // search slices on name
242   $slices=array();
243   $slices = array_merge ($slices, generic_search ('Slices','name',$tokens));
244
245   // search sites on name and login_base
246   $sites=array();
247   $sites = array_merge ($sites, generic_search('Sites','name',$tokens));
248   $sites = array_merge ($sites, generic_search('Sites','login_base',$tokens));
249
250   // nodes on hostname
251   $nodes=array();
252   $nodes = array_merge ($nodes, generic_search('Nodes','hostname',$tokens));
253
254   print "Search results for <span class='tokens'> $pattern </span>\n";
255   if ( !$nodes && !$persons && !$slices && !$sites) {
256     plc_warning ("No result found");
257     return;
258   }
259
260   ////////// collect all related objects 
261   $rel_person_ids = array();
262   $rel_person_ids = array_merge($rel_person_ids, generic_gather_related ($sites,'person_ids',true));
263   $rel_person_ids = array_merge($rel_person_ids, generic_gather_related ($slices,'person_ids',true));
264
265   $rel_slice_ids = array();
266   $rel_slice_ids = array_merge($rel_slice_ids, generic_gather_related ($persons,'slice_ids',true));
267   $rel_slice_ids = array_merge($rel_slice_ids, generic_gather_related ($sites,'slice_ids',true));
268   $rel_slice_ids = array_merge($rel_slice_ids, generic_gather_related ($nodes,'slice_ids',true));
269
270   $rel_site_ids = array();
271   $rel_site_ids = array_merge ( $rel_site_ids, generic_gather_related ($persons,'site_ids',true));
272   $rel_site_ids = array_merge ( $rel_site_ids, generic_gather_related ($slices,'site_id',false));
273   $rel_site_ids = array_merge ( $rel_site_ids, generic_gather_related ($nodes,'site_id',false));
274
275   $rel_node_ids = array();
276   $rel_node_ids = array_merge($rel_node_ids, generic_gather_related ($sites,'node_ids',true));
277   $rel_node_ids = array_merge($rel_node_ids, generic_gather_related ($slices,'node_ids',true));
278
279
280   ////////// fetch related and store in a global hash
281   $rel_persons = $api->GetPersons ($rel_person_ids);
282   global $persons_hash; $persons_hash=array();
283   foreach ($rel_persons as $person) $persons_hash[$person['person_id']]=$person;
284
285   $rel_slices = $api->GetSlices ($rel_slice_ids);
286   global $slices_hash; $slices_hash=array();
287   foreach ($rel_slices as $slice) $slices_hash[$slice['slice_id']]=$slice;
288
289   $rel_sites = $api->GetSites ($rel_site_ids);
290   global $sites_hash; $sites_hash=array();
291   foreach ($rel_sites as $site) $sites_hash[$site['site_id']]=$site;
292
293   $rel_nodes = $api->GetNodes ($rel_node_ids);
294   global $nodes_hash; $nodes_hash=array();
295   foreach ($rel_nodes as $node) $nodes_hash[$node['node_id']]=$node;
296
297   ////////// show results
298   display_persons ($persons);
299   display_slices ($slices);
300   display_sites($sites);
301   display_nodes($nodes);
302
303  }
304
305 // Print footer
306 include 'plc_footer.php';
307
308 ?>