112 lines
3.8 KiB
Python
Executable File
112 lines
3.8 KiB
Python
Executable File
#!/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()
|