pvl.hosts-import: alias4 mapping
authorTero Marttila <terom@paivola.fi>
Thu, 19 Dec 2013 02:07:03 +0200
changeset 313 c211ef65fd67
parent 312 b814f87ed40d
child 314 a1e4ef8dfb76
pvl.hosts-import: alias4 mapping
bin/pvl.hosts-import
--- a/bin/pvl.hosts-import	Thu Dec 19 01:46:59 2013 +0200
+++ b/bin/pvl.hosts-import	Thu Dec 19 02:07:03 2013 +0200
@@ -7,6 +7,7 @@
 import pvl.args
 import pvl.dns.zone
 import pvl.dhcp.config
+import pvl.hosts
 import pvl.ldap.args
 
 import collections
@@ -537,12 +538,45 @@
     # gather
     return process_import_hosts(options, import_hosts)
 
-def check_hosts (options, hosts) :
+def process_hosts (options, hosts) :
+    """
+        Sanity-check and post-process hosts.
+
+        Does alias4 mapping, nonexistant alias checks, duplicate ip checks..
+    """
+
     by_name = dict(hosts)
+    by_ip = dict()
 
-    for host, fields in hosts :
+    # scan for alias4
+    for (host, domain), fields in by_name.items() :
+        alias4 = pvl.hosts.Host.ALIAS4_FMT.format(host=host)
+        alias_fields = by_name.get((alias4, domain))
+
+        if not alias_fields :
+            continue
+
+        elif set(alias_fields) == set([('ip', ), ('alias', )]) :
+            log.warn("%s: mapped to alias4 on %s", host, alias4)
+            alias_fields[('alias4', )] = fields[('alias', )]
+            del by_name[(host, domain)]
+
+    for (host, domain), fields in hosts :
+        if (host, domain) not in by_name :
+            # skip
+            continue
+
         if set(fields) == set([('alias', )]) :
             log.warn("%s: nonexistant alias target: %s", host, ' '.join(fields[('alias', )]))
+        
+        ip = fields.get(('ip', ))
+
+        if ip in by_ip :
+            log.warn("%s: duplicate ip %s: %s", host, ip, by_ip[ip])
+        else :
+            by_ip[ip] = host
+
+        yield (host, domain), fields
 
 def sort_export_hosts (options, hosts) :
     """
@@ -665,7 +699,7 @@
     hosts = list(apply_import_hosts(options))
    
     # verify
-    check_hosts(options, hosts)
+    hosts = process_hosts(options, hosts)
 
     # output
     if options.output_hosts :