bin/pvl.dns-hosts
changeset 261 dff7dcf0013f
parent 260 e58baab6b4cd
child 262 36c980a6d04a
--- a/bin/pvl.dns-hosts	Mon Dec 16 11:48:04 2013 +0200
+++ b/bin/pvl.dns-hosts	Mon Dec 16 14:17:11 2013 +0200
@@ -7,6 +7,7 @@
 import pvl.args, optparse
 import pvl.dns.zone
 import pvl.dhcp.config
+import pvl.ldap.args
 
 import collections
 import re
@@ -30,6 +31,7 @@
 
     # logging
     parser.add_option_group(pvl.args.parser(parser))
+    parser.add_option_group(pvl.ldap.args.parser(parser))
 
     parser.add_option('-c', '--input-charset',  metavar='CHARSET',  default='utf-8', 
             help="Encoding used for input files")
@@ -44,6 +46,9 @@
     parser.add_option('--import-dhcp-hosts',    metavar='FILE',
             help="Load hosts from DHCP config")
 
+    parser.add_option('--dump-host-comments',   action='store_true',
+            help="Dump out info on imported host comments")
+
     # defaults
     parser.add_option('--hosts-domain',         metavar='DOMAIN',
             help="Default domain for hosts")
@@ -226,14 +231,69 @@
             mail_matches = mail_match.groupdict()
             
             owner = mail_matches['owner']
-            yield 'mail', mail_matches['mail']
+            yield 'mail', mail_matches['mail'].strip()
 
-    yield 'owner', owner
+    yield 'owner', owner.strip()
 
     for field, value in matches.iteritems() :
         if value :
-            yield field, value
+            yield field, value.strip()
+
+HOST_OWNERS = {
+    u'tech':        'root',
+    u'atk':         'root',
+    u'toimisto':    'root',
+}
+
+def process_host_owner (options, host, info) :
+    """
+        Yield guesses for user from LDAP.
+    """
+
+    if info.get('owner').lower() in HOST_OWNERS :
+        yield HOST_OWNERS[info.get('owner').lower()]
+
+    if info.get('mail') :
+        for user in options.ldap.users.filter(
+                { 'mailLocalAddress': info['mail'] },
+                { 'uid': info['mail'] },
+        ) :
+            yield user['uid']
+
+    if info.get('group') and info.get('owner') :
+        groups = options.ldap.groups.filter(cn=info['group'])
+
+        for group in groups :
+            for user in options.ldap.users.filter({
+                'gidNumber': group['gidNumber'],
+                'cn': info['owner'],
+            }) :
+                yield user['uid']
+
+    if info.get('owner') :
+            for user in options.ldap.users.filter({
+                'cn': info['owner'],
+            }) :
+                yield user['uid']
+
+def process_host_comments (options, host, info) :
+    """
+        Process host fields from comment.
+
+        Attempts to find owner from LDAP..
+    """
+
+    log.debug("%s: %s", host, info)
     
+    for owner in process_host_owner(options, host, info) :
+        log.info("%s: %s", host, owner)
+
+        yield 'owner', owner,
+
+        # only use the first match
+        break
+    else :
+        log.warn("%s: no owner: %s", host, info)
 
 def process_hosts_comments (options, import_hosts) :
     """
@@ -246,16 +306,21 @@
             continue
 
         fields = dict(process_zone_comment(options, host, value))
+        
+        if options.dump_host_comments :
+            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')
+        
 
-        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')
-
+        for field, value in process_host_comments(options, host, fields) :
+            yield host, field, value
+            
 def process_hosts_import (options, import_hosts) :
     """
         Import host definitions from given infos
@@ -271,6 +336,8 @@
 
 def main (argv) :
     options, args = parse_options(argv)
+
+    options.ldap = pvl.ldap.args.apply(options)
     
     if args :
         # direct from file