????
Current Path : /proc/324102/root/usr/sbin/ |
Current File : //proc/324102/root/usr/sbin/processpaneluserspackages |
#!/opt/cloudlinux/venv/bin/python3 -bb from __future__ import absolute_import from __future__ import print_function import os.path import sys import fcntl from subprocess import call from os.path import isfile, islink from clcommon.cpapi import panel_hooks_lib, list_all from clcommon.lib.cledition import skip_without_lve skip_without_lve() # compare it with user plan from CACHE_FILE = "/etc/container/user_plan.cache" # IF any user differs or does not exist THEN updates user with "lvectl apply USER" # and write new user plan into CACHE_FILE _GOVERNOR_PACKAGE_UTILITY_PATH = "/usr/share/lve/dbgovernor/governor_package_limitting.py" # only one copy of this program is allowed to run at a time, # so we will lock this script file. lock_file = open(sys.argv[0], 'r') try: fcntl.flock(lock_file, fcntl.LOCK_EX | fcntl.LOCK_NB) except IOError: print('Cannot lock script file, probably another copy of process is running.') exit(1) def parse_user_plan_file(user_plan_file): """Parse given file with lines like 'user_id plan_name' :return dict(user_id = plan_name, ...) """ plan_info = dict() for line in user_plan_file: try: user_id, plan_name = line.strip().split(None, 1) plan_info[user_id] = plan_name except ValueError: sys.stderr.write("ERROR parsing file. Current line is: %s" % line) sys.stderr.write("Valid line format is 'user_id plan_name'") return plan_info # ----------------------MAIN WORK STARTS HERE---------------------------- # reading actual user plan new_plan = {str(uid): package for uid, package in list_all().items()} # assume that normally CACHE_FILE is valid CACHE_INVALID = False # reading cache file if isfile(CACHE_FILE) and not islink(CACHE_FILE): cached_user_plan = open(CACHE_FILE, 'r') try: old_plan = parse_user_plan_file(cached_user_plan) except ValueError: print("cache file is damaged, and will be rewritten") CACHE_INVALID = True else: # comparing new_plan with old_plan for user in new_plan: if not old_plan.get(user) or old_plan[user] != new_plan[user]: # print 'calling "lvectl apply %s"' % user # uncomment for logging call(['/usr/sbin/lvectl', 'apply', user]) CACHE_INVALID = True if CACHE_INVALID and os.path.exists(_GOVERNOR_PACKAGE_UTILITY_PATH): call([_GOVERNOR_PACKAGE_UTILITY_PATH, 'sync']) else: CACHE_INVALID = True if CACHE_INVALID: # leave cache in old format in order to avoid # problems during update # TODO: change cache format to json some day with open(CACHE_FILE, 'w') as cache_file: for user, plan in new_plan.items(): cache_file.write("%s %s\n" % (user, plan)) # Reseller limits support panel_hooks_lib.call_sync_map() # Unlock fcntl.flock(lock_file, fcntl.LOCK_UN) lock_file.close() exit(0)