# python site manipulation code # Copyright Matthieu Patou 2011 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # """Manipulating sites.""" import ldb from ldb import FLAG_MOD_ADD class SiteException(Exception): """Base element for Sites errors""" def __init__(self, value): self.value = value def __str__(self): return "SiteException: " + self.value class SiteNotFoundException(SiteException): """Raised when the site is not found and it's expected to exists.""" def __init__(self, value): self.value = value def __str__(self): return "SiteNotFoundException: " + self.value class SiteAlreadyExistsException(SiteException): """Raised when the site is not found and it's expected not to exists.""" def __init__(self, value): self.value = value def __str__(self): return "SiteAlreadyExists: " + self.value class SiteServerNotEmptyException(SiteException): """Raised when the site still has servers attached.""" def __init__(self, value): self.value = value def __str__(self): return "SiteServerNotEmpty: " + self.value def create_site(samdb, configDn, siteName): """ Create a site :param samdb: A samdb connection :param configDn: The DN of the configuration partition :param siteName: Name of the site to create :return: True upon success :raise SiteAlreadyExists: if the site to be created already exists. """ ret = samdb.search(base=configDn, scope=ldb.SCOPE_SUBTREE, expression='(&(objectclass=Site)(cn=%s))' % siteName) if len(ret) != 0: raise SiteAlreadyExistsException('A site with the name %s already exists' % siteName) m = ldb.Message() m.dn = ldb.Dn(samdb, "Cn=%s,CN=Sites,%s" % (siteName, str(configDn))) m["objectclass"] = ldb.MessageElement("site", FLAG_MOD_ADD, "objectclass") samdb.add(m) m2 = ldb.Message() m2.dn = ldb.Dn(samdb, "Cn=NTDS Site Settings,%s" % str(m.dn)) m2["objectclass"] = ldb.MessageElement("nTDSSiteSettings", FLAG_MOD_ADD, "objectclass") samdb.add(m2) m3 = ldb.Message() m3.dn = ldb.Dn(samdb, "Cn=Servers,%s" % str(m.dn)) m3["objectclass"] = ldb.MessageElement("serversContainer", FLAG_MOD_ADD, "objectclass") samdb.add(m3) return True def delete_site(samdb, configDn, siteName): """ Delete a site :param samdb: A samdb connection :param configDn: The DN of the configuration partition :param siteName: Name of the site to delete :return: True upon success :raise SiteNotFoundException: if the site to be deleted do not exists. :raise SiteServerNotEmpty: if the site has still servers in it. """ dnsites = ldb.Dn(samdb, "CN=Sites,%s" % (str(configDn))) dnsite = ldb.Dn(samdb, "Cn=%s,CN=Sites,%s" % (siteName, str(configDn))) dnserver = ldb.Dn(samdb, "Cn=Servers,%s" % str(dnsite)) ret = samdb.search(base=dnsites, scope=ldb.SCOPE_ONELEVEL, expression='(dn=%s)' % str(dnsite)) if len(ret) != 1: raise SiteNotFoundException('Site %s do not exists' % siteName) ret = samdb.search(base=dnserver, scope=ldb.SCOPE_ONELEVEL, expression='(objectclass=server)') if len(ret) != 0: raise SiteServerNotEmptyException('Site %s still has servers in it, move them before removal' % siteName) samdb.delete(dnsite, ["tree_delete:0"]) return True d='n38' href='#n38'>38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159