--- 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 :