Code

Updated deamon and socket client.
[gosa.git] / gosa-core / include / class_gosaSupportDaemon.inc
1 <?php
3 class gosaSupportDaemon
4 {
5   private $o_sock       = NULL;
6   private $s_host       = "";
7   private $i_port       = 0;
8   private $f_timeout    = 0.2;
10   private $is_connected     = FALSE;
11   private $s_encryption_key = "";
13   private $s_error  = "";
14   private $b_error  = FALSE;
17   /*! \brief  Creates a new gosaSupportDaemon object.
18       @param string   Host    The Host where the deamon is running on.  
19       @param integer  Port    The port which the deamon use.
20       @param string   Key     The encryption string.
21       @param boolean  Connect Directly connect to deamon socket.
22       @param float    Timeout The timelimit for all socket actions.
23    */
24   public function __construct($host,$port,$key="secret-gosa-password",$connect=TRUE,$timeout=0.2)
25   {
26     $this->s_host    = $host;
27     $this->i_port    = $port;
28     $this->f_timeout = $timeout;
29     $this->s_encryption_key = $key;
30     if($connect){
31       $this->connect();
32     }
33   }
36   /*! \brief  Establish deamon connection. 
37       @return boolean Returns true if the connection was succesfully established. 
38    */
39   public function connect()
40   {
41     $this->o_sock = new Socket_Client($this->s_host,$this->i_port,TRUE,$this->f_timeout);
42     if($this->o_sock->connected()){ 
43       $this->o_sock->setEncryptionKey($this->s_encryption_key); 
44       $this->is_connected = TRUE;
45     }else{
46       $this->error = $this->o_sock->get_error();
47       $this->is_connected = FALSE;
48     }
49   }
52   /*! \brief  Disconnect from gosa deamon.
53    */
54   public function disconnect()
55   {
56     $this->o_sock->close();
57     $this->is_connected = FALSE;
58   }
61   /*! \brief  Sets an error message, which can be returned with get_error().
62       @param  string  The Error message,
63    */
64   private function set_error($str)
65   {
66     $this->b_error = TRUE;
67     $this->s_error = $str;
68   }
71   /*! \brief  Checks if an error occured.
72       @return boolean returns TRUE or FALSE, whether there is an error or not.
73    */
74   public function is_error()
75   {
76     return($this->b_error);
77   }
80   /*! \brief  Returns the last error. 
81       @return Returns the last error.
82    */
83   public function get_error()
84   {
85     return($this->s_error);
86   }
89   /*! \brief  Returns an array containing all queued entries.
90       @return Array All queued entries as an array.
91    */
92   public function get_queued_entries()
93   {
94     $this->b_error = FALSE;
95     $this->s_error = "";
98     $xml_msg = "<xml>
99                   <header>gosa_query_jobdb</header>
100                   <where>
101                     <clause>
102                       <phrase>
103                         <operator>gt</operator>
104                         <id>-1</id>
105                       </phrase>
106                     </clause>
107                   </where>
108                 </xml>";
110     $this->connect();
111     if($this->is_connected){
112       $this->o_sock->write($xml_msg);
113       $str = trim($this->o_sock->read());
114       $entries = $this->xml_to_array($str);
116       if(!array_key_exists("XML",$entries)){
117         $this->set_error("!!!Couldn't parse xml.");
118         $this->disconnect();
119         return;
120       }else{
121         if(!is_array($entries['XML'])) {
122           $ret = array();
123         }else{
124           $ret = $entries['XML']; 
125         }
126       }
127       return($ret);
128     }
129     $this->set_error("Could not establish socket connection.");
130     $this->disconnect();
131     return;
132   }
135   /*! \brief  Checks if the given id is in use.
136       @param  Integer The ID of the entry.
137       @return Boolean TRUE if entry exists. 
138    */
139   public function id_exists($id)
140   {
141     if(!is_numeric($id)){
142       trigger_error("gosaSupportDaemon::get_entry() requires an integer value as ID parameter.");
143       return;
144     }
146     $this->b_error = FALSE;
147     $this->s_error = "";
148     $xml_msg = "<xml>
149                   <header>gosa_query_jobdb</header>
150                   <where>id</where>
151                   <id>".$id."</id>
152                 </xml>";
153     $this->connect();
154     if(!$this->is_connected){
155       $this->set_error("Could not establish socket connection.");
156     }else{
157       $this->o_sock->write($xml_msg);
158       $str = trim($this->o_sock->read());
159       $entries = $this->xml_to_array($str); 
160       if(isset($entries['XML']['ANSWER1'])){
161         $this->disconnect();
162         return(TRUE);
163       }
164     }
165     $this->disconnect();
166     return(FALSE);
167   }
169   
170   /*! \brief  Returns an entry from the gosaSupportQueue
171       @param  Integer The ID of the entry we want to return.
172       @return Array   Of the requested entry. 
173    */
174   public function get_entry($id)
175   {
176     if(!is_numeric($id)){
177       trigger_error("gosaSupportDaemon::get_entry() requires an integer value as ID parameter.");
178       return;
179     }
181     $this->b_error = FALSE;
182     $this->s_error = "";
183     $xml_msg = "<xml>
184                   <header>gosa_query_jobdb</header>
185                   <where>id</where>
186                   <id>".$id."</id>
187                 </xml>";
188     $this->connect();
189     if(!$this->is_connected){
190       $this->set_error("Could not establish socket connection.");
191     }else{
192       $this->o_sock->write($xml_msg);
193       $str = trim($this->o_sock->read());
194       $entries = $this->xml_to_array($str); 
195       if(!isset($entries['XML']['ANSWER1'])){
196         $this->set_error("Entry with id (".$id.") not found.");
197         $this->disconnect();
198       }else{
199         $ret = $entries['XML']['ANSWER1'];
200         return($ret);
201       }
202     }
203     return;
204   }
207   /*! \brief  Removes an entry from the GOsa support queue. 
208       @param  Integer The ID of the entry we want to remove.
209       @return Boolean True on success.
210    */
211   public function remove_entry($id)
212   {
213     $this->b_error = FALSE;
214     $this->s_error = "";
216     $xml_msg = "<xml>
217                   <header>gosa_delete_jobdb_entry</header>
218                   <where>id</where>
219                   <id>".$id."</id>
220                 </xml>";
221     $this->connect();
222     if($this->is_connected){
223       $this->o_sock->write($xml_msg);
224       return(TRUE);
225     }
226     $this->set_error("Could not establish socket connection.");
227     return(FALSE);
228   }
229   
231   /*! \brief  Parses the given xml string into an array 
232       @param  String XML string  
233       @return Array Returns an array containing the xml structure. 
234    */
235   function xml_to_array($xml)
236   {
237     $params = array();
238     $level = array();
239     $parser  = xml_parser_create_ns();
240     xml_parse_into_struct($parser, $xml, $vals, $index);
242     $err_id = xml_get_error_code($parser);
243     if($err_id){
244       $this->set_error(xml_error_string(xml_get_error_code($parser)));
245       xml_parser_free($parser);
246     }else{
247       xml_parser_free($parser);
249       foreach ($vals as $xml_elem) {
250         if ($xml_elem['type'] == 'open') {
251           if (array_key_exists('attributes',$xml_elem)) {
252             list($level[$xml_elem['level']],$extra) = array_values($xml_elem['attributes']);
253           } else {
254             $level[$xml_elem['level']] = $xml_elem['tag'];
255           }
256         }
257         if ($xml_elem['type'] == 'complete') {
258           $start_level = 1;
259           $php_stmt = '$params';
260           while($start_level < $xml_elem['level']) {
261             $php_stmt .= '[$level['.$start_level.']]';
262             $start_level++;
263           }
264           $php_stmt .= '[$xml_elem[\'tag\']] = $xml_elem[\'value\'];';
265           @eval($php_stmt);
266         }
267       }
268     }
269     return($params); 
270   }
273   /*! \brief  Updates an entry with a set of new values, 
274       @param  Integer The ID of the entry, we want to update.
275       @param  Array   The variables to update.   
276       @return Boolean Returns TRUE on success. 
277    */
278   public function update_entry($id,$entry)
279   {
280     $this->b_error = FALSE;
281     $this->s_error = "";
282     if(!is_numeric($id)){
283       trigger_error("Requires an integer value as ID parameter.");
284       return;
285     }
287     if(!is_array($entry)){
288       trigger_error("Requires an array as second parameter.");
289       return;
290     }
292     $attr = "";
293     foreach($entry as $name => $entry){
294       $attr.="<".strtolower($name).">".$entry."</".strtolower($name).">\n";
295     }
297     $xml_msg = "<xml> 
298                   <header>gosa_update_status_jobdb_entry</header>
299                   <where>
300                     <id>".$id."</id> 
301                   </where>
302                   <update>
303                     ".$attr." 
304                   </update>
305                 </xml>";
306     $this->connect();
307     if($this->is_connected){
308       $this->o_sock->write($xml_msg);
309       $str      = trim($this->o_sock->read());
310       $entries = $this->xml_to_array($str);
311       if(!empty($str)){
312         return(TRUE);
313       }
314       return(FALSE);
315     }
316     $this->set_error("Could not establish socket connection.");
317     return(FALSE);
318   }
321 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
322 ?>