2011-11-02 16:30:59 +04:00
# python site manipulation code
# Copyright Matthieu Patou <mat@matws.net> 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 <http://www.gnu.org/licenses/>.
#
""" Manipulating sites. """
import ldb
2015-10-29 06:34:27 +03:00
from ldb import FLAG_MOD_ADD , LdbError
2011-11-02 16:30:59 +04:00
2011-11-02 23:24:20 +04:00
class SiteException ( Exception ) :
""" Base element for Sites errors """
def __init__ ( self , value ) :
self . value = value
def __str__ ( self ) :
2015-09-17 09:07:32 +03:00
return " %s : %s " % ( self . __class__ . __name__ , self . value )
2011-11-02 23:24:20 +04:00
class SiteNotFoundException ( SiteException ) :
""" Raised when the site is not found and it ' s expected to exists. """
class SiteAlreadyExistsException ( SiteException ) :
""" Raised when the site is not found and it ' s expected not to exists. """
class SiteServerNotEmptyException ( SiteException ) :
""" Raised when the site still has servers attached. """
2011-11-02 16:30:59 +04:00
def create_site ( samdb , configDn , siteName ) :
2011-11-02 23:24:20 +04:00
"""
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 .
"""
2011-11-02 16:30:59 +04:00
ret = samdb . search ( base = configDn , scope = ldb . SCOPE_SUBTREE ,
2018-07-30 09:16:12 +03:00
expression = ' (&(objectclass=Site)(cn= %s )) ' % siteName )
2011-11-02 16:30:59 +04:00
if len ( ret ) != 0 :
2011-11-02 23:24:20 +04:00
raise SiteAlreadyExistsException ( ' A site with the name %s already exists ' % siteName )
2011-11-02 16:30:59 +04:00
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
2015-09-17 09:30:28 +03:00
2011-11-02 16:30:59 +04:00
def delete_site ( samdb , configDn , siteName ) :
2011-11-02 23:24:20 +04:00
"""
Delete a site
2011-11-02 16:30:59 +04:00
2011-11-02 23:24:20 +04:00
: 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 .
"""
2015-10-29 06:34:27 +03:00
dnsite = ldb . Dn ( samdb , " CN=Sites " )
2022-09-30 01:50:30 +03:00
try :
dnsite . add_base ( configDn )
except ldb . LdbError :
2022-07-27 05:12:07 +03:00
raise SiteException ( " dnsite.add_base() failed " )
2022-09-30 01:50:30 +03:00
try :
dnsite . add_child ( " CN=X " )
except ldb . LdbError :
2022-07-27 05:12:07 +03:00
raise SiteException ( " dnsite.add_child() failed " )
2015-10-29 06:34:27 +03:00
dnsite . set_component ( 0 , " CN " , siteName )
dnservers = ldb . Dn ( samdb , " CN=Servers " )
dnservers . add_base ( dnsite )
try :
ret = samdb . search ( base = dnsite , scope = ldb . SCOPE_BASE ,
expression = " objectClass=site " )
if len ( ret ) != 1 :
raise SiteNotFoundException ( ' Site %s does not exist ' % siteName )
2018-02-23 17:29:05 +03:00
except LdbError as e :
( enum , estr ) = e . args
2015-10-29 06:34:27 +03:00
if enum == ldb . ERR_NO_SUCH_OBJECT :
raise SiteNotFoundException ( ' Site %s does not exist ' % siteName )
ret = samdb . search ( base = dnservers , scope = ldb . SCOPE_ONELEVEL ,
expression = ' (objectclass=server) ' )
2011-11-02 16:30:59 +04:00
if len ( ret ) != 0 :
2011-11-02 23:24:20 +04:00
raise SiteServerNotEmptyException ( ' Site %s still has servers in it, move them before removal ' % siteName )
2011-11-02 16:30:59 +04:00
samdb . delete ( dnsite , [ " tree_delete:0 " ] )
return True