o
    f2                  
   @   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 ddlm	Z	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
egeedededg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edZ edZ!defdd Z"d8d!d"Z#d9d#d$Z$d%e%ded&e%fd'd(Z&d)d* Z'd:d+d,Z(G d-d. d.Z)d;d/d0Z*d1ed&dfd2d3Z+d4e,d%ed1ed5e-d&df
d6d7Z.dS )<z-Rsyslog: Configure system logging via rsyslog    N)dedent)	lifecyclelogsubputil)Cloud)Config)
MetaSchema)ALL_DISTROSDistro)PER_INSTANCE
cc_rsyslogz            rsyslog:
                remotes:
                    maas: 192.168.1.1
                    juju: 10.0.4.1
                service_reload_command: auto
            a7              rsyslog:
                config_dir: /opt/etc/rsyslog.d
                config_filename: 99-late-cloud-config.conf
                configs:
                    - "*.* @@192.158.1.1"
                    - content: "*.*   @@192.0.2.1:10514"
                      filename: 01-example.conf
                    - content: |
                        *.*   @@syslogd.example.com
                remotes:
                    maas: 192.168.1.1
                    juju: 10.0.4.1
                service_reload_command: [your, syslog, restart, command]
            a              # default (no) configuration with package installation on FreeBSD
            rsyslog:
                config_dir: /usr/local/etc/rsyslog.d
                check_exe: "rsyslogd"
                packages: ["rsyslogd"]
                install_rsyslog: True
            rsyslog)iddistros	frequencyexamples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netbsdz[ ]*[#]+[ ]*z_^(?P<proto>[@]{0,2})(([\[](?P<bracket_addr>[^\]]*)[\]])|(?P<addr>[^:]*))([:](?P<port>[0-9]+))?$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_configl   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   z   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   r7   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_config   sF   

rL   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>   rB   LOGwarningr=   stripospathjoinappendendswithr   
write_file	Exceptionlogexc)
r   	def_fnamecfg_dirfilescur_posentrM   rO   rT   endlr,   r,   r-   apply_rsyslog_changes   s<   


rg   c                 C   s  zt | \}}| }W n ty   | d }}Y nw |  }d }t|dkr-|}nt|dkr8|\}}ntd| t|}|sKtd| |d}|dpY|d}|d}	|d	ro|	d
sotd| |ru|su|}t
|||||	d}
|
  |
S )NrN      zline had multiple spaces: %szInvalid host specification '%s'protoaddrbracket_addrport[]z"host spec had invalid brackets: %sr)   matchri   rj   rl   )
COMMENT_REsplitrX   rD   lenHOST_PORT_RErp   group
startswithr]   SyslogRemotesLinevalidate)liner)   datacommenttoksrp   	host_portri   rj   rl   tr,   r,   r-   parse_remotes_line   s8   




r   c                   @   s0   e Zd Z	d
ddZdd Zdd Zdd	 ZdS )rw   Nc                 C   s^   |sd}|| _ || _|sd}|dkrd}n|dkrd}|| _|| _|r*t|| _d S d | _d S )Nz*.*udp@@@tcp)r)   rp   ri   rj   intrl   )selfr)   rp   ri   rj   rl   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)rl   r   rD   rj   )r   er,   r,   r-   rx   &  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]ro   )r   r,   r,   r-   __repr__2  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   :rm   rn   z:%sz # %s)rp   ri   rj   rl   r)   )r   bufr,   r,   r-   __str__;  s   





zSyslogRemotesLine.__str__)NNNNN)__name__
__module____qualname__r   rx   r   r   r,   r,   r,   r-   rw     s    
	rw   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]rS   )r\   itemsrA   r   rD   rV   rW   r[   )r   headerfooterlinesr)   ry   r   r,   r,   r-   remotes_to_rsyslog_cfgO  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"   r4   r   ProcessExecutionErrorreload_init
contextlibsuppressrV   error)r   r,   r,   r-    disable_and_stop_bsd_base_sysloga  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   r1   r   Tr   r   )r   r   enablez.Empty config rsyslog['configs'], nothing to dor   r   )r   ra   rb   z0restart of syslog not necessary, no changes mader   )r5   FzFailed to reload syslog %sz%s configured %s files)rV   debugrL   r"   r\   r   r3   r   install_packagesr   is_BSDr4   r   rg   r7   r   r   rW   rA   r   reset_loggingsetup_loggingr+   )
r)   r+   r   r   rF   r   r6   changes	restartedr   r,   r,   r-   handley  sd   



r   )Nr   )r   )N)NN)/__doc__r   r%   loggingrY   retextwrapr   	cloudinitr   r   r   r   cloudinit.cloudr   cloudinit.configr   cloudinit.config.schemar	   cloudinit.distrosr
   r   cloudinit.settingsr   r   __annotations__r&   r$   	getLoggerr   rV   compilerq   rt   r.   r   r7   rB   rL   rg   r   rw   r   r   rA   r?   r   r,   r,   r,   r-   <module>   s|   
	&.



/
)&
?"