o
    Afj                     @   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d dl
Zd dlmZmZmZ dZdZe dZde_G dd deZdS )	    N)DatabaseDATABASE_VERSION_LATEST__version__zlocation.db.xz)z&https://location.ipfire.org/databases/zlocation.downloader   c                   @   sL   e Zd ZedfddZdd Zdi fddZdd	 Zdd
dZdddZ	dS )
DownloaderNc                 C   s.   || _ t|pt| _t| j |  | _d S N)versionlistMIRRORSmirrorsrandomZshuffle_get_proxiesproxies)selfr   r    r   8/usr/lib/python3.10/site-packages/location/downloader.py__init__*   s   zDownloader.__init__c                 C   s0   i }dD ]}t jd| d }|r|||< q|S )N)ZhttpsZhttpz%s_proxy)osenvironget)r   r   protocolproxyr   r   r   r   6   s   zDownloader._get_proxiesc                 C   sp   |r	t j||}t jj|dd}|ddt i |D ]
}||||  q| jD ]}|	| j| | q*|S )NZGET)methodz
User-Agentzlocation/%s)
urllibparseZurljoinrequestZRequestupdater   Z
add_headerr   Z	set_proxy)r   urlbaseurlheadersreqheaderr   r   r   r   _make_requestA   s   
zDownloader._make_requestc              
   K   s  t d|j|jf  t d|j  t d | D ]\}}t d||f  qztjj|fi |}W n/ tj	j
ye } z!t d|j  t d |jD ]}t d||j| f  qP|d }~ww t d|j  t d | D ]\}}t d||f  qw|S )NzHTTP %s Request to %sz	URL: %sz		Headers:z		%s: %szHTTP Response: %s)logdebugr   ZhostZfull_urlZheader_itemsr   r   Zurlopenerror	HTTPErrorcoder   Z
getheaders)r   r    kwargskvreser!   r   r   r   _send_requestV   s(   



zDownloader._send_requestc                 K   s  d| j tf }i }|rtdt||d< tj|dd}| | jD ]}| j|||d}	z5| 	|	"}
t
 }	 |
d}|sAn||}|rM|| q9W d    n1 sXw   Y  |  W nG t
jy| } ztd	|  W Y d }~q#d }~w tjjy } z |jd
krtd|  n	td||f  |  W Y d }~q#d }~ww | |||std |  q#t|jtjtjB tjB  |  W  d    S W d    n1 sw   Y  t |j t!|)Nz%s/%s%a, %d %b %Y %H:%M:%S GMTzIf-Modified-SinceF)dirdelete)r   r   Ti   z(Could not decompress downloaded file: %si0  z9%s is serving an outdated database. Trying next mirror...z%s reported: %sz6Downloaded database is outdated. Trying next mirror...)"r   DATABASE_FILENAMEtimestrftimegmtimetempfileZNamedTemporaryFiler   r"   r-   lzmaZLZMADecompressorread
decompresswriteflushZ	LZMAErrorr#   Zwarningr   r%   r&   r'   truncate_check_databaser   chmodnamestatS_IRUSRS_IRGRPS_IROTHunlinkFileNotFoundError)r   
public_key	timestampZtmpdirr(   r   r   tZmirrorr    r+   ZdecompressorZbufr,   r   r   r   downloads   s\   






9zDownloader.downloadc              	   C   s   t d|j  t|j}|r|j|k rdS t dtdt|j  t	|d}|
|s>t d 	 W d   dS W d   dS 1 sIw   Y  dS )	za
			Checks the downloaded database if it can be opened,
			verified and if it is recent enough
		z!Opening downloaded database at %sFzDownloaded new database from %sr.   rzCould not verify databaseNT)r#   r$   r>   r   Z
created_atinfor2   r3   r4   openZverifyr%   )r   frE   rF   Zdbr   r   r   r<      s"   




zDownloader._check_database)NNr   )
__name__
__module____qualname__r   r   r   r"   r-   rH   r<   r   r   r   r   r   )   s    
Gr   )Zloggingr6   r   r   r?   r5   r2   Zurllib.errorr   Zurllib.parseZurllib.requestZ	_locationr   r   r   r1   r
   Z	getLoggerr#   Z	propagateobjectr   r   r   r   r   <module>   s    
