a
    »ÏOcø  ã                   @   sÌ   d 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ZG dd	„ d	ejƒZeƒ Zefd
d„Zefdd„Zeefdd„ZG dd„ dejƒZeƒ Zdd„ Zdd„ Zeddfdd„Zddd„ZdS )zO
PeeringDB configuration module.

This defines config schemas and related I/O.
é    N)Ú	generator©Úschema)Úrecursive_update)Úpromptz~/.peeringdbc                   @   s@   e Zd ZdZG dd„ dejƒZG dd„ dejƒZeƒ Zeƒ Z	dS )ÚClientSchemaz4
    Default confu schema for PeeringDB client.
    c                   @   sz   e Zd Zejddd�Zejdddd�Zejdddd�Zej	d	d
d�Z
ejde ¡ g d�Zej	ddd�Zejdddd�ZdS )zClientSchema.SyncSchemaÚurlúhttps://www.peeringdb.com/api©ÚdefaultÚuserTÚ ©Zblankr   ÚpasswordÚstrip_tzé   Úonly)Úitemr   Útimeoutr   Úapi_keyN)Ú__name__Ú
__module__Ú__qualname__Ú_schemaÚUrlr   ÚStrr   r   ÚIntr   ÚListr   r   r   © r   r   úG/var/www/html/gsl.tools/lib/python3.9/site-packages/peeringdb/config.pyÚ
SyncSchema   s   r    c                   @   sP   e Zd ZG dd„ dejƒZejdddd�Zejddd	�Zej	d
dd	�Z
eƒ ZdS )zClientSchema.OrmSchemac                   @   sf   e Zd Zejddd�Zejddd�Zejdddd	�Zejd
dd�Z	ejdddd	�Z
ejdddd	�ZdS )z"ClientSchema.OrmSchema.OrmDbSchemaÚengineÚsqlite3r
   Únameúpeeringdb.sqlite3ÚhostTr   r   Úportr   r   r   N©r   r   r   r   r   r!   r#   r%   r   r&   r   r   r   r   r   r   ÚOrmDbSchema!   s   r(   Ú
secret_keyTr   r   ÚbackendZdjango_peeringdbr
   ÚmigrateN)r   r   r   r   ÚSchemar(   r   r)   r*   ZBoolr+   Údatabaser   r   r   r   Ú	OrmSchema    s
   r.   N)
r   r   r   Ú__doc__r   r,   r    r.   ÚsyncÚormr   r   r   r   r      s
   	r   c                 C   s
   t  | ¡S )zGet default config values.)r   Úgenerater   r   r   r   Údefault_config5   s    r3   c                 C   s>   t j | ¡}t j |¡s.| tkr.td|› �ƒ‚tjd|dd�S )zDFind and read config file for a directory, return None if not found.zConfig directory not found at ÚconfigNr
   )ÚosÚpathÚ
expanduserÚexistsÚDEFAULT_CONFIG_DIRÚOSErrorÚmungeZload_datafile)Úconf_dirZ	conf_pathr   r   r   Úread_config;   s
    r=   c                 C   s"   t |ƒ}t| ƒ}|rt||ƒ |S )zÆ
    Load config files from the specified directory, using defaults for missing values.
    Directory should contain a file named config.<ext> where <ext> is a
    supported config file format.
    )r3   r=   r   )r<   r   Údatar4   r   r   r   Úload_configG   s
    
r?   c                   @   sL   e Zd ZG dd„ dejƒZG dd„ dejƒZejdddd�Zeƒ Z	eƒ Z
d	S )
Ú_OldClientSchemac                   @   sH   e Zd Zejddd�Zejdddd�Zejdddd�Zej	d	d
d�Z
dS )z _OldClientSchema.PeeringDBSchemar   r	   r
   r   Tr   r   r   r   r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ÚPeeringDBSchemaU   s   rA   c                   @   sf   e Zd Zejddd�Zejddd�Zejdddd	�Zejd
dd�Z	ejdddd	�Z
ejdddd	�ZdS )z_OldClientSchema.DatabaseSchemar!   r"   r
   r#   r$   r%   Tr   r   r&   r   r   r   Nr'   r   r   r   r   ÚDatabaseSchema[   s   rB   Ú__config_dir__Tr   r   N)r   r   r   r   r,   rA   rB   r   rC   Ú	peeringdbr-   r   r   r   r   r@   T   s
   r@   c                 C   s(   | sdS t  t| ¡\}}}|o&|p$| S )z'Check for a config file with old schemaF)r   ÚvalidateÚ_OLD_SCHEMA)r>   ÚokÚerrorsÚwarningsr   r   r   Ú
detect_oldk   s    rJ   c                 C   s:   t ƒ }|d  |  di ¡¡ |d d  |  di ¡¡ |S )z1Convert config data with old schema to new schemar0   rD   r1   r-   )r3   ÚupdateÚget)r>   Úretr   r   r   Úconvert_olds   s    rN   ÚyamlFc                 C   s„   |sd}t  |¡ƒ }tj |¡}tj |¡s6t |¡ tj |d|jd  ¡}|rntj |¡rnt 	||d ¡ | 
| t|dƒ¡ dS )zù
    Write config values to a file.

    Arguments:
        - conf_dir<str>: path to output directory
        - codec<str>: output field format
        - backup_existing<bool>: if a config file exists,
            make a copy before overwriting
    rO   zconfig.r   z.bakÚwN)r;   Z	get_codecr5   r6   r7   r8   ÚmkdirÚjoinÚ
extensionsÚrenameÚdumpÚopen)r>   r<   ÚcodecZbackup_existingZoutpathr   r   r   Úwrite_config{   s    
rX   c           	      C   s”   i }|   ¡ D ]|\}}|}|r*|› d|› �}|du r6i }| |¡}t|tjƒr\t|||d�}n$|du rj|j}|du rvd}t||ƒ}|||< q|  |¡S )zÚ
    Utility function to recursively prompt for config values

    Arguments:
        - defaults<dict>: default values used for empty inputs
        - path<str>: path to prepend to config keys (eg. "path.keyname")
    Ú.N)Údefaultsr6   r   )	Ú
attributesrL   Ú
isinstancer   r,   Úprompt_configr   r   rE   )	ZschrZ   r6   Úoutr#   ÚattrÚfullpathr   Úvaluer   r   r   r]   •   s"    


r]   )NN)r/   r5   r;   Zconfur   r   r   Z
munge.utilr   Zpeeringdb.utilr   r9   r,   r   ZCLIENT_SCHEMAr3   r=   r?   r@   rF   rJ   rN   rX   r]   r   r   r   r   Ú<module>   s&    	ÿ
