tero@458: #!/usr/bin/env python tero@458: tero@475: import logging; log = logging.getLogger('pvl.hosts-reverse') tero@475: import optparse tero@519: import os.path tero@475: import pvl.args tero@475: import pvl.hosts terom@735: import pvl.hosts.interface tero@458: import pvl.hosts.zone tero@458: tero@475: def main (argv): tero@475: """ tero@475: Generate bind zonefiles from host definitions. tero@475: """ tero@475: tero@475: parser = optparse.OptionParser(main.__doc__) tero@475: parser.add_option_group(pvl.args.parser(parser)) tero@475: parser.add_option_group(pvl.hosts.config.optparser(parser)) tero@475: tero@519: parser.add_option('--zone-prefix', metavar='PREFIX', tero@519: help="Generated records for given prefix's reverse zone origin") tero@475: tero@475: parser.add_option('--unknown-host', metavar='NAME', tero@475: help="Generate records for unused IPs") tero@475: tero@475: # input tero@475: options, args = pvl.args.parse(parser, argv) tero@519: tero@519: if options.zone_prefix: tero@519: try: tero@519: prefix = pvl.dns.parse_prefix(options.zone_prefix) tero@519: except ValueError as error: tero@519: log.error("invalid reverse --zone-prefix=%s: %s", options.zone_prefix, error) tero@519: return 1 tero@519: else: tero@519: log.info("using given reverse --zone-prefix: %s", prefix) tero@519: tero@519: elif len(args) == 1: tero@519: path, = args tero@519: zone_prefix = os.path.basename(path.rstrip('/')) tero@475: tero@519: try: tero@519: prefix = pvl.dns.parse_prefix(zone_prefix) tero@519: except ValueError as error: tero@519: log.error("invalid hosts path %s for reverse --zone-prefix: %s", zone_prefix, error) tero@519: return 1 tero@519: else: tero@519: log.info("using given hosts path %s for reverse --zone-prefix: %s", zone_prefix, prefix) tero@519: terom@670: elif args: terom@670: log.fatal("--zone-prefix is required if passing multiple hosts files") terom@670: return 1 terom@670: tero@519: else: terom@670: log.fatal("no hosts given as input") tero@475: return 1 tero@519: tero@489: if options.unknown_host and not options.hosts_domain: tero@489: log.fatal("--unknown-host requires --hosts-domain=") tero@489: return 1 tero@489: tero@475: hosts = pvl.hosts.apply(options, args) tero@475: tero@475: # process tero@487: try: tero@489: for rr in pvl.hosts.zone.apply_hosts_reverse(hosts, prefix, tero@489: unknown_host = options.unknown_host, tero@489: unknown_domain = options.hosts_domain, tero@489: ): tero@487: print unicode(rr) tero@489: tero@487: except pvl.hosts.HostError as error: tero@487: log.error("%s", error) tero@487: return 3 tero@475: tero@475: return 0 tero@475: tero@475: if __name__ == '__main__': tero@475: pvl.args.main(main)