o
    i-                  
   @   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 )zConstruct 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|| |st	d| d| dt
||  qh|S )zReturn 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 |rt  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`   



/
)+
<"