Hacked By AnonymousFox

Current Path : /opt/cloudlinux/venv/lib/python3.11/site-packages/__pycache__/
Upload File :
Current File : //opt/cloudlinux/venv/lib/python3.11/site-packages/__pycache__/clcontrollib.cpython-311.pyc

�

ܨf������ddlmZddlmZddlmZddlZddlZddlZddlZddl	Z	ddl
mZmZm
Z
ddlmZmZddlmZddlmZdd	lmZmZmZmZddlZd
ZGd�de��Zd
�ZGd�de ��Z!Gd�de!��Z"Gd�de!��Z#Gd�de��Z$Gd�de!��Z%Gd�de!��Z&Gd�de!��Z'Gd�de!��Z(Gd�de!��Z)dS) �)�print_function)�absolute_import)�rangeN)�Tuple�Optional�List)�ClPwd�	mysql_lib)�ProcLve)�grep)�cpanel�directadmin�
ispmanager�plesk�0c��eZdZdZdS)�ConfigDataErrorz�
    Should be raised when something went wrong during user's config data
    loading/parsing.
    Supposed to be used when we want to skip some user with broken
    configuration files
    N)�__name__�
__module__�__qualname__�__doc__���py/clcontrollib.pyrrs��������	�Drrc��tj��tjdkrt��Stjdkrt	��Stjdkrt��Stjdkrt
��Stjdkrt��Stjdkrt��St��S)N�Plesk�cPanel�	InterWorx�
ISPManager�DirectAdmin�	HostingNG)
�detect�	getCPName�CP_NAMEr�Cpanelrrr r!�Unknownrrr�detect_panelclassr''s���
�����
�~�� � ��w�w��	��8�	#�	#��x�x��	��;�	&�	&��{�{��	��<�	'�	'��|�|��	��=�	(�	(��}�}��	��;�	&�	&��{�{���y�y�rc���eZdZd�Zdd�Zd�Zd�Zed���Z		dd	�Z	ed
���Z
edd���Zdd
�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�ZdS)�GeneralPanelc�N�t��|_|jj|_tj��|_|j���|j���kr-td�
|j|j�����d|_dS)Nz+Class "{}" not should be used on panel "{}")r	�
users_data�	__class__r�
class_namer"r#�current_panel_name�lower�UserWarning�format�cpapi_plugin)�selfs r�__init__zGeneralPanel.__init__;s����'�'����.�1���"(�"2�"4�"4����?� � �"�"�d�&=�&C�&C�&E�&E�E�E��K�R�R����'�����
�!����rFc�4�|j���S)z�
        List all admins names in given control panel
        :param bool debug: Do produce debug output or don't
        :return: list of strings
        )r2�admins�r3�debugs  r�list_adminszGeneralPanel.list_adminsGs��� �'�'�)�)�)rc�6�|j�|��S)z|
        Return True if username is in admin names
        :param str username: user to check
        :return: bool
        )r2�is_admin)r3�usernames  rr;zGeneralPanel.is_adminOs��� �)�)�(�3�3�3rc�l�|r1tj�|�d|jj�d���dSdS)Nz is not implemented for �
)�sys�stderr�writer,r�r3r8�method_names   r�_warningzGeneralPanel._warningWsQ���	7��J������T�^�4�4�4�6�
7�
7�
7�
7�
7�	7�	7rc�j�tjtjd�|����dS)NzCL_CONTROLLIB: {})�syslog�LOG_WARNINGr1)�msgs r�
_slog_warningzGeneralPanel._slog_warning\s,���
�f�(�*=�*D�*D�S�*I�*I�J�J�J�J�JrNTc�z�|�|�td���|�|�td���|�s	|j�|��S#tj$rF}|rt|��|r(|�d�|����Yd}~dSd}~wwxYw	|j�t|����dS#tj$rF}|rt|��|r(|�d�|����Yd}~dSd}~wt$rtd��YdSwxYw)aH
        Check that provided user is really exists in system and return it as:
        - uid if username was provided
        - username if uid was provided
        - None if user doesn't exists
        Produce syslog/debug output depending on flags if user isn't exists.

        This helper function is mostly needed because it's possible that
        user is already deleted in system but his entity is still present in
        control panel files (like DA_USERS_DIR) so we should do additional
        checks to skip such users.

        :return: (uid | username) or None
        NzIThis function accepts either uid or username, but not both simultaneouslyz0Incorrect call: uid or username is not specifiedz4User with username="{}" is not present in the systemrz/User with uid="{}" is not present in the system�Incorrect user id)
�
ValueErrorr+�get_uidr	�NoSuchUserException�printrIr1�	get_names�int)r3�uidr<r8�syslog_�es      r�_check_and_get_userz GeneralPanel._check_and_get_user`s��� �?�x�3��;�<�<�
<��;�8�+��O�P�P�P���

���.�.�x�8�8�8���,�
�
�
����!�H�H�H��+��&�&�N����)�)�+�+�+��t�t�t�t�t�����
����
	��?�,�,�S��X�X�6�6�q�9�9���(�	�	�	��
��a�����
"��"�"�E��V�C�[�[�"�"�"��4�4�4�4�4������	�	�	��%�&�&�&��4�4�	���s5�A�B�;B�B�,C
�
D:�;D�D:�9D:c�~�t|d��5}|���}ddd��n#1swxYwY|S)�
        Safely read file content and close it before return the content string.
        No exceptions will have caught!

        :param string file_name: Absolute or relative path to file
        :rtype: string
        :return: Content of given file path
        �rN)�open�	readlines)�	file_name�f�contents   r�get_file_lineszGeneralPanel.get_file_lines�sx���)�S�
!�
!�	$�Q��k�k�m�m�G�	$�	$�	$�	$�	$�	$�	$�	$�	$�	$�	$����	$�	$�	$�	$��s�2�6�6�wc��t||��5}|�|��ddd��dS#1swxYwYdS)a=
        Safely write to file and close it before the function end.
        No exceptions will have caught!

        :param string file_name: Absolute or relative path to file
        :param string content: What to write there
        :param string open_method: Either "w" or "a" or "b"
        :return: None
        N)rY�
writelines)r[r]�open_methodr\s    r�write_file_lineszGeneralPanel.write_file_lines�s����)�[�
)�
)�	"�Q�
�L�L��!�!�!�	"�	"�	"�	"�	"�	"�	"�	"�	"�	"�	"�	"����	"�	"�	"�	"�	"�	"s�4�8�8c�2�|�|d��dS)a
        Implements /usr/bin/getcontrolpaneluserspackages and
        /usr/bin/getcontrolpaneluserspackages --list-all commands
        Result is stdout output:
            uid package name

        :param bool debug: Do produce debug output or don't
        :return: None
        zList allN�rDr7s  r�list_allzGeneralPanel.list_all�s��	
�
�
�e�Z�(�(�(�(�(rc�2�|�|d��dS)a	
        Implements /usr/bin/getcontrolpaneluserspackages --package=package_name
        Result is stdout output:
            uid

        :param string package: Package name
        :param bool debug: Do produce debug output or don't
        :return: None
        zList users in given packageNre)r3�packager8s   r�list_users_in_packagez"GeneralPanel.list_users_in_package�s��	
�
�
�e�:�;�;�;�;�;rc�2�|�|d��dS)aX
        Implements
        /usr/bin/getcontrolpaneluserspackages --package=package_name --reseller=reseller_name
        Result is stdout output:
            uid

        :param string package: Package name
        :param string reseller: Reseller name
        :param bool debug: Do produce debug output or don't
        :return: None
        z&List users in given reseller's packageNre)r3rh�resellerr8s    r�list_users_in_reseller_packagez+GeneralPanel.list_users_in_reseller_package�s��	
�
�
�e�E�F�F�F�F�Frc�2�|�|d��dS)z�
        Implements /usr/bin/getcontrolpaneluserspackages --userid=id
        Result is stdout output:
            uid package name

        :param int uid: User ID
        :param bool debug: Do produce debug output or don't
        :return: None
        zList given user's packageNre�r3rRr8s   r�list_user_packagezGeneralPanel.list_user_package�s��	
�
�
�e�8�9�9�9�9�9rc�2�|�|d��dS)z�
        Implements /usr/bin/getcontrolpaneluserspackages --list-packages
        Result is stdout output:
            package name

        :param bool debug: Do produce debug output or don't
        :return: None
        zList all packagesNrer7s  r�
list_packageszGeneralPanel.list_packages�s��	
�
�
�e�0�1�1�1�1�1rc�2�|�|d��dS)z�
        Implements /usr/bin/getcontrolpaneluserspackages --list-resellers-packages
        Result is stdout output:
            reseller_name package name

        :param bool debug: Do produce debug output or don't
        :return: None
        z!List packages belong to resellersNrer7s  r�list_resellers_packagesz$GeneralPanel.list_resellers_packages�s��	
�
�
�e�@�A�A�A�A�Arc�2�|�|d��dS)a'
        Implements
        /usr/bin/getcontrolpaneluserspackages --list-reseller-packages=reseller
        Result is stdout output:
            package name

        :param string reseller: Reseller name
        :param bool debug: Do produce debug output or don't
        :return: None
        z&List packages belong to given resellerNre�r3rkr8s   r�list_reseller_packagesz#GeneralPanel.list_reseller_packages�s��	
�
�
�e�E�F�F�F�F�Frc�2�|�|d��dS)z�
        Implements /usr/bin/getcontrolpaneluserspackages --list-users
        Result is stdout output:
            uid,package name,reseller_name

        :param bool debug: Do produce debug output or don't
        :return: None
        z
List usersNrer7s  r�
list_userszGeneralPanel.list_userss��	
�
�
�e�\�*�*�*�*�*rc�2�|�|d��dS)a(
        Generate triple with uid, it's package, it's reseller

        :param bool debug: Do produce debug output or don't
        :param string reseller_name: filter by this reseller
        :rtype: generator of (int, string, string)
        :return: (uid, package name, reseller name)
        zList reseler's usersNre)r3r8�
reseller_names   r�_get_user_packageszGeneralPanel._get_user_packagess��	
�
�
�e�3�4�4�4�4�4rc���|jdkrV|�|rtd��dS|�||���D]+\}}}td�||�����*dSdS)z�
        Print uid and package for defined reseller
        :param bool debug: Do produce debug output or don't
        :param reseller: username of reseller
        :return: None
        r)NzReseller is not defined)r8rz�{},{})r-rOr{r1)r3r8rkrRrh�_s      r�list_reseller_usersz GeneralPanel.list_reseller_userss����?�n�,�,����5��3�4�4�4���#'�#:�#:��V^�#:�#_�#_�
4�
4���W�a��g�n�n�S�'�2�2�3�3�3�3�
-�,�

4�
4rc�2�|�|d��dS)z�
        Determine user's reseller
        :param string uid: uid of user
        :param bool debug: Do produce debug output or don't
        :rtype: string
        :return: reseller name
        zGet user's resellerNrerns   r�get_resellerzGeneralPanel.get_reseller)s��	
�
�
�e�2�3�3�3�3�3r�F)NNFT)r_�FN)rrrr4r9r;rD�staticmethodrIrUr^rcrfrirlrorqrsrvrxr{rr�rrrr)r)9s�������
!�
!�
!�*�*�*�*�4�4�4�7�7�7�
�K�K��\�K�BG�$(�1�1�1�1�f����\���"�"�"��\�"�
)�
)�
)�
)�
<�
<�
<�
<�G�G�G�G�
:�
:�
:�
:�	2�	2�	2�	2�	B�	B�	B�	B�G�G�G�G�	+�	+�	+�	+�	5�	5�	5�	5�
4�
4�
4�
4�4�4�4�4�4�4rr)c���eZdZdZdZdZdZdZ�fd�Zd�Z	d�Z
d	�Zd
�Zdd�Z
dd
�Zd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Z�xZS)r%z/var/cpanel/usersz/var/cpanel/packagesz/var/cpanel/resellersz/etc/trueuserownersNc����tt|�����|j���|_t
j��|_dS�N)	�superr%r4r+�get_sys_min_uid�min_uidr
�PanelPluginr2�r3r,s �rr4zCpanel.__init__<sK���
�f�d���$�$�&�&�&���6�6�8�8���"�.�0�0����rc��d}	t|d��5}|���}ddd��n#1swxYwYn�#t$r~}d|�d|�d�}|�|j��r|d|��z
}t|tj���|�|��t
j	t��Yd}~nd}~wwxYw|S)	rWz]http://kb.cloudlinux.com/2017/08/how-to-fix-the-issue-with-non-utf-symbols-in-packages-names/rXN�Unable to read file 'z
', error is: z-. It looks like you use not an UTF-8 charset.z
Please read the instruction: )�file)rYrZ�UnicodeDecodeError�
startswith�USERDIRrOr?r@rI�exit�BAD_CODING_ERROR_CODE)r3r[�
ENCODING_LINKr\r]rT�messages       rr^zCpanel.get_file_linesAsD��B�
�
	,��i��%�%�
(���+�+�-�-��
(�
(�
(�
(�
(�
(�
(�
(�
(�
(�
(����
(�
(�
(�
(���!�	,�	,�	,�E�i�E�E�a�E�E�E�G��#�#�D�L�1�1�
M��L�]�L�L�L���'��
�+�+�+�+����w�'�'�'��H�*�+�+�+�+�+�+�+�+�����	,�����s3�A�5�A�9�A�9�A�
C	�A4C�C	c�f�i}tjd��}tj�|j��rv|�|j��}|D]Y}|���}tj||��}|��.|�	d��||�	d��<�Z|S)z~
        Get dict, where keys - user's names, values - reseller's names
        :return: dict {user1: reseller1, ...}
        z!^(?P<name>\w+):\s*(?P<owner>\w+)$N�owner�name)
�re�compile�os�path�isfile�RESELLERS_AND_USERSr^�strip�match�group)r3�result�pattern�file_content�line�strippedr�s       r�_get_users_resellers_dictz Cpanel._get_users_resellers_dictYs���
���*�A�B�B��
�7�>�>�$�2�3�3�	C��.�.�t�/G�H�H�L�$�
C�
C���:�:�<�<�����(�3�3���=��.3�k�k�'�.B�.B��u�{�{�6�*�*�+�+��
rc��g}tj�|j��r&|�|j��}d�|D��}|S)zw
        Get resellers list from RESELLERS_PATH

        :rtype: list
        :return: list of resellers names
        c�j�g|]0}|����dd��d��1S)�:�r)r��split��.0�ls  r�
<listcomp>z)Cpanel._get_resellers.<locals>.<listcomp>~s3��J�J�J����������a�0�0��3�J�J�Jr)r�r�r��RESELLERS_PATHr^)r3�	resellersr�s   r�_get_resellerszCpanel._get_resellerstsR���	�
�7�>�>�$�-�.�.�	K��.�.�t�/B�C�C�L�J�J�\�J�J�J�I��rc	��d}tj�|��rk|�|��}t	tdddd|�����}|r3|d����d��d}|S)z�
        Get package name from user's config file

        :param string path: Path to file contains info about cPanel user
        :rtype: string
        :return: Package name
        �z	PLAN\=.*$F��fixed_string�match_any_position�multiple_search�data_from_filer�=r�)r�r�r�r^�listrr�r�)r3r�rhr�r�s     r�get_packagezCpanel.get_package�s�����
�7�>�>�$���
	:��.�.�t�4�4�L��$��"�#(� %�+������F��
:� ��)�/�/�+�+�1�1�#�6�6�q�9���rFc	���d}|�||���}|r�tj�|j|��}tj�|��rk|�|��}ttdddd|�����}|r3|d�	���
d��d}|r||���vr|ndS)	��
        Determine user's reseller based on `owner` field from user's config

        :param string uid: uid of user
        :param bool debug: Do produce debug output or don't
        :rtype: string
        :return: reseller name
        r��rRr8z
OWNER\=.*$Fr�rr�r�)rUr�r��joinr�r�r^r�rr�r�r�)r3rRr8rkr<r�r�r�s        r�
_get_resellerzCpanel._get_reseller�s������+�+��5�+�A�A���	?��7�<�<���h�7�7�D��w�~�~�d�#�#�

?�#�2�2�4�8�8���d� �!&�',�$)�#/��������?�%�a�y���0�0�6�6�s�;�;�A�>�H�#�Q��D�4G�4G�4I�4I�(I�(I�x�x�r�Qrc�N�t|�||�����dS)r��r8N)rOr�rns   rr�zCpanel.get_reseller�s+��	�d� � ��E� �2�2�3�3�3�3�3rc#�rK�tj�|j��r�tj|j��D]v}tj�tj�|j|����r|dfV��Ktj�|j|��dfV��udSdS)z�
        Generate list of packages in current panel

        :rtype: generator of (string, bool)
        :return: (name of package, True) for normal files and (/path/to/wrang/file, False) otherwise
        TFN)r�r��isdir�
PACKAGEDIR�listdirr�r�)r3�filenames  r�
_get_packageszCpanel._get_packages�s������7�=�=���)�)�	K��J�t��7�7�
K�
K���7�>�>�"�'�,�,�t���"I�"I�J�J�K�#�T�*�*�*�*�*��7�<�<����B�B�E�J�J�J�J�J�	K�	K�
K�
Krc���|���}|���D]N\}}|r3d|vr|�dd��d|vr�*t|���:|rtd|z���OdS)Nr~r�r�Warning: %s is not a file.�r�r�r�rO)r3r8r�r��is_files     rrqzCpanel.list_packages�s����'�'�)�)�	�!%�!3�!3�!5�!5�	?�	?��H�g��
?��(�?�?�x�~�~�c�1�'=�'=�a�'@�I�'M�'M���h������
?��2�X�=�>�>�>��
	?�	?rc#�pK�|���}|sdStj�|j��r�tj|j��D]�}	|j�|��}||jkr�)	tj�	|j|��}||vr	||}n|�
||��}|�|��rdn|}|�||kr��||�|��|fV���#tj$r}|rt|��Yd}~��d}~wwxYwdSdS)ao
        Generate triple with uid, it's package and it's reseller for every user in USERDIR
        which uid is greater than MIN_UID

        :param bool debug: Do produce debug output or don't
        :param string reseller_name: filter by this reseller
        :rtype: generator of (int, string, string)
        :return: (uid, package name, reseller name)
        Nr�)r�r�r�r�r�r�r+rMr�r�r�r;r�r	rNrO)	r3r8rz�users_resellers_dictr�rRr�rkrTs	         rr{zCpanel._get_user_packages�sz���� $�=�=�?�?��$�	��F�
�7�=�=���&�&�	B��J�t�|�4�4�
B�
B��B��/�1�1�(�;�;�C��T�\�)�)� �*��7�<�<���h�?�?�D��#7�7�7�#7��#A���#'�#5�#5�c�5�#A�#A��%)�]�]�8�%<�%<�J�r�r�(�H�$�0�X��5N�5N� ��� 0� 0�� 6� 6��A�A�A�A�A���0�!�!�!��!��a�������������!����
	B�	B�
B�
Bs�%D�D1�D,�,D1c��|�||���D]4\}}}|dkr(|�t||���||krt|���5dS)N�rzr��r{rO)r3rhr8rkrR�self_package�
self_resellers       rrfzCpanel.list_all�sp��04�0G�0G��]e�0G�0f�0f�	�	�,�C��}��r�!�!��?��#�|�,�,�,�,���,�,��#�J�J�J��	�	rc��	|j�t|����}|D]X}|jdz|z}tj�|��r*|�|��}|dkrt|���YdS#tj
$r|rtd��YdSYdSt$rtd��YdSwxYw)N�/r�z,getcontrolpaneluserspackages: User not foundrK)r+rPrQr�r�r�r�r�rOr	rNrL)r3rRr8�users�userr�rhs       rrozCpanel.list_user_packages��
	'��O�-�-�c�#�h�h�7�7�E��
'�
'���|�c�)�D�0���7�>�>�$�'�'�'�"�.�.�t�4�4�G��"�}�}��g�����
'�
'��
�(�	F�	F�	F��
F��D�E�E�E�E�E�E�
F�
F�
F��	'�	'�	'��%�&�&�&�&�&�&�	'���s�'B� C�,C�Cc��|���}|���D]`\}}|rCd|vr?|�dd��d}||vr�,|�||kr�5t|�d|�����J|s|rtd|z���adS)Nr~r�r� r�r�)r3r8rkr�r�r��res_names       rrszCpanel.list_resellers_packagess����'�'�)�)�	�!%�!3�!3�!5�!5�
	?�
	?��H�g��	
?�3�(�?�?�#�>�>�#�q�1�1�!�4���9�,�,���)�h�(�.B�.B���X�X�X�x�x�8�9�9�9�9��
?��
?��2�X�=�>�>�>��
	?�
	?rc��|���}||vr|rtd|z��dS|�||���dS)NzError: %s is not reseller�r8rk)r�rOrs)r3rkr8r�s    rrvzCpanel.list_reseller_packagess^���'�'�)�)�	��9�$�$��
>��1�H�<�=�=�=��F��$�$�5�8�$�D�D�D�D�Drc	�.���|����d|vrN|�d���t��fd�tdt	�����D����rdS|�|�|��dS|rt
d��dSdS)Nr~c3�V�K�|]#}d��d|����vV��$dS)r~N)r�)r��i�partsr�s  ��r�	<genexpr>z/Cpanel.list_users_in_package.<locals>.<genexpr>+s<�����R�R��3�8�8�E�"�1�"�I�&�&�)�3�R�R�R�R�R�Rrr�z/getcontrolpaneluserspackages: Undefined package)r�r��anyr�lenrfrO)r3rhr8r�r�s   @@rrizCpanel.list_users_in_package's������'�'�)�)�	��'�>�>��M�M�#�&�&�E��R�R�R�R�R�U�1�c�%�j�j�=Q�=Q�R�R�R�R�R�
������M�M�'�"�"�"�"�"�
�	E��C�D�D�D�D�D�	E�	Erc��|���}||vr|�|||���dS|rtd��dSdS)Nr�z8getcontrolpaneluserspackages: Undefined reseller package)r�rfrO)r3rhrkr8r�s     rrlz%Cpanel.list_users_in_reseller_package2sf���'�'�)�)�	��y� � ��M�M�'���M�B�B�B�B�B�
�	N��L�M�M�M�M�M�	N�	Nrc�l�|�|��D]\}}}t|�d|�d|�����dS�N�,r�)r3r8rRr�rks     rrxzCpanel.list_users9sR��+/�+B�+B�5�+I�+I�	>�	>�'�C��x�����\�\�\�8�8�<�=�=�=�=�	>�	>rr�r�)NFN)rrrr�r�r�r�r+r4r^r�r�r�r�r�r�rqr{rfrorsrvrirlrx�
__classcell__�r,s@rr%r%4s��������!�G�'�J�,�N�/���J�1�1�1�1�1�
���0���6������,R�R�R�R�4
4�
4�
4�
4�K�K�K�?�?�?�?�"B�"B�"B�"B�H����'�'�'�'� ?�?�?�?�E�E�E�E�	E�	E�	E�	E�N�N�N�N�>�>�>�>�>�>�>�>rr%c�$��eZdZdZdZdZdZdZdZdZ	dZ
e��Z�fd�Z
d	�Zd
�Zd�Zd�Zd%d
edeeedefd�Zd&d�Zd&d�Zd'd�Zd�Zd�Zd�Zd'd�Zd'd�Zd�Zd'd�Zd'd�Z d'd�Z!d'd�Z"d'd�Z#d'd �Z$d!�Z%d"�Z&d'd#�Z'd'd$�Z(�xZ)S)(r z"/usr/local/directadmin/data/users/z,/usr/local/directadmin/conf/directadmin.confz,/usr/local/directadmin/data/admin/admin.listz//usr/local/directadmin/data/admin/reseller.listz//usr/local/directadmin/data/admin/packages.listr�Nc����tt|�����tj��|_t
j��|_|j�	��|_
dSr�)r�r r4r"�detect_DA_admin�DA_ADMINrr�r2�get_encoding_name�ENCODINGr�s �rr4zDirectAdmin.__init__IsZ���
�k�4� � �)�)�+�+�+��.�0�0��
�'�3�5�5����)�;�;�=�=��
�
�
rc�&�	t|d|j���5}|���}ddd��n#1swxYwY|S#t$r?}d|�d|j�d�}|�|d|�d�z��t|��|�d}~wwxYw)NrX)�encodingr�z '. It looks like you use not an z	 charset.z Error is: �.)rYr�rZr�rI�	Exception)r3r[r\r]rTr�s      rr^zDirectAdmin.get_file_linesPs��	,��i��t�}�=�=�=�
(���+�+�-�-��
(�
(�
(�
(�
(�
(�
(�
(�
(�
(�
(����
(�
(�
(�
(��N��!�	,�	,�	,�O�i�O�O�6:�m�O�O�O�G����w�);�q�);�);�);�;�<�<�<��G�$�$�!�+�����		,���s4�A�:�A�>�A�>�A�
B�:B�Bc���	|�|��S#t$r>}d}|�|�||����t	���d}~wwxYw)zU
        Just a wrapper around _get_user_info_inner to send errors to syslog
        z;Skipping user '{}' with bad configuration files due to '{}'N)�_get_user_info_innerr�rIr1r)r3r<rT�tpls    r�_get_user_infozDirectAdmin._get_user_info[so��
		$��,�,�X�6�6�6���	$�	$�	$�O�C����s�z�z�(�A�6�6�7�7�7�!�#�#�#�����		$���s��
A�9A�Ac	�\�tj�|j|d��}	|�|��}n	#d}YnxYw|std���t
tdddd|�����}t
tdddd|�����}	|d����	d	��d
}n#t$rtd���wxYw	|d����	d	��d
}n#t$rtd���wxYw|�||��}|d
kr5d}|j�
|��}	|�|	��rd}|}|j�
|��}
|
||fS)zG
        Return uid, package name and owner of user (reseller)
        �	user.confN�&Unable to read any data from user.conf�
usertype\=.*$Fr�zcreator\=.*$rr�r�z#No "usertype" record in user configz"No "creator" record in user configrkr��DEFAULT)r�r�r��DA_USERS_DIRr^rLr�rr�r��
IndexError�_get_user_packager+rM�_is_reseller_limits_enabled)r3r<�userprofile�userprofile_content�result_usertype�result_creator�usertyperkrh�lvp_idrRs           rr�z DirectAdmin._get_user_info_innerks��
�g�l�l�4�#4�h��L�L��	'�"&�"5�"5�k�"B�"B����	'�"&�������"�	G��E�F�F�F��t���$�!�.� 
� 
� 
�����d���$�!�.�
�
�
����	D�&�q�)�/�/�1�1�7�7��<�<�Q�?�H�H���	D�	D�	D��B�C�C�C�	D����	C�%�a�(�.�.�0�0�6�6�s�;�;�A�>�H�H���	C�	C�	C��A�B�B�B�	C�����(�(��3F�G�G���z�!�!��H��_�,�,�X�6�6�F��/�/��7�7�
$�#��#���o�%�%�h�/�/���G�X�%�%s!�>�A�3C�C)�-3D!�!D;c�6�|j�|��Sr�)�proc_lve�	exist_lvp)r3r	s  rrz'DirectAdmin._is_reseller_limits_enabled�s���}�&�&�v�.�.�.rr<r�returnc	��|sWtj�|j|d��}	|�|��}n	#d}YnxYw|std���t
tdddd|�����}t
tdddd|�����}	|d����	d	��d
}n#t$rtd���wxYw|dkrT|rR	|d����	d	��d
}n#t$rtd
���wxYw|S)z�
        Reads user's package just as in the `_get_user_info_inner` function, but without masking to DEFAULT package
        Be aware that it may return different package than the `_get_user_info_inner` function
        r�Nr�zpackage\=.*$Fr�zoriginal_package\=.*$rr�r�z"No "package" record in user config�customz+No "original_package" record in user config)r�r�r�rr^rLr�rr�r�r)r3r<rr�result_package�result_original_packagerhs       rrzDirectAdmin._get_user_package�s���
#�	K��'�,�,�t�'8�(�K�P�P�K�
+�&*�&9�&9�+�&F�&F�#�#��
+�&*�#�#�#����&�
K� �!I�J�J�J��d���$�!�.�
�
�
����#'�t�#��$�!�.�(
�(
�(
�#�#��	C�$�Q�'�-�-�/�/�5�5�c�:�:�1�=�G�G���	C�	C�	C��A�B�B�B�	C�����h���#:��
P�1�!�4�:�:�<�<�B�B�3�G�G��J�����
P�
P�
P� �!N�O�O�O�
P�����s#�A�A�3C�C+�73D+�+EFc#�4K�t|�����}tj|j��D]Z}||vr�|�||�����	|�|��\}}}n#t$rY�FwxYw|�||kr�S|||fV��[dS)a'
        Generate triple with uid, it's package, it's reseller
        :param bool debug: Do produce debug output or don't
        :param string reseller_name: filter by this reseller
        :rtype: generator of (int, string, string)
        :return: (uid, package name, reseller name)
        �r<r8N)�setr9r�r�rrUr�r)r3r8rzr9r<rRrhrks        rr{zDirectAdmin._get_user_packages�s������$�*�*�,�,�-�-���
�4�#4�5�5�	)�	)�H��;�&�&���'�'���'�G�G�O��
�)-�)<�)<�X�)F�)F�&��W�h�h��"�
�
�
���
�����(�X��-F�-F���w��(�(�(�(�(�#	)�	)s�A7�7
B�Bc�V�tj�|j|d��}tj�|��sdS|�|��}|D]c}	|�|�d����\}}}n#t$rY�<wxYwtd�
||�����d|�|��sQ	|�|��\}}}n#t$rYdSwxYwtd�
||����dSdS)z�
        Print uid and package for users of a specified reseller
        :param debug: whether to produce debug output
        :param reseller: username of a reseller
        :return: None
        z
users.listNr>r})r�r�r�r�existsr^r��rstriprrOr1r;)	r3r8rkr��reseller_usersr<rRrhr~s	         rrzDirectAdmin.list_reseller_users�sJ���w�|�|�D�-�x��F�F���w�~�~�d�#�#�	��F��,�,�T�2�2��&�	0�	0�H�
�"&�"5�"5�h�o�o�d�6K�6K�"L�"L���W�a�a��"�
�
�
���
�����'�.�.��g�.�.�/�/�/�/��}�}�X�&�&�	0�
�"&�"5�"5�h�"?�"?���W�a�a��"�
�
�
����
�����'�.�.��g�.�.�/�/�/�/�/�	0�	0s$�",B�
B�B�C3�3
D�Dc��|�||���}|r<	|�|��\}}}t|��dS#t$rYdSwxYwdS)z�
        Determine user's reseller based on package from user's config
        :param string uid: uid of user
        :param bool debug: Do produce debug output or don't
        :rtype: string
        :return: reseller name
        r�N�rUr�rOr)r3rRr8r<r~rks      rr�zDirectAdmin.get_reseller	s����+�+��5�+�A�A���	 �
 �!%�!4�!4�X�!>�!>���1�h��h�������#�
�
�
����
����	 �	 ��A�
A�Ac�,�|�|��S)z�
        Check login_name is da admin. Backward compatibility wrapper
        :param login_name: Admin name
        :return:
        )r;)r3�
login_names  r�is_da_adminzDirectAdmin.is_da_admins���}�}�Z�(�(�(rc	�z�d}tj�|j|d��}tj�|��rs|�|��}t
tdddd|�����}|r;|d����	d��d}|dkrd	}|S)
z�
        Check login_name is da admin for using in hook

        return True - if login_name is admin
               False - otherwise
        Fr�r�r�rr�r��adminT)
r�r�r�rr�r^r�rr�r�)r3rr�r�r�rrs       r�is_da_admin_for_hookz DirectAdmin.is_da_admin_for_hook"s������w�|�|�D�-�z�;�G�G��
�7�>�>�$���	"��.�.�t�4�4�L�"�4��"�#(� %�+�$�$�$���O��
"�*�1�-�3�3�5�5�;�;�C�@�@��C���w�&�&�!�F��
rc�B�	ddlm}m}m}m}n3#t
$r&t
d��tjd��YnwxYw|�	��}|D]F}	t|���#|||f$r)}t
dt|��z��Yd}~�?d}~wwxYwdS)z�
        Add all DA admins to sudoers. Now calls only from CageFS plugin installer
        :param s_cmd: String such as "Clsudo.add_cagefs_user(user)"
        :return:
        r)�Clsudo�
NoSuchUser�UnableToReadFile�UnableToWriteFilezDCannot import Clsudo. Check if alt-python27-cllib package installed
r�z%s
N)�clsudor#r$r%r&�ImportErrorrOr?r�r9�eval�str)	r3�s_cmdr#r$r%r&�	da_adminsr�rTs	         r�add_all_da_admins_to_sudoersz(DirectAdmin.add_all_da_admins_to_sudoers@s���	�
Y�X�X�X�X�X�X�X�X�X�X�X�X���	�	�	��Z�[�[�[��H�Q�K�K�K�K�K�	�����$�$�&�&�	��	)�	)�D�
)��U������� 0�2C�D�
)�
)�
)��f��A���'�(�(�(�(�(�(�(�(�����
)����	)�	)s$��-?�?�A+�+B�3B�Bc�,�|�|��S)z<
           Wrapper for compatibility with old code
        )r9r7s  r�get_all_da_adminszDirectAdmin.get_all_da_adminsTs������&�&�&rc��g}tj�|j��r&|�|j��}d�|D��}|S)zr
        Get all DA admins list

        :rtype: list of strings
        :return: List of DA admins names
        c�8�g|]}|�d����S)r>�r�r�r�s  rr�z+DirectAdmin.list_admins.<locals>.<listcomp>ds$��D�D�D�t����T�*�*�D�D�Dr)r�r�r��
DA_ADMIN_LISTr^)r3r8r,r�s    rr9zDirectAdmin.list_adminsZsR���	�
�7�>�>�$�,�-�-�	E��.�.�t�/A�B�B�L�D�D�|�D�D�D�I��rc#�vK�|�|j��}|D]}|�d��V��dS�Nr>)r^�DA_ADMINS_PACKAGESr)r3r�r�s   rr�zDirectAdmin._get_packagesgsP�����*�*�4�+B�C�C�� �	$�	$�D��+�+�d�#�#�#�#�#�#�	$�	$rc�R�|���D]}t|���dSr�)r�rO)r3r8r�s   rrqzDirectAdmin.list_packagesls4���&�&�(�(�	�	�D��$�K�K�K�K�	�	rc�\�|���D]\}}}t||���dSr�r�)r3r8rRrhr~s     rrfzDirectAdmin.list_allps@��#�6�6�8�8�	 �	 �O�C��!��#�w�����	 �	 rc��|���D]*\}}}tt|���d|�d|�����+dSr�)r{rOr*)r3r8rRrhrks     rrxzDirectAdmin.list_userstsV��&*�&=�&=�&?�&?�	>�	>�"�C��(���C�����'�'�'�8�8�<�=�=�=�=�	>�	>rc��|�||���}|r<	|�|��\}}}t|��dS#t$rYdSwxYwdS)Nr�r)r3rRr8r<r~rhs      rrozDirectAdmin.list_user_packagexs���+�+��5�+�A�A���	�
� $� 3� 3�H� =� =�
��7�A��g�������#�
�
�
����
����	�	rc�j�|�d���D]\}}}||krt|���dS)Nr�r�r�)r3rhr8rR�package_rks      rriz!DirectAdmin.list_users_in_package�sL���'�'�b�'�9�9�	�	�#�C��8��7�"�"��c�
�
�
��	�	rc�j�|�|���D]\}}}||krt|���dS)Nr�r�)r3rhrkr8rRr=s      rrlz*DirectAdmin.list_users_in_reseller_package�sL���'�'�h�'�?�?�	�	�#�C��8��7�"�"��c�
�
�
��	�	rc� �g}tj�|j��r&|�|j��}d�|D��}|�|�����tt|����S)z0
        Return list of resellers names
        c�^�g|]*}|����|�����+Srr2r�s  rr�z.DirectAdmin._get_resellers.<locals>.<listcomp>�s-��M�M�M�Q�!�(�(�*�*�M�a�h�h�j�j�M�M�Mr)	r�r�r��DA_RESELLERS_LISTr^�extendr9r�r)r3�resellers_listr�s   rr�zDirectAdmin._get_resellers�s�����
�7�>�>�$�0�1�1�	N��.�.�t�/E�F�F�L�M�M�,�M�M�M�N����d�.�.�0�0�1�1�1��C��'�'�(�(�(rc���g}tj�|j|d��}tj�|��r!|�|��}d�|D��}|S)z�
        Get all packages for giver reseller

        :param string reseller: Reseller name
        :rtype: list of strings
        :return: List of packages names that belongs to given reseller
        z
packages.listc�^�g|]*}|����|�����+Srr2r�s  rr�z6DirectAdmin._get_reseller_packages.<locals>.<listcomp>�s-��L�L�L�A������L�Q�X�X�Z�Z�L�L�Lr)r�r�r�rr�r^)r3rk�
packages_list�package_pathr�s     r�_get_reseller_packagesz"DirectAdmin._get_reseller_packages�sf���
��w�|�|�D�$5�x��Q�Q��
�7�>�>�,�'�'�	M��.�.�|�<�<�L�L�L��L�L�L�M��rc��d}|���D]n}	|�|��}n#t$r}|�|}Yd}~�,d}~wwxYwtj|fd�|d�����}t
|���o|�|�dS)Nc�0�d�|||��S)Nz{}{} {}
)r1)r��pkg�ress   r�<lambda>z5DirectAdmin.list_resellers_packages.<locals>.<lambda>�s��+�2D�2D�V�S�RU�2V�2V�rr�)r�rHr��	functools�reducer�rO)r3r8�first_exceptionrk�packagesrT�
out_strings       rrsz#DirectAdmin.list_resellers_packages�s������+�+�-�-�	�	�H�
��6�6�x�@�@�����
�
�
�"�*�&'�O����������
����#�)�(0�V�V�V������e�g�g�	
�

�*������&�!�!�'�&s�0�
A�A�Ac�p�td�|�|������dSr6)rOr�rHrus   rrvz"DirectAdmin.list_reseller_packages�s0��
�d�i�i��3�3�H�=�=�>�>�?�?�?�?�?rr�r�r�)*rrrr�DA_CONFr4rAr7r�r�r+rrr4r^r�r�rr*rrrr{rr�rr!r-r/r9r�rqrfrxrorirlr�rHrsrvr�r�s@rr r >sJ�������7�L�<�G�B�M�I��J���H��H��J��w�y�y�H�>�>�>�>�>�	,�	,�	,�$�$�$� 8&�8&�8&�t/�/�/�'�'�#�'�H�T�RU�Y�DW�'�cf�'�'�'�'�R)�)�)�)�80�0�0�0�8 � � � �")�)�)����<)�)�)�('�'�'�'�����$�$�$�
���� � � � �>�>�>�>�������������	)�	)�	)�
�
�
�"�"�"�"�(@�@�@�@�@�@�@�@rr c��eZdZd�ZdS)�ISPManagerGetPackagesExceptionc�<�t�||��dSr�)r�r4)r3r�s  rr4z'ISPManagerGetPackagesException.__init__�s�����4��)�)�)�)�)rN)rrrr4rrrrVrV�s#������*�*�*�*�*rrVc�p��eZdZdZdZdZ�fd�Zd�Zed
d���Z	d
d�Z
d
d	�Zd
d
�Zd
d�Z
d
d�Z�xZS)rz!/usr/local/ispmgr/etc/ispmgr.confN�	mgrsecurec�N��tt|�����tj��tj�d��}t|d��|_tj	��|_
tj��|_
dS)Nr�r)r�rr4r"�getCP�
CP_VERSIONr�rQ�
isp_major_ver�ispmanager5_is_master�isp5_is_masterrr�r2)r3�	ver_partsr,s  �rr4zISPManager.__init__�s|���
�j�$���(�(�*�*�*�������%�+�+�C�0�0�	� ��1��.�.���$�:�<�<���&�2�4�4����rc	���i}|jdk�r�tj�|j��std|jz���	t
|jd�����}|�d��}|�	d��|D�]}|���d}t|j�|�
dd������}|�d��}|D]�}|����d	��rvd
�|������dd���}||vr||d
zt#|��z||<��t#|��||<����n�#t$t&f$r,}td
|j�dt#|�������d}~wwxYwddl}	|�|j��j}	|	D]7}
	|j�|
��}d||<�##t0j$rY�4wxYwn#t4$rYnwxYw|S)z�
        Retrives list of pairs "uid - package"
        :return: Dictionary: uid -> package_name
            Example: {512: 'custom', 513: 'test1'}
         Case 2: (Error): (1, "error message")
        �zERROR: Can't read %srX�Accountr�"r�r>�Presetr�r�NzERROR: Can't read z - �default)r]r�r�r��	ISP4_CONFrVrY�readr��poprQr+rM�replacer�r�r�r*�OSError�IOError�grp�getgrnam�ISP5_GRP�gr_memr	rN�KeyError)r3�dict_uid_package�linesr�rR�line1�pkg_namerTrm�panel_usersr�s           r�_get_user_packages_dictz"ISPManager._get_user_packages_dict�s��������"�"��7�>�>�$�.�1�1�
^�4�5K�d�n�5\�]�]�]�
m��T�^�S�1�1�6�6�8�8�����I�.�.���	�	�!����!�
F�
F�D��*�*�,�,�q�/�C��d�o�5�5�c�k�k�$��6K�6K�L�L�M�M�C��:�:�d�+�+�D�!%�F�F�� �;�;�=�=�3�3�H�=�=�F�'*�x�x����
�
�0C�0C�0E�0E�a�b�b�0I�'J�'J�H�"�&6�6�6�8H��8M�PS�8S�VY�Zb�Vc�Vc�8c� 0�� 5� 5�8;�H�
�
� 0�� 5��
F�	
F���W�%�
m�
m�
m�4�4�TX�Tb�Tb�Tb�dg�hi�dj�dj�dj�5k�l�l�l�����
m����
�J�J�J�	
�!�l�l�4�=�9�9�@��'���D��"�o�5�5�d�;�;��09�(��-�-�� �4����������	���
�
�
���
�����sO�E$F0�0G-�'G(�(G-�5#I�H9�8I�9I�I�
I�I�
I�IFc�(�d}t|��dS)z�
        Get reseller name from user's config file

        :param string uid: uid of user
        :param bool debug: Do produce debug output or don't
        :rtype: string
        :return: reseller name
        r N)rO)�clsrRr8rks    rr�zISPManager.get_resellers����
�h�����rc��	|���}t|�����D]}t|���dS#t$r.}t|��tjd��Yd}~dSd}~wwxYw�Nr�)rwr�valuesrOrVr?r�)r3r8rrrhrTs     rrqzISPManager.list_packagess���	�#�;�;�=�=���/�6�6�8�8�9�9�
�
���g�����
�
��-�	�	�	��!�H�H�H��H�Q�K�K�K�K�K�K�K�K�K�����	���s�AA�
B�#A>�>Bc��	|���}|D]*}tt|��dz||z���+dS#t$r.}t|��t	jd��Yd}~dSd}~wwxYw)Nr�r��rwrOr*rVr?r��r3r8rrrRrTs     rrfzISPManager.list_alls���	�#�;�;�=�=��'�
>�
>���c�#�h�h��n�'7��'<�<�=�=�=�=�
>�
>��-�	�	�	��!�H�H�H��H�Q�K�K�K�K�K�K�K�K�K�����	�����AA�
A=�#A8�8A=c�0�	t|��}|���}||vrt||��dSdS#t$r.}t|��t	jd��Yd}~dSd}~wt$rtd��YdSwxYw)Nr�rK)rQrwrOrVr?r�rL)r3�s_uidr8rRrrrTs      rrozISPManager.list_user_package#s���		'��e�*�*�C�#�;�;�=�=���&�&�&��&�s�+�,�,�,�,�,�'�&��-�	�	�	��!�H�H�H��H�Q�K�K�K�K�K�K�K�K�K������	'�	'�	'��%�&�&�&�&�&�&�	'���s�<A�
B�#A5�5B�Bc��	|���}|D]*}|||krtt|�����+dS#t$r.}t|��t	jd��Yd}~dSd}~wwxYwr{r~)r3rhr8rrrRrTs      rriz ISPManager.list_users_in_package/s���	�#�;�;�=�=��'�
$�
$���.�s�3�3�3��#�c�(�(�O�O�O��
$�
$��.�	�	�	��!�H�H�H��H�Q�K�K�K�K�K�K�K�K�K�����	���r�c� �	|���}|D]:}tt|��dzt||��zdz���;dS#t$r.}t|��t	jd��Yd}~dSd}~wwxYw)Nr�z,adminr�r~rs     rrxzISPManager.list_users9s���	�#�;�;�=�=��'�
N�
N���c�#�h�h��n�s�+;�C�+@�'A�'A�A�H�L�M�M�M�M�
N�
N��-�	�	�	��!�H�H�H��H�Q�K�K�K�K�K�K�K�K�K�����	���s�AA�
B
�#B�B
r�)rrrrgr+ror4rw�classmethodr�rqrfrorirxr�r�s@rrr�s��������3�I��J��H�5�5�5�5�5�- �- �- �^�
�
�
��[�
���������
'�
'�
'�
'������������rrc����eZdZdZdZdZdZdZ�fd�Zdd�Z	dd	�Z
dd
�Zddede
fd
�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdeeeeeeffd�Zdedefd�Zdedefd�Zdd�Zdd�Z�xZS)rzz
    See following link for information about database:
    https://github.com/plesk/db-schemas/blob/master/psadb.xml
    z/etc/psa/.psa.shadow�1�NoneNc���tt|�����tj��|_dSr�)r�rr4rr�r2r�s �rr4zPlesk.__init__Ms6���
�e�T���#�#�%�%�%�!�-�/�/����rc��tj�|j��sdSt	|j��������}tjddt|��ddd���}|�
��5}|�||���cddd��S#1swxYwYdS)	NF�	localhostr �psaT�utf8)�hostr��passwd�db�use_unicode�charset)�args)r�r�r��
PSA_SHADOWrYrhr�r
�MySQLConnectorr*�connect�
execute_query)r3�sql�datar��	connectorr�s      r�fetch_data_from_dbzPlesk.fetch_data_from_dbQs����w�~�~�d�o�.�.�	��5��d�o�&�&�+�+�-�-�3�3�5�5���,�+�G�47��K�K�E�9=�v�O�O�O�	��
�
�
 �
 �	4�B��#�#�C�d�#�3�3�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4�	4����	4�	4�	4�	4�	4�	4s�B>�>C�CFc#�pK�d}|�-d�|��}|�||g��}nD|�-d�|��}|�||g��}n|�|��}|D];\}}}|p|j}|dkrdn|}|�||���}|r	|�|||fV��<dS)a
        Generate triple with uid, it's package, it's reseller

        :param bool debug: Do produce debug output or don't
        :param string reseller_name: filter by this reseller
        :param string username: filter by this username (ignored if reseller_name set)
        :rtype: generator of (int, string, string)
        :return: (uid, package name, reseller name)
        a�
            SELECT sys_user.login, template.name, reseller.login
            FROM sys_users AS sys_user
            JOIN hosting AS hosting ON hosting.sys_user_id = sys_user.id
            JOIN domains AS domain ON hosting.dom_id = domain.id AND domain.webspace_id=0
            JOIN clients AS reseller ON domain.vendor_id = reseller.id
            LEFT JOIN Subscriptions AS subscription ON subscription.object_id = domain.id AND subscription.object_type='domain'
            LEFT JOIN PlansSubscriptions AS plan ON plan.subscription_id = subscription.id
            LEFT JOIN Templates AS template ON plan.plan_id = template.id
            WHERE sys_user.mapped_to IS NULL AND (template.type = 'domain' OR template.type IS NULL)
        Nz{} AND reseller.login = %sz{} AND sys_user.login = %sr r�r)r1r��
NO_PACKAGErU)	r3r8rzr<�queryr�rhrkrRs	         rr{zPlesk._get_user_packages[s�����
���$�0�7�7��>�>�E��,�,�U�]�O�D�D�F�F�
�
!�0�7�7��>�>�E��,�,�U�X�J�?�?�F�F��,�,�U�3�3�F�-3�	/�	/�)�X�w���0���G�%��0�0�r�r�h�H��*�*�H�E�*�J�J�C��
/�C�O��G�X�.�.�.�.��	/�	/rc��dt|j���z}|�|��D]}t|d���dS)z�
        Print packages (exclude reseller's)

        :param bool debug: Do produce debug output or don't
        :return: packages names

        zs
            SELECT name
            FROM psa.Templates WHERE owner_id = %(admin_id)s AND type = 'domain';
        ��admin_idrN)�dict�ADMIN_IDr�rO)r3r8r�r�s    rrqzPlesk.list_packages�sZ����D�M�*�*�*�+��
�+�+�E�2�2�	�	�D��$�q�'�N�N�N�N�	�	rrRr8c�F�d}|j�t|����}|r^d�dgt	|��z��}d|z}|�|t
|����}|r|dd}t|dkrdn|��dS)z�
        Get reseller name from DB
        :param string uid: uid of user
        :param bool debug: Do produce debug output or don't
        :rtype: string
        :return: reseller name
        r�r�z%saJSELECT reseller.login
                FROM sys_users AS sys_user
                JOIN hosting AS hosting ON hosting.sys_user_id = sys_user.id
                JOIN domains AS domain ON hosting.dom_id = domain.id
                JOIN clients AS reseller ON domain.vendor_id = reseller.id
                WHERE sys_user.login IN (%s)rr N)r+rPrQr�r�r��tuplerO)r3rRr8rk�	usernames�format_stringsr�r�s        rr�zPlesk.get_reseller�s������O�-�-�c�#�h�h�7�7�	��
	(� �X�X�t�f�s�9�~�~�&=�>�>�N�0�
3A�A�E��,�,�U�E�)�4D�4D�E�E�F��
(�!�!�9�Q�<��
�H��'�'�b�b�X�6�6�6�6�6rc��|�|���}|D]6\}}}td�t|��|�����7dS)z�
        Print info about user's packages (include resellers)

        :param bool debug: Do produce debug output or don't
        :return: pairs "uid package", where
        uid - unique id of user
        package - name of user's package

        r��{} {}N�r{rOr1r*)r3r8r�rRrhr~s      rrfzPlesk.list_all�s_���'�'�e�'�4�4��!&�	5�	5��S�'�1��'�.�.��S���7�3�3�4�4�4�4�	5�	5rc��|�|���}|D]7\}}}td�t|��||�����8dS)aF
        Print info about user's packages (include resellers) and thouse resellers

        :param bool debug: Do produce debug output or don't
        :return: triples "uid,package,reseller", where
        uid - unique id of user
        package - name of user's package
        reseller - name of package's reseller
        r�z{},{},{}Nr�)r3r8r�rRrhrks      rrxzPlesk.list_users�sg���'�'�e�'�4�4��(-�	B�	B�$�S�'�8��*�#�#�C��H�H�g�x�@�@�A�A�A�A�	B�	Brc��g}	|j�t|����}|D]8}|�||���}|�d�|D�����9nG#t
j$r}|rt|��Yd}~n"d}~wt$rtd��YnwxYw|D]}t|���dS)z�
        Print all packages for user's uid

        :param uid: user's unique id
        :param bool debug: Do produce debug output or don't
        :return: package name for user's uid

        )r8r<c��g|]
}|d��S)r�rr3s  rr�z+Plesk.list_user_package.<locals>.<listcomp>�s�� <� <� <�T��a�� <� <� <rNrK)	r+rPrQr{rBr	rNrOrL)	r3rRr8rQ�namesr�r�rTrhs	         rrozPlesk.list_user_package�s����
	>��O�-�-�c�#�h�h�7�7�E��
>�
>���0�0�u�t�0�L�L����� <� <�V� <� <� <�=�=�=�=�
>��
�(�	�	�	��
��a��������������	'�	'�	'��%�&�&�&�&�&�	'���� �	�	�G��'�N�N�N�N�	�	s�'A'�'B+�6B�B+�*B+c���dt||j���z}|�|��D]/}t|j�|d�����0dS)z�
        Print all users in package

        :param package: name of package
        :param bool debug: Do produce debug output or don't
        :return: user's uid
        a�
        SELECT t5.login
        FROM psa.Templates AS t1
        JOIN psa.PlansSubscriptions AS t2 ON t2.plan_id = t1.id
        JOIN psa.Subscriptions AS t3 ON t3.id = t2.subscription_id
        JOIN psa.domains AS t4 ON t4.id = t3.object_id
        JOIN psa.hosting AS t6 ON t6.dom_id = t4.id
        RIGHT JOIN psa.sys_users AS t5 ON t6.sys_user_id = t5.id
        WHERE t1.name = '%(package)s' AND t1.owner_id = %(admin_id)s AND t1.type = 'domain';
        )rhr�rN)r�r�r�rOr+rM)r3rhr8r��logins     rrizPlesk.list_users_in_package�sp��	��7�T�]�;�;�;�	<���,�,�U�3�3�	5�	5�E��$�/�)�)�%��(�3�3�4�4�4�4�	5�	5rc���d|z}|�|��}t|��dkrdSt|dd��}dt||���z}|�|��}|D]l}	|j�|d��}	t
t|	�����@#tj	$r}
|rt
|
��Yd}
~
�ed}
~
wwxYwdS)z�
        Print info about users in resellers package

        :param package: package name
        :param reseller: name of package's reseller
        :param bool debug: Do produce debug output or don't
        :return: users uids

        zCSELECT id FROM psa.clients WHERE type = 'reseller' AND login = '%s'r�Nra�
            SELECT t5.login
            FROM psa.Templates AS t1
            JOIN psa.PlansSubscriptions AS t2 ON t2.plan_id = t1.id
            JOIN psa.Subscriptions AS t3 ON t3.id = t2.subscription_id
            JOIN psa.domains AS t4 ON t4.id = t3.object_id
            JOIN psa.hosting AS t6 ON t6.dom_id = t4.id
            RIGHT JOIN psa.sys_users AS t5 ON t6.sys_user_id = t5.id
            WHERE t1.type = 'domain' AND t1.name = '%(package)s' AND t1.owner_id = '%(reseller_id)s';
        )rh�reseller_id)
r�r�rQr�r+rMrOr*r	rN)r3rhrkr8�reseller_queryr�r�r�r��luidrTs           rrlz$Plesk.list_users_in_reseller_package�s��c�em�m���-�-�n�=�=���{���q� � ��F��+�a�.��+�,�,��	��7��<�<�<�	=���(�(��/�/���	!�	!�D�
!���.�.�t�A�w�7�7��
�c�$�i�i� � � � ��	�,�
�
�
����!�H�H�H����������
����	!�	!s�9 B6�6C �C�C c���dt|j���z}|�|��D]C}|d}|ddkrdn|d}td�||�����DdS)	z�
        Print list of resellers packages

        :param bool debug: Do produce debug output or don't
        :return: pairs "reseller package", where
        package - package name
        reseller - package's reseller

        z�SELECT t2.login, t1.name FROM
        (SELECT name, owner_id, type FROM psa.Templates) AS t1
        JOIN psa.clients AS t2 ON t1.owner_id = t2.id
        WHERE t1.owner_id != %(admin_id)s AND t1.type = 'domain';r�r�rr �rootr�N)r�r�r�rOr1)r3r8r�r�rhrks      rrszPlesk.list_resellers_packagess���E�HL�UY�Ub�Gc�Gc�Gc�d���+�+�E�2�2�	5�	5�D��1�g�G�!%�a��G�!3�!3�v�v��a��H��'�.�.��7�3�3�4�4�4�4�	5�	5rr
c���g}d}|�|��D]M}|d}|ddkrdn|d}|d}|�||t|��f���N|S)z�
        Return list of non-reseller packages with the plesk DB id
            [(reseller, package, plesk_id), (None, package, plesk_id)]
        z�SELECT t2.login, t1.name, t1.id FROM
        (SELECT id, name, owner_id, type FROM psa.Templates) AS t1
        JOIN psa.clients AS t2 ON t1.owner_id = t2.id
        WHERE t1.type = 'domain';r�rr r��)r��appendrQ)r3rLr�r�rhrk�_ids       r�list_domain_packages_with_idz"Plesk.list_domain_packages_with_id-s���
��%���+�+�E�2�2�	6�	6�D��1�g�G�!%�a��G�!3�!3�v�v��a��H��q�'�C��J�J��'�3�s�8�8�4�5�5�5�5��
r�
package_idc�P�d}|�||f��}|ddS)z8
        Return package name by the plesk DB id
        z7SELECT id, name, type FROM psa.Templates WHERE id = %s;rr��r�)r3r�r�r�s    r�$get_package_name_by_id_from_plesk_dbz*Plesk.get_package_name_by_id_from_plesk_db>s/��J���&�&�u�z�m�<�<���A�w�q�z�r�package_namec�P�d}|�||f��}|ddS)z8
        Return package id by the plesk DB name
        z9SELECT id, name, type FROM psa.Templates WHERE name = %s;rr�)r3r�r�r�s    r�$get_package_id_by_name_from_plesk_dbz*Plesk.get_package_id_by_name_from_plesk_dbFs/��L���&�&�u�|�o�>�>���A�w�q�z�rc���|dkrd}tjd|��sdSdt||j���z}|�|��D]}t|d���dS)z�
        Print list reseller's packages

        :param reseller: name of reseller
        :param bool debug: Do produce debug output or don't
        :return: packages names

        r�r z^[\w_]*$Nz�SELECT t1.name FROM
        (SELECT name, owner_id, type FROM psa.Templates) as t1
        JOIN psa.clients as t2 ON t1.owner_id = t2.id AND t2.login = '%(reseller)s'
        WHERE t1.type = 'domain' AND t1.owner_id != %(admin_id)s;)rkr�r)r�r�r�r�r�rO)r3rkr8r�r�s     rrvzPlesk.list_reseller_packagesNs����v����H��x��X�.�.�	��4�E�HL�U]�hl�hu�Gv�Gv�Gv�w���+�+�E�2�2�	�	�D��$�q�'�N�N�N�N�	�	rc��dgS)Nr rr7s  rr9zPlesk.list_adminsbs
���y�rr�)FNNr�)rrrrr�r�r�r+r4r�r{rqr*�boolr�rfrxrorirlrsrrrrQr�r�r�rvr9r�r�s@rrrCs����������(�J��H��J��J�0�0�0�0�0�4�4�4�4�&/�&/�&/�&/�P����"7�7��7�D�7�7�7�7�.5�5�5�5�B�B�B�B�����25�5�5�5�.!!�!!�!!�!!�F5�5�5�5�&�d�5��#���S�9P�3Q�.R�����"�s��s�����������������(�������rrc��eZdZd�ZdS)rc�p�|rtj�d��tjd��dS)Nz"Doesn't support InterWorx anymore
r)r?r@rAr�rBs   rrDzInterWorx._warninggs3���	D��J���B�C�C�C��������rN�rrrrDrrrrrfs#����������rrc��eZdZd�ZdS)r&c�&�td|z���)Nz'%s wasn't implemented for Unknown panel��NotImplementedErrorrBs   rrDzUnknown._warningns��!�"K�k�"Y�Z�Z�ZrNr�rrrr&r&ms(������[�[�[�[�[rr&c��eZdZd�ZdS)r!c�&�td|z���)Nz)%s wasn't implemented for HostingNG panelr�rBs   rrDzHostingNG._warningss��!�"M�P[�"[�\�\�\rNr�rrrr!r!rs(������]�]�]�]�]rr!)*�
__future__rr�builtinsrr�r�r?rFrN�typingrrr�clcommonr	r
�clcommon.clprocr�clcommon.utilsr�clcommon.cpapi.pluginsr
rrr�cldetectlibr"r�r�rr'�objectr)r%r rVrrrr&r!rrr�<module>r�s��&�%�%�%�%�%�&�&�&�&�&�&�������	�	�	�	�	�	�	�	�
�
�
�
�
�
�
�
�����(�(�(�(�(�(�(�(�(�(�%�%�%�%�%�%�%�%�#�#�#�#�#�#�������I�I�I�I�I�I�I�I�I�I�I�I�������	�	�	�	�	�i�	�	�	����$x4�x4�x4�x4�x4�6�x4�x4�x4�vG>�G>�G>�G>�G>�\�G>�G>�G>�TA@�A@�A@�A@�A@�,�A@�A@�A@�H*�*�*�*�*�Y�*�*�*�
y�y�y�y�y��y�y�y�x`�`�`�`�`�L�`�`�`�F	���������[�[�[�[�[�l�[�[�[�
]�]�]�]�]��]�]�]�]�]r

Hacked By AnonymousFox1.0, Coded By AnonymousFox