o
    'yAf                     @   s   d dl Z d dlZ d dlZddlmZ e dZde_ddlm	Z	 ddlm
Z
 ddlT ddlmZ d	d
 Ze  G dd deZdS )    N   )_z	ddns.core)database)	providers)*)
DDNSSystemc                  C   sl   t d} | t j t jjdt jjjd}t d}|| |t j | 	| t 
 }| 	| d S )Nddnsz/dev/log)ZaddressZfacilityzddns[%(process)d]: %(message)s)logging	getLoggersetLevelINFOhandlersZSysLogHandlerZ
LOG_DAEMONZ	FormatterZsetFormatterZ
addHandlerZStreamHandler)
rootloggerZhandlerZ	formatter r   2/usr/lib/python3.10/site-packages/ddns/__init__.pysetup_logging&   s   



r   c                   @   sH   e Z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S )DDNSCoreFc                 C   s   |rt d}|t j ttd i | _t	 | _t
| j D ]\}}td|j|jf  q#g | _t| | _t| d| _d S )Nr   zDebugging mode enabledz Registered new provider: %s (%s)z/var/lib/ddns.db)r	   r
   r   DEBUGloggerdebugr   settingsr   getsorteditemsnamehandleentriesr   systemr   ZDDNSDatabaseZdb)selfr   r   r   providerr   r   r   __init__9   s   


zDDNSCore.__init__c                 C   s   t | j S )z;
			Returns a list of names of all registered providers.
		)r   r   keys)r   r   r   r   get_provider_namesS   s   zDDNSCore.get_provider_namesc                 C   s8   g }t | j D ]\}}|jdu r|| q	t |S )zj
			Returns a list with names of all registered providers
			which support token based authtentication.
		T)r   r   r   Zsupports_token_authappend)r   Ztoken_providerr   r   r   r   r   get_provider_with_token_supportY   s   

z(DDNSCore.get_provider_with_token_supportc              	   C   s6  t td|  t }||g z|dD ]	\}}|| j|< qW n
 tjy.   Y nw |	 D ]e}|dkr:q3i }||D ]\}}|||< qA||d< |
dd }|s^t d|  q3z| j| }W n tyw   t d||f  Y q3w | st d|j  q3|| fi |}|| jvr| j| q3d S )NzLoading configuration file %sZconfighostnamer   z.Entry '%s' lacks a provider setting. Skipping.z,Could not find provider '%s' for entry '%s'.z9Provider '%s' is known, but not supported on this machine)r   r   r   configparserZRawConfigParserreadr   r   ZNoSectionErrorZsectionsr   Zwarningr   KeyErrorZ	supportedr   r   r#   )r   filenameZconfigskventryr   r   r   r   r   load_configurationg   sF   

zDDNSCore.load_configurationc                 K   s4   | j D ]}|j|ksq| j|fi |  S t|)N)r   r%   _updateZDDNSHostNotFoundError)r   r%   kwargsr,   r   r   r   	updateone   s
   

zDDNSCore.updateonec                 K   s:   | j sttd dS | j D ]}| j|fi | qdS )z%
			Update all configured entries.
		z4Found no entries in the configuration file. Exiting.N)r   r   r   r   r.   )r   r/   r,   r   r   r   	updateall   s   
zDDNSCore.updateallc              
   C   s   z||d W d S  t yG } z3ttd|j|jd  td|jj|jf  |j	r<td|j	  W Y d }~d S W Y d }~d S d }~w t
y`   tjtd|j|jd dd Y d S w )	N)forcez:Dynamic DNS update for %(hostname)s (%(provider)s) failed:)r%   r   z  %s: %sz  %szPDynamic DNS update for %(hostname)s (%(provider)s) threw an unhandled exception:T)exc_info)Z	DDNSErrorr   errorr   r%   r   	__class____name__reasonmessage	Exception)r   r,   r2   er   r   r   r.      s$   

zDDNSCore._updateN)F)
r6   
__module____qualname__r    r"   r$   r-   r0   r1   r.   r   r   r   r   r   8   s    
4	r   )r	   Zlogging.handlersr&   Zi18nr   r
   r   Z	propagate r   r   errorsr   r   r   objectr   r   r   r   r   <module>   s   
