X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=include%2Fclass_plugin.inc;h=f9cfa6aa4209aedf92aa7238be9cabe99719f574;hb=aa26133f196b0c42cb491ed19f9d596255d9ab91;hp=d3515c98cb954b5eaef0b900d739cd558d49960b;hpb=2dc4cf6ba95dcefb99e0317dba8b4e2ba7fe1125;p=gosa.git diff --git a/include/class_plugin.inc b/include/class_plugin.inc index d3515c98c..f9cfa6aa4 100644 --- a/include/class_plugin.inc +++ b/include/class_plugin.inc @@ -871,11 +871,11 @@ class plugin //FIXME: How to optimize this? We have at least two // LDAP accesses per object. It would be a good // idea to have it integrated. - + /* No dn? Self-operation... */ if ($dn == ""){ $dn= $this->dn; - + /* No tag? Find it yourself... */ if ($tag == ""){ $len= strlen($dn); @@ -908,7 +908,7 @@ class plugin } } } - + /* Set tag? */ if ($tag != ""){ @@ -943,7 +943,7 @@ class plugin } else { @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, "Not tagging ($tag) $dn - seems to have moved away", "Tagging"); } - + } else { /* Remove objectclass and attribute */ $ldap= $this->config->get_ldap_link(); @@ -973,7 +973,7 @@ class plugin @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, "Not removing tag ($tag) $dn - seems to have moved away", "Tagging"); } } - + } @@ -988,28 +988,44 @@ class plugin /* Create a snapshot of the current object */ function create_snapshot($type= "snapshot", $description= array()) { - if(!$this->snapshotEnabled()) return; - /* Create 2 ldap connections - one connection points to the snapshot server and - one to our basic ldap server */ + /* Check if snapshot functionality is enabled */ + if(!$this->snapshotEnabled()){ + return; + } + + /* Get configuration from gosa.conf */ + $tmp = $this->config->current; + /* Check if the undo level is specified */ + if(isset($tmp['SNAPSHOT_UNDO_LEVEL'])){ + $UndoLvl = $tmp['SNAPSHOT_UNDO_LEVEL']; + }else{ + $UndoLvl = 5; + } + + /* Create lokal ldap connection */ $ldap= $this->config->get_ldap_link(); $ldap->cd($this->config->current['BASE']); - $tmp = $this->config->data['MAIN']; - + /* check if there are special server configurations for snapshots */ - if(isset($tmp['SNAPSHOT_SERVER'])){ + if(!isset($tmp['SNAPSHOT_SERVER'])){ + + /* Source and destination server are both the same, just copy source to dest obj */ + $ldap_to = $ldap; + $snapldapbase = $this->config->current['BASE']; + + }else{ $server = $tmp['SNAPSHOT_SERVER']; $user = $tmp['SNAPSHOT_USER']; $password = $tmp['SNAPSHOT_PASSWORD']; $snapldapbase = $tmp['SNAPSHOT_LDAP_BASE']; + $ldap_to = new LDAP($user,$password, $server); $ldap_to -> cd($snapldapbase); show_ldap_error($ldap_to->get_error(), _("Snapshot failed.")); - }else{ - $ldap_to = $ldap; } - + + /* check if the dn exists */ if ($ldap->dn_exists($this->dn)){ @@ -1023,7 +1039,8 @@ class plugin $new_base = preg_replace("/".normalizePreg($base)."$/","",$base_of_object).$snap_base; /* Create object */ - $data = preg_replace('/^dn:.*\n/', '', $ldap->gen_ldif($this->dn,"(!(objectClass=gosaDepartment))")); +#$data = preg_replace('/^dn:.*\n/', '', $ldap->gen_ldif($this->dn,"(!(objectClass=gosaDepartment))")); + $data = $ldap->gen_ldif($this->dn,"(&(!(objectClass=gosaDepartment))(!(objectClass=FAIclass)))"); $newName = preg_replace("/\./", "", $sec."-".$usec); $target= array(); $target['objectClass'] = array("top", "gosaSnapshotObject"); @@ -1034,9 +1051,9 @@ class plugin $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. */ + 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()){ @@ -1046,46 +1063,80 @@ class plugin $target['gosaSnapshotTimestamp'] = $newName; } - /* Inset this new snapshot */ + $ldap_to->cd($snapldapbase); $ldap_to->create_missing_trees($new_base); $ldap_to->cd($new_dn); $ldap_to->add($target); + show_ldap_error($ldap_to->get_error(), _("Create snapshot failed.")); show_ldap_error($ldap->get_error(), _("Create snapshot failed.")); + + /* Check amount of used snapshots, and remove old ones if necessary */ + $test = $this->Available_SnapsShots($this->dn,true); + if(count($test) > $UndoLvl){ + $toDel = array(); + foreach($test as $entry){ + $toDel[preg_replace("/-/","",$entry['gosaSnapshotTimestamp'][0])] = $entry['dn']; + } + krsort($toDel); + $i = 0 ; + foreach($toDel as $entryID => $entry){ + $i ++ ; + if($i > $UndoLvl){ + $ldap_to->rmdir_recursive($entry); + } + } + } } } - - /* returns true if snapshots are enabled */ + + /* 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() { - $tmp = $this->config->data['MAIN']; + $tmp = $this->config->current; if(isset($tmp['ENABLE_SNAPSHOT'])){ if (preg_match("/^true$/i", $tmp['ENABLE_SNAPSHOT']) || preg_match("/yes/i", $tmp['ENABLE_SNAPSHOT'])){ + + /* Check if the snapshot_base is defined */ + if(!isset($tmp['SNAPSHOT_BASE'])){ + print_red(sprintf(_("The snapshot functionality is enabled, but the required variable '%s' is not configured in your gosa.conf."),$missing)); + return(FALSE); + } + + /* check if there are special server configurations for snapshots */ + if(isset($tmp['SNAPSHOT_SERVER'])){ + + /* check if all required vars are available to create a new ldap connection */ + $missing = ""; + foreach(array("SNAPSHOT_SERVER","SNAPSHOT_USER","SNAPSHOT_PASSWORD","SNAPSHOT_LDAP_BASE") as $var){ + if(!isset($tmp[$var])){ + $missing .= $var." "; + print_red(sprintf(_("The snapshot functionality is enabled, but the required variable(s) '%s' is not configured in your gosa.conf."),$missing)); + return(FALSE); + } + } + } return(TRUE); } } - return(false); + return(FALSE); } - + /* 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 */ + points to our ldap snapshot server */ $ldap= $this->config->get_ldap_link(); $ldap->cd($this->config->current['BASE']); - $tmp = $this->config->data['MAIN']; - - if(!isset($tmp['SNAPSHOT_BASE'])){ - print_red(_("Please specify the attribute SNAPSHOT_BASE in your gosa.conf.")); - return(array()); - } + $tmp = $this->config->current; /* check if there are special server configurations for snapshots */ if(isset($tmp['SNAPSHOT_SERVER'])){ @@ -1110,8 +1161,8 @@ class plugin /* 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")); - + 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])){ @@ -1136,12 +1187,12 @@ class plugin function getAllDeletedSnapshots($base_of_object,$raw = false) { if(!$this->snapshotEnabled()) return(array()); - + /* Create an additional ldap object which - points to our ldap snapshot server */ + points to our ldap snapshot server */ $ldap= $this->config->get_ldap_link(); $ldap->cd($this->config->current['BASE']); - $tmp = $this->config->data['MAIN']; + $tmp = $this->config->current; /* check if there are special server configurations for snapshots */ if(isset($tmp['SNAPSHOT_SERVER'])){ @@ -1185,8 +1236,6 @@ class plugin } } - - /* Format result as requested */ if($raw) { return($tmp); @@ -1207,7 +1256,7 @@ class plugin $ldap= $this->config->get_ldap_link(); $ldap->cd($this->config->current['BASE']); - $tmp = $this->config->data['MAIN']; + $tmp = $this->config->current; /* check if there are special server configurations for snapshots */ if(isset($tmp['SNAPSHOT_SERVER'])){ @@ -1221,15 +1270,14 @@ class plugin }else{ $ldap_to = $ldap; } - + /* Get the snapshot */ $ldap_to->cat($dn); $restoreObject = $ldap_to->fetch(); - + /* Prepare import string */ $data = gzuncompress($ldap_to->get_attribute($dn,'gosaSnapshotData')); - $data = "dn: ".$restoreObject['gosaSnapshotDN'][0]."\n".$data; - + /* Import the given data */ $ldap->import_complete_ldif($data,$err,true,true); show_ldap_error($ldap_to->get_error().$err, _("Restore snapshot failed.")); @@ -1292,16 +1340,15 @@ class plugin $this->snapDialog = NULL; } } - + if(isset($_POST['CancelSnapshot'])){ $this->snapDialog = NULL; } - + if($this->snapDialog){ $this->snapDialog->save_object(); return($this->snapDialog->execute()); } - } } // vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler: