2011-11-02 13:32:33 +01:00
# sites management
#
# 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/>.
#
2015-10-28 12:20:37 +13:00
from samba import sites , subnets
2012-02-07 17:30:22 +11:00
import samba . getopt as options
2011-11-02 13:32:33 +01:00
from samba . netcmd import (
Command ,
CommandError ,
2015-09-16 14:17:25 +12:00
SuperCommand ,
Option ,
2018-07-30 18:14:37 +12:00
)
2023-07-04 21:47:46 +12:00
from samba . netcmd . domain . models import Site , Subnet
from samba . netcmd . domain . models . exceptions import ModelError
class cmd_sites_list ( Command ) :
""" List sites. """
synopsis = " % prog [options] "
takes_optiongroups = {
" sambaopts " : options . SambaOptions ,
" versionopts " : options . VersionOptions ,
" credopts " : options . CredentialsOptions ,
2023-10-06 15:49:27 +13:00
" hostopts " : options . HostOptions ,
2023-07-04 21:47:46 +12:00
}
takes_options = [
Option ( " --json " , help = " Output results in JSON format. " ,
dest = " output_format " , action = " store_const " , const = " json " ) ,
]
2023-10-06 15:49:27 +13:00
def run ( self , hostopts = None , sambaopts = None , credopts = None ,
2023-07-04 21:47:46 +12:00
versionopts = None , output_format = None ) :
2023-10-06 15:49:27 +13:00
ldb = self . ldb_connect ( hostopts , sambaopts , credopts )
2023-07-04 21:47:46 +12:00
# sites by cn.
try :
sites_dict = { site . cn : site . as_dict ( )
for site in Site . query ( ldb ) }
except ModelError as e :
raise CommandError ( e )
# Using json output format gives more detail.
if output_format == " json " :
self . print_json ( sites_dict )
else :
for site in sites_dict . keys ( ) :
self . outf . write ( f " { site } \n " )
class cmd_sites_view ( Command ) :
""" View one site. """
synopsis = " % prog <site> [options] "
takes_args = [ " sitename " ]
takes_optiongroups = {
" sambaopts " : options . SambaOptions ,
" versionopts " : options . VersionOptions ,
" credopts " : options . CredentialsOptions ,
2023-10-06 15:49:27 +13:00
" hostopts " : options . HostOptions ,
2023-07-04 21:47:46 +12:00
}
2023-10-06 15:49:27 +13:00
def run ( self , sitename , hostopts = None , sambaopts = None , credopts = None ,
2023-07-04 21:47:46 +12:00
versionopts = None ) :
2023-10-06 15:49:27 +13:00
ldb = self . ldb_connect ( hostopts , sambaopts , credopts )
2023-07-04 21:47:46 +12:00
try :
site = Site . get ( ldb , cn = sitename )
except ModelError as e :
raise CommandError ( e )
# Check if site exists first.
if site is None :
raise CommandError ( f " Site { sitename } not found. " )
# Display site as JSON.
self . print_json ( site . as_dict ( ) )
2011-11-02 13:32:33 +01:00
class cmd_sites_create ( Command ) :
2012-10-08 12:32:58 +02:00
""" Create a new site. """
2011-11-02 13:32:33 +01:00
synopsis = " % prog <site> [options] "
takes_args = [ " sitename " ]
2012-02-07 17:30:22 +11:00
takes_optiongroups = {
" sambaopts " : options . SambaOptions ,
" versionopts " : options . VersionOptions ,
" credopts " : options . CredentialsOptions ,
2023-10-06 15:49:27 +13:00
" hostopts " : options . HostOptions ,
2012-02-07 17:30:22 +11:00
}
2023-10-06 15:49:27 +13:00
def run ( self , sitename , hostopts = None , sambaopts = None , credopts = None ,
2015-09-16 14:17:25 +12:00
versionopts = None ) :
2023-10-06 15:49:27 +13:00
samdb = self . ldb_connect ( hostopts , sambaopts , credopts )
2011-11-02 13:32:33 +01:00
samdb . transaction_start ( )
2011-11-02 20:24:20 +01:00
try :
2015-09-17 18:30:28 +12:00
sites . create_site ( samdb , samdb . get_config_basedn ( ) , sitename )
2011-11-02 20:24:20 +01:00
samdb . transaction_commit ( )
2018-02-14 10:07:23 +13:00
except sites . SiteAlreadyExistsException as e :
2011-11-02 20:24:20 +01:00
samdb . transaction_cancel ( )
2015-09-17 18:30:28 +12:00
raise CommandError ( " Error while creating site %s , error: %s " %
( sitename , str ( e ) ) )
2011-11-02 13:32:33 +01:00
self . outf . write ( " Site %s created ! \n " % sitename )
2015-09-17 18:30:28 +12:00
2011-11-02 13:32:33 +01:00
class cmd_sites_delete ( Command ) :
2012-10-08 12:32:58 +02:00
""" Delete an existing site. """
2011-11-02 13:32:33 +01:00
synopsis = " % prog <site> [options] "
takes_args = [ " sitename " ]
2012-02-07 17:30:22 +11:00
takes_optiongroups = {
" sambaopts " : options . SambaOptions ,
" versionopts " : options . VersionOptions ,
" credopts " : options . CredentialsOptions ,
2023-10-06 15:49:27 +13:00
" hostopts " : options . HostOptions ,
2012-02-07 17:30:22 +11:00
}
2023-10-06 15:49:27 +13:00
def run ( self , sitename , hostopts = None , sambaopts = None , credopts = None ,
2015-09-16 14:17:25 +12:00
versionopts = None ) :
2023-10-06 15:49:27 +13:00
samdb = self . ldb_connect ( hostopts , sambaopts , credopts )
2011-11-02 13:32:33 +01:00
samdb . transaction_start ( )
2011-11-02 20:24:20 +01:00
try :
2015-09-17 18:30:28 +12:00
sites . delete_site ( samdb , samdb . get_config_basedn ( ) , sitename )
2011-11-02 20:24:20 +01:00
samdb . transaction_commit ( )
2018-02-14 10:07:23 +13:00
except sites . SiteException as e :
2011-11-02 20:24:20 +01:00
samdb . transaction_cancel ( )
2012-09-16 14:18:39 +02:00
raise CommandError (
" Error while removing site %s , error: %s " % ( sitename , str ( e ) ) )
2011-11-02 13:32:33 +01:00
self . outf . write ( " Site %s removed! \n " % sitename )
2023-07-04 21:47:46 +12:00
class cmd_sites_subnet_list ( Command ) :
""" List subnets. """
synopsis = " % prog <site> [options] "
takes_args = [ " sitename " ]
takes_optiongroups = {
" sambaopts " : options . SambaOptions ,
" versionopts " : options . VersionOptions ,
" credopts " : options . CredentialsOptions ,
2023-10-06 15:49:27 +13:00
" hostopts " : options . HostOptions ,
2023-07-04 21:47:46 +12:00
}
takes_options = [
Option ( " --json " , help = " Output results in JSON format. " ,
dest = " output_format " , action = " store_const " , const = " json " ) ,
]
2023-10-06 15:49:27 +13:00
def run ( self , sitename , hostopts = None , sambaopts = None , credopts = None ,
2023-07-04 21:47:46 +12:00
versionopts = None , output_format = None ) :
2023-10-06 15:49:27 +13:00
ldb = self . ldb_connect ( hostopts , sambaopts , credopts )
2023-07-04 21:47:46 +12:00
try :
site = Site . get ( ldb , cn = sitename )
except ModelError as e :
raise CommandError ( e )
# Check if site exists first.
if site is None :
raise CommandError ( f " Site { sitename } not found. " )
# subnets by cn.
try :
subnets_dict = { subnet . cn : subnet . as_dict ( )
for subnet in Subnet . query ( ldb ,
site_object = str ( site . dn ) ) }
except ModelError as e :
raise CommandError ( e )
# Using json output format gives more detail.
if output_format == " json " :
self . print_json ( subnets_dict )
else :
for subnet in subnets_dict . keys ( ) :
self . outf . write ( f " { subnet } \n " )
class cmd_sites_subnet_view ( Command ) :
""" View subnet details. """
synopsis = " % prog <subnet> [options] "
takes_args = [ " subnetname " ]
takes_optiongroups = {
" sambaopts " : options . SambaOptions ,
" versionopts " : options . VersionOptions ,
" credopts " : options . CredentialsOptions ,
2023-10-06 15:49:27 +13:00
" hostopts " : options . HostOptions ,
2023-07-04 21:47:46 +12:00
}
2023-10-06 15:49:27 +13:00
def run ( self , subnetname , hostopts = None , sambaopts = None , credopts = None ,
2023-07-04 21:47:46 +12:00
versionopts = None ) :
2023-10-06 15:49:27 +13:00
ldb = self . ldb_connect ( hostopts , sambaopts , credopts )
2023-07-04 21:47:46 +12:00
try :
subnet = Subnet . get ( ldb , cn = subnetname )
except ModelError as e :
raise CommandError ( e )
# Check if subnet exists first.
if subnet is None :
raise CommandError ( f " Subnet { subnetname } not found. " )
# Display subnet as JSON.
self . print_json ( subnet . as_dict ( ) )
2015-10-28 12:20:37 +13:00
class cmd_sites_subnet_create ( Command ) :
""" Create a new subnet. """
synopsis = " % prog <subnet> <site-of-subnet> [options] "
takes_args = [ " subnetname " , " site_of_subnet " ]
takes_optiongroups = {
" sambaopts " : options . SambaOptions ,
" versionopts " : options . VersionOptions ,
" credopts " : options . CredentialsOptions ,
2023-10-06 15:49:27 +13:00
" hostopts " : options . HostOptions ,
2015-10-28 12:20:37 +13:00
}
2023-10-06 15:49:27 +13:00
def run ( self , subnetname , site_of_subnet , hostopts = None , sambaopts = None ,
2015-10-28 12:20:37 +13:00
credopts = None , versionopts = None ) :
2023-10-06 15:49:27 +13:00
samdb = self . ldb_connect ( hostopts , sambaopts , credopts )
2015-10-28 12:20:37 +13:00
samdb . transaction_start ( )
try :
subnets . create_subnet ( samdb , samdb . get_config_basedn ( ) , subnetname ,
site_of_subnet )
samdb . transaction_commit ( )
2018-02-14 10:07:23 +13:00
except subnets . SubnetException as e :
2015-10-28 12:20:37 +13:00
samdb . transaction_cancel ( )
raise CommandError ( " Error while creating subnet %s : %s " %
( subnetname , e ) )
self . outf . write ( " Subnet %s created ! \n " % subnetname )
class cmd_sites_subnet_delete ( Command ) :
""" Delete an existing subnet. """
synopsis = " % prog <subnet> [options] "
takes_args = [ " subnetname " ]
takes_optiongroups = {
" sambaopts " : options . SambaOptions ,
" versionopts " : options . VersionOptions ,
" credopts " : options . CredentialsOptions ,
2023-10-06 15:49:27 +13:00
" hostopts " : options . HostOptions ,
2015-10-28 12:20:37 +13:00
}
2023-10-06 15:49:27 +13:00
def run ( self , subnetname , hostopts = None , sambaopts = None , credopts = None ,
2015-10-28 12:20:37 +13:00
versionopts = None ) :
2023-10-06 15:49:27 +13:00
samdb = self . ldb_connect ( hostopts , sambaopts , credopts )
2015-10-28 12:20:37 +13:00
samdb . transaction_start ( )
try :
subnets . delete_subnet ( samdb , samdb . get_config_basedn ( ) , subnetname )
samdb . transaction_commit ( )
2018-02-14 10:07:23 +13:00
except subnets . SubnetException as e :
2015-10-28 12:20:37 +13:00
samdb . transaction_cancel ( )
raise CommandError ( " Error while removing subnet %s , error: %s " %
( subnetname , e ) )
self . outf . write ( " Subnet %s removed! \n " % subnetname )
class cmd_sites_subnet_set_site ( Command ) :
""" Assign a subnet to a site. """
synopsis = " % prog <subnet> <site-of-subnet> [options] "
takes_args = [ " subnetname " , " site_of_subnet " ]
takes_optiongroups = {
" sambaopts " : options . SambaOptions ,
" versionopts " : options . VersionOptions ,
" credopts " : options . CredentialsOptions ,
2023-10-06 15:49:27 +13:00
" hostopts " : options . HostOptions ,
2015-10-28 12:20:37 +13:00
}
2023-10-06 15:49:27 +13:00
def run ( self , subnetname , site_of_subnet , hostopts = None , sambaopts = None ,
2015-10-28 12:20:37 +13:00
credopts = None , versionopts = None ) :
2023-10-06 15:49:27 +13:00
samdb = self . ldb_connect ( hostopts , sambaopts , credopts )
2015-10-28 12:20:37 +13:00
samdb . transaction_start ( )
try :
subnets . set_subnet_site ( samdb , samdb . get_config_basedn ( ) ,
subnetname , site_of_subnet )
samdb . transaction_commit ( )
2018-02-14 10:07:23 +13:00
except subnets . SubnetException as e :
2015-10-28 12:20:37 +13:00
samdb . transaction_cancel ( )
raise CommandError ( " Error assigning subnet %s to site %s : %s " %
( subnetname , site_of_subnet , e ) )
2018-03-09 13:49:09 +00:00
print ( ( " Subnet %s shifted to site %s " %
2018-07-30 18:15:34 +12:00
( subnetname , site_of_subnet ) ) , file = self . outf )
2015-10-28 12:20:37 +13:00
class cmd_sites_subnet ( SuperCommand ) :
""" Subnet management subcommands. """
subcommands = {
" create " : cmd_sites_subnet_create ( ) ,
" remove " : cmd_sites_subnet_delete ( ) ,
2023-07-04 21:47:46 +12:00
" list " : cmd_sites_subnet_list ( ) ,
" view " : cmd_sites_subnet_view ( ) ,
2015-10-28 12:20:37 +13:00
" set-site " : cmd_sites_subnet_set_site ( ) ,
}
2011-11-02 13:32:33 +01:00
2018-07-30 18:20:39 +12:00
2011-11-02 13:32:33 +01:00
class cmd_sites ( SuperCommand ) :
2012-10-09 11:53:21 +02:00
""" Sites management. """
2011-11-02 13:32:33 +01:00
subcommands = { }
2023-07-04 21:47:46 +12:00
subcommands [ " list " ] = cmd_sites_list ( )
subcommands [ " view " ] = cmd_sites_view ( )
2011-11-02 13:32:33 +01:00
subcommands [ " create " ] = cmd_sites_create ( )
subcommands [ " remove " ] = cmd_sites_delete ( )
2015-10-28 12:20:37 +13:00
subcommands [ " subnet " ] = cmd_sites_subnet ( )