From 9ca3d69416957ffc02b1f56c4800dea54584a8c1 Mon Sep 17 00:00:00 2001 From: Peter Palfrader Date: Fri, 25 Mar 2011 19:58:45 +0100 Subject: [PATCH] Lock ud-generate process --- debian/control | 2 +- ud-generate | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/debian/control b/debian/control index 03a8215..f3bbe9e 100644 --- a/debian/control +++ b/debian/control @@ -8,7 +8,7 @@ Uploaders: Ryan Murray , Peter Palfrader 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 diff --git a/ud-generate b/ud-generate index 5529d93..5abadf6 100755 --- a/ud-generate +++ b/ud-generate @@ -6,7 +6,7 @@ # Copyright (c) 2003-2004 James Troup # Copyright (c) 2004-2005,7 Joey Schulze # Copyright (c) 2001-2007 Ryan Murray -# Copyright (c) 2008,2009,2010 Peter Palfrader +# Copyright (c) 2008,2009,2010,2011 Peter Palfrader # Copyright (c) 2008 Andreas Barth # Copyright (c) 2008 Mark Hymers # Copyright (c) 2008 Luk Claes @@ -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: -- 2.20.1