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 daemon connection.
@return boolean Returns true if the connection was succesfully established.
*/
public function connect()
{
$this->o_sock = new Socket_Client($this->s_host,$this->i_port,TRUE,$this->f_timeout);
if($this->o_sock->connected()){
$this->o_sock->setEncryptionKey($this->s_encryption_key);
$this->is_connected = TRUE;
}else{
$this->set_error($this->o_sock->get_error());
$this->disconnect();
}
return($this->is_connected);
}
/*! \brief Disconnect from gosa daemon.
*/
public function disconnect()
{
$this->o_sock->close();
$this->is_connected = FALSE;
}
/*! \brief Sets an error message, which can be returned with get_error().
@param string The Error message,
*/
private function set_error($str)
{
$this->b_error = TRUE;
$this->s_error = $str;
}
/*! \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.
*/
public function is_error()
{
return($this->b_error);
}
/*! \brief Returns the last error.
@return Returns the last error.
*/
public function get_error()
{
$str = $this->s_error;
$str = preg_replace("/ /"," ",$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=-1,$to=-1,$sort="timestamp DESC")
{
$this->reset_error();
$ret = array();
$xml_msg = "
GOSA
".$sort."";
if($from != -1 && $to != -1){
$xml_msg.= "
".$from."
".$to."
";
}
$xml_msg.= "
";
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']) && 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);
}
/*! \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.
*/
public function ids_exist($ids)
{
if(!is_array($ids)){
trigger_error("Requires an array as parameter.");
return;
}
$this->reset_error();
$ret = array();
$xml_msg = "
GOSA
or";
foreach($ids as $id){
$xml_msg .= "
eq
".$id."
";
}
$xml_msg .= "
";
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']) && is_array($entries['XML'])){
foreach($entries['XML'] as $entry){
if(isset($entry['ID'])){
$ret[] = $entry['ID'];
}
}
}
}
return($ret);
}
/*! \brief Returns an entry containing all requested ids.
@param Array The IDs of the entries we want to return.
@return Array Of the requested entries.
*/
public function get_entries_by_id($ids)
{
if(!is_array($ids)){
trigger_error("Requires an array as parameter.");
return;
}
$this->reset_error();
$ret = array();
$xml_msg = "
GOSA
or";
foreach($ids as $id){
$xml_msg .= "
eq
".$id."
";
}
$xml_msg .= "
";
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'])){
foreach($entries['XML'] as $name => $entry){
if(preg_match("/^ANSWER[0-9]*$/",$name)){
$ret[$name] = $entry;
}
}
}
}
return($ret);
}
/*! \brief Checks if the given id is in use.
@param Integer The ID of the entry.
@return Boolean TRUE if entry exists.
*/
public function id_exists($id)
{
if(!is_numeric($id)){
trigger_error("Requires an integer as parameter.");
return;
}
$this->reset_error();
$xml_msg = "
GOSA
eq
".$id."
";
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']['HEADER']) &&
$entries['XML']['HEADER']=="answer" &&
isset($entries['XML']['ANSWER1'])){
return(TRUE);
}
}
return(FALSE);
}
/*! \brief Returns an entry from the gosaSupportQueue
@param Integer The ID of the entry we want to return.
@return Array Of the requested entry.
*/
public function get_entry_by_id($id)
{
if(!is_numeric($id)){
trigger_error("Requires an integer as parameter.");
return;
}
$this->reset_error();
$ret = array();
$xml_msg = "
GOSA
eq
".$id."
";
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']['HEADER']) &&
$entries['XML']['HEADER']=="answer" &&
isset($entries['XML']['ANSWER1'])){
$ret = $entries['XML']['ANSWER1'];
}
}
return($ret);
}
/*! \brief Removes a set of entries from the GOsa support queue.
@param Array The IDs to remove.
@return Boolean True on success.
*/
public function remove_entries($ids)
{
if(!is_array($ids)){
trigger_error("Requires an array as parameter.");
return;
}
$this->reset_error();
$ret = array();
$xml_msg = "
GOSA
or";
foreach($ids as $id){
$xml_msg .= "
eq
".$id."
";
}
$xml_msg .= "
";
if($this->connect()){
$this->o_sock->write($xml_msg);
$str = $this->o_sock->read();
$entries = $this->xml_to_array($str);
if(isset($entries['XML'])){
return(TRUE);
}
}
return(FALSE);
}
/*! \brief Removes an entry from the GOsa support queue.
@param Integer The ID of the entry we want to remove.
@return Boolean True on success.
*/
public function remove_entry($id)
{
$this->reset_error();
$xml_msg = "
GOSA
eq
".$id."
";
if($this->connect()){
$this->o_sock->write($xml_msg);
$str = $this->o_sock->read();
$entries = $this->xml_to_array($str);
if(isset($entries['XML'])){
return(TRUE);
}
}
return(FALSE);
}
/*! \brief Parses the given xml string into an array
@param String XML string
@return Array Returns an array containing the xml structure.
*/
private function xml_to_array($xml)
{
$params = array();
$level = array();
$parser = xml_parser_create_ns();
xml_parse_into_struct($parser, $xml, $vals, $index);
$err_id = xml_get_error_code($parser);
if($err_id){
xml_parser_free($parser);
}else{
xml_parser_free($parser);
foreach ($vals as $xml_elem) {
if ($xml_elem['type'] == 'open') {
if (array_key_exists('attributes',$xml_elem)) {
list($level[$xml_elem['level']],$extra) = array_values($xml_elem['attributes']);
} else {
$level[$xml_elem['level']] = $xml_elem['tag'];
}
}
if ($xml_elem['type'] == 'complete') {
$start_level = 1;
$php_stmt = '$params';
while($start_level < $xml_elem['level']) {
$php_stmt .= '[$level['.$start_level.']]';
$start_level++;
}
$php_stmt .= '[$xml_elem[\'tag\']] = $xml_elem[\'value\'];';
@eval($php_stmt);
}
}
}
if(!isset($params['XML'])){
if (!array_key_exists('XML', $params)){
$this->set_error(_("Could not parse XML."));
}
$params = array("COUNT" => 0);
}
return($params);
}
/*! \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.
*/
public function update_entries($ids,$entry)
{
$this->reset_error();
if(!is_array($ids)){
trigger_error("Requires an array as first parameter.");
return;
}
if(!is_array($entry)){
trigger_error("Requires an array as second parameter.");
return;
}
$attr = "";
foreach($entry as $name => $entry){
$attr.="<".strtolower($name).">".$entry."".strtolower($name).">\n";
}
$xml_msg = "
gosa_update_status_jobdb_entry
GOSA
or";
foreach($ids as $id){
$xml_msg .= "
eq
".$id."
";
}
$xml_msg .= "
".$attr."
";
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'])){
if(isset($entries['XML']['ERROR_STRING'])) {
$this->set_error($entries['XML']['ERROR_STRING']);
return(FALSE);
}
return(TRUE);
}
}
return(FALSE);
}
/*! \brief Returns the number of currently queued objects.
@return Integer
*/
public function number_of_queued_entries()
{
$xml_msg ="GOSA";
$this->connect();
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'])){
return($entries['XML']['COUNT']);
}
}
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.= "$to";
}
return $this->_send("$target".$xml_message."",$answer_expected);
}
/* Allows simply appending a new DaemonEvent
*/
public function append($event)
{
if(!($event instanceof DaemonEvent)){
return(FALSE);
}
$this->reset_error();
/* Add to queue if new
*/
if($event->is_new()){
if($event->get_type() == SCHEDULED_EVENT){
$action = $event->get_schedule_action();
}elseif($event->get_type() == TRIGGERED_EVENT){
$action = $event->get_schedule_action();
}else{
trigger_error("Unknown type of queue event given.");
return(FALSE);
}
/* Get event informations, like targets..
*/
$targets = $event->get_targets();
$data = $event->save();
/* Append an entry for each target
*/
foreach($targets as $target){
$data['macaddress'] = $target;
$this->send_data($action,$target,$data,TRUE);
if($this->is_error()){
return(FALSE);
}
}
return(TRUE);
}else{
/* Updated edited entry.
*/
$id = $event->get_id();
$data = $event->save();
return($this->update_entries(array($id),$data));
}
return(FALSE);
}
/*! \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.= "$to";
}
return $d->_send("$target".$xml_message."",$answer_expected);
}
static function ping($target)
{
if (tests::is_mac($target)){
/* Get communication object */
$d= new gosaSupportDaemon(TRUE,0.5);
$answer= $d->_send("$target", TRUE);
return (count($answer) ? TRUE:FALSE);
}
return (FALSE);
}
}
// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
?>