
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!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
Z
G dd„ deƒZdd„ Zdd	„ Zd
d„ Zdd„ 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)d d!„Zd*d#d$„ZdS )+é    N)ÚStringIO)Úquotec               @   s   e Zd ZdS )ÚStatUtilsExceptionN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú+/usr/share/lve/modlscapi/user/stat_utils.pyr      s   r   c             K   sž   dj dd„ |jƒ D ƒƒ}tjdj| |d�ƒ}ytjdj |ƒƒ}W n, tk
rl   tdj| |dj |ƒƒƒ‚Y nX y|d S  tk
r˜   td	j|ƒƒ‚Y nX d
S )z�
    Perform cPanel WHM API console request and return data from result
    :param cmd: whm api command
    :return: data dict from result
    ú c             S   s    g | ]\}}t d j||ƒƒ‘qS )z{0}={1})r   Úformat)Ú.0ÚkÚvr   r   r	   ú
<listcomp>$   s    z!cpanel_whmapi.<locals>.<listcomp>z*/usr/sbin/whmapi1 {cmd} {kw} --output json)ÚcmdÚkwÚ z>Failed to get JSON from this API request: {0} {1}; output: {2}Údataz,Failed to get data from this API result: {0}N)	ÚjoinÚitemsÚexec_commandr   ÚjsonÚloadsÚ
ValueErrorr   ÚKeyError)r   ÚkwargsÚjoined_kwargsÚresultZdict_resultr   r   r	   Úcpanel_whmapi   s    r   c             K   sn   dj dd„ |jƒ D ƒƒ}tjdj| |d�ƒ}ytjdj |ƒƒS  tk
rh   tdj| |dj |ƒƒƒ‚Y nX dS )	zŠ
    Perform Plesk php_handler utility console request and return result
    :param cmd: php_handler command
    :return: dict result
    r
   c             S   s    g | ]\}}d j |t|ƒƒ‘qS )z-{0} {1})r   r   )r   r   r   r   r   r	   r   =   s    z)plesk_bin_php_handler.<locals>.<listcomp>z6/usr/local/psa/bin/php_handler --{cmd} {kw} -json true)r   r   r   zJFailed to get JSON from this API request: php_handler {0} {1}; output: {2}N)r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r	   Úplesk_bin_php_handler6   s    

r   c              C   sœ   d} d}t j| ƒ}tj|ƒ}yJxD|D ]<}t|j|d�dƒ� }tdd„ |jƒ D ƒƒ||< W dQ R X q$W W n0 tt	fk
r–   t
djtjƒ jd	ƒƒƒ‚Y nX |S )
ze
    Get domains per user
    :return: dict(
                user: list of domains
            )
    z!/usr/local/directadmin/data/usersz5/usr/local/directadmin/data/users/{user}/domains.list)ÚuserÚrc             S   s   g | ]}|j ƒ ‘qS r   )Ústrip)r   Úlr   r   r	   r   X   s    z"get_da_domains.<locals>.<listcomp>Nr   Ú
)ÚosÚlistdirÚdictÚfromkeysÚopenr   ÚsetÚ	readlinesÚOSErrorÚIOErrorr   r   Ú	tracebackÚ
format_excÚsplit)Zda_users_pathZda_domains_pathZda_usersÚdomainsr    Zdomains_list_filer   r   r	   Úget_da_domainsI   s    


,r2   c              C   s¨   d} y@t | ƒ\}}|j|dƒ}|j|dƒ}|j|dƒ}|j|dƒ}W n4 tjk
rx   tdjdjtjƒ j	dƒƒƒƒ‚Y nX ||d	krˆd
n|dœ||d	krœd
n|dœdœS )z¶
    Get php settings from options.conf
    :return: dict(
                first php setting: {version, mode},
                second php setting: {version, mode},
            )
    z//usr/local/directadmin/custombuild/options.confZphp1_releaseZphp2_releaseZ	php1_modeZ	php2_modezNo option found: {0}r   r$   ÚlsphpÚlsapi)ÚversionÚhandler)é   é   )
Úread_da_configÚgetÚconfigparserÚNoOptionErrorr   r   r   r.   r/   r0   )Zoptions_pathÚconfig_parserÚglobal_sectionÚphp1_verÚphp2_verÚphp1_handlerÚphp2_handlerr   r   r	   Úget_da_php_options^   s    $rC   Údummy_sectionc             C   s€   yFt | ƒ�}tdj|d�|jƒ  ƒ}W dQ R X tjdd�}|j|ƒ W n0 ttfk
rv   t	dj
tjƒ jdƒƒƒ‚Y nX ||fS )zù
    Read DA config file with ConfigParser.
    Need to add dummy section for success
    :param conf_file: config file name
    :param append_section_name: name of section to place in the beginning of file
    :return: RawConfigParser instance
    z[{s}]
)ÚsNF)Ústrictr   r$   )r)   r   r   Úreadr;   ÚRawConfigParserÚ	read_filer,   r-   r   r   r.   r/   r0   )Z	conf_fileZappend_section_nameÚfZfile_contentr=   r   r   r	   r9   }   s    
"r9   Úphpc             C   s6   dj |ƒ}y|t| jdƒƒ S  tk
r0   | S X dS )zÆ
    Convert simple php versions to pretty format
    :param php_ver: {major}.{minor} version
    :param pre: desired key start
    :return: alt-php{major}{minor} or desired `pre`{major}{minor}
    z{0}%s%sÚ.N)r   Útupler0   Ú	Exception)Zphp_verÚpreÚtemplater   r   r	   Úpretty_version_keys�   s
    
rQ   ú/usr/sbin/httpdc          	   C   s6   t j dj| d�ƒ}ytdd„ |D ƒƒS    tƒ S dS )a+  
    Get `httpd -t -D DUMP_RUN_LSAPI` info
    For httpd24 this default path is `/opt/rh/httpd24/root/usr/sbin/httpd`, generated in make_from_templates.sh script
    :param ctl_path: path to httpd (also apachectl may be used)
    :return: dict(
                lsapi_option: value
            )
    z{ctl} -t -D DUMP_RUN_LSAPI)Úctlc             S   s   g | ]}|j ƒ jd ƒ‘qS )r
   )Úlowerr0   )r   r#   r   r   r	   r   ¨   s    zdump_lsapi.<locals>.<listcomp>N)r   r   r'   )Úctl_pathZapache_conf_datar   r   r	   Ú
dump_lsapi�   s
    	rV   c          	   C   s6   t j dj| d�ƒ}ytdd„ |D ƒƒS    tƒ S dS )a  
    Get `httpd -M`
    For httpd24 this default path is `/opt/rh/httpd24/root/usr/sbin/httpd`, generated in make_from_templates.sh script
    :param ctl_path: path to httpd (also apachectl may be used)
    :return: dict(
                apache_module: value
            )
    z{ctl} -M)rS   c             S   s   g | ]}|j ƒ jd ƒ‘qS )r
   )rT   r0   )r   r#   r   r   r	   r   ¸   s    z'dump_loaded_modules.<locals>.<listcomp>N)r   r   r'   )rU   Úapache_modulesr   r   r	   Údump_loaded_modules­   s
    	rX   c              C   s   t jdk} dj| rdndd�S )zR
    Retrieve path to liblsapi, depends on arch
    :return: path to liblsapi
    r8   é    z/usr/lib{a}/liblscapi.soZ64r   )Úal        )ÚsysÚmaxsizer   )Z	is_64bitsr   r   r	   Úliblsapi_path½   s    
r]   c             C   sT   y:dj tjd|  d ƒƒjdƒ\}}dj||jdƒd d�S  tk
rN   d	S X d	S )
zr
    Get version-release from rpm -q `pkg`
    :param pkg: package name to query
    :return: version-release
    r   z/bin/rpm -q z --qf %{v}-%{r}ú-z{ver}-{rel}rL   r   )ÚverÚrelN)r   r   r0   r   r   )Zpkgr_   r`   r   r   r	   Ú	rpm_queryÆ   s
    "ra   c                sH   y(‡ fdd„t | ƒD ƒd jˆ ƒd jƒ S  tttfk
rB   dS X dS )zß
    Filter strings by given template
    Also split string upon given template
    :param fname: path to file
    :param template: template to find in string
    :return: first template occurrence splitted by template
    c                s   g | ]}ˆ |kr|‘qS r   r   )r   r#   )rP   r   r	   r   Ü   s    z!query_strings.<locals>.<listcomp>r   r7   N)Ústringsr0   r"   Ú
IndexErrorr-   r,   )ÚfnamerP   r   )rP   r	   Úquery_stringsÓ   s    (re   é   c          
   c   sn   t | dd��X}d}x:|jƒ D ].}|tjkr4||7 }qt|ƒ|krF|V  d}qW t|ƒ|kr`|V  W dQ R X dS )z´
    Strings utility analog.
    Finds printable strings in executable
    :param fname: path to file
    :param n: minimum string length
    :return: generator, yeilds string
    Úignore)Úerrorsr   N)r)   rG   ÚstringZ	printableÚlen)rd   ÚnrJ   r   Úcr   r   r	   rb   á   s    
rb   Tc             C   sr   t ƒ }x.| jƒ D ]"\}}t dd„ |jƒ D ƒƒ||< qW y|rD|d S |S  tk
rl   t jdd„ |D ƒdƒS X dS )a†  
    Count domains
    :param handler_struct: handler: version: set_of_domains structure
    :param default_keys: sequence of keys to add as default if no `lsapi` found
    :param only_lsapi: return only lsapi statistics
    :return: statistics - number of lsapi domains per version if only_lsapi=True
                          number of lsapi domains per version per handler otherwise
    c             s   s   | ]\}}|t |ƒfV  qd S )N)rj   )r   r   r   r   r   r	   ú	<genexpr>  s    z count_domains.<locals>.<genexpr>r4   c             S   s   g | ]}|d kr|‘qS )Únor   )r   Úxr   r   r	   r     s    z!count_domains.<locals>.<listcomp>r   N)r'   r   r   r(   )Zhandler_structZdefault_keysZ
only_lsapiÚresult_statÚhr   r   r   r	   Úcount_domainsö   s    	rr   )rD   )rK   )rR   )rR   )rf   )T)ri   r[   r%   r.   r   r;   Úior   Zpipesr   r   rN   r   r   r   r2   rC   r9   rQ   rV   rX   r]   ra   re   rb   rr   r   r   r   r	   Ú<module>   s,   



	
