X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=include%2Fclass_plugin.inc;h=dda58a731aba9b18f6921aae455172fdeb7c8187;hb=3174f0e39701cf413f6e1befbade42624140f4ef;hp=6a700502ea68c84ca87df43a97e70b7a1ea354e8;hpb=61c1d1e5015792dc2f6cb145bc47d3d0a5cab381;p=gosa.git diff --git a/include/class_plugin.inc b/include/class_plugin.inc index 6a700502e..dda58a731 100644 --- a/include/class_plugin.inc +++ b/include/class_plugin.inc @@ -83,6 +83,9 @@ class plugin */ var $attrs= array(); + /* Keep set of conflicting plugins */ + var $conflicts= array(); + /* Save unit tags */ var $gosaUnitTag= ""; @@ -97,6 +100,7 @@ class plugin var $givenName= ""; var $acl= "*none*"; var $dialog= FALSE; + var $snapDialog = NULL; /* attribute list for save action */ var $attributes= array(); @@ -738,7 +742,15 @@ class plugin /* Save copy */ $ldap->connect(); $ldap->cd($this->config->current['BASE']); + $ldap->create_missing_trees(preg_replace('/^[^,]+,/', '', $dst_dn)); + + /* FAIvariable=.../..., cn=.. + could not be saved, because the attribute FAIvariable was different to + the dn FAIvariable=..., cn=... */ + if(in_array_ics("FAIdebconfInfo",$new['objectClass'])){ + $new['FAIvariable'] = $ldap->fix($new['FAIvariable']); + } $ldap->cd($dst_dn); $ldap->add($new); @@ -854,7 +866,7 @@ class plugin } - function handle_object_tagging($dn= "", $tag= "") + function handle_object_tagging($dn= "", $tag= "", $show= false) { //FIXME: How to optimize this? We have at least two // LDAP accesses per object. It would be a good @@ -905,12 +917,17 @@ class plugin $ldap->cat($dn, array('gosaUnitTag', 'objectClass')); $attrs= $ldap->fetch(); if(isset($attrs['gosaUnitTag'][0]) && $attrs['gosaUnitTag'][0] == $tag){ - echo sprintf(_("Processing: Object '%s' is already tagged"), $dn); - flush() + if ($show) { + echo sprintf(_("Object '%s' is already tagged"), @LDAP::fix($dn))."
"; + flush(); + } return; } if (count($attrs)){ - echo sprintf(_("Processing: Adding tag (%s) to object '%s'"), $dn); + if ($show){ + echo sprintf(_("Adding tag (%s) to object '%s'"), $tag, @LDAP::fix($dn))."
"; + flush(); + } $nattrs= array("gosaUnitTag" => $this->gosaUnitTag); $nattrs['objectClass']= array(); for ($i= 0; $i<$attrs['objectClass']['count']; $i++){ @@ -922,6 +939,7 @@ class plugin $nattrs['objectClass'][]= "gosaAdministrativeUnitTag"; $ldap->cd($dn); $ldap->modify($nattrs); + show_ldap_error($ldap->get_error(), _("Handle object tagging failed")); } else { @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, "Not tagging ($tag) $dn - seems to have moved away", "Tagging"); } @@ -936,7 +954,10 @@ class plugin return; } if (count($attrs)){ - echo sprintf(_("Processing: Removing tag from object '%s'"), $dn); + if ($show){ + echo sprintf(_("Removing tag from object '%s'"), @LDAP::fix($dn))."
"; + flush(); + } $nattrs= array("gosaUnitTag" => array()); $nattrs['objectClass']= array(); for ($i= 0; $i<$attrs['objectClass']['count']; $i++){ @@ -947,7 +968,7 @@ class plugin } $ldap->cd($dn); $ldap->modify($nattrs); - show_ldap_error($ldap->get_error()); + show_ldap_error($ldap->get_error(), _("Handle object tagging failed")); } else { @DEBUG (DEBUG_TRACE, __LINE__, __FUNCTION__, __FILE__, "Not removing tag ($tag) $dn - seems to have moved away", "Tagging"); } @@ -955,6 +976,334 @@ class plugin } + + /* Add possibility to stop remove process */ + function allow_remove() + { + $reason= ""; + return $reason; + } + + + /* 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 */ + $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'])){ + $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)){ + + /* Extract seconds & mysecs, they are used as entry index */ + list($usec, $sec)= explode(" ", microtime()); + + /* Collect some infos */ + $base = $this->config->current['BASE']; + $snap_base = $tmp['SNAPSHOT_BASE']; + $base_of_object = preg_replace ('/^[^,]+,/i', '', $this->dn); + $new_base = preg_replace("/".normalizePreg($base)."$/","",$base_of_object).$snap_base; + + /* Create object */ + $data = preg_replace('/^dn:.*\n/', '', $ldap->gen_one_entry($this->dn)); + $newName = preg_replace("/\./", "", $sec."-".$usec); + $target= array(); + $target['objectClass'] = array("top", "gosaSnapshotObject"); + $target['gosaSnapshotData'] = gzcompress($data, 6); + $target['gosaSnapshotType'] = $type; + $target['gosaSnapshotDN'] = $this->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 = preg_replace("/\./", "", $sec."-".($usec++)); + $new_dn = "gosaSnapshotTimestamp=".$newName.",".$new_base; + $target['gosaSnapshotTimestamp'] = $newName; + } + + + /* Inset this new snapshot */ + $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.")); + } + } + + + /* returns true if snapshots are enabled */ + function snapshotEnabled() + { + $tmp = $this->config->data['MAIN']; + if(isset($tmp['ENABLE_SNAPSHOT'])){ + if (preg_match("/^true$/i", $tmp['ENABLE_SNAPSHOT']) || preg_match("/yes/i", $tmp['ENABLE_SNAPSHOT'])){ + return(TRUE); + } + } + 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 */ + $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()); + } + + /* check if there are special server configurations for snapshots */ + if(isset($tmp['SNAPSHOT_SERVER'])){ + $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; + } + + /* Prepare bases and some other infos */ + $base = $this->config->current['BASE']; + $snap_base = $tmp['SNAPSHOT_BASE']; + $base_of_object = preg_replace ('/^[^,]+,/i', '', $dn); + $new_base = preg_replace("/".normalizePreg($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']); + $tmp = $this->config->data['MAIN']; + + /* check if there are special server configurations for snapshots */ + if(isset($tmp['SNAPSHOT_SERVER'])){ + $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; + } + + /* Prepare bases */ + $base = $this->config->current['BASE']; + $snap_base = $tmp['SNAPSHOT_BASE']; + $new_base = preg_replace("/".normalizePreg($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($base,"",$entry['gosaSnapshotDN'][0]); + 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']); + $tmp = $this->config->data['MAIN']; + + /* check if there are special server configurations for snapshots */ + if(isset($tmp['SNAPSHOT_SERVER'])){ + $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; + } + + /* 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.")); + } + + + function showSnapshotDialog($base,$baseSuffix) + { + $once = true; + foreach($_POST as $name => $value){ + + /* Create a new snapshot, display a dialog */ + if(preg_match("/^CreateSnapShot_/",$name) && $once){ + $once = false; + $entry = preg_replace("/^CreateSnapShot_/","",$name); + $entry = base64_decode(preg_replace("/_[xy]$/","",$entry)); + $this->snapDialog = new SnapShotDialog($this->config,$entry,$this); + } + + /* Restore a snapshot, display a dialog with all snapshots of the current object */ + if(preg_match("/^RestoreSnapShot_/",$name) && $once){ + $once = false; + $entry = preg_replace("/^RestoreSnapShot_/","",$name); + $entry = base64_decode(preg_replace("/_[xy]$/","",$entry)); + $this->snapDialog = new SnapShotDialog($this->config,$entry,$this); + $this->snapDialog->Restore = true; + } + + /* Restore one of the already deleted objects */ + if(preg_match("/^RestoreDeletedSnapShot_/",$name) && $once){ + $once = false; + $entry = $baseSuffix.$base; + $this->snapDialog = new SnapShotDialog($this->config,$entry,$this); + $this->snapDialog->Restore = true; + $this->snapDialog->DeletedOnes = true; + } + } + + /* Create a new snapshot requested, check + the given attributes and create the snapshot*/ + if(isset($_POST['CreateSnapshot'])){ + $this->snapDialog->save_object(); + $msgs = $this->snapDialog->check(); + if(count($msgs)){ + foreach($msgs as $msg){ + print_red($msg); + } + }else{ + $this->dn = $this->snapDialog->dn; + $this->create_snapshot("snapshot",$this->snapDialog->CurrentDescription); + $this->snapDialog = NULL; + } + } + + /* Restore is requested, restore the object with the posted dn .*/ + if((isset($_POST['RestoreSnapshot'])) && (isset($_POST['SnapShot']))){ + $entry =trim($_POST['SnapShot']); + if(!empty($entry)){ + $entry = base64_decode($entry); + $this->restore_snapshot($entry); + $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: ?>