Hacked By AnonymousFox

Current Path : /opt/cloudlinux/venv/lib64/python3.11/site-packages/clselect/__pycache__/
Upload File :
Current File : //opt/cloudlinux/venv/lib64/python3.11/site-packages/clselect/__pycache__/clselectctlphp.cpython-311.pyc

�

m4�fz���"�ddlmZddlmZddlmZddlZddlZddlZddlZddlZddl	Z	ddl
ZddlZddl
Z
ddlmZddlmZddlmZmZdd	lmZdd
lmZddlmZddlmZdd
lmZddlmZddl m!Z!ddl"m#Z#m$Z$ddl%m&Z&m'Z'ddl(m)Z)ddl*m+Z+m,Z,ddl-m.Z.m/Z/dZ0dZ1dZ2d�Z3d5d�Z4d�Z5d�Z6d�Z7de0fd�Z8de0fd�Z9d�Z:d�Z;d �Z<d!�Z=d"�Z>d#�Z?d6d%�Z@d7d'�ZAd5d(�ZBd)�ZCd*�ZDd+�ZEd,�ZFd-�ZGd.�ZHd8d/�ZId0�ZJd1�ZKd2�ZLd3�ZMeNd4kreM��dSdS)9�)�print_function)�absolute_import)�divisionN)�map�)�ClSelect)�ClExtSelect�depend_modules_dict)�ClUserSelect)�ClUserExtSelect)�ClUserOptSelect)�clprint)�ClPwd)�Feature)�is_panel_feature_supported)�
SysCtlConf�SYSCTL_CL_CONF_FILE)�run_command�ExternalProgramFailed)�	is_ubuntu)�	in_cagefs�make_symlink)�ClSelectExcept�BaseClSelectExceptionz/usr/sbin/cagefsctlc��td��td��td��td��td��td��td��td��td	��td
��td��td��td
��td��td��td��td��td��td��td��td��td��td��td��td��td��td��td��td��td��td��td ��td!��td"��td#��td$��td%��td&��td'��td(��td)�t����td*��td+��td,��td-��td.��td/��td0��td1��td2��dS)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)�print�format�API_0���N/opt/cloudlinux/venv/lib64/python3.11/site-packages/clselect/clselectctlphp.py�usager"3s��	�
K�L�L�L�	�
8�9�9�9�	�
Q�R�R�R�	�
]�^�^�^�	�
L�M�M�M�	�
Q�R�R�R�	�
S�T�T�T�	�
^�_�_�_�	�
Q�R�R�R�	�
O�P�P�P�	�
K�L�L�L�	�
L�M�M�M�	�
p�q�q�q�	�
q�r�r�r�	�
k�l�l�l�	�
F�G�G�G�	�
d�e�e�e�	�
e�f�f�f�	�
o�p�p�p�	�
g�h�h�h�	�
w�x�x�x�	�
C�D�D�D�	�
r�s�s�s�	�
n�o�o�o�	�
Z�[�[�[�	�
s�t�t�t�	�
[�\�\�\�	�
i�j�j�j�	�
^�_�_�_�	�
e�f�f�f�	�
X�Y�Y�Y�	�
d�e�e�e�	�
s�t�t�t�	�
b�c�c�c�	�
]�^�^�^�	�
w�x�x�x�	�
B�C�C�C�	�
A�B�B�B�	�
L�M�M�M�	�
c�d�d�d�	�
>�
E�
E�e�
L�
L�M�M�M�	�
q�r�r�r�	�
B�C�C�C�	�
H�I�I�I�	�
t�u�u�u�	�
t�u�u�u�	�
Q�R�R�R�	�
e�f�f�f�	�
b�c�c�c�	�
a�b�b�b�b�br c��d}|r|�dd�d�}tj�||z��tjd��dS)z5
    Prints to stderr
    @param message: string
    z%s
�:�%s�
rN)�sys�stderr�write�exit)�message�prefix�fmts   r!�print_error_and_exitr.hsN��
�C�
�)�!�6�6�4�4�4�(���J���S�7�]�#�#�#��H�Q�K�K�K�K�Kr c�b�ttj��dkrtd��dSdS)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_presencer2ts@��
�3�8�}�}�����
4�	5�	5�	5�	5�	5��r c�$�d}|�dd��}||zdz}d}tj�|��rN	t	|d��������}n#ttf$rYdSwxYw|S)z
    z/opt/alt/php�.�z/name_modifier�r)	�replace�os�path�isfile�open�readline�strip�OSError�IOError)�version�BASE_ALT_DIR�ver�name_modifier_file�
name_modifiers     r!�get_name_modifierrEs���"�L�
�/�/�#�b�
!�
!�C�%��+�.>�>���M�	�w�~�~�(�)�)��	� �!3�C�8�8�A�A�C�C�I�I�K�K�M�M����!�	�	�	��2�2�	�����s�4A8�8B
�B
c�&�|dkrdS|dkrdSdS)N�-�disabled�e�enabledr��letters r!�letter_to_statusrM�s%��
��}�}��z�	�3����y�
�r �textc�0���|tkrd}d}nd}d}gd��g}|gi}|D�]<�t�d��}d�dg|dzz��}�d	g}	|	�t	t��fd
�t
|��������t�d	��}
|
dkr1d�dg|dzz��}|	�|
��|d
kr%|�|t|	��z��d|	vr|	d	||<||�|	d	t|	d��|
d�����>|dkrtj|��S|d
krd�|��SdS)N�PHPConfiguration�defaultPHPversion�available_versions�default_version)rI�d�sr� r%rc�4���d|r�|pdS)NrrGr)�i�alt�statess ��r!�<lambda>z format_summary.<locals>.<lambda>�s����Q����0�v�a�y�8�S�r r5�rNrT)r@�statusrD�jsonr&)
rr0�join�extend�listr�rangerE�append�tuplerMr^�dumps)
�datar�api_version�available_versions_key�default_version_key�
text_lines�	json_dict�
row_lengthr-�row_datarDrYrZs
           @@r!�format_summaryrn�s������e���!3��1���!5��/��
�_�_�F��J�"�B��I�������Q��[�[�
��h�h��v��A��.�/�/����F�8������S�
9�
9�
9�
9�
9��*����� � �	!�	!�	!�*�#�a�&�1�1�
��B����(�(�D�6�Z��\�2�3�3�C��O�O�M�*�*�*��V������c�E�(�O�O�3�4�4�4��(�?�?�-5�a�[�I�)�*��(�)�0�0���{�&�x��{�3�3�*�2
�2
�	�	�	�	�
�����z�)�$�$�$�	�6�	�	��y�y��$�$�$�
�	r c�F�t|||��}t|��dS)z%
    Prints alternatives summary
    N)rnr)rfrrgs   r!�
print_summaryrp�s$���$���4�4�D�	�$�K�K�K�K�Kr c�T�|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_list�params   r!�check_paramsru�sO���H�H������&��-�4�"7�"7� �!>��!F�G�G�G��H�Hr c�&�|dkrdS|dkrdSdS)N�~zbuild-in�+rJrHrrKs r!�ext_letter_to_statusry�s#��
��}�}��z�	�3����y��zr c�l�t��rdnd}t|��5}|���}ddd��n#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�=rr�name�description)rr;�	readlines�splitr=�KeyError)�tmp_list�
descr_file�f�
desct_content�full_desct_dict�line�
line_parts�items        r!�fill_descriptionsr��s��=F�[�[�o�9�9�No�J�	
�j�	�	�&�Q����
�
�
�&�&�&�&�&�&�&�&�&�&�&����&�&�&�&��O��?�?���Z�Z��_�_�
�)3�A��)<�)<�)>�)>��
�1�
�&�&�����	�"1�$�v�,�"?�D������	�	�	��D�	�����Os#�A�A�
A�B$�$
B1�0B1c�P�ddi}ttj|����dS)Nr]�ok)rr^re)�result_dicts r!�print_json_status_okr��s*���T�"�K�	�$�*�[�
!�
!�"�"�"�"�"r c��tj�tj��rXttjd��5}|������cddd��S#1swxYwYt���	��D](}tj�
d|z��r|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_dict�exists)r��users  r!�get_cpanel_userr��s���
�w�~�~�h�(�)�)�$�
�(�$�c�
*�
*�	$�a��6�6�8�8�>�>�#�#�	$�	$�	$�	$�	$�	$�	$�	$�	$�	$�	$�	$����	$�	$�	$�	$����%�%�'�'����
�7�>�>�.�t�3�4�4�	��K�K�K�	��4s�&A7�7A;�>A;c���ttjd��5}|�|��ddd��n#1swxYwYt	jtjd��dS)zS
    Set user (name of cpanel account) for PHP Selector without CageFS feature
    �wNi�)r;rr�r)r8�chmod)r�r�s  r!�set_cpanel_userr��s���
�h� �#�	&�	&��!�	����
�
�
��������������������H�X�
��'�'�'�'�'s�=�A�AFc���ttj��sdSd}tj�|��r|}nt}t|���}|�dtt|������|�dtt|������tjddd���d	kr%td
��tjd��dSdS)Nz&/etc/sysctl.d/cloudlinux-linksafe.conf)�config_filezfs.protected_symlinks_createzfs.protected_hardlinks_createzsysctl --system &>/dev/nullT�	/bin/bash��shell�
executablerz&Error while executing: sysctl --systemr)rr�LVEr8r9r:rr�set�str�int�
subprocess�callrr'r*)�enable�new_conf�conf�
sysctl_cfgs    r!�switch_linksafer�s���%�g�k�2�2����7�H�	�w�~�~�h���#����"����-�-�-�J��N�N�1�3�s�6�{�{�3C�3C�D�D�D��N�N�2�C��F���4D�4D�E�E�E���4�D�[�Y�Y�Y�]^�^�^�
�6�7�7�7���������_�^r Tc��|�td��}|�|��}t��r|dz}n|dz}dtjzdz}t	|d��5}|dz|v}ddd��n#1swxYwY|rF|sCt	|d	��5}|�d|zdz��ddd��n#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
    N�phpz	/.profilez/.bashrczPATH=$HOME/z:$HOME/.cl.selector:$PATHr6r&�a)
r�_change_uidr�
SELECTOR2_DIRr;r)�clcommon�utils�delete_line_from_file�_restore_uid)	r��homedir�obj�add�cur_user�bashrcr�r��founds	         r!�modify_search_path_in_bashrcr�s����{��5�!�!�����t�$�$�H��{�{�&��;�&����:�%����3�3�4O�O�D�	
�f�c�	�	��a��T�	�Q���������������������
�?��	(��f�c�"�"�
(�a�����T�	�$��'�'�'�
(�
(�
(�
(�
(�
(�
(�
(�
(�
(�
(����
(�
(�
(�
(���	?��N�0�0���>�>�>����X�����s$�"A6�6A:�=A:�B=�=C�Cc�H���fd�}|�td��}|dz}|��tjd|zdd���d	krtjd
��|�|��}tj�dt���d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
    c����tjtj�dt���dd���d��tjdd��tjdd��dS)N�/var/cagefs���Tz/usr/share/cagefs/etcz/usr/share/cagefs/etc.new)�shutil�rmtreer8r9r_r�)�uids�r!�cleanupz-restore_settings_from_backup.<locals>.cleanup@s_����
�b�g�l�l�=�#�c�(�(�2�3�3�-�@�@�$�G�G�G��
�-�t�4�4�4��
�1�4�8�8�8�8�8r Nr�z
/.cl.selector�0/usr/sbin/cagefsctl --silent --force-update-etc Tr�r�rrr�r��etczcl.php.dz/alt-z/alt_php.iniz/alt_�.iniz/.cagefs)rr�r�r'r*r�r8r9r_r�r��copy�set_version_from_backupr�r�)r�r�r��alt_dirsr�r��base_dest_pathr��
base_src_path�alt_dir�src_path�	dest_paths  `         r!�restore_settings_from_backupr�2sT���9�9�9�9�9��{��5�!�!����.�N��G�I�I�I���I�D�P� �[�:�:�:�=>�?�?����������t�$�$�H��G�L�L���C������
�t�U�J�W�W�M��)�)�� �7�*�W�4�~�E��"�W�,�w�6��?�	���H�i�(�(�(�(�����%�%�%�
�M�'�*�$�d�+�+�+����X�����G�I�I�I�I�Ir c�.�tj�d��rGtjddd���tjddd���tjddd���dStjddd���tjd	dd���dS)
N�/usr/bin/systemctlz!/usr/bin/systemctl disable cagefsTr�r�z/usr/bin/systemctl stop cagefsz/usr/bin/systemctl mask cagefsz&/sbin/service cagefs stop &> /dev/nullz/sbin/chkconfig cagefs off�r8r9r:r��runrr r!�disable_cagefs_servicer�\s���	�w�~�~�*�+�+�Y���:�$�S^�_�_�_�_���7�t�P[�\�\�\�\���7�t�P[�\�\�\�\�\�\���?�t�Xc�d�d�d�d���3�4�K�X�X�X�X�X�Xr c�.�tj�d��rGtjddd���tjddd���tjddd���dStjddd���tjd	dd���dS)
Nr�z /usr/bin/systemctl unmask cagefsTr�r�z /usr/bin/systemctl enable cagefsz/usr/bin/systemctl start cagefsz/sbin/chkconfig cagefs onz'/sbin/service cagefs start &> /dev/nullr�rr r!�enable_cagefs_servicer�fs���	�w�~�~�*�+�+�f���9��R]�^�^�^�^���9��R]�^�^�^�^���8��Q\�]�]�]�]�]�]���2�$�;�W�W�W�W���@��Yd�e�e�e�e�e�er c�6�tj�d��	ddl}n3#t$r&td��tjd��YnwxYw|���}|s#td��tjd��|r|d}t|��nzt��}|s2td��td��tjd��tj�tj
��st|��t��tj|��}|j}|D]%}d	|zd
z}|dz|zdz}t%||���&t'd
��}	t)|||j||	��|	�|��t/|||	��t1��t3jdt7|j��zdzt7|j��zdzdd���dS)z+
    Setup PHP Selector without CageFS
    �/usr/share/cagefsrN�Error: CageFS is not installedr�alt-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_r�r��/usr/sbin/lvectl destroy �% &>/dev/null; /usr/sbin/lvectl apply � &>/dev/nullTr�r�)r'r9rc�	cagefslib�ImportErrorrr*�get_alt_dirsr�r�r8r�rr�r��pwd�getpwnam�pw_dirrrr��pw_uid�create_selector_symlinksr�r�r�r�r�)
�argsr�r�r��pwr�r��alt_path�	user_pathr�s
          r!�setup_without_cagefsr�psB���H�O�O�'�(�(�(������������
�.�/�/�/��������������%�%�'�'�H���
�!�"�"�"��������
"��A�w��������� � ���	��j�k�k�k��;�<�<�<��H�Q�K�K�K��w�~�~�h�0�1�1�	"��D�!�!�!�����	��d�	�	�B��i�G��*�*����(�+C�C���2�2�W�<�v�E�	��Y��)�)�)�)�
�u�
�
�C� ��w��	�8�S�I�I�I�� � ��&�&�&� ��w��4�4�4������N�.��R�Y���?�Bi�i����^�^�$�&4�5�<@�[�Z�Z�Z�Z�Z�Zs�&�-A�Ac�Z�tj�tj��s#td��t
jd��tj�d��	ddl	}n3#t$r&td��t
jd��YnwxYw|���}|s#td��t
jd��td�	��|D]=}d
|zdz}tj�
|��rtj|���>t��}|s#td��t
jd��t!j|��}|j}t'd
��}t)|||d���tjtj��t+jd|zdd���t/��t+jdt1|j��zdzt1|j��zdzdd���dS)z:
    Revert to default PHP Selector setup with CageFS
    z<PHP Selector is in default mode already ("with CageFS" mode)rr�rNr�r�T)r�r�r�zError: failed to detect userr�F)r�r�r�r�r�r�r�)r8r9r�rr�rr'r*rcr�r�r�r��islink�unlinkr�r�r�r�rr�r�r�r�r�r�)r�r�r�r�r�r�r�r�s        r!�revert_to_cagefsr��s.���7�>�>�(�,�-�-��
�L�M�M�M��������H�O�O�'�(�(�(������������
�.�/�/�/��������������%�%�'�'�H���
�!�"�"�"��������4� � � � �� � ����(�+C�C��
�7�>�>�(�#�#�	 ��I�h��������D���
�,�-�-�-�������	��d�	�	�B��i�G�
�u�
�
�C� ��w���?�?�?�?��I�h� �!�!�!��N�E��L�TX�ep�q�q�q�q������N�.��R�Y���?�Bi�i��r�y�>�>�"�$2�3�:>�;�X�X�X�X�X�Xs�-A2�2-B"�!B"c��tj�d��	ddl}ddl}n3#t
$r&t
d��tjd��YnwxYw|���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
    r�rNr�r)�options)
r'r9rcr��cagefsreconfigurer�rr*�get_alt_versions�replace_alt_settings)r�r�r�s   r!�apply_global_php_inir��s����H�O�O�'�(�(�(������ � � � � ������
�.�/�/�/��������������!�!�#�#�=��.�.�t�.�<�<�<�<�<�=�=s�*�-A�Ac��tt��rst��}tj��D]!\}}|�d|�d|�d����"tj|d|d�|��zd���dSdS)Nz 'z' is required for '�'�WARN�,�r]r+)r0r
ra�itemsrcr�
print_diagr_)�print_format�
print_message�modules_list�module_name�
dep_modules     r!�"_check_depencies_and_print_messager�s���
����^��v�v��':�'@�'B�'B�	Z�	Z�#�K���������Z�Z�Z� X�Y�Y�Y�Y���<�F�5B�S�X�X�l�E[�E[�5[�*]�*]�	^�	^�	^�	^�	^�^�^r c�h�t|���|��}t|||��S�N)r	�list_extensions�parse_extensions)�interpreterr@r-�ext_lists    r!�get_extensionsr�s/���;�'�'�7�7��@�@�H��H�g�s�3�3�3r c�"�g}|D]|}d}|ddurd}n|ddurd}|dkr|�||df���A|�|dd	t|��d
���t|��}�}|dkr||d�}|S|S)
NrwrTrxFrGrNrr5)r|r}�stater^)r@�
extensions)rcryr�)rr@r-�	json_list�ext�actionr�s       r!rr�s����I��
5�
5�����q�6�T�>�>��F�F�
��V�u�_�_��F��&�=�=����f�c�!�f�-�.�.�.�.����c�!�f�R�J^�_e�Jf�Jf�g�g�h�h�h�)�)�4�4�I�I�
�f�}�}�")��C�C�����r c�v�d}d}	ttdg�����}|dkrgS|�d��dd�S#t$r[}|t|��vrt
d��n |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)r�CAGEFSCTL_COMMANDr=rrr�r.)�not_installed_msg�not_initialized_msg�usersrIs    r!�get_cagefs_usersr�s���4��5�� ��.�0@�A�B�B�H�H�J�J���B�;�;��I��{�{�4� � ����$�$�� � � � ���A���&�&� �!?�@�@�@�@�
 �C��F�F�
*�
*� �"Y�
Z�
Z�
Z��Q��������������
 ���s�/A�A�
B8�AB3�3B8c��d�|D��}|t|��zstd��d|vrGd|vrEtjt	j����j}|�d|f��dSdSdS)z�
    Verifies if the provided options are supported in CageFS
    and appends the current user option if user-related options are absent
    c��h|]\}}|��Srr)�.0�opt�_s   r!�	<setcomp>z+verify_options_in_cagefs.<locals>.<setcomp>s��/�/�/�V�S�!�S�/�/�/r z.Error: This command is not supported in CageFS�--user�-uN)r�r.r��getpwuidr8�geteuid�pw_namerc)r��supported_options�
input_options�current_user_names    r!�verify_options_in_cagefsr#s���
0�/�w�/�/�/�M��3�0�1�1�1�O��M�N�N�N��}�$�$��]�)B�)B��L�����6�6�>������"3�4�5�5�5�5�5�%�$�)B�)Br c
�0�i}d|d<d|d<d|d<d|d<d|d<d|d	<d|d
<d|d<t|d
<i}g}t��	tjtjdd�dgd���\}}n7#tj$r%t
��tjd��YnwxYwgd�}t��rt||��|D�]�\}}|dvr#t
��tjd���-|dvrL|�
d��D]5}	|�t|�����&#t$rY�2wxYw�}|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(v�r�||d)<t#��}	t%j��r|	�|��}
���|�
d��}t+��}	t-|��dkrf|	�|��}
t/j��dkr9|	�|
��D]#}
t5���|
���$nL|D]1}
|
|vr+||	�|	�|
����z
}�2d�|��|d)<��x#t"j$rN}tj�tA|��d*z��tjd��Yd}~���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<��/|dcvr�d)|vrtCdd��tE��}|stCde��t#��}	t+��}|D]1}
|
|vr+||	�|	�|
����z
}�2d�|��|d)<���t-|��dkrwt-|��dkrT|drL	tGt%|d���$��d��n #tJ$rYnwxYwtCdfdg��	d.|vr$d%|vr t%���&��d|vr�|ddYkr>t%|d���'��D]}tGdh|z���dSdigdj�}t%|d���'��D]3}|dk�|d|d|dldm����4tGtQj)|����dSd|vrMt%|d���*|d��}tW||d|d
��dSd#|vr@tGdht%|d���,|d��z��dSd,|vrLt%|d���-|d,��|ddYkrt]��dSdSd0|vrLt%|d���/|d0��|ddYkrt]��dSdSd2|vrLt%|d���0|d2��|ddYkrt]��dSdSd4|vr�tc|dn��te|d|d|d��}|ddkr|D]}tGdo|z���dS|ddYkr#tGtQj)|����dSdSd8|vrvtc|dn��tg|d���4|dt+tkdp�|d8�
d��������dSd:|vr�tc|dn��tg|d���6|dt+tkdq�|d:�
d��������t-tn��rtq|ddr��dSdSd<|vr�tc|dn��tg|d���9|dt+tkds�|d<�
d��������t-tn��rtq|ddt��dS|ddYkrt]��dSdSd!|vrWtc|du��t5|d|���*|d)|d��}tW|��dSd%|vrXtc|du��tGdht5|d|���,|d)|d��z��dSd|vr:tc|dv��t5|d|���:��dSd.|v�rtc|du��	t%���&��n1#tvj<$r|d.dwkr�td��YnwxYw|	�|
��d}
t5|d|��}|�-|
|d.|d|d��}|�=|	�|
����|drtW|��dSdSd6|vr�tc|du��|drnt}|d|���?|d)|d��D]5}dx}|d�dy}n|ddurdz}tG|�d{|d�����6dSt}|d|���@|d)|d��D]}tG|d���dSd>|vr�tc|d|��t%jA��|d)�
d��}|D]l}
t}|d|��}|�B|
|dt+tkd}�|d>�
d������d�~���m|�=|��dSd@|vr�tc|d|��t%jA��|d)�
d��}|D]j}
t}|d|��}|�C|
|dt+tkd�|d@�
d���������k|�=|��dSdB|vr�tc|d|��t%jA��|	�|
��d}
t}|d|��}|�9|
|dt+tkd��|dB�
d��������|�=|	�|
����dSdD|vr�tc|d|��t%jA��|	�|
��d}
t}|d|��}|�D|
|d��}|�=|	�|
����tGd�|����dSdH|vrctc|dn��t5|d|���E|d��}tGd�|����dSdJ|vrHtc|dn��t5|d|���F|dJ|d��dSdL|vr�tc|d|��t%jA��|	�|
��d}
t�|d|��}|�H|
|d|dL|d	d|d
��|�=|	�|
����|ddYkrt�jJ|di��dSdSdN|vr�tc|d|��t%jA��|	�|
��d}
t�|d|��}|�H|
|d|dN|d	d|d
��|�=|	�|
����|ddYkrt�jJ|di��dSdSdP|vr�tc|d|��t%jA��|	�|
��d}
t�|d|��}|�K|
|d|dP|d	|d
��|�=|	�|
����|ddYkrt�jJ|di��dSdSd`|vr�d}
d}d)|vr|d)�
d��}
|dr|d�
d��}t�|d|��}|�L|
|��|�=|
��|ddYkrt�jJ|di��dSdSdU|vratc|du��t�jJ|dt�|d|���M|d)|d����dSdW|vrctc|du��t�jJ|dt�|d|���M|d)|d��d����dSdb|vr�t#��}	|	�N���O��D]�}
	t5���P|
��t5���Q|
��t����R|
���g#tvjS$rY�xtvjT$r=}|d
s+t�jU|ddgtA|��d����Yd}~��d}~wwxYwdSdS#tvj<$rV}t�jU|dd�tA|��|jV|jWd����tjd��Yd}~dSd}~wt�$rV}t�jU|ddgtA|��|jV|jWd����tjd��Yd}~dSd}~wt�t�f$rtCd���YdSt�$r<}t�j]��}t�jU|ddg|d����Yd}~dSd}~wwxYw)�Nr�rr@Fzshow-all�
print-summary�show-native-version�plain�decoder�quietrNrzapi-versionrz6hi:lSsCcB:Y:N:E:D:R:v:Gu:b:ge:d:r:atpVLT:k:m:x:QqPjwWz).�helpzsetup-without-cagefszrevert-to-cagefszinterpreter=ra�summaryzuser-summary�currentz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=�all�reset-user-extensionsr%r&�
list-userszchange-to-version=zadd-options=zreplace-options=zdelete-options=�base64�apply-symlinks-rulesr)�
print-options�print-options-safer^�csv�perlz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)rrr�r&)z-Bz
--set-currentzset-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)rLrMzadd-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 options�ERRORz%s	%s	%sr�)r]rfrfr\)�short�fullr9)rr@z%s %sc�*�|���Sr�r=�rXs r!r[zmain.<locals>.<lambda>=���A�G�G�I�I�r c�*�|���Srr[r\s r!r[zmain.<locals>.<lambda>Br]r zModules left by dependencies:c�*�|���Srr[r\s r!r[zmain.<locals>.<lambda>Jr]r z#Modules left/added by dependencies:)rr�)r�nativerGrwrxrV)rr@r�c�*�|���Srr[r\s r!r[zmain.<locals>.<lambda>�s�������r )r�r@r�	check_extc�*�|���Srr[r\s r!r[zmain.<locals>.<lambda>�s�����	�	�r c�*�|���Srr[r\s r!r[zmain.<locals>.<lambda>�r]r )�escaper��WARNING)r]r+�details�contextz(Incomplete or incorrect set of arguments)^rr2�getoptr'r1�GetoptErrorr"r*rr#rrcr��
ValueErrorr�r�r�rr�work_without_cagefs�get_uidrar0r8r�	get_namesr�cagefs_copy_etcr_�NoSuchUserExceptionr(r)r�r.rr�get_native_version�	TypeError�check_requirements�list_alternativesr^re�get_summaryrp�get_version�set_versionr��enable_version�disable_versionrurr	�enable_extensionsr�disable_extensionsr
r�replace_extensions�apply_symlinks_rulesr�NativeNotInstalled�clean_crui_imagesr�list_all_extensions�list_enabled_extensions�%check_multiphp_system_default_version�bulk_enable_extensions�bulk_disable_extensions�reset_extensions�
list_users�change_to_versionr
�insert_optionsr�
print_data�delete_options�
reset_options�get_optionsr��keys�_check_user_in_cagefs�_backup_settings�backup_php_options�
NotCageFSUser�UnableToSaveDatar�rgrhrr��UnboundLocalError�	Exception�	traceback�
format_exc)rr�actions�exclude_pid_list�optsr��opts_supported_in_cagefs�or��pid�clpwdr�r�	user_listr�rIrY�alternatives_dictrfrr��cr
rrr@�msgs                          r!�mainr�"s��
�F�!�F�=���F�9���F�:��#�F�?��$)�F� �!��F�9���F�7�O��F�8��!�F�=���G�������5��]��H�Q�R�R�L�D�.
�.
�.
�1�1�
��d�d��d�����
���������������� � � ��$�{�{�A� ��'?�@�@�@��B1�B1���1�� � � ��G�G�G��H�Q�K�K�K�K�
�(�
(�
(��w�w�s�|�|�
�
���$�+�+�C��H�H�5�5�5�5��!�����H�����
�
�,�
,�
,�.2�G�*�+�+�
�,�
,�
,� ��&�&�&��H�Q�K�K�K�K�
�(�
(�
(������H�Q�K�K�K�K�
�-�
-�
-� ��&�&�&��H�Q�K�K�K�K�
�"�
"�
"�+/�G�'�(�(�
�%�
%�
%�&*�G�N�#�#�
�*�
*�
*�+/�G�'�(�(�
�%�
%�
%�&*�G�N�#�#�
�*�
*�
*�+/�G�'�(�(�
�/�
!�
!�!%�F�:���
�%�
%�
%� !�F�9���
�"�
"�
"��F�6�N��G�G�E��+�-�-�
 ��m�m�A�&�&���������� �F�F�	�
 ��5�z�z�Q���#�m�m�A�.�.���:�<�<�1�,�,�(-����(<�(<�E�E�� ,��� >� >�t� D� D� D� D��$)�R�R�D�#�9�4�4� )�U�_�_�U�]�]�4�=P�=P�-Q�-Q� Q�	��),���)�)<�)<��v�����0� � � ��J�$�$�S��V�V�D�[�1�1�1��H�Q�K�K�K�K�K�K�K�K����� �����)�
)�
)�%&�G�M�"�"�
�.�
.�
.�*+�G�&�'�'�
�0�
0�
0�,-�G�(�)�)�
�1�
1�
1�-.�G�)�*�*�
�-�
-�
-�)-�G�%�&�&�
�2�
2�
2�.2�G�*�+�+�
�/�
/�
/�+,�G�'�(�(�
�0�
0�
0�,-�G�(�)�)�
�0�
0�
0�,-�G�(�)�)�
�4�
4�
4�01�G�,�-�-�
�5�
5�
5�12�G�-�.�.�
�5�
5�
5�12�G�-�.�.�
�3�
3�
3�/3�G�+�,�,�
�+�
+�
+�&*�F�?�#�#�
�1�
1�
1�,0�F�(�)�)�
�(�
(�
(�$(�G�L�!�!�
�/�
/�
/�+,�G�'�(�(�
�)�
)�
)�%&�G�M�"�"�
�-�
-�
-�)*�G�%�&�&�
�,�
,�
,�()�G�$�%�%�
�$�
$�
$� (�F�9���
�#�
#�
#�"�F�7�O�O�
�+�
+�
+�'+�G�O�$�$�
�*�
*�
*�,0�G�(�)�)�
�"�
"�
"�%�F�8���
�/�
!�
!�$�F�8���
�#�
#�
#�$'��F�F�F�=�!�!�
�"�
"�
"�%�F�8���
�+�
+�
+�'+�G�O�$�$�
�%�
%�
%�'+�G�O�$�$�
�%�
%�
%�����$�&O�P�P�P�%�&�&�E��
f�$�%d�e�e�e��G�G�E����I��
F�
F���y�(�(��������t�1D�1D�!E�!E�E�I�� �X�X�i�0�0�F�6�N��
�7�|�|�q����w�<�<�1����(=�!>��
��h�v�m�4�5�5�H�H�J�J�1�M�N�N�N�N���
�
�
���
����
!�!7��A�A�A�]1��W�,�,�#�7�2�2��J�J�)�)�+�+�+��'�)�)��h��6�)�)�#�F�=�$9�:�:�L�L�N�N�0�0�C��,�#�.�/�/�/�/�0�0�04�R�$@�$@�!�#�F�=�$9�:�:�L�L�N�N�h�h�C�%�f�-�4�4�s�1�v�s�ST�v�_b�cd�_e�5f�5f�g�g�g�g��d�j�!2�3�3�4�4�4�4�4�
�w�
&�
&��F�=�1�2�2�>�>��,�-�/�/�D��$��x� 0�&��2G�H�H�H�H�H�
�w�
&�
&��,��&��*?�!@�!@�!L�!L��,�-�"/�"/�/�
0�
0�
0�
0�
0�
�g�
%�
%��V�M�*�+�+�7�7��
�8N�O�O�O��h��6�)�)�$�&�&�&�&�&�*�)�
!�W�
,�
,��V�M�*�+�+�:�:�7�CW�;X�Y�Y�Y��h��6�)�)�$�&�&�&�&�&�*�)�
"�g�
-�
-��V�M�*�+�+�;�;�G�DY�<Z�[�[�[��h��6�)�)�$�&�&�&�&�&�*�)�
�'�
)�
)���!:�;�;�;�%�f�]�&;�V�I�=N�PV�W_�P`�a�a�H��h��6�)�)�$�*�*�D��'�D�.�)�)�)�)�*�*���!�V�+�+��d�j��*�*�+�+�+�+�+�,�+�
 �G�
+�
+���!;�<�<�<���}�-�.�.�@�@��y�!��S�-�-��8K�0L�0R�0R�SV�0W�0W�X�X�Y�Y�
[�
[�
[�
[�
[�"�W�
,�
,���!;�<�<�<���}�-�.�.�A�A��y�!��S�-�-��8L�0M�0S�0S�TW�0X�0X�Y�Y�Z�Z�
\�
\�
\��&�'�'�
f�2�6�(�3C�Ed�e�e�e�e�e�
f�
f�"�W�
,�
,���!;�<�<�<���}�-�.�.�A�A��y�!��S�-�-��8L�0M�0S�0S�TW�0X�0X�Y�Y�Z�Z�
\�
\�
\��&�'�'�
'�2�6�(�3C�Ej�k�k�k�k�k���!�V�+�+�$�&�&�&�&�&�,�+�
 �G�
+�
+���!8�9�9�9���}� 5�7G�H�H�T�T��v���,�-�/�/�D�
�$������
 �G�
+�
+���!8�9�9�9��,���}�%�'7�"9�"9�9D���v���,�-�:/�:/�/�
0�
0�
0�
0�
0�$�w�
.�
.���!1�2�2�2���
�.�0@�A�A�V�V�X�X�X�X�X�
�7�
*�
*���!8�9�9�9�
��
�
�-�-�/�/�/�/��!�4�
�
�
��-�.�(�:�:���Q������
�����?�?�3�'�'��*�D��V�M�2�4D�E�E�A��=�=��w�/A�'B���'��0E�)F�H�H�D�
������� 4� 4�5�5�5��o�&�
$��d�#�#�#�#�#�
$�
$�
#�w�
.�
.���!8�9�9�9��j�!�
"�*�6�-�+@�BR�S�S�g�g��v���y�)�+�+�6�6�C�!�F��1�v�~�!$����Q��4���!$���V�V�V�S��V�V�4�5�5�5�5�6�6�+�6�-�+@�BR�S�S�k�k��v���y�)�+�+�"�"�C��#�a�&�M�M�M�M�"�"�&��
0�
0���!C�D�D�D��:�<�<�<��6�N�(�(��-�-�E��
$�
$��#�F�=�$9�;K�L�L���(�(��"�9�-�!�#�':�':�W�E]�=^�=d�=d�eh�=i�=i�"j�"j�k�k�"�	)�$�$�$�$�

����&�&�&�&�&�
&�'�
1�
1���!C�D�D�D��:�<�<�<��6�N�(�(��-�-�E��
e�
e��#�F�=�$9�;K�L�L���)�)���9�%���1�1�G�<U�4V�4\�4\�]`�4a�4a�b�b�c�c�e�e�e�e�
����&�&�&�&�&�
&�'�
1�
1���!C�D�D�D��:�<�<�<��?�?�3�'�'��*�D���}� 5�7G�H�H�A�
� � ���y�!��S�-�-��8Q�0R�0X�0X�Y\�0]�0]�^�^�_�_�
a�
a�
a�
������� 4� 4�5�5�5�5�5�
$��
/�
/���!C�D�D�D��:�<�<�<��?�?�3�'�'��*�D���}� 5�7G�H�H�A��+�+�D�&��2C�D�D�J�
������� 4� 4�5�5�5��#�(�(�:�&�&�'�'�'�'�'�
�W�
$�
$���!;�<�<�<� ��
�!6�8H�I�I�T�T��y�!�#�#�E��#�(�(�5�/�/�"�"�"�"�"�
 �G�
+�
+���!;�<�<�<���
�.�0@�A�A�S�S��+�,��y�!�
#�
#�
#�
#�
#��g�
%�
%���!C�D�D�D��:�<�<�<��?�?�3�'�'��*�D���}� 5�7G�H�H�A�
�����y�!��
�&��y�!���w��

!�
!�
!�
������� 4� 4�5�5�5��h��6�)�)��"�6�(�#3�R�8�8�8�8�8�*�)�
�'�
)�
)���!C�D�D�D��:�<�<�<��?�?�3�'�'��*�D���}� 5�7G�H�H�A�
�����y�!��)�*��y�!���w��

!�
!�
!�
������� 4� 4�5�5�5��h��6�)�)��"�6�(�#3�R�8�8�8�8�8�*�)�
��
(�
(���!C�D�D�D��:�<�<�<��?�?�3�'�'��*�D���}� 5�7G�H�H�A�
�����y�!��(�)��y�!��w��
!�
!�
!�
������� 4� 4�5�5�5��h��6�)�)��"�6�(�#3�R�8�8�8�8�8�*�)�
��
'�
'��D��G������f�~�+�+�C�0�0���i� �
7� ��+�1�1�#�6�6����}� 5�7G�H�H�A�
�O�O�D�'�*�*�*�
����%�%�%��h��6�)�)��"�6�(�#3�R�8�8�8�8�8�*�)�
��
'�
'���!8�9�9�9���v�h�/���}� 5�7G�H�H�T�T��6�N��9�%�'�'�
(�
(�
(�
(�
(�"�W�
,�
,���!8�9�9�9����x� ���}� 5�7G�H�H�T�T��6�N��9�%����

�
�
�
�
�
���
'�
'��G�G�E��+�+�-�-�2�2�4�4�
�
��� �N�N�8�8��>�>�>� �N�N�3�3�D�9�9�9�#�%�%�8�8��>�>�>�>��%�3�����D�%�6����!�'�?�D��*�"�8�,�'.�3�q�6�6�B�B�D�D�D��D�D�D�D���������(�
'�
�
���,������6�(�+���1�v�v��y��y�	.
�.
�	�	�	�	���������������� ������6�(�+���1�v�v��y��y�	.
�.
�	�	�	�	�����������������'�(�I�I�I��G�H�H�H�H�H�H��1�1�1��"�$�$�����8���3�/�/�	1�	1�	1�	1�	1�	1�	1�	1�	1�����1���s�-A6�61B*�)B*�"D=�=
E
�	E
�CM	�	N&�AN!�!N&�:X
�

X�X�+A4A[�!BA[�$AA[�5AA[�9AA[�	AA[�AA[�)AA[�-A[�6A8A[�0B"A[�B"A[�:A[�AA[�3AA[�<A[�
A[�# q�A[�+q2�/A[�1q2�2BA[�BA[�AA[�-CA[�5CA[�;CA[�AB>A[�DA%A[�E6A
A[�GCA[�JCA[�M<CA[�QB2A[�TA#A[�U3A%A[�W:A[�XA#AY9�Y8A[�Y9A[�ZA[�Z
A[�Z3A[�[A[�[A[�[A[�[A`�[+AA\<�\<
A`�]	AA^�^#A`�_	A`�_	1A`�`A`�__main__r)F)NT)rN)O�
__future__rrrr�r'rir8r�r��
simplejsonr^r�r��builtinsr�clselectr�clextselectr	r
�cluserselectr�cluserextselectr�cluseroptselectr
�
clselectprintrr�clcommon.constr�clcommon.cpapir�clcommon.sysctlrr�clcommon.utilsrr�clcommon.lib.cleditionrr�rr�clselectexceptrrr�API_1rr"r.r2rErMrnrpruryr�r�r�r�r�r�r�r�r�r�r�r�rrrrr#r��__name__rr r!�<module>r�s���&�%�%�%�%�%�&�&�&�&�&�&�����������
�
�
�
�
�
�
�
�	�	�	�	�������������
�
�
�
�
�
�
�
�������������9�9�9�9�9�9�9�9�&�&�&�&�&�&�,�,�,�,�,�,�,�,�,�,�,�,�"�"�"�"�"�"�������"�"�"�"�"�"�5�5�5�5�5�5�;�;�;�;�;�;�;�;�=�=�=�=�=�=�=�=�,�,�,�,�,�,�*�*�*�*�*�*�*�*�A�A�A�A�A�A�A�A�	
��	
��*��2c�2c�2c�j	�	�	�	�5�5�5�������!'�E�$%�$%�$%�$%�N &�5�����H�H�H����
�
�
� #�#�#�

�
�
�(�(�(�
�
�
�
� ����D'�'�'�'�TY�Y�Y�f�f�f�+Z�+Z�+Z�\'X�'X�'X�T=�=�=�$^�^�^�4�4�4�4�
���& � � �.6�6�6�F1�F1�F1�P�z����D�F�F�F�F�F��r 

Hacked By AnonymousFox1.0, Coded By AnonymousFox