%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /opt/alt/python37/lib/python3.7/site-packages/lvestats/lib/commons/__pycache__/
Upload File :
Create Path :
Current File : //opt/alt/python37/lib/python3.7/site-packages/lvestats/lib/commons/__pycache__/func.cpython-37.pyc

B

��1b';�@snddlmZddlmZmZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlm
Z
mZddlmZddlmZmZddlmZddlmZdd	lmZdd
lmZddlmZmZmZddl m!Z!m"Z"dd
l#m$Z%ddl&m'Z(ddl)m*Z*ddl+m,Z,m-Z-da.dZ/dZ0dZ1dd�Z2dd�Z3dd�Z4d^dd�Z5Gdd�de6�Z7e/fdd �Z8d_d!d"�Z9d#d$�Z:d%d&�Z;Gd'd(�d(e�Z<d)d*�Z=d+d,�Z>d`d.d/�Z?dad0d1�Z@d2d3�ZAd4d5�ZBdbd7d8�ZCdcd9d:�ZDd;d<�ZEddd=d>�ZFded?d@�ZGdfdAdB�ZHdgdCdD�ZIdEdF�ZJdGdH�ZKdIdJ�ZLGdKdL�dLeM�ZNdMdN�ZOdOdP�ZPdQdR�ZQdSdT�ZRdUdV�ZSdhdWdX�ZTdYdZ�ZUeVeWd[�d\d]�ZXdS)i�)�absolute_import)�range�mapN)�gethostname�error)�urlparse)�minidom�DOMException)�
ExpatError)�FormattedException)�cpapi)�LIMIT_LVP_ID)�CPAPIExternalProgramFailed�NotSupported�ParsingError)�
MySQLGovernor�MySQLGovException)�engine)�mkdir)�uid_max)�get_max_lve_id�USER_NOTIFICATIONS_OFF_MARKERz/proc/lve/listz"/var/run/mysql-governor-config.xmlz!/etc/container/mysql-governor.xmlcCstdkrt�atS)z'
    Get current maximum of LVE ID
    N)�
MAX_LVE_IDr�rr�J/opt/alt/python37/lib/python3.7/site-packages/lvestats/lib/commons/func.py�get_current_max_lve_id&srcCsx|r|||}}qW|S)Nr)�a�brrr�gcd0srcGs"t�}x|D]}|�|�qW|S)z�
    >>> merge_dicts({1: 2}, {3: 4})
    {1: 2, 3: 4}
    >>> merge_dicts({1: '1', 2: '2'}, {2: 'two', 3: 'three'})
    {1: '1', 2: 'two', 3: 'three'}
    )�dict�update)ZdictsZ
dic_mergedZdic_rrr�merge_dicts7s
r!��ccs0x*tdt|�|�D]}||||�VqWdS)zS
    :type chunk_length: int
    :type _list: list
    :rtype: Generator[list]
    rN)r�len)Z_listZchunk_length�irrr�
get_chunksDsr%c@seZdZddd�ZdS)�LVEVersionError�cCst�|d�|��dS)NzCan't detect LVE version; {})�	Exception�__init__�format)�self�messagerrrr)OszLVEVersionError.__init__N)r')�__name__�
__module__�__qualname__r)rrrrr&Nsr&cCs�ybt|d��N}|�d�}yt|�d�d�Stttfk
rTtd�||���YnXWdQRXWn.t	t
fk
r�}zt|��Wdd}~XYnXdS)z0
    :param str _lve_file:
    :return int:
    �r��:rz$error parsing line '{}' from file {}N)�open�read�int�split�	TypeError�
IndexError�
ValueErrorr&r*�OSError�IOError)Z	_lve_fileZlve_file_streamZlve_ver_str�errr�get_lve_versionSs
$r=cCs8|pt�}y|��}Wntk
r.d}YnX|p6dS)a
    Parse governor config file and return governor mode
    :type governor: MySQLGovernor
    :rtype: str
    :return:
        if file exists and correct: "on", "single", "off", "abusers" or "all"
        if governor is not installed or error occurs: "none"
    NZnone)r�get_governor_moder)ZgovernorZ
governor_moderrrr>cs	

r>cCs*tj�d�sdStj�t�r"t}nt}|S)z
    :rtype: str|None
    z/usr/sbin/db_governorN)�os�path�exists�GOVERNOR_CONFIG�GOVERNOR_CONFIG_OLD)�governor_config_pathrrr�get_governor_config_pathtsrEc
Cs�t�}|dkrdSybt�|�}xR|�d�D]D}y(|jdj|krT|jdj��dkSWq*tk
rlw*Yq*Xq*WWntt	t
fk
r�dSXdS)z3
    :rtype: bool|None
    :type username: str
    N�user�name�mode�ignoreF)rEr�parseZgetElementsByTagNameZ
attributes�value�lower�KeyErrorr;r
r	)�usernamerDZgovernor_configrFrrr�get_governor_ignore_for_user�s
rOc@seZdZdS)�DomainExceptionN)r-r.r/rrrrrP�srPcCst�}|��S)z/
    :rtype: (str, MySQLGovException|None)
    )r�get_governor_status)Zmysql_governorrrrrQ�srQc
Cs,y
t�|�Stttfk
r&t�SXdS)z�
    Get dict[user, domain], empty if cannot obtain.
    :param reseller_name: reseller's name
    :rtype: dict[str, str|None]
    N)rZreseller_domainsrr�AttributeErrorr)Z
reseller_namerrr�get_reseller_domains�s
rSTc
Cs`yt�||�}WnFttttjjtjjtfk
rV}z|rFt	t
|���gSd}~XYnX|SdS)z�
    Get list of aliases for specified user's domain, or empty list.
    :type username: str
    :type domain: str
    :type raise_exception: bool
    :raises DomainException: if cannot obtain domains
    :rtype: list[str]|None
    N)rZuseraliasesrMr;r7�cpapiexceptionsr�NoPanelUserrrP�str)rN�domain�raise_exceptionZuser_aliasesr<rrr�get_aliases�s	rYc
Cshyt�|�}WnFttttjjtjjtfk
rT}z|rDt	t
|���gSd}~XYnXdd�|D�SdS)z�
    Get list of domains for specified user, or None.
    :type username: str
    :type raise_exception: bool
    :raises DomainException: if cannot obtain domains
    :rtype: list[str]|None
    NcSsg|]}|d�qS)rr)�.0rWrrr�
<listcomp>�szget_domains.<locals>.<listcomp>)rZuserdomainsrMr;r7rTrrUrrPrV)rNrX�user_domainsr<rrr�get_domains�sr]cCs t|�}t|�dkrdS|dS)z�
    :param username: user name string
    :return:
        if not supported in CP, or domain name is not set: None
        if we can find it: domain name string
    :rtype: str|None
    :type username: str
    rN)r]r#)rNr\rrr�
get_domain�s	r^cCs,|��}|�d�|�d|�|��dS)zP
    Create database
    :param db_engine:
    :param db_name:
    :return:
    �COMMITzCREATE DATABASE %sN)�connect�execute�close)�	db_engine�db_name�connrrr�
init_database�s
rf�
tmp_unittest_cCs&|tt���dd�}t||�|S)z�
    Create database with random prefix in name
    Using for unittests
    :param db_engine:
    :param str prefix:
    :return str:
    r�)rV�uuidZuuid4rf)rc�prefixrdrrr�init_database_rnd�s
rkc	Cs4t|�}|jdd�}|�r0|jdkr4t�|�dSt�|jd|j�}|��}|r�d|j	kr�|�
d|�|�
d���d	d	}tt
t|�d
���ddgkr�|�
d
|�n|�
d|�nL|�rd|j	k�r|�
d�}x.|��D]"}|d|kr�|�
d|d	�q�W|�
d�|�
d|�|��dSdS)z�
    Drop database (support MySQL and PostgresSQL)
    :param uri:
    :param force: kill all connection and locked session before drop database
    :return:
    �NZsqliteTz://Z
postgresqlzBUPDATE pg_database SET datallowconn = 'false' where datname = '%s'zSHOW server_versionr�.�	�zOSELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname = '%s'zKSELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '%s'ZmysqlzSHOW PROCESSLIST�zKILL %sr_zDROP DATABASE %s)rr@�schemer?�unlink�sqlalchemy_engineZ
create_engineZnetlocr`rGraZfetchall�listrr5r6rb)	Zuri�forceZuri_rdrcreZpg_verZcursorZfetchedrrr�
drop_databases.



rvc	Cs0d}tj�|�sdSt|��
}|��SQRXdS)Nz/etc/redhat-releaser')r?r@rAr3�readline)r@Zrelease_filerrr�
_release_line's

rxc	Cs�|dkrt�}|��}d|kr.|�d�d}nt�S||}t�}x:|�d�D],}y|�t|��WqNtk
rxYqNXqNW|S)a�
    Return CloudLinux version as list [major, minor]
    or [] if can't obtain version
    :param str release_line:
    :return list: splited version
    >>> cl_ver('CloudLinux Server release 5.11 (Vladislav Volkov)')
    [5, 11]
    >>> cl_ver('CloudLinux Server release 6.8 (Oleg Makarov)')
    [6, 8]
    >>> cl_ver('CloudLinux release 7.2 (Valeri Kubasov)')
    [7, 2]
    >>> cl_ver('Incorrect release line')
    []
    N�releaserlrm)rxr6�indexrt�appendr5r9)Zrelease_lineZrelease_line_splitedZver_indxZver_strZver�srrr�cl_ver/s
r}cstjdd�}�fdd�|D�S)N)�cplogin�reseller)Zkeylscsg|]\}}�|kr|�qSrr)rZr~Z	reseller_)rrrr[Qsz#_reseller_users.<locals>.<listcomp>)rZcpinfo)rZcplogin_reseller_r)rr�_reseller_usersOsr�cCs4ttdt�}y||�Stjjk
r.t�SXdS)N�reseller_users)�getattrrr�rTZCPAPIExceptionrt)rr�rrr�get_users_for_resellerTs
r�c	Cs2t|d��t�||�WdQRXt�|d�dS)z�
    The equivalent console touch command
    :param str fname: path to file
    :param None| tuple times: (atime, mtime) if None atime and mtime are default
    rNi�)r3r?�utime�chmod)�fname�timesrrr�touch\sr�cs�fdd�}t||�dS)z2
    :type data: list
    :type filename: str
    cst�|�}|���dS)z:type csv_file: fileN)�csv�writerZ	writerows)Zcsv_filer�)�datarr�	csv_writels
z#atomic_write_csv.<locals>.csv_writeN)�
_atomic_write)�filenamer�r�r)r�r�atomic_write_csvgsr�cs�fdd�}t||�dS)z1
    :type data: str
    :type filename: str
    cs|���dS)z:type str_file: fileN)�write)Zstr_file)r�rr�	str_writexsz#atomic_write_str.<locals>.str_writeN)r�)r�r�r�r)r�r�atomic_write_strssr�cCsH|d}t|d�}||�|��t�|���|��t�||�dS)zF
    :type write_function: (file) -> None
    :type filename: str
    z.tmp�wN)r3�flushr?�fsync�filenorb�rename)r�Zwrite_functionZtemporary_filename�frrrr�~s
r�c@s2eZdZd
dd�Zedd��Zdd�Zdd	�ZdS)�reboot_lockNcCs>||_|dkrt��|_n||_t�|jtjtjBd�|_dS)Ni�)	�timeoutr��_build_lock_filenamer�r?r3�O_WRONLY�O_CREAT�lock)r+r�r�rrrr)�s
zreboot_lock.__init__cCs&d}tj�|�st|�tj�|d�S)Nz/var/lvez
lvestats.lock)r?r@rA�mkdir_p�join)Z
lock_file_dirrrrr��sz reboot_lock._build_lock_filenamec
Cs�t��}x|yt�|jtjtjB�dStk
r�}z>|jtjkrF�n*|j	dk	rft��||j	krfdSt�
d�Wdd}~XYq
Xq
WdS)Ng�������?)�time�fcntl�flockr�ZLOCK_EXZLOCK_NBr;�errnoZEAGAINr��sleep)r+Z
start_timer<rrr�	__enter__�szreboot_lock.__enter__cCs>t�|jtj�t�|j�yt�|j�WnYnXdS)N)r�r�r�ZLOCK_UNr?rbrrr�)r+�typerK�	tracebackrrr�__exit__�szreboot_lock.__exit__)NN)r-r.r/r)�staticmethodr�r�r�rrrrr��s
r�cCst�t���dS)zJ
    Get current user's username based on os.getuid()
    :rtype: str
    r)�pwd�getpwuidr?�getuidrrrr�getuser�sr�cCs(|t�kr |tkr |t�dfS|dfS)z�
    Extract container_id and bool(is_reseller) from serialized value;
    :type serialized_value: int 
    :rtype: tuple[int, bool]
    TF)rr
)Zserialized_valuerrr�deserialize_lve_id�sr�cCs|tkr|dkrt�|S|S)zo
    Get serialized int by lvp_id and lve_id
    :type lvp_id: int 
    :type lve_id: int 
    :rtype: int
    r)r
r)Zlve_idZlvp_idrrr�serialize_lve_id�s
r�cCs(y
t�}Wntk
r"d}YnX|S)zf
    Get hostname using socket.gethostname;
    Return 'N/A' if some error happens;
    :return: 
    zN/A)r�SocketError)Zhostnamerrr�get_hostname�s


r�cCs
|t�kS)zZ
    Returns is user should be skipped due to set max uid
    :param user_id: user id
    )r)Zuser_idrrr�skip_user_by_maxuid�sr�cCsLt|dd�}g}|r<x&|D]}t||dd�}|r||7}qWtt||��S)z4
    Returns ALL user domains: main/sub/aliases
    F)rX)r]rYrt�set)rNZinclude_aliasesZdomains�aliasesrW�aliasrrr�get_all_user_domains�s
r�cCs|�d�r|dd�}|S)z+
    Cuts extra prefix www from domain
    zwww.�N)�
startswith)rWrrr�normalize_domain�s
r�)rF�returncCs"tj�tj�t�|�jdt��S)zL
    Checks if notifications are turned off by user: marker file exists
    z	.lvestats)r?r@rAr�r��getpwnam�pw_dirr)rFrrr�user_should_be_notifiedsr�)r")N)T)T)rg)T)N)N)N)N)T)YZ
__future__r�builtinsrrr�r?r�rir�r�r�Z_socketrrr�Zurllib.parserZxml.domrr	Zxml.parsers.expatr
ZclcommonrrZclcommon.clprocr
Zclcommon.cpapi.cpapiexceptionsrrrZclcommon.librrZ
sqlalchemyrrsZclcommon.clcaptainrr�Zclcommon.clfuncrZlvestats.lib.configrrrZLVE_FILErBrCrrr!r%r(r&r=r>rErOrPrQrSrYr]r^rfrkrvrxr}r�r�r�r�r�r��objectr�r�r�r�r�r�r�r�rV�boolr�rrrr�<module>sx







&
 


)


	

Zerion Mini Shell 1.0