git: 8b63477e5e00 - main - syslogd: Add host forwarding test
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 27 Nov 2024 22:27:17 UTC
The branch main has been updated by jfree: URL: https://cgit.FreeBSD.org/src/commit/?id=8b63477e5e008574cfdc14185e993234244dc908 commit 8b63477e5e008574cfdc14185e993234244dc908 Author: Jake Freeland <jfree@FreeBSD.org> AuthorDate: 2024-11-27 22:26:10 +0000 Commit: Jake Freeland <jfree@FreeBSD.org> CommitDate: 2024-11-27 22:26:10 +0000 syslogd: Add host forwarding test Test communication between hosts by setting up two syslogd instances, each binded to their own addresses, and sending a message from one to the other. The tests passes if the message was delivered and logged successfully. This required some tweaking to the syslogd start and stop routines so they could handle launching multiple syslogd instances with different runtime files. Run the tests in jails with an isolated VNET so they don't fail due to an address bind collision in the host's VNET. Reviewed by: markj Differential Revision: https://reviews.freebsd.org/D47649 --- usr.sbin/syslogd/tests/Makefile | 4 ++ usr.sbin/syslogd/tests/syslogd_test.sh | 125 ++++++++++++++++++++++++++++----- 2 files changed, 110 insertions(+), 19 deletions(-) diff --git a/usr.sbin/syslogd/tests/Makefile b/usr.sbin/syslogd/tests/Makefile index 781730a1102a..30972d3fced5 100644 --- a/usr.sbin/syslogd/tests/Makefile +++ b/usr.sbin/syslogd/tests/Makefile @@ -1,5 +1,9 @@ ATF_TESTS_SH+= syslogd_test +# Run in jail with new vnet so we don't need to worry about address conflicts +TEST_METADATA+= execenv="jail" +TEST_METADATA+= execenv_jail_params="vnet=new" # Several syslogd listening on the same port prevent parallel operation TEST_METADATA+= is_exclusive="true" +TEST_METADATA+= timeout=20 .include <bsd.test.mk> diff --git a/usr.sbin/syslogd/tests/syslogd_test.sh b/usr.sbin/syslogd/tests/syslogd_test.sh index 08e6d76b9ba6..aa8d48e64f5c 100644 --- a/usr.sbin/syslogd/tests/syslogd_test.sh +++ b/usr.sbin/syslogd/tests/syslogd_test.sh @@ -11,7 +11,7 @@ # # Tests to-do: -# actions: hostname, users +# actions: users readonly SYSLOGD_UDP_PORT="5140" readonly SYSLOGD_CONFIG="${PWD}/syslog.conf" @@ -22,27 +22,72 @@ readonly SYSLOGD_LOCAL_PRIVSOCKET="${PWD}/logpriv.sock" # Start a private syslogd instance. syslogd_start() { - local jail + local jail bind_addr conf_file pid_file socket privsocket + local opt next other_args + + # Setup loopback so we can deliver messages to ourself. + atf_check ifconfig lo0 inet 127.0.0.1/16 + + OPTIND=1 + while getopts ":b:f:j:P:p:S:" opt; do + case "${opt}" in + b) + bind_addr="${OPTARG}" + ;; + f) + conf_file="${OPTARG}" + ;; + j) + jail="jexec ${OPTARG}" + ;; + P) + pid_file="${OPTARG}" + ;; + p) + socket="${OPTARG}" + ;; + S) + privsocket="${OPTARG}" + ;; + ?) + opt="${OPTARG}" + next="$(eval echo \${${OPTIND}})" + + case "${next}" in + -* | "") + other_args="${other_args} -${opt}" + shift $((OPTIND - 1)) + ;; + *) + other_args="${other_args} -${opt} ${next}" + shift ${OPTIND} + ;; + esac + + # Tell getopts to continue parsing. + OPTIND=1 + ;; + :) + atf_fail "The -${OPTARG} flag requires an argument" + ;; + esac + done - if [ "$1" = "-j" ]; then - jail="jexec $2" - shift 2 - fi $jail syslogd \ - -b ":${SYSLOGD_UDP_PORT}" \ + -b "${bind_addr:-":${SYSLOGD_UDP_PORT}"}" \ -C \ -d \ - -f "${SYSLOGD_CONFIG}" \ + -f "${conf_file:-${SYSLOGD_CONFIG}}" \ -H \ - -p "${SYSLOGD_LOCAL_SOCKET}" \ - -P "${SYSLOGD_PIDFILE}" \ - -S "${SYSLOGD_LOCAL_PRIVSOCKET}" \ - $@ \ + -P "${pid_file:-${SYSLOGD_PIDFILE}}" \ + -p "${socket:-${SYSLOGD_LOCAL_SOCKET}}" \ + -S "${privsocket:-${SYSLOGD_LOCAL_PRIVSOCKET}}" \ + ${other_args} \ & # Give syslogd a bit of time to spin up. while [ "$((i+=1))" -le 20 ]; do - [ -S "${SYSLOGD_LOCAL_SOCKET}" ] && return + [ -S "${socket:-${SYSLOGD_LOCAL_SOCKET}}" ] && return sleep 0.1 done atf_fail "timed out waiting for syslogd to start" @@ -57,17 +102,19 @@ syslogd_log() # Make syslogd reload its configuration file. syslogd_reload() { - pkill -HUP -F "${SYSLOGD_PIDFILE}" + pkill -HUP -F "${1:-${SYSLOGD_PIDFILE}}" } # Stop a private syslogd instance. syslogd_stop() { - pid=$(cat "${SYSLOGD_PIDFILE}") - if pkill -F "${SYSLOGD_PIDFILE}"; then + local pid_file="${1:-${SYSLOGD_PIDFILE}}" + + pid=$(cat "${pid_file}") + if pkill -F "${pid_file}"; then wait "${pid}" - rm -f "${SYSLOGD_PIDFILE}" "${SYSLOGD_LOCAL_SOCKET}" \ - "${SYSLOGD_LOCAL_PRIVSOCKET}" + rm -f "${pid_file}" "${2:-${SYSLOGD_LOCAL_SOCKET}}" \ + "${3:-${SYSLOGD_LOCAL_PRIVSOCKET}}" fi } @@ -270,6 +317,45 @@ prop_filter_cleanup() syslogd_stop } +atf_test_case "host_action" "cleanup" +host_action_head() +{ + atf_set descr "Sends a message to a specified host" +} +host_action_body() +{ + local addr="192.0.2.100" + local logfile="${PWD}/host_action.log" + + atf_check ifconfig lo1 create + atf_check ifconfig lo1 inet "${addr}/24" + atf_check ifconfig lo1 up + + printf "user.debug\t${logfile}\n" > "${SYSLOGD_CONFIG}" + syslogd_start -b "${addr}" + + printf "user.debug\t@${addr}\n" > "${SYSLOGD_CONFIG}.2" + syslogd_start \ + -f "${SYSLOGD_CONFIG}.2" \ + -P "${SYSLOGD_PIDFILE}.2" \ + -p "${SYSLOGD_LOCAL_SOCKET}.2" \ + -S "${SYSLOGD_LOCAL_PRIVSOCKET}.2" + + syslogd_log -p user.debug -t "test" -h "${SYSLOGD_LOCAL_SOCKET}.2" \ + "message from syslogd2" + atf_check -s exit:0 -o match:"test: message from syslogd2" \ + cat "${logfile}" +} +host_action_cleanup() +{ + syslogd_stop + syslogd_stop \ + "${SYSLOGD_PIDFILE}.2" \ + "${SYSLOGD_LOCAL_SOCKET}.2" \ + "${SYSLOGD_LOCAL_PRIVSOCKET}.2" + atf_check ifconfig lo1 destroy +} + atf_test_case "pipe_action" "cleanup" pipe_action_head() { @@ -308,7 +394,7 @@ jail_noinet_body() logfile="${PWD}/jail_noinet.log" printf "user.debug\t${logfile}\n" > "${SYSLOGD_CONFIG}" - syslogd_start -j syslogd_noinet -ss + syslogd_start -j syslogd_noinet -s -s syslogd_log -p user.debug -t "test" -h "${SYSLOGD_LOCAL_SOCKET}" \ "hello, world" @@ -326,6 +412,7 @@ atf_init_test_cases() atf_add_test_case "prog_filter" atf_add_test_case "host_filter" atf_add_test_case "prop_filter" + atf_add_test_case "host_action" atf_add_test_case "pipe_action" atf_add_test_case "jail_noinet" }