diff --git a/bin/domain_delete.php b/bin/purge-deleted-domains old mode 100644 new mode 100755 similarity index 92% rename from bin/domain_delete.php rename to bin/purge-deleted-domains index 4dbe729..d5cb215 --- a/bin/domain_delete.php +++ b/bin/purge-deleted-domains @@ -1,131 +1,136 @@ +#!/usr/bin/php | +--------------------------------------------------------------------------+ | Author: Aleksander Machniak | +--------------------------------------------------------------------------+ */ set_time_limit(0); require_once __DIR__ . '/../lib/functions.php'; require_once 'Auth/LDAP.php'; $LDAP = new LDAP(); $CONF = Conf::get_instance(); $username = $CONF->get('ldap', 'bind_dn'); $password = $CONF->get('ldap', 'bind_pw'); $domain = $CONF->get('kolab', 'primary_domain'); // see https://cgit.kolab.org/webadmin/tree/lib/kolab_api_controller.php#n292 session_start(); $_SESSION['user'] = new User(); $_SESSION['user']->authenticate($username, $password, $domain); // get list of domains to delete $domains = list_deleted_domains(); if (empty($domains)) { die("Nothing to delete. Done."); } // delete domains foreach ($domains as $dn => $domain) { delete_domain($dn, $domain); } function list_deleted_domains() { global $LDAP, $CONF; $result = $LDAP->list_domains( array( 'associateddomain', 'inetdomainbasedn', 'inetdomainstatus', ), array( 'params' => array( 'inetdomainstatus' => array( 'value' => 'deleted', 'type' => 'exact', ), ), ), array( 'page_size' => 999, 'page' => 1, 'sort_by' => 'associateddomain', ) ); return $result['list']; } function delete_domain($domain_dn, $domain) { global $LDAP, $CONF; // get domain name $domain_name = $domain['associateddomain']; if (is_array($domain_name)) { $domain_name = array_shift($domain_name); } // sanity check if ($domain['inetdomainstatus'] != 'deleted') { echo "Domain $domain_name is not marked for deletion. Skipped."; return; } echo "Deleting domain $domain_name... "; if (!empty($domain['inetdomainbasedn'])) { $inetdomainbasedn = $domain['inetdomainbasedn']; } else { $inetdomainbasedn = "dc=" . implode(',dc=', explode('.', $domain_name)); } // only deletes associateddomain=domain.tld,cn=kolab,cn=config if (!$LDAP->delete_entry($domain_dn)) { echo "Error: Failed to delete $domain_dn.\n"; return; } $entries = array(); $entries[] = $inetdomainbasedn; $cn = str_replace('.', '_', $domain_name); - $entries[] = "cn={$cn},cn=ldbm database,cn=plugins,cn=config"; + if ($LDAP->get_entry_attribute("cn={$cn},cn=ldbm database,cn=plugins,cn=config", 'nsuniqueid')) { + $entries[] = "cn={$cn},cn=ldbm database,cn=plugins,cn=config"; + } $cn = str_replace(array(',', '='), array('\2C', '\3D'), $inetdomainbasedn); - $entries[] = "cn={$cn},cn=mapping tree,cn=config"; + if ($LDAP->get_entry_attribute("cn={$cn},cn=mapping tree,cn=config", 'nsuniqueid')) { + $entries[] = "cn={$cn},cn=mapping tree,cn=config"; + } foreach ($entries as $dn) { if (!$LDAP->delete_entry_recursive($dn)) { echo "Error: Failed to delete $dn.\n"; return; } } echo "Done.\n"; }