U '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|kr0tj|||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/dist-packages/cloudinit/config/cc_rsyslog.pydistro_default_rsyslog_configFs   r!cCs(t|rdS|dkrdg}||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 )rZwhich)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|krT|d|d<d|krh|d|d <dgtfd |d tfd|dtfd |d tfd |d ttffd |d tfd |d tfd|dtff}|D]L\}}}||kr|||<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_configls@          r4c Csg}t|D]\}}t|trNd|kr8td|dq |d}|d|}n|}|}|}|sttd|dq tj ||}d}||krd}| |z*d} | d sd } t j ||| |d Wq tk rt td |Yq Xq |S) Ncontentz%No 'content' entry in config entry %sfilenamezEntry %s has an empty filenameZabwb )omodezFailed to write to %s) enumerater*r-LOGwarningr)stripospathjoinappendendswithrZ write_file ExceptionZlogexc) r def_fnamecfg_dirfilesZcur_posZentr5r7r;Zendlrrr apply_rsyslog_changess<   rIc Cs zt|\}}|}Wntk r8|d}}YnX|}d}t|dkr\|}n"t|dkrr|\}}n td|t|}|std||d}|dp|d}|d} |d r| d std ||r|s|}t ||||| d } | | S) Nr6zline had multiple spaces: %szInvalid host specification '%s'protoaddrZ bracket_addrport[]z"host spec had invalid brackets: %srmatchrKrLrM) COMMENT_REsplitr?r/len HOST_PORT_RErQgroup startswithrDSyslogRemotesLinevalidate) linerdataZcommentZtoksrQZ host_portrKrLrMtrrr parse_remotes_lines>           r]c@s.eZdZd ddZddZddZdd ZdS) rXNcCs\|sd}||_||_|sd}|dkr*d}n |dkr6d}||_||_|rRt||_nd|_dS)Nz*.*udp@@@tcp)rrQrKrLintrM)selfrrQrKrLrMrrr __init__s zSyslogRemotesLine.__init__c CsZ|jrHzt|jWn2tk rF}ztd|j|W5d}~XYnX|jsVtddS)Nzport '%s' is not an integerzaddress is required)rMrbr/rL)rcerrr rYszSyslogRemotesLine.validatecCsd|j|j|j|j|jfS)Nz.[name=%s match=%s proto=%s address=%s port=%s]rP)rcrrr __repr__ szSyslogRemotesLine.__repr__cCs|jd}|jdkr|d7}n|jdkr0|d7}d|jkrN|d|jd7}n ||j7}|jrl|d |j7}|jr|d |j7}|S) N r^r_rar`:rNrOz:%sz # %s)rQrKrLrMr)rcZbufrrr __str__s      zSyslogRemotesLine.__str__)NNNNN)__name__ __module__ __qualname__rdrYrfrirrrr rXs   rXc Cs|sdSg}|dk r|||D]\\}}|s4q&z|tt||dWq&tk r}ztd|||W5d}~XYq&Xq&|dk r||d|dS)N)rz!failed loading remote %s: %s [%s]r:)rCitemsr,r]r/r=r>rB)rheaderfooterlinesrrZrerrr remotes_to_rsyslog_cfg)s $ rq)cloudr(c Csxz|jddWntjk r*YdSX|jdd|jttj|jddtdW5QRXdS)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 enabledZsyslogdNdisableZonestopzOsyslogd is running before cloud-init! Please report this as bug to the porters!) rr$rProcessExecutionErrorZ reload_init contextlibsuppressr=error)rrrrr disable_and_stop_bsd_base_syslog;s ry)rrrrargsr(c Cs^d|krtd|dSt||j}|d}|drL|t|dddd|jdd}|d d krt|jj|d |d d t r|j d|t ||dstddSt |d|d|dd}|stddSzt|j|dd}Wn:tjk r0} zd}tdt| W5d} ~ XYnX|rZtt|jtd||dS)Nr z;Skipping module named %s, no 'rsyslog' key in configurationrrz# begin remotesz # end remotes)rnror"rTrr)rrenablez.Empty config rsyslog['configs'], nothing to dorr)rrFrGz0restart of syslog not necessary, no changes mader)r%FzFailed to reload syslog %sz%s configured %s files)r=debugr4rrCrqr#rZinstall_packagesrZis_BSDr$ryrIr'rrur>r,r Z reset_loggingZ setup_loggingr) rrrrrzr1rr&ZchangesZ restartedrerrr handleSsb     " r})Nr )r)N)NN).__doc__rvrZloggingr@reZ cloudinitrrrZcloudinit.cloudrZcloudinit.configrZcloudinit.config.schemarZcloudinit.distrosrr Z cloudinit.logr Zcloudinit.settingsr r__annotations__rrZ getLoggerrjr=compilerRrUr!rr'r-r4rIr]rXrqryr,r+r}rrrr  sf          /) &?