f5 &UdZddlZddlZddlZddlZddlZddlmZddlm Z m Z m Z ddl m Z ddlmZddlmZmZddlmZmZdd lmZd Zd d d eegeedededgdgdZeed<eeZdddiiddgddZddgdddgdddgddZej:eZej@dZ!ej@d Z"d!efd"Z#d2d#Z$d3d$Z%d%e&d!ed&e&fd'Z'd(Z(d4d)Z)Gd*d+Z*d5d,Z+d-e d&dfd.Z,d/e-d%ed-e d0e.d&df d1Z/y)6z-Rsyslog: Configure system logging via rsyslogN)dedent)logsubputil)Cloud)Config) MetaSchema get_meta_doc) ALL_DISTROSDistro) PER_INSTANCEamThis 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_rsyslogRsyslogz$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)idnametitle descriptiondistros frequencyexamplesactivate_by_schema_keysmetaz/etc/rsyslog.dz20-cloud-config.confautorsyslogdF) config_dirconfig_filenameservice_reload_commandremotesconfigs check_exepackagesinstall_rsyslogz/usr/local/etc/rsyslog.d)rr"zsysutils/rsyslogz/usr/pkg/etc/rsyslog.d)freebsdopenbsdnetbsdz [ ]*[#]+[ ]*z_^(?P[@]{0,2})(([\[](?P[^\]]*)[\]])|(?P[^:]*))([:](?P[0-9]+))?$distroct}tjt}|j|vr&t j |||j gd}|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_OVERRIDEScopyRSYSLOG_CONFIGosfamilyr mergemanydictr)r'dcfgcfgs =/usr/lib/python3/dist-packages/cloudinit/config/cc_rsyslog.pydistro_default_rsyslog_configr2sH D ))N #C $  #tFKK'8!94H JcJtj|ry|dg}||y)aiInstall 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)rwhich) install_funcr"r!s r1r#r#s( zz);r3c|dk(r$|jdd}|jd|Stj|dS)Nrrsyslog_svcnamerz try-reloadT)capture) get_optionmanage_servicer)r'commandservices r1 reload_syslogr>sA&##$5yA$$\7;; 99Wd ++r3r0returnc D|jdi}t|}t|jdtrBt j ddd|jdi}d|vr|d|d<d|vr|d|d <dgtfd |d t fd|dt fd |d tfd |d t tffd |d t fd |d tfd|dtff}|D]?\}}}||vr|||<t|||r!td|d|dt|||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. rz)The rsyslog key with value of type 'list'z22.2) deprecateddeprecated_versionr rsyslog_filenamer rsyslog_dirrrrr!r"r#zInvalid type for key `z`. Expected type(s): z. Current type: ) getr2 isinstancelistr deprecatestrdictbool ValueErrortype)r0r'mycfg distro_configfillupkeydefaultvtypess r1 load_configrTs GGIr "E1&9M#'')$d+ B% CGGI./  $'*+='>E# $ C "%m"4E,  B }\2C8 M*;># KK8'A+ F 77<<2 5 E LL " @D##D) OOHgnE B= @D L @ KK4h ? @s0C88$D D c tj|\}}|j}|jj}d}t |dk(r|}n"t |dk(r|\}}ntd|zt j |}|std|z|jd}|jdxs|jd}|jd} |jd r|jd std |z|r|s|}t||||| } | j| S#t$r|d}}Y&wxYw) NrWzline had multiple spaces: %szInvalid host specification '%s'protoaddr bracket_addrport[]z"host spec had invalid brackets: %srmatchrsrtrv) COMMENT_REsplitrarLlen HOST_PORT_RErzgroup startswithrfSyslogRemotesLinevalidate) linerdatacommenttoksrz host_portrsrtrvts r1parse_remotes_linersD%"((. g--/ ::<   D E 4yA~ Tay7$>??   i (D :YFGG JJw E ::f  ;N!;D ::f D sDMM#$6=DEEt e$T AJJL H? %tg%s(E EEc(eZdZ ddZdZdZdZy)rNc|sd}||_||_|sd}|dk(rd}n|dk(rd}||_||_|rt ||_yd|_y)Nz*.*udp@@@tcp)rrzrsrtintrv)selfrrzrsrtrvs r1__init__zSyslogRemotesLine.__init__&s]E  E C<E d]E  D DIDIr3c|jr t|j|js tdy#t$r}td|jz|d}~wwxYw)Nzport '%s' is not an integerzaddress is required)rvrrLrt)res r1rzSyslogRemotesLine.validate;sa 99 DII yy23 3   1DII= s; A"AA"c d|jd|jd|jd|jd|jd S)Nz[name=z match=z proto=z address=z port=rxry)rs r1__repr__zSyslogRemotesLine.__repr__Gs/ II JJ JJ II II   r3cT|jdz}|jdk(r|dz }n|jdk(r|dz }d|jvr|d|jzdzz }n||jz }|jr|d |jzz }|jr|d |jzz }|S) N rrrr:rwrxz:%sz # %s)rzrsrtrvr)rbufs r1__str__zSyslogRemotesLine.__str__Psjj3 ::  3JC ZZ5 4KC $))  3?S( (C 499 C 99 5499$ $C 99 7TYY& &C r3)NNNNN)__name__ __module__ __qualname__rrrrr3r1rr%sAE* 4 r3rc ^|syg}||j||jD].\}}|s |jtt||0||j|dj|dzS#t$r"}t j d|||Yd}~~d}~wwxYw)N)rz!failed loading remote %s: %s [%s]r\)reitemsrIrrLr_r`rd)rheaderfooterlinesrrrs r1remotes_to_rsyslog_cfgrds  E  VmmoL d  L LL/4@A B L V 99U d ""  L KK;T4 K K Ls%B B, B''B,cloudc |jjdd|jjdd|jj t j tj5|jjddtjddddy#tj$rYywxYw#1swYyxYw)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 enabledsyslogdNdisableonestopzOsyslogd is running before cloud-init! Please report this as bug to the porters!) r'r;rProcessExecutionError reload_init contextlibsuppressr_error)rs r1 disable_and_stop_bsd_base_syslogrvs  ##Iy9 LL 95 LL   T77 8   ##Iy9  8    % %   sB272C 2CC Crargscd|vrtjd|yt||j}|d}|dr |j t |ddd|jj dd}|d d ur(t|jj|d |d  tjr'|jjd|t||dstjdyt|d|d|d}|stjdy t|j|d}|rKt'j(t'j*|j,tjd||yy#tj $r+} d}tj#dt%| Yd} ~ d} ~ wwxYw)Nrz;Skipping module named %s, no 'rsyslog' key in configurationr rz# begin remotesz # end remotes)rrr8r#Tr"r!)r"r!enablez.Empty config rsyslog['configs'], nothing to dorr)r rjrkz0restart of syslog not necessary, no changes mader)r<FzFailed to reload syslog %sz%s configured %s files)r_debugrTr'rerr:r#install_packagesris_BSDr;rrpr>rrr`rIr reset_logging setup_loggingr0) rr0rrrNr r=changes restartedrs r1handlers I4   U\\ *EIG Y "i (&  ll%%&7CG 4' LL ) ):&K(  {{} ##Hg6(/   BC#i )*l#G  DE:! LL%(@"A   %))$ *D':  % %:  0#a&99:s-FG(!GG)Nr)r)N)NN)0__doc__rr+loggingrbretextwrapr cloudinitrrrcloudinit.cloudrcloudinit.configrcloudinit.config.schemar r cloudinit.distrosr r cloudinit.settingsr MODULE_DESCRIPTIONr__annotations__r,r* getLoggerrr_compiler{r~r2r#r>rJrTrprrrrrIrGrrr3r1rs4  %%!#<1+"   3%}     "   7%L!*{[.j.` t #-$  1K 1'( /'( g! RZZ ( rzz  & ",,T,6,d,^&R# L<<~#$ E d 0=;=;6=;%=;t=;=;r3