a
    »ÏOc<  ã                   @   sì   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mZ d dlm	Z	 d dl
mZ d dlmZ dd„ Zd	d
„ ZG dd„ dƒZG dd„ dƒZdd„ ZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZdS )é    N)Úconfig)ÚresourceÚutil)ÚClient)Údump)ÚWhoisFormatc                    s   ‡ fdd„}t |ƒS )zDecorate a command handlerc                     s   ˆ | i |¤Ž}|d u rd}|S )Nr   © )ÚaÚkÚr©Úfuncr   úI/var/www/html/gsl.tools/lib/python3.9/site-packages/peeringdb/commands.pyÚ_wrapped   s    z_handler.<locals>._wrapped)Ústaticmethod)r   r   r   r   r   Ú_handler   s    r   c                 C   s^   |   ¡ }|D ]L\}}|j||jd�}t|ddƒ}|r<||ƒ t|ddƒ}|r|j|d� qdS )zAdd commands to a parser)ÚhelpÚadd_argumentsNÚhandle)Úhandler)Úadd_subparsersÚ
add_parserÚ__doc__ÚgetattrÚset_defaults)ÚparserÚcommandsZsubpsÚcmdÚclsZsubpZadd_argsr   r   r   r   Úadd_subcommands   s    r   c                   @   s"   e Zd ZdZddd„Zdd„ ZdS )ÚCommandGroupzA group of nested subcommands.Nc                 C   s   || _ |r|| _dS )zc
        Arguments:
            - commands<dict>: dict of command names to handler classes
        N)r   r   )Úselfr   r   r   r   r   Ú__init__*   s    zCommandGroup.__init__c                    s,   t ˆ | j ¡ ƒ ‡ fdd„}ˆ j|d� d S )Nc                     s   ˆ   ¡  dS )Né   )Úprint_usage©Ú_©r   r   r   Ú_usage6   s    z*CommandGroup.add_arguments.<locals>._usage)Zusage_handler)r   r   Úitemsr   )r!   r   r(   r   r'   r   r   3   s    zCommandGroup.add_arguments)N)Ú__name__Ú
__module__Ú__qualname__r   r"   r   r   r   r   r   r    '   s   
	r    c                   @   s(   e Zd ZdZedd„ ƒZedd„ ƒZdS )ÚGetzGet a resourcec                 C   sN   | j dddd� | j dddtdd	� | j d
dddd� | j dddddd� d S )NÚpoidsú+z
Object IDs©Únargsr   z--depthz-Dr   z*How many levels of nested objects to fetch)ÚdefaultÚtyper   ú--output-formatz-OÚyamlzOutput data format©r2   r   z--remotez-RÚ
store_trueFz/Fall back to API request if object is not found©Úactionr2   r   ©Úadd_argumentÚintr'   r   r   r   r   @   s$    ûÿûzGet.add_argumentsc                 K   s®   t | ƒ}|D ]œ}t |¡\}}	t |¡}
t ¡ }z| |
|	¡}W nX | | 	|
¡¡y˜   |rr| 
|
|	|¡d }n"td|› d|	› �tjd� Y  dS Y n0 t||tjƒ qd S )Nr   zNot found: ú-©Úfiler#   )r   r   Ú	split_refr   Úget_resourceÚ	peeringdbÚget_backendÚgetZobject_missing_errorZget_concreteÚfetchÚprintÚsysÚstderrr   Ústdout)r   r.   Úoutput_formatÚdepthÚremoter&   ÚclientÚpoidÚtagÚpkÚresÚBÚobjr   r   r   r   U   s    
z
Get.handleN©r*   r+   r,   r   r   r   r   r   r   r   r   r   r-   =   s
   
r-   c                 C   sB   | dkr|t j|d�S | dkr,|t j|d�S |t  | ¡|d�S d S )NÚas)ZasnZixnets)Z	ix_id__in)Úid)r   ZNetworkrA   )rO   ÚkeyZgetfuncr   r   r   Ú_lookup_tagh   s
    rX   c                   @   s(   e Zd ZdZedd„ ƒZedd„ ƒZdS )ÚWhoisz|Simulate a whois lookup;
    supports
         as<ASN> : query by AS;
         ixnets<net ID> : query networks on an IX
    c                 C   s   | j dddd� d S )Nr.   r/   z.Object IDs, or { as<ASN> | ixnets<net ID> }...r0   ©r;   r'   r   r   r   r   x   s    ÿzWhois.add_argumentsc           	   	      sŒ   t | ƒ‰ ‡ fdd„}tƒ }|D ]h}t |¡\}}zt|||ƒ}W n4 tjjyt   td|› d|› �t	j
d� Y  dS 0 | ||d ¡ qd S )Nc                    s&   ˆ j | fddi|¤Ž}|s"tjj‚|S )NrK   é   )Z	fetch_allrB   ÚsyncÚNotFoundException)rQ   ÚkwargsÚobjs©rM   r   r   rD   ‚   s    zWhois.handle.<locals>.getzNot found: resource for ú=r>   r#   r   )r   r   r   r@   rX   rB   r\   r]   rF   rG   rH   Zdisplay)	r   r.   r&   rD   ÚfmtrN   rO   rW   Údatar   r`   r   r   ~   s    
zWhois.handleNrT   r   r   r   r   rY   q   s
   
rY   c                   @   s(   e Zd ZdZedd„ ƒZedd„ ƒZdS )Ú
DumpConfigzOutput current configc                 C   s   | j dddd� d S )Nr4   r5   úoutput data formatr6   rZ   r'   r   r   r   r   –   s    ÿzDumpConfig.add_argumentsc                 K   s   t  |¡ƒ }| | tj¡ d S ©N)ÚmungeZ	get_codecr   rG   rI   )r   rJ   r&   Úcodecr   r   r   r   œ   s    zDumpConfig.handleNrT   r   r   r   r   rd   “   s
   
rd   c                   @   s(   e Zd ZdZedd„ ƒZedd„ ƒZdS )ÚPromptConfigz2Prompt for configuration values and save to a filec                 C   s(   | j dddd� | j ddddd	d
� d S )Nr4   r5   re   r6   z
--defaultsz-nr7   Fz*do not prompt, just write defaults to filer8   rZ   r'   r   r   r   r   ¥   s    ÿûzPromptConfig.add_argumentsc                 K   s>   |r| }|}nt jt j| d�}t d|¡}t j|||d� d S )N)ÚdefaultszOutput directory)rh   )ÚcfgZprompt_configZCLIENT_SCHEMAr   ÚpromptZwrite_config)r   rj   Z
config_dirrJ   r&   Z	newconfigZoutdirr   r   r   r   ²   s    zPromptConfig.handleNrT   r   r   r   r   ri   ¢   s
   
ri   c                   @   s   e Zd ZdZedd„ ƒZdS )Ú
ListCodecszList available codecsc                  K   s   t d tj ¡ ¡ƒ d S )Nú )rF   Újoinrg   rh   Zlist_codecsr%   r   r   r   r   À   s    zListCodecs.handleN©r*   r+   r,   r   r   r   r   r   r   r   rm   ½   s   rm   c                   @   s(   e Zd ZdZedd„ ƒZedd„ ƒZdS )ÚSyncz%Synchronize local tables to PeeringDBc                 C   s`   | j ddddd� | j ddddd� | j d	d
ddd� | j dd
ddd� | j dddtdd� d S )Nz-vz	--verboseÚcountzBe more verbose)r9   r   z-qz--quietzBe more quietz	--dry-runr7   FzDo not actually perform updatesr8   z--initz)Only initialize the database; do not syncz--sinceÚstoreéÿÿÿÿz6Only fetch updates since when (<0 for since last sync))r9   r2   r3   r   r:   r'   r   r   r   r   È   s*    ü
üûzSync.add_argumentsc           	      K   s’   t  ¡ }d|pd |pd }|dkr0t tj¡ |dk rDt tj¡ t| fi |¤Ž}|r\d S |dkrvtd| d d ƒ |dk r‚d }| 	||¡ d S )Nr#   r   z
Syncing tor\   Úurl)
r   Zall_resourcesrB   Z_config_logsÚloggingÚDEBUGÚWARNINGr   rF   Z
update_all)	r   ÚverboseÚquietÚinitZsincer^   ÚrsZloglvlrM   r   r   r   r   ä   s    zSync.handleNrT   r   r   r   r   rq   Å   s
   
rq   c                   @   s   e Zd ZdZedd„ ƒZdS )Ú
DropTableszDrop all database tablesc                 K   s   t | ƒ t ¡ }| ¡  d S rf   )r   rB   rC   Z
delete_all)r   r&   rR   r   r   r   r   ÿ   s    zDropTables.handleNrp   r   r   r   r   r}   ü   s   r}   )rv   rG   rg   rB   r   rk   r   r   Zpeeringdb.clientr   Zpeeringdb.output._yamlr   Zpeeringdb.whoisr   r   r   r    r-   rX   rY   rd   ri   rm   rq   r}   r   r   r   r   Ú<module>   s&   +	"7