equal
deleted
inserted
replaced
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 """ |