Code

Followup commit for #144
[gosa.git] / trunk / gosa-plugins / goto / addons / goto / events / class_EventTargetAddList.inc
1 <?php
2 /*
3  * This code is part of GOsa (http://www.gosa-project.org)
4  * Copyright (C) 2003-2008 GONICUS GmbH
5  *
6  * ID: $$Id$$
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  */
23 class EventTargetAddList extends MultiSelectWindow
24 {
25   public $display_server = TRUE;
26   public $display_workstation = TRUE;
27   public $display_ogroup = TRUE;
28   public $filter_iprange = FALSE;
29   public $filter_mac_addr = FALSE;
30   public $filter_fai_release = FALSE;
31   public $filter_fai_class = FALSE;
33   public $regex  = "*";
34   public $ipfrom = "0.0.0.0";
35   public $ipto   = "*";
36   public $mac_addr = "*:*:*:*:*:*";
37   public $fai_release = "*";
38   public $fai_class = "*";
39   public $_target_list = array();
41   public $workstation_list = array();
42   public $server_list = array();
44   public $array_TextCheckboxes = array();
46   public $SubSearch = FALSE;
47   /* Define that Draw has to return a smarty object */
48   public $DrawReturnsSmartyObject = TRUE;
50   function __construct(&$config,$parent)
51   {
52     MultiSelectWindow::MultiSelectWindow($config, "EventTargetAddList", 
53         array("server",
54           "workstation",
55           "ogroups"));
57     $this->parent       = $parent;
58     $this->ui           = get_userinfo();
61     $this->target_divlist = new MultiSelectWindow($this->config,"EventAddTargedtList","gotomasses");
62     $this->SetSummary(_("Targets"));
63     $this->EnableCloseButton(FALSE);
64     $this->EnableSaveButton(FALSE);
66     $this->SetInformation(_("This dialog shows all available targets for the event. Check the targets you want to add and use the 'Apply' button."));
68     /* Toggle all selected / deselected */
69     $chk = "<input type='checkbox' id='select_all' name='select_all'
70       onClick='toggle_all_(\"^item_selected_[0-9]*$\",\"select_all\");' >";
72     $this->EnableAplhabet(TRUE);
74     /* set Page header */
75     $this->AddHeader(array("string"=> $chk,          "attach"=>"style='width:20px;'"));
76     $this->AddHeader(array("string"=>"&nbsp;","attach"=>"style='width:20px;'"));
77     $this->AddHeader(array("string"=>_("System / Department")));
79     //$name,$string,$value,$conn,$image="images/lists/search.png")
80     $this->AddRegex("regex" ,"regex"  ,"*"                , TRUE);
82     $this->AddCheckBox("display_server","1"     ,_("Display server"),TRUE);
83     $this->AddCheckBox("display_workstation","1",_("Display workstation"),TRUE);
84     $this->AddCheckBox("display_ogroup","1"     ,_("Display object groups"),TRUE);
85     
86     /* Add SubSearch checkbox */
87     $this->AddCheckBox(SEPERATOR);
88     $this->AddCheckBox("SubSearch",  msgPool::selectToView("","subsearch"), msgPool::selectToView("","subsearch_small"), false);
90     $regexes = array();
91     $regexes[] = $this->AddRegex("ipfrom","ipfrom" ,"0.0.0.0"          , FALSE, "images/lists/search.png", TRUE);
92     $regexes[] = $this->AddRegex("ipto"  ,"ipto"   ,"255.255.255.255"  , FALSE, "images/lists/search.png", TRUE);
93     $this->AddTextCheckBox("filter_iprange","1"     ,_("Filter by IP range"),FALSE, $regexes);
95     $regexes = array();
96     $regexes[] = $this->AddRegex("mac_addr", "mac_addr", "*:*:*:*:*:*", FALSE, "images/lists/search.png", TRUE);
97     $this->AddTextCheckBox("filter_mac_addr", "1", _("Filter by MAC address"), FALSE, $regexes);
99     $regexes = array();
100     $regexes[] = $this->AddRegex("fai_release", "fai_release", "*", FALSE, "images/lists/search.png", TRUE);
101     $this->AddTextCheckBox("filter_fai_release", "1", _("Filter by FAI release"), FALSE, $regexes);
103     $regexes = array();
104     $regexes[] = $this->AddRegex("fai_class", "fai_class", "*", FALSE, "images/lists/search.png", TRUE);
105     $this->AddTextCheckBox("filter_fai_class", "1", _("Filter by FAI class"), FALSE, $regexes);
107     /* Create a list of servers
108      */
109     $tmp = get_sub_list("(&(macAddress=*)(objectClass=goServer))",
110           "server",get_ou("serverRDN"),$config->current['BASE'],
111           array("cn","objectClass","description","ipHostNumber","macAddress"),GL_SUBSEARCH);
112     foreach($tmp as $server){
113       $this->server_list[$server['dn']] = $server;
114     }
116     /* Create a list of workstations
117      */
118     $tmp = get_sub_list("(&(macAddress=*)(objectClass=gotoWorkstation))",
119           "server",get_ou("workstationRDN"),$config->current['BASE'],
120           array("cn","objectClass","description","ipHostNumber","macAddress"),GL_SUBSEARCH);
121     foreach($tmp as $server){
122       $this->workstation_list[$server['dn']] = $server;
123     }
125   }
128   function execute()
129   {
130     $this->ClearElementsList();
131     $this->AddDepartments($this->selectedBase,2,1);
132     $this->setEntries();
133     $this->GenHeader();
134   }
137   function GenHeader()
138   {
139     $modules = array("server","workstation");
141     /* Add base */
142     $tmp = array();
143     $base = $this->config->current['BASE'];
144     $tmp[] = array("dn"=>$this->config->current['BASE']);
145     $tmp=  array_merge($tmp,get_list("(&(|(ou=*)(description=*))(objectClass=gosaDepartment))", $modules, $base,
146           array("ou", "description"), GL_SIZELIMIT | GL_SUBSEARCH));
148     $deps = array();
149     foreach($tmp as $tm){
150       $deps[$tm['dn']] = $tm['dn'];
151     }
153     $department = $departments = array();
154     $ui= get_userinfo();
155     $d = $ui->get_module_departments($modules);
156     foreach($d as $department){
157       $departments[$department] = $department;
158     }
160     /* Load possible departments */
161     $ids = $this->config->idepartments;
162     $first = "";
163     $found = FALSE;
164     $options = array();
165     foreach($ids as $dep => $name){
166       if(isset($deps[$dep]) && in_array_ics($dep, $departments)){
168         /* Keep first base dn in mind, we could need this
169          *  info if no valid base was found
170          */
171         if(empty($first)) {
172           $first = $dep['dn'];
173         }
175         $value = $ids[$dep];
176         if ($this->selectedBase == $dep){
177           $found = TRUE;
178           $options.= "<option selected='selected' value='".$dep."'>$value</option>";
179         } else {
180           $options.= "<option value='".$dep."'>$value</option>";
181         }
182       }
183     }
185     $listhead = $this->get_default_header();
187     /* Add base selection */
188     $listhead .= _("Base")."&nbsp; <select name='CurrentMainBase' onChange='mainform.submit()' class='center'>$options</select>".
189       " <input class='center' type='image' src='images/lists/submit.png' align='middle'
190       title='"._("Submit department")."' name='submit_department' alt='". _("Submit")."'>&nbsp;";
192     $this->SetListHeader($listhead);
194   }
197   function get_selected_targets()
198   {
199     $a_targets = array();
200     foreach($this->list_get_selected_items() as $id){
201       if(in_array("gosaGroupOfNames",$this->_target_list[$id]['objectClass'])){
202         foreach($this->_target_list[$id]['member'] as $mem_dn){
203           if(isset($this->workstation_list[$mem_dn])){
204             $a_targets[] = $this->workstation_list[$mem_dn]['macAddress'][0];
205           }
206           if(isset($this->server_list[$mem_dn])){
207             $a_targets[] = $this->server_list[$mem_dn]['macAddress'][0];
208           }
209         }
210       }else{
211         if(isset($this->_target_list[$id]['macAddress'][0])){
212           $a_targets[] = $this->_target_list[$id]['macAddress'][0];
213         }
214       }
215     }
216     return($a_targets);
217   }
220   function setEntries()
221   {
222     $_target_list = array();
223     if($this->display_server){
224       if (!$this->SubSearch) {
225         $_target_list = array_merge($_target_list,
226               get_list("(&(cn=".$this->regex.")(objectClass=goServer))",
227               "server",get_ou("serverRDN").$this->selectedBase,
228               array("cn","objectClass","description","ipHostNumber","macAddress", "FAIclass"),GL_NONE));
229       }else {
230         $_target_list = array_merge($_target_list,
231               get_sub_list("(&(cn=".$this->regex.")(objectClass=goServer))",
232               "server",get_ou("serverRDN"),$this->selectedBase,
233               array("cn","objectClass","description","ipHostNumber","macAddress", "FAIclass"),GL_SUBSEARCH));
234       }
235     }
236     if($this->display_workstation){
237       if (!$this->SubSearch) {
238         $_target_list = array_merge($_target_list,
239               get_list("(&(cn=".$this->regex.")(objectClass=gotoWorkstation))",
240               "workstation",get_ou("workstationRDN").$this->selectedBase,
241               array("cn","objectClass","description","ipHostNumber","macAddress", "FAIclass"),GL_NONE));
242       }else {
243         $_target_list = array_merge($_target_list,
244               get_sub_list("(&(cn=".$this->regex.")(objectClass=gotoWorkstation))",
245               "workstation",get_ou("workstationRDN"), $this->selectedBase,
246               array("cn","objectClass","description","ipHostNumber","macAddress", "FAIclass"),GL_SUBSEARCH));
247       }
248     }
249     if($this->display_ogroup){
250       if (!$this->SubSearch) {
251         $_target_list = array_merge($_target_list,
252               get_list("(&(cn=".$this->regex.")(member=*)(objectClass=gosaGroupOfNames))",
253               "ogroups",get_ou("ogroupRDN").$this->selectedBase,
254               array("cn","objectClass","description","member", "FAIclass"),GL_NONE));
255       }else {
256         $_target_list = array_merge($_target_list,
257               get_sub_list("(&(cn=".$this->regex.")(member=*)(objectClass=gosaGroupOfNames))",
258               "ogroups",get_ou("ogroupRDN"), $this->selectedBase,
259               array("cn","objectClass","description","member", "FAIclass"),GL_SUBSEARCH));
260       }
261     }
262     $this->_target_list = $_target_list;
264     $tmp = array();
265     foreach($this->_target_list as $key => $object){
266       $tmp[$key] = $object['cn'][0];
267     }
268     natcasesort($tmp);
270     foreach($tmp as $key => $obj){
272       $obj = $this->_target_list[$key];
273       $name = $obj['cn'][0];
274       if(isset($obj['description'])){
275         $name .= "&nbsp;[".$obj['description'][0]."]";
276       }
277       if(isset($obj['macAddress'])){
278         $name .= "&nbsp;- ".$obj['macAddress'][0]."";
279       }
280       if(isset($obj['ipHostNumber'])){
281         $name .= "&nbsp;- ".$obj['ipHostNumber'][0]."";
282       }
284       $img ="";
285       if(in_array("goServer",$obj['objectClass'])){
286         $img = '<img class="center" src="plugins/systems/images/select_server.png" alt="S" title="'._("Server").'">';
288         if($this->filter_iprange){
289           if(!isset($obj['ipHostNumber']) || !tests::is_in_ip_range($this->ipfrom,$this->ipto,             $obj['ipHostNumber'][0])) {
290             continue;
291           }
292         }
294         if($this->filter_mac_addr) {
295           if(!isset($obj['macAddress']) || !ldap_equality_check($obj['macAddress'][0], $this->mac_addr, "[0-9A-F]{2}", FALSE)) {
296             continue;
297           }
298         }
300         if($this->filter_fai_release) {
301           if(isset($obj['FAIclass'])) {
302             $fai_release = split(':', $obj['FAIclass'][0]);
303             if (isset($fai_release[1])) {
304               $fai_release = $fai_release[1];
305             } else {
306               continue;
307             }
309             if (!ldap_equality_check($fai_release, $this->fai_release)) {
310               continue;
311             }
312           }
313           else {
314             continue;
315           }
316         }
318         if ($this->filter_fai_class) {
319           if(isset($obj['FAIclass'])) {
320             $fai_classes = split(':', $obj['FAIclass'][0]);
321             $fai_classes = split(' ', $fai_classes[0]);
323             $found = FALSE;
324             foreach($fai_classes as $used_class) {
325               if(ldap_equality_check($used_class, $this->fai_class)){
326                 $found = TRUE;
327                 break;
328               }
329             }
330             if (!$found) {
331               continue;
332             }
333           }
334           else {
335             continue;
336           }
337         }
339         if(!isset($this->server_list[$obj['dn']])){
340           continue;
341         }
342       }elseif(in_array("gotoWorkstation",$obj['objectClass'])){
343         $img = '<img class="center" src="plugins/systems/images/select_workstation.png" alt="W" title="'._("Workstation").'">';
344         if($this->filter_iprange){
345           if(!isset($obj['ipHostNumber']) || !tests::is_in_ip_range($this->ipfrom,$this->ipto,$obj['ipHostNumber'][0])) {
346             continue;
347           }
348         }
350         if($this->filter_mac_addr){
351           if(!isset($obj['macAddress']) || !ldap_equality_check($obj['macAddress'][0], $this->mac_addr, "[0-9A-F]{2}", FALSE)) {
352             continue;
353           }
354         }
356         if($this->filter_fai_release) {
357           if (isset($obj['FAIclass'])) {
358             $fai_release = split(':', $obj['FAIclass'][0]);
359             if (isset($fai_release[1])) {
360               $fai_release = $fai_release[1];
361             } else {
362               continue;
363             }
364             if (!ldap_equality_check($fai_release, $this->fai_release)) {
365               continue;
366             }
367           }
368           else {
369             continue;
370           }
371         }
373         if ($this->filter_fai_class) {
374           if(isset($obj['FAIclass'])) {
375             $fai_classes = split(':', $obj['FAIclass'][0]);
376             $fai_classes = split(' ', $fai_classes[0]);
378             $found = FALSE;
379             foreach($fai_classes as $used_class) {
380               if(ldap_equality_check($used_class, $this->fai_class)){
381                 $found = TRUE;
382                 break;
383               }
384             }
385             if (!$found) {
386               continue;
387             }
388           }
389           else {
390             continue;
391           }
392         }
394         if(!isset($this->workstation_list[$obj['dn']])){
395           continue;
396         }
397       }elseif(in_array("gosaGroupOfNames",$obj['objectClass'])){
398         /* Do not show object groups if ip or mac filter is enabled */
399         if($this->filter_iprange || $this->filter_mac_addr) {
400           continue;
401         }
403         if($this->filter_fai_release) {
404           if (isset($obj['FAIclass'])) {
405             $fai_release = split(':', $obj['FAIclass'][0]);
406             if (isset($fai_release[1])) {
407               $fai_release = $fai_release[1];
408             } else {
409               continue;
410             }
411             if (!ldap_equality_check($fai_release, $this->fai_release)) {
412               continue;
413             }
414           }
415           else {
416             continue;
417           }
418         }
420         if ($this->filter_fai_class) {
421           if(isset($obj['FAIclass'])) {
422             $fai_classes = split(':', $obj['FAIclass'][0]);
423             $fai_classes = split(' ', $fai_classes[0]);
425             $found = FALSE;
426             foreach($fai_classes as $used_class) {
427               if(ldap_equality_check($used_class, $this->fai_class)){
428                 $found = TRUE;
429                 break;
430               }
431             }
432             if (!$found) {
433               continue;
434             }
435           }
436           else {
437             continue;
438           }
439         }
441         $img = '<img class="center" src="plugins/ogroups/images/select_ogroup.png" alt="O" title="'._("Object group").'">';
442       }
444       $field1 = array("string" => "<input type='checkbox' id='item_selected_".$key."' name='item_selected_".$key."'>",
445                       "attach" => "style='width:20px;'");
446       $field2 = array("string" => $img,
447                       "attach" => "style='width:20px;'");
448       $field3 = array("string" => $name , "attach" => "title='".$obj['dn']."'");
449       $this->AddElement(array($field1,$field2,$field3));
450     }
451   }
453   function AddTextCheckbox($name,$value="Unset", $string="Unset", $default=false, $regexes=array())
454   {
455     $arr = array();
456     $MultiDialogFilters = session::get('MultiDialogFilters');
457     if(isset($MultiDialogFilters[$this->filterName][$name])){
458       $arr['default'] = $MultiDialogFilters[$this->filterName][$name];
459       $this->$name = $arr['default'];
460     }else {
461       $arr['default'] = $default;
462       $this->$name = $default;
463     }
464     $arr['name'] = $name;
465     $arr['string'] = $string;
466     $arr['value'] = $value;
467     $arr['enabled'] = true;
468     $arr['regexes'] = $regexes;
470     $this->array_TextCheckboxes[] = $arr;
472   }
474   function Draw() {
475     $smarty = MultiSelectWindow::Draw();
476     $special_filter = "";
477     foreach($this->array_TextCheckboxes as $textcheckbox) {
478       $special_filter .= "<table style='width:100%;border-top:1px solid #B0B0B0;'><tr><td>";
479       $special_filter .= $this->GetCheckbox($textcheckbox);
480       foreach($textcheckbox['regexes'] as $regex) {
481         $special_filter .= $this->GetRegex($regex, FALSE);
482       }
483       $special_filter .= "</table>";
484     }
485     $smarty->assign("special_filters"   , $special_filter);
486     $display = $smarty->fetch(get_template_path('EventTargetAddList.tpl', TRUE, dirname(__FILE__)));
487     return($display);
488   }
490   /*! \brief  Returns a set of elements selected in a MultiSelectWindow
491     @return Array[integer]=integer
492    */
493   protected  function list_get_selected_items()
494   {
495     $ids = array();
496     foreach($_POST as $name => $value){
497       if(preg_match("/^item_selected_[0-9]*$/",$name)){
498         $id   = preg_replace("/^item_selected_/","",$name);
499         $ids[$id] = $id;
500       }
501     }
502     return($ids);
503   }
505   function save_object()
506   {
507     MultiSelectWindow::save_object();
508     if(isset($_POST['MultiSelectWindow'.$this->filterName])){
509       foreach($this->array_TextCheckboxes as $key => $box) {
510           $MultiDialogFilters = session::get('MultiDialogFilters');
511           if(isset($_POST[$box['name']])){
512               $this->array_TextCheckboxes[$key]['default'] = true;
513               $this->$box['name'] = true;
514           }else{
515               $this->array_TextCheckboxes[$key]['default'] = false;
516               $this->$box['name'] = false;
517           }
518           $MultiDialogFilters[$this->filterName][$box['name']] = $this->$box['name'];
520       foreach($this->array_TextCheckboxes[$key]['regexes'] as $regex_key => $regex_box) {
521           $this->array_TextCheckboxes[$key]['regexes'][$regex_key]['value'] = $_POST[$regex_box['name']];
522           $this->$regex_box['name'] = $_POST[$regex_box['name']];
523           $MultiDialogFilters[$this->filterName][$regex_box['name']] = $this->$regex_box['name'];
524       }
525       session::set('MultiDialogFilters',$MultiDialogFilters);
526       }
527     }
528   }
530 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
531 ?>