ó
Á£ô_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›   |  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   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.pyR6   ƒ   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   R:   R   R   (   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt   prepared‘   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: %sR2   s   No installation (%r): %ss   Other error:(%r): %sN(   R.   R3   R   R   R   t   prepareR   t   MisconfigurationErrorR   R:   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(   RB   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   RC   (   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   joinR4   R5   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   R6   R=   R>   RC   RE   RF   RG   RK   (    (    (    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   sB  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 d k	 sÅ 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}N(   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   R3   R   t   PREFIX_FREE_DISTRIBUTIONSR   R$   R    R	   R   R"   (
   R   RY   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	   RD   R    R   R   R   R   t   IPluginFactoryt
   providedByR   R   R   (   R   R   RY   R   Rn   t   other_ep(    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyRh   ü   s    	*
c         C   s   |  j  | S(   N(   RX   (   R   R	   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt   __getitem__  s    c         C   s   t  |  j ƒ S(   N(   t   iterRX   (   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt   __iter__  s    c         C   s   t  |  j ƒ S(   N(   t   lenRX   (   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.(   RV   t
   itervaluesRX   R1   (   R   R0   Rn   (    (    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	   Rn   (   t   pred(    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pys
   <dictcomp>  s   	 	(   t   typeRV   RW   RX   (   R   R{   (    (   R{   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$   (   Rn   (    (    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(   R6   (   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.pyR6   &  s    c         C   s)   g  t  j |  j ƒ D] } | j ƒ  ^ q S(   s$   Prepare all plugins in the registry.(   RV   Rz   RX   R>   (   R   Rn   (    (    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(   RF   (   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.pyRF   .  s    c         C   sj   g  t  j |  j ƒ D]' } | j r | j ƒ  | k r | ^ q } t | ƒ d k sX t ‚ | rf | 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   i    N(   RV   Rz   RX   R.   R1   Rx   R3   R   (   R   t   pluginRn   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;   RH   RV   Rz   RX   (   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyRG   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    (   RX   RH   RV   Rz   (   R   (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyRK   N  s    	(   R;   RL   RM   R   RO   Rq   Rh   Ru   Rw   Ry   R1   R}   R   R+   R6   R>   RF   Rƒ   RG   RK   (    (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyRR   Ò   s"   	 												(   RM   RS   Rc   t   loggingR]   R`   RV   t   zope.interfaceR4   t   zope.interface.verifyt   acme.magic_typingR    R   R   R   t   certbot._internalR   t   certbot.compatR   t   collections.abcR   t   ImportErrort	   getLoggerR;   R   Ri   t   objectR   RR   (    (    (    sC   /usr/lib/python2.7/site-packages/certbot/_internal/plugins/disco.pyt   <module>   sJ   	¢