X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_gosaSupportDaemon.inc;h=05817d193f7d32b2c8cc65a523ee8e718c386ee6;hb=3654000069256d0fb3b4cbb31bd2bd5478f163f2;hp=3b07b10c8b92396d3bd69ca238981a006836f0d0;hpb=91a019731f6012da1eabc8263aeec442e6dcc03b;p=gosa.git
diff --git a/gosa-core/include/class_gosaSupportDaemon.inc b/gosa-core/include/class_gosaSupportDaemon.inc
index 3b07b10c8..05817d193 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,30 @@ 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;
+ // Detect timeout
+ if($timeout == null){
+ $timeout = $config->get_cfg_value("gosaSupportTimeout",15);
+ }
+
+ /* 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("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("gosaSupportURI"));
+ $this->i_port= preg_replace("/^.*@[^:]+:(.*)$/", "$1", $config->get_cfg_value("gosaSupportURI"));
+ $this->s_encryption_key = preg_replace("/^(.*)@[^:]+:.*$/", "$1", $config->get_cfg_value("gosaSupportURI"));
}
-
+ $this->is_configured = TRUE;
$this->f_timeout = $timeout;
if($connect){
$this->connect();
@@ -63,6 +84,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.
*/
@@ -79,11 +106,50 @@ class gosaSupportDaemon
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 +165,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,8 +218,16 @@ 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);
}
@@ -141,34 +238,16 @@ class gosaSupportDaemon
"gosa_get_available_kernel".
"".
"GOSA".
- "".$release."".
+ "".$release."".
"";
$ret = array();
if($this->connect()){
- $this->o_sock->write($xml_msg);
- $str = trim($this->o_sock->read());
+ $entries = $this->_send($xml_msg,TRUE);
- /* 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 */
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 */
$ret = $entries['XML'];
foreach($ret as $key => $entry){
if(!preg_match("/^answer/i",$key)){
@@ -190,36 +269,16 @@ class gosaSupportDaemon
$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(),
- "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);
@@ -228,7 +287,6 @@ class gosaSupportDaemon
public function FAI_get_packages($release,$attrs,$package,$from=-1,$to=-1)
{
- $this->reset_error();
$ret = array();
/* Check Parameter */
@@ -277,27 +335,11 @@ class gosaSupportDaemon
"";
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(),
- "FAILED error was ".$this->get_error());
- return($ret);
- }
/* Unset header tags */
foreach(array("HEADER","SOURCE","TARGET","SESSION_ID") as $type){
@@ -317,41 +359,22 @@ class gosaSupportDaemon
public function FAI_get_server($name = "")
{
- $this->reset_error();
$xml_msg = "GOSA";
$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);
@@ -360,41 +383,21 @@ class gosaSupportDaemon
public function FAI_get_classes($name)
{
- $this->reset_error();
$xml_msg = "GOSA".
- "".$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);
@@ -406,7 +409,6 @@ class gosaSupportDaemon
*/
public function get_queued_entries($event_types = array("*"),$from=-1,$to=-1,$sort="timestamp DESC")
{
- $this->reset_error();
$ret = array();
$tags = "";
@@ -439,33 +441,16 @@ class gosaSupportDaemon
";
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);
}
@@ -480,7 +465,6 @@ class gosaSupportDaemon
trigger_error("Requires an array as parameter.");
return;
}
- $this->reset_error();
$ret = array();
@@ -502,19 +486,10 @@ class gosaSupportDaemon
";
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'];
}
}
@@ -534,7 +509,6 @@ class gosaSupportDaemon
trigger_error("Requires an array as parameter.");
return;
}
- $this->reset_error();
$ret = array();
@@ -556,16 +530,7 @@ class gosaSupportDaemon
";
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)){
@@ -588,7 +553,6 @@ class gosaSupportDaemon
trigger_error("Requires an array as parameter.");
return;
}
- $this->reset_error();
$ret = array();
@@ -610,16 +574,7 @@ class gosaSupportDaemon
";
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)){
@@ -643,7 +598,6 @@ class gosaSupportDaemon
return;
}
- $this->reset_error();
$xml_msg = "
@@ -660,16 +614,7 @@ class gosaSupportDaemon
";
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'])){
@@ -690,7 +635,6 @@ class gosaSupportDaemon
trigger_error("Requires an integer as parameter.");
return;
}
- $this->reset_error();
$ret = array();
$xml_msg = "
@@ -707,16 +651,7 @@ class gosaSupportDaemon
";
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'])){
@@ -738,7 +673,6 @@ class gosaSupportDaemon
return;
}
- $this->reset_error();
$ret = array();
@@ -760,16 +694,7 @@ class gosaSupportDaemon
";
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);
@@ -796,7 +721,7 @@ class gosaSupportDaemon
@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();
@@ -809,30 +734,46 @@ class gosaSupportDaemon
}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;
- $test2 = &$params;
- while($start_level < $xml_elem['level']) {
- $test2 = &$test2[$level[$start_level]];
- $start_level++;
+ 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(!isset($test2[$xml_elem['tag']])){
- if(isset($xml_elem['value'])){
- $test2[$xml_elem['tag']] = $xml_elem['value'];
+ if ($xml_elem['type'] == 'complete') {
+
+ $start_level = 1;
+ $test2 = &$params;
+ while($start_level < $xml_elem['level']) {
+ $test2 = &$test2[$level[$start_level]];
+ $start_level++;
}
- }else{
- if(!is_array($test2[$xml_elem['tag']])){
- $test2[$xml_elem['tag']] = array($test2[$xml_elem['tag']]);
+
+ /* 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'];
}
- $test2[$xml_elem['tag']][] = $xml_elem['value'];
}
}
}
@@ -849,6 +790,37 @@ class gosaSupportDaemon
}
+ 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.
@@ -856,7 +828,6 @@ class gosaSupportDaemon
*/
public function update_entries($ids,$data)
{
- $this->reset_error();
if(!is_array($ids)){
trigger_error("Requires an array as first parameter.");
return;
@@ -869,6 +840,7 @@ class gosaSupportDaemon
$attr = "";
foreach($data as $key => $value){
+ $key = strtolower($key);
if(is_array($value)){
foreach($value as $sub_value){
$attr.= "<$key>".strtolower($sub_value)."$key>\n";
@@ -899,17 +871,7 @@ class gosaSupportDaemon
";
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']);
@@ -953,16 +915,11 @@ class gosaSupportDaemon
$xml_msg ="GOSA";
$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']);
}
@@ -1005,13 +962,12 @@ class gosaSupportDaemon
/* 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
*/
@@ -1035,7 +991,9 @@ class gosaSupportDaemon
/* 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()){
@@ -1056,14 +1014,42 @@ class gosaSupportDaemon
}
-/*! \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 sending data
+ *******/
if($this->connect()){
$this->o_sock->write($data);
if ($answer_expected){
@@ -1078,18 +1064,29 @@ class gosaSupportDaemon
$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());
- }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());
+ if($this->use_alternative_xml_parse_method) {
+ 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());
+ }
}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());
}
}
return($ret);
@@ -1107,7 +1104,7 @@ class gosaSupportDaemon
foreach ($data as $key => $value){
if(is_array($value)){
foreach($value as $sub_val){
- $xml_message.= "<$key>$sub_value$key>";
+ $xml_message.= "<$key>$sub_val$key>";
}
}else{
$xml_message.= "<$key>$value$key>";
@@ -1200,7 +1197,7 @@ class gosaSupportDaemon
{
if (tests::is_mac($target)){
/* Get communication object */
- $d= new gosaSupportDaemon(TRUE,0.5);
+ $d= new gosaSupportDaemon(TRUE,2);
$answer= $d->_send("$target", TRUE);
return (count($answer) ? TRUE:FALSE);
}
@@ -1217,6 +1214,13 @@ class gosaSupportDaemon
{
$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 =
@@ -1226,7 +1230,12 @@ class gosaSupportDaemon
"".$server."".
"";
- return($this->_send($xml_msg,TRUE));
+ $tmp = $this->_send($xml_msg,TRUE);
+ if(isset($tmp['XML']['PRINCIPAL'])){
+ return($tmp['XML']['PRINCIPAL']);
+ }else{
+ return($res);
+ }
}
@@ -1235,7 +1244,7 @@ class gosaSupportDaemon
@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($name)
+ public function krb5_get_principal($server,$name)
{
$ret = array();
@@ -1246,6 +1255,13 @@ class gosaSupportDaemon
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 =
@@ -1253,20 +1269,101 @@ class gosaSupportDaemon
"".
"".$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$key>\n";
+ }
+ }else{
+ $attrs.= "<$key>$value$key>\n";
+ }
+ }
+
+ /* Prepare request event
+ */
+ $xml_msg =
+ "".
+ "gosa_krb5_create_principal".
+ "".$name."".
+ $attrs.
+ "".
+ "".$server."".
"";
- return($this->_send($xml_msg,TRUE));
+ return($this->_send($xml_msg,TRUE) == TRUE && !$this->is_error());
}
- /*! \brief Creates/Updates a given principal with a set of configuration settings.
+ function krb5_ramdomize_key($server,$name)
+ {
+ /* Prepare request event
+ */
+ $xml_msg =
+ "".
+ "".
+ "".$name."".
+ "".
+ "".$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($name,$values)
+ public function krb5_set_principal($server,$name,$values)
{
$ret = FALSE;
@@ -1281,27 +1378,41 @@ class gosaSupportDaemon
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 $name => $value){
- if(empty($name) || is_numeric($name)){
- trigger_error("Invalid configuration attribute given '".$name."=".$value."'.");
+ foreach($values as $key => $value){
+ if(empty($key) || is_numeric($key)){
+ trigger_error("Invalid configuration attribute given '".$key."=".$value."'.");
return($ret);
}
- $attrs = "<$name>$value$name>\n";
+ $key = strtolower($key);
+ if(is_array($value)){
+ foreach($value as $val){
+ $attrs.= "<$key>$val$key>\n";
+ }
+ }else{
+ $attrs.= "<$key>$value$key>\n";
+ }
}
/* Prepare request event
*/
$xml_msg =
"".
- "".
+ "gosa_krb5_modify_principal".
"".$name."".
$attrs.
"".
- "GOSA".
+ "".$server."".
"";
- return($this->_send($xml_msg,TRUE));
+ return($this->_send($xml_msg,TRUE) == TRUE && !$this->is_error());
}
@@ -1310,7 +1421,7 @@ class gosaSupportDaemon
@pram String The name of the principal. (e.g. peter@EXAMPLE.DE)
@return Boollean TRUE on success else FALSE
*/
- public function krb5_del_principal($name)
+ public function krb5_del_principal($server,$name)
{
$ret = FALSE;
@@ -1321,6 +1432,13 @@ class gosaSupportDaemon
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 =
@@ -1328,11 +1446,10 @@ class gosaSupportDaemon
"".
"".$name."".
"".
- "GOSA".
+ "".$server."".
"";
-
- return($this->_send($xml_msg,TRUE));
+ return($this->_send($xml_msg,TRUE) == TRUE && !$this->is_error());
}
@@ -1344,6 +1461,13 @@ class gosaSupportDaemon
{
$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 =
@@ -1378,7 +1502,7 @@ class gosaSupportDaemon
*/
public function krb5_get_policy($server,$name)
{
- $res = array();
+ $ret = array();
/* Check if the given name is a valid request value
*/
@@ -1404,12 +1528,18 @@ class gosaSupportDaemon
"".$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'])){
- $attrs = array("MASK","POLICY_REFCNT","PW_HISTORY_NUM","PW_MAX_LIFE","PW_MIN_CLASSES","PW_MIN_LENGTH","PW_MIN_LIFE");
foreach($attrs as $attr){
if(isset($tmp['XML'][$attr])){
$ret[$attr] = $tmp['XML'][$attr];
+ }else{
+ $ret[$attr] = "";
}
}
}
@@ -1417,13 +1547,14 @@ class gosaSupportDaemon
}
- /*! \brief Creates/Updates a given policy with a set of configuration settings.
+ /*! \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_set_policy($name,$values)
+ public function krb5_add_policy($server,$name,$values)
{
$ret = FALSE;
@@ -1438,29 +1569,94 @@ class gosaSupportDaemon
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 $name => $value){
- if(empty($name) || is_numeric($name)){
- trigger_error("Invalid policy configuration attribute given '".$name."=".$value."'.");
+ foreach($values as $id => $value){
+ if(empty($id) || is_numeric($id)){
+ trigger_error("Invalid policy configuration attribute given '".$id."=".$value."'.");
return($ret);
}
- $attrs = "<$name>$value$name>\n";
+ $id = strtolower($id);
+ $attrs.= "<$id>$value$id>\n";
}
/* Prepare request event
*/
$xml_msg =
"".
- "".
+ "".
"".$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$id>\n";
+ }
+
+ /* Prepare request event
+ */
+ $xml_msg =
+ "".
+ "".
+ "".$name."".
+ $attrs.
+ "".
+ "".$server."".
"";
- return($this->_send($xml_msg,TRUE));
+ return($this->_send($xml_msg,TRUE) == TRUE && !$this->is_error());
}
@@ -1468,10 +1664,17 @@ class gosaSupportDaemon
(Uses the GOsa support daemon instead of the ldap database.)
@return Boolean TRUE on success else FALSE
*/
- public function krb5_del_policy($name)
+ 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)){
@@ -1486,11 +1689,243 @@ class gosaSupportDaemon
"".
"".$name."".
"".
- "GOSA".
+ "".$server."".
"";
- return($this->_send($xml_msg,TRUE));
+ 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 =
+ "".
+ "".
+ "".$name."".
+ "".$password."".
+ "".
+ "".$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
+
+ ".$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
+
+ ".$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
+
+ ".$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 = "
+
+ ".$server."
+
+ ";
+
+ $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 = "
+
+ ".$server."
+ ".$key."
+
+ ";
+
+ $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 = "
+
+ ".$server."
+ ".$key."
+
+ ";
+
+ $res = $this->_send($xml_msg,TRUE);
+ return($this->is_error());
+ }
}
// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: