From 2bc36b4f6cc2bcbed445b83e245cc5779ac8c884 Mon Sep 17 00:00:00 2001 From: cajus Date: Wed, 19 Aug 2009 11:44:55 +0000 Subject: [PATCH] Moved snapshot and daemon handling to the listing class git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@14086 594d385d-05f5-0310-b6e9-bd551577e9d8 --- gosa-core/include/class_SnapshotHandler.inc | 247 ++++++++++++++++++++ gosa-core/include/class_config.inc | 57 +++++ gosa-core/include/class_listing.inc | 156 ++++++++++--- gosa-core/include/class_plugin.inc | 52 +---- 4 files changed, 429 insertions(+), 83 deletions(-) create mode 100644 gosa-core/include/class_SnapshotHandler.inc diff --git a/gosa-core/include/class_SnapshotHandler.inc b/gosa-core/include/class_SnapshotHandler.inc new file mode 100644 index 000000000..287fe94b5 --- /dev/null +++ b/gosa-core/include/class_SnapshotHandler.inc @@ -0,0 +1,247 @@ +config = &$config; + $config = $this->config; + + if($config->get_cfg_value("enableSnapshots") == "true"){ + + /* Check if the snapshot_base is defined */ + if ($config->get_cfg_value("snapshotBase") == ""){ + + /* Send message if not done already */ + if(!session::is_set("snapshotFailMessageSend")){ + session::set("snapshotFailMessageSend",TRUE); + msg_dialog::display(_("Configuration error"), + sprintf(_("The snapshot functionality is enabled, but the required variable '%s' is not set."), + "snapshotBase"), ERROR_DIALOG); + } + return; + } + + /* Check if the snapshot_base is defined */ + if (!is_callable("gzcompress")){ + + /* Send message if not done already */ + if(!session::is_set("snapshotFailMessageSend")){ + session::set("snapshotFailMessageSend",TRUE); + msg_dialog::display(_("Configuration error"), + sprintf(_("The snapshot functionality is enabled, but the required compression module is missing. Please install '%s'."),"php5-zip / php5-gzip"), ERROR_DIALOG); + } + return; + } + + /* check if there are special server configurations for snapshots */ + if ($config->get_cfg_value("snapshotURI") != ""){ + + /* check if all required vars are available to create a new ldap connection */ + $missing = ""; + foreach(array("snapshotURI","snapshotAdminDn","snapshotAdminPassword","snapshotBase") as $var){ + if($config->get_cfg_value($var) == ""){ + $missing .= $var." "; + + /* Send message if not done already */ + if(!session::is_set("snapshotFailMessageSend")){ + session::set("snapshotFailMessageSend",TRUE); + msg_dialog::display(_("Configuration error"), + sprintf(_("The snapshot functionality is enabled, but the required variable '%s' is not set."), + $missing), ERROR_DIALOG); + } + return; + } + } + } + $this->isEnabled= true; + return; + } + } + + + function enabled() + { + return $this->isEnabled; + } + + + function setSnapshotBases($bases) + { + $this->snapshotBases= $bases; + } + + + function getSnapshotBases() + { + return $this->snapshotBases; + } + + + function get_snapshot_link() + { + $snapshotLdap= null; + + /* check if there are special server configurations for snapshots */ + if($this->config->get_cfg_value("snapshotURI") != ""){ + $server= $this->config->get_cfg_value("snapshotURI"); + $user= $this->config->get_cfg_value("snapshotAdminDn"); + $password= $this->config->get_credentials($this->config->get_cfg_value("snapshotAdminPassword")); + $snapshotLdap= new ldapMultiplexer(new LDAP($user,$password, $server)); + } + + /* Prepare bases */ + $this->snapshotLdapBase= $this->config->get_cfg_value("snapshotBase"); + $snapshotLdap->cd($this->snapshotLdapBase); + if (!$snapshotLdap->success()){ + msg_dialog::display(_("LDAP error"), msgPool::ldaperror($snapshotLdap->get_error(), $this->snapshotLdapBase, "", get_class())); + } + + return $snapshotLdap; + } + + + function getDeletedSnapshots($objectBase, $raw= false) + { + // Skip if not enabled + if(!$this->enabled()){ + return(array()); + } + + // Load user info + $ui= get_userinfo(); + + /* Create an additional ldap object which + points to our ldap snapshot server */ + $ldap= $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + $snapshotLdap= $this->get_snapshot_link(); + if (!$snapshotLdap) { + $snapshotLdap= $ldap; + } + + // Initialize base + $base= preg_replace("/".preg_quote($this->config->current['BASE'], '/')."$/", + "", $objectBase).$this->snapshotLdapBase; + + /* Fetch all objects and check if they do not exist anymore */ + $objects= array(); + $snapshotLdap->cd($base); + $snapshotLdap->ls("(objectClass=gosaSnapshotObject)", $base, + array("gosaSnapshotType", "gosaSnapshotTimestamp", "gosaSnapshotDN", "description")); + while($entry = $snapshotLdap->fetch()){ + + $chk = str_replace($base,"",$entry['dn']); + if(preg_match("/,ou=/",$chk)) continue; + + if(!isset($entry['description'][0])){ + $entry['description'][0] = ""; + } + $objects[] = $entry; + } + + /* Check if entry still exists */ + foreach($objects as $key => $entry){ + $ldap->cat($entry['gosaSnapshotDN'][0]); + if($ldap->count()){ + unset($objects[$key]); + } + } + + /* Format result as requested */ + if($raw) { + return($objects); + }else{ + $tmp = array(); + foreach($objects as $key => $entry){ + $tmp[base64_encode($entry['dn'])] = $entry['description'][0]; + } + } + return($tmp); + } + + + function hasSnapshots($dn) + { + return (count($this->getSnapshots($dn)) > 0); + } + + + function getSnapshots($dn, $raw= false) + { + // Empty if disabled + if(!$this->enabled()){ + return(array()); + } + + /* Create an additional ldap object which + points to our ldap snapshot server */ + $ldap= $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + + // Load snapshot LDAP connection + $snapshotLdap= $this->get_snapshot_link(); + if (!$snapshotLdap) { + $snapshotLdap= $ldap; + } + + // Initialize base + $base= preg_replace("/".preg_quote($this->config->current['BASE'], '/')."$/", + "", $objectBase).$this->snapshotLdapBase; + + /* Fetch all objects with gosaSnapshotDN=$dn */ + $snapshotLdap->cd($base); + $snapshotLdap->ls("(&(objectClass=gosaSnapshotObject)(gosaSnapshotDN=".$dn."))",$base, + array("gosaSnapshotType","gosaSnapshotTimestamp","gosaSnapshotDN","description")); + + /* Put results into a list and add description if missing */ + $objects= array(); + while($entry = $snapshotLdap->fetch()){ + if(!isset($entry['description'][0])){ + $entry['description'][0] = ""; + } + $objects[] = $entry; + } + + /* Return the raw array, or format the result */ + if($raw){ + return($objects); + }else{ + $tmp = array(); + foreach($objects as $entry){ + $tmp[base64_encode($entry['dn'])] = $entry['description'][0]; + } + } + return($tmp); + } + +} +// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: +?> diff --git a/gosa-core/include/class_config.inc b/gosa-core/include/class_config.inc index abebcb0ad..6dd0527b8 100644 --- a/gosa-core/include/class_config.inc +++ b/gosa-core/include/class_config.inc @@ -1005,6 +1005,63 @@ class config { return(TRUE); } } + + /* Returns true if snapshots are enabled, and false if it is disalbed + There will also be some errors psoted, if the configuration failed */ + function snapshotEnabled() + { + if($this->get_cfg_value("enableSnapshots") == "true"){ + + /* Check if the snapshot_base is defined */ + if ($this->get_cfg_value("snapshotBase") == ""){ + + /* Send message if not done already */ + if(!session::is_set("snapshotFailMessageSend")){ + session::set("snapshotFailMessageSend",TRUE); + msg_dialog::display(_("Configuration error"), + sprintf(_("The snapshot functionality is enabled, but the required variable '%s' is not set."), + "snapshotBase"), ERROR_DIALOG); + } + return(FALSE); + } + + /* Check if the snapshot_base is defined */ + if (!is_callable("gzcompress")){ + + /* Send message if not done already */ + if(!session::is_set("snapshotFailMessageSend")){ + session::set("snapshotFailMessageSend",TRUE); + msg_dialog::display(_("Configuration error"), + sprintf(_("The snapshot functionality is enabled, but the required compression module is missing. Please install '%s'."),"php5-zip / php5-gzip"), ERROR_DIALOG); + } + return(FALSE); + } + + /* check if there are special server configurations for snapshots */ + if ($this->get_cfg_value("snapshotURI") != ""){ + + /* check if all required vars are available to create a new ldap connection */ + $missing = ""; + foreach(array("snapshotURI","snapshotAdminDn","snapshotAdminPassword","snapshotBase") as $var){ + if($this->get_cfg_value($var) == ""){ + $missing .= $var." "; + + /* Send message if not done already */ + if(!session::is_set("snapshotFailMessageSend")){ + session::set("snapshotFailMessageSend",TRUE); + msg_dialog::display(_("Configuration error"), + sprintf(_("The snapshot functionality is enabled, but the required variable '%s' is not set."), + $missing), ERROR_DIALOG); + } + return(FALSE); + } + } + } + return(TRUE); + } + return(FALSE); + } + } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: diff --git a/gosa-core/include/class_listing.inc b/gosa-core/include/class_listing.inc index 63124a194..c50453a8e 100644 --- a/gosa-core/include/class_listing.inc +++ b/gosa-core/include/class_listing.inc @@ -45,7 +45,8 @@ class listing { var $pid; var $objectTypes= array(); var $objectTypeCount= array(); - var $CopyPasteHandler= null; + var $copyPasteHandler= null; + var $snapshotHandler= null; function listing($filename) @@ -79,7 +80,24 @@ class listing { function setCopyPasteHandler($handler) { - $this->CopyPasteHandler= &$handler; + $this->copyPasteHandler= &$handler; + } + + + function setSnapshotHandler($handler) + { + $this->snapshotHandler= &$handler; + } + + + function setFilter($filter) + { + $this->filter= &$filter; + if ($this->departmentBrowser){ + $this->departments= $this->getDepartments(); + } + $this->filter->setBase($this->base); + $this->entries= $this->filter->query(); } @@ -200,7 +218,6 @@ class listing { function render() { -echo "snapshot handler, daemon handler
"; // Check for exeeded sizelimit if (($message= check_sizelimit()) != ""){ return($message); @@ -344,17 +361,6 @@ echo "snapshot handler, daemon handler
"; } - function setFilter($filter) - { - $this->filter= &$filter; - if ($this->departmentBrowser){ - $this->departments= $this->getDepartments(); - } - $this->filter->setBase($this->base); - $this->entries= $this->filter->query(); - } - - function update() { global $config; @@ -685,11 +691,7 @@ echo "snapshot handler, daemon handler
"; } // Handle special types - if ($action['type'] == "snapshot") { - #TODO - #echo "actiontriggers: snapshot missing
"; - } - if ($action['type'] == "copypaste") { + if ($action['type'] == "copypaste" || $action['type'] == "snapshot") { $objectType= $this->getObjectType($this->objectTypes, $this->entries[$row]['objectClass']); $category= $class= null; @@ -698,13 +700,12 @@ echo "snapshot handler, daemon handler
"; $class= $objectType['class']; } - $result.= $this->renderCopyPasteActions($row, $this->entries[$row]['dn'], $category, $class); - } - if ($action['type'] == "daemon") { - #TODO - #echo "actiontriggers: daemon missing
"; + if ($action['type'] == "copypaste") { + $result.= $this->renderCopyPasteActions($row, $this->entries[$row]['dn'], $category, $class); + } else { + $result.= $this->renderSnapshotActions($row, $this->entries[$row]['dn'], $category, $class); + } } - } return $result; @@ -943,13 +944,11 @@ echo "snapshot handler, daemon handler
"; break; case 'snapshot': - #TODO - #echo "actionmenu: snapshot missing
"; + $result.= $this->renderSnapshotMenu($separator); break; case 'daemon': - #TODO - #echo "actionmenu: daemon missing
"; + $result.= $this->renderDaemonMenu($separator); break; } @@ -1102,7 +1101,7 @@ echo "snapshot handler, daemon handler
"; { // We can only provide information if we've got a copypaste handler // instance - if(!(isset($this->CopyPasteHandler) && is_object($this->CopyPasteHandler))){ + if(!(isset($this->copyPasteHandler) && is_object($this->copyPasteHandler))){ return ""; } @@ -1136,7 +1135,7 @@ echo "snapshot handler, daemon handler
"; // Draw entries that allow pasting entries if($paste){ - if($this->CopyPasteHandler->entries_queued()){ + if($this->copyPasteHandler->entries_queued()){ $result.= " "._("Paste").""; }else{ $result.= " "._("Paste").""; @@ -1151,7 +1150,7 @@ echo "snapshot handler, daemon handler
"; { // We can only provide information if we've got a copypaste handler // instance - if(!(isset($this->CopyPasteHandler) && is_object($this->CopyPasteHandler))){ + if(!(isset($this->copyPasteHandler) && is_object($this->copyPasteHandler))){ return ""; } @@ -1182,6 +1181,99 @@ echo "snapshot handler, daemon handler
"; return($result); } + + function renderSnapshotMenu($separator) + { + // We can only provide information if we've got a snapshot handler + // instance + if(!(isset($this->snapshotHandler) && is_object($this->snapshotHandler))){ + return ""; + } + + // Presets + $result = ""; + $ui = get_userinfo(); + + if($this->snapshotHandler->enabled() && $ui->allow_snapshot_restore($this->base, $this->module)){ + + // Check if there is something to restore + $restore= false; + foreach($this->snapshotHandler->getSnapshotBases() as $base){ + $restore= $restore || count($this->snapshotHandler->getDeletedSnapshots($base)) > 0; + } + + // Draw icons according to the restore flag + if($restore){ + $result.= " "._("Restore snapshots").""; + }else{ + $result.= " "._("Restore snapshots").""; + } + } + + return($result); + } + + + function renderSnapshotActions($row, $dn, $category, $class, $copy= true, $cut= true) + { + // We can only provide information if we've got a snapshot handler + // instance + if(!(isset($this->snapshotHandler) && is_object($this->snapshotHandler))){ + return ""; + } + + // Presets + $result= ""; + $ui = get_userinfo(); + + // Only act if enabled here + if($this->snapshotHandler->enabled()){ + + // Draw restore button + if ($ui->allow_snapshot_restore($dn, $category)){ + + // Do we have snapshots for this dn? + if($this->snapshotHandler->hasSnapshots($dn)){ + $result.= ""; + } else { + $result.= " "; + } + } + + // Draw snapshot button + if($ui->allow_snapshot_create($dn, $category)){ + $result.= ""; + }else{ + $result.= " "; + } + } + + return($result); + } + + + function renderDaemonMenu($separator) + { + $result= ""; + + // If there is a daemon registered, draw the menu entries + if(class_available("DaemonEvent")){ + $events= DaemonEvent::get_event_types_by_category($this->categories); + if(count($events['BY_CLASS'])){ + foreach($events['BY_CLASS'] as $name => $event){ + $result.= " ".$event['s_Menu_Name'].""; + $separator= ""; + } + } + } + + return $result; + } + } ?> diff --git a/gosa-core/include/class_plugin.inc b/gosa-core/include/class_plugin.inc index 4d8f82a59..31115eced 100644 --- a/gosa-core/include/class_plugin.inc +++ b/gosa-core/include/class_plugin.inc @@ -1319,57 +1319,7 @@ class plugin There will also be some errors psoted, if the configuration failed */ function snapshotEnabled() { - $config = $this->config; - if($config->get_cfg_value("enableSnapshots") == "true"){ - - /* Check if the snapshot_base is defined */ - if ($config->get_cfg_value("snapshotBase") == ""){ - - /* Send message if not done already */ - if(!session::is_set("snapshotFailMessageSend")){ - session::set("snapshotFailMessageSend",TRUE); - msg_dialog::display(_("Configuration error"), - sprintf(_("The snapshot functionality is enabled, but the required variable '%s' is not set."), - "snapshotBase"), ERROR_DIALOG); - } - return(FALSE); - } - - /* Check if the snapshot_base is defined */ - if (!is_callable("gzcompress")){ - - /* Send message if not done already */ - if(!session::is_set("snapshotFailMessageSend")){ - session::set("snapshotFailMessageSend",TRUE); - msg_dialog::display(_("Configuration error"), - sprintf(_("The snapshot functionality is enabled, but the required compression module is missing. Please install '%s'."),"php5-zip / php5-gzip"), ERROR_DIALOG); - } - return(FALSE); - } - - /* check if there are special server configurations for snapshots */ - if ($config->get_cfg_value("snapshotURI") != ""){ - - /* check if all required vars are available to create a new ldap connection */ - $missing = ""; - foreach(array("snapshotURI","snapshotAdminDn","snapshotAdminPassword","snapshotBase") as $var){ - if($config->get_cfg_value($var) == ""){ - $missing .= $var." "; - - /* Send message if not done already */ - if(!session::is_set("snapshotFailMessageSend")){ - session::set("snapshotFailMessageSend",TRUE); - msg_dialog::display(_("Configuration error"), - sprintf(_("The snapshot functionality is enabled, but the required variable '%s' is not set."), - $missing), ERROR_DIALOG); - } - return(FALSE); - } - } - } - return(TRUE); - } - return(FALSE); + return $this->config->snapshotEnabled(); } -- 2.30.2