ehi0ddlmZddlmZddlmZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddlmZddlmZddlmZmZdd lmZdd lmZdd lmZdd lmZdd lmZmZddlm Z ddl!m"Z"ddl#m$Z$m%Z%ddl&m'Z'm(Z(m)Z)ddl*m+Z+m,Z,ddl-m.Z.m/Z/ddl0m1Z1dZ2dZ3dZ4dZ5d6dZ6dZ7dZ8dZ9de2fdZ:de2fdZ;dZd!Z?d"Z@d#ZAd7d%ZBd8d'ZCd6d(ZDd)ZEd*ZFd+ZGd,ZHd-ZId.ZJd9d/ZKd0ZLd1ZMd2ZNd3ZOd4ZPeQd5kr ePdSdS):)print_function)absolute_import)divisionN)map)ClSelect) ClExtSelectdepend_modules_dict) ClUserSelect)ClUserExtSelect)ClUserOptSelect)clprint)clcagefsClPwd)Feature)is_panel_feature_supported) SysCtlConfSYSCTL_CL_CONF_FILE) is_ubuntu run_commandExternalProgramFailed) make_symlink$safely_resolve_username_and_doc_root)ClSelectExceptBaseClSelectException)Websitez/usr/sbin/cagefsctlc0tdtdtdtdtdtdtdtdtd td td td td tdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtd td!td"td#td$td%td&td'td(td)td*ttd+td,td-td.td/td0td1td2td3dS)4Nz? -v | --version : Specify alternative versionz, -u | --user : UsernamezN --domain : Domain name (for per-domain configuration)zE -l | --list : List alternatives for interpreterzQ -G | --list-extensions : List global set of extensions for alternativez@ -S | --summary : List summary of alternativeszE -s | --user-summary : List user summary of alternativeszG -C | --current : Show currently selected alternativezR -c | --user-current : Show currently selected alternative for a userzE -B | --set-current : Set alternative as global defaultzC -b | --set-user-current : Set alternative as user defaultz? -Y | --enable-alternative : Enable alternative globallyz@ -N | --disable-alternative : Disable alternative globallyzd -E | --enable-extensions : Enable comma-separated list of extensions globally for a versionze -D | --disable-extensions : Disable comma-separated list of extensions globally for a versionz_ -R | --replace-extensions : Replace extensions with comma-separated list of extensions z: for a version globallyzX -e | --enable-user-extensions : Enable comma-separated list of extensions for a userzY -d | --disable-user-extensions : Disable comma-separated list of extensions for a userzc -r | --replace-user-extensions : Replace user extensions with comma-separated list of extensionsz[ -t | --reset-user-extensions : Replace user extensions with version default extensionszk -g | --list-user-extensions : List enabled extensions for a user. With key --all shows all extensionsz7 -a | --all : Show all extensionszf -p | --print-summary : If specified along with setting an alternative prints user summaryzb -V | --show-native-version : Shows native version while showing summary or selected versionzN -L | --list-users : List users who use a specified alternativezg -T | --change-to-version : Changes to a specified version all users who have a certain versionzO -k | --add-options : Add comma-separated list options for a userz] -m | --replace-options : Replace user options with comma-separated list of optionszR -x | --delete-options : Delete comma-separated list options for a userzY -Q | --base64 : Expects data as comma-separated base64-encoded stringzL -q | --quiet : Suppress errors messages for wrong inputzX -P | --print-options : Prints user options. By default prints as plain textzg --print-options-safe : Prints user options. By default prints as plain text (safe strings)zV --apply-symlinks-rules : Recreate symlinks to php extensions for all users zQ based on /etc/cl.selector/symlinks.rules filezk --exclude-pid-list : Specify list of PIDs of processes that should not be signaled by SIGHUPz6 -j | --json : Print data as JSONz5 -w | --csv : Print data as CSVz@ -W | --perl : Print data as perl structurezW --api-version : Integer, representing specific api version to use. z2 Defaults to {}ze -z | --reset-options : Deletes all user custom options. Range can be narrowed with user z6 or version optionsz< --update-backup : write settings to backupzh --apply-global-php-ini : use with 0, 1 or 2 arguments from the list: error_log, date.timezonezh without arguments applies all global php options including two abovezE --setup-without-cagefs : setup PHP Selector without CageFSzY --revert-to-cagefs : revert to default setup of PHP Selector (with CageFS)zV --for-all-users : applies specified action for all users in CageFS. zU Available only for enable/disable user extensions)printformatAPI_0N/opt/cloudlinux/venv/lib64/python3.11/site-packages/clselect/clselectctlphp.pyusager$3s KLLL 8999 Z[[[ QRRR ]^^^ LMMM QRRR STTT ^___ QRRR OPPP KLLL LMMM pqqq qrrr klll FGGG deee efff oppp ghhh wxxx CDDD rsss nooo Z[[[ sttt [\\\ ijjj ^___ efff XYYY deee sttt bccc ]^^^ wxxx BCCC ABBB LMMM cddd > E Ee L LMMM qrrr BCCC HIII tuuu tuuu QRRR efff bccc abbbbbr"cd}|r|ddd}tj||ztjddS)z5 Prints to stderr @param message: string z%s :%s rN)sysstderrwriteexit)messageprefixfmts r#print_error_and_exitr0isN C )!66444(JS7]###HQKKKKKr"cbttjdkrtddSdS)z\ Checks presence of command line arguments and exits with usage info if missing rzFCommand line arguments expected. For help use '-h' or '--help' optionsN)lenr)argvr0r!r"r#check_args_presencer4us4  38}}efffffr"c$d}|dd}||zdz}d}tj|rN t |d}n#ttf$rYdSwxYw|S) z /opt/alt/php.z/name_modifierr) replaceospathisfileopenreadlinestripOSErrorIOError)version BASE_ALT_DIRvername_modifier_file name_modifiers r#get_name_modifierrH~s!L //#r " "C%+.>>M w~~())  !3S99BBDDJJLLMM!   22  s4A88B  B c&|dkrdS|dkrdSdS)N-disabledeenabledr!letters r#letter_to_statusrPs% }}z 3y r"textc 0 |tkrd}d}nd}d}gd g}|gi}|D]< t d}ddg|dzz} d g} | t t fd t |t d } | d kr1ddg|d zz}| | |d kr%||t| zd| vr | d ||<||| d t| d| d>|dkrtj |S|d krd|SdS)NPHPConfigurationdefaultPHPversionavailable_versionsdefault_version)rLdsrr6r'rc4d|r|pdS)NrrJr!)ialtstatess r#z format_summary..sc!fQi.EF1I-M#r"r8rQrW)rCstatusrGjsonr() r r2joinextendlistrrangerHappendtuplerPr`dumps) datar api_versionavailable_versions_keydefault_version_key text_lines json_dict row_lengthr/row_datarGr[r\s @@r#format_summaryrpse!31!5/ __FJI  Q[[ hhva011F8S"N"N"N"N"NQVWaQbQbccddeee)#a&11 B  ((D6Z!^455C OOM * * * V     cE(OO3 4 4 4 (??-5a[I) *()00#A;*8A;77!.      z)$$$ 6  yy$$$  r"cFt|||}t|dS)z% Prints alternatives summary N)rpr)rhrris r# print_summaryrrs$ $ 4 4D $KKKKKr"cT|D]$}||vs ||dkrtd|z%dS)zC Check that config has param_list and this params not None NzError: %s must be specified)r0)config param_listparams r# check_paramsrwsOHH   &-4"7"7 !>!F G G GHHr"c&|dkrdS|dkrdSdS)N~zbuild-in+rMrKr!rNs r#ext_letter_to_statusr{s# }}z 3yzr"cvtjrdnd}t|5}|}dddn #1swxYwYi}|D]:}|d}|d||d<;|D]$} ||d|d<#t $rY!wxYw|S)Nz&/etc/cl.selector.conf.d/phpextdesc.txtz/etc/cl.selector/phpextdesc.txt=rrname description)r in_cagefsr> readlinessplitr@KeyError)tmp_list descr_filef desct_contentfull_desct_dictline line_partsitems r#fill_descriptionsrs=E=O=Q=Qx99WxJ j  &Q &&&&&&&&&&&&&&&O??ZZ__ )3A)<)<)>)> 1 && "1$v,"?D      D  Os#AA A B)) B65B6cPddi}ttj|dS)Nr_ok)rr`rg) result_dicts r#print_json_status_okrs*T"K $*[ ! !"""""r"ctjtjrXt tjd5}|cdddS#1swxYwYt D](}tj d|zr|cS)dS)zV Return user (name of cpanel account) for PHP Selector without CageFS feature r9Nz/var/cpanel/users/) r;r<r=r USER_CONFr>readr@r get_user_dictexists)rusers r#get_cpanel_userrs w~~h())$ ($c * * $a6688>>## $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $%%'' 7>>.5 6 6 KKK  4s&A77A;>A;cttjd5}||dddn #1swxYwYt jtjddS)zS Set user (name of cpanel account) for PHP Selector without CageFS feature wNi)r>rrr+r;chmod)rrs r#set_cpanel_userrs h # & &!  HX '''''s=AAFcttjsdSd}tj|r|}nt }t|}|dtt||dtt|tj dddd kr%td tjd dSdS) Nz&/etc/sysctl.d/cloudlinux-linksafe.conf) config_filezfs.protected_symlinks_createzfs.protected_hardlinks_createzsysctl --system &>/dev/nullT /bin/bashshell executablerz&Error while executing: sysctl --systemr)rrLVEr;r<r=rrsetstrint subprocesscallrr)r,)enablenew_confconf sysctl_cfgs r#switch_linksafers %gk 2 27H w~~h#"---JNN13s6{{3C3CDDDNN2CF 4D4DEEE4D[YYY]^^^ 6777  _^r"Tc|td}||}tr|dz}n|dz}dtjzdz}t |d5}|dz|v}dddn #1swxYwY|rF|sCt |d 5}|d|zdzdddn #1swxYwYn"|r t j||| |dS) a[ Add path to PATH variable in ~/.bashrc :param user: name of user :type user: string :param homedir: path to home directory :type homedir: string :param obj: instance of ClUserSelect class :type obj: instance of ClUserSelect class :param add: add path to .bashrc when True, remove otherwise :type obj: bool Nphpz /.profilez/.bashrcz PATH=$HOME/z:$HOME/.cl.selector:$PATHr9r(a) r _change_uidr SELECTOR2_DIRr>r+clcommonutilsdelete_line_from_file _restore_uid) rhomedirobjaddcur_userbashrcrrfounds r#modify_search_path_in_bashrcrs {5!!t$$H{{&;&:% <5 58S SD fc  !at q !!!!!!!!!!!!!!! ? ,fc"" ,at d*+++ , , , , , , , , , , , , , , ,  ? N 0 0 > > >Xs$"A66A:=A:B==CCcHfd}|td}|dz}|tjd|zddd krtjd ||}t jd td d|d d}|D]-} |dz| zdz} |dz| zdz} tj | | .| |tj |dzd|||dS)a Restore (apply) settings for PHP Selector from backup :param user: name of user :type user: string :param homedir: path to user's home directory :type homedir: string :param uid: user's uid :type uid: int :param alt_dirs: list of alt-php directories like ['php51', 'php52'] :type alt_dirs: list :param obj: instance of ClUserSelect class :type obj: ClUserSelect object ctjtjdt dddtjddtjdddS)N /var/cagefsTz/usr/share/cagefs/etcz/usr/share/cagefs/etc.new)shutilrmtreer;r<rar)uidsr#cleanupz-restore_settings_from_backup..cleanup@s_ bgll=#c((233-@@$GGG -t444 1488888r"Nrz /.cl.selector0/usr/sbin/cagefsctl --silent --force-update-etc Trrrrrretczcl.php.dz/alt-z /alt_php.iniz/alt_.iniz/.cagefs)r rrr)r,rr;r<rarrcopyset_version_from_backuprr) rrralt_dirsrrbase_dest_pathr base_src_pathalt_dirsrc_path dest_paths ` r#restore_settings_from_backupr1sS99999  {5!!.N GIII JTQY]juvvv     t$$HGLLC tUJWWM)) 7*W4~E"W,w6?  Hi((((%%% M'J&---X GIIIIIr"c.tjdrGtjdddtjdddtjddddStjdddtjd dddS) N/usr/bin/systemctlz!/usr/bin/systemctl disable cagefsTrrz/usr/bin/systemctl stop cagefsz/usr/bin/systemctl mask cagefsz&/sbin/service cagefs stop &> /dev/nullz/sbin/chkconfig cagefs offr;r<r=rrunr!r"r#disable_cagefs_servicer^s w~~*++Y:$S^____7tP[\\\\7tP[\\\\\\?tXcdddd34KXXXXXXr"c.tjdrGtjdddtjdddtjddddStjdddtjd dddS) Nrz /usr/bin/systemctl unmask cagefsTrrz /usr/bin/systemctl enable cagefsz/usr/bin/systemctl start cagefsz/sbin/chkconfig cagefs onz'/sbin/service cagefs start &> /dev/nullrr!r"r#enable_cagefs_servicerhs w~~*++f9R]^^^^9R]^^^^8Q\]]]]]]2$;WWWW@Ydeeeeeer"c6tjd ddl}n3#t$r&t dtjdYnwxYw|}|s#t dtjd|r|d}t|nzt}|s2t dt dtjdtj tj st|ttj|}|j}|D]%}d |zd z}|d z|zd z}t%||&t'd } t)|||j|| | |t/||| t1t3jdt7|jzdzt7|jzdzdddS)z+ Setup PHP Selector without CageFS /usr/share/cagefsrNError: CageFS is not installedralt-php not foundzVError: failed to detect cpanel account. Please specify name of an account as argument:z'selectorctl --setup-without-cagefs USER /opt/alt//link/conf/alt_php.iniz/.cl.selector/alt_rr/usr/sbin/lvectl destroy % &>/dev/null; /usr/sbin/lvectl apply &>/dev/nullTrr)r)r<re cagefslib ImportErrorrr, get_alt_dirsrrr;rrrrpwdgetpwnampw_dirrr rpw_uidcreate_selector_symlinksrrrrr) argsrrrpwrralt_path user_pathrs r#setup_without_cagefsrrsHHOO'(((  .///  %%''H  !"""   "Aw    j k k k ; < < < HQKKKw~~h011 " D ! ! ! d  BiG**(+CC22Wt}|s#t d t jdt!j|}|j}t'd }t)|||dtjtjt+jd|zddt/t+jdt1|jzdzt1|jzdzdddS)z: Revert to default PHP Selector setup with CageFS z>(, - - LMMM  HOO'(((  .///  %%''H  !"""  4      (+CC 7>>( # # Ih      D  ,---  d  BiG u  C w????Ih !!!NELTXepqqqqN# bi..  1 2 bi..     s-A22-B"!B"ctjd ddl}ddl}n3#t $r&t dtjdYnwxYw|r| |dSdS)z Apply "global" php.ini settings to all alt-php versions :param args: list of command line parameters (names of php.ini options) :type args: list rrNrr)options) r)r<rercagefsreconfigurerrr,get_alt_versionsreplace_alt_settings)rrrs r#apply_global_php_inirs HOO'(((      .///  !!##=..t.<<<<<==s*-AActtrst}tjD]!\}}|d|d|d"t j|d|d|zddSdS)Nz 'z' is required for ''WARN,r_r-)r2r rcitemsrer print_diagra) print_format print_message modules_list module_name dep_modules r#"_check_depencies_and_print_messagers pvv ':'@'B'B Z Z #K     ZZZ X Y Y Y Y>FF Vu__F &==   fc!f- . . . .   c!fRJ^_eJfJfgg h h h))44II f}}")CC  r"cvd}d} ttdg}|dkrgS|dddS#t$r[}|t |vrt dn |t |vrt d t |Yd}~dSd}~wwxYw) z Return list of users that are in CageFS If CageFS is not installed or initialized throws exception and prints it :return: zNo such file or directoryzCageFS is not initializedz--list-enabledr8r(rNzERROR: CageFS not installed.zWError: CageFS is not initialized. Use "/usr/sbin/cagefsctl --init" to initialize CageFS)rCAGEFSCTL_COMMANDr@rrrr0)not_installed_msgnot_initialized_msgusersrLs r#get_cagefs_usersr s45  .0@ABBHHJJ B;;I{{4  $$    A & & !? @ @ @ @ CFF * * i    Q s/AA B8AB33B8cd|D}|t|zstdd|vrGd|vrEtjt jj}|d|fdSdSdS)z Verifies if the provided options are supported in CageFS and appends the current user option if user-related options are absent ch|]\}}|Sr!r!).0opt_s r# z+verify_options_in_cagefs..(s///VS!S///r"z.Error: This command is not supported in CageFS--user-uN)rr0rgetpwuidr;geteuidpw_namere)rsupported_options input_optionscurrent_user_names r#verify_options_in_cagefsr&#s 0/w///M 3011 1OMNNN}$$])B)BL66>"3455555%$)B)Br"c|sdS t||\}}t||S#ttf$rYdSwxYw)zl Resolve domain to docroot and create a Website object. Returns None if domain is not provided. N)domaindocroot)rrrr)rr(rdoc_roots r#_get_website_from_domainr+2sd t:4HH 8fh7777 1 2tts #*??c 1i}d|d<d|d<d|d<d|d<d|d<d|d <d|d <d |d <t|d <d|d<i}g}t tjtjdddgd\}}n7#tj$r%t tjdYnwxYwgd}tj rt|||D]\}}|dvr#t tjd-|dvrL| dD]5} | t|&#t$rY2wxYw}|dvrd|d<|dvr$t|tjd|dvr#t!tjd|dvr$t#|tjd|dvrd|d< |dvrd|d <|d!vrd|d"<|d#vrd|d$<*|d%vrd|d&<5|d'vrd|d<@|d(vr||d<K|d)vr||d<V|d*vr||d+<t%} t'jr| |} | d} t-} t/| dkrf| |} t1jdkr9| | D]#} t7| $nL| D]1} | | vr+| | | | z } 2d| |d+<#t$j$rN}tj tC|d,ztjdYd}~d}~wwxYw|d-vr||d<|d.vr||d/<|d0vr||d1<|d2vr||d3<|d4vr||d5<|d6vrd|d7<%|d8vrd|d9<0|d:vr||d;<;|dvr||d?<Q|d@vr||dA<\|dBvr||dC<g|dDvr||dE<r|dFvrd|dG<}|dHvrd|d<|dIvrd|d<|dJvrd|dK<|dLvr||dM<|dNvr||dO<|dPvr||dQ<|dRvr||dS<|dTvrdU|d <|dVvrd|d <|dWvrd|dX<|dYvrd|dZ<|d[vrd\|d <|d]vrd^|d < |d_vrt||d <$|d`vrda|d </|dbvrd|dc<:|ddvrd|de<E|dfvrd+|vrtEdgtG} | stEdht%} t-} | D]1} | | vr+| | | | z } 2d| |d+<t/|dkrwt/|dkrT|drL tIt'|d%dn #tL$rYnwxYwtEdidj d1|vr$d&|vr t''d|vr|d d\kr>t'|d(D]}tIdk|zdSdlgdm}t'|d(D]3}|dn |d|d|dodp4tItSj*|dSd |vrMt'|d+|d}tY||d |d dSd$|vr@tIdkt'|d-|dzdSd/|vrLt'|d.|d/|d d\krt_dSdSd3|vrld+|vr|d+rtaj1dqt'|d2|d3|d d\krt_dSdSd5|vrld+|vr|d+rtaj1drt'|d3|d5|d d\krt_dSdSd7|vrti|dstk|d|d|d }|d d kr|D]}tIdt|zdS|d d\kr#tItSj*|dSdSd;|vrvti|dstm|d7|dt-tqdu|d; ddSd=|vrti|dstm|d9|dt-tqdv|d= dt/ttrtw|d dwdSdSd?|vrti|dstm|d<|dt-tqdx|d? dt/ttrtw|d dydS|d d\krt_dSdSd"|vrWti|dzt7|d|+|d+|d}tY|dSd&|vr_ti|dztIdkt7|d|-|d+|d|dzdSd|vr:ti|d{t7|d|=dSd1|vrti|dz t''n1#t`j>$r|d1d|krtdYnwxYw| | d} t7|d|}|.| |d1|d|d|d}|?| | |drtY|dSdSd9|vrti|dzt|d+|d}|drpt|d|B|d+|d|}D]5}d~}|dd}n |ddurd}tI|d|d6dSt|d|C|d+|d|}D]}tI|ddSdA|vrti|dt'jD|d+ d} | D]} t|d|}t| |d}|E| |dt-tqd|dA dd||?| dSdC|vrti|dt'jD|d+ d} | D]} t|d|}t| |d}|F| |dt-tqd|dC d|}|?| dSdE|vrti|dt'jD| | d} t|d|}t| |d}|<| |dt-tqd|dE d|}|?| | dSdG|vrti|dt'jD| | d} t|d|}t| |d}|G| |d|}}|?| | tId|dSdK|vrcti|dst7|d|H|d} tId| dSdM|vrHti|dst7|d|I|dM|ddSdO|vrti|dt'jD| | d} t|d|}|K| |d|dO|d d|d |?| | |d d\krtjM|d idSdSdQ|vrti|dt'jD| | d} t|d|}|K| |d|dQ|d d|d |?| | |d d\krtjM|d idSdSdS|vrti|dt'jD| | d} t|d|}|N| |d|dS|d |d |?| | |d d\krtjM|d idSdSdc|vrd} d}d+|vr|d+ d} |dr|d d}t|d|}|O| ||?| |d d\krtjM|d idSdSdX|vrati|dztjM|d t|d|P|d+|ddSdZ|vrcti|dztjM|d t|d|P|d+|dddSde|vrt%} | QRD]} t7S| t7T| tU| g#t`jV$rYxt`jW$r=}|d s+tjX|d djtC|dYd}~d}~wwxYwdSdS#t`j>$rV}tjX|d dtC||jY|jZdtjdYd}~dSd}~wt$rV}tjX|d djtC||jY|jZdtjdYd}~dSd}~wttf$rtEdYdSt$r<}tj`}tjX|d dj|dYd}~dSd}~wwxYw)Nrr rCFzshow-all print-summaryshow-native-versionplaindecoderquietrQrz api-versionr(rz6hi:lSsCcB:Y:N:E:D:R:v:Gu:b:ge:d:r:atpVLT:k:m:x:QqPjwWz)/helpzsetup-without-cagefszrevert-to-cagefsz interpreter=rcsummaryz user-summarycurrentz user-currentz set-current=zenable-alternative=zdisable-alternative=zenable-extensions=zdisable-extensions=zreplace-extensions=zversion=list-extensionszuser=zdomain=zset-user-current=list-user-extensionszenable-user-extensions=zdisable-user-extensions=zreplace-user-extensions=allreset-user-extensionsr-r. list-userszchange-to-version=z add-options=zreplace-options=zdelete-options=base64apply-symlinks-rulesr1 print-optionsprint-options-safer`csvperlz api-version= reset-options update-backupzapply-global-php-inizexclude-pid-list=z for-all-users)-l--list-s--user-summary-c--user-current-b--set-user-current-e--enable-user-extensions-d--disable-user-extensions-r--replace-user-extensions-t--reset-user-extensions-g--list-user-extensions-k --add-options-m--replace-options-x--delete-options-P--print-options--print-options-safe-z--reset-options)z-hz--helpr)z--exclude-pid-listr)z--apply-symlinks-rulesTr;)z--setup-without-cagefs)z--revert-to-cagefs)z--apply-global-php-ini)rBrCzlist-alternatives)z-Sz --summaryz show-summary)rDrEzshow-user-summary)z-Cz --currentz show-current)rFrGzshow-user-current)z-az--all)z-vz --version)rL--domain)rrrr()r_)z-Bz --set-currentz set-current)rHrIzset-user-current)z-Yz--enable-alternativezenable-alternative)z-Nz--disable-alternativezdisable-alternative)z-Gz--list-extensionsr5)rRrSr6)z-Ez--enable-extensionszenable-extensions)z-Dz--disable-extensionszdisable-extensions)z-Rz--replace-extensionszreplace-extensions)rJrKzenable-user-extensions)rLrMzdisable-user-extensions)rNrOzreplace-user-extensions)rPrQr8)z-pz--print-summary)z-Vz--show-native-version)z-Lz --list-usersr9)z-Tz--change-to-versionzchange-to-version)rTrUz add-options)rVrWzreplace-options)rXrYzdelete-options)z-Qz--base64r:)z-qz--quiet)rZr[r<)r\r=)z-jz--jsonr`)z-wz--csvr>)z --api-version)z-Wz--perlr?)r]r^r@)z--update-backuprA)z--for-all-usersz--for-all-users and --user options are mutually exclusive options and cannot be used simultaneously. Use --for-all-user OR --user instead.z=No changes were made: there are no users with cagefs enabled zWrong set of optionsERRORz%s %s %sr)r_rhrhr^)shortfullr<zsThe 'enable-alternative' option is used to enable configurations globally. The 'user' option can't be used with it.zuThe 'disable-alternative' option is used to disable configurations globally. The 'user' option can't be used with it.)r rCz%s %sc*|Srr@rZs r#r]zmain..}qwwyyr"c*|Srrdres r#r]zmain..rfr"zModules left by dependencies:c*|Srrdres r#r]zmain..rfr"z#Modules left/added by dependencies:)r r)r native)websiterJryrzr6)r rCrc*|Srrdres r#r]zmain..sr")rrCr  check_extrjc*|Srrdres r#r]zmain..s r"c*|Srrdres r#r]zmain..sQWWYYr")escaperWARNING)r_r-detailscontextz(Incomplete or incorrect set of arguments)ar r4getoptr)r3 GetoptErrorr$r,rrr&rrer ValueErrorrrrrrwork_without_cagefsget_uidrcr2r;r! get_namesr cagefs_copy_etcraNoSuchUserExceptionr*r+rr0rrget_native_version TypeErrorcheck_requirementslist_alternativesr`rg get_summaryrr get_version set_versionrrVersionModificationBlockedenable_versiondisable_versionrwr r enable_extensionsrdisable_extensionsr rreplace_extensionsapply_symlinks_rulesNativeNotInstalledclean_crui_imagesr+r list_all_extensionslist_enabled_extensions%check_multiphp_system_default_versionbulk_enable_extensionsbulk_disable_extensionsreset_extensions list_userschange_to_versionr insert_optionsr print_datadelete_options reset_options get_optionsrkeys_check_user_in_cagefs_backup_settingsbackup_php_options NotCageFSUserUnableToSaveDatarrqrrrrUnboundLocalError Exception traceback format_exc)rtactionsexclude_pid_listoptsropts_supported_in_cagefsorpidclpwdrr user_listrrLr[alternatives_dictrhr rcrjrrrrCmsgs r#mainrBs F!F=F9F:#F?$)F !F9F7OF8!F=F8G8] HQRRL D0 0 0 4 4 ddj        @A '?@@@H1H11  GGG HQKKKK ( ( (wws||  $++CHH5555!H  , , ,.2G* + + , , ,  & & & HQKKKK ( ( (     HQKKKK - - -  & & & HQKKKK " " "+/G' ( ( % % %&*GN # # * * *+/G' ( ( % % %&*GN # # * * *+/G' ( ( / ! !!%F:   % % % !F9   $ $ $ F8   " " "F6NGGE+-- mmA&&  FF   5zzQ#mmA..:<<1,,(-(<(<EE , > >t D D D D$)RRD#944 )U__U]]4=P=P-Q-Q Q ),))<)<v0   J$$SVVd]333HQKKKKKKKK ,   F8   ) ) )%&GM " " . . .*+G& ' ' 0 0 0,-G( ) ) 1 1 1-.G) * * - - -)-G% & & 2 2 2.2G* + + / / /+,G' ( ( 0 0 0,-G( ) ) 0 0 0,-G( ) ) 4 4 401G, - - 5 5 512G- . . 5 5 512G- . . 3 3 3/3G+ , , + + +&*F? # # 1 1 1,0F( ) ) ( ( ($(GL ! ! / / /+,G' ( ( ) ) )%&GM " " - - -)*G% & & , , ,()G$ % % $ $ $ (F9   # # #"F7OO + + +'+GO $ $ * * *,0G( ) ) " " "%F8   / ! !$F8   # # #$'FFF= ! ! " " "%F8   + + +'+GO $ $ % % %'+GO $ $ % % %$> %&&E f$%deeeGGEI F Fy((t1D1D!E!EEI XXi00F6N 7||q w<<1  (=!>  hvm455HHJJ1MNNNN     !!7 A A AYR W , ,1DG1S1S JJ ) ) + + + ' ) )h6))#F=$9::LLNN00C,#.////0004R$@$@!#F=$9::LLNNhhC%f-44s1vsSTv_bcd_e5f5fggggdj!23344444 w & &F=122>>vF[?\]]D $x 0&2G H H H H H w & & ,&*?!@!@!L!LVTiMj!k!kk l l l l l g % % VM* + + 7 7 8N O O Oh6))$&&&&&*) !W , ,F6N$?@  .//>>wG[?\]]](#v--(*****.- "g - -F6N$?@  .//??H]@^___(#v--(*****.- ' ) ) !; < < <%f]&;VI=NPVW_P`aaHh6))$**D'D.))))**!V++dj**+++++,+ G + + !; < < < }- . . @ @y!4-@-@7K^C_CeCefiCjCj(k(k#l#l     "W , , !; < < < }- . . A Ay!4-@-@7K_C`CfCfgjCkCk(l(l#m#m   &'' f26(3CEdeeeee f f"W , , !; < < < }- . . A Ay!4-@-@7K_C`CfCfgjCkCk(l(l#m#m   &'' '26(3CEjkkkkk!V++$&&&&&,+ G + + !8 9 9 9} 57GHHTTv'< =D $      G + + !8 9 9 9 vm46FGGSS6NF8$4f=R6S      $w . . !1 2 2 2  .0@ A A V V X X X X X 7 * * !8 9 9 9  --////!4   -.(::Q ??3''*DVM24DEEA==*+x ',- D    4 4 5 5 5o& $d##### $ $ #w . . !8 9 9 9.vf~vh?OPPGj! "*6-+@BRSSgg6NF9$5wh66C!F1v~!$Q4!$VVVSVV4555566+6-+@BRSSkk6NF9$5wl""C#a&MMMM""& 0 0 !C D D D  : < < <6N((--E  #F=$9;KLL249IJJ(("9-!#':':WE]=^=d=deh=i=i"j"jkk"# )    & & & & & &' 1 1 !C D D D  : < < <6N((--E  #F=$9;KLL249IJJ))9%11GN6OQWXaQbdjkrds t t t   4 4 5 5 5h6))"6(#3R88888*)  ' 'DGf~++C00i  7 +11#66} 57GHHA OOD' * * *   % % %h6))"6(#3R88888*)  ' ' !8 9 9 9  x } 57GHHTTU[\bUcekluevww     "W , , !8 9 9 9  x } 57GHHTTU[\bUcekluevww        ' 'GGE++--2244    NN88>>> NN33D999#%%88>>>>%3D%6!'?e*6(+;\_`a\b\b=c=cdddDDDD( '    , 8 s1vvRSR[hihqrr      8 SVVPQPYfgfopp     ' (IIIGHHHHHH RRR"$$6(+C-P-PQQQQQQQQQRs  -A;;1B/.B/$"E EECMN;-AN66N;/:X** X76X7 A4A_ BA_ AA_ AA_ A A_ )A,A_ A,A_ AA_ %-A_ A8A_ B"A_ 6B"A_ A_ 8AA_ A!A_ 6rs&%%%%%&&&&&&  99999999&&&&&&,,,,,,,,,,,,""""""$$$$$$$$""""""555555;;;;;;;;HHHHHHHHHHEEEEEEEEAAAAAAAA  *3c3c3cl    ggg   !'E$%$%$%$%N &5HHH    ###   (((     D****ZYYYfff222j...b===$ppp4444 &   0 6 6 6    ZRZRZRz zDFFFFFr"