stop doing DNS lookups, part 1
[mirror/userdir-ldap.git] / ud-generate
index 0239c3f..4800938 100755 (executable)
@@ -48,6 +48,7 @@ EmailCheck = re.compile("^([^ <>@]+@[^ ,<>@]+)?$")
 BSMTPCheck = re.compile(".*mx 0 (master)\.debian\.org\..*",re.DOTALL)
 PurposeHostField = re.compile(r".*\[\[([\*\-]?[a-z0-9.\-]*)(?:\|.*)?\]\]")
 IsV6Addr = re.compile("^[a-fA-F0-9:]+$")
+IsDebianHost = re.compile("[a-zA-Z0-9\.]+\.debian\.org$")
 DNSZone = ".debian.net"
 Keyrings = ConfModule.sync_keyrings.split(":")
 
@@ -752,6 +753,22 @@ def GenDNS(File):
    try:
       F = open(File + ".tmp", "w")
      
+      global HostAttrs
+
+      for x in HostAttrs:
+         if x[1].has_key("hostname") == 0 or \
+            x[1].has_key("architecture") == 0 or\
+            x[1].has_key("sshRSAHostKey") == 0:
+            continue
+
+         if IsDebianHost.match(GetAttr(x, "hostname")) is not None:
+            continue
+
+         DNSInfo = ExtractDNSInfo(x)
+         for Line in DNSInfo:
+            Line = Sanitize(Line) + "\n"
+            F.write(Line)
+
       # Fetch all the users
       global PasswdAttrs
      
@@ -799,61 +816,65 @@ def GenDNS(File):
       raise
    Done(File, F, None)
 
-# Generate the DNS SSHFP records
-def GenSSHFP(File):
+def ExtractDNSInfo(x):
+
+   DNSInfo = []
+   Host = GetAttr(x, "hostname")
+   Arch = GetAttr(x, "architecture")
+   Algorithm = None
+
+   for I in x[1]["sshRSAHostKey"]:
+      Split = I.split()
+      if Split[0] == 'ssh-rsa':
+         Algorithm = 1
+      if Split[0] == 'ssh-dss':
+         Algorithm = 2
+      if Algorithm == None:
+         continue
+      Fingerprint = sha.new(base64.decodestring(Split[1])).hexdigest()
+      DNSInfo.append("%s. IN SSHFP %u 1 %s" % (Host, Algorithm, Fingerprint))
+
+   Mach = ""
+   if x[1].has_key("machine"):
+      Mach = " " + GetAttr(x, "machine")
+   DNSInfo.append("%s. IN HINFO \"%s%s\" \"%s\"" % (Host, Arch, Mach, "Debian GNU/Linux"))
+
+   if x[1].has_key("ipHostNumber"):
+      for I in x[1]["ipHostNumber"]:
+         if IsV6Addr.match(I) != None:
+            DNSInfo.append("%s. IN AAAA %s" % (Host, I))
+         else:
+            DNSInfo.append("%s. IN A %s" % (Host, I))
+
+   if x[1].has_key("mXRecord"):
+      for I in x[1]["mXRecord"]:
+         DNSInfo.append("%s. IN MX %s" % (Host, I))
+
+   return DNSInfo
+
+# Generate the DNS records
+def GenZoneRecords(File):
    F = None
    try:
       F = open(File + ".tmp", "w")
-     
+
       # Fetch all the hosts
       global HostAttrs
-      if HostAttrs == None:
-         raise UDEmptyList, "No Hosts"
-     
+
       for x in HostAttrs:
          if x[1].has_key("hostname") == 0 or \
             x[1].has_key("architecture") == 0 or\
             x[1].has_key("sshRSAHostKey") == 0:
             continue
-         Host = GetAttr(x, "hostname")
-         Arch = GetAttr(x, "architecture")
-         Algorithm = None
 
-         for I in x[1]["sshRSAHostKey"]:
-            Split = I.split()
-            if Split[0] == 'ssh-rsa':
-               Algorithm = 1
-            if Split[0] == 'ssh-dss':
-               Algorithm = 2
-            if Algorithm == None:
-               continue
-            Fingerprint = sha.new(base64.decodestring(Split[1])).hexdigest()
-            Line = "%s. IN SSHFP %u 1 %s" % (Host, Algorithm, Fingerprint)
+         if IsDebianHost.match(GetAttr(x, "hostname")) is None:
+            continue
+
+         DNSInfo = ExtractDNSInfo(x)
+         for Line in DNSInfo:
             Line = Sanitize(Line) + "\n"
             F.write(Line)
 
-         Mach = ""
-         if x[1].has_key("machine"):
-            Mach = " " + GetAttr(x, "machine")
-         Line = "%s. IN HINFO \"%s%s\" \"%s\"" % (Host, Arch, Mach, "Debian GNU/Linux")
-         Line = Sanitize(Line) + "\n"
-         F.write(Line)
-
-         if x[1].has_key("ipHostNumber"):
-            for I in x[1]["ipHostNumber"]:
-               if IsV6Addr.match(I) != None:
-                  Line = "%s. IN AAAA %s" % (Host, I)
-               else:
-                  Line = "%s. IN A %s" % (Host, I)
-               Line = Sanitize(Line) + "\n"
-               F.write(Line)
-
-         if x[1].has_key("mXRecord"):
-            for I in x[1]["mXRecord"]:
-               Line = "%s. IN MX %s" % (Host, I)
-               Line = Sanitize(Line) + "\n"
-               F.write(Line)
-
    # Oops, something unspeakable happened.
    except:
       Die(File, F, None)
@@ -931,8 +952,6 @@ def GenSSHKnown(File, mode=None):
       os.umask(OldMask)
      
       global HostAttrs
-      if HostAttrs is None:
-         raise UDEmptyList, "No Hosts"
      
       for x in HostAttrs:
          if x[1].has_key("hostname") == 0 or \
@@ -984,33 +1003,22 @@ def GenHosts(l, File):
       F = open(File + ".tmp", "w", 0644)
       os.umask(OldMask)
      
-      # Fetch all the hosts
-      hostnames = l.search_s(HostBaseDn, ldap.SCOPE_ONELEVEL, "hostname=*",
-                             ["hostname"])
-     
-      if hostnames is None:
-         raise UDEmptyList, "No Hosts"
-     
       seen = set()
-      for x in hostnames:
-         host = GetAttr(x, "hostname", None)
-         if host:
-            addrs = []
-            try:
-               addrs += socket.getaddrinfo(host, None, socket.AF_INET)
-            except socket.error:
-               pass
-            try:
-               addrs += socket.getaddrinfo(host, None, socket.AF_INET6)
-            except socket.error:
-               pass
-           
-            for addrinfo in addrs:
-               if addrinfo[0] in (socket.AF_INET, socket.AF_INET6):
-                  addr = addrinfo[4][0]
-                  if addr not in seen:
-                     print >> F, addrinfo[4][0]
-                     seen.add(addr)
+
+      global HostAttrs
+
+      for x in HostAttrs:
+
+         if IsDebianHost.match(GetAttr(x, "hostname")) is None:
+            continue
+
+         addrs = x[0]["ipHostNumber"]
+         for addr in addrs:
+            if addr not in seen:
+               seen.add(addr)
+               addr = Sanitize(addr) + "\n"
+               F.write(addr)
+
    # Oops, something unspeakable happened.
    except:
       Die(File, F, None)
@@ -1061,6 +1069,11 @@ HostAttrs    = l.search_s(HostBaseDn, ldap.SCOPE_ONELEVEL, "objectClass=debianSe
                 ["hostname", "sshRSAHostKey", "purpose", "allowedGroups", "exportOptions",\
                  "mXRecord", "ipHostNumber", "machine", "architecture"])
 
+if HostAttrs == None:
+   raise UDEmptyList, "No Hosts"
+
+HostAttrs.sort(lambda x, y: cmp((GetAttr(x, "hostname")).lower(), (GetAttr(y, "hostname")).lower()))
+
 # Generate global things
 GlobalDir = GenerateDir + "/"
 GenDisabledAccounts(GlobalDir + "disabled-accounts")
@@ -1161,7 +1174,7 @@ for host in HostAttrs:
 
    if 'DNS' in ExtraList:
       GenDNS(OutDir + "dns-zone")
-      GenSSHFP(OutDir + "dns-sshfp")
+      GenZoneRecords(OutDir + "dns-sshfp")
 
    if 'AUTHKEYS' in ExtraList:
       DoLink(GlobalDir, OutDir, "authorized_keys")