X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_gosaSupportDaemon.inc;h=81272f9a4c5f4e808a7a9e7e685aca6df02eac93;hb=9773098162a69430e5c427eb458578bb39e15560;hp=8270f9ffc2fb7abf841ae56f0b5d6a8e04139834;hpb=8671df505b7dc941ee4aa811858c1cff11f109dd;p=gosa.git diff --git a/gosa-core/include/class_gosaSupportDaemon.inc b/gosa-core/include/class_gosaSupportDaemon.inc index 8270f9ffc..81272f9a4 100644 --- a/gosa-core/include/class_gosaSupportDaemon.inc +++ b/gosa-core/include/class_gosaSupportDaemon.inc @@ -31,8 +31,19 @@ class gosaSupportDaemon private $s_error = ""; private $b_error = FALSE; - private $is_connected = FALSE; + private $is_connected = FALSE; + private $is_configured = FALSE; + protected $use_alternative_xml_parse_method = FALSE; + public function get_host() + { + return($this->s_host); + } + + public function get_port() + { + return($this->i_port); + } /*! \brief Creates a new gosaSupportDaemon object. @param string Host The Host where the daemon is running on. @@ -41,20 +52,33 @@ class gosaSupportDaemon @param boolean Connect Directly connect to daemon socket. @param float Timeout The timelimit for all socket actions. */ - public function __construct($connect=TRUE,$timeout=10) + public function __construct($connect=TRUE,$timeout=null) { #FIXME: bad idea about referencing global variables from within classes global $config; + if(!isset($config) || !$config){ + $config = session::global_get('config'); + } + + // Detect timeout + if($timeout == null){ + $timeout = $config->get_cfg_value("core","gosaSupportTimeout"); + } + + /* This should only be the case if we call this from setup. + __autoload() + */ + if(!is_object($config)) { return; } # load from config, store statically - if (isset($config->current['GOSA_SI'])){ + if ($config->get_cfg_value("core","gosaSupportURI") != ""){ 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->s_host= preg_replace("/^.*@([^:]+):.*$/", "$1", $config->get_cfg_value("core","gosaSupportURI")); + $this->i_port= preg_replace("/^.*@[^:]+:(.*)$/", "$1", $config->get_cfg_value("core","gosaSupportURI")); + $this->s_encryption_key = preg_replace("/^(.*)@[^:]+:.*$/", "$1", $config->get_cfg_value("core","gosaSupportURI")); } - + $this->is_configured = TRUE; $this->f_timeout = $timeout; if($connect){ $this->connect(); @@ -63,6 +87,12 @@ class gosaSupportDaemon } + public function is_configured() + { + return($this->is_configured); + } + + /*! \brief Establish daemon connection. @return boolean Returns true if the connection was succesfully established. */ @@ -76,14 +106,53 @@ class gosaSupportDaemon }else{ $this->set_error($this->o_sock->get_error()); $this->disconnect(); - new log("debug","gosaSupportDaemon::connect()", "Could not connect to server.", array(),$this->get_error()); + new log("debug","gosaSupportDaemon::connect()", "Cannot connect to si-server", array(),$this->get_error()); } }else{ - $this->set_error(msgPool::cmdnotfound("GOSA_SI",_("GOsa support daemon"))); + $this->set_error(msgPool::cmdnotfound("gosaSupportURI",_("GOsa support daemon"))); } return($this->is_connected); } + + /*! \brief Returns TRUE whether we are connected or not + @return BOOLEAN Returns TRUE when connected else FALSE + */ + public function is_connected() + { + return($this->is_connected); + } + + + /*! \brief */ + public function get_hosts_with_module($mod) + { + $data = array("module_name" => $mod); + $res = $this->send_data("gosa_get_hosts_with_module",$this->s_host.":".$this->i_port,$data,TRUE); + $hosts = array(); + if(isset($res['XML'][0])){ + foreach($res['XML'][0] as $name => $data){ + if(preg_match("/^ANSWER[0-9]*$/",$name)){ + if(isset($data[0]['MAC'][0]['VALUE']) && $data[0]['MAC'][0]['VALUE'] != ""){ + $hosts[] = $data[0]['MAC'][0]['VALUE']; + } elseif(isset($data[0]['IP'][0]['VALUE']) && $data[0]['IP'][0]['VALUE'] != "") { + $hosts[] = $data[0]['IP'][0]['VALUE']; + } + } + } + } + + if(count($hosts) == 0){ + @DEBUG(DEBUG_SI, __LINE__, "".__CLASS__."::".__FUNCTION__."" , + __FILE__, "Found: 0", $info=$mod); + }else{ + @DEBUG(DEBUG_SI, __LINE__, "".__CLASS__."::".__FUNCTION__."" , + __FILE__, "Found: ".count($hosts)."", $info=$mod); + } + + return($hosts); + } + /*! \brief Disconnect from gosa daemon. */ @@ -99,6 +168,29 @@ class gosaSupportDaemon */ private function set_error($str) { + /****** + Debug handling + ******/ + $debug = debug_backtrace(); + $file = __FILE__; + $function = __FUNCTION__; + $line = __LINE__; + $class = __CLASS__; + foreach($debug as $info){ + if(!in_array($info['function'],array("send_data","_send","set_error","connect"))){ + $file = $info['file']; + $line = $info['line']; + $class = get_class($this); + $function = $info['function']; + break; + } + } + @DEBUG(DEBUG_SI, $line, "".$class."::".$function."" , $file, "".htmlentities($str)."", $info=""); + + /****** + Set error string. + ******/ + $this->b_error = TRUE; $this->s_error = $str; } @@ -129,64 +221,128 @@ class gosaSupportDaemon public function get_error() { $str = $this->s_error; - $str = preg_replace("/ /"," ",$str); - return($str); + $ret = ""; + if(is_string($str)){ + $ret = $str; + }else{ + foreach($str as $msg){ + $ret .= $msg." "; + } + } + $ret = str_replace(" "," ",$ret); + return($ret); } - public function FAI_get_packages($release,$attrs, $package="") + public function FAI_get_kernels($release) + { + $xml_msg = + "". + "
gosa_get_available_kernel
". + "GOSA". + "GOSA". + "".$release."". + "
"; + + $ret = array(); + if($this->connect()){ + $entries = $this->_send($xml_msg,TRUE); + + /* Check if returned values represent a valid answer */ + if(isset($entries['XML']) && is_array($entries['XML'])){ + if(isset($entries['XML'])){ + $ret = $entries['XML']; + foreach($ret as $key => $entry){ + if(!preg_match("/^answer/i",$key)){ + unset($ret[$key]); + } + } + } + } + } + return($ret); + } + + + public function FAI_get_package_sections($release) + { + $xml_msg = "
gosa_query_packages_list
GOSAGOSA". + "". + "".$release."
"; + + $ret = array(); + if($this->connect()){ + $entries = $this->_send($xml_msg,TRUE); + if(isset($entries['XML']) && is_array($entries['XML'])){ + + /* Unset header tags */ + foreach(array("HEADER","SOURCE","TARGET","SESSION_ID") as $type){ + if(isset($entries['XML'][$type])){ + unset($entries['XML'][$type]); + } + } + $ret = $entries['XML']; + } + } + return($ret); + } + + + public function FAI_get_packages($release,$attrs,$package,$from=-1,$to=-1) { - $this->reset_error(); $ret = array(); + /* Check Parameter */ if(!is_array($attrs) || !count($attrs)){ trigger_error("Second parameter must be an array. With at least one attribute name."); return($ret); } - - $attr = ""; + + /* Check Parameter */ + if(!is_array($package)){ + trigger_error("Third parameter must be an array. With at least one attribute name."); + return($ret); + } + + /* Create list of attributes to fetch */ + $attr = ""; foreach($attrs as $at){ -# $attr.= ""; + $attr.= ""; } - - if(empty($package)){ - $xml_msg = "
gosa_query_packages_list
GOSAGOSA". - $attr. - "".$release."10
"; + + /* If no package is given, search for all */ + if(!count($package)) $package = array("%"); + + /* Create limit tag */ + if($from == -1){ + $limit =""; }else{ - $xml_msg = - "
gosa_query_packages_list
GOSAGOSA". - $attr. - "". - "AND". - "".$release."". - "".$package."". - "". - "10
"; + $limit = "".$from."".$to.""; } - if($this->connect()){ - $this->o_sock->write($xml_msg); - $str = trim($this->o_sock->read()); + /* Create list of attributes to fetch */ + $pkgs = ""; + foreach($package as $pkg){ + $pkgs .="like".$pkg.""; + } - /* Check if something went wrong while reading */ - if($this->o_sock->is_error()){ - $this->set_error($this->o_sock->get_error()); - return($ret); - } + $xml_msg = "
gosa_query_packages_list
GOSAGOSA". + $attr. + " + ".$release." + OR + ".$pkgs." + + ". + $limit. + "
"; - $entries = $this->xml_to_array($str); + if($this->connect()){ + $entries = $this->_send($xml_msg,TRUE); if(isset($entries['XML']) && is_array($entries['XML'])){ /* Check if returned values represent a valid answer */ if(isset($entries['XML'])){ - if(isset($entries['XML']['ERROR_STRING'])) { - $this->set_error($entries['XML']['ERROR_STRING']); - new log("debug","GOsa-si", - get_class($this)."::".__FUNCTION__, array(), - "FAILED error was ".$this->get_error()); - return($ret); - } /* Unset header tags */ foreach(array("HEADER","SOURCE","TARGET","SESSION_ID") as $type){ @@ -206,41 +362,22 @@ class gosaSupportDaemon public function FAI_get_server($name = "") { - $this->reset_error(); $xml_msg = "
gosa_query_fai_server
GOSAGOSA
"; $ret = array(); if($this->connect()){ - $this->o_sock->write($xml_msg); - $str = trim($this->o_sock->read()); - - /* Check if something went wrong while reading */ - if($this->o_sock->is_error()){ - $this->set_error($this->o_sock->get_error()); - return($ret); - } - $entries = $this->xml_to_array($str); + /* Check if returned values represent a valid answer */ + $entries = $this->_send($xml_msg,TRUE); if(isset($entries['XML']) && is_array($entries['XML'])){ - /* Check if returned values represent a valid answer */ - if(isset($entries['XML'])){ - if(isset($entries['XML']['ERROR_STRING'])) { - $this->set_error($entries['XML']['ERROR_STRING']); - new log("debug","GOsa-si", - get_class($this)."::".__FUNCTION__, array(), - "FAILED error was ".$this->get_error()); - return($ret); - } - - /* Unset header tags */ - foreach(array("HEADER","SOURCE","TARGET","SESSION_ID") as $type){ - if(isset($entries['XML'][$type])){ - unset($entries['XML'][$type]); - } + /* Unset header tags */ + foreach(array("HEADER","SOURCE","TARGET","SESSION_ID") as $type){ + if(isset($entries['XML'][$type])){ + unset($entries['XML'][$type]); } - $ret = $entries['XML']; } + $ret = $entries['XML']; } } return($ret); @@ -249,41 +386,21 @@ class gosaSupportDaemon public function FAI_get_classes($name) { - $this->reset_error(); $xml_msg = "
gosa_query_fai_release
GOSAGOSA". - "".$name."
";; + "".$name."";; $ret = array(); if($this->connect()){ - $this->o_sock->write($xml_msg); - $str = trim($this->o_sock->read()); - - /* Check if something went wrong while reading */ - if($this->o_sock->is_error()){ - $this->set_error($this->o_sock->get_error()); - return($ret); - } - $entries = $this->xml_to_array($str); + $entries = $this->_send($xml_msg,TRUE); if(isset($entries['XML']) && is_array($entries['XML'])){ - /* Check if returned values represent a valid answer */ - if(isset($entries['XML'])){ - if(isset($entries['XML']['ERROR_STRING'])) { - $this->set_error($entries['XML']['ERROR_STRING']); - new log("debug","GOsa-si", - get_class($this)."::".__FUNCTION__, array($name), - "FAILED error was ".$this->get_error()); - return($ret); - } - - /* Unset header tags */ - foreach(array("HEADER","SOURCE","TARGET","SESSION_ID") as $type){ - if(isset($entries['XML'][$type])){ - unset($entries['XML'][$type]); - } + /* Unset header tags */ + foreach(array("HEADER","SOURCE","TARGET","SESSION_ID") as $type){ + if(isset($entries['XML'][$type])){ + unset($entries['XML'][$type]); } - $ret = $entries['XML']; } + $ret = $entries['XML']; } } return($ret); @@ -295,7 +412,6 @@ class gosaSupportDaemon */ public function get_queued_entries($event_types = array("*"),$from=-1,$to=-1,$sort="timestamp DESC") { - $this->reset_error(); $ret = array(); $tags = ""; @@ -310,51 +426,34 @@ class gosaSupportDaemon } $xml_msg = -" + "
gosa_query_jobdb
GOSA GOSA ".$tags." ".$sort.""; -if($from != -1 && $to != -1){ -$xml_msg.= " - - ".$from." - ".$to." - "; -} -$xml_msg.= " + 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()); - - /* Check if something went wrong while reading */ - if($this->o_sock->is_error()){ - $this->set_error($this->o_sock->get_error()); - return($ret); - } - - $entries = $this->xml_to_array($str); + $entries = $this->_send($xml_msg,TRUE); 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']; + /* Unset header tags */ + foreach(array("HEADER","SOURCE","TARGET","SESSION_ID") as $type){ + unset($entries['XML'][$type]); } + $ret = $entries['XML']; } } - - /* Remove session ID. No one is interested in this... */ - unset($ret['SESSION_ID']); - return($ret); } @@ -369,7 +468,6 @@ $xml_msg.= " trigger_error("Requires an array as parameter."); return; } - $this->reset_error(); $ret = array(); @@ -391,19 +489,10 @@ $xml_msg.= "
"; if($this->connect()){ - $this->o_sock->write($xml_msg); - $str = trim($this->o_sock->read()); - - /* Check if something went wrong while reading */ - if($this->o_sock->is_error()){ - $this->set_error($this->o_sock->get_error()); - return($ret); - } - - $entries = $this->xml_to_array($str); + $entries = $this->_send($xml_msg,TRUE); if(isset($entries['XML']) && is_array($entries['XML'])){ foreach($entries['XML'] as $entry){ - if(isset($entry['ID'])){ + if(is_array($entry) && array_key_exists("ID",$entry)){ $ret[] = $entry['ID']; } } @@ -423,7 +512,6 @@ $xml_msg.= " trigger_error("Requires an array as parameter."); return; } - $this->reset_error(); $ret = array(); @@ -445,16 +533,7 @@ $xml_msg.= " "; if($this->connect()){ - $this->o_sock->write($xml_msg); - $str = trim($this->o_sock->read()); - - /* Check if something went wrong while reading */ - if($this->o_sock->is_error()){ - $this->set_error($this->o_sock->get_error()); - return($ret); - } - - $entries = $this->xml_to_array($str); + $entries = $this->_send($xml_msg,TRUE); if(isset($entries['XML'])){ foreach($entries['XML'] as $name => $entry){ if(preg_match("/^ANSWER[0-9]*$/",$name)){ @@ -477,7 +556,6 @@ $xml_msg.= " trigger_error("Requires an array as parameter."); return; } - $this->reset_error(); $ret = array(); @@ -499,16 +577,7 @@ $xml_msg.= " "; if($this->connect()){ - $this->o_sock->write($xml_msg); - $str = trim($this->o_sock->read()); - - /* Check if something went wrong while reading */ - if($this->o_sock->is_error()){ - $this->set_error($this->o_sock->get_error()); - return($ret); - } - - $entries = $this->xml_to_array($str); + $entries = $this->_send($xml_msg,TRUE); if(isset($entries['XML'])){ foreach($entries['XML'] as $name => $entry){ if(preg_match("/^ANSWER[0-9]*$/",$name)){ @@ -532,7 +601,6 @@ $xml_msg.= " return; } - $this->reset_error(); $xml_msg = "
gosa_query_jobdb
@@ -549,16 +617,7 @@ $xml_msg.= "
"; if($this->connect()){ - $this->o_sock->write($xml_msg); - $str = trim($this->o_sock->read()); - - /* Check if something went wrong while reading */ - if($this->o_sock->is_error()){ - $this->set_error($this->o_sock->get_error()); - return(FALSE); - } - - $entries = $this->xml_to_array($str); + $entries = $this->_send($xml_msg,TRUE); if( isset($entries['XML']['HEADER']) && $entries['XML']['HEADER']=="answer" && isset($entries['XML']['ANSWER1'])){ @@ -579,7 +638,6 @@ $xml_msg.= " trigger_error("Requires an integer as parameter."); return; } - $this->reset_error(); $ret = array(); $xml_msg = " @@ -596,16 +654,7 @@ $xml_msg.= " "; if($this->connect()){ - $this->o_sock->write($xml_msg); - $str = trim($this->o_sock->read()); - - /* Check if something went wrong while reading */ - if($this->o_sock->is_error()){ - $this->set_error($this->o_sock->get_error()); - return($ret); - } - - $entries = $this->xml_to_array($str); + $entries = $this->_send($xml_msg,TRUE); if( isset($entries['XML']['HEADER']) && $entries['XML']['HEADER']=="answer" && isset($entries['XML']['ANSWER1'])){ @@ -627,7 +676,6 @@ $xml_msg.= " return; } - $this->reset_error(); $ret = array(); @@ -649,16 +697,7 @@ $xml_msg.= " "; if($this->connect()){ - $this->o_sock->write($xml_msg); - $str = $this->o_sock->read(); - - /* Check if something went wrong while reading */ - if($this->o_sock->is_error()){ - $this->set_error($this->o_sock->get_error()); - return($ret); - } - - $entries = $this->xml_to_array($str); + $entries = $this->_send($xml_msg,TRUE); if(isset($entries['XML']) || isset($entries['COUNT'])){ new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::remove_entries()", $ids,"SUCCESS"); return(TRUE); @@ -685,7 +724,7 @@ $xml_msg.= " @param String XML string @return Array Returns an array containing the xml structure. */ - private function xml_to_array($xml) + private function xml_to_array($xml,$alternative_method = FALSE) { $params = array(); $level = array(); @@ -698,23 +737,47 @@ $xml_msg.= " }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($this->use_alternative_xml_parse_method) { + $params = $this->build_xml_array($vals); + } else { + + 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++; + if ($xml_elem['type'] == 'complete') { + + $start_level = 1; + $test2 = &$params; + while($start_level < $xml_elem['level']) { + $test2 = &$test2[$level[$start_level]]; + $start_level++; + } + + /* Save tag attributes too. + e.g. + */ + if(isset($xml_elem['attributes'])){ + foreach($xml_elem['attributes'] as $name => $value){ + $test2['ATTRIBUTES'][$name] = $value; + } + } + + if(!isset($test2[$xml_elem['tag']])){ + if(isset($xml_elem['value'])){ + $test2[$xml_elem['tag']] = $xml_elem['value']; + } + }else{ + if(!is_array($test2[$xml_elem['tag']])){ + $test2[$xml_elem['tag']] = array($test2[$xml_elem['tag']]); + } + $test2[$xml_elem['tag']][] = $xml_elem['value']; + } } - $php_stmt .= '[$xml_elem[\'tag\']] = $xml_elem[\'value\'];'; - @eval($php_stmt); } } } @@ -730,6 +793,37 @@ $xml_msg.= " } + function build_xml_array(&$vals) + { + $array = array(); + while(count($vals)){ + $key = key($vals); + $val = $vals[$key]; + unset($vals[$key]); + if($val['type'] == "close"){ + return($array); + }elseif($val['type']=="open"){ + $array[$val['tag']][] = $this->build_xml_array($vals); + }elseif($val['type'] != "cdata"){ + $data = array("VALUE" => "","ATTRIBUTES" => ""); + foreach(array("value" => "VALUE", "attributes" => "ATTRIBUTES") as $name => $attr){ + if(isset($val[$name])){ + $data[$attr] = $val[$name]; + } + } + $array[$val['tag']][] = $data; + }else{ +#print_a($val); + } + } + return($array); + } + + + + + + /*! \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. @@ -737,7 +831,6 @@ $xml_msg.= " */ public function update_entries($ids,$data) { - $this->reset_error(); if(!is_array($ids)){ trigger_error("Requires an array as first parameter."); return; @@ -750,6 +843,7 @@ $xml_msg.= " $attr = ""; foreach($data as $key => $value){ + $key = strtolower($key); if(is_array($value)){ foreach($value as $sub_value){ $attr.= "<$key>".strtolower($sub_value)."\n"; @@ -780,17 +874,7 @@ $xml_msg.= " "; if($this->connect()){ - - $this->o_sock->write($xml_msg); - $str = trim($this->o_sock->read()); - - /* Check if something went wrong while reading */ - if($this->o_sock->is_error()){ - $this->set_error($this->o_sock->get_error()); - return(FALSE); - } - - $entries = $this->xml_to_array($str); + $entries = $this->_send($xml_msg,TRUE); if(isset($entries['XML'])){ if(isset($entries['XML']['ERROR_STRING'])) { $this->set_error($entries['XML']['ERROR_STRING']); @@ -808,21 +892,37 @@ $xml_msg.= " /*! \brief Returns the number of currently queued objects. @return Integer */ - public function number_of_queued_entries() + public function number_of_queued_entries($event_types) { + $tags = ""; + foreach($event_types as $type){ + $tags .= "".$type.""; + } + if(count($event_types) > 1){ + $tags = "or".$tags; + } + if(count($event_types)){ + $tags = "".$tags.""; + } + + + $xml_msg = + "". + "
gosa_query_jobdb
". + "GOSA". + "GOSA". + "". + $tags. + "
"; + $xml_msg ="
gosa_count_jobdb
GOSAGOSA
"; $this->connect(); if($this->connect()){ - $this->o_sock->write($xml_msg); - $str = trim($this->o_sock->read()); - - /* Check if something went wrong while reading */ + $entries = $this->_send($xml_msg,TRUE); if($this->o_sock->is_error()){ $this->set_error($this->o_sock->get_error()); return(0); } - - $entries = $this->xml_to_array($str); if(isset($entries['XML'])){ return($entries['XML']['COUNT']); } @@ -865,13 +965,12 @@ $xml_msg.= " /* Allows simply appending a new DaemonEvent */ - public function append($event) + public function append($event, $skip_add_mac = FALSE) { if(!($event instanceof DaemonEvent)){ return(FALSE); } - $this->reset_error(); /* Add to queue if new */ @@ -895,7 +994,9 @@ $xml_msg.= " /* Append an entry for each target */ foreach($targets as $target){ - $data['macaddress'] = $target; + if(!$skip_add_mac){ + $data['macaddress'] = $target; + } $this->send_data($action,$target,$data,$request_answer); if($this->is_error()){ @@ -916,14 +1017,43 @@ $xml_msg.= " } -/*! \brief Returns an array containing all queued entries. + /*! \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()){ + return($ret); + } + + $this->reset_error(); + /****** + Debug handling + ******/ + $debug = debug_backtrace(); + $file = __FILE__; + $function = __FUNCTION__; + $line = __LINE__; + $class = __CLASS__; + foreach($debug as $info){ + if(!in_array($info['function'],array("send_data","_send"))){ + $file = $info['file']; + $line = $info['line']; + $class = get_class($this); + $function = $info['function']; + break; + } + } + @DEBUG(DEBUG_SI, $line, "".$class."::".$function."" , $file, "".htmlentities($data)."", $info=""); + + $start = microtime(1); + + /******* + Start sending data + *******/ if($this->connect()){ $this->o_sock->write($data); if ($answer_expected){ @@ -932,23 +1062,49 @@ $xml_msg.= " /* Check if something went wrong while reading */ if($this->o_sock->is_error()){ $this->set_error($this->o_sock->get_error()); + @DEBUG(DEBUG_SI, $line, "".$class."::".$function."" , $file, sprintf('%.7f', microtime(1) - $start) , "FAILED Duration:"); return($ret); } $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']); - new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", array($data=>$data),"FAILED ".$this->get_error()); + if($this->use_alternative_xml_parse_method) { + + // --------- Seems broken, check for 'ERROR' but using 'ERROR_STRING' + if(isset($entries['XML'][0]['ERROR'][0]['VALUE']) && $entries['XML'][0]['ERROR'][0]['VALUE'] == "1"){ + $this->set_error($entries['XML'][0]['ERROR_STRING'][0]['VALUE']); + new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", + array($data=>$data),"FAILED ".$this->get_error()); + // --------- + + + }elseif(isset($entries['XML'][0]['ERROR'][0]['VALUE'])){ + $this->set_error($entries['XML'][0]['ERROR'][0]['VALUE']); + new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", + array($data=>$data),"FAILED ".$this->get_error()); + } }else{ - new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", array($data=>$data),"SUCCESS"); + if(isset($entries['XML']['ERROR_STRING'])) { + $this->set_error($entries['XML']['ERROR_STRING']); + new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", + array($data=>$data),"FAILED ".$this->get_error()); + }elseif(isset($entries['XML']['ERROR'])){ + $this->set_error($entries['XML']['ERROR']); + new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", + array($data=>$data),"FAILED ".$this->get_error()); + } } + new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", + array($data=>$data),"SUCCESS"); } }else{ - new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", array($data=>$data),"Fire & forget, not result.! ".$this->get_error()); + new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::_send()", + array($data=>$data),"Fire & forget, not result.! ".$this->get_error()); } } + + @DEBUG(DEBUG_SI, $line, "".$class."::".$function."" , $file, sprintf('%.7f', microtime(1) - $start) , "Duration:"); return($ret); } @@ -964,7 +1120,7 @@ $xml_msg.= " foreach ($data as $key => $value){ if(is_array($value)){ foreach($value as $sub_val){ - $xml_message.= "<$key>$sub_value"; + $xml_message.= "<$key>$sub_val"; } }else{ $xml_message.= "<$key>$value"; @@ -994,6 +1150,9 @@ $xml_msg.= " function clean_queue_from_mac($mac) { global $config; + if(!isset($config) || !$config){ + $config = session::global_get('config'); + } /* First of all we have to check which jobs are startet * for $mac @@ -1022,7 +1181,7 @@ $xml_msg.= " $tmp->add_targets(array($mac)); $tmp->set_type(TRIGGERED_EVENT); if(!$this->append($tmp)){ - msg_dialog::display(_("Error"), sprintf(_("Cannot send abort event for entry %s!"),$entry['ID']) , ERROR_DIALOG); + msg_dialog::display(_("Error"), sprintf(_("Cannot send abort event for entry %s!"), bold($entry['ID'])) , ERROR_DIALOG); new log("debug","DaemonEvent ", "gosaSupportDaemon::clean_queue_from_mac()", array($mac => $mac), "FAILED, could not send 'DaemonEvent_faireboot' for entry ID (".$entry['ID'].") - ".$this->get_error()); }else{ @@ -1042,7 +1201,7 @@ $xml_msg.= " * Failed or waiting events, can be removed without any trouble. */ if(!$this->remove_entries(array($entry['ID']))){ - msg_dialog::display(_("Error"), sprintf(_("Cannot remove entry %s!"),$entry['ID']) , ERROR_DIALOG); + msg_dialog::display(_("Error"), sprintf(_("Cannot remove entry %s!"), bold($entry['ID'])) , ERROR_DIALOG); } ;break; } @@ -1053,18 +1212,739 @@ $xml_msg.= " } -static function ping($target) -{ - if (tests::is_mac($target)){ - /* Get communication object */ - $d= new gosaSupportDaemon(TRUE,0.5); - $answer= $d->_send("
gosa_ping
GOSA$target
", TRUE); - return (count($answer) ? TRUE:FALSE); + static function ping($target) + { + if (tests::is_mac($target)){ + /* Get communication object */ + $d= new gosaSupportDaemon(TRUE,2); + $answer= $d->_send("
gosa_ping
GOSA$target
", TRUE); + return (count($answer) ? TRUE:FALSE); + } + return (FALSE); } - return (FALSE); -} + + /*! \brief Returns a list of all configured principals. + (Uses the GOsa support daemon instead of the ldap database.) + @return Array A list containing the names of all configured principals. + */ + public function krb5_list_principals($server) + { + $res = array(); + + /* Check if the given server is a valid mac address + */ + if(!tests::is_mac($server)){ + trigger_error("The given server address '".$server."' is invalid, it must be a valid mac address"); + return($ret); + } + + /* Prepare request event + */ + $xml_msg = + "". + "
gosa_krb5_list_principals
". + "GOSA". + "".$server."". + "
"; + + $tmp = $this->_send($xml_msg,TRUE); + if(isset($tmp['XML']['PRINCIPAL'])){ + return($tmp['XML']['PRINCIPAL']); + }else{ + return($res); + } + } + + + /*! \brief Returns the configuration settings for a given principal name. + (Uses the GOsa support daemon instead of the ldap database.) + @pram String The name of the requested principal. (e.g. peter@EXAMPLE.DE) + @return Array A list containing the names of all configured principals. + */ + public function krb5_get_principal($server,$name) + { + $ret = array(); + + /* Check if the given name is a valid request value + */ + if(!is_string($name) || empty($name)){ + trigger_error("The given principal name is not of type string or it is empty."); + return($ret); + } + + /* Check if the given server is a valid mac address + */ + if(!tests::is_mac($server)){ + trigger_error("The given server address '".$server."' is invalid, it must be a valid mac address"); + return($ret); + } + + /* Prepare request event + */ + $xml_msg = + "". + "
gosa_krb5_get_principal
". + "".$name."". + "GOSA". + "".$server."". + "
"; + + $res = $this->_send($xml_msg,TRUE); + if(isset($res['XML'])){ + return($res['XML']); + }else{ + return($ret); + } + } + + + /*! \brief Creates a given principal with a set of configuration settings. + For a list of configurable attributes have a look at 'krb5_get_principal()'. + (Uses the GOsa support daemon instead of the ldap database.) + @pram String The name of the principal to update. (e.g. peter@EXAMPLE.DE) + @return Boolean TRUE on success else FALSE. + */ + public function krb5_add_principal($server,$name,$values) + { + $ret = FALSE; + + /* Check if the given name is a valid request value + */ + if(!is_string($name) || empty($name)){ + trigger_error("The given principal name is not of type string or it is empty."); + return($ret); + } + if(!is_array($values)){ + trigger_error("No valid update settings given. The parameter must be of type array and must contain at least one entry"); + return($ret); + } + + /* Check if the given server is a valid mac address + */ + if(!tests::is_mac($server)){ + trigger_error("The given server address '".$server."' is invalid, it must be a valid mac address"); + return($ret); + } + + $attrs = ""; + foreach($values as $key => $value){ + if(empty($key) || is_numeric($key)){ + trigger_error("Invalid configuration attribute given '".$key."=".$value."'."); + return($ret); + } + $key = strtolower($key); + if(is_array($value)){ + foreach($value as $val){ + $attrs.= "<$key>$val\n"; + } + }else{ + $attrs.= "<$key>$value\n"; + } + } + + /* Prepare request event + */ + $xml_msg = + "". + "
gosa_krb5_create_principal
". + "".$name."". + $attrs. + "GOSA". + "".$server."". + "
"; + + return($this->_send($xml_msg,TRUE) == TRUE && !$this->is_error()); + } + + + function krb5_ramdomize_key($server,$name) + { + /* Prepare request event + */ + $xml_msg = + "". + "
gosa_krb5_randomize_key
". + "".$name."". + "GOSA". + "".$server."". + "
"; + + return($this->_send($xml_msg,TRUE) == TRUE && !$this->is_error()); + } + + + + /*! \brief Updates a given principal with a set of configuration settings. + For a list of configurable attributes have a look at 'krb5_get_principal()'. + (Uses the GOsa support daemon instead of the ldap database.) + @pram String The name of the principal to update. (e.g. peter@EXAMPLE.DE) + @return Boolean TRUE on success else FALSE. + */ + public function krb5_set_principal($server,$name,$values) + { + $ret = FALSE; + + /* Check if the given name is a valid request value + */ + if(!is_string($name) || empty($name)){ + trigger_error("The given principal name is not of type string or it is empty."); + return($ret); + } + if(!is_array($values) || !count($values)){ + trigger_error("No valid update settings given. The parameter must be of type array and must contain at least one entry"); + return($ret); + } + + /* Check if the given server is a valid mac address + */ + if(!tests::is_mac($server)){ + trigger_error("The given server address '".$server."' is invalid, it must be a valid mac address"); + return($ret); + } + + $attrs = ""; + foreach($values as $key => $value){ + if(empty($key) || is_numeric($key)){ + trigger_error("Invalid configuration attribute given '".$key."=".$value."'."); + return($ret); + } + $key = strtolower($key); + if(is_array($value)){ + foreach($value as $val){ + $attrs.= "<$key>$val\n"; + } + }else{ + $attrs.= "<$key>$value\n"; + } + } + + /* Prepare request event + */ + $xml_msg = + "". + "
gosa_krb5_modify_principal
". + "".$name."". + $attrs. + "GOSA". + "".$server."". + "
"; + + return($this->_send($xml_msg,TRUE) == TRUE && !$this->is_error()); + } + + + /*! \brief Removes the given principal. + (Uses the GOsa support daemon instead of the ldap database.) + @pram String The name of the principal. (e.g. peter@EXAMPLE.DE) + @return Boollean TRUE on success else FALSE + */ + public function krb5_del_principal($server,$name) + { + $ret = FALSE; + + /* Check if the given name is a valid request value + */ + if(!is_string($name) || empty($name)){ + trigger_error("The given principal name is not of type string or it is empty."); + return($ret); + } + + /* Check if the given server is a valid mac address + */ + if(!tests::is_mac($server)){ + trigger_error("The given server address '".$server."' is invalid, it must be a valid mac address"); + return($ret); + } + + /* Prepare request event + */ + $xml_msg = + "". + "
gosa_krb5_del_principal
". + "".$name."". + "GOSA". + "".$server."". + "
"; + + return($this->_send($xml_msg,TRUE) == TRUE && !$this->is_error()); + } + + + /*! \brief Returns a list of configured password policies. + (Uses the GOsa support daemon instead of the ldap database.) + @return Array A list of all configured password policies. + */ + public function krb5_list_policies($server) + { + $res = array(); + + /* Check if the given server is a valid mac address + */ + if(!tests::is_mac($server)){ + trigger_error("The given server address '".$server."' is invalid, it must be a valid mac address"); + return($ret); + } + + /* Prepare request event + */ + $xml_msg = + "". + "
gosa_krb5_list_policies
". + "GOSA". + "".$server."". + "
"; + + $res = $this->_send($xml_msg,TRUE); + + /* Check if there are results for POLICY + */ + if(isset($res['XML']['POLICY'])){ + + /* Ensure that we return an array + */ + $tmp = $res['XML']['POLICY']; + if(!is_array($tmp)){ + $tmp = array($tmp); + } + return($tmp); + }else{ + return(array()); + } + } + + + /*! \brief Returns a list of configured password policies. + (Uses the GOsa support daemon instead of the ldap database.) + @return Array The policy settings for the given policy name. + */ + public function krb5_get_policy($server,$name) + { + $ret = array(); + + /* Check if the given name is a valid request value + */ + if(!is_string($name) || empty($name)){ + trigger_error("The given policy name is not of type string or it is empty."); + return($ret); + } + + /* Check if the given server is a valid mac address + */ + if(!tests::is_mac($server)){ + trigger_error("The given server address '".$server."' is invalid, it must be a valid mac address"); + return($ret); + } + + /* Prepare request event + */ + $xml_msg = + "". + "
gosa_krb5_get_policy
". + "".$name."". + "GOSA". + "".$server."". + "
"; + + /* Possible attributes */ + $attrs = array("MASK","POLICY","PW_HISTORY_NUM","PW_MAX_LIFE", + "PW_MIN_CLASSES","PW_MIN_LENGTH","PW_MIN_LIFE","POLICY_REFCNT"); + + + $tmp = $this->_send($xml_msg,TRUE); + if(isset($tmp['XML'])){ + foreach($attrs as $attr){ + if(isset($tmp['XML'][$attr])){ + $ret[$attr] = $tmp['XML'][$attr]; + }else{ + $ret[$attr] = ""; + } + } + } + return($ret); + } + + + /*! \brief Creates a new policy with a given set of configuration settings. + For a list of configurable attributes have a look at 'krb5_get_policy()'. + (Uses the GOsa support daemon instead of the ldap database.) + @pram String The name of the policy to update. + @pram Array The attributes to update + @return Boolean TRUE on success else FALSE. + */ + public function krb5_add_policy($server,$name,$values) + { + $ret = FALSE; + + /* Check if the given name is a valid request value + */ + if(!is_string($name) || empty($name)){ + trigger_error("The given policy name is not of type string or it is empty."); + return($ret); + } + if(!is_array($values) || !count($values)){ + trigger_error("No valid policy settings given. The parameter must be of type array and must contain at least one entry"); + return($ret); + } + + /* Check if the given server is a valid mac address + */ + if(!tests::is_mac($server)){ + trigger_error("The given server address '".$server."' is invalid, it must be a valid mac address"); + return($ret); + } + + + /* Transform array into + */ + $attrs = ""; + foreach($values as $id => $value){ + if(empty($id) || is_numeric($id)){ + trigger_error("Invalid policy configuration attribute given '".$id."=".$value."'."); + return($ret); + } + $id = strtolower($id); + $attrs.= "<$id>$value\n"; + } + + /* Prepare request event + */ + $xml_msg = + "". + "
gosa_krb5_create_policy
". + "".$name."". + $attrs. + "GOSA". + "".$server."". + "
"; + + return($this->_send($xml_msg,TRUE) == TRUE && !$this->is_error()); + } + + + /*! \brief Updates a given policy with a set of configuration settings. + For a list of configurable attributes have a look at 'krb5_get_policy()'. + (Uses the GOsa support daemon instead of the ldap database.) + @pram String The name of the policy to update. + @return Boolean TRUE on success else FALSE. + */ + public function krb5_set_policy($server,$name,$values) + { + $ret = FALSE; + + /* Check if the given name is a valid request value + */ + if(!is_string($name) || empty($name)){ + trigger_error("The given policy name is not of type string or it is empty."); + return($ret); + } + if(!is_array($values) || !count($values)){ + trigger_error("No valid policy settings given. The parameter must be of type array and must contain at least one entry"); + return($ret); + } + + /* Check if the given server is a valid mac address + */ + if(!tests::is_mac($server)){ + trigger_error("The given server address '".$server."' is invalid, it must be a valid mac address"); + return($ret); + } + + /* Transform array into + */ + $attrs = ""; + foreach($values as $id => $value){ + if(preg_match("/^policy$/i",$id)) continue; + if(empty($id) || is_numeric($id)){ + trigger_error("Invalid policy configuration attribute given '".$id."=".$value."'."); + return($ret); + } + $id = strtolower($id); + $attrs.= "<$id>$value\n"; + } + + /* Prepare request event + */ + $xml_msg = + "". + "
gosa_krb5_modify_policy
". + "".$name."". + $attrs. + "GOSA". + "".$server."". + "
"; + + return($this->_send($xml_msg,TRUE) == TRUE && !$this->is_error()); + } + + + /*! \brief Removes the given password policy. + (Uses the GOsa support daemon instead of the ldap database.) + @return Boolean TRUE on success else FALSE + */ + public function krb5_del_policy($server,$name) + { + $ret = FALSE; + + /* Check if the given server is a valid mac address + */ + if(!tests::is_mac($server)){ + trigger_error("The given server address '".$server."' is invalid, it must be a valid mac address"); + return($ret); + } + + /* Check if the given name is a valid request value + */ + if(!is_string($name) || empty($name)){ + trigger_error("The given policy name is not of type string or it is empty."); + return($ret); + } + + /* Prepare request event + */ + $xml_msg = + "". + "
gosa_krb5_del_policy
". + "".$name."". + "GOSA". + "".$server."". + "
"; + return($this->_send($xml_msg,TRUE) == TRUE && !$this->is_error()); + } + + + /*! \brief Sets the password of for the given principal. + (Uses the GOsa support daemon instead of the ldap database.) + @param String The servers mac + @param String The principals name + @param String $the new password. + @return Boolean TRUE on success else FALSE + */ + public function krb5_set_password($server,$name,$password) + { + $ret = FALSE; + + /* Check if the given server is a valid mac address + */ + if(!tests::is_mac($server)){ + trigger_error("The given server address '".$server."' is invalid, it must be a valid mac address"); + return($ret); + } + + /* Check if the given name is a valid request value + */ + if(!is_string($name) || empty($name)){ + trigger_error("The given principal name is not of type string or it is empty."); + return($ret); + } + + /* Prepare request event + */ + $xml_msg = + "". + "
gosa_krb5_set_password
". + "".$name."". + "".$password."". + "GOSA". + "".$server."". + "
"; + return($this->_send($xml_msg,TRUE) == TRUE && !$this->is_error()); + } + + + /*! \brief Returns log file informations for a given mac address + @param $mac The mac address to fetch logs for. + @retrun Array A Multidimensional array containing log infos. + MAC_00_01_6C_9D_B9_FA['install_20080311_090900'][0]=debconf.log + MAC_00_01_6C_9D_B9_FA['install_20080311_090900'][1]=syslog.log + install_20080313_144450 ... + */ + public function get_log_info_for_mac($mac) + { + $xml_msg = " + +
gosa_show_log_by_mac
+ GOSA + GOSA + ".$mac." +
"; + + $res = $this->_send($xml_msg,TRUE); + $ret = array(); + if(isset($res['XML'])){ + + /* Filter all entry that look like this + MAC_00_01_6C_9D_B9_FA + */ + foreach($res['XML'] as $name => $entry){ + if(preg_match("/^MAC/",$name)){ + + /* Get list of available log files + */ + if(!is_array($entry)){ + $entry = array($entry); + } + foreach($entry as $log_date){ + $xml_msg2 = " +
gosa_show_log_files_by_date_and_mac
+ GOSA + GOSA + ".$log_date." + ".$mac." +
"; + + $ret[$mac][$log_date] = array(); + $res = $this->_send($xml_msg2,TRUE); + $ret[$mac][$log_date]['DATE_STR'] = $log_date; + $ret[$mac][$log_date]['REAL_DATE'] = strtotime(preg_replace("/[^0-9]*/","",$log_date)); + if(isset($res['XML']['SHOW_LOG_FILES_BY_DATE_AND_MAC'])){ + $ret[$mac][$log_date]['FILES'] = $res['XML']['SHOW_LOG_FILES_BY_DATE_AND_MAC']; + } + } + } + } + } + return($ret); + } + + public function get_log_file($mac,$date,$file) + { + $xml_msg =" + +
gosa_get_log_file_by_date_and_mac
+ GOSA + GOSA + ".$date." + ".$mac." + ".$file." +
"; + + $res = $this->_send($xml_msg,TRUE); + if(isset($res['XML'][strtoupper($file)])){ + return(base64_decode($res['XML'][strtoupper($file)])); + } + return(""); + } + + + + + + /***************** + * DAK - Functions + *****************/ + + /*! \brief Returns all currenlty queued entries for a given DAK repository + @param ... + @return Array All queued entries. + */ + public function DAK_keyring_entries($server) + { + /* Ensure that we send the event to a valid mac address + */ + if(!is_string($server) || !tests::is_mac($server)){ + trigger_error("No valid mac address given '".$server."'."); + return; + } + + /* Create query + */ + $xml_msg = " +
gosa_get_dak_keyring
+ ".$server." + GOSA +
"; + + $res = $this->_send($xml_msg,TRUE); + + /* Check if there are results for POLICY + */ + if(isset($res['XML'])){ + $ret = array(); + foreach($res['XML'] as $key => $entry){ + if(preg_match("/^ANSWER/",$key)){ + $ret[] = $entry; + } + } + return($ret); + }else{ + return(array()); + } + } + + + /*! \brief Imports the given key into the specified keyring (Servers mac address) + @param String The servers mac address + @param String The gpg key. + @return Boolean TRUE on success else FALSE + */ + public function DAK_import_key($server,$key) + { + /* Ensure that we send the event to a valid mac address + */ + if(!is_string($server) || !tests::is_mac($server)){ + trigger_error("No valid mac address given '".$server."'."); + return; + } + + /* Check if there is some cleanup required before importing the key. + There may be some Header lines like: + -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.6 (GNU/Linux) + */ + if(preg_match("/BEGIN PGP PUBLIC KEY BLOCK/",$key)){ + + /* Remove header */ + $key = preg_replace("/^.*\n\n/sim","",$key); + /* Remove footer */ + $key = preg_replace("/-----.*$/sim","",$key); + }elseif (!preg_match('%^[a-zA-Z0-9/+]*={0,2}$%', $key)) { + + /* Encode key if it is raw. + */ + $key = base64_encode($key); + } + + /* Create query + */ + $xml_msg = " +
gosa_import_dak_key
+ ".$server." + ".$key." + GOSA +
"; + + $res = $this->_send($xml_msg,TRUE); + return($this->is_error()); + } + + + /*! \brief Removes a key from the keyring on the given server. + @param String The servers mac address + @param String The gpg key uid. + @return Boolean TRUE on success else FALSE + */ + public function DAK_remove_key($server,$key) + { + /* Ensure that we send the event to a valid mac address + */ + if(!is_string($server) || !tests::is_mac($server)){ + trigger_error("No valid mac address given '".$server."'."); + return; + } + + /* Create query + */ + $xml_msg = " +
gosa_remove_dak_key
+ ".$server." + ".$key." + GOSA +
"; + + $res = $this->_send($xml_msg,TRUE); + return($this->is_error()); + } } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: