Lock ud-generate process
authorPeter Palfrader <peter@palfrader.org>
Fri, 25 Mar 2011 18:58:45 +0000 (19:58 +0100)
committerPeter Palfrader <peter@palfrader.org>
Fri, 25 Mar 2011 18:58:45 +0000 (19:58 +0100)
debian/control
ud-generate

index 03a8215..f3bbe9e 100644 (file)
@@ -8,7 +8,7 @@ Uploaders: Ryan Murray <rmurray@debian.org>, Peter Palfrader <weasel@debian.org>
 
 Package: userdir-ldap
 Architecture: all
-Depends: ${python:Depends}, python-ldap, perl5, procmail, rsync, libnss-db
+Depends: ${python:Depends}, python-ldap, perl5, procmail, rsync, libnss-db, python-lockfile
 Suggests: libnet-ldap-perl, libcrypt-blowfish-perl, gnupg (>= 1.0.3), python-net, python-gdbm, libdate-manip-perl, liburi-perl, userdir-ldap-cgi, python (>= 2.6) | python-simplejson
 Description: Login User Directory in LDAP support scripts
  These scripts simplifiy the creation and management of a LDAP based user
index 5529d93..5abadf6 100755 (executable)
@@ -6,7 +6,7 @@
 #   Copyright (c) 2003-2004  James Troup <troup@debian.org>
 #   Copyright (c) 2004-2005,7  Joey Schulze <joey@infodrom.org>
 #   Copyright (c) 2001-2007  Ryan Murray <rmurray@debian.org>
-#   Copyright (c) 2008,2009,2010 Peter Palfrader <peter@palfrader.org>
+#   Copyright (c) 2008,2009,2010,2011 Peter Palfrader <peter@palfrader.org>
 #   Copyright (c) 2008 Andreas Barth <aba@not.so.argh.org>
 #   Copyright (c) 2008 Mark Hymers <mhy@debian.org>
 #   Copyright (c) 2008 Luk Claes <luk@debian.org>
@@ -29,6 +29,7 @@
 #   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 lockfile
 from userdir_ldap import *
 from userdir_exceptions import *
 import UDLdap
@@ -88,6 +89,27 @@ def safe_rmtree(dir):
       else:
          raise e
 
+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)
+   except OSError, error:
+      if error.errno == errno.ENOENT:
+         pass
+      else:
+         raise
+
+   lock = lockfile.FileLock(fn)
+   try:
+      lock.acquire(timeout=wait)
+   except lockfile.LockTimeout:
+      return None
+
+   return lock
+
+
 def Sanitize(Str):
    return Str.translate(string.maketrans("\n\r\t", "$$$"))
 
@@ -1171,7 +1193,17 @@ for x in attrs:
 if 'UD_GENERATEDIR' in os.environ:
    GenerateDir = os.environ['UD_GENERATEDIR']
 
-generate_all(GenerateDir, l)
+try:
+   lock = get_lock( os.path.join(GenerateDir, 'ud-generate.lock') )
+   if lock is None:
+      sys.stderr.write("Could not acquire lock %s.\n"%(fn))
+      sys.exit(1)
+
+   generate_all(GenerateDir, l)
+
+finally:
+   if not lock is None:
+      lock.release()
 
 # vim:set et:
 # vim:set ts=3: