1*fcace290SJake Freeland#- 2*fcace290SJake Freeland# SPDX-License-Identifier: BSD-2-Clause 3*fcace290SJake Freeland# 4*fcace290SJake Freeland# Copyright (c) 2021, 2023 The FreeBSD Foundation 5*fcace290SJake Freeland# 6*fcace290SJake Freeland# This software was developed by Mark Johnston under sponsorship from 7*fcace290SJake Freeland# the FreeBSD Foundation. 8*fcace290SJake Freeland# 9*fcace290SJake Freeland# This software was developed by Jake Freeland under sponsorship from 10*fcace290SJake Freeland# the FreeBSD Foundation. 11*fcace290SJake Freeland# 12*fcace290SJake Freeland 13*fcace290SJake Freeland# Tests to-do: 14*fcace290SJake Freeland# actions: hostname, users 15*fcace290SJake Freeland 16*fcace290SJake Freelandreadonly SYSLOGD_UDP_PORT="5140" 17*fcace290SJake Freelandreadonly SYSLOGD_CONFIG="${PWD}/syslog.conf" 18*fcace290SJake Freelandreadonly SYSLOGD_LOCAL_SOCKET="${PWD}/log.sock" 19*fcace290SJake Freelandreadonly SYSLOGD_PIDFILE="${PWD}/syslogd.pid" 20*fcace290SJake Freelandreadonly SYSLOGD_LOCAL_PRIVSOCKET="${PWD}/logpriv.sock" 21*fcace290SJake Freeland 22*fcace290SJake Freeland# Start a private syslogd instance. 23*fcace290SJake Freelandsyslogd_start() 24*fcace290SJake Freeland{ 25*fcace290SJake Freeland syslogd \ 26*fcace290SJake Freeland -b ":${SYSLOGD_UDP_PORT}" \ 27*fcace290SJake Freeland -C \ 28*fcace290SJake Freeland -d \ 29*fcace290SJake Freeland -f "${SYSLOGD_CONFIG}" \ 30*fcace290SJake Freeland -H \ 31*fcace290SJake Freeland -p "${SYSLOGD_LOCAL_SOCKET}" \ 32*fcace290SJake Freeland -P "${SYSLOGD_PIDFILE}" \ 33*fcace290SJake Freeland -S "${SYSLOGD_LOCAL_PRIVSOCKET}" \ 34*fcace290SJake Freeland $@ \ 35*fcace290SJake Freeland & 36*fcace290SJake Freeland 37*fcace290SJake Freeland # Give syslogd a bit of time to spin up. 38*fcace290SJake Freeland while [ "$((i+=1))" -le 20 ]; do 39*fcace290SJake Freeland [ -S "${SYSLOGD_LOCAL_SOCKET}" ] && return 40*fcace290SJake Freeland sleep 0.1 41*fcace290SJake Freeland done 42*fcace290SJake Freeland atf_fail "timed out waiting for syslogd to start" 43*fcace290SJake Freeland} 44*fcace290SJake Freeland 45*fcace290SJake Freeland# Simple logger(1) wrapper. 46*fcace290SJake Freelandsyslogd_log() 47*fcace290SJake Freeland{ 48*fcace290SJake Freeland atf_check -s exit:0 -o empty -e empty logger $* 49*fcace290SJake Freeland} 50*fcace290SJake Freeland 51*fcace290SJake Freeland# Make syslogd reload its configuration file. 52*fcace290SJake Freelandsyslogd_reload() 53*fcace290SJake Freeland{ 54*fcace290SJake Freeland pkill -HUP -F "${SYSLOGD_PIDFILE}" 55*fcace290SJake Freeland} 56*fcace290SJake Freeland 57*fcace290SJake Freeland# Stop a private syslogd instance. 58*fcace290SJake Freelandsyslogd_stop() 59*fcace290SJake Freeland{ 60*fcace290SJake Freeland pid=$(cat "${SYSLOGD_PIDFILE}") 61*fcace290SJake Freeland if pkill -F "${SYSLOGD_PIDFILE}"; then 62*fcace290SJake Freeland wait "${pid}" 63*fcace290SJake Freeland rm -f "${SYSLOGD_PIDFILE}" "${SYSLOGD_LOCAL_SOCKET}" \ 64*fcace290SJake Freeland "${SYSLOGD_LOCAL_PRIVSOCKET}" 65*fcace290SJake Freeland fi 66*fcace290SJake Freeland} 67*fcace290SJake Freeland 68*fcace290SJake Freelandatf_test_case "basic" "cleanup" 69*fcace290SJake Freelandbasic_head() 70*fcace290SJake Freeland{ 71*fcace290SJake Freeland atf_set descr "Messages are logged via supported transports" 72*fcace290SJake Freeland} 73*fcace290SJake Freelandbasic_body() 74*fcace290SJake Freeland{ 75*fcace290SJake Freeland logfile="${PWD}/basic.log" 76*fcace290SJake Freeland printf "user.debug\t${logfile}\n" > "${SYSLOGD_CONFIG}" 77*fcace290SJake Freeland syslogd_start 78*fcace290SJake Freeland 79*fcace290SJake Freeland syslogd_log -p user.debug -t basic -h "${SYSLOGD_LOCAL_SOCKET}" \ 80*fcace290SJake Freeland "hello, world (unix)" 81*fcace290SJake Freeland atf_check -s exit:0 -o match:"basic: hello, world \(unix\)" \ 82*fcace290SJake Freeland tail -n 1 "${logfile}" 83*fcace290SJake Freeland 84*fcace290SJake Freeland # Grab kernel configuration file. 85*fcace290SJake Freeland sysctl kern.conftxt > conf.txt 86*fcace290SJake Freeland 87*fcace290SJake Freeland # We have INET transport; make sure we can use it. 88*fcace290SJake Freeland if grep -qw "INET" conf.txt; then 89*fcace290SJake Freeland syslogd_log -4 -p user.debug -t basic -h 127.0.0.1 -P "${SYSLOGD_UDP_PORT}" \ 90*fcace290SJake Freeland "hello, world (v4)" 91*fcace290SJake Freeland atf_check -s exit:0 -o match:"basic: hello, world \(v4\)" \ 92*fcace290SJake Freeland tail -n 1 "${logfile}" 93*fcace290SJake Freeland fi 94*fcace290SJake Freeland # We have INET6 transport; make sure we can use it. 95*fcace290SJake Freeland if grep -qw "INET6" conf.txt; then 96*fcace290SJake Freeland syslogd_log -6 -p user.debug -t basic -h ::1 -P "${SYSLOGD_UDP_PORT}" \ 97*fcace290SJake Freeland "hello, world (v6)" 98*fcace290SJake Freeland atf_check -s exit:0 -o match:"basic: hello, world \(v6\)" \ 99*fcace290SJake Freeland tail -n 1 "${logfile}" 100*fcace290SJake Freeland fi 101*fcace290SJake Freeland} 102*fcace290SJake Freelandbasic_cleanup() 103*fcace290SJake Freeland{ 104*fcace290SJake Freeland syslogd_stop 105*fcace290SJake Freeland} 106*fcace290SJake Freeland 107*fcace290SJake Freelandatf_test_case "reload" "cleanup" 108*fcace290SJake Freelandreload_head() 109*fcace290SJake Freeland{ 110*fcace290SJake Freeland atf_set descr "SIGHUP correctly refreshes configuration" 111*fcace290SJake Freeland} 112*fcace290SJake Freelandreload_body() 113*fcace290SJake Freeland{ 114*fcace290SJake Freeland logfile="${PWD}/reload.log" 115*fcace290SJake Freeland printf "user.debug\t/${logfile}\n" > "${SYSLOGD_CONFIG}" 116*fcace290SJake Freeland syslogd_start 117*fcace290SJake Freeland 118*fcace290SJake Freeland syslogd_log -p user.debug -t reload -h "${SYSLOGD_LOCAL_SOCKET}" \ 119*fcace290SJake Freeland "pre-reload" 120*fcace290SJake Freeland atf_check -s exit:0 -o match:"reload: pre-reload" tail -n 1 "${logfile}" 121*fcace290SJake Freeland 122*fcace290SJake Freeland # Override the old rule. 123*fcace290SJake Freeland truncate -s 0 "${logfile}" 124*fcace290SJake Freeland printf "news.debug\t${logfile}\n" > "${SYSLOGD_CONFIG}" 125*fcace290SJake Freeland syslogd_reload 126*fcace290SJake Freeland 127*fcace290SJake Freeland syslogd_log -p user.debug -t reload -h "${SYSLOGD_LOCAL_SOCKET}" \ 128*fcace290SJake Freeland "post-reload user" 129*fcace290SJake Freeland syslogd_log -p news.debug -t reload -h "${SYSLOGD_LOCAL_SOCKET}" \ 130*fcace290SJake Freeland "post-reload news" 131*fcace290SJake Freeland atf_check -s exit:0 -o not-match:"reload: post-reload user" cat ${logfile} 132*fcace290SJake Freeland atf_check -s exit:0 -o match:"reload: post-reload news" cat ${logfile} 133*fcace290SJake Freeland} 134*fcace290SJake Freelandreload_cleanup() 135*fcace290SJake Freeland{ 136*fcace290SJake Freeland syslogd_stop 137*fcace290SJake Freeland} 138*fcace290SJake Freeland 139*fcace290SJake Freelandatf_test_case "prog_filter" "cleanup" 140*fcace290SJake Freelandprog_filter_head() 141*fcace290SJake Freeland{ 142*fcace290SJake Freeland atf_set descr "Messages are only received from programs in the filter" 143*fcace290SJake Freeland} 144*fcace290SJake Freelandprog_filter_body() 145*fcace290SJake Freeland{ 146*fcace290SJake Freeland logfile="${PWD}/prog_filter.log" 147*fcace290SJake Freeland printf "!prog1,prog2\nuser.debug\t${logfile}\n" > "${SYSLOGD_CONFIG}" 148*fcace290SJake Freeland syslogd_start 149*fcace290SJake Freeland 150*fcace290SJake Freeland for i in 1 2 3; do 151*fcace290SJake Freeland syslogd_log -p user.debug -t "prog${i}" -h "${SYSLOGD_LOCAL_SOCKET}" \ 152*fcace290SJake Freeland "hello this is prog${i}" 153*fcace290SJake Freeland done 154*fcace290SJake Freeland atf_check -s exit:0 -o match:"prog1: hello this is prog1" cat "${logfile}" 155*fcace290SJake Freeland atf_check -s exit:0 -o match:"prog2: hello this is prog2" cat "${logfile}" 156*fcace290SJake Freeland atf_check -s exit:0 -o not-match:"prog3: hello this is prog3" cat "${logfile}" 157*fcace290SJake Freeland 158*fcace290SJake Freeland # Override the old rule. 159*fcace290SJake Freeland truncate -s 0 ${logfile} 160*fcace290SJake Freeland printf "!-prog1,prog2\nuser.debug\t${logfile}\n" > "${SYSLOGD_CONFIG}" 161*fcace290SJake Freeland syslogd_reload 162*fcace290SJake Freeland 163*fcace290SJake Freeland for i in 1 2 3; do 164*fcace290SJake Freeland syslogd_log -p user.debug -t "prog${i}" -h "${SYSLOGD_LOCAL_SOCKET}" \ 165*fcace290SJake Freeland "hello this is prog${i}" 166*fcace290SJake Freeland done 167*fcace290SJake Freeland atf_check -s exit:0 -o not-match:"prog1: hello this is prog1" cat "${logfile}" 168*fcace290SJake Freeland atf_check -s exit:0 -o not-match:"prog2: hello this is prog2" cat "${logfile}" 169*fcace290SJake Freeland atf_check -s exit:0 -o match:"prog3: hello this is prog3" cat "${logfile}" 170*fcace290SJake Freeland} 171*fcace290SJake Freelandprog_filter_cleanup() 172*fcace290SJake Freeland{ 173*fcace290SJake Freeland syslogd_stop 174*fcace290SJake Freeland} 175*fcace290SJake Freeland 176*fcace290SJake Freelandatf_test_case "host_filter" "cleanup" 177*fcace290SJake Freelandhost_filter_head() 178*fcace290SJake Freeland{ 179*fcace290SJake Freeland atf_set descr "Messages are only received from hostnames in the filter" 180*fcace290SJake Freeland} 181*fcace290SJake Freelandhost_filter_body() 182*fcace290SJake Freeland{ 183*fcace290SJake Freeland logfile="${PWD}/host_filter.log" 184*fcace290SJake Freeland printf "+host1,host2\nuser.debug\t${logfile}\n" > "${SYSLOGD_CONFIG}" 185*fcace290SJake Freeland syslogd_start 186*fcace290SJake Freeland 187*fcace290SJake Freeland for i in 1 2 3; do 188*fcace290SJake Freeland syslogd_log -p user.debug -t "host${i}" -H "host${i}" \ 189*fcace290SJake Freeland -h "${SYSLOGD_LOCAL_SOCKET}" "hello this is host${i}" 190*fcace290SJake Freeland done 191*fcace290SJake Freeland atf_check -s exit:0 -o match:"host1: hello this is host1" cat "${logfile}" 192*fcace290SJake Freeland atf_check -s exit:0 -o match:"host2: hello this is host2" cat "${logfile}" 193*fcace290SJake Freeland atf_check -s exit:0 -o not-match:"host3: hello this is host3" cat "${logfile}" 194*fcace290SJake Freeland 195*fcace290SJake Freeland # Override the old rule. 196*fcace290SJake Freeland truncate -s 0 ${logfile} 197*fcace290SJake Freeland printf "\-host1,host2\nuser.debug\t${logfile}\n" > "${SYSLOGD_CONFIG}" 198*fcace290SJake Freeland syslogd_reload 199*fcace290SJake Freeland 200*fcace290SJake Freeland for i in 1 2 3; do 201*fcace290SJake Freeland syslogd_log -p user.debug -t "host${i}" -H "host${i}" \ 202*fcace290SJake Freeland -h "${SYSLOGD_LOCAL_SOCKET}" "hello this is host${i}" 203*fcace290SJake Freeland done 204*fcace290SJake Freeland atf_check -s exit:0 -o not-match:"host1: hello this is host1" cat "${logfile}" 205*fcace290SJake Freeland atf_check -s exit:0 -o not-match:"host2: hello this is host2" cat "${logfile}" 206*fcace290SJake Freeland atf_check -s exit:0 -o match:"host3: hello this is host3" cat "${logfile}" 207*fcace290SJake Freeland} 208*fcace290SJake Freelandhost_filter_cleanup() 209*fcace290SJake Freeland{ 210*fcace290SJake Freeland syslogd_stop 211*fcace290SJake Freeland} 212*fcace290SJake Freeland 213*fcace290SJake Freelandatf_test_case "prop_filter" "cleanup" 214*fcace290SJake Freelandprop_filter_head() 215*fcace290SJake Freeland{ 216*fcace290SJake Freeland atf_set descr "Messages are received based on conditions in the propery based filter" 217*fcace290SJake Freeland} 218*fcace290SJake Freelandprop_filter_body() 219*fcace290SJake Freeland{ 220*fcace290SJake Freeland logfile="${PWD}/prop_filter.log" 221*fcace290SJake Freeland printf ":msg,contains,\"FreeBSD\"\nuser.debug\t${logfile}\n" \ 222*fcace290SJake Freeland > "${SYSLOGD_CONFIG}" 223*fcace290SJake Freeland syslogd_start 224*fcace290SJake Freeland 225*fcace290SJake Freeland syslogd_log -p user.debug -t "prop1" -h "${SYSLOGD_LOCAL_SOCKET}" "FreeBSD" 226*fcace290SJake Freeland syslogd_log -p user.debug -t "prop2" -h "${SYSLOGD_LOCAL_SOCKET}" "freebsd" 227*fcace290SJake Freeland atf_check -s exit:0 -o match:"prop1: FreeBSD" cat "${logfile}" 228*fcace290SJake Freeland atf_check -s exit:0 -o not-match:"prop2: freebsd" cat "${logfile}" 229*fcace290SJake Freeland 230*fcace290SJake Freeland truncate -s 0 ${logfile} 231*fcace290SJake Freeland printf ":msg,!contains,\"FreeBSD\"\nuser.debug\t${logfile}\n" \ 232*fcace290SJake Freeland > "${SYSLOGD_CONFIG}" 233*fcace290SJake Freeland syslogd_reload 234*fcace290SJake Freeland 235*fcace290SJake Freeland syslogd_log -p user.debug -t "prop1" -h "${SYSLOGD_LOCAL_SOCKET}" "FreeBSD" 236*fcace290SJake Freeland syslogd_log -p user.debug -t "prop2" -h "${SYSLOGD_LOCAL_SOCKET}" "freebsd" 237*fcace290SJake Freeland atf_check -s exit:0 -o not-match:"prop1: FreeBSD" cat "${logfile}" 238*fcace290SJake Freeland atf_check -s exit:0 -o match:"prop2: freebsd" cat "${logfile}" 239*fcace290SJake Freeland 240*fcace290SJake Freeland truncate -s 0 ${logfile} 241*fcace290SJake Freeland printf ":msg,icase_contains,\"FreeBSD\"\nuser.debug\t${logfile}\n" \ 242*fcace290SJake Freeland > "${SYSLOGD_CONFIG}" 243*fcace290SJake Freeland syslogd_reload 244*fcace290SJake Freeland 245*fcace290SJake Freeland syslogd_log -p user.debug -t "prop1" -h "${SYSLOGD_LOCAL_SOCKET}" "FreeBSD" 246*fcace290SJake Freeland syslogd_log -p user.debug -t "prop2" -h "${SYSLOGD_LOCAL_SOCKET}" "freebsd" 247*fcace290SJake Freeland atf_check -s exit:0 -o match:"prop1: FreeBSD" cat "${logfile}" 248*fcace290SJake Freeland atf_check -s exit:0 -o match:"prop2: freebsd" cat "${logfile}" 249*fcace290SJake Freeland 250*fcace290SJake Freeland truncate -s 0 ${logfile} 251*fcace290SJake Freeland printf ":msg,!icase_contains,\"FreeBSD\"\nuser.debug\t${logfile}\n" \ 252*fcace290SJake Freeland > "${SYSLOGD_CONFIG}" 253*fcace290SJake Freeland syslogd_reload 254*fcace290SJake Freeland 255*fcace290SJake Freeland syslogd_log -p user.debug -t "prop1" -h "${SYSLOGD_LOCAL_SOCKET}" "FreeBSD" 256*fcace290SJake Freeland syslogd_log -p user.debug -t "prop2" -h "${SYSLOGD_LOCAL_SOCKET}" "freebsd" 257*fcace290SJake Freeland syslogd_log -p user.debug -t "prop3" -h "${SYSLOGD_LOCAL_SOCKET}" "Solaris" 258*fcace290SJake Freeland atf_check -s exit:0 -o not-match:"prop1: FreeBSD" cat "${logfile}" 259*fcace290SJake Freeland atf_check -s exit:0 -o not-match:"prop2: freebsd" cat "${logfile}" 260*fcace290SJake Freeland atf_check -s exit:0 -o match:"prop3: Solaris" cat "${logfile}" 261*fcace290SJake Freeland} 262*fcace290SJake Freelandprop_filter_cleanup() 263*fcace290SJake Freeland{ 264*fcace290SJake Freeland syslogd_stop 265*fcace290SJake Freeland} 266*fcace290SJake Freeland 267*fcace290SJake Freelandatf_test_case "pipe_action" "cleanup" 268*fcace290SJake Freelandpipe_action_head() 269*fcace290SJake Freeland{ 270*fcace290SJake Freeland atf_set descr "The pipe action evaluates provided command in sh(1)" 271*fcace290SJake Freeland} 272*fcace290SJake Freelandpipe_action_body() 273*fcace290SJake Freeland{ 274*fcace290SJake Freeland logfile="${PWD}/pipe_action.log" 275*fcace290SJake Freeland printf "\"While I'm digging in the tunnel, the elves will often come to me \ 276*fcace290SJake Freeland with solutions to my problem.\"\n-Saymore Crey" > ${logfile} 277*fcace290SJake Freeland 278*fcace290SJake Freeland printf "!pipe\nuser.debug\t| sed -i '' -e 's/Saymore Crey/Seymour Cray/g' \ 279*fcace290SJake Freeland ${logfile}\n" > "${SYSLOGD_CONFIG}" 280*fcace290SJake Freeland syslogd_start 281*fcace290SJake Freeland 282*fcace290SJake Freeland syslogd_log -p user.debug -t "pipe" -h "${SYSLOGD_LOCAL_SOCKET}" \ 283*fcace290SJake Freeland "fix spelling error" 284*fcace290SJake Freeland atf_check -s exit:0 -o match:"Seymour Cray" cat "${logfile}" 285*fcace290SJake Freeland} 286*fcace290SJake Freelandpipe_action_cleanup() 287*fcace290SJake Freeland{ 288*fcace290SJake Freeland syslogd_stop 289*fcace290SJake Freeland} 290*fcace290SJake Freeland 291*fcace290SJake Freelandatf_init_test_cases() 292*fcace290SJake Freeland{ 293*fcace290SJake Freeland atf_add_test_case "basic" 294*fcace290SJake Freeland atf_add_test_case "reload" 295*fcace290SJake Freeland atf_add_test_case "prog_filter" 296*fcace290SJake Freeland atf_add_test_case "host_filter" 297*fcace290SJake Freeland atf_add_test_case "prop_filter" 298*fcace290SJake Freeland atf_add_test_case "pipe_action" 299*fcace290SJake Freeland} 300