bin/process-zone
changeset 4 3a2221124592
parent 0 f0ac5a96fb19
child 12 bddc9a060a73
equal deleted inserted replaced
3:cd10c4fe44bb 4:3a2221124592
    30     )
    30     )
    31 
    31 
    32     # logging
    32     # logging
    33     general = optparse.OptionGroup(parser, "General Options")
    33     general = optparse.OptionGroup(parser, "General Options")
    34 
    34 
    35     general.add_option('-q', '--quiet',     dest='loglevel', action='store_const', const=logging.WARNING, help="Less output")
    35     general.add_option('-q', '--quiet',     dest='loglevel', action='store_const', const=logging.ERROR, help="Less output")
    36     general.add_option('-v', '--verbose',   dest='loglevel', action='store_const', const=logging.INFO,  help="More output")
    36     general.add_option('-v', '--verbose',   dest='loglevel', action='store_const', const=logging.INFO,  help="More output")
    37     general.add_option('-D', '--debug',     dest='loglevel', action='store_const', const=logging.DEBUG, help="Even more output")
    37     general.add_option('-D', '--debug',     dest='loglevel', action='store_const', const=logging.DEBUG, help="Even more output")
    38 
    38 
    39     parser.add_option_group(general)
    39     parser.add_option_group(general)
    40 
    40 
    45             help="Write to output file; default stdout")
    45             help="Write to output file; default stdout")
    46 
    46 
    47     parser.add_option('--output-charset',       metavar='CHARSET',  default='utf-8', 
    47     parser.add_option('--output-charset',       metavar='CHARSET',  default='utf-8', 
    48             help="Encoding used for output files")
    48             help="Encoding used for output files")
    49 
    49 
    50     parser.add_option('--serial',               metavar='FILE',
       
    51             help="Read/update serial from given .serial file")
       
    52 
       
    53     parser.add_option('--forward-zone',         action='store_true', 
    50     parser.add_option('--forward-zone',         action='store_true', 
    54             help="Generate forward zone")
    51             help="Generate forward zone")
    55 
    52 
    56     parser.add_option('--forward-txt',          action='store_true',
    53     parser.add_option('--forward-txt',          action='store_true',
    57             help="Generate TXT records for forward zone")
    54             help="Generate TXT records for forward zone")
    63             help="Domain to use for hosts in reverse zone")
    60             help="Domain to use for hosts in reverse zone")
    64 
    61 
    65     parser.add_option('--reverse-zone',         metavar='NET',
    62     parser.add_option('--reverse-zone',         metavar='NET',
    66             help="Generate forward zone for given subnet (x.z.y)")
    63             help="Generate forward zone for given subnet (x.z.y)")
    67 
    64 
    68 
       
    69 #    parser.add_option('--output-forward',       metavar='FILE', default=False, help="Hosts output file")
       
    70 #    parser.add_option('--output-reverse',       metavar='FILE', default=False, help="Reverse-hosts output file")
       
    71 #    parser.add_option('--forward-info',         action='store_true', help="Include additional TXT records in forward zone output")
       
    72 
       
    73 #    parser.add_option('--reverse-zone',         metavar='DOMAIN', help="Zone origin used for reverse zone")
       
    74 
       
    75     # defaults
    65     # defaults
    76     parser.set_defaults(
    66     parser.set_defaults(
    77         loglevel            = logging.INFO,
    67         loglevel            = logging.WARN,
    78     )
    68     )
    79     
    69     
    80     # parse
    70     # parse
    81     options, args = parser.parse_args(argv[1:])
    71     options, args = parser.parse_args(argv[1:])
    82 
    72 
   143     #log.debug("name=%r", name)
   133     #log.debug("name=%r", name)
   144 
   134 
   145     # parse ttl/cls/type
   135     # parse ttl/cls/type
   146     ttl = cls = None
   136     ttl = cls = None
   147 
   137 
   148     type = parts.pop(-1)
       
   149 
       
   150     if parts and parts[0][0].isdigit() :
   138     if parts and parts[0][0].isdigit() :
   151         ttl = parts.pop(0)
   139         ttl = parts.pop(0)
   152 
   140 
       
   141     if parts and parts[0].upper() in ('IN', 'CH') :
       
   142         cls = parts.pop(0)
       
   143 
       
   144     type = parts.pop(0)
       
   145 
       
   146     #log.debug("ttl=%r, cls=%r, parts=%r", ttl, cls, parts)
       
   147 
   153     if parts :
   148     if parts :
   154         cls = parts.pop(0)
   149         log.debug("extra data: %r + %r", parts, data)
   155 
   150 
   156     #log.debug("ttl=%r, cls=%r, parts=%r", ttl, cls, parts)
   151         # extra data
   157 
   152         data = ' '.join(parts + [data])
   158     if parts :
   153 
   159         raise Exception("Extra data: %r" % (line))
       
   160 
   154 
   161     return name, ttl, type, data, comment
   155     return name, ttl, type, data, comment
   162 
   156 
   163 def parse_zone (file) :
   157 def parse_zone (file) :
   164     """
   158     """
   226         # verify
   220         # verify
   227         if zone and reverse.endswith(origin) :
   221         if zone and reverse.endswith(origin) :
   228             reverse = reverse[:-(len(origin) + 1)]
   222             reverse = reverse[:-(len(origin) + 1)]
   229 
   223 
   230         else :
   224         else :
   231             log.warning("Reverse does not match zone origin: (%s) -> %s <-> %s", ip, reverse, origin)
   225             log.warning("Reverse does not match zone origin, skipping: (%s) -> %s <-> %s", ip, reverse, origin)
   232             continue
   226             continue
   233 
   227 
   234         # domain to use
   228         # domain to use
   235         host_domain = domain
   229         host_domain = domain
   236         host_fqdn = fqdn(name, domain)
   230         host_fqdn = fqdn(name, domain)
   269         
   263         
   270         yield u"{name:25} {ttl:4} {cls:2} {type:5} {data}{comment}".format(name=name, ttl=ttl, cls=cls, type=type, data=data, comment=comment)
   264         yield u"{name:25} {ttl:4} {cls:2} {type:5} {data}{comment}".format(name=name, ttl=ttl, cls=cls, type=type, data=data, comment=comment)
   271 
   265 
   272 def write_zone (file, zone) :
   266 def write_zone (file, zone) :
   273     for line in build_zone(zone) :
   267     for line in build_zone(zone) :
   274         file.write(unicode(line + '\n'))
   268         file.write(line + u'\n')
   275 
   269 
   276 def open_file (path, mode, charset) :
   270 def open_file (path, mode, charset) :
   277     """
   271     """
   278         Open unicode-enabled file from path, with - using stdio.
   272         Open unicode-enabled file from path, with - using stdio.
   279     """
   273     """