ó
Á£ô_c           @   sf  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 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 y d d l m Z Wn! e k
 rí d d l m Z n Xe j e ƒ Z d	 d
 d d d d d d d d d d d d d d d g Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   s.   Utilities for plugins discovery and selection.iÿÿÿÿN(   t   Dict(   t   errors(   t
   interfaces(   t	   constants(   t   os(   t   Mappingt   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-nginxt   PluginEntryPointc           B   s  e  Z d  Z d Z e d „ Z d „  Z e d „  ƒ Z	 e
 d „  ƒ Z e
 d „  ƒ Z e
 d „  ƒ Z e j d „  ƒ Z e
 d „  ƒ Z e j 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.c         C   s^   |  j  | | ƒ |  _ | j ƒ  |  _ | |  _ d  |  _ d  |  _ d  |  _ t	 |  _
 d  |  _ d  S(   N(   t   entry_point_to_plugin_namet   namet   loadt
   plugin_clst   entry_pointt   Nonet   warning_messaget   _initializedt	   _preparedt   Falset   _hiddent   _long_description(   t   selfR   t   with_prefix(    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt   __init__6   s    					c         C   s3   | |  j  k r/ |  j r+ t j |  j ƒ n  t St S(   s(   Check if the name refers to this plugin.(   R	   R   t   loggert   warningt   TrueR   (   R   R	   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt
   check_name@   s
    	c         C   s"   | r | j  j d | j S| j S(   s)   Unique plugin name for an ``entry_point``t   :(   t   distt   keyR	   (   t   clsR   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyR   H   s    c         C   s
   |  j  j S(   s   Description of the plugin.(   R   t   description(   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyR   O   s    c         C   s   d j  |  j |  j ƒ S(   s$   Description with name. Handy for UI.s	   {0} ({1})(   t   formatR   R	   (   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt   description_with_nameT   s    c         C   s:   |  j  r |  j  Sy |  j j SWn t k
 r5 |  j SXd S(   s   Long description of the plugin.N(   R   R   t   long_descriptiont   AttributeErrorR   (   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyR"   Y   s    	c         C   s   | |  _  d  S(   N(   R   (   R   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyR"   c   s    c         C   s   |  j  p t |  j d t ƒ S(   s%   Should this plugin be hidden from UI?t   hidden(   R   t   getattrR   R   (   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyR$   g   s    c         C   s   | |  _  d  S(   N(   R   (   R   t   hide(    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyR$   l   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   (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pys	   <genexpr>s   s   N(   t   all(   R(   t   ifaces(   R   (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pys	   <genexpr>s   s   (   t   any(   R   t   ifaces_groups(    (   R   sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyR+   p   s    
c         C   s   |  j  d k	 S(   s(   Has the plugin been initialized already?N(   R   R   (   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt   initializedw   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(    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt   init|   s    	c         C   sŒ   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(   t   zopet	   interfacet   verifyt   verifyObjectR1   t
   exceptionst   BrokenImplementationR'   R   R   t   debugt   __name__R   R   (   R   R+   R)   t   error(    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyR5   ƒ   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.   R   R9   R   R   (   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt   prepared‘   s    	c         C   sÜ   |  j  d k rÕ y |  j j ƒ  Wn¦ t j k
 rZ } 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: %sR2   s   No installation (%r): %ss   Other error:(%r): %sN(   R   R   R   t   prepareR   t   MisconfigurationErrorR   R9   R   t   NoInstallationErrort   PluginError(   R   R;   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyR=   ˜   s    c         C   s   t  |  j t j ƒ S(   s   Is plugin misconfigured?(   t
   isinstanceR   R   R>   (   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/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(   RA   R   t	   ExceptionR   (   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt   problem±   s    c         C   s   |  j  t k p |  j S(   s4   Is plugin available, i.e. prepared or misconfigured?(   R   R   RB   (   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt	   available¸   s    c         C   s   d j  |  j ƒ S(   Ns   PluginEntryPoint#{0}(   R    R	   (   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/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(   R:   (   R(   R)   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pys	   <genexpr>Å   s    s   Entry point: {0}s   Initialized: {0}s	   Prep: {0}s   
(   R    R	   R   R   t   joinR3   R4   R'   R   R.   t   appendR1   R<   R=   (   R   t   lines(    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt   __str__À   s    		"N(   R:   t
   __module__t   __doc__R   t   __hash__R   R   R   t   classmethodR   t   propertyR   R!   R"   t   setterR$   R+   R.   R1   R5   R<   R=   RB   RD   RE   RF   RJ   (    (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyR   0   s,   
	
				t   PluginsRegistryc           B   sª   e  Z d  Z d „  Z e 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  j t t j | ƒ ƒ ƒ |  _ d  S(   N(   t   collectionst   OrderedDictt   sortedt   sixt	   iteritemst   _plugins(   R   t   plugins(    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyR   Õ   s    c   
      C   s-  i  } t  j d ƒ } | r* | j d ƒ n g  } t j j | ƒ x | D] } t j j | ƒ qG Wt	 j
 t j t j ƒ t j t j ƒ ƒ } x• | D] } |  j | | d t ƒ} | j j t k r’ |  j | | d t ƒ} t | _ d j | j | j ƒ }	 |	 | _ d j |	 | j ƒ | _ q’ q’ W|  | ƒ S(   s+   Find plugins using setuptools entry points.t   CERTBOT_PLUGIN_PATHR   R   sR   Plugin legacy name {0} may be removed in a future version. Please use {1} instead.s   (WARNING: {0}) {1}(   R   t   getenvt   splitt   syst   patht   extendt   pkg_resourcest   working_sett	   add_entryt	   itertoolst   chaint   iter_entry_pointsR   t   SETUPTOOLS_PLUGINS_ENTRY_POINTt"   OLD_SETUPTOOLS_PLUGINS_ENTRY_POINTt   _load_entry_pointR   R   R   t   PREFIX_FREE_DISTRIBUTIONSR   R$   R    R	   R   R"   (
   R   RX   t   plugin_paths_stringt   plugin_pathst   plugin_patht   entry_pointsR   t	   plugin_ept   prefixed_plugin_ept   message(    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt   find_allÜ   s,    			c         C   s—   t  | | ƒ } | j | k r^ | | j } t d j | j | j j j | j j j ƒ ƒ ‚ n  t j j	 | j
 ƒ rƒ | | | j <n t j d | ƒ | S(   Ns+   Duplicate plugin name {0} from {1} and {2}.s,   %r does not provide IPluginFactory, skipping(   R   R	   RC   R    R   R   R   R   t   IPluginFactoryt
   providedByR   R   R   (   R   R   RX   R   Rm   t   other_ep(    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyRg   ü   s    	*
c         C   s   |  j  | S(   N(   RW   (   R   R	   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt   __getitem__  s    c         C   s   t  |  j ƒ S(   N(   t   iterRW   (   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt   __iter__  s    c         C   s   t  |  j ƒ S(   N(   t   lenRW   (   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt   __len__  s    c         C   s,   g  t  j |  j ƒ D] } | j | ƒ ^ q S(   s'   Initialize all plugins in the registry.(   RU   t
   itervaluesRW   R1   (   R   R0   Rm   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyR1     s    c            s,   t  |  ƒ ‡  f d †  t j |  j ƒ Dƒ ƒ S(   s"   Filter plugins based on predicate.c            s+   i  |  ]! \ } } ˆ  | ƒ r | | “ q S(    (    (   R(   R	   Rm   (   t   pred(    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pys
   <dictcomp>  s   	 	(   t   typeRU   RV   RW   (   R   Rz   (    (   Rz   sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt   filter  s    c         C   s   |  j  d „  ƒ S(   s#   Filter plugins based on visibility.c         S   s   |  j  S(   N(   R$   (   Rm   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt   <lambda>   s    (   R|   (   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/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-   (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyR}   $  s    (   R|   (   R   R-   (    (   R-   sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyR+   "  s    c            s   |  j  ‡  f d †  ƒ S(   s%   Filter plugins based on verification.c            s   |  j  ˆ  ƒ S(   N(   R5   (   R   (   R+   (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyR}   (  s    (   R|   (   R   R+   (    (   R+   sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyR5   &  s    c         C   s)   g  t  j |  j ƒ D] } | j ƒ  ^ q S(   s$   Prepare all plugins in the registry.(   RU   Ry   RW   R=   (   R   Rm   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyR=   *  s    c         C   s   |  j  d „  ƒ S(   s%   Filter plugins based on availability.c         S   s   |  j  S(   N(   RE   (   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyR}   0  s    (   R|   (   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyRE   .  s    c         C   sR   g  t  j |  j ƒ D]' } | j r | j ƒ  | k r | ^ q } | rN | d 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    N(   RU   Ry   RW   R.   R1   R   (   R   t   pluginRm   t
   candidates(    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt	   find_init3  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(   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pys	   <genexpr>L  s    (   R    t	   __class__R:   RG   RU   Ry   RW   (   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyRF   I  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(   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pys	   <genexpr>Q  s    (   RW   RG   RU   Ry   (   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyRJ   N  s    	(   R:   RK   RL   R   RN   Rp   Rg   Rt   Rv   Rx   R1   R|   R~   R+   R5   R=   RE   R‚   RF   RJ   (    (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyRQ   Ò   s"   	 												(   RL   RR   Rb   t   loggingR\   R_   RU   t   zope.interfaceR3   t   zope.interface.verifyt   acme.magic_typingR    R   R   R   t   certbot._internalR   t   certbot.compatR   t   collections.abcR   t   ImportErrort	   getLoggerR:   R   Rh   t   objectR   RQ   (    (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt   <module>   sJ   	¢