diff -r 65b483fb862c -r e58baab6b4cd bin/pvl.dns-hosts --- a/bin/pvl.dns-hosts Mon Dec 16 11:41:59 2013 +0200 +++ b/bin/pvl.dns-hosts Mon Dec 16 11:48:04 2013 +0200 @@ -68,63 +68,6 @@ return options, args -ZONE_COMMENTS = ( - re.compile(r'(?P[^/]+)\s*-\s+(?P.+)'), - re.compile(r'(?P.+?)\s*/\s*(?P.+)\s+[/-]\s+(?P.+)'), - re.compile(r'(?P.+?)\s*/\s*(?P.+)\s+[(]\s*(?P.+)[)]'), - re.compile(r'(?P.+?)\s*/\s*(?P.+)'), - re.compile(r'(?P.+)'), -) - -ZONE_OWNER_MAIL = re.compile(r'(?P.*?)\s*<(?P.+?)>') - -def process_zone_comment (options, hostname, comment) : - """ - Attempt to parse a host comment field... :D - """ - - yield 'comment', comment - - for regex in ZONE_COMMENTS : - match = regex.match(comment) - - if match : - break - else : - log.warn("%s: unparsed comment: %s", hostname, comment) - return - - matches = match.groupdict() - owner = matches.pop('owner', None) - - if owner : - mail_match = ZONE_OWNER_MAIL.match(owner) - - if mail_match : - mail_matches = mail_match.groupdict() - - owner = mail_matches['owner'] - yield 'comment-mail', mail_matches['mail'] - else : - mail_matches = { } - else : - mail_matches = { } - - yield 'comment-owner', owner - - for group, value in matches.iteritems() : - if value : - yield 'comment-{group}'.format(group=group), value.strip() - - print u"{hostname:20} {comment:80} = {group:15} / {owner:20} <{mail:20}> / {host}".format( - hostname = hostname, - comment = comment, - group = matches.get('group', ''), - owner = owner, - mail = mail_matches.get('mail', ''), - host = matches.get('host', ''), - ).encode('utf-8') - def process_zone_hosts (options, file) : """ Yield host info from zonefile records. @@ -141,8 +84,7 @@ yield rr.name, 'ip', ip if rr.comment : - for field, value in process_zone_comment(options, rr.name, rr.comment) : - yield rr.name, field, value + yield rr.name, 'comment', rr.comment elif rr.type == 'CNAME' : host, = rr.data @@ -247,7 +189,73 @@ for info in process_dhcp_conf(options, pvl.args.apply_file(options.import_dhcp_hosts)) : yield info - + +ZONE_COMMENTS = ( + re.compile(r'(?P[^/]+)\s*-\s+(?P.+)'), + re.compile(r'(?P.+?)\s*/\s*(?P.+)\s+[/-]\s+(?P.+)'), + re.compile(r'(?P.+?)\s*/\s*(?P.+)\s+[(]\s*(?P.+)[)]'), + re.compile(r'(?P.+?)\s*/\s*(?P.+)'), + re.compile(r'(?P.+)'), +) + +ZONE_OWNER_MAIL = re.compile(r'(?P.*?)\s*<(?P.+?)>') + +def process_zone_comment (options, hostname, comment) : + """ + Attempt to parse a host comment field... :D + + Yields (field, value) bits + """ + + for regex in ZONE_COMMENTS : + match = regex.match(comment) + + if match : + break + else : + log.warn("%s: unparsed comment: %s", hostname, comment) + return + + matches = match.groupdict() + owner = matches.pop('owner', None) + + if owner : + mail_match = ZONE_OWNER_MAIL.match(owner) + + if mail_match : + mail_matches = mail_match.groupdict() + + owner = mail_matches['owner'] + yield 'mail', mail_matches['mail'] + + yield 'owner', owner + + for field, value in matches.iteritems() : + if value : + yield field, value + + +def process_hosts_comments (options, import_hosts) : + """ + Parse out comments from host imports.. + """ + + for host, field, value in import_hosts : + if field != 'comment': + yield host, field, value + continue + + fields = dict(process_zone_comment(options, host, value)) + + print u"{host:20} {comment:80} = {group:15} / {owner:20} <{mail:20}> / {hostinfo}".format( + host = host, + comment = value, + group = fields.get('group', ''), + owner = fields.get('owner', ''), + mail = fields.get('mail', ''), + hostinfo = fields.get('host', ''), + ).encode('utf-8') + def process_hosts_import (options, import_hosts) : """ Import host definitions from given infos @@ -270,6 +278,7 @@ else : # import import_hosts = apply_hosts_import(options) + import_hosts = process_hosts_comments(options, import_hosts) hosts = process_hosts_import(options, import_hosts) # output