
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
ßœ¿jÈ:  ã               @   sü   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dlm
Z
 d dlmZ d dlmZmZmZmZmZ d dlmZmZmZmZmZmZmZ d dlZG dd	„ d	eƒZddd„Zddd„Zddd„Zddd„Zdd„ Z dd„ Z!dd„ Z"dS )é    N)Úget_cp)Úcriu_settings_malfunctions)Úlsapi_settings_malfunctions)Úliblsapi_malfunctions)Úcpanel_whmapiÚplesk_bin_php_handlerÚdump_loaded_modulesÚ
dump_lsapiÚquery_strings)Úget_da_domainsÚget_da_php_optionsÚread_da_configÚliblsapi_pathÚpretty_version_keysÚcount_domainsÚStatUtilsExceptionc               @   s   e Zd ZdS )ÚModLsapiStatExceptionN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú//usr/share/lve/modlscapi/user/mod_lsapi_stat.pyr      s   r   Fc             C   s  d}i }t ƒ }yd|jdkr8tjjdƒr2tƒ |d< qpd}n8|jdkrNtƒ |d< n"|jdkrdtƒ |d< ndj|jƒ}W n* t	k
rœ } zt
|ƒ}W Y dd}~X nX |dk	r¸tƒ |d< ||d	< t
|ƒ|d
< |jtƒ ƒ |jtƒ ƒ |jdt|d jƒ ƒiƒ t|ƒ | �rtj|dd�S |S dS )aâ  
    Return statistics data
    :param as_json: return json string if True, dict otherwise
    :return: statistics data dict(
                `controlPanel`: EA3/EA4/Plesk/DirectAdmin/Unknown CP,
                `criu`: dict(
                        `status`: running/stopped,
                        `version`: version
                    ),
                `domainStat`: dict(
                        `version`: `domains_num`,
                        ...
                    ) or dict(`error`: description) if some error occurred,
                `lsapiConf`: dict(
                        lsapi_with_connection_pool: on/off,
                        lsapi_criu: on/off
                    )
            ) or its json-packed version
    NÚcPanelz/etc/cpanel/ea4/is_ea4Z
domainStatz7mod_lsapi domains stat is currently unsupported for EA3ÚPleskÚDirectAdminz7mod_lsapi domains stat is currently unsupported for {0}ZdomainStatErrorZcontrolPanelZtotalDomainT)Z	sort_keys)r   ÚnameÚosÚpathÚexistsÚget_cpanel_ea4_statÚget_plesk_statÚget_da_statÚformatr   ÚstrÚdictÚupdateÚget_lsapi_confÚget_crui_statÚsumÚvaluesÚanalyze_malfunctionsÚjsonÚdumps)Úas_jsonÚerrorZstatsZcontrol_panelÚer   r   r   Úget"   s4    



r0   Tc             C   s`  t ƒ }t ƒ }t ƒ }�y
tdƒjdƒ}x@|D ]8}|j|jdƒtƒ ƒj|jdƒƒ |jdƒ||jdƒ< q*W tdƒjdƒ}t dd	„ |D ƒƒ}t|jƒ ƒ}	x6|jƒ D ]*\}
}|j|t ƒ ƒj	|
|j|
tƒ ƒiƒ qœW |ràt
j|||ƒ}|}x:|jƒ D ].\}}|j	t jt|	ƒjt|jƒ ƒƒtƒ ƒƒ qêW W n4 tttfk
�rR   td
jtjƒ jdƒƒƒ‚Y nX t||	| ƒS )aY  
    Collect mod_lsapi statistics for cPanel EA4 through WHM API
    :param lsapi_only: return only lsapi domains statistics if True, or full statistics if False
    :param with_selector: take into account the statistics of php selector
    :return: if lsapi_only return lsapi domains per version
                stat dict(
                    `version`: `domains_num`,
                    ...
                )
            else return full statistics per handler
                stat dict(
                    `handler`: {`version`: `domains_num`, ... }
                    ...
                )
    Zphp_get_vhost_versionsZversionsÚversionÚvhostZaccountZphp_get_handlersÚversion_handlersc             S   s    g | ]}|j d ƒ|j dƒf‘qS )r1   Zcurrent_handler)r0   )Ú.0Úhr   r   r   ú
<listcomp>t   s    z'get_cpanel_ea4_stat.<locals>.<listcomp>Ú Ú
)r$   r   r0   Ú
setdefaultÚsetÚaddÚlistÚkeysÚitemsr%   Úselector_usage_libZea4_selector_checkÚfromkeysÚ
differenceÚKeyErrorÚ	TypeErrorr   r   ÚjoinÚ	tracebackÚ
format_excÚsplitr   )Ú
lsapi_onlyÚwith_selectorZdomains_per_versionZhandlers_statZdomain_usersZvhosts_datar2   Zhandlers_datar3   Zall_versionsZverÚhandlerZs_checked_version_handlersr5   Úvr   r   r   r   Y   s*    
 &.r   c             C   s  d}d}t ƒ }y¨tdƒ}dd„ |D ƒ}x||D ]t}|jdƒ}dj|jdƒjd	ƒd
d… ƒ}	tdd„ td|d�D ƒƒ}
d|krŒd}|j|	d�}n|j|	d�}|
||< q,W |r´tj||ƒ}W n8 t	t
tttjfk
rî   tdjtjƒ jdƒƒƒ‚Y nX ddd„ |jƒ D ƒi}| �r|d S |S )a  
    Collect mod_lsapi statistics for Plesk
    Collects lsapi domains ONLY
    :param lsapi_only: return only lsapi domains statistics if True, or full statistics if False
    :param with_selector: take into account the statistics of php selector
    :return: if lsapi_only return lsapi domains per version dict(
                    `version`: `domains_num`
                    ...
                )
            else return stats with handler dict(
                    `lsapi`: {`version`: `domains_num`, ... }
                )
    z
alt-php{v}z	alt-php56r<   c             S   s   g | ]}d |j dƒkr|‘qS )ZlsphpÚid)r0   )r4   r5   r   r   r   r6   ž   s    z"get_plesk_stat.<locals>.<listcomp>rL   r7   ZfullVersionÚ.Né   c             S   s   g | ]}|j d ƒ‘qS )Údomain)r0   )r4   Údr   r   r   r6   ¢   s    z	get-usage)rL   Zcustom)rK   r8   Zlsapic             S   s   i | ]\}}t |ƒ|“qS r   )Úlen)r4   ÚkrK   r   r   r   ú
<dictcomp>±   s    z"get_plesk_stat.<locals>.<dictcomp>éÿÿÿÿ)r$   r   r0   rD   rG   r:   r"   r?   Zplesk_selector_checkrB   rC   ÚAttributeErrorr   ZSelectorStatExceptionr   rE   rF   r>   )rH   rI   Zhandler_tmplZcustom_versionZdomain_version_statZall_handlersZlsphp_handlersrJ   Z
handler_idZphp_versionÚdomainsZ
version_idZresult_statr   r   r   r    Š   s*    

r    c                s   d}t ƒ }�yÌtƒ }|d d }|d d }|d d }|d d }t|ƒ}	t|ƒ}
tƒ }tƒ ‰ ‡ fdd„|jƒ D ƒ |dkr–|	ˆ i}|	ˆ i||< �n|dkr´|
ˆ i}|
ˆ i||< nø|	tƒ |
tƒ i}x–|jƒ D ]Š\}}x€|D ]x}|j||d	�}y<t|ƒ\}}|j	|d
ƒ}t|| d ƒ}|j
|ƒj|ƒ W qÜ tjk
�rR   |j
|	ƒj|ƒ Y qÜX qÜW qÎW ||k�r€|	||	 |
||
 i||< n,|	||	 |
tƒ i||< |
||
 |	tƒ i||< |�rÖtj|j
|	ƒ||	ƒ}|j
|ƒj|ƒ W n6 ttttfk
�r   tdjtjƒ jdƒƒƒ‚Y nX t||	|
g| ƒS )aN  
    Collect lsapi domains statistics fro DirectAdmin
    :param lsapi_only: return only lsapi domains statistics if True, or full statistics if False
    :param with_selector: take into account the statistics of php selector
    :return: if lsapi_only return lsapi domains per version
                stat dict(
                    `version`: `domains_num`,
                    ...
                )
            else return full statistics per handler
                stat dict(
                    `handler`: {`version`: `domains_num`, ... }
                    ...
                )
    z>/usr/local/directadmin/data/users/{user}/domains/{domain}.confrN   r1   é   rJ   c                s   g | ]}ˆ j |ƒ‘qS r   )r%   )r4   rK   )Újoinedr   r   r6   Ö   s    zget_da_stat.<locals>.<listcomp>Úno)ÚuserrO   Zphp1_selectr7   r8   )r$   r   r   r   r:   r)   r>   r"   r   Zgetintr0   r;   ÚconfigparserZNoOptionErrorr?   Zda_selector_checkr%   rB   rC   rU   r   r   rD   rE   rF   rG   r   )rH   rI   Zdomain_conf_pathZhandler_statZphp_optionsZphp1_verZphp2_verZphp1_handlerZphp2_handlerZ
php1_labelZ
php2_labelZuser_domainsZversion_statrZ   rV   rO   Zconfig_pathZconf_parserZglobal_sectionZphp_settingr1   Zselector_updatedr   )rX   r   r!   ¶   sV    

r!   c              C   sn   dj tjdƒƒ} y"tjdddgtjtjd� d}W n tjk
rL   d}Y nX d|| rd| jd	ƒd
 nddœiS )zÆ
    Get criu service info
    :return: dict(
                `criu`: dict(
                    `status`: running/stopped,
                    `version`: version
                )
            )
    r7   z/usr/sbin/criu -Vz/sbin/serviceÚcriuÚstatus)ÚstdoutÚstderrZrunningÚstoppedú rN   znot installed)r]   r1   )rD   Úexec_commandÚ
subprocessZ
check_callZDEVNULLZCalledProcessErrorrG   )Zcriu_versionZcriu_service_statusr   r   r   r'     s    

r'   c              C   sT   t ƒ } tƒ }|jddƒ}| jddƒ| jddƒdœ| jddƒttƒ dƒ|sLd	nd
dœS )al  
    Retrieve lsapi configuration:
    - crui
    - connection pool
    and versions of module and library
    :return: dict(
                lsapiConf: dict(
                    lsapi_with_connection_pool: on/off,
                    lsapi_criu: on/off
                ),
                modVersion: version,
                libVersion: version
            )
    Zlsapi_moduleNÚ
lsapi_criuZoffÚlsapi_with_connection_pool)rd   re   r1   Zliblsapi_versionZdisabledZenabled)Ú	lsapiConfZ
modVersionÚ
libVersionÚ	modStatus)r	   r   r0   r
   r   )Zapache_confZapache_modulesZ
mod_statusr   r   r   r&     s    


r&   c                st   t ƒ ‰ ‡ fdd„}dj| d d | d d d�}| d	 }|t| d
 ƒ |t|ƒ |t|ƒ ˆ sbdS | jdˆ iƒ dS )z÷
    Detect configuration malfunctions and update resulting statistics dict accordingly
    For now only criu malfunctions are presented
    See malfunctions in dashboard_malfunctions.py module
    :param stats_dict: resulting statistics dict
    c                s,   yˆ j | | ƒ W n tk
r&   Y nX d S )N)ÚappendrB   )Zmalfunc_dictÚkey)Úmalfunctionsr   r   Úadd_malfunctionH  s    z-analyze_malfunctions.<locals>.add_malfunctionz{opt}_{serv}rf   rd   r\   r]   )ÚoptZservrh   rg   Nrk   )r<   r"   r   r   r   r%   )Z
stats_dictrl   Zcriu_settingsZlsapi_settingsr   )rk   r   r*   ?  s    

r*   )F)TT)TT)TT)#r   r+   rE   rc   r[   rb   Úlve_diagnosticr   Zdashboard_malfunctionsr   r   r   Ú
stat_utilsr   r   r   r	   r
   r   r   r   r   r   r   r   r?   Ú	Exceptionr   r0   r   r    r!   r'   r&   r*   r   r   r   r   Ú<module>   s(   $
7
1
,
O 