rsyslog/tests/tcp_forwarding_ns_tpl.sh
Billie Alsup c78c587caf net: Add NetworkNamespace APIs
This moves NetworkNamespace functionality into
the net module. This allows the same code to
be reused across multiple tools and plugins.
The first usage is with omfwd, which is changed
to use the common net implementation.  Note
the net implementation is based on the original
omfwd implementation.  Subsequent PRs will be
opened for integrating this into omuxsock and
imtcp.

The original test case tcp_forwarding_ns_tpl.sh
was broken due to use of single quotes rather
than double quotes, thus preventing the proper
port number argument to be passed to the
listener.  Note this test must be run as
root.

Development has occurred across Fedora41 and
Fedora42, which uses glibc 2.40 and glibc2.41
respectively.  The valgrind suppressions are
updated to handle new glibc issues
accordingly.

Four new functions are callable through the
net module. These allow one to save a handle
to the current namespace, switch to a new
namespace by name, and restore the namespace
from the saved handle.  A fourth higher
level wrapper is used to open a socket in
a named network namespace, and handles the
invocation of the lower level functions.
Ideally this would be the only public
function, however it simplifies integration
into imtcp in the future (which doesn't
directly open sockets).  This may change
in the future as network namespaces are
integrated into more modules and plugins.

Signed-off-by: Billie Alsup <balsup@cisco.com>
2025-09-12 08:48:31 -07:00

53 lines
1.8 KiB
Bash
Executable File

#!/bin/bash
# This test tests tcp forwarding in a network namespace with assigned template.
# To do so, a simple tcp listener service is started in a network namespace.
# Released under GNU GPLv3+
echo ===============================================================================
echo \[tcp_forwarding_ns_tpl.sh\]: test for tcp forwarding in a network namespace with assigned template
echo This test must be run as root [network namespace creation/change required]
if [ "$EUID" -ne 0 ]; then
exit 77 # Not root, skip this test
fi
# create the pipe and start a background process that copies data from
# it to the "regular" work file
. ${srcdir:=.}/diag.sh init
generate_conf
add_conf '
$MainMsgQueueTimeoutShutdown 10000
template(name="outfmt" type="string" string="%msg:F,58:2%\n")
if $msg contains "msgnum:" then
action(type="omfwd" template="outfmt"
target="127.0.0.1" port="'$TCPFLOOD_PORT'" protocol="tcp" networknamespace="rsyslog_test_ns")
'
# create network namespace and bring it up
ip netns add rsyslog_test_ns
ip netns exec rsyslog_test_ns ip link set dev lo up
# run server in namespace
ip netns exec rsyslog_test_ns ./minitcpsrv -t127.0.0.1 -p"$TCPFLOOD_PORT" -f $RSYSLOG_OUT_LOG &
BGPROCESS=$!
echo background minitcpsrvr process id is $BGPROCESS
# now do the usual run
startup
# 10000 messages should be enough
injectmsg 0 10000
shutdown_when_empty # shut down rsyslogd when done processing messages
wait_shutdown
# note: minitcpsrvr shuts down automatically if the connection is closed!
# (we still leave the code here in in case we need it later)
#echo shutting down minitcpsrv...
#kill $BGPROCESS
#wait $BGPROCESS
#echo background process has terminated, continue test...
# remove network namespace
ip netns delete rsyslog_test_ns
# and continue the usual checks
seq_check 0 9999
exit_test