]> git.phdru.name Git - m_librarian.git/blobdiff - m_librarian/web/utils.py
Feat(web): Do not allow to run two instances of `ml-web.py`
[m_librarian.git] / m_librarian / web / utils.py
index 2efe724a6bdf8fcfb10a9e7e1c4ce9d0ca877de8..12be81f47dc572482043dc922c42fea9db637495 100644 (file)
@@ -1,7 +1,48 @@
+from fcntl import flock, LOCK_EX, LOCK_UN, LOCK_NB
+from os import path, remove
+import socket
+
+
+lock_fname = path.join(
+    path.dirname(path.dirname(path.dirname(__file__))),
+    'tmp', 'm_librarian.lock')
+
+
+def get_lock(port):
+    try:
+        lock_file = open(lock_fname, 'r')
+    except IOError:  # no lock file
+        pass
+    else:
+        try:
+            flock(lock_file, LOCK_EX | LOCK_NB)
+        except IOError:  # locked
+            port = int(lock_file.readline())
+            lock_file.close()
+            return None, port
+        else:
+            flock(lock_file, LOCK_UN)
+            lock_file.close()
+
+    lock_file = open(lock_fname, 'w')
+    lock_file.write(str(port))
+    lock_file.close()
+    lock_file = open(lock_fname, 'r')
+    flock(lock_file, LOCK_EX | LOCK_NB)
+    return lock_file, None
+
+
+def close_lock(lock_file):
+    flock(lock_file, LOCK_UN)
+    lock_file.close()
+    lock_file = open(lock_fname, 'w')
+    lock_file.write('')
+    lock_file.close()
+    remove(lock_fname)
+
 
 def get_open_port():
     # https://stackoverflow.com/a/2838309/7976758
-    import socket
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     s.bind(("", 0))
     # s.listen(1)