
    Vh+                     >   d dl mZmZmZ eZd dlmZ d dlm	Z	 d dl
mZ d dlmZmZ d dlZd dlZ e edd	       eddd
       edd            ZdZd Zd ZdZdZddZ G d de      Z	 	 	 	 d dZ	 	 	 	 d!dZd Z	 	 	 d!dZ	 	 	 d"dZ G d de      Z d#dZ!y)$    )absolute_importdivisionprint_function)	to_native)PY3)	HTTPError)	fetch_urlopen_urlNstrT)typerequired)r   r   no_logint)r   default)hetzner_userhetzner_passwordrate_limit_retry_timeoutzhttps://robot-ws.your-server.dec                      t        |      dk(  rdj                         |d   iS t         fdt        |      D              S )z$Return a dictionary with keys values   z{key}[])keyr   c              3   N   K   | ]  \  }}d j                  |      |f  yw)z{key}[{index}])r   indexN)format).0ixr   s      o/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/hrobot/plugins/module_utils/robot.py	<genexpr>z<get_x_www_form_urlenconded_dict_from_list.<locals>.<genexpr>#   s+     atq!%,,A,>Bas   "%)lenr   dict	enumerate)r   valuess   ` r   )get_x_www_form_urlenconded_dict_from_listr$      sC    
6{a  S )6!955ayY_O`aaa    c                     t        | t        t        f      st        |       S | D cg c]  }t	        |       c}S c c}w N)
isinstancelisttupler   _format_list)objes     r   r+   r+   &   s2    cD%=)~%()LO)))s   ;RATE_LIMIT_EXCEEDED   c                    dj                  | d   | d   | d         }| j                  d      r |dj                  t        | d               z  }| j                  d      r |dj                  t        | d               z  }| j                  d	      |d
j                  | d	         z  }| j                  d      |dj                  | d         z  }|%|dkD  r | d   t        k(  r|dj                  |      z  }|S )NzRequest failed: {0} {1} ({2})statuscodemessagemissingz. Missing input parameters: {0}invalidz. Invalid input parameters: {0}max_requestz. Maximum allowed requests: {0}intervalz. Time interval in seconds: {0}r   zD. Waited a total of {0:.1f} seconds for rate limit errors to go away)r   getr+   _RATE_LIMITING_ERROR)errorrate_limit_timeoutmsgs      r   format_error_msgr=   0   s   
)
0
0hfiC
 yy077U9EU8VWWyy077U9EU8VWWyy+077m8LMMyy(077j8IJJ%*<q*@U6]VjEjU\\]oppJr%   c                        e Zd Z fdZ xZS )PluginExceptionc                 :    t         t        |   |       || _        y r'   )superr?   __init__error_message)selfr3   	__class__s     r   rB   zPluginException.__init__E   s    ot-g6$r%   __name__
__module____qualname__rB   __classcell__rE   s   @r   r?   r?   D   s    % %r%   r?   c           
         |xs d}| j                  d      }| j                  d      }|	H|	j                  |      r|	j                  |d      }|	j                  |      r|	j                  |d      }	 t        |||d||||      }|j                  }|j                         }|j                  }|s$|r||v ryt        dj                  ||||            	 t        j                  |j                  d            }d|v r-|d   d   |v r
||d   d   fS t        t        |d   |
            |dfS # t        $ rE}|j                  }|j                  }	 |j                         }n# t        $ r d	}Y nw xY wY d}~d}~wt        $ r }t        d
j                  ||            d}~ww xY w# t         $ r t        dj                  |            w xY w)i
    Make general request to Hetzner's JSON robot API.
    Does not handle rate limiting especially.
     r   r   NF)variabledisable_lookupsT)url_usernameurl_passwordforce_basic_authdataheadersmethodtimeoutr%   z8Failed request to Hetzner Robot server endpoint {0}: {1}NN@Cannot retrieve content from {0} {1}, HTTP status code {2} ({3})zutf-8r:   r2   r;   (Cannot decode content retrieved from {0})
get_optionis_templatetemplater
   r2   readreasonr   AttributeError	Exceptionr?   r   jsonloadsdecoder=   
ValueError)pluginurlrV   rW   rT   rU   accept_errorsallow_empty_result!allowed_empty_result_status_codestemplarr;   userpasswordresponser1   contentr`   r-   results                      r   raw_plugin_open_url_jsonrr   J   s    "'RM^,D  !34Ht$##T5#IDx(''5'QHi!!	
 --/ &,M"MNUUVV
 	
VGNN734fgv&-7vgv666!"26'?Wi"jkkt|3  	ffhG 	G	 iX__`cefghhi&  VHOOPSTUUVsZ   4;D/ ;F' F' /	F$8E8E"!E8"E0-E8/E00E88F$FF$'$Gc
           
      :   |xs d}| j                   d   | j                   d<   | j                   d   | j                   d<   d| j                   d<   t        | |||||      \  }
}	 t        r|
j                  rt        |
j                         }|sX|r|j                  d      |v ry| j                  dj                  |||j                  d      |j                  d                   	 | j                  |j                  d            }d|v r8|d   d   |v r
||d   d   fS | j                  t        |d   |	      |d          |d
fS # t        t        f$ r |j                  d	d
      }Y w xY w# t        $ r$ | j                  dj                  |             Y y
w xY w)rM   rN   r   rQ   r   rR   TrS   )rV   rW   rT   rU   bodyNr1   rX   rY   r<   )r<   utf8r:   r2   rZ   )r<   r:   r[   )paramsr	   r   closed	TypeErrorr_   ra   popr8   	fail_jsonr   	from_jsonre   r=   rf   )modulerh   rV   rW   rT   rU   ri   rj   rk   r;   respinforp   rq   s                 r   raw_fetch_url_jsonr      s    "'RM$*MM.$AFMM.!$*MM2D$EFMM.!(,FMM$%63vwT[bcJD$) 4;;O))+ $((8"48Y"YRYYTXXh/% 	 	
U!!'.."89fgv&-7vgv666$VG_I[\Wo   t|+ I& )((64(),  UGNNsSTUs*   #(E &7E- 'E- !E*)E*-*FFc                    | | xs d} }t         }t        | v s|dk(  r	 ||d       S t        gt        |       z   } t        j                         }d}d}	 |rd}d}nTt        j                         |z
  }|dkD  r!||z
  }	t	        t        ||	      d      }
|	|k  }n|}
t        j                  |
        ||r|n| |      \  }}|t        k7  r||fS |d   j                  d      r||d   d   cxkD  rdkD  rn n|d   d   })NrN   r   TFr:   r7   )_RATE_LIMITING_START_DELAYr9   r)   timemaxminsleepr8   )ri   check_done_timeoutcalloriginal_accept_errorscheck_done_delay
start_timefirstrW   elapsed	left_timewaitrq   r:   s                r   _handle_rate_limitr      s*   ,9=;NBM1},0Ba0G*D11)*T--@@MJEG
GEyy{Z/G!A%.8	3/;Q?#'77'JJt&-"=
 ((5= '?z*/?&/R\B]/a`a/a%gz:) r%   c
           	      f    	  	f	d}
t        | j                  d      |
      S );
    Make general request to Hetzner's JSON robot API.
    c                 0   	 t        
	| |      S )N)	rV   rW   rT   rU   ri   rj   rk   rl   r;   )rr   )accept_errors_r;   rj   rk   rT   rU   rV   rg   rl   rW   rh   s     r   r   z"plugin_open_url_json.<locals>.call   s1    '(1.O1
 	
r%   r   )r   r\   )rg   rh   rV   rW   rT   rU   ri   rj   rk   rl   r   s   `````` ``` r   plugin_open_url_jsonr      s2    
 
 45 r%   c	                 ^      fd}	t        | j                  d   |	      S )r   c                 .    t        	| |
      S )N)rV   rW   rT   rU   ri   rj   rk   r;   )r   )
r   r;   rj   rk   rT   rU   rV   r|   rW   rh   s
     r   r   zfetch_url_json.<locals>.call   s.    !(1.O1
 	
r%   r   )r   rv   )
r|   rh   rV   rW   rT   rU   ri   rj   rk   r   s
   `````` `` r   fetch_url_jsonr      s/    
 
 01 r%   c                        e Zd Z fdZ xZS )CheckDoneTimeoutExceptionc                 F    t         t        |           || _        || _        y r'   )rA   r   rB   rq   r:   )rD   rq   r:   rE   s      r   rB   z"CheckDoneTimeoutException.__init__  s    '79
r%   rF   rK   s   @r   r   r     s     r%   r   c                 R   t        j                          }|st        | |fi |\  }}	 |||	      r||	fS 	 t        j                          |z
  }
||
z
  }t        j                  t        t	        ||      d             t        | |fi |\  }}	 |||	      r||	fS ||k  rt        ||	      t)a  
    Make general request to Hetzner's JSON robot API, with retries until a condition is satisfied.

    The condition is tested by calling ``check_done_callback(result, error)``. If it is not satisfied,
    it will be retried with delays ``check_done_delay`` (in seconds) until a total timeout of
    ``check_done_timeout`` (in seconds) since the time the first request is started is reached.

    If ``skip_first`` is specified, will assume that a first call has already been made and will
    directly start with waiting.
    r   )r   r   r   r   r   r   )r|   rh   check_done_callbackr   r   
skip_firstkwargsr   rq   r:   r   r   s               r   fetch_url_json_with_retriesr     s     J&vs=f=vu-5= 
99;+&0	

3s+Y7;<&vs=f=vu-5= ''+FE:: r%   r'   )	GET
   NNNF      NN)r   r   NNNFr   N)r   r   NNNFr   )r      F)"
__future__r   r   r   r   __metaclass__+ansible.module_utils.common.text.convertersr   ansible.module_utils.sixr   +ansible.module_utils.six.moves.urllib.errorr   ansible.module_utils.urlsr	   r
   rc   r   r!   ROBOT_DEFAULT_ARGUMENT_SPECBASE_URLr$   r+   r9   r   r=   rb   r?   rr   r   r   r   r   r   r   rN   r%   r   <module>r      s    A @ B ( A 9   #540utDA!ub9  -b* -  (%i % X\DISW049Vx RV>C9C*.*UZ;B TX@EOS8 NR:?5?6	 ;r%   