Mini Shell
#!/usr/bin/python
# coding=utf-8
#
# Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2019 All Rights Reserved
#
# Licensed under CLOUD LINUX LICENSE AGREEMENT
# http://cloudlinux.com/docs/LICENSE.TXT
from __future__ import absolute_import
import fcntl
import os
from contextlib import contextmanager
CONFIG_DIR = '/etc/container'
LOCK_FILE = os.path.join(CONFIG_DIR, '.ve.cfg.lock')
# TODO: probably should be encapsulated
LOCK_FD = None # type: file
LOCK_WRITE = False
class LockFailedException(Exception):
pass
def setup_global_lock(write=False):
global LOCK_FD
global LOCK_WRITE
if LOCK_FD is not None:
return False
if write:
LOCK_WRITE = True
try:
LOCK_FD = open(LOCK_FILE, 'a+')
fcntl.flock(LOCK_FD.fileno(), fcntl.LOCK_EX)
except IOError:
raise LockFailedException("IO error happened while getting lock")
return True
def release_lock():
global LOCK_FD
# write locks released only on process exit
if LOCK_WRITE:
return False
if LOCK_FD is not None:
LOCK_FD.close()
LOCK_FD = None
return True
@contextmanager
def acquire_lock(write=False):
"""
Usage:
with acquire_lock():
... do something with ve.cfg ...
"""
setup_global_lock(write)
yield
release_lock()
Zerion Mini Shell 1.0