#!/usr/bin/env python3 import argparse import dns.rdataclass import dns.rdataset import dns.rdatatype import dnsmgr import sys def main(): preparser = argparse.ArgumentParser(add_help=False) preparser.add_argument('-b', '--batch', action='store_true') preargs, args = preparser.parse_known_args() nargs = None if preargs.batch else '?' parser = argparse.ArgumentParser(description='Delete DNS zones.') parser.add_argument('-b', '--batch', help='run in batch mode (no user input)', action='store_true') parser.add_argument('-c', '--config', help='path to config file', default=dnsmgr.DEFAULT_CFGFILE) parser.add_argument('zone', metavar='ZONE[@VIEWS]', nargs=nargs, help='DNS zone name and optional list of views (comma separated or asterisk to select all views)', default=None) args = parser.parse_args() try: manager = dnsmgr.DNSManager(cfgfile=args.config) except RuntimeError as e: dnsmgr.printe(f'config: {e}') sys.exit(100) try: if args.zone is None: zones = manager.select_zones() else: zones = manager.get_zones(args.zone) except RuntimeError as e: dnsmgr.printe(e) sys.exit(150) except KeyboardInterrupt: sys.exit(0) if not args.batch: for zone in zones: origin = zone.origin.to_text(omit_final_dot=True) print(f'View: {zone.view}') print(f'\033[31m- {origin}\033[0m\n') if not dnsmgr.input_yes_no(): sys.exit(0) for zone in zones: origin = zone.origin.to_text(omit_final_dot=True) if len(zones) > 1 or zone.view != dnsmgr.NAMED_DEFAULT_VIEW: origin = f'{origin}@{zone.view}' try: catalog_zone_name = manager.config.zones_config[zone.view].catalog_zone if catalog_zone_name: try: catalog_zones = manager.get_zones(catalog_zone_name, all_zones=True) except RuntimeError as e: raise RuntimeError(f'catalog zone of view \'{zone.view}\': {e}') for catalog_zone in catalog_zones: manager.get_zone_content(catalog_zone) rdname = dns.name.from_text(zone.nfz() + '.zones', catalog_zone.origin) node = catalog_zone.get_node(rdname) if not node: continue rdataset = node.get_rdataset(dns.rdataclass.IN, dns.rdatatype.PTR) if not rdataset: continue catalog_zone_origin = catalog_zone.origin.to_text(omit_final_dot=True) if catalog_zone.view != dnsmgr.NAMED_DEFAULT_VIEW: catalog_zone_origin += f'@{catalog_zone.view}' print(f'Removing zone \'{origin}\' from catalog zone \'{catalog_zone_origin}\'... ', end='') manager.delete_zone_record(catalog_zone, rdname, rdataset) print('OK') print(f"Deleting config of zone '{origin}'... ", end='') manager.delete_zone(zone) print('OK') except RuntimeError as e: dnsmgr.printe(e) sys.exit(160) try: print('Reloading named... ', end='') manager.named_reload() print('OK') except RuntimeError as e: dnsmgr.printe(e) sys.exit(170) for zone in zones: origin = zone.origin.to_text(omit_final_dot=True) if len(zones) > 1 or zone.view != dnsmgr.NAMED_DEFAULT_VIEW: origin = f'{origin}@{zone.view}' print(f"Cleanup zone files of zone '{origin}'... ", end='') try: manager.cleanup_zone(zone) print('OK') except Exception as e: dnsmgr.printe(e) sys.exit(180) if __name__ == '__main__': main()