ó
Y[c           @   sì   d  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 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 e j e ƒ Z d e f d	 „  ƒ  YZ d
 e j f d „  ƒ  YZ d S(   s.   Utilities for plugins discovery and selection.iÿÿÿÿN(   t   OrderedDict(   t   Dict(   t	   constants(   t   errors(   t
   interfacest   PluginEntryPointc           B   s(  e  Z d  Z d d d d d d d d d	 d
 d d d d d d d d g Z d$ Z d „  Z e d „  ƒ Z e	 d „  ƒ Z
 e	 d „  ƒ Z e	 d „  ƒ Z e	 d „  ƒ Z d „  Z e	 d „  ƒ Z d$ d „ Z d „  Z e	 d „  ƒ Z d „  Z e	 d „  ƒ Z e	 d  „  ƒ Z e	 d! „  ƒ Z d" „  Z d# „  Z RS(%   s   Plugin entry point.t   certbots   certbot-apaches   certbot-dns-cloudflares   certbot-dns-cloudxnss   certbot-dns-digitaloceans   certbot-dns-dnsimples   certbot-dns-dnsmadeeasys   certbot-dns-gehirns   certbot-dns-googles   certbot-dns-linodes   certbot-dns-luadnss   certbot-dns-nsones   certbot-dns-ovhs   certbot-dns-rfc2136s   certbot-dns-route53s   certbot-dns-sakuraclouds   certbot-nginxs   certbot-postfixc         C   s@   |  j  | ƒ |  _ | j ƒ  |  _ | |  _ d  |  _ d  |  _ d  S(   N(   t   entry_point_to_plugin_namet   namet   loadt
   plugin_clst   entry_pointt   Nonet   _initializedt	   _prepared(   t   selfR   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyt   __init__2   s
    		c         C   s1   | j  j |  j k r | j S| j  j d | j S(   s)   Unique plugin name for an ``entry_point``t   :(   t   distt   keyt   PREFIX_FREE_DISTRIBUTIONSR   (   t   clsR   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyR   9   s    c         C   s
   |  j  j S(   s   Description of the plugin.(   R
   t   description(   R   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyR   @   s    c         C   s   d j  |  j |  j ƒ S(   s$   Description with name. Handy for UI.s	   {0} ({1})(   t   formatR   R   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyt   description_with_nameE   s    c         C   s*   y |  j  j SWn t k
 r% |  j SXd S(   s   Long description of the plugin.N(   R
   t   long_descriptiont   AttributeErrorR   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyR   J   s    c         C   s   t  |  j d t ƒ S(   s%   Should this plugin be hidden from UI?t   hidden(   t   getattrR
   t   False(   R   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyR   R   s    c            s!   | p  t  ‡  f d †  | Dƒ ƒ S(   s2   Does plugin implements specified interface groups?c         3   s+   |  ]! } t  ‡  f d  †  | Dƒ ƒ Vq d S(   c         3   s!   |  ] } | j  ˆ  j ƒ Vq d  S(   N(   t   implementedByR
   (   t   .0t   iface(   R   (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pys	   <genexpr>Z   s   N(   t   all(   R   t   ifaces(   R   (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pys	   <genexpr>Z   s   (   t   any(   R   t   ifaces_groups(    (   R   s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyR"   W   s    
c         C   s   |  j  d k	 S(   s(   Has the plugin been initialized already?N(   R   R   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyt   initialized^   s    c         C   s8   |  j  s1 |  j j ƒ  |  j | |  j ƒ |  _ n  |  j S(   s   Memoized plugin initialization.(   R%   R   t   requireR
   R   R   (   R   t   config(    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyt   initc   s    	c         C   s›   |  j  s t ‚ x… | D]} } y  t j j j | |  j ƒ  ƒ Wq t j j j k
 r’ } | j	 |  j
 ƒ rŽ t j d |  j
 | j | d t ƒn  t SXq Wt S(   s<   Verify that the plugin conforms to the specified interfaces.s/   %s implements %s but object does not verify: %st   exc_info(   R%   t   AssertionErrort   zopet	   interfacet   verifyt   verifyObjectR(   t
   exceptionst   BrokenImplementationR   R
   t   loggert   debugt   __name__t   TrueR   (   R   R"   R    t   error(    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyR-   j   s     	c         C   s)   |  j  s t j d |  ƒ n  |  j d k	 S(   s%   Has the plugin been prepared already?s$   .prepared called on uninitialized %rN(   R%   R1   R2   R   R   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyt   preparedx   s    	c         C   së   |  j  s t ‚ |  j d k rä y |  j j ƒ  Wn¦ t j k
 ri } t j	 d |  | d t
 ƒ| |  _ qä t j k
 r  } t j	 d |  | d t
 ƒ| |  _ qä t j k
 r× } t j	 d |  | d t
 ƒ| |  _ qä Xt
 |  _ n  |  j S(   s   Memoized plugin preparation.s   Misconfigured %r: %sR)   s   No installation (%r): %ss   Other error:(%r): %sN(   R%   R*   R   R   R   t   prepareR   t   MisconfigurationErrorR1   R2   R4   t   NoInstallationErrort   PluginError(   R   R5   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyR7      s     c         C   s   t  |  j t j ƒ S(   s   Is plugin misconfigured?(   t
   isinstanceR   R   R8   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyt   misconfigured“   s    c         C   s   t  |  j t ƒ r |  j Sd S(   sG   Return the Exception raised during plugin setup, or None if all is wellN(   R;   R   t	   ExceptionR   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyt   problem˜   s    c         C   s   |  j  t k p |  j S(   s4   Is plugin available, i.e. prepared or misconfigured?(   R   R4   R<   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyt	   availableŸ   s    c         C   s   d j  |  j ƒ S(   Ns   PluginEntryPoint#{0}(   R   R   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyt   __repr__¤   s    c         C   sÁ   d j  |  j ƒ d j  |  j j ƒ d j  d j d „  t j j |  j ƒ Dƒ ƒ ƒ d j  |  j ƒ g } |  j	 r´ | j
 d j  |  j ƒ  ƒ ƒ |  j r´ | j
 d j  |  j ƒ  ƒ ƒ q´ n  d	 j | ƒ S(
   Ns   * {0}s   Description: {0}s   Interfaces: {0}s   , c         s   s   |  ] } | j  Vq d  S(   N(   R3   (   R   R    (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pys	   <genexpr>¬   s    s   Entry point: {0}s   Initialized: {0}s	   Prep: {0}s   
(   R   R   R
   R   t   joinR+   R,   R   R   R%   t   appendR(   R6   R7   (   R   t   lines(    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyt   __str__§   s    		"N(   R3   t
   __module__t   __doc__R   R   t   __hash__R   t   classmethodR   t   propertyR   R   R   R   R"   R%   R(   R-   R6   R7   R<   R>   R?   R@   RD   (    (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyR      sJ   						t   PluginsRegistryc           B   s›   e  Z d  Z d „  Z e d „  ƒ Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s   Plugins registry.c         C   s"   t  t t j | ƒ ƒ ƒ |  _ d  S(   N(   R    t   sortedt   sixt	   iteritemst   _plugins(   R   t   plugins(    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyR   ¼   s    c         C   s§   i  } t  j t j t j ƒ t j t j ƒ ƒ } xj | D]b } t | ƒ } | j | k sd t	 d ƒ ‚ t
 j j | j ƒ r‰ | | | j <q7 t j d | ƒ q7 W|  | ƒ S(   s+   Find plugins using setuptools entry points.s#   PREFIX_FREE_DISTRIBUTIONS messed ups,   %r does not provide IPluginFactory, skipping(   t	   itertoolst   chaint   pkg_resourcest   iter_entry_pointsR   t   SETUPTOOLS_PLUGINS_ENTRY_POINTt"   OLD_SETUPTOOLS_PLUGINS_ENTRY_POINTR   R   R*   R   t   IPluginFactoryt
   providedByR
   R1   t   warning(   R   RO   t   entry_pointsR   t	   plugin_ep(    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyt   find_allÃ   s    		c         C   s   |  j  | S(   N(   RN   (   R   R   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyt   __getitem__Ù   s    c         C   s   t  |  j ƒ S(   N(   t   iterRN   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyt   __iter__Ü   s    c         C   s   t  |  j ƒ S(   N(   t   lenRN   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyt   __len__ß   s    c         C   s,   g  t  j |  j ƒ D] } | j | ƒ ^ q S(   s'   Initialize all plugins in the registry.(   RL   t
   itervaluesRN   R(   (   R   R'   RZ   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyR(   â   s    c            s2   t  |  ƒ t ‡  f d †  t j |  j ƒ Dƒ ƒ ƒ S(   s"   Filter plugins based on predicate.c         3   s-   |  ]# \ } } ˆ  | ƒ r | | f Vq d  S(   N(    (   R   R   RZ   (   t   pred(    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pys	   <genexpr>é   s    	(   t   typet   dictRL   RM   RN   (   R   Rb   (    (   Rb   s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyt   filterç   s    c         C   s   |  j  d „  ƒ S(   s#   Filter plugins based on visibility.c         S   s   |  j  S(   N(   R   (   RZ   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyt   <lambda>î   s    (   Re   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyt   visibleì   s    c            s   |  j  ‡  f d †  ƒ S(   s#   Filter plugins based on interfaces.c            s   |  j  ˆ  Œ  S(   N(   R"   (   t   p_ep(   R$   (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyRf   ó   s    (   Re   (   R   R$   (    (   R$   s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyR"   ð   s    c            s   |  j  ‡  f d †  ƒ S(   s%   Filter plugins based on verification.c            s   |  j  ˆ  ƒ S(   N(   R-   (   Rh   (   R"   (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyRf   ÷   s    (   Re   (   R   R"   (    (   R"   s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyR-   õ   s    c         C   s)   g  t  j |  j ƒ D] } | j ƒ  ^ q S(   s$   Prepare all plugins in the registry.(   RL   Ra   RN   R7   (   R   RZ   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyR7   ù   s    c         C   s   |  j  d „  ƒ S(   s%   Filter plugins based on availability.c         S   s   |  j  S(   N(   R?   (   Rh   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyRf   ÿ   s    (   Re   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyR?   ý   s    c         C   sn   g  t  j |  j ƒ D]' } | j r | j ƒ  | k r | ^ q } t | ƒ d k sX t ‚ | rf | d Sd Sd S(   sÚ  Find an initialized plugin.

        This is particularly useful for finding a name for the plugin
        (although `.IPluginFactory.__call__` takes ``name`` as one of
        the arguments, ``IPlugin.name`` is not part of the interface)::

          # plugin is an instance providing IPlugin, initialized
          # somewhere else in the code
          plugin_registry.find_init(plugin).name

        Returns ``None`` if ``plugin`` is not found in the registry.

        i   i    N(   RL   Ra   RN   R%   R(   R_   R*   R   (   R   t   pluginRZ   t
   candidates(    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyt	   find_init  s    'c         C   s5   d j  |  j j d j d „  t j |  j ƒ Dƒ ƒ ƒ S(   Ns   {0}({1})t   ,c         s   s   |  ] } t  | ƒ Vq d  S(   N(   t   repr(   R   Rh   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pys	   <genexpr>  s    (   R   t	   __class__R3   RA   RL   Ra   RN   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyR@     s    c         C   s0   |  j  s d Sd j d „  t j |  j  ƒ Dƒ ƒ S(   Ns
   No pluginss   

c         s   s   |  ] } t  | ƒ Vq d  S(   N(   t   str(   R   Rh   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pys	   <genexpr>!  s    (   RN   RA   RL   Ra   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyRD     s    	(   R3   RE   RF   R   RH   R[   R\   R^   R`   R(   Re   Rg   R"   R-   R7   R?   Rk   R@   RD   (    (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyRJ   ¹   s    													(   RF   t   collectionsRP   t   loggingRR   RL   R    t   zope.interfaceR+   t   zope.interface.verifyt   acme.magic_typingR   R   R   R   R   t	   getLoggerR3   R1   t   objectR   t   MappingRJ   (    (    (    s9   /usr/lib/python2.7/dist-packages/certbot/plugins/disco.pyt   <module>   s   £