X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=gosa-core%2Finclude%2Fclass_SnapshotHandler.inc;h=ae04963fbbe1ecf2f58dc7dfd23d172880309a81;hb=dfd337167feecfc96bf7ecceda0bc548b2f30cd1;hp=287fe94b5a8af111bfeb8f114cfec067def92e84;hpb=2bc36b4f6cc2bcbed445b83e245cc5779ac8c884;p=gosa.git diff --git a/gosa-core/include/class_SnapshotHandler.inc b/gosa-core/include/class_SnapshotHandler.inc index 287fe94b5..ae04963fb 100644 --- a/gosa-core/include/class_SnapshotHandler.inc +++ b/gosa-core/include/class_SnapshotHandler.inc @@ -43,8 +43,8 @@ class SnapshotHandler { 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); + sprintf(_("The snapshot functionality is enabled but the required variable %s is not set!"), + bold("snapshotBase")), ERROR_DIALOG); } return; } @@ -56,7 +56,7 @@ class SnapshotHandler { 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); + sprintf(_("The snapshot functionality is enabled but the required PHP compression module is missing: %s!"), bold("php5-zip / php5-gzip")), ERROR_DIALOG); } return; } @@ -74,8 +74,8 @@ class SnapshotHandler { 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); + sprintf(_("The snapshot functionality is enabled but the required variable %s is not set!"), + bold($missing)), ERROR_DIALOG); } return; } @@ -212,6 +212,8 @@ class SnapshotHandler { $snapshotLdap= $ldap; } + $objectBase= preg_replace("/^[^,]*./","",$dn); + // Initialize base $base= preg_replace("/".preg_quote($this->config->current['BASE'], '/')."$/", "", $objectBase).$this->snapshotLdapBase; @@ -242,6 +244,283 @@ class SnapshotHandler { return($tmp); } + + /* Create a snapshot of the current object */ + function create_snapshot($dn, $description= array()) + { + + /* Check if snapshot functionality is enabled */ + if(!$this->snapshotEnabled()){ + return; + } + + /* Get configuration from gosa.conf */ + $config = $this->config; + + /* Create lokal ldap connection */ + $ldap= $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + + /* check if there are special server configurations for snapshots */ + if($config->get_cfg_value("snapshotURI") == ""){ + + /* Source and destination server are both the same, just copy source to dest obj */ + $ldap_to = $ldap; + $snapldapbase = $this->config->current['BASE']; + + }else{ + $server = $config->get_cfg_value("snapshotURI"); + $user = $config->get_cfg_value("snapshotAdminDn"); + $password = $this->config->get_credentials($config->get_cfg_value("snapshotAdminPassword")); + $snapldapbase = $config->get_cfg_value("snapshotBase"); + + $ldap_to = new ldapMultiplexer(new LDAP($user,$password, $server)); + $ldap_to -> cd($snapldapbase); + + if (!$ldap_to->success()){ + msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap_to->get_error(), $snapldapbase, "", get_class())); + } + + } + + /* check if the dn exists */ + if ($ldap->dn_exists($dn)){ + + /* Extract seconds & mysecs, they are used as entry index */ + list($usec, $sec)= explode(" ", microtime()); + + /* Collect some infos */ + $base = $this->config->current['BASE']; + $snap_base = $config->get_cfg_value("snapshotBase"); + $base_of_object = preg_replace ('/^[^,]+,/i', '', $dn); + $new_base = preg_replace("/".preg_quote($base, '/')."$/","",$base_of_object).$snap_base; + + /* Create object */ + $data = $ldap->generateLdif(LDAP::fix($dn), + "(&(!(objectClass=gosaDepartment))(!(objectClass=FAIclass)))",array(),'base'); + + $newName = str_replace(".", "", $sec."-".$usec); + $target= array(); + $target['objectClass'] = array("top", "gosaSnapshotObject"); + $target['gosaSnapshotData'] = gzcompress($data, 6); + $target['gosaSnapshotType'] = "snapshot"; + $target['gosaSnapshotDN'] = $dn; + $target['description'] = $description; + $target['gosaSnapshotTimestamp'] = $newName; + + /* Insert the new snapshot + But we have to check first, if the given gosaSnapshotTimestamp + is already used, in this case we should increment this value till there is + an unused value. */ + $new_dn = "gosaSnapshotTimestamp=".$newName.",".$new_base; + $ldap_to->cat($new_dn); + while($ldap_to->count()){ + $ldap_to->cat($new_dn); + $newName = str_replace(".", "", $sec."-".($usec++)); + $new_dn = "gosaSnapshotTimestamp=".$newName.",".$new_base; + $target['gosaSnapshotTimestamp'] = $newName; + } + /* Inset this new snapshot */ + $ldap_to->cd($snapldapbase); + $ldap_to->create_missing_trees($snapldapbase); + $ldap_to->create_missing_trees($new_base); + $ldap_to->cd($new_dn); + $ldap_to->add($target); + if (!$ldap_to->success()){ + msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap_to->get_error(), $new_dn, LDAP_ADD, get_class())); + } + + if (!$ldap->success()){ + msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $new_base, "", get_class())); + } + + } + } + + function remove_snapshot($dn) + { + $ui = get_userinfo(); + $old_dn = $this->dn; + $this->dn = $dn; + $ldap = $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + $ldap->rmdir_recursive($this->dn); + if(!$ldap->success()){ + msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $this->dn)); + } + $this->dn = $old_dn; + } + /* 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() + { + return $this->config->snapshotEnabled(); + } + + + /* Return available snapshots for the given base + */ + function Available_SnapsShots($dn,$raw = false) + { + if(!$this->snapshotEnabled()) 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']); + $cfg= &$this->config->current; + + /* check if there are special server configurations for snapshots */ + if($this->config->get_cfg_value("snapshotURI") == ""){ + $ldap_to = $ldap; + }else{ + $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")); + $snapldapbase = $this->config->get_cfg_value("snapshotBase"); + $ldap_to = new ldapMultiplexer(new LDAP($user,$password, $server)); + $ldap_to -> cd($snapldapbase); + if (!$ldap_to->success()){ + msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap_to->get_error(), $snapldapbase, "", get_class())); + } + } + /* Prepare bases and some other infos */ + $base = $this->config->current['BASE']; + $snap_base = $this->config->get_cfg_value("snapshotBase"); + $base_of_object = preg_replace ('/^[^,]+,/i', '', $dn); + $new_base = preg_replace("/".preg_quote($base, '/')."$/","",$base_of_object).$snap_base; + $tmp = array(); + + /* Fetch all objects with gosaSnapshotDN=$dn */ + $ldap_to->cd($new_base); + $ldap_to->ls("(&(objectClass=gosaSnapshotObject)(gosaSnapshotDN=".$dn."))",$new_base, + array("gosaSnapshotType","gosaSnapshotTimestamp","gosaSnapshotDN","description")); + + /* Put results into a list and add description if missing */ + while($entry = $ldap_to->fetch()){ + if(!isset($entry['description'][0])){ + $entry['description'][0] = ""; + } + $tmp[] = $entry; + } + + /* Return the raw array, or format the result */ + if($raw){ + return($tmp); + }else{ + $tmp2 = array(); + foreach($tmp as $entry){ + $tmp2[base64_encode($entry['dn'])] = $entry['description'][0]; + } + } + return($tmp2); + } + function getAllDeletedSnapshots($base_of_object,$raw = false) + { + if(!$this->snapshotEnabled()) 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']); + $cfg= &$this->config->current; + + /* check if there are special server configurations for snapshots */ + if($this->config->get_cfg_value("snapshotURI") == ""){ + $ldap_to = $ldap; + }else{ + $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")); + $snapldapbase = $this->config->get_cfg_value("snapshotBase"); + $ldap_to = new ldapMultiplexer(new LDAP($user,$password, $server)); + $ldap_to -> cd($snapldapbase); + if (!$ldap_to->success()){ + msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap_to->get_error(), $snapldapbase, "", get_class())); + } + } + + /* Prepare bases */ + $base = $this->config->current['BASE']; + $snap_base = $this->config->get_cfg_value("snapshotBase"); + $new_base = preg_replace("/".preg_quote($base, '/')."$/","",$base_of_object).$snap_base; + /* Fetch all objects and check if they do not exist anymore */ + $ui = get_userinfo(); + $tmp = array(); + $ldap_to->cd($new_base); + $ldap_to->ls("(objectClass=gosaSnapshotObject)",$new_base,array("gosaSnapshotType","gosaSnapshotTimestamp","gosaSnapshotDN","description")); + while($entry = $ldap_to->fetch()){ + + $chk = str_replace($new_base,"",$entry['dn']); + if(preg_match("/,ou=/",$chk)) continue; + + if(!isset($entry['description'][0])){ + $entry['description'][0] = ""; + } + $tmp[] = $entry; + } + + /* Check if entry still exists */ + foreach($tmp as $key => $entry){ + $ldap->cat($entry['gosaSnapshotDN'][0]); + if($ldap->count()){ + unset($tmp[$key]); + } + } + + /* Format result as requested */ + if($raw) { + return($tmp); + }else{ + $tmp2 = array(); + foreach($tmp as $key => $entry){ + $tmp2[base64_encode($entry['dn'])] = $entry['description'][0]; + } + } + return($tmp2); + } + + + /* Restore selected snapshot */ + function restore_snapshot($dn) + { + if(!$this->snapshotEnabled()) return(array()); + + $ldap= $this->config->get_ldap_link(); + $ldap->cd($this->config->current['BASE']); + $cfg= &$this->config->current; + + /* check if there are special server configurations for snapshots */ + if($this->config->get_cfg_value("snapshotURI") == ""){ + $ldap_to = $ldap; + }else{ + $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")); + $snapldapbase = $this->config->get_cfg_value("snapshotBase"); + $ldap_to = new ldapMultiplexer(new LDAP($user,$password, $server)); + $ldap_to -> cd($snapldapbase); + if (!$ldap_to->success()){ + msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap_to->get_error(), $snapldapbase, "", get_class())); + } + } + + /* Get the snapshot */ + $ldap_to->cat($dn); + $restoreObject = $ldap_to->fetch(); + + /* Prepare import string */ + $data = gzuncompress($ldap_to->get_attribute($dn,'gosaSnapshotData')); + + /* Import the given data */ + $err = ""; + $ldap->import_complete_ldif($data,$err,false,false); + if (!$ldap->success()){ + msg_dialog::display(_("LDAP error"), msgPool::ldaperror($ldap->get_error(), $dn, "", get_class())); + } + } + + } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: ?>