a 'Dg/. @sUdZddlZddlZddlZddlZddlZddlmZmZm Z ddl m Z ddl m Z ddlmZddlmZmZddlmZdd lmZd eged gd Zeed <dddiidd gddZdd gdddgdddgddZeeZedZedZ edddZ!d3ddZ"d4d d!Z#e$ee$d"d#d$Z%d%d&Z&d5d'd(Z'Gd)d*d*Z(d6d+d,Z)e dd-d.d/Z*e+e e e,dd0d1d2Z-dS)7z-Rsyslog: Configure system logging via rsyslogN) lifecyclesubputil)Cloud)Config) MetaSchema) ALL_DISTROSDistro)loggers) PER_INSTANCEZ cc_rsyslogrsyslog)idZdistrosZ frequencyZactivate_by_schema_keysmetaz/etc/rsyslog.dz20-cloud-config.confautoZrsyslogdF) config_dirconfig_filenameservice_reload_commandremotesconfigs check_exepackagesinstall_rsyslogz/usr/local/etc/rsyslog.d)rrzsysutils/rsyslogz/usr/pkg/etc/rsyslog.d)ZfreebsdZopenbsdZnetbsdz [ ]*[#]+[ ]*z_^(?P[@]{0,2})(([\[](?P[^\]]*)[\]])|(?P[^:]*))([:](?P[0-9]+))?$)distrocCs4t}tt}|j|vr0tj|||jgdd}|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_CONFIGZosfamilyrZ mergemanydictname)rZdcfgcfgr?/usr/lib/python3.9/site-packages/cloudinit/config/cc_rsyslog.pydistro_default_rsyslog_configFs   r!cCs(t|rdS|durdg}||dS)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)Z install_funcrrrrr rTs rcCs.|dkr |dd}|d|Stj|ddS)Nrrsyslog_svcnamer z try-reloadT)Zcapture) get_optionmanage_servicer)rcommandservicerrr reload_sysloges  r()rrreturnc Cs"|di}t|}t|dtrhtjdddd|di}d|vrT|d|d<d|vrh|d|d <dgtfd |d tfd|dtfd |d tfd |d ttffd |d tfd |d tfd|dtff}|D]L\}}}||vr|||<qt|||st d|d|dt ||q|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'z22.2)Z deprecatedZdeprecated_versionrZrsyslog_filenamerZ rsyslog_dirrrrrrrzInvalid type for key `z`. Expected type(s): z. Current type: ) getr! isinstancelistrZ deprecatestrdictbool ValueErrortype)rrmycfgZ distro_configZfillupkeydefaultZvtypesrrr load_configlsD           r5c Csg}t|D]\}}t|trNd|vr8td|dq |d}|d|}n|}|}|}|sttd|dq tj ||}d}||vrd}| |z*d} | d sd } t j ||| |d Wq tyt td |Yq 0q |S) Ncontentz%No 'content' entry in config entry %sfilenamezEntry %s has an empty filenameabwb )omodezFailed to write to %s) enumerater+r.LOGwarningr*stripospathjoinappendendswithrZ write_file ExceptionZlogexc) r def_fnamecfg_dirfilesZcur_posZentr6r8r=Zendlrrr apply_rsyslog_changess:    rKc Cszt|\}}|}Wnty6|d}}Yn0|}d}t|dkrZ|}n"t|dkrp|\}}n td|t|}|std||d}|dp|d}|d} |d r| d std ||r|s|}t ||||| d } | | S) Nr7zline had multiple spaces: %szInvalid host specification '%s'protoaddrZ bracket_addrport[]z"host spec had invalid brackets: %srmatchrMrNrO) COMMENT_REsplitrAr0len HOST_PORT_RErSgroup startswithrFSyslogRemotesLinevalidate) linerdataZcommentZtoksrS host_portrMrNrOtrrr parse_remotes_lines6             r`c@s.eZdZd ddZddZddZdd ZdS) rZNcCs\|sd}||_||_|sd}|dkr*d}n |dkr6d}||_||_|rRt||_nd|_dS)Nz*.*udp@@@tcp)rrSrMrNintrO)selfrrSrMrNrOrrr __init__s zSyslogRemotesLine.__init__c Cs\|jrJzt|jWn4tyH}ztd|j|WYd}~n d}~00|jsXtddS)Nzport '%s' is not an integerzaddress is required)rOrer0rN)rferrr r[szSyslogRemotesLine.validatecCsd|j|j|j|j|jfS)Nz.[name=%s match=%s proto=%s address=%s port=%s]rR)rfrrr __repr__ szSyslogRemotesLine.__repr__cCs|jd}|jdkr|d7}n|jdkr0|d7}d|jvrN|d|jd7}n ||j7}|jrl|d |j7}|jr|d |j7}|S) N rarbrdrc:rPrQz:%sz # %s)rSrMrNrOr)rfbufrrr __str__s      zSyslogRemotesLine.__str__)NNNNN)__name__ __module__ __qualname__rgr[rirmrrrr rZs    rZc Cs|sdSg}|dur|||D]^\}}|s4q&z|tt||dWq&ty}ztd|||WYd}~q&d}~00q&|dur||d|dS)N)rz!failed loading remote %s: %s [%s]r<)rEitemsr-r`r0r?r@rD)rheaderfooterlinesrr\rhrrr remotes_to_rsyslog_cfg)s ( ru)cloudr)cCsz|jddWntjy(YdS0|jdd|jttj(|jddtdWdn1s|0YdS)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 ZenabledZsyslogdNdisableZonestopzOsyslogd is running before cloud-init! Please report this as bug to the porters!) rr%rProcessExecutionErrorZ reload_init contextlibsuppressr?error)rvrrr disable_and_stop_bsd_base_syslog;s r|)rrrvargsr)c Cs`d|vrtd|dSt||j}|d}|drL|t|dddd|jdd}|d d urt|jj|d |d d t r|j d|t ||dstddSt |d|d|dd}|stddSzt|j|dd}Wn<tjy2} z d}tdt| WYd} ~ n d} ~ 00|r\tt|jtd||dS)Nr z;Skipping module named %s, no 'rsyslog' key in configurationrrz# begin remotesz # end remotes)rrrsr#rTrr)rrenablez.Empty config rsyslog['configs'], nothing to dorr)rrHrIz0restart of syslog not necessary, no changes mader)r&FzFailed to reload syslog %sz%s configured %s files)r?debugr5rrErur$rZinstall_packagesrZis_BSDr%r|rKr(rrxr@r-r Z reset_loggingZ setup_loggingr) rrrvr}r2rr'ZchangesZ restartedrhrrr handleSs^     & r)Nr )r)N)NN).__doc__ryrZloggingrBreZ cloudinitrrrZcloudinit.cloudrZcloudinit.configrZcloudinit.config.schemarZcloudinit.distrosrr Z cloudinit.logr Zcloudinit.settingsr r__annotations__rrZ getLoggerrnr?compilerTrWr!rr(r.r5rKr`rZrur|r-r,rrrrr  sf          /) &?