Source code for m_librarian.web.utils

from fcntl import flock, LOCK_EX, LOCK_UN, LOCK_NB
from tempfile import gettempdir
import os
import socket


if os.access('/var/run/lock', os.W_OK):
    lock_dir = '/var/run/lock'
else:
    lock_dir = gettempdir()

if hasattr(os, 'getuid'):
    suffix = '-%d' % os.getuid()
else:
    suffix = ''

lock_fname = os.path.join(lock_dir, 'm_librarian%s.lock' % suffix)


[docs]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
[docs]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() os.remove(lock_fname)
[docs]def get_open_port(): # https://stackoverflow.com/a/2838309/7976758 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(("", 0)) # s.listen(1) port = s.getsockname()[1] s.close() return port