From: Rob van der Linde Date: Tue, 4 Jul 2023 09:47:46 +0000 (+1200) Subject: netcmd: add list and view commands for sites and subnets X-Git-Tag: talloc-2.4.1~5 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=752eae68c2ae1d64cee9452df7b4f87d35458090;p=thirdparty%2Fsamba.git netcmd: add list and view commands for sites and subnets * samba-tool sites list * samba-tool sites view * samba-tool sites subnet list * samba-tool sites subnet view Signed-off-by: Rob van der Linde Reviewed-by: Andrew Bartlett Reviewed-by: Douglas Bagnall --- diff --git a/python/samba/netcmd/sites.py b/python/samba/netcmd/sites.py index c85acc75813..6904e0db88c 100644 --- a/python/samba/netcmd/sites.py +++ b/python/samba/netcmd/sites.py @@ -26,6 +26,82 @@ from samba.netcmd import ( SuperCommand, Option, ) +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, + } + + takes_options = [ + Option("-H", "--URL", help="LDB URL for database or target server", + type=str, metavar="URL", dest="ldap_url"), + Option("--json", help="Output results in JSON format.", + dest="output_format", action="store_const", const="json"), + ] + + def run(self, ldap_url=None, sambaopts=None, credopts=None, + versionopts=None, output_format=None): + + ldb = self.ldb_connect(ldap_url, sambaopts, credopts) + + # 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 [options]" + + takes_args = ["sitename"] + + takes_optiongroups = { + "sambaopts": options.SambaOptions, + "versionopts": options.VersionOptions, + "credopts": options.CredentialsOptions, + } + + takes_options = [ + Option("-H", "--URL", help="LDB URL for database or target server", + type=str, metavar="URL", dest="ldap_url"), + ] + + def run(self, sitename, ldap_url=None, sambaopts=None, credopts=None, + versionopts=None): + + ldb = self.ldb_connect(ldap_url, sambaopts, credopts) + + 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()) class cmd_sites_create(Command): @@ -102,6 +178,92 @@ class cmd_sites_delete(Command): self.outf.write("Site %s removed!\n" % sitename) +class cmd_sites_subnet_list(Command): + """List subnets.""" + + synopsis = "%prog [options]" + + takes_args = ["sitename"] + + takes_optiongroups = { + "sambaopts": options.SambaOptions, + "versionopts": options.VersionOptions, + "credopts": options.CredentialsOptions, + } + + takes_options = [ + Option("-H", "--URL", help="LDB URL for database or target server", + type=str, metavar="URL", dest="ldap_url"), + Option("--json", help="Output results in JSON format.", + dest="output_format", action="store_const", const="json"), + ] + + def run(self, sitename, ldap_url=None, sambaopts=None, credopts=None, + versionopts=None, output_format=None): + + ldb = self.ldb_connect(ldap_url, sambaopts, credopts) + + 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 [options]" + + takes_args = ["subnetname"] + + takes_optiongroups = { + "sambaopts": options.SambaOptions, + "versionopts": options.VersionOptions, + "credopts": options.CredentialsOptions, + } + + takes_options = [ + Option("-H", "--URL", help="LDB URL for database or target server", + type=str, metavar="URL", dest="ldap_url"), + ] + + def run(self, subnetname, ldap_url=None, sambaopts=None, credopts=None, + versionopts=None): + + ldb = self.ldb_connect(ldap_url, sambaopts, credopts) + + 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()) + + class cmd_sites_subnet_create(Command): """Create a new subnet.""" synopsis = "%prog [options]" @@ -217,6 +379,8 @@ class cmd_sites_subnet(SuperCommand): subcommands = { "create": cmd_sites_subnet_create(), "remove": cmd_sites_subnet_delete(), + "list": cmd_sites_subnet_list(), + "view": cmd_sites_subnet_view(), "set-site": cmd_sites_subnet_set_site(), } @@ -224,6 +388,8 @@ class cmd_sites_subnet(SuperCommand): class cmd_sites(SuperCommand): """Sites management.""" subcommands = {} + subcommands["list"] = cmd_sites_list() + subcommands["view"] = cmd_sites_view() subcommands["create"] = cmd_sites_create() subcommands["remove"] = cmd_sites_delete() subcommands["subnet"] = cmd_sites_subnet()