Code

Added possibililty to hide the | character
[gosa.git] / gosa-core / include / class_gosaSupportDaemon.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 gosaSupportDaemon
24 {
25   private $s_host       = "";
26   private $i_port       = 0;
27   private $s_encryption_key = "";
29   private $o_sock       = NULL;
30   private $f_timeout    = 2;
31   private $s_error      = "";
32   private $b_error      = FALSE;
34   private $is_connected     = FALSE;
37   /*! \brief  Creates a new gosaSupportDaemon object.
38     @param string   Host    The Host where the daemon is running on.  
39     @param integer  Port    The port which the daemon use.
40     @param string   Key     The encryption string.
41     @param boolean  Connect Directly connect to daemon socket.
42     @param float    Timeout The timelimit for all socket actions.
43    */
44   public function __construct($connect=TRUE,$timeout=10)
45   {
46     #FIXME: bad idea about referencing global variables from within classes
47     global $config;
49     # load from config, store statically
50     if (isset($config->current['GOSA_SI'])){
52       if ($this->s_host == ""){
53         $this->s_host= preg_replace("/^.*@([^:]+):.*$/", "$1", $config->current['GOSA_SI']);
54         $this->i_port= preg_replace("/^.*@[^:]+:(.*)$/", "$1", $config->current['GOSA_SI']);
55         $this->s_encryption_key = preg_replace("/^(.*)@[^:]+:.*$/", "$1", $config->current['GOSA_SI']);
56       }
58       $this->f_timeout = $timeout;
59       if($connect){
60         $this->connect();
61       }
62     }
63   }
66   /*! \brief  Establish daemon connection. 
67     @return boolean Returns true if the connection was succesfully established. 
68    */
69   public function connect()
70   {
71     if(!empty($this->s_host) && !empty($this->i_port)){
72       $this->o_sock = new Socket_Client($this->s_host,$this->i_port,TRUE,$this->f_timeout);
73       if($this->o_sock->connected()){ 
74         $this->o_sock->setEncryptionKey($this->s_encryption_key); 
75         $this->is_connected = TRUE;
76       }else{
77         $this->set_error($this->o_sock->get_error());
78         $this->disconnect();
79         new log("debug","gosaSupportDaemon::connect()", "Cannot connect to si-server", array(),$this->get_error());
80       }
81     }else{
82       $this->set_error(msgPool::cmdnotfound("GOSA_SI",_("GOsa support daemon")));
83     }
84     return($this->is_connected);
85   }
88   /*! \brief  Disconnect from gosa daemon.
89    */
90   public function disconnect()
91   {
92     $this->o_sock->close();
93     $this->is_connected = FALSE;
94   }
97   /*! \brief  Sets an error message, which can be returned with get_error().
98     @param  string  The Error message,
99    */
100   private function set_error($str)
101   {
102     $this->b_error = TRUE;
103     $this->s_error = $str;
104   }
107   /*! \brief  Sets an error message, which can be returned with get_error().
108     @param  string  The Error message,
109    */
110   private function reset_error()
111   {
112     $this->b_error = FALSE;
113     $this->s_error = "";
114   }
117   /*! \brief  Checks if an error occured.
118     @return boolean returns TRUE or FALSE, whether there is an error or not.
119    */
120   public function is_error()
121   {
122     return($this->b_error);
123   }
126   /*! \brief  Returns the last error. 
127     @return Returns the last error.
128    */
129   public function get_error()
130   {
131     $str = $this->s_error;
132     $str = preg_replace("/ /","&nbsp;",$str);
133     return($str);
134   }
137   public function FAI_get_kernels($release)
138   {
139     $xml_msg = 
140       "<xml>".
141       "<header>gosa_get_available_kernel</header>".
142       "<source>GOSA</source>".
143       "<target>GOSA</target>".
144       "<release>".$release."</release>".
145       "</xml>";
147     $ret = array();
148     if($this->connect()){
149       $this->o_sock->write($xml_msg);
150       $str = trim($this->o_sock->read());
152       /* Check if something went wrong while reading */
153       if($this->o_sock->is_error()){
154         $this->set_error($this->o_sock->get_error());
155         return($ret);
156       }
158       $entries = $this->xml_to_array($str);
159       if(isset($entries['XML']) && is_array($entries['XML'])){
161         /* Check if returned values represent a valid answer */
162         if(isset($entries['XML'])){
163           if(isset($entries['XML']['ERROR_STRING'])) {
164             $this->set_error($entries['XML']['ERROR_STRING']);
165             new log("debug","GOsa-si",
166                 get_class($this)."::".__FUNCTION__, array(),
167                 "FAILED error was ".$this->get_error());
168             return($ret);
169           }
171           /* Unset header tags */
172           $ret = $entries['XML'];
173           foreach($ret as $key => $entry){
174             if(!preg_match("/^answer/i",$key)){
175               unset($ret[$key]);
176             }
177           }
178         }
179       }
180     }
181     return($ret);
182   }
185   public function FAI_get_package_sections($release)
186   {
187     $xml_msg = "<xml><header>gosa_query_packages_list</header><target>GOSA</target><source>GOSA</source>".
188       "<select>distinct section</select>".
189       "<where><clause><phrase><distribution>".$release."</distribution></phrase></clause></where></xml>";
191     $ret = array();
192     if($this->connect()){
193       $this->o_sock->write($xml_msg);
194       $str = trim($this->o_sock->read());
196       /* Check if something went wrong while reading */
197       if($this->o_sock->is_error()){
198         $this->set_error($this->o_sock->get_error());
199         return($ret);
200       }
202       $entries = $this->xml_to_array($str);
203       if(isset($entries['XML']) && is_array($entries['XML'])){
205         /* Check if returned values represent a valid answer */
206         if(isset($entries['XML'])){
207           if(isset($entries['XML']['ERROR_STRING'])) {
208             $this->set_error($entries['XML']['ERROR_STRING']);
209             new log("debug","GOsa-si",
210                 get_class($this)."::".__FUNCTION__, array(),
211                 "FAILED error was ".$this->get_error());
212             return($ret);
213           }
215           /* Unset header tags */
216           foreach(array("HEADER","SOURCE","TARGET","SESSION_ID") as $type){
217             if(isset($entries['XML'][$type])){
218               unset($entries['XML'][$type]);
219             }
220           }
221           $ret = $entries['XML'];
222         }
223       }
224     }
225     return($ret);
226   }
229   public function FAI_get_packages($release,$attrs,$package,$from=-1,$to=-1)
230   {
231     $this->reset_error();
232     $ret = array();
234     /* Check Parameter */
235     if(!is_array($attrs) || !count($attrs)){
236       trigger_error("Second parameter must be an array. With at least one attribute name.");
237       return($ret);
238     }
240     /* Check Parameter */
241     if(!is_array($package)){
242       trigger_error("Third parameter must be an array. With at least one attribute name.");
243       return($ret);
244     }
246     /* Create list of attributes to fetch */
247     $attr = ""; 
248     foreach($attrs as $at){
249       $attr.= "<select>".$at."</select>";
250     }
252     /* If no package is given, search for all */
253     if(!count($package)) $package = array("%");
255     /* Create limit tag */
256     if($from == -1){
257       $limit =""; 
258     }else{
259       $limit = "<limit><from>".$from."</from><to>".$to."</to></limit>";
260     }
262     /* Create list of attributes to fetch */
263     $pkgs = ""; 
264     foreach($package as $pkg){
265       $pkgs .="<phrase><operator>like</operator><package>".$pkg."</package></phrase>";
266     }
268     $xml_msg = "<xml><header>gosa_query_packages_list</header><target>GOSA</target><source>GOSA</source>".
269       $attr.
270       "<where>
271       <clause><phrase><distribution>".$release."</distribution></phrase></clause>
272       <clause><connector>OR</connector>
273       ".$pkgs."
274       </clause>
275       </where>".
276       $limit.
277       "</xml>";
279     if($this->connect()){
280       $this->o_sock->write($xml_msg);
281       $str = trim($this->o_sock->read());
283       /* Check if something went wrong while reading */
284       if($this->o_sock->is_error()){
285         $this->set_error($this->o_sock->get_error());
286         return($ret);
287       }
289       $entries = $this->xml_to_array($str);
290       if(isset($entries['XML']) && is_array($entries['XML'])){
292         /* Check if returned values represent a valid answer */
293         if(isset($entries['XML'])){
294           if(isset($entries['XML']['ERROR_STRING'])) {
295             $this->set_error($entries['XML']['ERROR_STRING']);
296             new log("debug","GOsa-si",
297                 get_class($this)."::".__FUNCTION__, array(),
298                 "FAILED error was ".$this->get_error());
299             return($ret);
300           }
302           /* Unset header tags */
303           foreach(array("HEADER","SOURCE","TARGET","SESSION_ID") as $type){
304             if(isset($entries['XML'][$type])){
305               unset($entries['XML'][$type]);
306             }
307           }
308           $ret = $entries['XML'];
309         }
310       }
311     }
312     return($ret);
314     
315   }
318   public function FAI_get_server($name = "")
319   {
320     $this->reset_error();
322     $xml_msg = "<xml><header>gosa_query_fai_server</header><target>GOSA</target><source>GOSA</source></xml>";
323     $ret = array();
324     if($this->connect()){
325       $this->o_sock->write($xml_msg);
326       $str = trim($this->o_sock->read());
328       /* Check if something went wrong while reading */
329       if($this->o_sock->is_error()){
330         $this->set_error($this->o_sock->get_error());
331         return($ret);
332       }
334       $entries = $this->xml_to_array($str);
335       if(isset($entries['XML']) && is_array($entries['XML'])){
337         /* Check if returned values represent a valid answer */
338         if(isset($entries['XML'])){
339           if(isset($entries['XML']['ERROR_STRING'])) {
340             $this->set_error($entries['XML']['ERROR_STRING']);
341             new log("debug","GOsa-si", 
342               get_class($this)."::".__FUNCTION__, array(),
343               "FAILED error was ".$this->get_error());
344             return($ret);
345           }
347           /* Unset header tags */
348           foreach(array("HEADER","SOURCE","TARGET","SESSION_ID") as $type){
349             if(isset($entries['XML'][$type])){
350               unset($entries['XML'][$type]);
351             }
352           }
353           $ret = $entries['XML']; 
354         }
355       }
356     }
357     return($ret);
358   }
361   public function FAI_get_classes($name)
362   {
363     $this->reset_error();
364     $xml_msg = "<xml><header>gosa_query_fai_release</header><target>GOSA</target><source>GOSA</source>".
365                   "<where><clause><phrase><release>".$name."</release></phrase></clause></where></xml>";;
366     $ret = array();
367     if($this->connect()){
368       $this->o_sock->write($xml_msg);
369       $str = trim($this->o_sock->read());
371       /* Check if something went wrong while reading */
372       if($this->o_sock->is_error()){
373         $this->set_error($this->o_sock->get_error());
374         return($ret);
375       }
377       $entries = $this->xml_to_array($str);
378       if(isset($entries['XML']) && is_array($entries['XML'])){
380         /* Check if returned values represent a valid answer */
381         if(isset($entries['XML'])){
382           if(isset($entries['XML']['ERROR_STRING'])) {
383             $this->set_error($entries['XML']['ERROR_STRING']);
384             new log("debug","GOsa-si", 
385               get_class($this)."::".__FUNCTION__, array($name),
386               "FAILED error was ".$this->get_error());
387             return($ret);
388           }
390           /* Unset header tags */
391           foreach(array("HEADER","SOURCE","TARGET","SESSION_ID") as $type){
392             if(isset($entries['XML'][$type])){
393               unset($entries['XML'][$type]);
394             }
395           }
396           $ret = $entries['XML']; 
397         }
398       }
399     }
400     return($ret);
401   }
404   /*! \brief  Returns an array containing all queued entries.
405     @return Array All queued entries as an array.
406    */
407   public function get_queued_entries($event_types = array("*"),$from=-1,$to=-1,$sort="timestamp DESC")
408   {
409     $this->reset_error();
410     $ret = array();
412     $tags = "";
413     foreach($event_types as $type){
414       $tags .= "<phrase><headertag>".$type."</headertag></phrase>";
415     }
416     if(count($event_types) > 1){
417       $tags = "<connector>or</connector>".$tags;
418     }
419     if(count($event_types)){
420       $tags = "<where><clause>".$tags."</clause></where>";
421     }
423     $xml_msg = 
424       "<xml>
425       <header>gosa_query_jobdb</header>
426       <target>GOSA</target>
427       <source>GOSA</source>
428       ".$tags."
430       <orderby>".$sort."</orderby>";
431     if($from != -1 && $to != -1){
432       $xml_msg.= "
433         <limit>
434         <from>".$from."</from>
435         <to>".$to."</to>
436         </limit>";
437     }
438     $xml_msg.= "
439       </xml>";
441     if($this->connect()){
442       $this->o_sock->write($xml_msg);
443       $str = trim($this->o_sock->read());
445       /* Check if something went wrong while reading */
446       if($this->o_sock->is_error()){
447         $this->set_error($this->o_sock->get_error());
448         return($ret);
449       }
451       $entries = $this->xml_to_array($str);
452       if(isset($entries['XML']) && is_array($entries['XML'])){
454         /* Check if returned values represent a valid answer */
455         if(isset($entries['XML'])){
456           
457           /* Unset header tags */
458           foreach(array("HEADER","SOURCE","TARGET") as $type){
459             unset($entries['XML'][$type]);
460           }
461           $ret = $entries['XML']; 
462         }
463       }
464     }
465     
466     /* Remove session ID. No one is interested in this... */
467     unset($ret['SESSION_ID']);
469     return($ret);
470   }
473   /*! \brief  Checks if the given ids are used queue ids.
474     @param  Array   The ids we want to check..
475     @return Array   An array containing all ids as index and TRUE/FALSE as value. 
476    */
477   public function ids_exist($ids)
478   {
479     if(!is_array($ids)){
480       trigger_error("Requires an array as parameter.");
481       return;
482     }
483     $this->reset_error();
485     $ret = array();
487     $xml_msg = "<xml>
488       <header>gosa_query_jobdb</header>
489       <target>GOSA</target>
490       <source>GOSA</source>
491       <where>
492       <clause>
493       <connector>or</connector>";
494     foreach($ids as $id){
495       $xml_msg .= "<phrase>
496         <operator>eq</operator>
497         <id>".$id."</id>
498         </phrase>";
499     }
500     $xml_msg .= "</clause>
501       </where>
502       </xml>";
504     if($this->connect()){
505       $this->o_sock->write($xml_msg);
506       $str = trim($this->o_sock->read());
508       /* Check if something went wrong while reading */
509       if($this->o_sock->is_error()){
510         $this->set_error($this->o_sock->get_error());
511         return($ret);
512       }
514       $entries = $this->xml_to_array($str);
515       if(isset($entries['XML']) && is_array($entries['XML'])){
516         foreach($entries['XML'] as $entry){
517           if(isset($entry['ID'])){
518             $ret[] = $entry['ID'];
519           }
520         }
521       }
522     }
523     return($ret);
524   }
527   /*! \brief  Returns an entry containing all requested ids.
528     @param  Array   The IDs of the entries we want to return.
529     @return Array   Of the requested entries. 
530    */
531   public function get_entries_by_mac($macs)
532   {
533     if(!is_array($macs)){
534       trigger_error("Requires an array as parameter.");
535       return;
536     }
537     $this->reset_error();
539     $ret = array();
541     $xml_msg = "<xml>
542       <header>gosa_query_jobdb</header>
543       <target>GOSA</target>
544       <source>GOSA</source>
545       <where>
546       <clause>
547       <connector>or</connector>";
548     foreach($macs as $mac){
549       $xml_msg .= "<phrase>
550         <operator>eq</operator>
551         <macaddress>".$mac."</macaddress>
552         </phrase>";
553     }
554     $xml_msg .= "</clause>
555       </where>
556       </xml>";
558     if($this->connect()){
559       $this->o_sock->write($xml_msg);
560       $str = trim($this->o_sock->read());
562       /* Check if something went wrong while reading */
563       if($this->o_sock->is_error()){
564         $this->set_error($this->o_sock->get_error());
565         return($ret);
566       }
568       $entries = $this->xml_to_array($str); 
569       if(isset($entries['XML'])){
570         foreach($entries['XML'] as $name => $entry){
571           if(preg_match("/^ANSWER[0-9]*$/",$name)){
572             $ret[$name] = $entry;
573           }
574         }
575       }
576     }
577     return($ret);
578   }
581   /*! \brief  Returns an entry containing all requested ids.
582     @param  Array   The IDs of the entries we want to return.
583     @return Array   Of the requested entries. 
584    */
585   public function get_entries_by_id($ids)
586   {
587     if(!is_array($ids)){
588       trigger_error("Requires an array as parameter.");
589       return;
590     }
591     $this->reset_error();
593     $ret = array();
595     $xml_msg = "<xml>
596       <header>gosa_query_jobdb</header>
597       <target>GOSA</target>
598       <source>GOSA</source>
599       <where>
600       <clause>
601       <connector>or</connector>";
602     foreach($ids as $id){
603       $xml_msg .= "<phrase>
604         <operator>eq</operator>
605         <id>".$id."</id>
606         </phrase>";
607     }
608     $xml_msg .= "</clause>
609       </where>
610       </xml>";
612     if($this->connect()){
613       $this->o_sock->write($xml_msg);
614       $str = trim($this->o_sock->read());
616       /* Check if something went wrong while reading */
617       if($this->o_sock->is_error()){
618         $this->set_error($this->o_sock->get_error());
619         return($ret);
620       }
622       $entries = $this->xml_to_array($str); 
623       if(isset($entries['XML'])){
624         foreach($entries['XML'] as $name => $entry){
625           if(preg_match("/^ANSWER[0-9]*$/",$name)){
626             $ret[$name] = $entry;
627           }
628         }
629       }
630     }
631     return($ret);
632   }
635   /*! \brief  Checks if the given id is in use.
636     @param  Integer The ID of the entry.
637     @return Boolean TRUE if entry exists. 
638    */
639   public function id_exists($id)
640   {
641     if(!is_numeric($id)){
642       trigger_error("Requires an integer as parameter.");
643       return;
644     }
646     $this->reset_error();
648     $xml_msg = "<xml>
649       <header>gosa_query_jobdb</header>
650       <target>GOSA</target>
651       <source>GOSA</source>
652       <where>
653       <clause>
654       <phrase>
655       <operator>eq</operator>
656       <id>".$id."</id>
657       </phrase>
658       </clause>
659       </where>
660       </xml>";
662     if($this->connect()){
663       $this->o_sock->write($xml_msg);
664       $str = trim($this->o_sock->read());
666       /* Check if something went wrong while reading */
667       if($this->o_sock->is_error()){
668         $this->set_error($this->o_sock->get_error());
669         return(FALSE);
670       }
672       $entries = $this->xml_to_array($str); 
673       if( isset($entries['XML']['HEADER']) && 
674           $entries['XML']['HEADER']=="answer" && 
675           isset($entries['XML']['ANSWER1'])){
676         return(TRUE);
677       }
678     }
679     return(FALSE);
680   }
683   /*! \brief  Returns an entry from the gosaSupportQueue
684     @param  Integer The ID of the entry we want to return.
685     @return Array   Of the requested entry. 
686    */
687   public function get_entry_by_id($id)
688   {
689     if(!is_numeric($id)){
690       trigger_error("Requires an integer as parameter.");
691       return;
692     }
693     $this->reset_error();
694   
695     $ret = array();
696     $xml_msg = "<xml>
697       <header>gosa_query_jobdb</header>
698       <target>GOSA</target>
699       <source>GOSA</source>
700       <where>
701       <clause>
702       <phrase>
703       <operator>eq</operator>
704       <id>".$id."</id>
705       </phrase>
706       </clause>
707       </where>
708       </xml>";
709     if($this->connect()){
710       $this->o_sock->write($xml_msg);
711       $str = trim($this->o_sock->read());
713       /* Check if something went wrong while reading */
714       if($this->o_sock->is_error()){
715         $this->set_error($this->o_sock->get_error());
716         return($ret);
717       }
719       $entries = $this->xml_to_array($str); 
720       if( isset($entries['XML']['HEADER']) &&
721           $entries['XML']['HEADER']=="answer" &&
722           isset($entries['XML']['ANSWER1'])){
723         $ret = $entries['XML']['ANSWER1'];
724       }
725     }
726     return($ret);
727   }
730   /*! \brief  Removes a set of entries from the GOsa support queue. 
731     @param  Array The IDs to remove.
732     @return Boolean True on success.
733    */
734   public function remove_entries($ids)
735   {
736     if(!is_array($ids)){
737       trigger_error("Requires an array as parameter.");
738       return;
739     }
741     $this->reset_error();
743     $ret = array();
745     $xml_msg = "<xml>
746       <header>gosa_delete_jobdb_entry</header>
747       <target>GOSA</target>
748       <source>GOSA</source>
749       <where>
750       <clause>
751       <connector>or</connector>";
752     foreach($ids as $id){
753       $xml_msg .= "<phrase>
754         <operator>eq</operator>
755         <id>".$id."</id>
756         </phrase>";
757     }
758     $xml_msg .= "</clause>
759       </where>
760       </xml>";
762     if($this->connect()){
763       $this->o_sock->write($xml_msg);
764       $str = $this->o_sock->read();
766       /* Check if something went wrong while reading */
767       if($this->o_sock->is_error()){
768         $this->set_error($this->o_sock->get_error());
769         return($ret);
770       }
772       $entries = $this->xml_to_array($str);
773       if(isset($entries['XML']) || isset($entries['COUNT'])){
774         new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::remove_entries()", $ids,"SUCCESS");
775         return(TRUE);
776       }else{
777         new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::remove_entries()", $ids,"FAILED ".$this->get_error());
778       }
779     }
780     return(FALSE);
781   }
785   /*! \brief  Removes an entry from the GOsa support queue. 
786     @param  Integer The ID of the entry we want to remove.
787     @return Boolean True on success.
788    */
789   public function remove_entry($id)
790   {
791     return($this->remove_entries(array($id)));
792   }
795   /*! \brief  Parses the given xml string into an array 
796     @param  String XML string  
797     @return Array Returns an array containing the xml structure. 
798    */
799   private function xml_to_array($xml)
800   {
801     $params = array();
802     $level = array();
803     $parser  = xml_parser_create_ns();
804     xml_parse_into_struct($parser, $xml, $vals, $index);
806     $err_id = xml_get_error_code($parser);
807     if($err_id){
808       xml_parser_free($parser);
809     }else{
810       xml_parser_free($parser);
812       foreach ($vals as $xml_elem) {
813         if ($xml_elem['type'] == 'open') {
814           if (array_key_exists('attributes',$xml_elem)) {
815             list($level[$xml_elem['level']],$extra) = array_values($xml_elem['attributes']);
816           } else {
817             $level[$xml_elem['level']] = $xml_elem['tag'];
818           }
819         }
820         if ($xml_elem['type'] == 'complete') {
821           $start_level = 1;
822           $php_stmt = '$params';
823           while($start_level < $xml_elem['level']) {
824             $php_stmt .= '[$level['.$start_level.']]';
825             $start_level++;
826           }
827           $php_stmt .= '[$xml_elem[\'tag\']] = $xml_elem[\'value\'];';
828           @eval($php_stmt);
829         }
830       }
831     }
833     if(!isset($params['XML'])){
834       if (!array_key_exists('XML', $params)){
835         $this->set_error(_("Cannot not parse XML!"));
836       }
837       $params = array("COUNT" => 0);
838     }
840     return($params); 
841   }
844   /*! \brief  Updates an entry with a set of new values, 
845     @param  Integer The ID of the entry, we want to update.
846     @param  Array   The variables to update.   
847     @return Boolean Returns TRUE on success. 
848    */
849   public function update_entries($ids,$data)
850   {
851     $this->reset_error();
852     if(!is_array($ids)){
853       trigger_error("Requires an array as first parameter.");
854       return;
855     }
857     if(!is_array($data)){
858       trigger_error("Requires an array as second parameter.");
859       return;
860     }
862     $attr = "";
863     foreach($data as $key => $value){
864       if(is_array($value)){
865         foreach($value as $sub_value){
866           $attr.= "<$key>".strtolower($sub_value)."</$key>\n";
867         }
868       }else{
869         $attr.= "<$key>".strtolower($value)."</$key>\n";
870       }
871     }
873     $xml_msg = "<xml>
874       <header>gosa_update_status_jobdb_entry</header>
875       <target>GOSA</target>
876       <source>GOSA</source>
877       <where>
878       <clause>
879       <connector>or</connector>";
880     foreach($ids as $id){
881       $xml_msg .= "<phrase>
882         <operator>eq</operator>
883         <id>".$id."</id>
884         </phrase>";
885     }
886     $xml_msg .= "</clause>
887       </where>
888       <update>
889       ".$attr." 
890       </update>
891       </xml>";
893     if($this->connect()){
895       $this->o_sock->write($xml_msg);
896       $str      = trim($this->o_sock->read());
898       /* Check if something went wrong while reading */
899       if($this->o_sock->is_error()){
900         $this->set_error($this->o_sock->get_error());
901         return(FALSE);
902       }
904       $entries = $this->xml_to_array($str);
905       if(isset($entries['XML'])){
906         if(isset($entries['XML']['ERROR_STRING'])) {
907           $this->set_error($entries['XML']['ERROR_STRING']);
908           new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::update_entries()", $ids,"FAILED setting (".$attr.") error was ".$this->get_error());
909           return(FALSE);
910         }
911         new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::update_entries()", $ids,"SUCCESS");
912         return(TRUE);
913       }
914     }
915     return(FALSE);
916   }
919   /*! \brief  Returns the number of currently queued objects.
920       @return Integer  
921    */
922   public function number_of_queued_entries($event_types)
923   {
924     $tags = "";
925     foreach($event_types as $type){
926       $tags .= "<phrase><headertag>".$type."</headertag></phrase>";
927     }
928     if(count($event_types) > 1){
929       $tags = "<connector>or</connector>".$tags;
930     }
931     if(count($event_types)){
932       $tags = "<where><clause>".$tags."</clause></where>";
933     }
936     $xml_msg =
937       "<xml>".
938       "<header>gosa_query_jobdb</header>".
939       "<target>GOSA</target>".
940       "<source>GOSA</source>".
941       "<select> count ID</select>".
942       $tags.
943       "</xml>";
945     $xml_msg ="<xml><header>gosa_count_jobdb</header><target>GOSA</target><source>GOSA</source></xml>";
946     $this->connect();
947     if($this->connect()){
948       $this->o_sock->write($xml_msg);
949       $str     = trim($this->o_sock->read());
951       /* Check if something went wrong while reading */
952       if($this->o_sock->is_error()){
953         $this->set_error($this->o_sock->get_error());
954         return(0);
955       }
957       $entries = $this->xml_to_array($str);
958       if(isset($entries['XML'])){
959         return($entries['XML']['COUNT']);
960       }
961     }
962     return(-1);
963   } 
966   public function send_data($header, $to, $data= array(), $answer_expected = FALSE)
967   {
968     $xml_message= "";
970     /* Prepare data */
971     foreach ($data as $key => $value){
972       if(is_array($value)){
973         foreach($value as $sub_value){
974           $xml_message.= "<$key>$sub_value</$key>";
975         }
976       }else{
977         $xml_message.= "<$key>$value</$key>";
978       }
979     }
981     /* Multiple targets? */
982     if (!is_array($to)){
983       $to_targets= array($to);
984     } else {
985       $to_targets= $to;
986     }
988     /* Build target strings */
989     $target ="";
990     foreach($to_targets as $to){
991       $target.= "<target>$to</target>";
992     }
994     return $this->_send("<xml><header>$header</header><source>GOSA</source>$target".$xml_message."</xml>",$answer_expected);
995   }
998   /* Allows simply appending a new DaemonEvent 
999    */
1000   public function append($event)
1001   {
1002     if(!($event instanceof DaemonEvent)){
1003       return(FALSE);
1004     }
1005   
1006     $this->reset_error();
1008     /* Add to queue if new 
1009      */
1010     if($event->is_new()){
1012       $request_answer = FALSE;
1013       if($event->get_type() == SCHEDULED_EVENT){
1014         $action = $event->get_schedule_action();
1015       }elseif($event->get_type() == TRIGGERED_EVENT){
1016         $action = $event->get_trigger_action();
1017       }else{
1018         trigger_error("Unknown type of queue event given.");
1019         return(FALSE);
1020       }
1022       /* Get event informations, like targets..
1023        */
1024       $targets    = $event->get_targets();
1025       $data       = $event->save();
1027       /* Append an entry for each target 
1028        */
1029       foreach($targets as $target){
1030         $data['macaddress'] = $target;
1031         $this->send_data($action,$target,$data,$request_answer);
1033         if($this->is_error()){
1034           return(FALSE);
1035         }
1036       }
1037       return(TRUE);
1038     }else{
1040       /* Updated edited entry.
1041        */
1042       $id                 = $event->get_id();
1043       $data               = $event->save();
1044       return($this->update_entries(array($id),$data));
1045     }
1047     return(FALSE);
1048   }
1051 /*! \brief  Returns an array containing all queued entries.
1052     @return Array All queued entries as an array.
1053    */
1054   public function _send($data, $answer_expected= FALSE)
1055   {
1056     $this->reset_error();
1057     $ret = array();
1059     if($this->connect()){
1060       $this->o_sock->write($data);
1061       if ($answer_expected){
1062         $str = trim($this->o_sock->read());
1064         /* Check if something went wrong while reading */
1065         if($this->o_sock->is_error()){
1066           $this->set_error($this->o_sock->get_error());
1067           return($ret);
1068         }
1070         $entries = $this->xml_to_array($str);
1071         if(isset($entries['XML']) && is_array($entries['XML'])){
1072           $ret = $entries;
1073           if(isset($entries['XML']['ERROR_STRING'])) {
1074             $this->set_error($entries['XML']['ERROR_STRING']);
1075             new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", array($data=>$data),"FAILED ".$this->get_error());
1076           }else{
1077             new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", array($data=>$data),"SUCCESS");
1078           }
1079         }
1080       }else{
1081         new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", array($data=>$data),"Fire & forget, not result.! ".$this->get_error());
1082       }
1083     }
1084     return($ret);
1085   }
1088   static function send($header, $to, $data= array(), $answer_expected = FALSE)
1089   {
1090     $xml_message= "";
1092     /* Get communication object */
1093     $d= new gosaSupportDaemon(TRUE,10);
1095     /* Prepare data */
1096     foreach ($data as $key => $value){
1097       if(is_array($value)){
1098         foreach($value as $sub_val){
1099           $xml_message.= "<$key>$sub_value</$key>";
1100         }
1101       }else{
1102         $xml_message.= "<$key>$value</$key>";
1103       }
1104     }
1106     /* Multiple targets? */
1107     if (!is_array($to)){
1108       $to_targets= array($to);
1109     } else {
1110       $to_targets= $to;
1111     }
1113     /* Build target strings */
1114     $target ="";
1115     foreach($to_targets as $to){
1116       $target.= "<target>$to</target>";
1117     }
1119     return $d->_send("<xml><header>$header</header><source>GOSA</source>$target".$xml_message."</xml>",$answer_expected);
1120   }
1123   /*! \brief  Removes all jobs from the queue that are tiggered with a specific macAddress.
1124       @param  String  $mac  The mac address for which we want to remove all jobs.      
1125    */
1126   function clean_queue_from_mac($mac)
1127   {
1128     global $config;
1130     /* First of all we have to check which jobs are startet 
1131      *  for $mac 
1132      */
1133     $xml_msg ="<xml><header>gosa_query_jobdb</header><target>GOSA</target><source>GOSA</source><where><clause><phrase><macaddress>".$mac."</macaddress></phrase></clause></where></xml>";  
1134     
1135     new log("debug","DaemonEvent ", "gosaSupportDaemon::clean_queue_from_mac()", array($mac => $mac)," start cleaning.");
1136  
1137     $data = $this->_send($xml_msg,TRUE);
1138     if(is_array($data) && isset($data['XML'])){
1139       $already_aborted = FALSE;
1140       foreach($data['XML']  as $name => $entry){
1141         if(preg_match("/answer[0-9]*/i",$name)){
1142           $entry['STATUS'] = strtoupper($entry['STATUS']);
1143           switch($entry['STATUS']){
1145             case 'PROCESSING' :
1147               /* Send abort event, but only once 
1148                */
1149               if($already_aborted){
1150                 break;
1151               }elseif(class_available("DaemonEvent_faireboot")){
1152                 $already_aborted = TRUE;
1153                 $tmp = new DaemonEvent_faireboot($config);
1154                 $tmp->add_targets(array($mac));
1155                 $tmp->set_type(TRIGGERED_EVENT);
1156                 if(!$this->append($tmp)){
1157                   msg_dialog::display(_("Error"), sprintf(_("Cannot send abort event for entry %s!"),$entry['ID']) , ERROR_DIALOG);
1158                   new log("debug","DaemonEvent ", "gosaSupportDaemon::clean_queue_from_mac()", array($mac => $mac),
1159                       "FAILED, could not send 'DaemonEvent_faireboot' for entry ID (".$entry['ID'].") - ".$this->get_error());
1160                 }else{
1161                   new log("debug","DaemonEvent ", "gosaSupportDaemon::clean_queue_from_mac()", array($mac => $mac),
1162                       "SUCCESS, send 'DaemonEvent_faireboot' for entry ID (".$entry['ID'].")");
1163                 }
1164                 ;break;
1165               }else{
1166                 /* Couldn't find abort event, just remove entry */
1167               }
1169             case 'WAITING':
1170             case 'ERROR':
1171             default :
1172             
1173               /* Simply remove entries from queue. 
1174                *  Failed or waiting events, can be removed without any trouble.
1175                */ 
1176               if(!$this->remove_entries(array($entry['ID']))){
1177                 msg_dialog::display(_("Error"), sprintf(_("Cannot remove entry %s!"),$entry['ID']) , ERROR_DIALOG);
1178               }
1179               ;break;
1180           }
1181     
1182         }
1183       }
1184     }
1185   }
1188 static function ping($target)
1190   if (tests::is_mac($target)){
1191     /* Get communication object */
1192     $d= new gosaSupportDaemon(TRUE,0.5);
1193     $answer= $d->_send("<xml><header>gosa_ping</header><source>GOSA</source><target>$target</target></xml>", TRUE);
1194     return (count($answer) ? TRUE:FALSE);
1195   }
1197   return (FALSE);
1202 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
1203 ?>