X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_gosaSupportDaemon.inc;h=1f0ace96d53023ff967279645cc5fa577357232e;hb=0a8eb52048cd81d884b8e3f63613dc70e444fc27;hp=1050fa54e8a9796d572f808d2d568fef5b417f1e;hpb=0189bd2056a0b11f591d350964074b2ab7d3b4e3;p=gosa.git
diff --git a/gosa-core/include/class_gosaSupportDaemon.inc b/gosa-core/include/class_gosaSupportDaemon.inc
index 1050fa54e..1f0ace96d 100644
--- a/gosa-core/include/class_gosaSupportDaemon.inc
+++ b/gosa-core/include/class_gosaSupportDaemon.inc
@@ -1,55 +1,101 @@
s_host = $host;
- $this->i_port = $port;
- $this->f_timeout = $timeout;
- $this->s_encryption_key = $key;
- if($connect){
- $this->connect();
+ #FIXME: bad idea about referencing global variables from within classes
+ global $config;
+
+ # load from config, store statically
+ if (isset($config->current['GOSA_SI'])){
+
+ if ($this->s_host == ""){
+ $this->s_host= preg_replace("/^.*@([^:]+):.*$/", "$1", $config->current['GOSA_SI']);
+ $this->i_port= preg_replace("/^.*@[^:]+:(.*)$/", "$1", $config->current['GOSA_SI']);
+ $this->s_encryption_key = preg_replace("/^(.*)@[^:]+:.*$/", "$1", $config->current['GOSA_SI']);
+ }
+
+ $this->f_timeout = $timeout;
+ if($connect){
+ $this->connect();
+ }
}
}
- /*! \brief Establish deamon connection.
- @return boolean Returns true if the connection was succesfully established.
+ /*! \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;
+ if(!empty($this->s_host) && !empty($this->i_port)){
+ $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();
+ new log("debug","gosaSupportDaemon::connect()", "Cannot connect to si-server", array(),$this->get_error());
+ }
}else{
- $this->error = $this->o_sock->get_error();
- $this->is_connected = FALSE;
+ $this->set_error(msgPool::cmdnotfound("GOSA_SI",_("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 Disconnect from gosa deamon.
+ /*! \brief Disconnect from gosa daemon.
*/
public function disconnect()
{
@@ -59,7 +105,7 @@ class gosaSupportDaemon
/*! \brief Sets an error message, which can be returned with get_error().
- @param string The Error message,
+ @param string The Error message,
*/
private function set_error($str)
{
@@ -68,8 +114,18 @@ class gosaSupportDaemon
}
+ /*! \brief Sets an error message, which can be returned with get_error().
+ @param string The Error message,
+ */
+ private function reset_error()
+ {
+ $this->b_error = FALSE;
+ $this->s_error = "";
+ }
+
+
/*! \brief Checks if an error occured.
- @return boolean returns TRUE or FALSE, whether there is an error or not.
+ @return boolean returns TRUE or FALSE, whether there is an error or not.
*/
public function is_error()
{
@@ -78,261 +134,1827 @@ class gosaSupportDaemon
/*! \brief Returns the last error.
- @return Returns the last error.
+ @return Returns the last error.
*/
public function get_error()
{
- return($this->s_error);
+ $str = $this->s_error;
+ $ret = "";
+ if(is_string($str)){
+ $ret = $str;
+ }else{
+ foreach($str as $msg){
+ $ret .= $msg." ";
+ }
+ }
+ $ret = preg_replace("/ /"," ",$ret);
+ return($ret);
}
- /*! \brief Returns an array containing all queued entries.
- @return Array All queued entries as an array.
- */
- public function get_queued_entries()
+ public function FAI_get_kernels($release)
{
- $this->b_error = FALSE;
- $this->s_error = "";
+ $xml_msg =
+ "".
+ "gosa_get_available_kernel".
+ "".
+ "GOSA".
+ "".$release."".
+ "";
+ $ret = array();
+ if($this->connect()){
+ $this->o_sock->write($xml_msg);
+ $str = trim($this->o_sock->read());
- $xml_msg = "
-
-
-
-
- gt
- -1
-
-
-
- ";
+ /* Check if something went wrong while reading */
+ if($this->o_sock->is_error()){
+ $this->set_error($this->o_sock->get_error());
+ return($ret);
+ }
- $this->connect();
- if($this->is_connected){
+ $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'])){
+ 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)){
+ unset($ret[$key]);
+ }
+ }
+ }
+ }
+ }
+ return($ret);
+ }
+
+
+ public function FAI_get_package_sections($release)
+ {
+ $xml_msg = "GOSA".
+ "".
+ "".$release."";
+
+ $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);
+ if(isset($entries['XML']) && is_array($entries['XML'])){
- if(!array_key_exists("XML",$entries)){
- $this->set_error("!!!Couldn't parse xml.");
- $this->disconnect();
- return;
- }else{
- if(!is_array($entries['XML'])) {
- $ret = array();
- }else{
- $ret = $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]);
+ }
+ }
+ $ret = $entries['XML'];
}
}
- return($ret);
}
- $this->set_error("Could not establish socket connection.");
- $this->disconnect();
- return;
+ 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)
+ public function FAI_get_packages($release,$attrs,$package,$from=-1,$to=-1)
{
- if(!is_numeric($id)){
- trigger_error("gosaSupportDaemon::get_entry() requires an integer value as ID parameter.");
- return;
+ $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);
}
- $this->b_error = FALSE;
- $this->s_error = "";
- $xml_msg = "
-
-
-
-
- eq
- ".$id."
-
-
-
- ";
- $this->connect();
- if(!$this->is_connected){
- $this->set_error("Could not establish socket connection.");
+ /* 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.= "";
+ }
+
+ /* If no package is given, search for all */
+ if(!count($package)) $package = array("%");
+
+ /* Create limit tag */
+ if($from == -1){
+ $limit ="";
}else{
+ $limit = "".$from."".$to."";
+ }
+
+ /* Create list of attributes to fetch */
+ $pkgs = "";
+ foreach($package as $pkg){
+ $pkgs .="like".$pkg."";
+ }
+
+ $xml_msg = "GOSA".
+ $attr.
+ "
+ ".$release."
+ OR
+ ".$pkgs."
+
+ ".
+ $limit.
+ "";
+
+ if($this->connect()){
$this->o_sock->write($xml_msg);
$str = trim($this->o_sock->read());
- $entries = $this->xml_to_array($str);
- if(isset($entries['XML']['ANSWER1'])){
- $this->disconnect();
- return(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);
+ 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]);
+ }
+ }
+ $ret = $entries['XML'];
+ }
}
}
- $this->disconnect();
- return(FALSE);
+ return($ret);
+
+
}
-
- /*! \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($id)
+
+ public function FAI_get_server($name = "")
{
- if(!is_numeric($id)){
- trigger_error("gosaSupportDaemon::get_entry() requires an integer value as ID parameter.");
- return;
+ $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);
+ 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]);
+ }
+ }
+ $ret = $entries['XML'];
+ }
+ }
}
+ return($ret);
+ }
- $this->b_error = FALSE;
- $this->s_error = "";
- $xml_msg = "
-
-
-
-
- eq
- ".$id."
-
-
-
- ";
- $this->connect();
- if(!$this->is_connected){
- $this->set_error("Could not establish socket connection.");
- }else{
+
+ public function FAI_get_classes($name)
+ {
+ $this->reset_error();
+ $xml_msg = "GOSA".
+ "".$name."";;
+ $ret = array();
+ if($this->connect()){
$this->o_sock->write($xml_msg);
$str = trim($this->o_sock->read());
- $entries = $this->xml_to_array($str);
- if(!isset($entries['XML']['ANSWER1'])){
- $this->set_error("Entry with id (".$id.") not found.");
- $this->disconnect();
- }else{
- $ret = $entries['XML']['ANSWER1'];
+
+ /* 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);
+ 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]);
+ }
+ }
+ $ret = $entries['XML'];
+ }
+ }
}
- return;
+ return($ret);
}
- /*! \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.
+ /*! \brief Returns an array containing all queued entries.
+ @return Array All queued entries as an array.
*/
- public function remove_entry($id)
+ public function get_queued_entries($event_types = array("*"),$from=-1,$to=-1,$sort="timestamp DESC")
{
- $this->b_error = FALSE;
- $this->s_error = "";
+ $this->reset_error();
+ $ret = array();
- $xml_msg = "
-
-
-
-
- eq
- ".$id."
-
-
-
- ";
- $this->connect();
- if($this->is_connected){
+ $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
+
+ ".$tags."
+
+ ".$sort."";
+ if($from != -1 && $to != -1){
+ $xml_msg.= "
+
+ ".$from."
+ ".$to."
+ ";
+ }
+ $xml_msg.= "
+ ";
+
+ if($this->connect()){
$this->o_sock->write($xml_msg);
- return(TRUE);
+ $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);
+ 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'];
+ }
+ }
}
- $this->set_error("Could not establish socket connection.");
- return(FALSE);
+
+ /* Remove session ID. No one is interested in this... */
+ unset($ret['SESSION_ID']);
+
+ return($ret);
}
-
- /*! \brief Parses the given xml string into an array
- @param String XML string
- @return Array Returns an array containing the xml structure.
+
+ /*! \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.
*/
- function xml_to_array($xml)
+ public function ids_exist($ids)
{
- $params = array();
- $level = array();
- $parser = xml_parser_create_ns();
- xml_parse_into_struct($parser, $xml, $vals, $index);
+ if(!is_array($ids)){
+ trigger_error("Requires an array as parameter.");
+ return;
+ }
+ $this->reset_error();
- $err_id = xml_get_error_code($parser);
- if($err_id){
- $this->set_error(xml_error_string(xml_get_error_code($parser)));
- xml_parser_free($parser);
- }else{
- xml_parser_free($parser);
+ $ret = array();
- 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++;
+ $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());
+
+ /* 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);
+ if(isset($entries['XML']) && is_array($entries['XML'])){
+ foreach($entries['XML'] as $entry){
+ if(is_array($entry) && array_key_exists("ID",$entry)){
+ $ret[] = $entry['ID'];
}
- $php_stmt .= '[$xml_elem[\'tag\']] = $xml_elem[\'value\'];';
- @eval($php_stmt);
}
}
}
- return($params);
+ return($ret);
}
- /*! \brief Updates an entry with a set of new values,
- @param Integer The ID of the entry, we want to update.
- @param Array The variables to update.
- @return Boolean Returns TRUE on success.
+ /*! \brief Returns 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 update_entry($id,$entry)
+ public function get_entries_by_mac($macs)
{
- $this->b_error = FALSE;
- $this->s_error = "";
- if(!is_numeric($id)){
- trigger_error("Requires an integer value as ID parameter.");
+ if(!is_array($macs)){
+ trigger_error("Requires an array as parameter.");
return;
}
+ $this->reset_error();
- if(!is_array($entry)){
- trigger_error("Requires an array as second parameter.");
+ $ret = array();
+
+ $xml_msg = "
+
+ GOSA
+
+
+
+ or";
+ foreach($macs as $mac){
+ $xml_msg .= "
+ eq
+ ".$mac."
+ ";
+ }
+ $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);
+ if(isset($entries['XML'])){
+ foreach($entries['XML'] as $name => $entry){
+ if(preg_match("/^ANSWER[0-9]*$/",$name)){
+ $ret[$name] = $entry;
+ }
+ }
+ }
+ }
+ 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();
- $attr = "";
- foreach($entry as $name => $entry){
- $attr.="<".strtolower($name).">".$entry."".strtolower($name).">\n";
+ $ret = array();
+
+ $xml_msg = "
+
+ GOSA
+
+
+
+ or";
+ foreach($ids as $id){
+ $xml_msg .= "
+ eq
+ ".$id."
+ ";
}
+ $xml_msg .= "
+
+ ";
- $xml_msg = "
- gosa_update_status_jobdb_entry
-
- ".$id."
-
-
- ".$attr."
-
- ";
- $this->connect();
- if($this->is_connected){
+ if($this->connect()){
$this->o_sock->write($xml_msg);
- $str = trim($this->o_sock->read());
- $entries = $this->xml_to_array($str);
- if(!empty($str)){
- return(TRUE);
+ $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);
}
- return(FALSE);
- }
- $this->set_error("Could not establish socket connection.");
- return(FALSE);
+
+ $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());
+
+ /* 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);
+ 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());
+
+ /* 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);
+ 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();
+
+ /* 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);
+ if(isset($entries['XML']) || isset($entries['COUNT'])){
+ new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::remove_entries()", $ids,"SUCCESS");
+ return(TRUE);
+ }else{
+ new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::remove_entries()", $ids,"FAILED ".$this->get_error());
+ }
+ }
+ 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)
+ {
+ return($this->remove_entries(array($id)));
+ }
+
+
+ /*! \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;
+ $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'];
+ }
+ }
+ }
+ }
+
+ if(!isset($params['XML'])){
+ if (!array_key_exists('XML', $params)){
+ $this->set_error(_("Cannot 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,$data)
+ {
+ $this->reset_error();
+ if(!is_array($ids)){
+ trigger_error("Requires an array as first parameter.");
+ return;
+ }
+
+ if(!is_array($data)){
+ trigger_error("Requires an array as second parameter.");
+ return;
+ }
+
+ $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";
+ }
+ }else{
+ $attr.= "<$key>".strtolower($value)."$key>\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());
+
+ /* 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);
+ if(isset($entries['XML'])){
+ if(isset($entries['XML']['ERROR_STRING'])) {
+ $this->set_error($entries['XML']['ERROR_STRING']);
+ new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::update_entries()", $ids,"FAILED setting (".$attr.") error was ".$this->get_error());
+ return(FALSE);
+ }
+ new log("debug","DaemonEvent (IDS) ", "gosaSupportDaemon::update_entries()", $ids,"SUCCESS");
+ return(TRUE);
+ }
+ }
+ return(FALSE);
+ }
+
+
+ /*! \brief Returns the number of currently queued objects.
+ @return Integer
+ */
+ 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".
+ "".
+ "".
+ $tags.
+ "";
+
+ $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 */
+ 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']);
+ }
+ }
+ return(-1);
+ }
+
+
+ public function send_data($header, $to, $data= array(), $answer_expected = FALSE)
+ {
+ $xml_message= "";
+
+ /* Prepare data */
+ foreach ($data as $key => $value){
+ if(is_array($value)){
+ foreach($value as $sub_value){
+ $xml_message.= "<$key>$sub_value$key>";
+ }
+ }else{
+ $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()){
+
+ $request_answer = FALSE;
+ if($event->get_type() == SCHEDULED_EVENT){
+ $action = $event->get_schedule_action();
+ }elseif($event->get_type() == TRIGGERED_EVENT){
+ $action = $event->get_trigger_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,$request_answer);
+
+ 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());
+
+ /* 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);
+ 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());
+ }else{
+ 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());
+ }
+ }
+ 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){
+ if(is_array($value)){
+ foreach($value as $sub_val){
+ $xml_message.= "<$key>$sub_val$key>";
+ }
+ }else{
+ $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);
+ }
+
+
+ /*! \brief Removes all jobs from the queue that are tiggered with a specific macAddress.
+ @param String $mac The mac address for which we want to remove all jobs.
+ */
+ function clean_queue_from_mac($mac)
+ {
+ global $config;
+
+ /* First of all we have to check which jobs are startet
+ * for $mac
+ */
+ $xml_msg ="GOSA".$mac."";
+
+ new log("debug","DaemonEvent ", "gosaSupportDaemon::clean_queue_from_mac()", array($mac => $mac)," start cleaning.");
+
+ $data = $this->_send($xml_msg,TRUE);
+ if(is_array($data) && isset($data['XML'])){
+ $already_aborted = FALSE;
+ foreach($data['XML'] as $name => $entry){
+ if(preg_match("/answer[0-9]*/i",$name)){
+ $entry['STATUS'] = strtoupper($entry['STATUS']);
+ switch($entry['STATUS']){
+
+ case 'PROCESSING' :
+
+ /* Send abort event, but only once
+ */
+ if($already_aborted){
+ break;
+ }elseif(class_available("DaemonEvent_faireboot")){
+ $already_aborted = TRUE;
+ $tmp = new DaemonEvent_faireboot($config);
+ $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);
+ 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{
+ new log("debug","DaemonEvent ", "gosaSupportDaemon::clean_queue_from_mac()", array($mac => $mac),
+ "SUCCESS, send 'DaemonEvent_faireboot' for entry ID (".$entry['ID'].")");
+ }
+ ;break;
+ }else{
+ /* Couldn't find abort event, just remove entry */
+ }
+
+ case 'WAITING':
+ case 'ERROR':
+ default :
+
+ /* Simply remove entries from queue.
+ * 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);
+ }
+ ;break;
+ }
+
+ }
+ }
+ }
+ }
+
+
+ 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);
+ }
+
+
+
+ /*! \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".
+ "".
+ "".$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 =
+ "".
+ "".
+ "".$name."".
+ "".
+ "".$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) == TRUE && !$this->is_error());
+ }
+
+
+ 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($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$key>\n";
+ }
+ }else{
+ $attrs.= "<$key>$value$key>\n";
+ }
+ }
+
+ /* Prepare request event
+ */
+ $xml_msg =
+ "".
+ "gosa_krb5_modify_principal".
+ "".$name."".
+ $attrs.
+ "".
+ "".$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 =
+ "".
+ "".
+ "".$name."".
+ "".
+ "".$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 =
+ "".
+ "".
+ "".
+ "".$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)
+ {
+ $res = 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 =
+ "".
+ "".
+ "".$name."".
+ "".
+ "".$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$id>\n";
+ }
+
+ /* Prepare request event
+ */
+ $xml_msg =
+ "".
+ "".
+ "".$name."".
+ $attrs.
+ "".
+ "".$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) == 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 =
+ "".
+ "".
+ "".$name."".
+ "".
+ "".$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 =
+ "".
+ "".
+ "".$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
+ */
+ 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("/".normalizePreg("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());
}
}