jgXddlmZddlmZddlmZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddlmZddlmZddlmZmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddl m!Z!ddl"m#Z#m$Z$ddl%m&Z&m'Z'm(Z(ddl)m*Z*m+Z+ddl,m-Z-m.Z.dZ/dZ0dZ1dZ2d4dZ3dZ4dZ5dZ6de/fdZ7de/fdZ8dZ9dZ:dZ;d Zd5d$Z?d6d&Z@d4d'ZAd(ZBd)ZCd*ZDd+ZEd,ZFd-ZGd7d.ZHd/ZId0ZJd1ZKd2ZLeMd3kr eLdSdS)8)print_function)absolute_import)divisionN)map)ClSelect) ClExtSelectdepend_modules_dict) ClUserSelect)ClUserExtSelect)ClUserOptSelect)clprint)ClPwd)Feature)is_panel_feature_supported) SysCtlConfSYSCTL_CL_CONF_FILE) is_ubuntu run_commandExternalProgramFailed) in_cagefs make_symlink)ClSelectExceptBaseClSelectExceptionz/usr/sbin/cagefsctlctdtdtdtdtdtdtdtdtd td td td td tdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtdtd td!td"td#td$td%td&td'td(td)ttd*td+td,td-td.td/td0td1td2dS)3Nz? -v | --version : Specify alternative versionz, -u | --user : UsernamezE -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"2s KLLL 8999 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_exitr.gsN 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'argvr.rr r!check_args_presencer2ss@  38}} 4 5 5 5 5 5r c$d}|dd}||zdz}d}tj|rN t |d}n#ttf$rYdSwxYw|S)z z /opt/alt/php.z/name_modifierr) replaceospathisfileopenreadlinestripOSErrorIOError)version BASE_ALT_DIRvername_modifier_file name_modifiers r!get_name_modifierrE~s"L //#b ! !C%+.>>M w~~())  !3C88AACCIIKKMM!   22  s4A88B  B c&|dkrdS|dkrdSdS)N-disabledeenabledrletters r!letter_to_statusrMs% }}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)rIdsr r%rc4d|r|pdS)NrrGr)ialtstatess r!z format_summary..sQ0vay8Sr r5rNrT)r@statusrDjsonr&) rr0joinextendlistrrangerEappendtuplerMr^dumps) datar api_versionavailable_versions_keydefault_version_key text_lines json_dict row_lengthr-row_datarDrYrZs @@r!format_summaryrnse!31!5/ __FJ "BI  Q[[ hhvA.//F8S 9 9 9 9 9 *     ! ! !*#a&11 B  ((D6Z\233C OOM * * * V     cE(OO3 4 4 4 (??-5a[I) *()00{&x{33*2 2     z)$$$ 6  yy$$$  r cFt|||}t|dS)z% Prints alternatives summary N)rnr)rfrrgs r! print_summaryrps$ $ 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)r.)config param_listparams r! check_paramsrusOHH   &-4"7"7 !>!F G G GHHr c&|dkrdS|dkrdSdS)N~zbuild-in+rJrHrrKs r!ext_letter_to_statusrys# }}z 3yzr cltrdnd}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)rr; readlinessplitr=KeyError)tmp_list descr_filef desct_contentfull_desct_dictline line_partsitems r!fill_descriptionsrs=F[[o99NoJ j  &Q &&&&&&&&&&&&&&&O??ZZ__ )3A)<)<)>)> 1 && "1$v,"?D      D  Os#AA AB$$ B10B1cPddi}ttj|dS)Nr]ok)rr^re) 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 r6Nz/var/cpanel/users/) r8r9r:r USER_CONFr;readr=r get_user_dictexists)rusers r!get_cpanel_userrs w~~h())$ ($c * * $a6688>>## $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $%%'' 7>>.t3 4 4 KKK  4s&A77A;>A;cttjd5}||dddn #1swxYwYt jtjddS)zS Set user (name of cpanel account) for PHP Selector without CageFS feature wNi)r;rrr)r8chmod)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)rrLVEr8r9r: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:$PATHr6r&a) r _change_uidr SELECTOR2_DIRr;r)clcommonutilsdelete_line_from_file _restore_uid) rhomedirobjaddcur_userbashrcrrfounds r!modify_search_path_in_bashrcrs {5!!t$$H{{&;&:% 3 34O OD fc  aT Q ? (fc"" (aT $''' ( ( ( ( ( ( ( ( ( ( ( ( ( ( (  ? 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)shutilrmtreer8r9r_r)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*rr8r9r_rrcopyset_version_from_backuprr) rrralt_dirsrrbase_dest_pathr base_src_pathalt_dirsrc_path dest_paths ` r!restore_settings_from_backupr1sT99999  {5!!.N GIIIIDP [:::=>??  t$$HGLLC tUJWWM)) 7*W4~E"W,w6?  Hi((((%%% M'*$d+++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 offr8r9r:rrunrr 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/nullrrr r!enable_cagefs_serviceres 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'r9rc cagefslib ImportErrorrr* get_alt_dirsrrr8rrrrpwdgetpwnampw_dirrr rpw_uidcreate_selector_symlinksrrrrr) argsrrrpwrralt_path user_pathrs r!setup_without_cagefsrosBHOO'(((  .///  %%''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.RY?Biiry>>"$23:>;XXXXXXs-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'r9rcrcagefsreconfigurerrr*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+)r0r raitemsrcr print_diagr_) print_format print_message modules_list module_name dep_modules r!"_check_depencies_and_print_messagers ^vv ':'@'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-enabledr5r&rNzERROR: CageFS not installed.zWError: CageFS is not initialized. Use "/usr/sbin/cagefsctl --init" to initialize CageFS)rCAGEFSCTL_COMMANDr=rrrr.)not_installed_msgnot_initialized_msgusersrIs r!get_cagefs_usersrs45  .0@ABBHHJJ B;;I{{4  $$    A & & !? @ @ @ @ CFF * * "Y Z Z ZQ  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|]\}}|Srr).0opt_s r! z+verify_options_in_cagefs..s///VS!S///r z.Error: This command is not supported in CageFS--user-uN)rr.rgetpwuidr8geteuidpw_namerc)rsupported_options input_optionscurrent_user_names r!verify_options_in_cagefsr#s 0/w///M 3011 1OMNNN}$$])B)BL66>"3455555%$)B)Br c 0i}d|d<d|d<d|d<d|d<d|d<d|d <d|d <d |d <t|d <i}g}t tjtjdddgd\}}n7#tj$r%t tjdYnwxYwgd}trt|||D]\}}|dvr#t tjd-|dvrL| dD]5} | t|&#t$rY2wxYw}|dvrd|d<|dvr$t|tjd|dvr#ttjd|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)<t#} t%jr| |} | d} t+} t-| dkrf| |} t/jdkr9| | D]#} t5| $nL| D]1} | | vr+| | | | z } 2d| |d)<x#t"j$rN}tjtA|d*ztjdYd}~d}~wwxYw|d+vr||d,<|d-vr||d.<|d/vr||d0<|d1vr||d2<|d3vrd|d4<|d5vrd|d6<|d7vr||d8<%|d9vr||d:<0|d;vr||d<<;|d=vr||d><F|d?vr||d@<Q|dAvr||dB<\|dCvrd|dD<g|dEvrd|d<r|dFvrd|d<}|dGvrd|dH<|dIvr||dJ<|dKvr||dL<|dMvr||dN<|dOvr||dP<|dQvrdR|d <|dSvrd|d <|dTvrd|dU<|dVvrd|dW<|dXvrdY|d <|dZvrd[|d <|d\vrt||d <|d]vrd^|d <|d_vrd|d`<$|davrd|db</|dcvrd)|vrtCddtE} | stCdet#} t+} | D]1} | | vr+| | | | z } 2d| |d)<t-|dkrwt-|dkrT|drL tGt%|d$dn #tJ$rYnwxYwtCdfdg d.|vr$d%|vr t%&d|vr|d dYkr>t%|d'D]}tGdh|zdSdigdj}t%|d'D]3}|dk |d|d|dldm4tGtQj)|dSd|vrMt%|d*|d}tW||d |d dSd#|vr@tGdht%|d,|dzdSd,|vrLt%|d-|d,|d dYkrt]dSdSd0|vrLt%|d/|d0|d dYkrt]dSdSd2|vrLt%|d0|d2|d dYkrt]dSdSd4|vrtc|dnte|d|d|d }|d d kr|D]}tGdo|zdS|d dYkr#tGtQj)|dSdSd8|vrvtc|dntg|d4|dt+tkdp|d8 ddSd:|vrtc|dntg|d6|dt+tkdq|d: dt-tnrtq|d drdSdSd<|vrtc|dntg|d9|dt+tkds|d< dt-tnrtq|d dtdS|d dYkrt]dSdSd!|vrWtc|dut5|d|*|d)|d}tW|dSd%|vrXtc|dutGdht5|d|,|d)|dzdSd|vr:tc|dvt5|d|:dSd.|vrtc|du t%&n1#tvj<$r|d.dwkrtdYnwxYw| | d} t5|d|}|-| |d.|d|d}|=| | |drtW|dSdSd6|vrtc|du|drnt}|d|?|d)|dD]5}dx}|ddy}n |ddurdz}tG|d{|d6dSt}|d|@|d)|dD]}tG|ddSd>|vrtc|d|t%jA|d) d} | D]l} t}|d|}|B| |dt+tkd}|d> dd~m|=| dSd@|vrtc|d|t%jA|d) d} | D]j} t}|d|}|C| |dt+tkd|d@ dk|=| dSdB|vrtc|d|t%jA| | d} t}|d|}|9| |dt+tkd|dB d|=| | dSdD|vrtc|d|t%jA| | d} t}|d|}|D| |d}|=| | tGd|dSdH|vrctc|dnt5|d|E|d} tGd| dSdJ|vrHtc|dnt5|d|F|dJ|ddSdL|vrtc|d|t%jA| | d} t|d|}|H| |d|dL|d d|d |=| | |d dYkrtjJ|d idSdSdN|vrtc|d|t%jA| | d} t|d|}|H| |d|dN|d d|d |=| | |d dYkrtjJ|d idSdSdP|vrtc|d|t%jA| | d} t|d|}|K| |d|dP|d |d |=| | |d dYkrtjJ|d idSdSd`|vrd} d}d)|vr|d) d} |dr|d d}t|d|}|L| ||=| |d dYkrtjJ|d idSdSdU|vratc|dutjJ|d t|d|M|d)|ddSdW|vrctc|dutjJ|d t|d|M|d)|dddSdb|vrt#} | NOD]} t5P| t5Q| tR| g#tvjS$rYxtvjT$r=}|d s+tjU|d dgtA|dYd}~d}~wwxYwdSdS#tvj<$rV}tjU|d dtA||jV|jWdtjdYd}~dSd}~wt$rV}tjU|d dgtA||jV|jWdtjdYd}~dSd}~wttf$rtCdYdSt$r<}tj]}tjU|d dg|dYd}~dSd}~wwxYw)Nrrr@Fzshow-all print-summaryshow-native-versionplaindecoderquietrNrz api-versionrz6hi:lSsCcB:Y:N:E:D:R:v:Gu:b:ge:d:r:atpVLT:k:m:x:QqPjwWz).helpzsetup-without-cagefszrevert-to-cagefsz interpreter=rasummaryz user-summarycurrentz user-currentz set-current=zenable-alternative=zdisable-alternative=zenable-extensions=zdisable-extensions=zreplace-extensions=zversion=list-extensionszuser=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-rulesr) 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-rulesTr3)z--setup-without-cagefs)z--revert-to-cagefs)z--apply-global-php-ini)r:r;zlist-alternatives)z-Sz --summaryz show-summary)r<r=zshow-user-summary)z-Cz --currentz show-current)r>r?zshow-user-current)z-az--all)z-vz --version)rrrr&)z-Bz --set-currentz set-current)r@rAzset-user-current)z-Yz--enable-alternativezenable-alternative)z-Nz--disable-alternativezdisable-alternative)z-Gz--list-extensionsr-)rJrKr.)z-Ez--enable-extensionszenable-extensions)z-Dz--disable-extensionszdisable-extensions)z-Rz--replace-extensionszreplace-extensions)rBrCzenable-user-extensions)rDrEzdisable-user-extensions)rFrGzreplace-user-extensions)rHrIr0)z-pz--print-summary)z-Vz--show-native-version)z-Lz --list-usersr1)z-Tz--change-to-versionzchange-to-version)rLrMz add-options)rNrOzreplace-options)rPrQzdelete-options)z-Qz--base64r2)z-qz--quiet)rRrSr4)rTr5)z-jz--jsonr^)z-wz--csvr6)z --api-version)z-Wz--perlr7)rUrVr8)z--update-backupr9)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]rfrfr\)shortfullr9)rr@z%s %sc*|Srr=rXs r!r[zmain..<AGGIIr c*|Srr[r\s r!r[zmain..Ar]r zModules left by dependencies:c*|Srr[r\s r!r[zmain..Ir]r z#Modules left/added by dependencies:)rr)rnativerGrwrxrV)rr@rc*|Srr[r\s r!r[zmain..sr )rr@r check_extc*|Srr[r\s r!r[zmain..s r c*|Srr[r\s r!r[zmain..r]r )escaperWARNING)r]r+detailscontextz(Incomplete or incorrect set of arguments)^rr2getoptr'r1 GetoptErrorr"r*rr#rrcr ValueErrorrrrrrwork_without_cagefsget_uidrar0r8r get_namesr cagefs_copy_etcr_NoSuchUserExceptionr(r)rr.rrget_native_version TypeErrorcheck_requirementslist_alternativesr^re get_summaryrp get_version set_versionrenable_versiondisable_versionrurr enable_extensionsrdisable_extensionsr rreplace_extensionsapply_symlinks_rulesrNativeNotInstalledclean_crui_imagesr 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 NotCageFSUserUnableToSaveDatarrgrhrrUnboundLocalError Exception traceback format_exc)rractionsexclude_pid_listoptsropts_supported_in_cagefsorpidclpwdrr user_listrrIrYalternatives_dictrfrrcr rr r@msgs r!mainr!s F!F=F9F:#F?$)F !F9F7OF8!F=G5] HQRRL D. . . 11 ddd        ${{A '?@@@B1B11  GGG HQKKKK ( ( (wws||  $++CHH5555!H  , , ,.2G* + + , , ,  & & & HQKKKK ( ( (     HQKKKK - - -  & & & HQKKKK " " "+/G' ( ( % % %&*GN # # * * *+/G' ( ( % % %&*GN # # * * *+/G' ( ( / ! !!%F:   % % % !F9   " " "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[111HQKKKKKKKK ) ) )%&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 $ $ % % %$&OPPP%&&E f$%deeeGGEI F Fy((t1D1D!E!EEI XXi00F6N 7||q w<<1  (=!>  hvm455HHJJ1MNNNN     !!7 A A A]1 W , ,#722 JJ ) ) + + + ' ) )h6))#F=$9::LLNN00C,#.////0004R$@$@!#F=$9::LLNNhhC%f-44s1vsSTv_bcd_e5f5fggggdj!23344444 w & &F=122>>,-//D $x 0&2G H H H H H w & & ,&*?!@!@!L!L,-"/"// 0 0 0 0 0 g % % VM* + + 7 7 8N O O Oh6))$&&&&&*) !W , , VM* + + : :7CW;X Y Y Yh6))$&&&&&*) "g - - VM* + + ; ;GDY>> NN33D999#%%88>>>>%3D%6!'?D*"8,'.3q66BBDDDDDDD ( '    ,6(+1vvyy . .     6(+1vvyy . .     ' (IIIGHHHHHH 111"$$ 8 3 / / 1 1 1 1 1 1 1 1 11s-A661B*)B*"D== E  E CM  N&AN!!N&:X XX+A4A[!BA[$AA[5AA[9A A[ A A[A A[)AA[-A[6A8A[0B"A[B"A[:A[AA[3AA[A[DA%A[E6A A[GCA[JCA[Mrs&%%%%%&&&&&&  99999999&&&&&&,,,,,,,,,,,,""""""""""""555555;;;;;;;;HHHHHHHHHH********AAAAAAAA  *2c2c2cj    555   !'E$%$%$%$%N &5HHH    ###   (((     D''''TYYYfff+Z+Z+Z\'X'X'XT===$^^^4444 &   . 6 6 6F1F1F1P zDFFFFFr