diff --git a/data/templates/syslog/override.conf.tmpl b/data/templates/syslog/override.conf.tmpl new file mode 100644 index 000000000..60c397fa7 --- /dev/null +++ b/data/templates/syslog/override.conf.tmpl @@ -0,0 +1,11 @@ +{% set vrf_command = 'ip vrf exec ' + vrf + ' ' if vrf is defined else '' %} +[Unit] +StartLimitIntervalSec=0 + +[Service] +ExecStart= +ExecStart={{ vrf_command }}/usr/sbin/rsyslogd -n -iNONE +Restart=always +RestartPreventExitStatus= +RestartSec=10 +RuntimeDirectoryPreserve=yes diff --git a/interface-definitions/system-syslog.xml.in b/interface-definitions/system-syslog.xml.in index f3dcae2f3..6d0feba33 100644 --- a/interface-definitions/system-syslog.xml.in +++ b/interface-definitions/system-syslog.xml.in @@ -1,962 +1,963 @@ <?xml version="1.0"?> <interfaceDefinition> <node name="system"> <children> <node name="syslog" owner="${vyos_conf_scripts_dir}/system-syslog.py"> <properties> <help>System logging</help> <priority>400</priority> </properties> <children> <tagNode name="user"> <properties> <help>Logging to specific terminal of given user</help> <constraint> <regex>[a-z_][a-z0-9_-]{1,31}[$]?</regex> </constraint> <constraintErrorMessage>illegal characters in user</constraintErrorMessage> <valueHelp> <format>username</format> <description>user login name</description> </valueHelp> </properties> <children> <tagNode name="facility"> <properties> <help>Facility for logging</help> <completionHelp> <list>auth authpriv cron daemon kern lpr mail mark news protocols security syslog user uucp local0 local1 local2 local3 local4 local5 local6 local7 all</list> </completionHelp> <constraint> <regex>^(auth|authpriv|cron|daemon|kern|lpr|mail|mark|news|protocols|security|syslog|user|uucp|local0|local1|local2|local3|local4|local5|local6|local7|all)$</regex> </constraint> <constraintErrorMessage>Invalid facility type</constraintErrorMessage> <valueHelp> <format>all</format> <description>All facilities excluding "mark"</description> </valueHelp> <valueHelp> <format>auth</format> <description>Authentication and authorization</description> </valueHelp> <valueHelp> <format>authpriv</format> <description>Non-system authorization</description> </valueHelp> <valueHelp> <format>cron</format> <description>Cron daemon</description> </valueHelp> <valueHelp> <format>daemon</format> <description>System daemons</description> </valueHelp> <valueHelp> <format>kern</format> <description>Kernel</description> </valueHelp> <valueHelp> <format>lpr</format> <description>Line printer spooler</description> </valueHelp> <valueHelp> <format>mail</format> <description>Mail subsystem</description> </valueHelp> <valueHelp> <format>mark</format> <description>Timestamp</description> </valueHelp> <valueHelp> <format>news</format> <description>USENET subsystem</description> </valueHelp> <valueHelp> <format>protocols</format> <description>depricated will be set to local7</description> </valueHelp> <valueHelp> <format>security</format> <description>depricated will be set to auth</description> </valueHelp> <valueHelp> <format>syslog</format> <description>Authentication and authorization</description> </valueHelp> <valueHelp> <format>user</format> <description>Application processes</description> </valueHelp> <valueHelp> <format>uucp</format> <description>UUCP subsystem</description> </valueHelp> <valueHelp> <format>local0</format> <description>Local facility 0</description> </valueHelp> <valueHelp> <format>local1</format> <description>Local facility 1</description> </valueHelp> <valueHelp> <format>local2</format> <description>Local facility 2</description> </valueHelp> <valueHelp> <format>local3</format> <description>Local facility 3</description> </valueHelp> <valueHelp> <format>local4</format> <description>Local facility 4</description> </valueHelp> <valueHelp> <format>local5</format> <description>Local facility 5</description> </valueHelp> <valueHelp> <format>local6</format> <description>Local facility 6</description> </valueHelp> <valueHelp> <format>local7</format> <description>Local facility 7</description> </valueHelp> </properties> <children> <leafNode name="level"> <properties> <help>Logging level</help> <completionHelp> <list>emerg alert crit err warning notice info debug all</list> </completionHelp> <constraint> <regex>^(emerg|alert|crit|err|warning|notice|info|debug|all)$</regex> </constraint> <constraintErrorMessage>Invalid loglevel</constraintErrorMessage> <valueHelp> <format>emerg</format> <description>Emergency messages</description> </valueHelp> <valueHelp> <format>alert</format> <description>Urgent messages</description> </valueHelp> <valueHelp> <format>crit</format> <description>Critical messages</description> </valueHelp> <valueHelp> <format>err</format> <description>Error messages</description> </valueHelp> <valueHelp> <format>warning</format> <description>Warning messages</description> </valueHelp> <valueHelp> <format>notice</format> <description>Messages for further investigation</description> </valueHelp> <valueHelp> <format>info</format> <description>Informational messages</description> </valueHelp> <valueHelp> <format>debug</format> <description>Debug messages</description> </valueHelp> <valueHelp> <format>all</format> <description>Log everything</description> </valueHelp> </properties> </leafNode> </children> </tagNode> </children> </tagNode> <tagNode name="host"> <properties> <help>Logging to a remote host</help> <constraint> <validator name="ip-address"/> <validator name="fqdn"/> </constraint> <constraintErrorMessage>Invalid host (FQDN or IP address)</constraintErrorMessage> <valueHelp> <format>ipv4</format> <description>Remote syslog server IPv4 address</description> </valueHelp> <valueHelp> <format>hostname</format> <description>Remote syslog server FQDN</description> </valueHelp> </properties> <children> <leafNode name="port"> <properties> <help>Destination port</help> <valueHelp> <format>u32:1-65535</format> <description>Destination port</description> </valueHelp> <constraint> <validator name="numeric" argument="--range 1-65535"/> </constraint> <constraintErrorMessage>Invalid destination port value</constraintErrorMessage> </properties> </leafNode> <tagNode name="facility"> <properties> <help>Facility for logging</help> <completionHelp> <list>auth authpriv cron daemon kern lpr mail mark news protocols security syslog user uucp local0 local1 local2 local3 local4 local5 local6 local7 all</list> </completionHelp> <constraint> <regex>^(auth|authpriv|cron|daemon|kern|lpr|mail|mark|news|protocols|security|syslog|user|uucp|local0|local1|local2|local3|local4|local5|local6|local7|all)$</regex> </constraint> <constraintErrorMessage>Invalid facility type</constraintErrorMessage> <valueHelp> <format>all</format> <description>All facilities excluding "mark"</description> </valueHelp> <valueHelp> <format>auth</format> <description>Authentication and authorization</description> </valueHelp> <valueHelp> <format>authpriv</format> <description>Non-system authorization</description> </valueHelp> <valueHelp> <format>cron</format> <description>Cron daemon</description> </valueHelp> <valueHelp> <format>daemon</format> <description>System daemons</description> </valueHelp> <valueHelp> <format>kern</format> <description>Kernel</description> </valueHelp> <valueHelp> <format>lpr</format> <description>Line printer spooler</description> </valueHelp> <valueHelp> <format>mail</format> <description>Mail subsystem</description> </valueHelp> <valueHelp> <format>mark</format> <description>Timestamp</description> </valueHelp> <valueHelp> <format>news</format> <description>USENET subsystem</description> </valueHelp> <valueHelp> <format>protocols</format> <description>depricated will be set to local7</description> </valueHelp> <valueHelp> <format>security</format> <description>depricated will be set to auth</description> </valueHelp> <valueHelp> <format>syslog</format> <description>Authentication and authorization</description> </valueHelp> <valueHelp> <format>user</format> <description>Application processes</description> </valueHelp> <valueHelp> <format>uucp</format> <description>UUCP subsystem</description> </valueHelp> <valueHelp> <format>local0</format> <description>Local facility 0</description> </valueHelp> <valueHelp> <format>local1</format> <description>Local facility 1</description> </valueHelp> <valueHelp> <format>local2</format> <description>Local facility 2</description> </valueHelp> <valueHelp> <format>local3</format> <description>Local facility 3</description> </valueHelp> <valueHelp> <format>local4</format> <description>Local facility 4</description> </valueHelp> <valueHelp> <format>local5</format> <description>Local facility 5</description> </valueHelp> <valueHelp> <format>local6</format> <description>Local facility 6</description> </valueHelp> <valueHelp> <format>local7</format> <description>Local facility 7</description> </valueHelp> </properties> <children> <leafNode name="protocol"> <properties> <help>syslog communication protocol</help> <valueHelp> <format>udp</format> <description>send log messages to remote syslog server over udp</description> </valueHelp> <valueHelp> <format>tcp</format> <description>send log messages to remote syslog server over tcp</description> </valueHelp> <completionHelp> <list>udp tcp</list> </completionHelp> <constraint> <regex>^(udp|tcp)$</regex> </constraint> <constraintErrorMessage>invalid protocol name</constraintErrorMessage> </properties> </leafNode> <leafNode name="level"> <properties> <help>Logging level</help> <completionHelp> <list>emerg alert crit err warning notice info debug all</list> </completionHelp> <constraint> <regex>^(emerg|alert|crit|err|warning|notice|info|debug|all)$</regex> </constraint> <constraintErrorMessage>Invalid loglevel</constraintErrorMessage> <valueHelp> <format>emerg</format> <description>Emergency messages</description> </valueHelp> <valueHelp> <format>alert</format> <description>Urgent messages</description> </valueHelp> <valueHelp> <format>crit</format> <description>Critical messages</description> </valueHelp> <valueHelp> <format>err</format> <description>Error messages</description> </valueHelp> <valueHelp> <format>warning</format> <description>Warning messages</description> </valueHelp> <valueHelp> <format>notice</format> <description>Messages for further investigation</description> </valueHelp> <valueHelp> <format>info</format> <description>Informational messages</description> </valueHelp> <valueHelp> <format>debug</format> <description>Debug messages</description> </valueHelp> <valueHelp> <format>all</format> <description>Log everything</description> </valueHelp> </properties> </leafNode> </children> </tagNode> <node name="format"> <properties> <help>Logging format</help> </properties> <children> <leafNode name="octet-counted"> <properties> <help>Allows for the transmission of all characters inside a syslog message</help> <valueless/> </properties> </leafNode> </children> </node> </children> </tagNode> <node name="global"> <properties> <help>Logging to system standard location</help> </properties> <children> <node name="archive"> <properties> <help>Log file size and rotation characteristics</help> </properties> <children> <leafNode name="file"> <properties> <help>Number of saved files (default is 5)</help> <constraint> <regex>[0-9]+</regex> </constraint> <constraintErrorMessage>illegal characters in number of files</constraintErrorMessage> </properties> </leafNode> <leafNode name="size"> <properties> <help>Size of log files (in kbytes, default is 256)</help> <constraint> <regex>[0-9]+</regex> </constraint> <constraintErrorMessage>illegal characters in size</constraintErrorMessage> </properties> </leafNode> </children> </node> <tagNode name="facility"> <properties> <help>Facility for logging</help> <completionHelp> <list>auth authpriv cron daemon kern lpr mail mark news protocols security syslog user uucp local0 local1 local2 local3 local4 local5 local6 local7 all</list> </completionHelp> <constraint> <regex>^(auth|authpriv|cron|daemon|kern|lpr|mail|mark|news|protocols|security|syslog|user|uucp|local0|local1|local2|local3|local4|local5|local6|local7|all)$</regex> </constraint> <constraintErrorMessage>Invalid facility type</constraintErrorMessage> <valueHelp> <format>all</format> <description>All facilities excluding "mark"</description> </valueHelp> <valueHelp> <format>auth</format> <description>Authentication and authorization</description> </valueHelp> <valueHelp> <format>authpriv</format> <description>Non-system authorization</description> </valueHelp> <valueHelp> <format>cron</format> <description>Cron daemon</description> </valueHelp> <valueHelp> <format>daemon</format> <description>System daemons</description> </valueHelp> <valueHelp> <format>kern</format> <description>Kernel</description> </valueHelp> <valueHelp> <format>lpr</format> <description>Line printer spooler</description> </valueHelp> <valueHelp> <format>mail</format> <description>Mail subsystem</description> </valueHelp> <valueHelp> <format>mark</format> <description>Timestamp</description> </valueHelp> <valueHelp> <format>news</format> <description>USENET subsystem</description> </valueHelp> <valueHelp> <format>protocols</format> <description>depricated will be set to local7</description> </valueHelp> <valueHelp> <format>security</format> <description>depricated will be set to auth</description> </valueHelp> <valueHelp> <format>syslog</format> <description>Authentication and authorization</description> </valueHelp> <valueHelp> <format>user</format> <description>Application processes</description> </valueHelp> <valueHelp> <format>uucp</format> <description>UUCP subsystem</description> </valueHelp> <valueHelp> <format>local0</format> <description>Local facility 0</description> </valueHelp> <valueHelp> <format>local1</format> <description>Local facility 1</description> </valueHelp> <valueHelp> <format>local2</format> <description>Local facility 2</description> </valueHelp> <valueHelp> <format>local3</format> <description>Local facility 3</description> </valueHelp> <valueHelp> <format>local4</format> <description>Local facility 4</description> </valueHelp> <valueHelp> <format>local5</format> <description>Local facility 5</description> </valueHelp> <valueHelp> <format>local6</format> <description>Local facility 6</description> </valueHelp> <valueHelp> <format>local7</format> <description>Local facility 7</description> </valueHelp> </properties> <children> <leafNode name="level"> <properties> <help>Logging level</help> <completionHelp> <list>emerg alert crit err warning notice info debug all</list> </completionHelp> <constraint> <regex>^(emerg|alert|crit|err|warning|notice|info|debug|all)$</regex> </constraint> <constraintErrorMessage>Invalid loglevel</constraintErrorMessage> <valueHelp> <format>emerg</format> <description>Emergency messages</description> </valueHelp> <valueHelp> <format>alert</format> <description>Urgent messages</description> </valueHelp> <valueHelp> <format>crit</format> <description>Critical messages</description> </valueHelp> <valueHelp> <format>err</format> <description>Error messages</description> </valueHelp> <valueHelp> <format>warning</format> <description>Warning messages</description> </valueHelp> <valueHelp> <format>notice</format> <description>Messages for further investigation</description> </valueHelp> <valueHelp> <format>info</format> <description>Informational messages</description> </valueHelp> <valueHelp> <format>debug</format> <description>Debug messages</description> </valueHelp> <valueHelp> <format>all</format> <description>Log everything</description> </valueHelp> </properties> </leafNode> </children> </tagNode> <node name="marker"> <properties> <help>mark messages sent to syslog</help> </properties> <children> <leafNode name="interval"> <properties> <help>time interval how often a mark message is being sent in seconds (default: 1200)</help> <constraint> <validator name="numeric" argument="--positive"/> </constraint> </properties> </leafNode> </children> </node> <leafNode name ="preserve-fqdn"> <properties> <help>uses FQDN for logging</help> <valueless /> </properties> </leafNode> </children> </node> <tagNode name="file"> <properties> <help>Logging to a file</help> <constraint> <regex>[a-zA-Z0-9\-_.]{1,255}</regex> </constraint> <constraintErrorMessage>illegal characters in filename or filename longer than 255 characters</constraintErrorMessage> </properties> <children> <node name="archive"> <properties> <help>Log file size and rotation characteristics</help> </properties> <children> <leafNode name="file"> <properties> <help>Number of saved files (default is 5)</help> <constraint> <regex>[0-9]+</regex> </constraint> <constraintErrorMessage>illegal characters in number of files</constraintErrorMessage> </properties> </leafNode> <leafNode name="size"> <properties> <help>Size of log files (in kbytes, default is 256)</help> <constraint> <regex>[0-9]+</regex> </constraint> <constraintErrorMessage>illegal characters in size</constraintErrorMessage> </properties> </leafNode> </children> </node> <tagNode name="facility"> <properties> <help>Facility for logging</help> <completionHelp> <list>auth authpriv cron daemon kern lpr mail mark news protocols security syslog user uucp local0 local1 local2 local3 local4 local5 local6 local7 all</list> </completionHelp> <constraint> <regex>^(auth|authpriv|cron|daemon|kern|lpr|mail|mark|news|protocols|security|syslog|user|uucp|local0|local1|local2|local3|local4|local5|local6|local7|all)$</regex> </constraint> <constraintErrorMessage>Invalid facility type</constraintErrorMessage> <valueHelp> <format>all</format> <description>All facilities excluding "mark"</description> </valueHelp> <valueHelp> <format>auth</format> <description>Authentication and authorization</description> </valueHelp> <valueHelp> <format>authpriv</format> <description>Non-system authorization</description> </valueHelp> <valueHelp> <format>cron</format> <description>Cron daemon</description> </valueHelp> <valueHelp> <format>daemon</format> <description>System daemons</description> </valueHelp> <valueHelp> <format>kern</format> <description>Kernel</description> </valueHelp> <valueHelp> <format>lpr</format> <description>Line printer spooler</description> </valueHelp> <valueHelp> <format>mail</format> <description>Mail subsystem</description> </valueHelp> <valueHelp> <format>mark</format> <description>Timestamp</description> </valueHelp> <valueHelp> <format>news</format> <description>USENET subsystem</description> </valueHelp> <valueHelp> <format>protocols</format> <description>depricated will be set to local7</description> </valueHelp> <valueHelp> <format>security</format> <description>depricated will be set to auth</description> </valueHelp> <valueHelp> <format>syslog</format> <description>Authentication and authorization</description> </valueHelp> <valueHelp> <format>user</format> <description>Application processes</description> </valueHelp> <valueHelp> <format>uucp</format> <description>UUCP subsystem</description> </valueHelp> <valueHelp> <format>local0</format> <description>Local facility 0</description> </valueHelp> <valueHelp> <format>local1</format> <description>Local facility 1</description> </valueHelp> <valueHelp> <format>local2</format> <description>Local facility 2</description> </valueHelp> <valueHelp> <format>local3</format> <description>Local facility 3</description> </valueHelp> <valueHelp> <format>local4</format> <description>Local facility 4</description> </valueHelp> <valueHelp> <format>local5</format> <description>Local facility 5</description> </valueHelp> <valueHelp> <format>local6</format> <description>Local facility 6</description> </valueHelp> <valueHelp> <format>local7</format> <description>Local facility 7</description> </valueHelp> </properties> <children> <leafNode name="level"> <properties> <help>Logging level</help> <completionHelp> <list>emerg alert crit err warning notice info debug all</list> </completionHelp> <constraint> <regex>^(emerg|alert|crit|err|warning|notice|info|debug|all)$</regex> </constraint> <constraintErrorMessage>Invalid loglevel</constraintErrorMessage> <valueHelp> <format>emerg</format> <description>Emergency messages</description> </valueHelp> <valueHelp> <format>alert</format> <description>Urgent messages</description> </valueHelp> <valueHelp> <format>crit</format> <description>Critical messages</description> </valueHelp> <valueHelp> <format>err</format> <description>Error messages</description> </valueHelp> <valueHelp> <format>warning</format> <description>Warning messages</description> </valueHelp> <valueHelp> <format>notice</format> <description>Messages for further investigation</description> </valueHelp> <valueHelp> <format>info</format> <description>Informational messages</description> </valueHelp> <valueHelp> <format>debug</format> <description>Debug messages</description> </valueHelp> <valueHelp> <format>all</format> <description>Log everything</description> </valueHelp> </properties> </leafNode> </children> </tagNode> </children> </tagNode> <node name="console"> <properties> <help>logging to serial console</help> </properties> <children> <tagNode name="facility"> <properties> <help>Facility for logging</help> <completionHelp> <list>auth authpriv cron daemon kern lpr mail mark news protocols security syslog user uucp local0 local1 local2 local3 local4 local5 local6 local7 all</list> </completionHelp> <constraint> <regex>^(auth|authpriv|cron|daemon|kern|lpr|mail|mark|news|protocols|security|syslog|user|uucp|local0|local1|local2|local3|local4|local5|local6|local7|all)$</regex> </constraint> <constraintErrorMessage>Invalid facility type</constraintErrorMessage> <valueHelp> <format>all</format> <description>All facilities excluding "mark"</description> </valueHelp> <valueHelp> <format>auth</format> <description>Authentication and authorization</description> </valueHelp> <valueHelp> <format>authpriv</format> <description>Non-system authorization</description> </valueHelp> <valueHelp> <format>cron</format> <description>Cron daemon</description> </valueHelp> <valueHelp> <format>daemon</format> <description>System daemons</description> </valueHelp> <valueHelp> <format>kern</format> <description>Kernel</description> </valueHelp> <valueHelp> <format>lpr</format> <description>Line printer spooler</description> </valueHelp> <valueHelp> <format>mail</format> <description>Mail subsystem</description> </valueHelp> <valueHelp> <format>mark</format> <description>Timestamp</description> </valueHelp> <valueHelp> <format>news</format> <description>USENET subsystem</description> </valueHelp> <valueHelp> <format>protocols</format> <description>depricated will be set to local7</description> </valueHelp> <valueHelp> <format>security</format> <description>depricated will be set to auth</description> </valueHelp> <valueHelp> <format>syslog</format> <description>Authentication and authorization</description> </valueHelp> <valueHelp> <format>user</format> <description>Application processes</description> </valueHelp> <valueHelp> <format>uucp</format> <description>UUCP subsystem</description> </valueHelp> <valueHelp> <format>local0</format> <description>Local facility 0</description> </valueHelp> <valueHelp> <format>local1</format> <description>Local facility 1</description> </valueHelp> <valueHelp> <format>local2</format> <description>Local facility 2</description> </valueHelp> <valueHelp> <format>local3</format> <description>Local facility 3</description> </valueHelp> <valueHelp> <format>local4</format> <description>Local facility 4</description> </valueHelp> <valueHelp> <format>local5</format> <description>Local facility 5</description> </valueHelp> <valueHelp> <format>local6</format> <description>Local facility 6</description> </valueHelp> <valueHelp> <format>local7</format> <description>Local facility 7</description> </valueHelp> </properties> <children> <leafNode name="level"> <properties> <help>Logging level</help> <completionHelp> <list>emerg alert crit err warning notice info debug all</list> </completionHelp> <constraint> <regex>^(emerg|alert|crit|err|warning|notice|info|debug|all)$</regex> </constraint> <constraintErrorMessage>Invalid loglevel</constraintErrorMessage> <valueHelp> <format>emerg</format> <description>Emergency messages</description> </valueHelp> <valueHelp> <format>alert</format> <description>Urgent messages</description> </valueHelp> <valueHelp> <format>crit</format> <description>Critical messages</description> </valueHelp> <valueHelp> <format>err</format> <description>Error messages</description> </valueHelp> <valueHelp> <format>warning</format> <description>Warning messages</description> </valueHelp> <valueHelp> <format>notice</format> <description>Messages for further investigation</description> </valueHelp> <valueHelp> <format>info</format> <description>Informational messages</description> </valueHelp> <valueHelp> <format>debug</format> <description>Debug messages</description> </valueHelp> <valueHelp> <format>all</format> <description>Log everything</description> </valueHelp> </properties> </leafNode> </children> </tagNode> </children> </node> + #include <include/interface/vrf.xml.i> </children> </node> </children> </node> </interfaceDefinition> diff --git a/src/conf_mode/system-syslog.py b/src/conf_mode/system-syslog.py index 3d8a51cd8..030192ec2 100755 --- a/src/conf_mode/system-syslog.py +++ b/src/conf_mode/system-syslog.py @@ -1,268 +1,283 @@ #!/usr/bin/env python3 # -# Copyright (C) 2018-2020 VyOS maintainers and contributors +# Copyright (C) 2018-2023 VyOS maintainers and contributors # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 or later as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. import os import re from sys import exit from vyos.config import Config +from vyos.configdict import is_node_changed +from vyos.configverify import verify_vrf from vyos import ConfigError from vyos.util import run +from vyos.util import call from vyos.template import render from vyos import airbag airbag.enable() def get_config(config=None): if config: c = config else: c = Config() if not c.exists('system syslog'): return None c.set_level('system syslog') config_data = { 'files': {}, - 'console': {}, - 'hosts': {}, - 'user': {} + 'console': {}, + 'hosts': {}, + 'user': {} } # # /etc/rsyslog.d/vyos-rsyslog.conf # 'set system syslog global' # config_data['files'].update( { 'global': { 'log-file': '/var/log/messages', 'max-size': 262144, 'action-on-max-size': '/usr/sbin/logrotate /etc/logrotate.d/vyos-rsyslog', 'selectors': '*.notice;local7.debug', 'max-files': '5', 'preserver_fqdn': False } } ) if c.exists('global marker'): config_data['files']['global']['marker'] = True if c.exists('global marker interval'): config_data['files']['global'][ 'marker-interval'] = c.return_value('global marker interval') if c.exists('global facility'): config_data['files']['global'][ 'selectors'] = generate_selectors(c, 'global facility') if c.exists('global archive size'): config_data['files']['global']['max-size'] = int( c.return_value('global archive size')) * 1024 if c.exists('global archive file'): config_data['files']['global'][ 'max-files'] = c.return_value('global archive file') if c.exists('global preserve-fqdn'): config_data['files']['global']['preserver_fqdn'] = True # # set system syslog file # - if c.exists('file'): filenames = c.list_nodes('file') for filename in filenames: config_data['files'].update( { filename: { 'log-file': '/var/log/user/' + filename, 'max-files': '5', 'action-on-max-size': '/usr/sbin/logrotate /etc/logrotate.d/' + filename, 'selectors': '*.err', 'max-size': 262144 } } ) if c.exists('file ' + filename + ' facility'): config_data['files'][filename]['selectors'] = generate_selectors( c, 'file ' + filename + ' facility') if c.exists('file ' + filename + ' archive size'): config_data['files'][filename]['max-size'] = int( c.return_value('file ' + filename + ' archive size')) * 1024 if c.exists('file ' + filename + ' archive files'): config_data['files'][filename]['max-files'] = c.return_value( 'file ' + filename + ' archive files') # set system syslog console if c.exists('console'): config_data['console'] = { '/dev/console': { 'selectors': '*.err' } } for f in c.list_nodes('console facility'): if c.exists('console facility ' + f + ' level'): config_data['console'] = { '/dev/console': { 'selectors': generate_selectors(c, 'console facility') } } # set system syslog host if c.exists('host'): rhosts = c.list_nodes('host') proto = 'udp' for rhost in rhosts: for fac in c.list_nodes('host ' + rhost + ' facility'): if c.exists('host ' + rhost + ' facility ' + fac + ' protocol'): proto = c.return_value( 'host ' + rhost + ' facility ' + fac + ' protocol') else: proto = 'udp' config_data['hosts'].update( { rhost: { 'selectors': generate_selectors(c, 'host ' + rhost + ' facility'), 'proto': proto } } ) if c.exists('host ' + rhost + ' port'): config_data['hosts'][rhost][ 'port'] = c.return_value(['host', rhost, 'port']) # set system syslog host x.x.x.x format octet-counted if c.exists('host ' + rhost + ' format octet-counted'): config_data['hosts'][rhost]['oct_count'] = True else: config_data['hosts'][rhost]['oct_count'] = False # set system syslog user if c.exists('user'): usrs = c.list_nodes('user') for usr in usrs: config_data['user'].update( { usr: { 'selectors': generate_selectors(c, 'user ' + usr + ' facility') } } ) + if c.exists('vrf'): + config_data.update({'vrf' : c.return_value('vrf')}) + return config_data def generate_selectors(c, config_node): # protocols and security are being mapped here # for backward compatibility with old configs # security and protocol mappings can be removed later nodes = c.list_nodes(config_node) selectors = "" for node in nodes: lvl = c.return_value(config_node + ' ' + node + ' level') if lvl == None: lvl = "err" if lvl == 'all': lvl = '*' if node == 'all' and node != nodes[-1]: selectors += "*." + lvl + ";" elif node == 'all': selectors += "*." + lvl elif node != nodes[-1]: if node == 'protocols': node = 'local7' if node == 'security': node = 'auth' selectors += node + "." + lvl + ";" else: if node == 'protocols': node = 'local7' if node == 'security': node = 'auth' selectors += node + "." + lvl return selectors def generate(c): if c == None: return None conf = '/etc/rsyslog.d/vyos-rsyslog.conf' render(conf, 'syslog/rsyslog.conf.tmpl', c) # eventually write for each file its own logrotate file, since size is # defined it shouldn't matter conf = '/etc/logrotate.d/vyos-rsyslog' render(conf, 'syslog/logrotate.tmpl', c) + conf = r'/etc/systemd/system/rsyslog.service.d/override.conf' + render(conf, 'syslog/override.conf.tmpl', c) + + # Reload systemd manager configuration + call('systemctl daemon-reload') def verify(c): if c == None: return None # may be obsolete # /etc/rsyslog.conf is generated somewhere and copied over the original (exists in /opt/vyatta/etc/rsyslog.conf) # it interferes with the global logging, to make sure we are using a single base, template is enforced here # if not os.path.islink('/etc/rsyslog.conf'): os.remove('/etc/rsyslog.conf') - os.symlink( - '/usr/share/vyos/templates/rsyslog/rsyslog.conf', '/etc/rsyslog.conf') + os.symlink('/usr/share/vyos/templates/rsyslog/rsyslog.conf', + '/etc/rsyslog.conf') + + + verify_vrf(c) # /var/log/vyos-rsyslog were the old files, we may want to clean those up, but currently there # is a chance that someone still needs it, so I don't automatically remove # them # if c == None: return None fac = [ '*', 'auth', 'authpriv', 'cron', 'daemon', 'kern', 'lpr', 'mail', 'mark', 'news', 'protocols', 'security', 'syslog', 'user', 'uucp', 'local0', 'local1', 'local2', 'local3', 'local4', 'local5', 'local6', 'local7'] lvl = ['emerg', 'alert', 'crit', 'err', 'warning', 'notice', 'info', 'debug', '*'] for conf in c: if c[conf]: + if conf == 'vrf': + continue for item in c[conf]: for s in c[conf][item]['selectors'].split(";"): f = re.sub("\..*$", "", s) if f not in fac: raise ConfigError( 'Invalid facility ' + s + ' set in ' + conf + ' ' + item) l = re.sub("^.+\.", "", s) if l not in lvl: raise ConfigError( 'Invalid logging level ' + s + ' set in ' + conf + ' ' + item) def apply(c): if not c: return run('systemctl stop syslog.service') return run('systemctl restart syslog.service') if __name__ == '__main__': try: c = get_config() verify(c) generate(c) apply(c) except ConfigError as e: print(e) exit(1)