]> xenbits.xensource.com Git - xen.git/commitdiff
Remus: add file locking and modprobe utility functions
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 4 May 2010 08:35:42 +0000 (09:35 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 4 May 2010 08:35:42 +0000 (09:35 +0100)
Signed-off-by: Brendan Cully <brendan@cs.ubc.ca>
tools/python/xen/remus/util.py

index 5fb6d03950acd9f62df6a979c3de7eddd3162487..4ebb39ff456a010a901c0f6470e99d5f169710ff 100644 (file)
@@ -1,6 +1,6 @@
 # utility functions
 
-import os, subprocess
+import fcntl, os, subprocess
 
 class PipeException(Exception):
     def __init__(self, message, errno):
@@ -8,9 +8,50 @@ class PipeException(Exception):
         message = '%s: %d, %s' % (message, errno, os.strerror(errno))
         Exception.__init__(self, message)
 
+class Lock(object):
+    """advisory lock"""
+
+    def __init__(self, filename):
+        """lock using filename for synchronization"""
+        self.filename = filename + '.lock'
+
+        self.fd = None
+
+        self.lock()
+
+    def __del__(self):
+        self.unlock()
+
+    def lock(self):
+        if self.fd:
+            return
+
+        self.fd = open(self.filename, 'w')
+        fcntl.lockf(self.fd, fcntl.LOCK_EX)
+
+    def unlock(self):
+        if not self.fd:
+            return
+
+        fcntl.lockf(self.fd, fcntl.LOCK_UN)
+        self.fd = None
+        try:
+            os.remove(self.filename)
+        except OSError:
+            # harmless race
+            pass
+
 def canonifymac(mac):
     return ':'.join(['%02x' % int(field, 16) for field in mac.split(':')])
 
+def checkpid(pid):
+    """return True if pid is live"""
+    try:
+        os.kill(pid, 0)
+        return True
+    except OSError:
+        return False
+
 def runcmd(args, cwd=None):
     # TODO: stdin handling
     if type(args) == str:
@@ -29,3 +70,11 @@ def runcmd(args, cwd=None):
         return stdout
     except (OSError, IOError), inst:
         raise PipeException('could not run %s' % args[0], inst.errno)
+
+def modprobe(modname):
+    """attempt to load kernel module modname"""
+    try:
+        runcmd(['modprobe', '-q', modname])
+        return True
+    except PipeException:
+        return False