o
    x[há-  ã                
   @   s„  U d 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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
egedgdœZeed< dddi i ddgddœZddgdœddgdœddgdœdœZe e¡Zdefdd„Zd3dd„Zd4dd„Z d e!ded!e!fd"d#„Z"d$d%„ Z#d5d&d'„Z$G d(d)„ d)ƒZ%d6d*d+„Z&d,ed!dfd-d.„Z'd/e(d ed,ed0e)d!df
d1d2„Z*dS )7z-Rsyslog: Configure system logging via rsyslogé    N)Ú	lifecycleÚsubpÚutil)ÚCloud)ÚConfig)Ú
MetaSchema)ÚALL_DISTROSÚDistro)Úloggers)ÚPER_INSTANCEÚ
cc_rsyslogÚrsyslog)ÚidÚdistrosÚ	frequencyÚactivate_by_schema_keysÚmetaz/etc/rsyslog.dz20-cloud-config.confÚautoÚrsyslogdF)Ú
config_dirÚconfig_filenameÚservice_reload_commandÚremotesÚconfigsÚ	check_exeÚpackagesÚinstall_rsyslogz/usr/local/etc/rsyslog.d)r   r   zsysutils/rsyslogz/usr/pkg/etc/rsyslog.d)ÚfreebsdÚopenbsdÚnetbsdÚdistroc                 C   s4   t }t t¡}| j|v rtj||| j gdd�}|S )zïConstruct a distro-specific rsyslog config dictionary by merging
       distro specific changes into base config.

    @param distro: String providing the distro class name.
    @returns: Dict of distro configurations for ntp clients.
    T)Úreverse)ÚDISTRO_OVERRIDESÚcopyÚRSYSLOG_CONFIGÚosfamilyr   ÚmergemanydictÚname)r    ÚdcfgÚcfg© r*   ú=/usr/lib/python3/dist-packages/cloudinit/config/cc_rsyslog.pyÚdistro_default_rsyslog_config?   s
   

r,   c                 C   s(   t  |¡rdS |du rdg}| |ƒ dS )ai  Install rsyslog package if not already installed.

    @param install_func: function.  This parameter is invoked with the contents
    of the packages parameter.
    @param packages: list.  This parameter defaults to ['rsyslog'].
    @param check_exe: string.  The name of a binary that indicates the package
    the specified package is already installed.
    Nr   )r   Úwhich)Úinstall_funcr   r   r*   r*   r+   r   M   s
   
	r   c                 C   s.   |dkr|   dd¡}|  d|¡S tj|dd�S )Nr   Úrsyslog_svcnamer   z
try-reloadT)Úcapture)Ú
get_optionÚmanage_servicer   )r    ÚcommandÚservicer*   r*   r+   Úreload_syslog^   s   r5   r)   Úreturnc              
   C   s"  |   di ¡}t|ƒ}t|   d¡tƒr4tjddd� d|   d¡i}d| v r*| d |d< d| v r4| d |d	< dg tfd	|d	 tfd|d tfd
|d
 tfd|d ttffd|d tfd|d tfd|d tff}|D ]&\}}}||vrv|||< qht|| |ƒsŽt	d|› d|› dt
|| ƒ› �ƒ‚qh|S )z¨Return an updated config.

    Support converting the old top level format into new format.
    Raise a `ValueError` if some top level entry has an incorrect type.
    r   z)The rsyslog key with value of type 'list'z22.2)Ú
deprecatedÚdeprecated_versionr   Úrsyslog_filenamer   Úrsyslog_dirr   r   r   r   r   r   zInvalid type for key `z`. Expected type(s): z. Current type: )Úgetr,   Ú
isinstanceÚlistr   Ú	deprecateÚstrÚdictÚboolÚ
ValueErrorÚtype)r)   r    ÚmycfgÚdistro_configÚfillupÚkeyÚdefaultÚvtypesr*   r*   r+   Úload_confige   sF   þýô

ÿÿÿrJ   c           
   	   C   sì   g }t | ƒD ]m\}}t|tƒr'd|vrt d|d ¡ q|d }| d|¡}n|}|}| ¡ }|s:t d|d ¡ qtj 	||¡}d}||vrNd}| 
|¡ zd}	| d	¡sXd	}	tj|||	 |d
� W q tys   t td|¡ Y qw |S )NÚcontentz%No 'content' entry in config entry %sé   ÚfilenamezEntry %s has an empty filenameÚabÚwbÚ Ú
)ÚomodezFailed to write to %s)Ú	enumerater<   r@   ÚLOGÚwarningr;   ÚstripÚosÚpathÚjoinÚappendÚendswithr   Ú
write_fileÚ	ExceptionÚlogexc)
r   Ú	def_fnameÚcfg_dirÚfilesÚcur_posÚentrK   rM   rR   Úendlr*   r*   r+   Úapply_rsyslog_changes”   s<   
ÿ

ÿre   c                 C   s  zt  d| ¡\}}| ¡ }W n ty   | d }}Y nw | ¡  ¡ }d }t|ƒdkr.|}nt|ƒdkr9|\}}ntd| ƒ‚t  d|¡}|sMtd| ƒ‚| d¡}| d¡p[| d	¡}| d
¡}	| d¡rq| d¡sqtd| ƒ‚|rw|sw|}t	|||||	d�}
|
 
¡  |
S )Nz[ ]*[#]+[ ]*rL   é   zline had multiple spaces: %sz_^(?P<proto>[@]{0,2})(([\[](?P<bracket_addr>[^\]]*)[\]])|(?P<addr>[^:]*))([:](?P<port>[0-9]+))?$zInvalid host specification '%s'ÚprotoÚaddrÚbracket_addrÚportú[ú]z"host spec had invalid brackets: %s©r'   Úmatchrg   rh   rj   )ÚreÚsplitrV   rB   Úlenrn   ÚgroupÚ
startswithr[   ÚSyslogRemotesLineÚvalidate)Úliner'   ÚdataÚcommentÚtoksrn   Ú	host_portrg   rh   rj   Útr*   r*   r+   Úparse_remotes_line½   s>   ÿ
ü


ÿr|   c                   @   s0   e Zd Z	d
dd„Zdd„ Zdd„ Zdd	„ ZdS )rt   Nc                 C   sb   |sd}|| _ || _|sd}|dkrd}n|dkrd}|| _|| _|d ur,t|ƒ| _d S d | _d S )Nz*.*Úudpú@ú@@Útcp)r'   rn   rg   rh   Úintrj   )Úselfr'   rn   rg   rh   rj   r*   r*   r+   Ú__init__é   s    zSyslogRemotesLine.__init__c              
   C   sP   | j rzt| j ƒ W n ty } ztd| j  ƒ|‚d }~ww | js&tdƒ‚d S )Nzport '%s' is not an integerzaddress is required)rj   r�   rB   rh   )r‚   Úer*   r*   r+   ru   û   s   ÿþ€ÿÿzSyslogRemotesLine.validatec                 C   s   d| j | j| j| j| jf S )Nz.[name=%s match=%s proto=%s address=%s port=%s]rm   )r‚   r*   r*   r+   Ú__repr__  s   ûzSyslogRemotesLine.__repr__c                 C   s„   | j d }| jdkr|d7 }n	| jdkr|d7 }d| jv r'|d| j d 7 }n|| j7 }| jr6|d	| j 7 }| jr@|d
| j 7 }|S )Nú r}   r~   r€   r   ú:rk   rl   z:%sz # %s)rn   rg   rh   rj   r'   )r‚   Úbufr*   r*   r+   Ú__str__  s   





zSyslogRemotesLine.__str__)NNNNN)Ú__name__Ú
__module__Ú__qualname__rƒ   ru   r…   r‰   r*   r*   r*   r+   rt   è   s    
ÿ	rt   c                 C   s¤   | sd S g }|d ur|  |¡ |  ¡ D ].\}}|sqz|  tt||d�ƒ¡ W q tyA } zt d|||¡ W Y d }~qd }~ww |d urK|  |¡ d |¡d S )N)r'   z!failed loading remote %s: %s [%s]rQ   )rZ   Úitemsr?   r|   rB   rT   rU   rY   )r   ÚheaderÚfooterÚlinesr'   rv   r„   r*   r*   r+   Úremotes_to_rsyslog_cfg$  s"   
€ÿ
r‘   Úcloudc                 C   sŒ   z	| j  dd¡ W n tjy   Y dS w | j  dd¡ | j  ¡  t tj¡� | j  dd¡ t d¡ W d  ƒ dS 1 s?w   Y  dS )zÍ
    This helper function bundles the necessary steps to disable BSD base syslog
    ``rc(8)`` reads its configuration on start, so after disabling syslogd, we
    need to tell rc to reload its config
    ÚenabledÚsyslogdNÚdisableÚonestopzOsyslogd is running before cloud-init! Please report this as bug to the porters!)	r    r2   r   ÚProcessExecutionErrorÚreload_initÚ
contextlibÚsuppressrT   Úerror)r’   r*   r*   r+   Ú disable_and_stop_bsd_base_syslog6  s   ÿ
ÿ"ûrœ   r'   Úargsc           
   
   C   s`  d|vrt  d| ¡ d S t||jƒ}|d }|d r&| t|d ddd�¡ |j dd¡}|d	 d
u r@t|jj|d |d d� t	 
¡ rO|j d|¡ t|ƒ |d sZt  d¡ d S t|d |d |d d�}|spt  d¡ d S zt|j|d d�}W n tjy˜ }	 zd}t  dt|	ƒ¡ W Y d }	~	nd }	~	ww |r®t ¡  t |j¡ t  d| |¡ d S d S )Nr   z;Skipping module named %s, no 'rsyslog' key in configurationr   r   z# begin remotesz# end remotes)rŽ   r�   r/   r   Tr   r   )r   r   Úenablez.Empty config rsyslog['configs'], nothing to dor   r   )r   r_   r`   z0restart of syslog not necessary, no changes mader   )r3   FzFailed to reload syslog %sz%s configured %s files)rT   ÚdebugrJ   r    rZ   r‘   r1   r   Úinstall_packagesr   Úis_BSDr2   rœ   re   r5   r   r—   rU   r?   r
   Úreset_loggingÚsetup_loggingr)   )
r'   r)   r’   r�   rD   r   r4   ÚchangesÚ	restartedr„   r*   r*   r+   ÚhandleN  sd   ÿýÿý
ý


ÿ€þùr¦   )Nr   )r   )N)NN)+Ú__doc__r™   r#   ÚloggingrW   ro   Ú	cloudinitr   r   r   Úcloudinit.cloudr   Úcloudinit.configr   Úcloudinit.config.schemar   Úcloudinit.distrosr   r	   Úcloudinit.logr
   Úcloudinit.settingsr   r   Ú__annotations__r$   r"   Ú	getLoggerrŠ   rT   r,   r   r5   r@   rJ   re   r|   rt   r‘   rœ   r?   r=   r¦   r*   r*   r*   r+   Ú<module>   s`   
üøþþþ÷


/
)+
<"