Code

Updated gosaSupportDaemon.
[gosa.git] / gosa-core / include / class_gosaSupportDaemon.inc
index f11f31735d24e6e67b9ba64146f9914ca089d518..d3ba4ac8ce4502978f720f4417d7e2eb00000f99 100644 (file)
@@ -1,60 +1,88 @@
 <?php
-
-
 /*
-   __construct        - Create a new deamon handle. 
-   connect            - Connect to deamon socket.
-   disconnect         - Disconnect from socket.
-   set_error          - Sets a new error.
-   is_error           - Returns TRUE if there was an error.
-   get_error          - Returns the last error or "".
-   get_queued_entries - Returns all queued entries, with limitations.
-   ids_exist          - Checks if the given id exists.
-   get_entries_by_id  - Returns a set of entries.
-   id_exists          - Checks if a set entries exists.
-   get_entry_by_id    - Returns a single entry.
-   remove_entries     - Remove a set of entries.
-   remove_entry       - Removes a single entry.
-   update_entries     - Updates a set of entries.
-   xml_to_array       - XML to Array. 
-*/
-
 
+   This code is part of GOsa (https://gosa.gonicus.de)
+   Copyright (C) 2008  Fabian Hickert
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Function overview:
+
+   __construct              - Create a new daemon handle. 
+   connect                  - Connect to daemon socket.
+   disconnect               - Disconnect from socket.
+   set_error                - Sets a new error.
+   is_error                 - Returns TRUE if there was an error.
+   get_error                - Returns the last error or "".
+   get_queued_entries       - Returns all queued entries, with limitations.
+   ids_exist                - Checks if the given id exists.
+   get_entries_by_id        - Returns a set of entries.
+   id_exists                - Checks if a set entries exists.
+   get_entry_by_id          - Returns a single entry.
+   remove_entries           - Remove a set of entries.
+   remove_entry             - Removes a single entry.
+   update_entries           - Updates a set of entries.
+   xml_to_array             - XML to Array. 
+   number_of_queued_entries - Returns the number of currently queued entries.   
+*/
 
 class gosaSupportDaemon
 {
-  private $o_sock       = NULL;
   private $s_host       = "";
   private $i_port       = 0;
-  private $f_timeout    = 0.2;
-
-  private $is_connected     = FALSE;
   private $s_encryption_key = "";
 
-  private $s_error  = "";
-  private $b_error  = FALSE;
+  private $o_sock       = NULL;
+  private $f_timeout    = 2;
+  private $s_error      = "";
+  private $b_error      = FALSE;
+
+  private $is_connected     = FALSE;
 
 
   /*! \brief  Creates a new gosaSupportDaemon object.
-    @param string   Host    The Host where the deamon is running on.  
-    @param integer  Port    The port which the deamon use.
+    @param string   Host    The Host where the daemon is running on.  
+    @param integer  Port    The port which the daemon use.
     @param string   Key     The encryption string.
-    @param boolean  Connect Directly connect to deamon socket.
+    @param boolean  Connect Directly connect to daemon socket.
     @param float    Timeout The timelimit for all socket actions.
    */
-  public function __construct($host,$port,$key="secret-gosa-password",$connect=TRUE,$timeout=0.2)
+  public function __construct($connect=TRUE,$timeout=0.2)
   {
-    $this->s_host    = $host;
-    $this->i_port    = $port;
-    $this->f_timeout = $timeout;
-    $this->s_encryption_key = $key;
-    if($connect){
-      $this->connect();
+    #FIXME: bad idea about referencing global variables from within classes
+    global $config;
+
+    # load from config, store statically
+    if (isset($config->current['GOSA_SI'])){
+
+      if ($this->s_host == ""){
+        $this->s_host= preg_replace("/^.*@([^:]+):.*$/", "$1", $config->current['GOSA_SI']);
+        $this->i_port= preg_replace("/^.*@[^:]+:(.*)$/", "$1", $config->current['GOSA_SI']);
+        $this->s_encryption_key = preg_replace("/^(.*)@[^:]+:.*$/", "$1", $config->current['GOSA_SI']);
+      }
+
+      $this->f_timeout = $timeout;
+      if($connect){
+        $this->connect();
+      }
     }
   }
 
 
-  /*! \brief  Establish deamon connection. 
+  /*! \brief  Establish daemon connection. 
     @return boolean Returns true if the connection was succesfully established. 
    */
   public function connect()
@@ -64,13 +92,14 @@ class gosaSupportDaemon
       $this->o_sock->setEncryptionKey($this->s_encryption_key); 
       $this->is_connected = TRUE;
     }else{
-      $this->error = $this->o_sock->get_error();
-      $this->is_connected = FALSE;
+      $this->set_error($this->o_sock->get_error());
+      $this->disconnect();
     }
+    return($this->is_connected);
   }
 
 
-  /*! \brief  Disconnect from gosa deamon.
+  /*! \brief  Disconnect from gosa daemon.
    */
   public function disconnect()
   {
@@ -89,6 +118,16 @@ class gosaSupportDaemon
   }
 
 
+  /*! \brief  Sets an error message, which can be returned with get_error().
+    @param  string  The Error message,
+   */
+  private function reset_error()
+  {
+    $this->b_error = FALSE;
+    $this->s_error = "";
+  }
+
+
   /*! \brief  Checks if an error occured.
     @return boolean returns TRUE or FALSE, whether there is an error or not.
    */
@@ -103,65 +142,57 @@ class gosaSupportDaemon
    */
   public function get_error()
   {
-    return($this->s_error);
+    $str = $this->s_error;
+    $str = preg_replace("/ /","&nbsp;",$str);
+    return($str);
   }
 
 
   /*! \brief  Returns an array containing all queued entries.
     @return Array All queued entries as an array.
    */
-  public function get_queued_entries($from=0,$to=10)
+  public function get_queued_entries($from=-1,$to=-1,$sort="timestamp DESC")
   {
-    $this->b_error = FALSE;
-    $this->s_error = "";
+    $this->reset_error();
+    $ret = array();
 
     $xml_msg = "<xml>
       <header>gosa_query_jobdb</header>
-      <where>
-      <clause>
-      <connector>or</connector>
-
-        <phrase>
-        <operator>eq</operator>
-        <HEADERTAG>ping</HEADERTAG>
-        </phrase>
-
-        <phrase>
-        <operator>eq</operator>
-        <HEADERTAG>sayHello</HEADERTAG>
-        </phrase>
-      </clause>
-      </where>
+      <target>GOSA</target>
+      <source>GOSA</source>
+      <orderby>".$sort."</orderby>";
+if($from != -1 && $to != -1){
+$xml_msg.= "
       <limit>
-      <from>".$from."</from>
-      <to>".$to."</to>
-      </limit>
+       <from>".$from."</from>
+       <to>".$to."</to>
+      </limit>";
+}
+$xml_msg.= "
       </xml>";
 
-    $this->connect();
-    if($this->is_connected){
+    if($this->connect()){
       $this->o_sock->write($xml_msg);
       $str = trim($this->o_sock->read());
       $entries = $this->xml_to_array($str);
-
-      if(!array_key_exists("XML",$entries)){
-        $this->set_error("!!!Couldn't parse xml.");
-        $this->disconnect();
-        return;
-      }else{
-        if(!is_array($entries['XML'])) {
-          $ret = array();
-        }else{
+      if(isset($entries['XML']) && is_array($entries['XML'])){
+
+        /* Check if returned values represent a valid answer */
+        if(isset($entries['XML'])){
+          
+          /* Unset header tags */
+          foreach(array("HEADER","SOURCE","TARGET") as $type){
+            unset($entries['XML'][$type]);
+          }
           $ret = $entries['XML']; 
         }
       }
-      return($ret);
     }
-    $this->set_error("Could not establish socket connection.");
-    $this->disconnect();
-    return;
+    
+    return($ret);
   }
 
+
   /*! \brief  Checks if the given ids are used queue ids.
     @param  Array   The ids we want to check..
     @return Array   An array containing all ids as index and TRUE/FALSE as value. 
@@ -172,13 +203,14 @@ class gosaSupportDaemon
       trigger_error("Requires an array as parameter.");
       return;
     }
-    $this->b_error = FALSE;
-    $this->s_error = "";
+    $this->reset_error();
 
     $ret = array();
 
     $xml_msg = "<xml>
       <header>gosa_query_jobdb</header>
+      <target>GOSA</target>
+      <source>GOSA</source>
       <where>
       <clause>
       <connector>or</connector>";
@@ -192,23 +224,19 @@ class gosaSupportDaemon
       </where>
       </xml>";
 
-    $this->connect();
-    if(!$this->is_connected){
-      $this->set_error("Could not establish socket connection.");
-    }else{
+    if($this->connect()){
       $this->o_sock->write($xml_msg);
       $str = trim($this->o_sock->read());
-      $entries = $this->xml_to_array($str); 
-      if(isset($entries['XML'])){
+      $entries = $this->xml_to_array($str);
+      if(isset($entries['XML']) && is_array($entries['XML'])){
         foreach($entries['XML'] as $entry){
-          $ret[] = $entry['ID'];
+          if(isset($entry['ID'])){
+            $ret[] = $entry['ID'];
+          }
         }
-        $this->disconnect();
-        return($ret);
       }
     }
-    $this->disconnect();
-    return(FALSE);
+    return($ret);
   }
 
 
@@ -222,13 +250,14 @@ class gosaSupportDaemon
       trigger_error("Requires an array as parameter.");
       return;
     }
-    $this->b_error = FALSE;
-    $this->s_error = "";
+    $this->reset_error();
 
     $ret = array();
 
     $xml_msg = "<xml>
       <header>gosa_query_jobdb</header>
+      <target>GOSA</target>
+      <source>GOSA</source>
       <where>
       <clause>
       <connector>or</connector>";
@@ -237,28 +266,24 @@ class gosaSupportDaemon
         <operator>eq</operator>
         <id>".$id."</id>
         </phrase>";
-      $ret[$id] = FALSE;
     }
     $xml_msg .= "</clause>
       </where>
       </xml>";
 
-    $this->connect();
-    if(!$this->is_connected){
-      $this->set_error("Could not establish socket connection.");
-    }else{
+    if($this->connect()){
       $this->o_sock->write($xml_msg);
       $str = trim($this->o_sock->read());
       $entries = $this->xml_to_array($str); 
-      if(!isset($entries['XML'])){
-        $this->set_error("Entry with id (".$id.") not found.");
-        $this->disconnect();
-      }else{
-        $ret = $entries['XML'];
-        return($ret);
+      if(isset($entries['XML'])){
+        foreach($entries['XML'] as $name => $entry){
+          if(preg_match("/^ANSWER[0-9]*$/",$name)){
+            $ret[$name] = $entry;
+          }
+        }
       }
     }
-    return;
+    return($ret);
   }
 
 
@@ -273,10 +298,12 @@ class gosaSupportDaemon
       return;
     }
 
-    $this->b_error = FALSE;
-    $this->s_error = "";
+    $this->reset_error();
+
     $xml_msg = "<xml>
       <header>gosa_query_jobdb</header>
+      <target>GOSA</target>
+      <source>GOSA</source>
       <where>
       <clause>
       <phrase>
@@ -286,19 +313,17 @@ class gosaSupportDaemon
       </clause>
       </where>
       </xml>";
-    $this->connect();
-    if(!$this->is_connected){
-      $this->set_error("Could not establish socket connection.");
-    }else{
+
+    if($this->connect()){
       $this->o_sock->write($xml_msg);
       $str = trim($this->o_sock->read());
       $entries = $this->xml_to_array($str); 
-      if(isset($entries['XML']['ANSWER1'])){
-        $this->disconnect();
+      if( isset($entries['XML']['HEADER']) && 
+          $entries['XML']['HEADER']=="answer" && 
+          isset($entries['XML']['ANSWER1'])){
         return(TRUE);
       }
     }
-    $this->disconnect();
     return(FALSE);
   }
 
@@ -313,11 +338,13 @@ class gosaSupportDaemon
       trigger_error("Requires an integer as parameter.");
       return;
     }
-
-    $this->b_error = FALSE;
-    $this->s_error = "";
+    $this->reset_error();
+  
+    $ret = array();
     $xml_msg = "<xml>
       <header>gosa_query_jobdb</header>
+      <target>GOSA</target>
+      <source>GOSA</source>
       <where>
       <clause>
       <phrase>
@@ -327,22 +354,17 @@ class gosaSupportDaemon
       </clause>
       </where>
       </xml>";
-    $this->connect();
-    if(!$this->is_connected){
-      $this->set_error("Could not establish socket connection.");
-    }else{
+    if($this->connect()){
       $this->o_sock->write($xml_msg);
       $str = trim($this->o_sock->read());
       $entries = $this->xml_to_array($str); 
-      if(!isset($entries['XML']['ANSWER1'])){
-        $this->set_error("Entry with id (".$id.") not found.");
-        $this->disconnect();
-      }else{
+      if( isset($entries['XML']['HEADER']) &&
+          $entries['XML']['HEADER']=="answer" &&
+          isset($entries['XML']['ANSWER1'])){
         $ret = $entries['XML']['ANSWER1'];
-        return($ret);
       }
     }
-    return;
+    return($ret);
   }
 
 
@@ -356,13 +378,15 @@ class gosaSupportDaemon
       trigger_error("Requires an array as parameter.");
       return;
     }
-    $this->b_error = FALSE;
-    $this->s_error = "";
+
+    $this->reset_error();
 
     $ret = array();
 
     $xml_msg = "<xml>
       <header>gosa_delete_jobdb_entry</header>
+      <target>GOSA</target>
+      <source>GOSA</source>
       <where>
       <clause>
       <connector>or</connector>";
@@ -375,15 +399,15 @@ class gosaSupportDaemon
     $xml_msg .= "</clause>
       </where>
       </xml>";
-    $this->b_error = FALSE;
-    $this->s_error = "";
 
-    $this->connect();
-    if($this->is_connected){
+    if($this->connect()){
       $this->o_sock->write($xml_msg);
-      return(TRUE);
+      $str = $this->o_sock->read();
+      $entries = $this->xml_to_array($str);
+      if(isset($entries['XML'])){
+        return(TRUE);
+      }
     }
-    $this->set_error("Could not establish socket connection.");
     return(FALSE);
   }
 
@@ -395,11 +419,12 @@ class gosaSupportDaemon
    */
   public function remove_entry($id)
   {
-    $this->b_error = FALSE;
-    $this->s_error = "";
+    $this->reset_error();
 
     $xml_msg = "<xml>
       <header>gosa_delete_jobdb_entry</header>
+      <target>GOSA</target>
+      <source>GOSA</source>
       <where>
       <clause>
       <phrase>
@@ -409,12 +434,14 @@ class gosaSupportDaemon
       </clause>
       </where>
       </xml>";
-    $this->connect();
-    if($this->is_connected){
+    if($this->connect()){
       $this->o_sock->write($xml_msg);
-      return(TRUE);
+      $str = $this->o_sock->read();
+      $entries = $this->xml_to_array($str);
+      if(isset($entries['XML'])){
+        return(TRUE);
+      }
     }
-    $this->set_error("Could not establish socket connection.");
     return(FALSE);
   }
 
@@ -423,7 +450,7 @@ class gosaSupportDaemon
     @param  String XML string  
     @return Array Returns an array containing the xml structure. 
    */
-  function xml_to_array($xml)
+  private function xml_to_array($xml)
   {
     $params = array();
     $level = array();
@@ -432,7 +459,6 @@ class gosaSupportDaemon
 
     $err_id = xml_get_error_code($parser);
     if($err_id){
-      $this->set_error(xml_error_string(xml_get_error_code($parser)));
       xml_parser_free($parser);
     }else{
       xml_parser_free($parser);
@@ -457,6 +483,14 @@ class gosaSupportDaemon
         }
       }
     }
+
+    if(!isset($params['XML'])){
+      if (!array_key_exists('XML', $params)){
+        $this->set_error(_("Could not parse XML."));
+      }
+      $params = array("COUNT" => 0);
+    }
+
     return($params); 
   }
 
@@ -468,8 +502,7 @@ class gosaSupportDaemon
    */
   public function update_entries($ids,$entry)
   {
-    $this->b_error = FALSE;
-    $this->s_error = "";
+    $this->reset_error();
     if(!is_array($ids)){
       trigger_error("Requires an array as first parameter.");
       return;
@@ -486,6 +519,8 @@ class gosaSupportDaemon
     }
     $xml_msg = "<xml>
       <header>gosa_update_status_jobdb_entry</header>
+      <target>GOSA</target>
+      <source>GOSA</source>
       <where>
       <clause>
       <connector>or</connector>";
@@ -501,42 +536,129 @@ class gosaSupportDaemon
       ".$attr." 
       </update>
       </xml>";
-    $this->connect();
-    if($this->is_connected){
+    if($this->connect()){
       $this->o_sock->write($xml_msg);
       $str      = trim($this->o_sock->read());
       $entries = $this->xml_to_array($str);
-      if(!empty($str)){
+      if(isset($entries['XML'])){
         return(TRUE);
       }
-      return(FALSE);
     }
-    $this->set_error("Could not establish socket connection.");
     return(FALSE);
   }
 
 
-  /*! \brief  Updates an entry with a set of new values, 
-    @param  Integer The ID of the entry, we want to update.
-    @param  Array   The variables to update.   
-    @return Boolean Returns TRUE on success. 
+  /*! \brief  Returns the number of currently queued objects.
+      @return Integer  
    */
   public function number_of_queued_entries()
   {
-    $xml_msg ="<xml> <header>gosa_count_jobdb</header></xml>";
+    $xml_msg ="<xml><header>gosa_count_jobdb</header><target>GOSA</target><source>GOSA</source></xml>";
     $this->connect();
-    if($this->is_connected){
+    if($this->connect()){
       $this->o_sock->write($xml_msg);
-      $str      = trim($this->o_sock->read());
+      $str     = trim($this->o_sock->read());
       $entries = $this->xml_to_array($str);
-      if(isset($entries['XML']['COUNT'])){
+      if(isset($entries['XML'])){
         return($entries['XML']['COUNT']);
       }
-      return;
     }
-    $this->set_error("Could not establish socket connection.");
-    return;
+    return(-1);
   } 
+
+
+  public function send_data($header, $to, $data= array(), $answer_expected = FALSE)
+  {
+    $xml_message= "";
+
+    /* Prepare data */
+    foreach ($data as $key => $value){
+      $xml_message.= "<$key>$value</$key>";
+    }
+
+    /* Multiple targets? */
+    if (!is_array($to)){
+      $to_targets= array($to);
+    } else {
+      $to_targets= $to;
+    }
+
+    /* Build target strings */
+    $target ="";
+    foreach($to_targets as $to){
+      $target.= "<target>$to</target>";
+    }
+
+    return $this->_send("<xml><header>$header</header><source>GOSA</source>$target".$xml_message."</xml>",$answer_expected);
+  }
+
+
+  /*! \brief  Returns an array containing all queued entries.
+    @return Array All queued entries as an array.
+   */
+  public function _send($data, $answer_expected= FALSE)
+  {
+    $this->reset_error();
+    $ret = array();
+
+    if($this->connect()){
+      $this->o_sock->write($data);
+      if ($answer_expected){
+        $str = trim($this->o_sock->read());
+        $entries = $this->xml_to_array($str);
+        if(isset($entries['XML']) && is_array($entries['XML'])){
+          $ret = $entries;
+          if(isset($entries['XML']['ERROR_STRING'])) {
+            $this->set_error($entries['XML']['ERROR_STRING']);
+          }
+        }
+      }
+    }
+    return($ret);
+  }
+
+
+  static function send($header, $to, $data= array(), $answer_expected = FALSE)
+  {
+    $xml_message= "";
+
+    /* Get communication object */
+    $d= new gosaSupportDaemon(TRUE,10);
+
+    /* Prepare data */
+    foreach ($data as $key => $value){
+      $xml_message.= "<$key>$value</$key>";
+    }
+
+    /* Multiple targets? */
+    if (!is_array($to)){
+      $to_targets= array($to);
+    } else {
+      $to_targets= $to;
+    }
+
+    /* Build target strings */
+    $target ="";
+    foreach($to_targets as $to){
+      $target.= "<target>$to</target>";
+    }
+
+    return $d->_send("<xml><header>$header</header><source>GOSA</source>$target".$xml_message."</xml>",$answer_expected);
+  }
+
+
+  static function ping($target)
+  {
+    if (tests::is_mac($target)){
+    /* Get communication object */
+       $d= new gosaSupportDaemon(TRUE,0.5);
+       $answer= $d->_send("<xml><header>gosa_ping</header><source>GOSA</source><target>$target</target></xml>", TRUE);
+       return (count($answer) ? TRUE:FALSE);
+    }
+
+    return (FALSE);
+  }
+
 }
 
 // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: