JFIF$        dd7 

Viewing File: /usr/share/cloudlinux/cloudlinux_clean_hosting_packages.py

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

# coding=utf-8
# Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2022 All Rights Reserved
#
# Licensed under CLOUD LINUX LICENSE AGREEMENT
# http://cloudlinux.com/docs/LICENSE.TXT

import subprocess
import sys
import json
from typing import List, Set, Tuple, Optional
from xml.dom import minidom as xml

from clveconfig import ve_config
from clcommon.lib.cledition import lve_supported_or_exit

LVECTL = '/usr/sbin/lvectl'


def lvectl_list_packages() -> Set[Tuple[str, Optional[str]]]:
    """
    Parse packages list from `lvectl all-package-list` command
    Ex: {('pack1', 'reseller1'), ('pack2', None), ...}
    """
    res = []
    _, response = subprocess.getstatusoutput(f'{LVECTL} all-package-list --json')
    data = json.loads(response).get('data', [])
    for package in data:
        _reseller = package.get('RESELLER')
        if not _reseller or _reseller == 'N/A':
            _reseller = None
        res.append(
            (package.get('ID'), _reseller)
        )
    return set(
        filter(lambda x: x[0] not in {'VE_DEFAULT'}, res)
    )


def xml_get_packages(xml_element: xml.Element) -> List[Tuple[str, Optional[str]]]:
    """
    Parse packages list from ve.cfg
    """
    res = []
    packages = xml_element.getElementsByTagName('package')
    for package in packages:
        res.append(
            (package.getAttribute('id'), package.getAttribute('reseller') or None)
        )
    return res


@lve_supported_or_exit
def main():
    """
    Check that ve.cfg contains no orphan package elements
    Otherwise delete these packages
    """
    changed = False
    xml_config, _ = ve_config.get_xml_config(use_cache=False)
    xml_packages = xml_get_packages(xml_config)
    raw_xml_packages = xml_config.getElementsByTagName('package')
    lvectl_packages = lvectl_list_packages()
    for package in xml_packages:
        package_id, package_reseller = package
        if package not in lvectl_packages:
            try:
                package_element = next(
                    filter(
                        lambda x, pid=package_id, pres=package_reseller: x.getAttribute('id') == pid
                        and (
                            (x.hasAttribute('reseller') is False and pres is None)
                            or x.getAttribute('reseller') == str(pres)
                        ),
                        raw_xml_packages,
                    )
                )
                package_element.parentNode.removeChild(package_element)
                changed = True
            except StopIteration:
                pass
    if changed:
        ve_config.save_xml(xml_config)
    return 0


if __name__ == '__main__':
    sys.exit(main())
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