add webPassword
[mirror/userdir-ldap.git] / ud-generate
index 6116cd0..560518e 100755 (executable)
@@ -28,7 +28,7 @@
 #   along with this program; if not, write to the Free Software
 #   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-import string, re, time, ldap, getopt, sys, os, pwd, posix, socket, base64, sha, shutil, errno, tarfile, grp
+import string, re, time, ldap, getopt, sys, os, pwd, posix, socket, base64, hashlib, shutil, errno, tarfile, grp
 import lockfile
 from userdir_ldap import *
 from userdir_exceptions import *
@@ -91,10 +91,10 @@ def safe_rmtree(dir):
 
 def get_lock(fn, wait=5*60, max_age=3600*6):
    try:
-      stat = os.stat(fn)
-      if stat[ST_MTIME] < time.time() - max_age:
-         sys.stderr.write("Removing stale lock %s"%(fn))
-         os.unlink(fn)
+      stat = os.stat(fn + '.lock')
+      if stat.st_mtime < time.time() - max_age:
+         sys.stderr.write("Removing stale lock %s"%(fn + '.lock'))
+         os.unlink(fn + '.lock')
    except OSError, error:
       if error.errno == errno.ENOENT:
          pass
@@ -781,7 +781,7 @@ def ExtractDNSInfo(x):
             Algorithm = 2
          if Algorithm == None:
             continue
-         Fingerprint = sha.new(base64.decodestring(Split[1])).hexdigest()
+         Fingerprint = hashlib.new('sha1', base64.decodestring(Split[1])).hexdigest()
          DNSInfo.append("%sIN\tSSHFP\t%u 1 %s" % (TTLprefix, Algorithm, Fingerprint))
 
    if 'architecture' in x[1]:
@@ -997,7 +997,7 @@ def GenKeyrings(OutDir):
 
 def get_accounts(ldap_conn):
    # Fetch all the users
-   passwd_attrs = ldap_conn.search_s(BaseDn, ldap.SCOPE_ONELEVEL, "(&(uid=*)(!(uidNumber=0)))",\
+   passwd_attrs = ldap_conn.search_s(BaseDn, ldap.SCOPE_ONELEVEL, "(&(uid=*)(!(uidNumber=0))(objectClass=shadowAccount))",\
                    ["uid", "uidNumber", "gidNumber", "supplementaryGid",\
                     "gecos", "loginShell", "userPassword", "shadowLastChange",\
                     "shadowMin", "shadowMax", "shadowWarning", "shadowInactive",
@@ -1193,6 +1193,40 @@ def generate_host(host, global_dir, accounts, ssh_files):
 
 l = make_ldap_conn()
 
+mods = l.search_s('cn=log',
+      ldap.SCOPE_ONELEVEL,
+      '(&(&(!(reqMod=activity-from*))(!(reqMod=activity-pgp*)))(|(reqType=add)(reqType=delete)(reqType=modify)(reqType=modrdn)))',
+      ['reqEnd'])
+
+last = 0
+
+# Sort the list by reqEnd
+sorted_mods = sorted(mods, key=lambda mod: mod[1]['reqEnd'][0].split('.')[0])
+# Take the last element in the array
+last = sorted_mods[-1][1]['reqEnd'][0].split('.')[0]
+
+# override globaldir for testing
+if 'UD_GENERATEDIR' in os.environ:
+   GenerateDir = os.environ['UD_GENERATEDIR']
+
+cache_last_mod = 0
+
+try:
+   fd = open(os.path.join(GenerateDir, "last_update.trace"), "r")
+   cache_last_mod=fd.read().strip()
+   fd.close()
+except IOError, e:
+   if e.errno == errno.ENOENT:
+      pass
+   else:
+      raise e
+if cache_last_mod >= last:
+   sys.exit(0)
+
+fd = open(os.path.join(GenerateDir, "last_update.trace"), "w")
+fd.write(last)
+fd.close()
+
 # Fetch all the groups
 GroupIDMap = {}
 attrs = l.search_s(BaseDn, ldap.SCOPE_ONELEVEL, "gid=*",\
@@ -1208,20 +1242,18 @@ for x in attrs:
    if x[1].has_key("subGroup") != 0:
       SubGroupMap.setdefault(x[1]["gid"][0], []).extend(x[1]["subGroup"])
 
-# override globaldir for testing
-if 'UD_GENERATEDIR' in os.environ:
-   GenerateDir = os.environ['UD_GENERATEDIR']
-
+lock = None
 try:
-   lock = get_lock( os.path.join(GenerateDir, 'ud-generate.lock') )
+   lockf = os.path.join(GenerateDir, 'ud-generate.lock')
+   lock = get_lock( lockf )
    if lock is None:
-      sys.stderr.write("Could not acquire lock %s.\n"%(fn))
+      sys.stderr.write("Could not acquire lock %s.\n"%(lockf))
       sys.exit(1)
 
    generate_all(GenerateDir, l)
 
 finally:
-   if not lock is None:
+   if lock is not None:
       lock.release()
 
 # vim:set et: