x[h- UdZddlZddlZddlZddlZddlZddlmZmZm Z ddl m Z ddl m Z ddlmZddlmZmZddlmZdd lmZd eged gd Zeed <dddiidd gddZdd gdddgdddgddZej6eZdefdZd*dZd+dZ de!dede!fdZ"d Z#d,d!Z$Gd"d#Z%d-d$Z&d%e ddfd&Z'd'e(de d%e d(e)ddf d)Z*y).z-Rsyslog: Configure system logging via rsyslogN) lifecyclesubputil)Cloud)Config) MetaSchema) ALL_DISTROSDistro)loggers) PER_INSTANCE cc_rsyslogrsyslog)iddistros frequencyactivate_by_schema_keysmetaz/etc/rsyslog.dz20-cloud-config.confautorsyslogdF) config_dirconfig_filenameservice_reload_commandremotesconfigs check_exepackagesinstall_rsyslogz/usr/local/etc/rsyslog.d)rrzsysutils/rsyslogz/usr/pkg/etc/rsyslog.d)freebsdopenbsdnetbsddistroct}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 mergemanydictname)r!dcfgcfgs =/usr/lib/python3/dist-packages/cloudinit/config/cc_rsyslog.pydistro_default_rsyslog_configr-?sH 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_funcrrs r,rrMs( zz);r.c|dk(r$|jdd}|jd|Stj|dS)Nrrsyslog_svcnamerz try-reloadT)capture) get_optionmanage_servicer)r!commandservices r, reload_syslogr9^sA&##$5yA$$\7;; 99Wd ++r.r+returnc 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_versionrrsyslog_filenamer rsyslog_dirrrrrrrzInvalid type for key `z`. Expected type(s): z. Current type: ) getr- isinstancelistr deprecatestrdictbool ValueErrortype)r+r!mycfg distro_configfillupkeydefaultvtypess r, load_configrOes 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 tjd|\}}|j}|jj}d}t |dk(r|}n"t |dk(r|\}}ntd|ztj d|}|std|z|j d}|j dxs|j d }|j d } |jd r|jd std |z|r|s|}t||||| } | j| S#t$r|d}}Y'wxYw)Nz [ ]*[#]+[ ]*rRzline had multiple spaces: %sz_^(?P[@]{0,2})(([\[](?P[^\]]*)[\]])|(?P[^:]*))([:](?P[0-9]+))?$zInvalid host specification '%s'protoaddr bracket_addrport[]z"host spec had invalid brackets: %sr)matchrnrorq) resplitr\rGlenrugroup startswithraSyslogRemotesLinevalidate) liner)datacommenttoksru host_portrnrorqts r,parse_remotes_linersO%$7 g--/ ::<   D E 4yA~ Tay7$>?? 88 #   D :YFGG JJw E ::f  ;N!;D ::f D sDMM#$6=DEEt e$T AJJL HI %tg%s)E EEc(eZdZ ddZdZdZdZy)r{Nc|sd}||_||_|sd}|dk(rd}n|dk(rd}||_||_|t ||_yd|_y)Nz*.*udp@@@tcp)r)rurnrointrq)selfr)rurnrorqs r,__init__zSyslogRemotesLine.__init__s^E  E C<E d]E  !%!1CI t r.c|jr t|j|js tdy#t$r}td|jz|d}~wwxYw)Nzport '%s' is not an integerzaddress is required)rqrrGro)res r,r|zSyslogRemotesLine.validatesa 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=rsrt)rs r,__repr__zSyslogRemotesLine.__repr__s/ II JJ JJ II II   r.cT|jdz}|jdk(r|dz }n|jdk(r|dz }d|jvr|d|jzdzz }n||jz }|jr|d |jzz }|jr|d |jzz }|S) N rrrr:rrrsz:%sz # %s)rurnrorqr))rbufs r,__str__zSyslogRemotesLine.__str__sjj3 ::  3JC ZZ5 4KC $))  3?S( (C 499 C 99 5499$ $C 99 7TYY& &C r.)NNNNN)__name__ __module__ __qualname__rr|rrr.r,r{r{sAE<$ 4 r.r{c ^|syg}||j||jD].\}}|s |jtt||0||j|dj|dzS#t$r"}t j d|||Yd}~~d}~wwxYw)N)r)z!failed loading remote %s: %s [%s]rW)r`itemsrDrrGrZr[r_)rheaderfooterlinesr)r}rs r,remotes_to_rsyslog_cfgr$s  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!r6rProcessExecutionError reload_init contextlibsuppressrZerror)rs r, disable_and_stop_bsd_base_syslogr6s  ##Iy9 LL 95 LL   T77 8   ##Iy9  8    % %   sB272C 2CC Cr)argscd|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 configurationrrz# begin remotesz # end remotes)rrr3rTrr)rrenablez.Empty config rsyslog['configs'], nothing to dorr)rrerfz0restart of syslog not necessary, no changes mader)r7FzFailed to reload syslog %sz%s configured %s files)rZdebugrOr!r`rr5rinstall_packagesris_BSDr6rrkr9rrr[rDr reset_logging setup_loggingr+) r)r+rrrIrr8changes restartedrs r,handlerNs I4   U\\ *EIG Y "i (&  ll%%&7CG 4' LL ) ):&K(  {{} ##Hg6(/   BC#i )*l#G  DE:! LL%(@"A  eii( *D':  % %:  0#a&99:s-FG(!GG)Nr)r)N)NN)+__doc__rr%loggingr]rv cloudinitrrrcloudinit.cloudrcloudinit.configrcloudinit.config.schemarcloudinit.distrosr r cloudinit.logr cloudinit.settingsr r__annotations__r&r$ getLoggerrrZr-rr9rErOrkrr{rrrDrBrrr.r,rsG4  ++!#.1!+ } ){ j#-$  1K 1'( /'( g! & ",,T,6,d,^&R( V99x#$ E d 0=;=;6=;%=;t=;=;r.