JFIF$        dd7 

Viewing File: /usr/share/cagefs/exclude_users_cleaner.py

#!/opt/cloudlinux/venv/bin/python3 -bb
# -*- 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 print_function
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from future import standard_library
standard_library.install_aliases()
from builtins import *
import glob
import os
import sys
from pwd import getpwnam

from clcommon.utils import get_file_lines, write_file_lines
from clcommon.cpapi import cpusers, NotSupported
from clcommon.utils import mod_makedirs

# cagefs imports
LIBDIR = '/usr/share/cagefs'
sys.path.append(LIBDIR)
from cagefsctl import EXCLUDE_PATH

NEW_EXCLUDE_PATH = '/usr/share/cagefs/exclude.d'


def _is_user_present_in_system(username):
    try:
        getpwnam(username)
        return True
    except KeyError:
        return False


def _is_exclude_user(cp_users, username):
    """
    Determines whether the user should be excluded from CageFS
    :param cp_users: Panel users lst
    :param username: username to check
    :return: True - user should be excluded from CageFs, False - else
    """
    if username in cp_users:
        # Panel user should not be excluded from CageFS
        return False
    if _is_user_present_in_system(username):
        # User present in system, but absent in panel - exclude from CageFS
        return True
    return False


def _process_file(cp_users, source_filename, dest_filename):
    """
    Copies usernames from source file to destination file and excudes absent and panel users
    :param source_filename: Source filename (/usr/share/cagefs/exclude.d/..)
    :param dest_filename: Destination filename (/etc/cagefs/exclude/..)
    :return: None
    """
    source_lines = get_file_lines(source_filename)
    if os.path.isfile(dest_filename):
        dest_lines = get_file_lines(dest_filename)
    else:
        dest_lines = []
    # Determine manually added users to destination file and put them to output line list
    source_users = [x.strip() for x in source_lines]
    dest_users = [x.strip() for x in dest_lines]
    manually_added_users_list = list(set(dest_users) - set(source_users))
    lines_for_write = [line+'\n' for line in manually_added_users_list if line]
    for username in source_users:
        if _is_exclude_user(cp_users, username):
            lines_for_write.append(username + '\n')
    # Write new file if need
    if not lines_for_write:
        # Nothing to write
        try:
            os.remove(dest_filename)
        except (OSError, IOError):
            pass
    else:
        if sorted(dest_lines) != sorted(lines_for_write):
            write_file_lines(dest_filename, lines_for_write, 'w')
            os.chmod(dest_filename, 0o0600)


def main():
    # Create /etc/cagefs/exclude directory
    try:
        if not os.path.isdir(EXCLUDE_PATH):
            mod_makedirs(EXCLUDE_PATH, 0o0751)
    except (OSError, IOError) as e:
        print("Error:", str(e))
        sys.exit(1)
    try:
        # Get panel users list
        cp_users = cpusers()
    except NotSupported:
        cp_users = ()
    exclude_file_list = glob.glob(os.path.join(NEW_EXCLUDE_PATH, '*'))
    is_error = False
    for exclude_file in exclude_file_list:
        exclude_file_to_write = os.path.join(EXCLUDE_PATH, os.path.basename(exclude_file))
        try:
            _process_file(cp_users, exclude_file, exclude_file_to_write)
        except (OSError, IOError) as e:
            print("Error:", str(e))
            is_error = True
    sys.exit(1 if is_error else 0)


if "__main__" == __name__:
    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