xref: /freebsd/usr.sbin/syslogd/tests/syslogd_test.sh (revision fcace2906ddfae6bee6064b63a6df44be1bdf04b)
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