rsyslog/tests/yaml-basic.sh
Rainer Gerhards 1cc162b2e1 feat: add YAML as an alternative configuration format
rsyslog now accepts .yaml/.yml files as configuration files
in addition to RainerScript (.conf). The format is triggered
automatically based on file extension, both for the main config
file (-f flag) and for include() directives.

Architecture:
- New runtime/yamlconf.c (libyaml event-based parser) builds the
  same cnfobj+nvlst structures that the bison parser produces and
  calls cnfDoObj() for each block.
- Ruleset script: keys are synthesised into a complete RainerScript
  ruleset(name=...) { ... } block and pushed onto the flex buffer
  stack so the existing lex/bison pipeline handles all filter
  expressions and statements unchanged.
- routing in rsconf.c::load() and cnfDoInclude() detects .yaml/.yml
  by extension and delegates to yamlconf_load().
- cnfHasPendingBuffers() (new) lets rsconf.c flush queued script
  buffers after YAML-as-main-config loading.
- Guarded by #ifdef HAVE_LIBYAML throughout; graceful error when
  libyaml is absent.

Schema (top-level YAML keys):
  global, modules, inputs, templates, rulesets, mainqueue,
  include, parser, lookup_table, dyn_stats, ratelimit, timezone

Parameter names are identical to RainerScript; all type coercion
and validation is reused via nvlstGetParams() unchanged.

Tests: yaml-basic, yaml-include, yaml-ruleset-script, yaml-error
Documentation: doc/source/configuration/yaml_config.rst

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-26 09:19:48 +01:00

50 lines
1.5 KiB
Bash
Executable File

#!/bin/bash
# Tests basic YAML configuration support:
# - module loading via YAML modules: section
# - input definition via YAML inputs: section
# - action definition in a ruleset script: block
# - a YAML file included from the RainerScript testbench preamble
#
# The testbench instrumentation (imdiag, timeouts) lives in the generated
# .conf file; the test config itself lives in a .yaml file that is pulled in
# via include(). This exercises both YAML parsing and cross-format includes.
#
# Added 2025 by contributors, released under ASL 2.0
. ${srcdir:=.}/diag.sh init
export NUMMESSAGES=100
export QUEUE_EMPTY_CHECK_FUNC=wait_file_lines
generate_conf
add_conf '
# Pull in the YAML part of the config
include(file="'${RSYSLOG_DYNNAME}'.yaml")
'
# Write the YAML config fragment
cat > "${RSYSLOG_DYNNAME}.yaml" << 'YAMLEOF'
modules:
- load: "../plugins/imtcp/.libs/imtcp"
templates:
- name: outfmt
type: string
string: "%msg:F,58:2%\n"
rulesets:
- name: main
script: |
:msg, contains, "msgnum:" action(type="omfile"
template="outfmt" file="${RSYSLOG_OUT_LOG}")
YAMLEOF
# Substitute shell variables in the YAML (RSYSLOG_OUT_LOG is not expanded
# inside single-quoted HEREDOC, so we use sed)
sed -i "s|\${RSYSLOG_OUT_LOG}|${RSYSLOG_OUT_LOG}|g" "${RSYSLOG_DYNNAME}.yaml"
add_conf '
input(type="imtcp" port="0" listenPortFileName="'${RSYSLOG_DYNNAME}'.tcpflood_port"
ruleset="main")
'
startup
tcpflood -m $NUMMESSAGES
shutdown_when_empty
wait_shutdown
seq_check
exit_test