B
    ?F[H                 @   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Zd dlZd dlZyd dl	Z
W n ek
rp   d dlZ
Y nX dd ZG dd deZG dd dejjZG dd	 d	ejjZG d
d dejjZG dd deZG dd deZdS )    Nc                s    fdd}|S )Nc                s   | t jkrtd tjt_rZtj rZtj rZt	j
dkrNt	|| | qt	| n0 rxtt| td nt| td d S )N   epdb)bdbZBdbQuitsysexit__excepthook__
excepthookstdoutisattystdindebugger__name__Zpost_mortemprint	tracebackprint_tb)typvaluetb)
debug_flagdebugger_flag :lib/python3.7/site-packages/boto/roboto/awsqueryrequest.pyr   &   s    


z$boto_except_hook.<locals>.excepthookr   )r   r   r   r   )r   r   r   boto_except_hook%   s    r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )Linec             C   s&   || _ || _|| _d| | _d| _d S )Nz%s	F)fmtdatalabellineprinted)selfr   r   r   r   r   r   __init__;   s
    
zLine.__init__c             C   s   |  j d| 7  _ d S )Nz%s	)r   )r   Zdatumr   r   r   appendB   s    zLine.appendc             C   s   | j st| j d| _ d S )NT)r   r   r   )r   r   r   r   print_itE   s    
zLine.print_itN)r   
__module____qualname__r    r!   r"   r   r   r   r   r   9   s   r   c                   s   e Zd Z fddZ  ZS )RequiredParamErrorc                s$   || _ d| j  }tt| | d S )Nz#Required parameters are missing: %s)requiredsuperr%   r    )r   r&   s)	__class__r   r   r    L   s    
zRequiredParamError.__init__)r   r#   r$   r    __classcell__r   r   )r)   r   r%   J   s   r%   c                   s   e Zd Z fddZ  ZS )EncoderErrorc                s   d| }t t| | d S )NzError encoding value (%s))r'   r+   r    )r   Z	error_msgr(   )r)   r   r   r    S   s    zEncoderError.__init__)r   r#   r$   r    r*   r   r   )r)   r   r+   Q   s   r+   c                   s   e Zd Z fddZ  ZS )FilterErrorc                s$   || _ d| j  }tt| | d S )NzUnknown filters: %s)filtersr'   r,   r    )r   r-   r(   )r)   r   r   r    Y   s    
zFilterError.__init__)r   r#   r$   r    r*   r   r   )r)   r   r,   W   s   r,   c               @   s^   e Zd ZedddZedd ZeZeZedd Zedd	 Z	ed
d Z
edd ZdS )EncoderNc             C   sZ   |j drd S y"t| d|j }||||| W n" tk
rT   td|j Y nX d S )N_Zencode_zUnknown type: %s)name
startswithgetattrptypeAttributeErrorr+   )clsprpvr   Zmthdr   r   r   encode`   s    zEncoder.encodec             C   s   |r
|}n|j }|||< d S )N)r0   )r5   r6   r7   r8   lr   r   r   r   encode_stringj   s    zEncoder.encode_stringc             C   s    |r
|}n|j }d| ||< d S )Nz%d)r0   )r5   r6   r7   r8   r:   r   r   r   r   encode_integeru   s    zEncoder.encode_integerc             C   s*   |r
|}n|j }|rd}nd}|||< d S )NtrueZfalse)r0   )r5   r6   r7   r8   r:   r   r   r   r   encode_boolean}   s    zEncoder.encode_booleanc             C   s   |r
|}n|j }|||< d S )N)r0   )r5   r6   r7   r8   r:   r   r   r   r   encode_datetime   s    zEncoder.encode_datetimec             C   sN   t j|}|r|}n|j}|d }x$t|D ]\}}||||d  < q.W d S )Nz.%dr   )botoutilsmklistr0   	enumerate)r5   r6   r7   r8   r:   r   ir   r   r   r   encode_array   s    zEncoder.encode_array)N)r   r#   r$   classmethodr9   r;   Zencode_fileZencode_enumr<   r>   r?   rE   r   r   r   r   r.   ^   s   	r.   c            	   @   s   e Zd ZdZdZg Zg Zg Zi ZdddddddddZ	e
dd Zd	d
 Zdd Zdd Zedd Zedd Zedd Zdd Zdd Zd,ddZd-ddZdd Zd d! Zd"d# Zd$d% Zd&d' Zd.d(d)Zd*d+ ZdS )/AWSQueryRequestN stringintZchoice)rI   ZintegerrJ   enumZdatetimeZdateTimefilebooleanc             C   s   | j S )N)r   )r5   r   r   r   r0      s    zAWSQueryRequest.namec             K   s@   || _ d | _d | _d | _d | _d | _g | _g | _i | _d | _	d S )N)
argsparsercli_optionscli_argsZcli_output_format
connectionlist_markersitem_markersrequest_paramsconnection_args)r   rN   r   r   r   r       s    zAWSQueryRequest.__init__c             C   s   |   S )N)r0   )r   r   r   r   __repr__   s    zAWSQueryRequest.__repr__c             K   s   | j d kr| jf || _ | j S )N)rR   ServiceClass)r   rN   r   r   r   get_connection   s    
zAWSQueryRequest.get_connectionc             C   s   d }| j d k	r| j j}|S )N)http_responsestatus)r   retvalr   r   r   r[      s    
zAWSQueryRequest.statusc             C   s   d }| j d k	r| j j}|S )N)rZ   reason)r   r\   r   r   r   r]      s    
zAWSQueryRequest.reasonc             C   s   d }| j d k	rt| j d}|S )NZ	requestId)aws_responser2   )r   r\   r   r   r   
request_id   s    
zAWSQueryRequest.request_idc                s   | j dg }dd | jD   fdd|D }|r@td| x|t| jD ]n\}}|d }||krL|| jd|d  < xBttj|| D ]*\}}t	
|| j|d	|d |d f  qW qLW d S )
Nr-   c             S   s   g | ]}|d  qS )r0   r   ).0fr   r   r   
<listcomp>   s    z3AWSQueryRequest.process_filters.<locals>.<listcomp>c                s   g | ]}| kr|qS r   r   )r`   ra   )filter_namesr   r   rb      s    zUnknown filters: %sr0   zFilter.%d.Namer   zFilter.%d.Value.%d)rN   getFiltersr,   rC   rU   r@   rA   rB   r.   r9   )r   r-   Zunknown_filtersrD   filterr0   jr   r   )rc   r   process_filters   s    zAWSQueryRequest.process_filtersc             K   s  | j | t| j | _d| j kr@| j d dkr@t|   dd | j| j D }x| j| j D ]}|j	r~|j	
dd}ntj|jd}d}|| j kr| j | }|dkr|j}|dk	r|j|kr||j |jr|jr||| j| nt|| j| || j krd| j|= qdW |rg }xt| j| j D ]d}|j|kr2|jrj|j	rj|d|j|jf  n*|jr|d	|j  n|d	|j  q2W td
|tjd| j  | | j dS )a  
        Responsible for walking through Params defined for the request and:

        * Matching them with keyword parameters passed to the request
          constructor or via the command line.
        * Checking to see if all required parameters have been specified
          and raising an exception, if not.
        * Encoding each value into the set of request parameters that will
          be sent in the request to the AWS service.
        debug   c             S   s   g | ]}|j s|jqS r   )Zoptionalr0   )r`   r6   r   r   r   rb      s    z0AWSQueryRequest.process_args.<locals>.<listcomp>-r/   Nz(%s, %s)z(%s),zrequest_params: %s)rN   updatecopyrV   r@   Zset_stream_loggerr0   ParamsArgs	long_namereplacerA   pythonize_namedefaultremoveZrequest_paramencoderrU   r.   r9   
short_namer!   optparse_short_nameoptparse_long_namer%   joinlogri   process_markersResponse)r   rN   r&   paramZpython_namer   r:   r6   r   r   r   process_args   sH    





zAWSQueryRequest.process_argsc             C   sd   |r4|d dkr4xN|d D ]}|  ||d  qW n,|r`|d dkr`| j| | j|d  d S )Ntypeobject
propertiesr0   array)r|   rS   r!   rT   )r   r   Z	prev_namepropr   r   r   r|     s    zAWSQueryRequest.process_markersGETc             K   s   | j f | |   | jf | j}|j|  | j|d| _| j | _	t
j| j	 | jjdkrt
jj| j| jd| _t
j| j| }|| j	 | jS t
jd| jj| jjf  t
jd| j	  || jj| jj| j	d S )N)verb   )Zlist_markerZitem_markerz%s %sz%s)r   rh   rY   rV   Zmake_requestr0   rU   rZ   readZbodyr@   r{   ri   r[   ZjsonresponseZElementrS   rT   r^   Z
XmlHandlerparseerrorr]   ResponseError)r   r   rN   Zconnhr   r   r   send%  s(    



zAWSQueryRequest.sendc             C   s   t | jd}|jddddd |jdddd	d
 |jddddd |jdddd |jddddd |jddddd |jdddd | jr| jjdddd | jjddddd | j| d S ) NzStandard Optionsz-Dz--debug
store_truezTurn on all debugging output)actionhelpz
--debuggerFz$Enable interactive debugger on error)r   rt   r   z-Uz--urlstorez(Override service URL with value providedz--regionz Name of the region to connect toz-Iz--access-key-idzOverride access key valuez-Sz--secret-keyzOverride secret key valuez	--versionzDisplay version stringz--help-filtersz!Display list of available filtersz--filterr!   z name=valuez!A filter for limiting the results)r   metavarr   )optparseZOptionGrouprO   
add_optionre   groupZadd_option_group)r   r   r   r   r   add_standard_options<  s.    





z$AWSQueryRequest.add_standard_optionsc             C   s   t |drF|jrFtd x"| jD ]}td|j|jf  q W td |jrVd| j	d< |j
rh|j
| j	d< |jrz|j| j	d< |jr|j| j	d	< |jr|j| j	d
< |jrtd td t|j|jt_d S )Nhelp_filterszAvailable filters:z%s	%sr   rj   ri   urlregionZaws_access_key_idZaws_secret_access_keyzversion x.xx)hasattrr   r   re   r0   docr   r   ri   rN   r   r   Zaccess_key_idZ
secret_keyversionr   r   r   )r   ZoptionsrN   drf   r   r   r   process_standard_optionsV  s(    

z(AWSQueryRequest.process_standard_optionsc             C   sP   d}dd | j D }|d|7 }x(| j D ]}|jr*|d|j|jf 7 }q*W |S )Nzusage: %prog [options] c             S   s   g | ]
}|j qS r   )rq   )r`   ar   r   r   rb   o  s    z-AWSQueryRequest.get_usage.<locals>.<listcomp> z


	%s - %s)rp   rz   r   rq   )r   r(   r:   r   r   r   r   	get_usagem  s    zAWSQueryRequest.get_usagec          	   C   s   t j| j|  d| _|   x| jD ]}d  } }}|j| jkrR| j|j }d}|jdkrbd}n:|jdkrt	|j
dkr|j
d d }d	}n|jdkrd	}|s|dkr&|jr| jj|j|j|||j|jd
 q&|jr&| jj|j|||j|jd
 q&W d S )N)ZdescriptionZusager   rM   r   r   r   r   r   r!   )r   r   choicesr   )r   ZOptionParserDescriptionr   rO   r   ro   r3   
CLITypeMaplenitemscardinalityrw   r   rx   ry   r   r   rq   )r   r~   r3   r   r   r   r   r   build_cli_parserv  s8    




z AWSQueryRequest.build_cli_parserc          
   C   s  | j s|   | j  \| _| _i }| | j| j| x| jD ]}|jrX|jdd}nt	j
|j}t| j|}|jdkr|r|dkrtj }nNtj|}tj|}tj|rt|}| }|  n| j d|  |||< q>W xn| jD ]d}|jr|jdd}nt	j
|j}d }|jdkrLt| jdkrR| jd }n| j}|||< qW | j| t| jdr| jj ri }x(| jj D ]}|!d\}	}|||	< qW d	| jkr| jd	 | n
|| jd	< y| " }
| #|
 W n t$k
r$ } zt%| t&d W d d }~X Y n | j'j(k
rh } z"t%d
|j)|j*f  t&d W d d }~X Y np t	j+j,j-k
r } zt%d t&d W d d }~X Y n6 t.k
r } zt%| t&d W d d }~X Y nX d S )Nrk   r/   rL   zUnable to read file: %sr   r   rf   =r-   zError(%s): %szUnable to find credentials.)/rO   r   
parse_argsrP   rQ   r   ro   rq   rr   r@   rA   rs   r0   r2   r3   r   r   r   ospath
expanduser
expandvarsisfileopencloser   rp   r   r   rN   rm   r   rf   splitmaincli_formatterr%   r   r   rX   r   Z
error_codeZerror_messageZrobotoZawsqueryserviceZNoCredentialsError	Exception)r   r   r~   Zp_namer   r   fpargrf   r0   Zresponseeerrr   r   r   do_cli  sn    

zAWSQueryRequest.do_clic             C   s   |d dkrx|d D ]h}d|krp|d |kr:||d  }|d | j krp|d }|d dkrh|dd }| }| ||| qW nj|d dkrx\|D ]T}t|||}t|trx0|D ]}|||  qW nt|tr|| |  qW d S )	Nr   r   r   r0   r(   r   r   )	rS   upper_generic_cli_formatterr   
isinstancedictr!   Z
basestringr"   )r   r   r   r   r   itemr   Z
field_namer   r   r   r     s(    




z&AWSQueryRequest._generic_cli_formatterc             C   s   |r|  | j| dS )a  
        This method is responsible for formatting the output for the
        command line interface.  The default behavior is to call the
        generic CLI formatter which attempts to print something
        reasonable.  If you want specific formatting, you should
        override this method and do your own thing.

        :type data: dict
        :param data: The data returned by AWS.
        N)r   r}   )r   r   r   r   r   r     s    zAWSQueryRequest.cli_formatter)N)r   )rH   )r   r#   r$   rX   r   ro   rp   re   r}   r   rF   r0   r    rW   rY   propertyr[   r]   r_   rh   r   r|   r   r   r   r   r   r   r   r   r   r   r   r   rG      s@   3

	?
rG   )r   r   r@   r   rn   Zboto.exceptionZboto.roboto.awsqueryservicer   r   r   r   ImportErrorZpdbr   r   r   Z	exceptionZBotoClientErrorr%   r+   r,   r.   rG   r   r   r   r   <module>   s&   >