
    x[h-              
          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j6                  e      ZdefdZd*dZd+dZ de!dede!fdZ"d  Z#d,d!Z$ G d" d#      Z%d-d$Z&d%eddfd&Z'd'e(ded%ed(e)ddf
d)Z*y).z-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                     t         }t        j                  t              }| j                  |v r&t	        j
                  ||| j                     g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cfgs      =/usr/lib/python3/dist-packages/cloudinit/config/cc_rsyslog.pydistro_default_rsyslog_configr-   ?   sH     D
))N
#C$  #tFKK'8!94HJ    c                 J    t        j                  |      ry|dg} | |       y)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   s      r,   r   r   M   s(     zz);r.   c                     |dk(  r$| j                  dd      }| j                  d|      S t        j                  |d      S )Nr   rsyslog_svcnamer   z
try-reloadT)capture)
get_optionmanage_servicer   )r!   commandservices      r,   reload_syslogr9   ^   sA    &##$5yA$$\7;;99Wd++r.   r+   returnc                 D   | j                  di       }t        |      }t        | j                  d      t              rBt	        j
                  dd       d| j                  d      i}d| v r| d   |d<   d| v r| 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r|||<   t        ||   |      r!t        d| d| dt        ||                 |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vtypess           r,   load_configrO   e   s    GGIr"E1&9M#'')$d+B%	
 CGGI./$'*+='>E#$C"%m"4E, 
B	}\2C8	M*;<cB	M),d3$23$K	

 
mK0#6	]:.5	M*;<dCF !' Wfe E#JE#J/(-B6( K!!%eCj!1 24 	 Lr.   c                 F   g }t        |       D ]  \  }}t        |t              r6d|vrt        j	                  d|dz          4|d   }|j                  d|      }n|}|}|j                         }|st        j	                  d|dz          |t        j                  j                  ||      }d}||vrd}|j                  |       	 d}	|j                  d	      sd	}	t        j                  |||	z   |
        |S # t        $ r t        j                  t        d|       Y w xY w)Ncontentz%No 'content' entry in config entry %s   filenamezEntry %s has an empty filenameabwb 
)omodezFailed to write to %s)	enumeraterA   rE   LOGwarningr@   stripospathjoinappendendswithr   
write_file	Exceptionlogexc)
r   	def_fnamecfg_dirfilescur_posentrQ   rS   rX   endls
             r,   apply_rsyslog_changesrk      s)    E!'*  @c4 #;Wq[ )nGwwz95HG H>>#KK8'A+F77<<2 5 ELL"	@D##D)OOHgnEB= @D L  	@KK4h?	@s   0C88$D D c                    	 t        j                  d|       \  }}|j                         }|j                         j                         }d }t	        |      dk(  r|}n"t	        |      dk(  r|\  }}nt        d|z        t        j
                  d|      }|st        d|z        |j                  d      }|j                  d      xs |j                  d	      }|j                  d
      }	|j                  d      r|j                  d      st        d|z        |r|s|}t        |||||	      }
|
j                          |
S # t        $ r | d }}Y 'w xY w)Nz[ ]*[#]+[ ]*rR      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)   matchrn   ro   rq   )resplitr\   rG   lenru   group
startswithra   SyslogRemotesLinevalidate)liner)   datacommenttoksru   	host_portrn   ro   rq   ts              r,   parse_remotes_liner      sO   %$7g--/ ::<DE
4yA~		Tay7$>??88	# 		D :YFGGJJwE::f;N!;D::fDsDMM#$6=DEEte$T	A JJLHI  %tg%s   )E EEc                   (    e Zd Z	 ddZd Zd Zd Zy)r{   Nc                     |sd}|| _         || _        |sd}|dk(  rd}n|dk(  rd}|| _        || _        |t	        |      | _        y d | _        y )Nz*.*udp@@@tcp)r)   ru   rn   ro   intrq   )selfr)   ru   rn   ro   rq   s         r,   __init__zSyslogRemotesLine.__init__   s^     E	
EC<Ed]E
	!%!1CI	t	r.   c                     | j                   r	 t        | j                          | j                  st        d      y # t        $ r}t        d| j                   z        |d }~ww xY w)Nzport '%s' is not an integerzaddress is required)rq   r   rG   ro   )r   es     r,   r|   zSyslogRemotesLine.validate   sa    99DII yy233    1DII=s   ; 	A"AA"c                     d| j                   d| j                  d| j                  d| j                  d| j                  dS )Nz[name=z match=z proto=z	 address=z port=rs   rt   )r   s    r,   __repr__zSyslogRemotesLine.__repr__  s/    IIJJJJIIII
 	
r.   c                 T   | j                   dz   }| j                  dk(  r|dz  }n| j                  dk(  r|dz  }d| j                  v r|d| j                  z   dz   z  }n|| j                  z  }| j                  r|d	| j                  z  z  }| j                  r|d
| j                  z  z  }|S )N r   r   r   r   :rr   rs   z:%sz # %s)ru   rn   ro   rq   r)   )r   bufs     r,   __str__zSyslogRemotesLine.__str__  s    jj3::3JCZZ5 4KC$))3?S((C499C995499$$C997TYY&&C
r.   )NNNNN)__name__
__module____qualname__r   r|   r   r    r.   r,   r{   r{      s    AE<$
4
r.   r{   c           	      ^   | sy g }||j                  |       | j                         D ].  \  }}|s		 |j                  t        t        ||                   0 ||j                  |       dj                  |      dz   S # t        $ r"}t
        j                  d|||       Y d }~~d }~ww xY w)N)r)   z!failed loading remote %s: %s [%s]rW   )r`   itemsrD   r   rG   rZ   r[   r_   )r   headerfooterlinesr)   r}   r   s          r,   remotes_to_rsyslog_cfgr   $  s    EVmmo L
d	LLL/4@AB	L V99Ud""	  	LKK;T4KK	Ls   %B	B,
B''B,cloudc                    	 | j                   j                  dd       | j                   j                  dd       | j                   j	                          t        j                  t        j                        5  | j                   j                  dd       t        j                  d       ddd       y# t        j                  $ r Y yw xY w# 1 sw Y   yxY w)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!   r6   r   ProcessExecutionErrorreload_init
contextlibsuppressrZ   error)r   s    r,    disable_and_stop_bsd_base_syslogr   6  s    ##Iy9 
LL	95	LL			T77	8 
 	##Iy9		8	

 
 %% 

 
s   B2 72C2CCCr)   argsc                    d|vrt         j                  d|        y t        ||j                        }|d   }|d   r |j	                  t        |d   dd             |j                  j                  dd      }|d	   d
u r(t        |j                  j                  |d   |d          t        j                         r'|j                  j                  d|       t        |       |d   st         j                  d       y t        |d   |d   |d         }|st         j                  d       y 	 t        |j                  |d         }|rKt'        j(                          t'        j*                  |j,                         t         j                  d| |       y y # t        j                   $ r+}	d}t         j#                  dt%        |	             Y d }	~	d }	~	ww xY w)Nr   z;Skipping module named %s, no 'rsyslog' key in configurationr   r   z# begin remotesz# end remotes)r   r   r3   r   Tr   r   )r   r   enablez.Empty config rsyslog['configs'], nothing to dor   r   )r   re   rf   z0restart of syslog not necessary, no changes mader   )r7   FzFailed to reload syslog %sz%s configured %s files)rZ   debugrO   r!   r`   r   r5   r   install_packagesr   is_BSDr6   r   rk   r9   r   r   r[   rD   r   reset_loggingsetup_loggingr+   )
r)   r+   r   r   rI   r   r8   changes	restartedr   s
             r,   handler   N  s   		I4	
 	U\\*EIGY"i (&	
 ll%%&7CG4'LL)):&K(	
 {{}##Hg6(/		BC#i )*l#G 		DE:!LL%(@"A
	  	eii( 			*D': 	 %% :	0#a&99:s   -F G(!GG)Nr   )r   )N)NN)+__doc__r   r%   loggingr]   rv   	cloudinitr   r   r   cloudinit.cloudr   cloudinit.configr   cloudinit.config.schemar   cloudinit.distrosr	   r
   cloudinit.logr   cloudinit.settingsr   r   __annotations__r&   r$   	getLoggerr   rZ   r-   r   r9   rE   rO   rk   r   r{   r   r   rD   rB   r   r   r.   r,   <module>r      sG   4    	 	 + + ! # . 1 ! + } ){	j  #-$	 1K
 1'(
 /'(  g!& ",,T ,6 ,d ,^&R(V9 9x#$
E 
d 
0=; =;6 =;% =;t =; =;r.   