diff --git a/usr.sbin/syslogd/tests/Makefile b/usr.sbin/syslogd/tests/Makefile --- 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 diff --git a/usr.sbin/syslogd/tests/syslogd_test.sh b/usr.sbin/syslogd/tests/syslogd_test.sh --- 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 @@ # 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 @@ # 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 @@ 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 @@ 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_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" }