
    >Tf#                        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 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mZ d dlmZ ddlmZ dZ e j        d          Z  e             G d de                      Z! e             G d de                      Z" e             G d de                      Z#dS )    N)contextmanager)Path)urlparse)forms)settings)ImproperlyConfigured)gettext)DataBackend)register_data_backend)HTTP_PROXY_SUPPORTED_SCHEMAS!HTTP_PROXY_SUPPORTED_SOCK_SCHEMAS)ProxyPoolManager   )	SyncError)
GitBackendLocalBackend	S3Backendznetbox.data_backendsc                   B    e Zd ZdZ ed          ZdZed             ZdS )r   localLocalTc              #   x   K   t                               d           t          | j                  j        }|V  d S )Nz)Data source type is local; skipping fetch)loggerdebugr   urlpath)self
local_paths     7/var/www/html/netbox-4.1.3/netbox/core/data_backends.pyfetchzLocalBackend.fetch#   s=      ABBBdh'',
    N)	__name__
__module____qualname__name_labelis_localr   r    r    r   r   r      sD        DAgJJEH  ^  r    r   c            
       n   e Zd ZdZdZ ej        d ed           ej        ddi           ed          	           ej        d ed
           ej        ddi           ed          	           ej        d ed           ej        ddi                    dZ	dgZ
d Zed             ZdS )r   gitGitFUsernameclassform-controlattrsz"Only used for cloning with HTTP(S))requiredr&   widget	help_textPasswordBranch)r1   r&   r2   )usernamepasswordbranchr7   c                    ddl m}  |            }d| _        t          j        rt          j                            | j        d           x}rt          |          j        t          vr$t          dt          |          j                   | j        dv r9|                    dd|           t          |          j        t          v rd| _        |S )	Nr   )
ConfigDictFz)Unsupported Git DataSource proxy scheme: httphttpsr<   proxyT)dulwich.configr:   	use_socksr   HTTP_PROXIESget
url_schemer   schemer   r   setr   )r   r:   configr>   s       r   init_configzGitBackend.init_configD   s    ------    	. -11$/4HHHu .E??)1MMM./s[cdi[j[j[q/s/sttt?&777JJvw666-1RRR)-r    c              #   r  K   ddl m} t          j                    }| j                            d          | j        |                                d}| j        r4t          t          j                            | j                            |d<   | j        dv rb| j                            d          rH|                    | j                            d          | j                            d          d	           | j        r
d
|d<   d|d<   t                              d| j                    	  |j        | j        |j        fi | nU# t&          $ rH}t)          t+          d                              t/          |          j        |                    d }~ww xY w|j        V  |                                 d S )Nr   )	porcelainr8   )r8   rF   	errstreampool_managerr;   r6   r7   )r6   r7   Tquietr   depthzCloning git repo: z-Fetching remote data failed ({name}): {error})r$   error)dulwichrI   tempfileTemporaryDirectoryparamsrB   rF   
NoneStreamr@   r   r   rA   rC   updater   r   r   cloner$   BaseExceptionr   r%   formattyper!   cleanup)r   rI   r   
clone_argses        r   r   zGitBackend.fetchX   s     %%%%%%022
 kooh//k"--//
 

 > 	f)9(:O:S:STXTc:d:d)e)eJ~&?///{z** !!$(KOOJ$?$?$(KOOJ$?$?    ? 	$"&Jw"#Jw4$(44555	wIODHjoDDDDDD 	w 	w 	wAMNNUU[_`a[b[b[kstUuuvvv	w os   +E 
FAFFN)r!   r"   r#   r$   r&   r   	CharFieldr%   	TextInput
parameterssensitive_parametersrG   r   r   r(   r    r   r   r   +   s/       DE#EO!J--"5?'>)BCCCa<==	
 
 
 $EO!J--"5?'>)BCCCa<==	
 
 
 "%/!H++"5?'>)BCCC
 
 
 J& '<  ( # # ^# # #r    r   c                   F   e Zd ZdZdZ ej         ed           ej        ddi                     ej         ed           ej        ddi                    d	Z	d
gZ
dZd Zed             Zed             Zed             Zed             Zed             ZdS )r   z	amazon-s3z	Amazon S3zAWS access key IDr-   r.   r/   )r&   r2   zAWS secret access key)aws_access_key_idaws_secret_access_keyrb   z s3\.([a-z0-9-]+)\.amazonaws\.comc                 :    ddl m}  |t          j                  S )Nr   )Config)proxies)botocore.configrd   r   rA   )r   Boto3Configs     r   rG   zS3Backend.init_config   s5    999999 {)
 
 
 	
r    c              #     K   dd l }t          j                    }| j                            d          }| j                            d          }|                    d| j        ||| j        | j                  }|	                    | j
                  }|j                            | j                  D ]}t          j                            |j        |j                  }t'          t          j                            |                                        dd           |                    |j        |           |j        V  |                                 d S )	Nr   ra   rb   s3)region_namera   rb   rF   endpoint_url)PrefixT)parentsexist_ok)boto3rP   rQ   rR   rB   resource_region_namerF   _endpoint_urlBucket_bucket_nameobjectsfilter_remote_pathosr   joinr$   keyr   dirnamemkdirdownload_filerY   )	r   ro   r   ra   rb   ri   bucketobjlocal_filenames	            r   r   zS3Backend.fetch   sA     022
 !KOO,?@@ $0G H H^^)/"7;+  
 
 4,-- >((0A(BB 	: 	:CW\\*/37CCN001177t7TTT  .9999or    c                     t          | j                  j        }t          j        | j        |          x}r|                    d          S d S )Nr   )r   r   netlocrematchREGION_REGEXgroup)r   domainms      r   rq   zS3Backend._region_name   sE    $(##**F3331 	771::tr    c                     t          | j                  j                            d          }|                    d          d         S )N/r   r   r   r   lstripsplitr   url_paths     r   rt   zS3Backend._bucket_name   s9    DH%%*11#66~~c""1%%r    c                     t          | j                  }|                    dddd                                          S )N )rR   fragmentqueryr   )r   r   _replacegeturlr   s     r   rr   zS3Backend._endpoint_url   s:    DH%%  Rr KKRRTTTr    c                     t          | j                  j                            d          }d|v r|                    dd          d         S dS )Nr   r   r   r   r   s     r   rw   zS3Backend._remote_path   sI    DH%%*11#66(??>>#q))!,,rr    N)r!   r"   r#   r$   r&   r   r\   r%   r]   r^   r_   r   rG   r   r   propertyrq   rt   rr   rw   r(   r    r   r   r      sK       DE,U_!'(("5?'>)BCCC
 
 
 "1!+,,"5?'>)BCCC"
 "
 "
	 	J 446L
 
 
   ^:   X & & X& U U XU   X  r    r   )$loggingrx   r   rP   
contextlibr   pathlibr   urllib.parser   djangor   django.confr   django.core.exceptionsr   django.utils.translationr	   r%   netbox.data_backendsr
   netbox.utilsr   utilities.constantsr   r   utilities.socksr   
exceptionsr   __all__	getLoggerr   r   r   r   r(   r    r   <module>r      s     				 				  % % % % % %       ! ! ! ! ! !                   7 7 7 7 7 7 1 1 1 1 1 1 , , , , , , . . . . . . _ _ _ _ _ _ _ _ , , , , , , ! ! ! ! ! ! 
	1	2	2 
 
 
 
 
; 
 
 
 P P P P P P P Pf M M M M M M M M M Mr    