
ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­
<!DOCTYPE html>
<html>
ó
àfc           @   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 Z d  d l m Z d  d l m	 Z	 d e
 f d „  ƒ  YZ d „  Z d „  Z d „  Z d	 „  Z d
 d „ Z d d „ Z d d „ Z d d „ Z d „  Z d „  Z d „  Z d d „ Z e d „ Z d S(   iÿÿÿÿN(   t   StringIO(   t   quotet   ModLsapiStatExceptionc           B   s   e  Z RS(    (   t   __name__t
   __module__(    (    (    s+   /usr/share/lve/modlscapi/user/stat_utils.pyR      s   c         K   sî   d j  g  | j ƒ  D]$ \ } } t d j | | ƒ ƒ ^ q ƒ } t j d j d |  d | ƒ ƒ } y t j d j  | ƒ ƒ } Wn5 t k
 r´ t d j |  | d j  | ƒ ƒ ƒ ‚ n Xy | d SWn& t	 k
 ré t d	 j | ƒ ƒ ‚ n Xd
 S(   s   
    Perform cPanel WHM API console request and return data from result
    :param cmd: whm api command
    :return: data dict from result
    t    s   {0}={1}s*   /usr/sbin/whmapi1 {cmd} {kw} --output jsont   cmdt   kwt    s>   Failed to get JSON from this API request: {0} {1}; output: {2}t   datas,   Failed to get data from this API result: {0}N(
   t   joint	   iteritemsR   t   formatt   exec_commandt   jsont   loadst
   ValueErrorR   t   KeyError(   R   t   kwargst   kt   vt   joined_kwargst   resultt   dict_result(    (    s+   /usr/share/lve/modlscapi/user/stat_utils.pyt   cpanel_whmapi   s    @!	c         K   s·   d j  g  | j ƒ  D]$ \ } } d j | t | ƒ ƒ ^ q ƒ } t j d j d |  d | ƒ ƒ } y t j d j  | ƒ ƒ SWn5 t k
 r² t d j |  | d j  | ƒ ƒ ƒ ‚ n Xd S(	   sŠ   
    Perform Plesk php_handler utility console request and return result
    :param cmd: php_handler command
    :return: dict result
    R   s   -{0} {1}s6   /usr/local/psa/bin/php_handler --{cmd} {kw} -json trueR   R   R   sJ   Failed 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   (    (    s+   /usr/share/lve/modlscapi/user/stat_utils.pyt   plesk_bin_php_handler(   s    @	c       	   C   sÔ   d }  d } t  j |  ƒ } t j | ƒ } yh xa | D]Y } t | j d | ƒ d ƒ 6 } t g  | j ƒ  D] } | j ƒ  ^ qh ƒ | | <Wd QXq4 WWn; t	 t
 f k
 rÏ t d j t j ƒ  j d ƒ ƒ ƒ ‚ n X| S(   se   
    Get domains per user
    :return: dict(
                user: list of domains
            )
    s!   /usr/local/directadmin/data/userss5   /usr/local/directadmin/data/users/{user}/domains.listt   usert   rbNR   s   
(   t   ost   listdirt   dictt   fromkeyst   openR   t   sett	   readlinest   stript   OSErrort   IOErrorR   R
   t	   tracebackt
   format_exct   split(   t   da_users_patht   da_domains_patht   da_userst   domainsR   t   domains_list_filet   l(    (    s+   /usr/share/lve/modlscapi/user/stat_utils.pyt   get_da_domains;   s    =(c          C   sú   d }  y^ t  |  ƒ \ } } | j | d ƒ } | j | d ƒ } | j | d ƒ } | j | d ƒ } WnA t j k
 r§ t d j d j t j ƒ  j	 d ƒ ƒ ƒ ƒ ‚ n Xi i | d	 6| d
 k rÇ d n | d 6d 6i | d	 6| d
 k rî d n | d 6d 6S(   s¶   
    Get php settings from options.conf
    :return: dict(
                first php setting: {version, mode},
                second php setting: {version, mode},
            )
    s/   /usr/local/directadmin/custombuild/options.conft   php1_releaset   php2_releaset	   php1_modet	   php2_modes   No option found: {0}R   s   
t   versiont   lsphpt   lsapit   handleri   i   (
   t   read_da_configt   gett   ConfigParsert   NoOptionErrorR   R   R
   R&   R'   R(   (   t   options_patht   config_parsert   global_sectiont   php1_vert   php2_vert   php1_handlert   php2_handler(    (    s+   /usr/share/lve/modlscapi/user/stat_utils.pyt   get_da_php_optionsP   s     1t   dummy_sectionc         C   sœ   yT t  |  ƒ ) } t d j d | ƒ | j ƒ  ƒ } Wd QXt j ƒ  } | j | ƒ Wn; t t f k
 r‘ t	 d j
 t j ƒ  j d ƒ ƒ ƒ ‚ n X| | f S(   sù   
    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
    s   [{s}]
t   sNR   s   
(   R    R    R   t   readR:   t   RawConfigParsert   readfpR$   R%   R   R
   R&   R'   R(   (   t	   conf_filet   append_section_namet   ft   file_contentR=   (    (    s+   /usr/share/lve/modlscapi/user/stat_utils.pyR8   o   s    ((t   phpc         C   sC   d j  | ƒ } y | t |  j d ƒ ƒ SWn t k
 r> |  SXd S(   sÆ   
    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}
    s   {0}%s%st   .N(   R   t   tupleR(   t	   Exception(   t   php_vert   pret   template(    (    s+   /usr/share/lve/modlscapi/user/stat_utils.pyt   pretty_version_keys   s
    s   /usr/sbin/httpdc         C   s]   t  j  d j d |  ƒ ƒ } y0 t g  | D] } | j ƒ  j d ƒ ^ q( ƒ SWn t ƒ  SXd S(   s+  
    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
            )
    s   {ctl} -t -D DUMP_RUN_LSAPIt   ctlR   N(   R   R   R   t   lowerR(   (   t   ctl_patht   apache_conf_dataR.   (    (    s+   /usr/share/lve/modlscapi/user/stat_utils.pyt
   dump_lsapi   s
    	0c         C   s]   t  j  d j d |  ƒ ƒ } y0 t g  | D] } | j ƒ  j d ƒ ^ q( ƒ SWn t ƒ  SXd S(   s  
    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
            )
    s   {ctl} -MRU   R   N(   R   R   R   RV   R(   (   RW   t   apache_modulesR.   (    (    s+   /usr/share/lve/modlscapi/user/stat_utils.pyt   dump_loaded_modulesŸ   s
    	0c          C   s+   t  j d k }  d j d |  r$ d n d ƒ S(   sR   
    Retrieve path to liblsapi, depends on arch
    :return: path to liblsapi
    i   i    s   /usr/lib{a}/liblscapi.sot   at   64R   I       (   t   syst   maxsizeR   (   t	   is_64bits(    (    s+   /usr/share/lve/modlscapi/user/stat_utils.pyt   liblsapi_path¯   s    c         C   so   yV d j  t j d |  d ƒ ƒ j d ƒ \ } } d j d | d | j d ƒ d	 ƒ SWn t k
 rj d
 SXd
 S(   sr   
    Get version-release from rpm -q `pkg`
    :param pkg: package name to query
    :return: version-release
    R   s   /bin/rpm -q s    --qf %{v}-%{r}t   -s   {ver}-{rel}t   vert   relRN   i    N(   R
   R   R(   R   R   t   None(   t   pkgRc   Rd   (    (    s+   /usr/share/lve/modlscapi/user/stat_utils.pyt	   rpm_query¸   s
    /'c         C   sf   yD g  t  |  ƒ D] } | | k r | ^ q d j | ƒ d j ƒ  SWn t t t f k
 ra d SXd S(   sß   
    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
    i    i   N(   t   stringsR(   R#   t
   IndexErrorR%   R$   Re   (   t   fnameRS   R.   (    (    s+   /usr/share/lve/modlscapi/user/stat_utils.pyt   query_stringsÅ   s    Di   c         c   s’   t  |  d ƒ } } d } xS | j ƒ  D]E } | t j k rJ | | 7} q% n  t | ƒ | k rd | Vn  d } q% Wt | ƒ | k rˆ | Vn  Wd QXd S(   s´   
    Strings utility analog.
    Finds printable strings in executable
    :param fname: path to file
    :param n: minimum string length
    :return: generator, yeilds string
    R   R   N(   R    RF   t   stringt	   printablet   len(   Rj   t   nRK   R   t   c(    (    s+   /usr/share/lve/modlscapi/user/stat_utils.pyRh   Ó   s    

c         C   s   t  ƒ  } x: |  j ƒ  D], \ } } t  d „  | j ƒ  Dƒ ƒ | | <q Wy | rW | d S| SWn t k
 r| t  j | d ƒ SXd S(   s†  
    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(   Rn   (   t   .0R   R   (    (    s+   /usr/share/lve/modlscapi/user/stat_utils.pys	   <genexpr>ó   s    R6   i    N(   R   R   R   R   (   t   handler_structt   default_keyst
   only_lsapit   result_statt   hR	   (    (    s+   /usr/share/lve/modlscapi/user/stat_utils.pyt   count_domainsè   s    		$(   Rl   R^   R   R&   R   R:   R   R    t   pipesR   RP   R   R   R   R/   RC   R8   RT   RY   R[   Ra   Rg   Rk   Rh   t   TrueRw   (    (    (    s+   /usr/share/lve/modlscapi/user/stat_utils.pyt   <module>   s,   								