]> git.phdru.name Git - m_librarian.git/blob - 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
1 from fcntl import flock, LOCK_EX, LOCK_UN, LOCK_NB
2 from os import path, remove
3 import socket
4
5
6 lock_fname = path.join(
7     path.dirname(path.dirname(path.dirname(__file__))),
8     'tmp', 'm_librarian.lock')
9
10
11 def get_lock(port):
12     try:
13         lock_file = open(lock_fname, 'r')
14     except IOError:  # no lock file
15         pass
16     else:
17         try:
18             flock(lock_file, LOCK_EX | LOCK_NB)
19         except IOError:  # locked
20             port = int(lock_file.readline())
21             lock_file.close()
22             return None, port
23         else:
24             flock(lock_file, LOCK_UN)
25             lock_file.close()
26
27     lock_file = open(lock_fname, 'w')
28     lock_file.write(str(port))
29     lock_file.close()
30     lock_file = open(lock_fname, 'r')
31     flock(lock_file, LOCK_EX | LOCK_NB)
32     return lock_file, None
33
34
35 def close_lock(lock_file):
36     flock(lock_file, LOCK_UN)
37     lock_file.close()
38     lock_file = open(lock_fname, 'w')
39     lock_file.write('')
40     lock_file.close()
41     remove(lock_fname)
42
43
44 def get_open_port():
45     # https://stackoverflow.com/a/2838309/7976758
46     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
47     s.bind(("", 0))
48     # s.listen(1)
49     port = s.getsockname()[1]
50     s.close()
51     return port