Code

Updated get_ou()
[gosa.git] / gosa-plugins / goto / addons / goto / events / class_DaemonEvent.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 define("SCHEDULED_EVENT",1);
24 define("TRIGGERED_EVENT",2);
26 define("HIDDEN_EVENT",1);
27 define("SYSTEM_EVENT",2);
28 define("USER_EVENT"  ,4);
31 /*! \brief    This is the event base class 
32   \author   Fabian Hickert <hickert@gonicus.de>
33   \version  1.00
34   \date     26.02.2008
36   This is the base class for all new daemon events.
37   It implements most of the required functionality.
38  */
39 class DaemonEvent 
40 {
41   /* Menu Strings */
42   protected $s_Menu_Name  = "s_Menu_Name not set";  // Diplayed in the ActionsMenu->CreateNew
43   protected $s_Event_Name = "s_Event_Name not set"; // Will be displayed in the Management list.
44   protected $s_Menu_Image = "images/empty.png";     // Image displayed in Actions->New
45   protected $s_List_Image = "";                     // Image displayed in event listing
47   public $config;          // GOsa configuration object 
48   protected $data;            // The event data, when edited
50   protected $a_targets    = array();  // The list of assigned Targets (When newly created)
51   protected $s_Schedule_Action = "";       // The deamon command name when newly created. (e.g. job_trigger_action_halt)
52   protected $s_Trigger_Action= "";       // The deamon command name when edited. (e.g. trigger_action_halt)
53   protected $s_Queued_Action= "";       // The deamon command name when edited. (e.g. trigger_action_halt)
54   protected $timestamp    = 0;        // Event execution time; 
55   protected $id           = -1;       // The Table ID
56   protected $status       = "unknown";// The current event status
57   protected $is_new       = TRUE;     // Is TRUE if this is a new event
59   protected $mode         = SCHEDULED_EVENT; // Default action is sheduled.
61   /* Sub dialog hanlding */
62   protected $target_listing       = NULL;     // The listing used by the target add dialog
63   protected $target_add_list_used = FALSE;    // Indicates that the target add list was used.
64   protected $time_select_used     = FALSE;    // Indicates that we have used the timestamp select boxes.
65   protected $target_list_used     = FALSE;    // Target list was diaplayed?
66   protected $_target_list         = array();  // Object Cache of those objects displayed in the target add dialog
67   protected $workstation_list     = array();  // Used as cache in the target list.
68   protected $server_list          = array();  // Used as cache in the target list.
70   protected $visible_for          = HIDDEN_EVENT;
72   protected $periodType           = "days";
73   protected $periodValue          = 7;
74   protected $activate_periodical_job = FALSE;
76   protected $attributes           = array("timestamp");
77  
78   function set_type($type)
79   {
80     $this->mode = $type;
81   }
84   function get_type()
85   {
86     return($this->mode);
87   }
89   /*! \brief  Class contructor.
90     @param  Array   GOsa configuration object.
91     @param  Array   Event data, only given when edited.
92    */
93   public function __construct($config,$data = array())
94   {
95     $this->data   = $data;
96     $this->config = $config;
97     timezone::get_default_timezone();
98     $this->timestamp = time();
100     /* Load values from given data */
101     if(count($data)){
102       $this->is_new = FALSE;
104       $attrs = array("id" => "ID");
105       foreach($attrs as $to => $from){
106         $this->$to = $data[$from];
107       }
108       if(isset($data['TIMESTAMP'])){
109         $this->timestamp = $this->_event_to_timestamp($data['TIMESTAMP']);
110       }
111     }
113     if(isset($data['PERIODIC']) && !preg_match("/none/i",$data['PERIODIC'])){
114       $tmp = explode("_",$data['PERIODIC']);
115       if(count($tmp) == 2){
116         $this->activate_periodical_job = TRUE;
117         $this->periodValue = $tmp[0];
118         $this->periodType = $tmp[1];
119       }
120     }
122     // Prepare lists
123     $this->targetList = new sortableListing();
124     $this->targetList->setDeleteable(true);
125     $this->targetList->setInstantDelete(false);
126     $this->targetList->setEditable(false);
127     $this->targetList->setWidth("100%");
128     $this->targetList->setHeight("200px");
129     $this->targetList->setColspecs(array('*'));
130     $this->targetList->setHeader(array(_("Mac")));
131     $this->targetList->setDefaultSortColumn(0);
132     $this->targetList->setAcl('rwcdm');
133   }
136   /*! \brief  Create the HTML output for the plugin. 
137     @return String  The generated HTML output.
138    */
139   public function execute()
140   {
141     $this->time_select_used = FALSE;
142     $this->target_list_used = FALSE;
144     $str = "<h3>"._("This job has no template!")."</h3>";
145     $str.= "<hr>";
146     $str.= "<div class='plugin-actions'>
147       <button type='submit' name='abort_event_dialog'>".msgPool::cancelButton()."</button> </div>";
148     return($str);
149   }
151   /*! \brief  Returns the plugin header, displayed in the template.
152     @return String  HTML header part.
153    */
154   public function get_header()
155   {
156     if($this->target_add_list_used){
157       return("");
158     }
159     $str = "<h3>".sprintf(_("Create '%s' job"),$this->s_Event_Name)."</h3>";
160     return($str);
161   }
164   /*! \brief  Returns the plugin footer (save cancel), displayed in the template.
165     @return String  HTML footer part.
166    */
167   public function get_footer()
168   {
169     if($this->target_add_list_used){
170       return("");
171     }
172     $str = "<hr>";
173     $str.= "<div class='plugin-actions'>
174         <button type='submit' name='save_event_dialog'>".msgPool::saveButton()."</button>&nbsp;
175         <button type='submit' name='abort_event_dialog'>".msgPool::cancelButton()."</button>
176       </div>";
177     return($str);
178   }
181   /*! \brief  Returns HTML representation of a timestamp using <select> boxes. 
182     @return Returns HTML content.
183    */
184   public function get_time_select()
185   {
186     $this->time_select_used = TRUE;
188     $smarty = get_smarty();
190     $year   = date("Y",$this->timestamp);
191     $month  = date("m",$this->timestamp);
192     $day    = date("d",$this->timestamp);
194     $hour   = date("H",$this->timestamp);
195     $minute = date("i",$this->timestamp);
196     $second = date("s",$this->timestamp);
198     $years = array();
199     for($i = date("Y",time()); $i <= 2037 ;$i ++){
200       $years[$i] = $i;
201     }
202     $months = array();
203     for($i = 1; $i <= 12; $i ++){
204       $e = str_pad($i,2,"0",STR_PAD_LEFT);
205       $months[$e] = $e;
206     }
207     $days = array();
208     for($i = 1; $i <= cal_days_in_month(CAL_GREGORIAN,$month,$year); $i ++){
209       $e = str_pad($i,2,"0",STR_PAD_LEFT);
210       $days[$e] = $e;
211     }
212     $hours = array();
213     for($i = 0; $i < 24; $i ++){
214       $e = str_pad($i,2,"0",STR_PAD_LEFT);
215       $hours[$e] = $e;
216     }
217     $minutes = array();
218     for($i = 0; $i < 60; $i ++){
219       $e = str_pad($i,2,"0",STR_PAD_LEFT);
220       $minutes[$e] = $e;
221     }
222     $seconds = array();
223     for($i = 0; $i < 60; $i ++){
224       $e = str_pad($i,2,"0",STR_PAD_LEFT);
225       $seconds[$e] = $e;
226     }
228     $periodTypes = array(
229         "minutes" => _("Minutes"),
230         "hours"   => _("Hours"),
231         "days"    => _("Days"),
232         "weeks"   => _("Weeks"),
233         "months"  => _("Months"));
234     
236     $smarty->assign("periodTypes", $periodTypes);
237     $smarty->assign("periodType", $this->periodType);
238     $smarty->assign("periodValue", $this->periodValue);
239     $smarty->assign("activate_periodical_job", $this-> activate_periodical_job);
241     $smarty->assign("years", $years);
242     $smarty->assign("months", $months);
243     $smarty->assign("days", $days);
244     $smarty->assign("hours", $hours);
245     $smarty->assign("minutes", $minutes);
246     $smarty->assign("seconds", $seconds);
247     $smarty->assign("time_year",$year);
248     $smarty->assign("time_month",$month);
249     $smarty->assign("time_day",$day);
250     $smarty->assign("time_hour",$hour);
251     $smarty->assign("time_minute",$minute);
252     $smarty->assign("time_second",$second);
253     return($smarty->fetch(get_template_path('timestamp_select.tpl', TRUE, dirname(__FILE__))));
254   } 
257   /*! \brief  HTML representation of all currently assigned targets.
258     @return String Returns a listbox with all used targets.
259    */
260   public function get_target_list()
261   {
262     $data = $lData = array();
264     $this->target_list_used = TRUE;
265     foreach($this->a_targets as $key => $target){
266       $data[$key] = $target;
267       $lData[$key] = array('data' => array($target));
268     }
269     $this->targetList->setListData($data, $lData);
270     $this->targetList->update();
271     $list_footer = "<button type='submit' name='open_target_list'>"._("Add")."</button>";
272     return($this->targetList->render().$list_footer);
273   }
276   /*! \brief  Returns HTML content, displaying a dialog which allows to add new targets.
277     @return String HTML content. (EventAddSystemDialog)
278    */
279   public function get_target_add_list()
280   {
281     $this->target_add_list_used = TRUE;
283     if($this->target_listing == NULL){ 
284       $this->target_listing = new EventAddSystemDialog($this->config,$this);
285     }
287     $smarty = get_smarty();
288     $smarty->assign("listing",$this->target_listing->execute());
289     return($smarty->fetch(get_template_path('target_list.tpl', TRUE, dirname(__FILE__))));
290   }
293   /*! \brief  Handles all posted HTML data, including target add,remove...
294    */
295   public function save_object()
296   {
297     if(isset($_POST['open_target_list'])){
298       $this->target_add_list_used =TRUE;
299     }
300     if($this->target_listing != NULL){
301       $this->target_listing->save_object();
302     }
303     if($this->target_add_list_used){
304       if(isset($_POST['abort_target_dialog'])){
305         $this->target_add_list_used =FALSE;
306         $this->target_listing = NULL;
307       }
308       if(isset($_POST['save_target_dialog'])){
309         $this->target_add_list_used =FALSE;
310         $this->add_targets($this->target_listing->get_selected_targets());
311         $this->target_listing = NULL;
312       }
313     }
315     if($this->time_select_used){
316       $time_stamp_values_found = TRUE;
317       foreach(array("time_year","time_month","time_day","time_hour","time_minute","time_second") as $attr){
318         $time_stamp_values_found &= isset($_POST[$attr]);
319       }
320       if($time_stamp_values_found){
321         $this->timestamp = mktime(
322             $_POST['time_hour'],
323             $_POST['time_minute'],        
324             $_POST['time_second'],        
325             $_POST['time_month'],        
326             $_POST['time_day'],        
327             $_POST['time_year']);
329         if(isset($_POST['periodValue'])) $this->periodValue = get_post('periodValue');
330         if(isset($_POST['periodType'])) $this->periodType = get_post('periodType');
332         if(isset($_POST['activate_periodical_job'])){
333           $this->activate_periodical_job = TRUE;
334         }else{
335           $this->activate_periodical_job = FALSE;
336         }
337       }
338     }
340     $this->targetList->save_object();
341     $action = $this->targetList->getAction();
342     if($action['action'] == 'delete'){
343         $id = $this->targetList->getKey($action['targets'][0]);
344         unset($this->a_targets[$id]);
345     } 
346   }
349   /*! \brief  Converts a daemon timestamp into an unix timestamp. \
350     e.g.  20080101125959 -> 1199188799 
351     @param  A daemon timestamp  YYYYddmmHHiiss
352     @return Integer  A unix timestamp.
353    */
354   public function _event_to_timestamp($str)
355   {
356     return(strtotime($str));
357   }
360   /*! \brief  Converts a unix timestamp in to a gosa-si timestamp. \
361     e.g.  1199188799 -> 20080101125959
362     @param  A unix timestamp (e.g. 1199188799)
363     @return Integer  A daemon timestamp (e.g. 20080101125959).
364    */
365   public function _timestamp_to_event($stamp)
366   {
367     return(date("YmdHis",$stamp));
368   }
371   /*! \brief  Returns event information, like menu strings, images ... 
372     @return   Array Event informations.
373    */
374   public function get_event_info()
375   {
376     $data =array();
377     $data['CLASS_NAME']   = get_class($this);
378     $data['s_Menu_Name']  = $this->s_Menu_Name;
379     $data['s_Event_Name'] = $this->s_Event_Name;
380     foreach(array("s_Queued_Action","s_Schedule_Action","s_Trigger_Action") as $attr){
381       if(!empty($this->$attr)){
382         $data[$attr]  = $this->$attr;
383       }
384     }
385     $data['MenuImage']    = "<img src='".$this->s_Menu_Image."' alt='".$this->s_Menu_Name."' border='0' class='center'>";
386     $data['ListImage']    = "<img src='".$this->s_List_Image."' title='".$this->s_Event_Name."' 
387       alt='".$this->s_Event_Name."' border='0' class='center'>";
388     return($data);
389   }
392   /*! \brief  Check if we have opened the target add dialog. 
393     @return   Boolean TRUE if we have opened the target add dialog else FALSE.
394    */
395   protected function is_target_list_open()
396   {
397     return($this->target_add_list_used);
398   }
401   /*! \brief  Returns a complete list of all available events.
402     @return   Array   Containing $this->get_event_info() for all available events.
403    */
404   static function get_event_types_by_category($categories)
405   {
406     $types= array();
408     foreach ($categories as $category) {
409       if (preg_match('/^users$/', $category)) {
410         $types= array_merge($types, DaemonEvent::get_event_types(USER_EVENT));
411       }
412       if (preg_match('/^systems$/', $category)) {
413         $types= array_merge($types, DaemonEvent::get_event_types(SYSTEM_EVENT));
414       }
415     }
417     return $types;
418   }
421   /*! \brief  Returns a complete list of all available events.
422     @return   Array   Containing $this->get_event_info() for all available events.
423    */
424   static function get_event_types($type)
425   {
426     global $class_mapping,$config;
427     $list = array();
428     $list['BY_CLASS']  = array();
429     $list['TRIGGERED'] = array();
430     $list['SCHEDULED'] = array();
431     $list['QUEUED']    = array();
433     foreach($class_mapping as $name => $path){
434       if(preg_match("/^DaemonEvent_/",$name)){
435         $tmp  = new $name($config);
436         if($tmp->visible_for & $type){
437           $evt  = $tmp->get_event_info();
438           $list['BY_CLASS'][$name]                      = $evt;
439           if(isset($evt['s_Trigger_Action'])){
440             $list['TRIGGERED'][$name] = $evt;
441             $list['QUEUED'][$evt['s_Trigger_Action']] = $name;
442           }
443           if(isset($evt['s_Schedule_Action'])){
444             $list['SCHEDULED'][$name] = $evt;
445             $list['QUEUED'][$evt['s_Schedule_Action']] = $name;
446           }
447           if(isset($evt['s_Queued_Action'])){
448             $list['QUEUED'][$evt['s_Queued_Action']] = $name;
449           }
450         }
451       }
452     }
453     return($list);
454   }
457   /*! \brief  Returns TRUE if this event is new. (Not edited)
458     @return Boolean TRUE if new, else FALSE.
459    */
460   public function is_new()
461   {
462     return($this->is_new);
463   }
466   /*! \brief  Returns the event tag to schedule a new action 
467     @param    Returns the event e.g. 'job_trigger_action_wake'
468    */
469   public function get_schedule_action()
470   {
471     return($this->s_Schedule_Action);
472   }
475   /*! \brief  Returns the event tag to schedule a new action 
476     @param    Returns the event e.g. 'trigger_action_wake'
477    */
478   public function get_trigger_action()
479   {
480     return($this->s_Trigger_Action);
481   }
484   /*! brief  Returns an array containig all attributes \
485     That should be written.
486     @return Array e.g. 'status' => 'bla blub'  
487    */ 
488   public function save()
489   {
490     $ret = array();
491     foreach($this->attributes as $attr){
492       $ret[$attr] = $this->$attr;
493     }
494     if($this->mode == SCHEDULED_EVENT){
495       $ret['timestamp'] = $this->_timestamp_to_event($this->timestamp);
496     }elseif(isset($ret['timestamp'])){
497       unset($ret['timestamp']);
498     }
500     if(isset($ret['periodic'])){
501       unset($ret['periodic']);
502     }
503     if($this->activate_periodical_job){
504       $ret['periodic']= $this->periodValue."_".$this->periodType;
505     }
507     return($ret);
508   }
511   /*! \brief  Returns the event targets
512     @return Array  All selected targets.
513    */ 
514   public function get_targets()
515   {
516     return($this->a_targets);
517   }
520   /*! \brief  Returns the event timestamp in GOsa daemon format. 
521     @return Returns the event timestamp (20081231120000)
522    */
523   public function get_timestamp($si_type = TRUE)
524   {
525     if($si_type){
526       return($this->_timestamp_to_event($this->timestamp));
527     }else{
528       return($this->timestamp);
529     }
530   }
533   /*! \brief  Returns the event ID
534     @return Returns the event ID
535    */
536   public function get_id()
537   {
538     if($this->is_new){
539       return(-1);
540     }else{
541       return($this->data['ID']);
542     }
543   }
546   /*! \brief Add a target MAC address 
547       @param Array A List of all target that should be added.
548    */
549   public function set_timestamp($stamp) 
550   {
551     $this->timestamp = $stamp;
552   }
555   /*! \brief Add a target MAC address 
556       @param Array A List of all target that should be added.
557    */
558   public function add_targets($targets) 
559   {
560     foreach($targets as $target){
561       $this->a_targets[] = $target;
562     }
563   }
565   public function check()
566   {
567     return(array());
568   }
571   /*! \brief Update a class variable from outside 
572    */
573   public function set_value($name,$value)
574   {
575     $name = strtolower($name);
576     if(isset($this->$name) && in_array($name,$this->attributes)){
577       $this->$name = $value;
578     }
579   }
582 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
583 ?>