
­­­­­­­­­­­­­­­­­­
<!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rd
n|d||d	krd
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,   



	
