
ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­ÂÂ­
<!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 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 m Z d  d l m Z m Z m Z m Z m Z m Z d  d l Z d e f d	 „  ƒ  YZ e d
 „ Z e e d „ Z e e d „ Z  e e d „ Z! d „  Z" d „  Z# d „  Z$ d S(   iÿÿÿÿN(   t   get_cp(   t   criu_settings_malfunctions(   t   lsapi_settings_malfunctions(   t   liblsapi_malfunctions(   t   cpanel_whmapit   plesk_bin_php_handlert   dump_loaded_modulest
   dump_lsapit   query_stringst	   rpm_query(   t   get_da_domainst   get_da_php_optionst   read_da_configt   liblsapi_patht   pretty_version_keyst   count_domainst   ModLsapiStatExceptionc           B   s   e  Z RS(    (   t   __name__t
   __module__(    (    (    s/   /usr/share/lve/modlscapi/user/mod_lsapi_stat.pyR      s   c         C   sm  d } i  } t ƒ  } yŽ | j d k rR t j j d ƒ rI t ƒ  | d <q¢ d } nP | j d k rq t ƒ  | d <n1 | j d k r t ƒ  | d <n d j	 | j ƒ } Wn" t
 k
 rÇ } t | j ƒ } n X| d k	 rî t ƒ  | d <| | d <n  t | ƒ | d	 <| j t ƒ  ƒ | j t ƒ  ƒ | j i t | d j ƒ  ƒ d
 6ƒ t | ƒ |  ret j | d t ƒS| Sd S(   sâ  
    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
    t   cPanels   /etc/cpanel/ea4/is_ea4t
   domainStats7   mod_lsapi domains stat is currently unsupported for EA3t   Pleskt   DirectAdmins7   mod_lsapi domains stat is currently unsupported for {0}t   domainStatErrort   controlPanelt   totalDomaint	   sort_keysN(   t   NoneR    t   namet   ost   patht   existst   get_cpanel_ea4_statt   get_plesk_statt   get_da_statt   formatR   t   strt   messaget   dictt   updatet   get_lsapi_conft   get_crui_statt   sumt   valuest   analyze_malfunctionst   jsont   dumpst   True(   t   as_jsont   errort   statst   control_panelt   e(    (    s/   /usr/share/lve/modlscapi/user/mod_lsapi_stat.pyt   get"   s4    		$
c         C   sö  t  ƒ  } t  ƒ  } t  ƒ  } yt d ƒ j d ƒ } xX | D]P } | j | j d ƒ t ƒ  ƒ j | j d ƒ ƒ | j d ƒ | | j d ƒ <q: Wt d ƒ j d ƒ } t  g  | D]$ } | j d ƒ | j d ƒ f ^ q­ ƒ }	 |	 j ƒ  }
 xL |	 j ƒ  D]> \ } } | j | t  ƒ  ƒ j i | j | t ƒ  ƒ | 6ƒ qó W| rYt	 j
 | | | ƒ } | } n  xK | j ƒ  D]= \ } } | j t  j t |
 ƒ j | j ƒ  ƒ t ƒ  ƒ ƒ qfWWn; t t f k
 råt d	 j t j ƒ  j d
 ƒ ƒ ƒ ‚ n Xt | |
 |  ƒ S(   sY  
    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`, ... }
                    ...
                )
    t   php_get_vhost_versionst   versionst   versiont   vhostt   accountt   php_get_handlerst   version_handlerst   current_handlert    s   
(   R&   R   R5   t
   setdefaultt   sett   addt   keyst	   iteritemsR'   t   selector_usage_libt   ea4_selector_checkt   fromkeyst
   differencet   KeyErrort	   TypeErrorR   t   joint	   tracebackt
   format_exct   splitR   (   t
   lsapi_onlyt   with_selectort   domains_per_versiont   handlers_statt   domain_userst   vhosts_dataR9   t   handlers_datat   hR<   t   all_versionst   vert   handlert   s_checked_version_handlerst   v(    (    s/   /usr/share/lve/modlscapi/user/mod_lsapi_stat.pyR    Y   s*    			. 76	9(c         C   s¬  d } d } t  ƒ  } yt d ƒ } t g  | D]! } d | j d ƒ k r. | ^ q. ƒ } x¹ | D]± } | j d ƒ }	 d j | j d ƒ j d ƒ d	  ƒ }
 t g  t d
 d |	 ƒD] } | j d ƒ ^ q¯ ƒ } d |	 k rô d } | j d |
 ƒ } n | j d |
 ƒ } | | | <q_ W| r/t j	 | | ƒ } n  WnD t
 t t t j f k
 rvt d j t j ƒ  j d ƒ ƒ ƒ ‚ n Xi t  d „  | j ƒ  Dƒ ƒ d 6} |  r¨| d S| S(   s  
    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`, ... }
                )
    s
   alt-php{v}s	   alt-php56t   listt   lsphpt   idR>   t   fullVersiont   .iÿÿÿÿs	   get-usaget   domaint   customRZ   s   
c         s   s'   |  ] \ } } | t  | ƒ f Vq d  S(   N(   t   len(   t   .0t   kRZ   (    (    s/   /usr/share/lve/modlscapi/user/mod_lsapi_stat.pys	   <genexpr>±   s    t   lsapi(   R&   R   t   sortedR5   RJ   RM   R@   R#   RD   t   plesk_selector_checkRH   RI   t   AttributeErrort   SelectorStatExceptionR   RK   RL   RC   (   RN   RO   t   handler_tmplt   custom_versiont   domain_version_statt   all_handlersRU   t   lsphp_handlersRX   t
   handler_idt   php_versiont   dt   domainst
   version_idt   result_stat(    (    s/   /usr/share/lve/modlscapi/user/mod_lsapi_stat.pyR!   Š   s,    	4%4( c         C   sÞ  d } t  ƒ  } yxt ƒ  } | d d } | d d } | d d } | d d } t | ƒ }	 t | ƒ }
 t ƒ  } t ƒ  } g  | j ƒ  D] } | j | ƒ ^ qŠ | d k rÐ i | |	 6} i | |	 6| | <ny| d k rý i | |
 6} i | |
 6| | <nLi t ƒ  |	 6t ƒ  |
 6} xÂ | j ƒ  D]´ \ } } x¥ | D] } | j d | d | ƒ } yR t	 | ƒ \ } } | j
 | d	 ƒ } t | | d ƒ } | j | ƒ j | ƒ Wq7t j k
 rÓ| j |	 ƒ j | ƒ q7Xq7Wq$W| | k ri | |	 |	 6| |
 |
 6| | <n> i | |	 |	 6t ƒ  |
 6| | <i | |
 |
 6t ƒ  |	 6| | <| r†t j | j |	 ƒ | |	 ƒ } | j | ƒ j | ƒ n  Wn> t t t f k
 rÇt d
 j t j ƒ  j d ƒ ƒ ƒ ‚ n Xt | |	 |
 g |  ƒ S(   sN  
    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`, ... }
                    ...
                )
    s>   /usr/local/directadmin/data/users/{user}/domains/{domain}.confi   R8   i   RX   t   not   userR`   t   php1_selectR>   s   
(   R&   R   R   R
   R@   R+   R'   RC   R#   R   t   getintR5   RA   t   ConfigParsert   NoOptionErrorRD   t   da_selector_checkRH   RI   Rh   R   RJ   RK   RL   RM   R   (   RN   RO   t   domain_conf_patht   handler_statt   php_optionst   php1_vert   php2_vert   php1_handlert   php2_handlert
   php1_labelt
   php2_labelt   user_domainst   joinedRZ   t   version_statRv   Rr   R`   t   config_patht   conf_parsert   global_sectiont   php_settingR8   t   selector_updated(    (    s/   /usr/share/lve/modlscapi/user/mod_lsapi_stat.pyR"   ¶   sV    				&"(c          C   s™   d j  t j d ƒ ƒ }  y2 t j d d d g d t j d t j ƒd } Wn t j k
 rf d	 } n Xi i | d 6|  r |  j d
 ƒ d n d d 6d 6S(   sÆ   
    Get criu service info
    :return: dict(
                `criu`: dict(
                    `status`: running/stopped,
                    `version`: version
                )
            )
    R>   s   /usr/sbin/criu -Vs   /sbin/servicet   criut   statust   stdoutt   stderrt   runningt   stoppedt    i   s   not installedR8   (   RJ   t   exec_commandt
   subprocesst
   check_callt   PIPEt   STDOUTt   CalledProcessErrorRM   (   t   criu_versiont   criu_service_status(    (    s/   /usr/share/lve/modlscapi/user/mod_lsapi_stat.pyR)     s    
(

c          C   s¦   t  ƒ  }  t ƒ  } | j d d ƒ } t t ƒ  d ƒ } i i |  j d d ƒ d 6|  j d d ƒ d 6d 6|  j d d ƒ d 6| r… | n	 t d	 ƒ d
 6| sž d n d d 6S(   sl  
    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
            )
    t   lsapi_modulet   liblsapi_versiont
   lsapi_criut   offt   lsapi_with_connection_poolt	   lsapiConfR8   t
   modVersiont   liblsapit
   libVersiont   disabledt   enabledt	   modStatusN(   R   R   R5   R   R   R   R	   (   t   apache_conft   apache_modulest
   mod_statusR   (    (    s/   /usr/share/lve/modlscapi/user/mod_lsapi_stat.pyR(     s    		c            s—   t  ƒ  ‰  ‡  f d †  } d j d |  d d d |  d d ƒ } |  d	 } | t |  d
 ƒ | t | ƒ | t | ƒ ˆ  s d S|  j i ˆ  d 6ƒ d S(   s÷   
    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  |  | ƒ Wn t k
 r( n Xd  S(   N(   t   appendRH   (   t   malfunc_dictt   key(   t   malfunctions(    s/   /usr/share/lve/modlscapi/user/mod_lsapi_stat.pyt   add_malfunctionI  s    s   {opt}_{serv}t   optR¡   Rž   t   servR   RŽ   R§   R¤   NR®   (   R[   R#   R   R   R   R'   (   t
   stats_dictR¯   t   criu_settingst   lsapi_settings(    (   R®   s/   /usr/share/lve/modlscapi/user/mod_lsapi_stat.pyR,   @  s    	
(%   R   R-   RK   R•   Ry   R”   t   lve_diagnosticR    t   dashboard_malfunctionsR   R   R   t
   stat_utilsR   R   R   R   R   R	   R
   R   R   R   R   R   RD   t	   ExceptionR   t   FalseR5   R/   R    R!   R"   R)   R(   R,   (    (    (    s/   /usr/share/lve/modlscapi/user/mod_lsapi_stat.pyt   <module>   s(   ..71,O		!