JFIF$        dd7 

Viewing File: /usr/sbin/processpaneluserspackages

#!/opt/cloudlinux/venv/bin/python3 -bb

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)
Back to Directory  nL+D550H?Mx ,D"v]qv;6*Zqn)ZP0!1 A "#a$2Qr D8 a Ri[f\mIykIw0cuFcRı?lO7к_f˓[C$殷WF<_W ԣsKcëIzyQy/_LKℂ;C",pFA:/]=H  ~,ls/9ć:[=/#f;)x{ٛEQ )~ =𘙲r*2~ a _V=' kumFD}KYYC)({ *g&f`툪ry`=^cJ.I](*`wq1dđ#̩͑0;H]u搂@:~וKL Nsh}OIR*8:2 !lDJVo(3=M(zȰ+i*NAr6KnSl)!JJӁ* %݉?|D}d5:eP0R;{$X'xF@.ÊB {,WJuQɲRI;9QE琯62fT.DUJ;*cP A\ILNj!J۱+O\͔]ޒS߼Jȧc%ANolՎprULZԛerE2=XDXgVQeӓk yP7U*omQIs,K`)6\G3t?pgjrmۛجwluGtfh9uyP0D;Uڽ"OXlif$)&|ML0Zrm1[HXPlPR0'G=i2N+0e2]]9VTPO׮7h(F*癈'=QVZDF,d߬~TX G[`le69CR(!S2!P <0x<!1AQ "Raq02Br#SCTb ?Ζ"]mH5WR7k.ۛ!}Q~+yԏz|@T20S~Kek *zFf^2X*(@8r?CIuI|֓>^ExLgNUY+{.RѪ τV׸YTD I62'8Y27'\TP.6d&˦@Vqi|8-OΕ]ʔ U=TL8=;6c| !qfF3aů&~$l}'NWUs$Uk^SV:U# 6w++s&r+nڐ{@29 gL u"TÙM=6(^"7r}=6YݾlCuhquympǦ GjhsǜNlɻ}o7#S6aw4!OSrD57%|?x>L |/nD6?/8w#[)L7+6〼T ATg!%5MmZ/c-{1_Je"|^$'O&ޱմTrb$w)R$& N1EtdU3Uȉ1pM"N*(DNyd96.(jQ)X 5cQɎMyW?Q*!R>6=7)Xj5`J]e8%t!+'!1Q5 !1 AQaqё#2"0BRb?Gt^## .llQT $v,,m㵜5ubV =sY+@d{N! dnO<.-B;_wJt6;QJd.Qc%p{ 1,sNDdFHI0ГoXшe黅XۢF:)[FGXƹ/w_cMeD,ʡcc.WDtA$j@:) -# u c1<@ۗ9F)KJ-hpP]_x[qBlbpʖw q"LFGdƶ*s+ډ_Zc"?%t[IP 6J]#=ɺVvvCGsGh1 >)6|ey?Lӣm,4GWUi`]uJVoVDG< SB6ϏQ@ TiUlyOU0kfV~~}SZ@*WUUi##; s/[=!7}"WN]'(L! ~y5g9T̅JkbM' +s:S +B)v@Mj e Cf jE 0Y\QnzG1д~Wo{T9?`Rmyhsy3!HAD]mc1~2LSu7xT;j$`}4->L#vzŏILS ֭T{rjGKC;bpU=-`BsK.SFw4Mq]ZdHS0)tLg