
    f5                     &   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 ddlmZ ddlmZ ddlmZmZ ddlmZmZ dd	lmZ d
Zdddeege ed       ed       ed      gdgdZeed<    ee      Z 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j:                  e      Z ej@                  d      Z! ej@                  d       Z"d!efd"Z#d2d#Z$d3d$Z%d%e&d!ed&e&fd'Z'd( Z(d4d)Z) G d* d+      Z*d5d,Z+d-ed&dfd.Z,d/e-d%ed-ed0e.d&df
d1Z/y)6z-Rsyslog: Configure system logging via rsyslog    N)dedent)logsubputil)Cloud)Config)
MetaSchemaget_meta_doc)ALL_DISTROSDistro)PER_INSTANCEam  This module configures remote system logging using rsyslog.

Configuration for remote servers can be specified in ``configs``, but for
convenience it can be specified as key value pairs in ``remotes``.

This module can install rsyslog if not already present on the system using the
``install_rsyslog``, ``packages``, and ``check_exe`` options. Installation
may not work on systems where this module runs before networking is up.

.. note::
    On BSD cloud-init will attempt to disable and stop the base system syslogd.
    This may fail on a first run.
    We recommend creating images with ``service syslogd disable``.

cc_rsyslogRsyslogz$Configure system logging via 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nametitledescription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                     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   mergemanydictr   )r'   dcfgcfgs      =/usr/lib/python3/dist-packages/cloudinit/config/cc_rsyslog.pydistro_default_rsyslog_configr2      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      r1   r#   r#      s(     zz);r3   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      r1   reload_syslogr>      sA    &##$5yA$$\7;;99Wd++r3   r0   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: )getr2   
isinstancelistr   	deprecatestrdictbool
ValueErrortype)r0   r'   mycfgdistro_configfillupkeydefaultvtypess           r1   load_configrT      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 	 Lr3   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)	enumeraterF   rJ   LOGwarningrE   stripospathjoinappendendswithr   
write_file	Exceptionlogexc)
r    	def_fnamecfg_dirfilescur_posentrV   rX   r]   endls
             r1   apply_rsyslog_changesrp      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                  |       \  }}|j                         }|j                         j                         }d }t	        |      dk(  r|}n"t	        |      dk(  r|\  }}nt        d|z        t
        j                  |      }|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)NrW      zline had multiple spaces: %szInvalid host specification '%s'protoaddrbracket_addrport[]z"host spec had invalid brackets: %sr   matchrs   rt   rv   )
COMMENT_REsplitra   rL   lenHOST_PORT_RErz   group
startswithrf   SyslogRemotesLinevalidate)liner   datacommenttoksrz   	host_portrs   rt   rv   ts              r1   parse_remotes_liner      sD   %"((.g--/ ::<DE
4yA~		Tay7$>??i(D:YFGGJJwE::f;N!;D::fDsDMM#$6=DEEte$T	A JJLH?  %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}|| _        || _        |rt	        |      | _        y d | _        y )Nz*.*udp@@@tcp)r   rz   rs   rt   intrv   )selfr   rz   rs   rt   rv   s         r1   __init__zSyslogRemotesLine.__init__&  s]     E	
EC<Ed]E
	D	DIDIr3   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)rv   r   rL   rt   )r   es     r1   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=rx   ry   )r   s    r1   __repr__zSyslogRemotesLine.__repr__G  s/    IIJJJJIIII
 	
r3   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   :rw   rx   z:%sz # %s)rz   rs   rt   rv   r   )r   bufs     r1   __str__zSyslogRemotesLine.__str__P  s    jj3::3JCZZ5 4KC$))3?S((C499C995499$$C997TYY&&C
r3   )NNNNN)__name__
__module____qualname__r   r   r   r    r3   r1   r   r   %  s    AE*
4
r3   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]r\   )re   itemsrI   r   rL   r_   r`   rd   )r   headerfooterlinesr   r   r   s          r1   remotes_to_rsyslog_cfgr   d  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'   r;   r   ProcessExecutionErrorreload_init
contextlibsuppressr_   error)r   s    r1    disable_and_stop_bsd_base_syslogr   v  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   r8   r#   Tr"   r!   )r"   r!   enablez.Empty config rsyslog['configs'], nothing to dor   r   )r    rj   rk   z0restart of syslog not necessary, no changes mader   )r<   FzFailed to reload syslog %sz%s configured %s files)r_   debugrT   r'   re   r   r:   r#   install_packagesr   is_BSDr;   r   rp   r>   r   r   r`   rI   r   reset_loggingsetup_loggingr0   )
r   r0   r   r   rN   r    r=   changes	restartedr   s
             r1   handler     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
	  	%))$ 			*D': 	 %% :	0#a&99:s   -F G(!GG)Nr   )r   )N)NN)0__doc__r   r+   loggingrb   retextwrapr   	cloudinitr   r   r   cloudinit.cloudr   cloudinit.configr   cloudinit.config.schemar	   r
   cloudinit.distrosr   r   cloudinit.settingsr   MODULE_DESCRIPTIONr   __annotations__r,   r*   	getLoggerr   r_   compiler{   r~   r2   r#   r>   rJ   rT   rp   r   r   r   r   rI   rG   r   r   r3   r1   <module>r      s   4    	 	  % % ! # < 1 + " 3%}	
 		
" 			
7%L !*{[.j .` t
 #-$	 1K
 1'(
 /'(  g!RZZ(
rzz& ",,T ,6 ,d ,^&R#L< <~#$
E 
d 
0=; =;6 =;% =;t =; =;r3   