xref: /freebsd/usr.sbin/syslogd/tests/syslogd_test.sh (revision a259b98fa211ed87bfee58c575de4e2de94ee0fa)
1#-
2# SPDX-License-Identifier: BSD-2-Clause
3#
4# Copyright (c) 2021, 2023 The FreeBSD Foundation
5# Copyright (c) 2024 Mark Johnston <markj@FreeBSD.org>
6#
7# This software was developed by Mark Johnston under sponsorship from
8# the FreeBSD Foundation.
9#
10# This software was developed by Jake Freeland under sponsorship from
11# the FreeBSD Foundation.
12#
13
14# Tests to-do:
15# actions: users
16
17. $(atf_get_srcdir)/syslogd_test_common.sh
18
19atf_test_case "unix" "cleanup"
20unix_head()
21{
22    atf_set descr "Messages are logged over UNIX transport"
23    atf_set "require.progs" syslogd
24}
25unix_body()
26{
27    printf "user.debug\t${SYSLOGD_LOGFILE}\n" > "${SYSLOGD_CONFIG}"
28    syslogd_start
29
30    syslogd_log -p user.debug -t unix -h "${SYSLOGD_LOCAL_SOCKET}" \
31        "hello, world (unix)"
32    syslogd_check_log "unix: hello, world \(unix\)"
33}
34unix_cleanup()
35{
36    syslogd_stop
37}
38
39atf_test_case "inet" "cleanup"
40inet_head()
41{
42    atf_set descr "Messages are logged over INET transport"
43    atf_set "require.progs" syslogd
44}
45inet_body()
46{
47    [ "$(sysctl -n kern.features.inet)" != "1" ] &&
48        atf_skip "Kernel does not support INET"
49
50    printf "user.debug\t${SYSLOGD_LOGFILE}\n" > "${SYSLOGD_CONFIG}"
51    syslogd_start
52
53    # We have INET transport; make sure we can use it.
54    syslogd_log -4 -p user.debug -t inet -h 127.0.0.1 -P "${SYSLOGD_UDP_PORT}" \
55        "hello, world (v4)"
56    syslogd_check_log "inet: hello, world \(v4\)"
57}
58inet_cleanup()
59{
60    syslogd_stop
61}
62
63atf_test_case "inet6" "cleanup"
64inet6_head()
65{
66    atf_set descr "Messages are logged over INET6 transport"
67    atf_set "require.progs" syslogd
68}
69inet6_body()
70{
71    [ "$(sysctl -n kern.features.inet6)" != "1" ] &&
72        atf_skip "Kernel does not support INET6"
73
74    printf "user.debug\t${SYSLOGD_LOGFILE}\n" > "${SYSLOGD_CONFIG}"
75    syslogd_start
76
77    # We have INET6 transport; make sure we can use it.
78    syslogd_log -6 -p user.debug -t unix -h ::1 -P "${SYSLOGD_UDP_PORT}" \
79        "hello, world (v6)"
80    syslogd_check_log "unix: hello, world \(v6\)"
81}
82inet6_cleanup()
83{
84    syslogd_stop
85}
86
87atf_test_case "reload" "cleanup"
88reload_head()
89{
90    atf_set descr "SIGHUP correctly refreshes configuration"
91    atf_set "require.progs" syslogd
92}
93reload_body()
94{
95    printf "user.debug\t${SYSLOGD_LOGFILE}\n" > "${SYSLOGD_CONFIG}"
96    syslogd_start
97
98    syslogd_log -p user.debug -t reload -h "${SYSLOGD_LOCAL_SOCKET}" \
99        "pre-reload"
100    syslogd_check_log "reload: pre-reload"
101
102    # Override the old rule.
103    printf "news.debug\t${SYSLOGD_LOGFILE}\n" > "${SYSLOGD_CONFIG}"
104    syslogd_reload
105
106    syslogd_log -p user.debug -t reload -h "${SYSLOGD_LOCAL_SOCKET}" \
107        "post-reload user"
108    syslogd_log -p news.debug -t reload -h "${SYSLOGD_LOCAL_SOCKET}" \
109        "post-reload news"
110    sleep 0.5
111    syslogd_check_log_nopoll "reload: post-reload news"
112    syslogd_check_log_nomatch "reload: post-reload user"
113}
114reload_cleanup()
115{
116    syslogd_stop
117}
118
119atf_test_case "prog_filter" "cleanup"
120prog_filter_head()
121{
122    atf_set descr "Messages are only received from programs in the filter"
123    atf_set "require.progs" syslogd
124}
125prog_filter_body()
126{
127    printf "!prog1,prog2\nuser.debug\t${SYSLOGD_LOGFILE}\n" > "${SYSLOGD_CONFIG}"
128    syslogd_start
129
130    syslogd_log -p user.debug -t "prog1" -h "${SYSLOGD_LOCAL_SOCKET}" \
131        "hello this is prog1"
132    syslogd_check_log "prog1: hello this is prog1"
133
134    syslogd_log -p user.debug -t "prog2" -h "${SYSLOGD_LOCAL_SOCKET}" \
135        "hello this is prog2"
136    syslogd_check_log "prog2: hello this is prog2"
137
138    syslogd_log -p user.debug -t "prog3" -h "${SYSLOGD_LOCAL_SOCKET}" \
139        "hello this is prog3"
140    syslogd_check_log_nomatch "prog3: hello this is prog3"
141
142    # Override the old rule.
143    printf "!-prog1,prog2\nuser.debug\t${SYSLOGD_LOGFILE}\n" > "${SYSLOGD_CONFIG}"
144    syslogd_reload
145
146    syslogd_log -p user.debug -t "prog1" -h "${SYSLOGD_LOCAL_SOCKET}" \
147        "hello this is prog1"
148    syslogd_check_log_nomatch "prog1: hello this is prog1"
149
150    syslogd_log -p user.debug -t "prog2" -h "${SYSLOGD_LOCAL_SOCKET}" \
151        "hello this is prog2"
152    syslogd_check_log_nomatch "prog2: hello this is prog2"
153
154    syslogd_log -p user.debug -t "prog3" -h "${SYSLOGD_LOCAL_SOCKET}" \
155        "hello this is prog3"
156    syslogd_check_log "prog3: hello this is prog3"
157}
158prog_filter_cleanup()
159{
160    syslogd_stop
161}
162
163atf_test_case "host_filter" "cleanup"
164host_filter_head()
165{
166    atf_set descr "Messages are only received from hostnames in the filter"
167    atf_set "require.progs" syslogd
168}
169host_filter_body()
170{
171    printf "+host1,host2\nuser.debug\t${SYSLOGD_LOGFILE}\n" > "${SYSLOGD_CONFIG}"
172    syslogd_start
173
174    syslogd_log -p user.debug -t "host1" -H "host1" \
175        -h "${SYSLOGD_LOCAL_SOCKET}" "hello this is host1"
176    syslogd_check_log "host1: hello this is host1"
177    syslogd_log -p user.debug -t "host2" -H "host2" \
178        -h "${SYSLOGD_LOCAL_SOCKET}" "hello this is host2"
179    syslogd_check_log "host2: hello this is host2"
180    syslogd_log -p user.debug -t "host3" -H "host3" \
181        -h "${SYSLOGD_LOCAL_SOCKET}" "hello this is host3"
182    syslogd_check_log_nomatch "host3: hello this is host3"
183
184    # Override the old rule.
185    printf "\-host1,host2\nuser.debug\t${SYSLOGD_LOGFILE}\n" > "${SYSLOGD_CONFIG}"
186    syslogd_reload
187
188    syslogd_log -p user.debug -t "host1" -H "host1" \
189        -h "${SYSLOGD_LOCAL_SOCKET}" "hello this is host1"
190    syslogd_check_log_nomatch "host1: hello this is host1"
191    syslogd_log -p user.debug -t "host2" -H "host2" \
192        -h "${SYSLOGD_LOCAL_SOCKET}" "hello this is host2"
193    syslogd_check_log_nomatch "host2: hello this is host2"
194    syslogd_log -p user.debug -t "host3" -H "host3" \
195        -h "${SYSLOGD_LOCAL_SOCKET}" "hello this is host3"
196    syslogd_check_log "host3: hello this is host3"
197}
198host_filter_cleanup()
199{
200    syslogd_stop
201}
202
203atf_test_case "prop_filter" "cleanup"
204prop_filter_head()
205{
206    atf_set descr "Messages are received based on conditions in the propery based filter"
207    atf_set "require.progs" syslogd
208}
209prop_filter_body()
210{
211    printf ":msg,contains,\"FreeBSD\"\nuser.debug\t${SYSLOGD_LOGFILE}\n" \
212        > "${SYSLOGD_CONFIG}"
213    syslogd_start
214
215    syslogd_log -p user.debug -t "prop1" -h "${SYSLOGD_LOCAL_SOCKET}" "FreeBSD"
216    syslogd_log -p user.debug -t "prop2" -h "${SYSLOGD_LOCAL_SOCKET}" "freebsd"
217    syslogd_check_log "prop1: FreeBSD"
218    syslogd_check_log_nomatch "prop2: freebsd"
219
220    printf ":msg,!contains,\"FreeBSD\"\nuser.debug\t${SYSLOGD_LOGFILE}\n" \
221        > "${SYSLOGD_CONFIG}"
222    syslogd_reload
223
224    syslogd_log -p user.debug -t "prop1" -h "${SYSLOGD_LOCAL_SOCKET}" "FreeBSD"
225    syslogd_log -p user.debug -t "prop2" -h "${SYSLOGD_LOCAL_SOCKET}" "freebsd"
226    syslogd_check_log_nomatch "prop1: FreeBSD"
227    syslogd_check_log "prop2: freebsd"
228
229    printf ":msg,icase_contains,\"FreeBSD\"\nuser.debug\t${SYSLOGD_LOGFILE}\n" \
230        > "${SYSLOGD_CONFIG}"
231    syslogd_reload
232
233    syslogd_log -p user.debug -t "prop1" -h "${SYSLOGD_LOCAL_SOCKET}" "FreeBSD"
234    syslogd_check_log "prop1: FreeBSD"
235    syslogd_log -p user.debug -t "prop2" -h "${SYSLOGD_LOCAL_SOCKET}" "freebsd"
236    syslogd_check_log "prop2: freebsd"
237
238    printf ":msg,!icase_contains,\"FreeBSD\"\nuser.debug\t${SYSLOGD_LOGFILE}\n" \
239        > "${SYSLOGD_CONFIG}"
240    syslogd_reload
241
242    syslogd_log -p user.debug -t "prop1" -h "${SYSLOGD_LOCAL_SOCKET}" "FreeBSD"
243    syslogd_log -p user.debug -t "prop2" -h "${SYSLOGD_LOCAL_SOCKET}" "freebsd"
244    syslogd_log -p user.debug -t "prop3" -h "${SYSLOGD_LOCAL_SOCKET}" "Solaris"
245    syslogd_check_log_nomatch "prop1: FreeBSD"
246    syslogd_check_log_nomatch "prop2: freebsd"
247    syslogd_check_log "prop3: Solaris"
248
249    printf ":msg,ereregex,\"substring1|substring2\"\nuser.debug\t${SYSLOGD_LOGFILE}\n" \
250        > "${SYSLOGD_CONFIG}"
251    syslogd_reload
252
253    syslogd_log -p user.debug -t "prop1" -h "${SYSLOGD_LOCAL_SOCKET}" "substring1"
254    syslogd_check_log "prop1: substring1"
255    syslogd_log -p user.debug -t "prop2" -h "${SYSLOGD_LOCAL_SOCKET}" "substring2"
256    syslogd_check_log "prop2: substring2"
257    syslogd_log -p user.debug -t "prop3" -h "${SYSLOGD_LOCAL_SOCKET}" "substring3"
258    syslogd_check_log_nomatch "prop3: substring3"
259
260    printf ":msg,!ereregex,\"substring1|substring2\"\nuser.debug\t${SYSLOGD_LOGFILE}\n" \
261        > "${SYSLOGD_CONFIG}"
262    syslogd_reload
263
264    syslogd_log -p user.debug -t "prop1" -h "${SYSLOGD_LOCAL_SOCKET}" "substring1"
265    syslogd_check_log_nomatch "prop1: substring1"
266    syslogd_log -p user.debug -t "prop2" -h "${SYSLOGD_LOCAL_SOCKET}" "substring2"
267    syslogd_check_log_nomatch "prop2: substring2"
268    syslogd_log -p user.debug -t "prop3" -h "${SYSLOGD_LOCAL_SOCKET}" "substring3"
269    syslogd_check_log "prop3: substring3"
270}
271prop_filter_cleanup()
272{
273    syslogd_stop
274}
275
276atf_test_case "host_action" "cleanup"
277host_action_head()
278{
279    atf_set descr "Sends a message to a specified host"
280    atf_set "require.progs" syslogd
281}
282host_action_body()
283{
284    local addr="192.0.2.100"
285
286    atf_check ifconfig lo1 create
287    atf_check ifconfig lo1 inet "${addr}/24"
288    atf_check ifconfig lo1 up
289
290    printf "user.debug\t${SYSLOGD_LOGFILE}\n" > "${SYSLOGD_CONFIG}"
291    syslogd_start -b "${addr}"
292
293    printf "user.debug\t@${addr}\n" > "${SYSLOGD_CONFIG}.2"
294    syslogd_start \
295        -f "${SYSLOGD_CONFIG}.2" \
296        -P "${SYSLOGD_PIDFILE}.2" \
297        -p "${SYSLOGD_LOCAL_SOCKET}.2" \
298        -S "${SYSLOGD_LOCAL_PRIVSOCKET}.2"
299
300    syslogd_log -p user.debug -t "test" -h "${SYSLOGD_LOCAL_SOCKET}.2" \
301        "message from syslogd2"
302    syslogd_check_log "test: message from syslogd2"
303}
304host_action_cleanup()
305{
306    syslogd_stop
307    syslogd_stop \
308        "${SYSLOGD_PIDFILE}.2" \
309        "${SYSLOGD_LOCAL_SOCKET}.2" \
310        "${SYSLOGD_LOCAL_PRIVSOCKET}.2"
311    atf_check ifconfig lo1 destroy
312}
313
314atf_test_case "pipe_action" "cleanup"
315pipe_action_head()
316{
317    atf_set descr "The pipe action evaluates provided command in sh(1)"
318    atf_set "require.progs" syslogd
319}
320pipe_action_body()
321{
322    printf "\"While I'm digging in the tunnel, the elves will often come to me \
323        with solutions to my problem.\"\n-Saymore Crey" > testfile
324
325    printf "!pipe\nuser.debug\t| sed -i '' -e 's/Saymore Crey/Seymour Cray/g' \
326        testfile\n" > "${SYSLOGD_CONFIG}"
327    syslogd_start
328
329    syslogd_log -p user.debug -t "pipe" -h "${SYSLOGD_LOCAL_SOCKET}" \
330        "fix spelling error"
331    sleep 0.5
332    atf_check -o match:"Seymour Cray" cat testfile
333}
334pipe_action_cleanup()
335{
336    syslogd_stop
337}
338
339atf_test_case "pipe_action_reload" "cleanup"
340pipe_action_reload_head()
341{
342    atf_set descr "Pipe processes terminate gracefully on reload"
343    atf_set "require.progs" syslogd
344}
345pipe_action_reload_body()
346{
347    local pipecmd="${PWD}/pipe_cmd.sh"
348    local pid
349
350    cat <<__EOF__ > "${pipecmd}"
351#!/bin/sh
352echo START > ${SYSLOGD_LOGFILE}
353while read msg; do
354    echo \${msg} >> ${SYSLOGD_LOGFILE}
355done
356echo END >> ${SYSLOGD_LOGFILE}
357exit 0
358__EOF__
359    chmod +x "${pipecmd}"
360
361    printf "!pipe\nuser.debug\t| %s\n" "${pipecmd}" > "${SYSLOGD_CONFIG}"
362    syslogd_start
363
364    syslogd_log -p user.debug -t "pipe" -h "${SYSLOGD_LOCAL_SOCKET}" "MSG"
365    sleep 0.1
366
367    pid=$(cat "${SYSLOGD_PIDFILE}")
368    atf_check pkill -HUP -F "${1:-${SYSLOGD_PIDFILE}}"
369    sleep 0.1
370    syslogd_check_log_nopoll "END"
371
372    atf_check -o not-match:"[[:space:]]P[[:space:]]" procstat files "${pid}"
373}
374pipe_action_reload_cleanup()
375{
376    syslogd_stop
377}
378
379
380atf_test_case "jail_noinet" "cleanup"
381jail_noinet_head()
382{
383    atf_set descr "syslogd -ss can be run in a jail without INET support"
384    atf_set require.user root
385    atf_set "require.progs" syslogd
386}
387jail_noinet_body()
388{
389    syslogd_mkjail syslogd_noinet
390
391    printf "user.debug\t${SYSLOGD_LOGFILE}\n" > "${SYSLOGD_CONFIG}"
392    syslogd_start -j syslogd_noinet -s -s
393
394    syslogd_log -p user.debug -t "test" -h "${SYSLOGD_LOCAL_SOCKET}" \
395        "hello, world"
396    syslogd_check_log "test: hello, world"
397}
398jail_noinet_cleanup()
399{
400    syslogd_cleanup
401}
402
403# Create a pair of jails, connected by an epair.  The idea is to run syslogd in
404# one jail (syslogd_allowed_peer), listening on 169.254.0.1, and logger(1) can
405# send messages from the other jail (syslogd_client) using source addrs
406# 169.254.0.2 or 169.254.0.3.
407allowed_peer_test_setup()
408{
409    syslogd_check_req epair
410
411    local epair
412
413    syslogd_mkjail syslogd_allowed_peer vnet
414    syslogd_mkjail syslogd_client vnet
415
416    atf_check -o save:epair ifconfig epair create
417    epair=$(cat epair)
418    epair=${epair%%a}
419
420    atf_check ifconfig ${epair}a vnet syslogd_allowed_peer
421    atf_check ifconfig ${epair}b vnet syslogd_client
422    atf_check jexec syslogd_allowed_peer ifconfig ${epair}a inet 169.254.0.1/16
423    atf_check jexec syslogd_client ifconfig ${epair}b inet 169.254.0.2/16
424    atf_check jexec syslogd_client ifconfig ${epair}b alias 169.254.0.3/16
425}
426
427allowed_peer_test_cleanup()
428{
429    syslogd_cleanup
430}
431
432atf_test_case allowed_peer "cleanup"
433allowed_peer_head()
434{
435    atf_set descr "syslogd -a works"
436    atf_set require.user root
437    atf_set "require.progs" syslogd
438}
439allowed_peer_body()
440{
441    allowed_peer_test_setup
442
443    printf "user.debug\t${SYSLOGD_LOGFILE}\n" > "${SYSLOGD_CONFIG}"
444    syslogd_start -j syslogd_allowed_peer -b 169.254.0.1:514 -a '169.254.0.2/32'
445
446    # Make sure that a message from 169.254.0.2:514 is logged.
447    syslogd_log_jail syslogd_client \
448        -p user.debug -t test1 -h 169.254.0.1 -S 169.254.0.2:514 "hello, world"
449    syslogd_check_log "test1: hello, world"
450
451    # ... but not a message from port 515.
452    syslogd_log_jail syslogd_client \
453        -p user.debug -t test2 -h 169.254.0.1 -S 169.254.0.2:515 "hello, world"
454    sleep 0.5
455    syslogd_check_log_nomatch "test2: hello, world"
456    syslogd_log_jail syslogd_client \
457        -p user.debug -t test2 -h 169.254.0.1 -S 169.254.0.3:515 "hello, world"
458    sleep 0.5
459    syslogd_check_log_nomatch "test2: hello, world"
460
461    syslogd_stop
462
463    # Now make sure that we can filter by port.
464    syslogd_start -j syslogd_allowed_peer -b 169.254.0.1:514 -a '169.254.0.2/32:515'
465
466    syslogd_log_jail syslogd_client \
467        -p user.debug -t test3 -h 169.254.0.1 -S 169.254.0.2:514 "hello, world"
468    syslogd_check_log_nomatch "test3: hello, world"
469    syslogd_log_jail syslogd_client \
470        -p user.debug -t test4 -h 169.254.0.1 -S 169.254.0.2:515 "hello, world"
471    syslogd_check_log "test4: hello, world"
472
473    syslogd_stop
474}
475allowed_peer_cleanup()
476{
477    allowed_peer_test_cleanup
478}
479
480atf_test_case allowed_peer_forwarding "cleanup"
481allowed_peer_forwarding_head()
482{
483    atf_set descr "syslogd forwards messages from its listening port"
484    atf_set require.user root
485    atf_set "require.progs" syslogd
486}
487allowed_peer_forwarding_body()
488{
489    allowed_peer_test_setup
490
491    printf "user.debug\t@169.254.0.1\n" > client_config
492    printf "mark.debug\t@169.254.0.1:515\n" >> client_config
493    syslogd_start -j syslogd_client -b 169.254.0.2:514 -f ${PWD}/client_config
494
495    printf "+169.254.0.2\nuser.debug\t${SYSLOGD_LOGFILE}\n" > "${SYSLOGD_CONFIG}"
496    syslogd_start -j syslogd_allowed_peer -P ${SYSLOGD_PIDFILE}.2 \
497        -b 169.254.0.1:514 -a 169.254.0.2/32 -p ${PWD}/peer
498
499    # A message forwarded to 169.254.0.1:514 should be logged, but one
500    # forwarded to 169.254.0.1:515 should not.
501    syslogd_log_jail syslogd_client \
502        -h 169.254.0.2 -p user.debug -t test1 "hello, world"
503    syslogd_log_jail syslogd_client \
504        -h 169.254.0.2 -p mark.debug -t test2 "hello, world"
505
506    syslogd_check_log "test1: hello, world"
507    syslogd_check_log_nomatch "test2: hello, world"
508}
509allowed_peer_forwarding_cleanup()
510{
511    allowed_peer_test_cleanup
512}
513
514atf_test_case allowed_peer_wildcard "cleanup"
515allowed_peer_wildcard_head()
516{
517    atf_set descr "syslogd -a works with port wildcards"
518    atf_set require.user root
519    atf_set "require.progs" syslogd
520}
521allowed_peer_wildcard_body()
522{
523    allowed_peer_test_setup
524
525    printf "user.debug\t${SYSLOGD_LOGFILE}\n" > "${SYSLOGD_CONFIG}"
526    syslogd_start -j syslogd_allowed_peer -b 169.254.0.1:514 -a '169.254.0.2/32:*'
527
528    # Make sure that a message from 169.254.0.2:514 is logged.
529    syslogd_log_jail syslogd_client \
530        -p user.debug -t test1 -h 169.254.0.1 -S 169.254.0.2:514 "hello, world"
531    syslogd_check_log "test1: hello, world"
532
533    # ... as is a message from 169.254.0.2:515, allowed by the wildcard.
534    syslogd_log_jail syslogd_client \
535        -p user.debug -t test2 -h 169.254.0.1 -S 169.254.0.2:515 "hello, world"
536    syslogd_check_log "test2: hello, world"
537
538    # ... but not a message from 169.254.0.3.
539    syslogd_log_jail syslogd_client \
540        -p user.debug -t test3 -h 169.254.0.1 -S 169.254.0.3:514 "hello, world"
541    syslogd_check_log_nomatch "test3: hello, world"
542    syslogd_log_jail syslogd_client \
543        -p user.debug -t test3 -h 169.254.0.1 -S 169.254.0.3:515 "hello, world"
544    syslogd_check_log_nomatch "test3: hello, world"
545
546    syslogd_stop
547}
548allowed_peer_wildcard_cleanup()
549{
550    allowed_peer_test_cleanup
551}
552
553atf_test_case "forward" "cleanup"
554forward_head()
555{
556    atf_set descr "syslogd forwards messages to a remote host"
557    atf_set require.user root
558    atf_set "require.progs" syslogd
559}
560forward_body()
561{
562    local epair
563
564    syslogd_check_req epair
565
566    atf_check -o save:epair ifconfig epair create
567    epair=$(cat epair)
568    epair=${epair%%a}
569
570    syslogd_mkjail syslogd_server vnet
571    atf_check ifconfig ${epair}a vnet syslogd_server
572    atf_check jexec syslogd_server ifconfig ${epair}a inet 169.254.0.1/16
573    atf_check jexec syslogd_server ifconfig ${epair}a alias 169.254.0.2/16
574
575    syslogd_mkjail syslogd_client vnet
576    atf_check ifconfig ${epair}b vnet syslogd_client
577    atf_check jexec syslogd_client ifconfig ${epair}b inet 169.254.0.3/16
578
579    cat <<__EOF__ > ./client_config
580user.debug @169.254.0.1
581mail.debug @169.254.0.2
582ftp.debug @169.254.0.1
583__EOF__
584
585    cat <<__EOF__ > ./server_config
586user.debug ${SYSLOGD_LOGFILE}
587mail.debug ${SYSLOGD_LOGFILE}
588ftp.debug ${SYSLOGD_LOGFILE}
589__EOF__
590
591    syslogd_start -j syslogd_server -f ${PWD}/server_config \
592        -b 169.254.0.1 -b 169.254.0.2
593    syslogd_start -j syslogd_client -f ${PWD}/client_config \
594        -p ${PWD}/client -P ${SYSLOGD_PIDFILE}.2
595
596    syslogd_log_jail syslogd_client \
597        -h 169.254.0.3 -P $SYSLOGD_UDP_PORT -p user.debug -t test1 "hello, world"
598    syslogd_check_log "test1: hello, world"
599
600    syslogd_log_jail syslogd_client \
601        -h 169.254.0.3 -P $SYSLOGD_UDP_PORT -p mail.debug -t test2 "you've got mail"
602    syslogd_check_log "test2: you've got mail"
603
604    syslogd_log_jail syslogd_client \
605        -h 169.254.0.3 -P $SYSLOGD_UDP_PORT -p ftp.debug -t test3 "transfer complete"
606    syslogd_check_log "test3: transfer complete"
607}
608forward_cleanup()
609{
610    syslogd_cleanup
611}
612
613atf_test_case "forward_reload" "cleanup"
614forward_reload_head()
615{
616    atf_set descr "syslogd might start before routes are configured"
617    atf_set require.user root
618    atf_set "require.progs" syslogd
619}
620forward_reload_body()
621{
622    local epair server client
623
624    server=syslogd_server$$
625    client=syslogd_client$$
626
627    syslogd_check_req epair
628
629    atf_check -o save:epair ifconfig epair create
630    epair=$(cat epair)
631    epair=${epair%%a}
632
633    syslogd_mkjail $server vnet
634    atf_check ifconfig ${epair}a vnet $server
635    atf_check jexec $server ifconfig ${epair}a inet6 fd00::2/64
636
637    syslogd_mkjail $client vnet
638    atf_check ifconfig ${epair}b vnet $client
639
640    cat <<__EOF__ > ./server_config
641user.debug ${SYSLOGD_LOGFILE}
642ftp.debug ${SYSLOGD_LOGFILE}
643__EOF__
644
645    syslogd_start -j $server -f ${PWD}/server_config -b fd00::2
646
647    cat <<__EOF__ > ./client_config
648user.debug @[fd00::2]
649ftp.debug @[fd00::2]
650__EOF__
651
652    syslogd_start -j $client -f ${PWD}/client_config \
653        -p ${PWD}/client -P ${SYSLOGD_PIDFILE}.2
654
655    # Make sure the client can't reach the server with the current
656    # network configuration.
657    atf_check -s not-exit:0 -e match:"No route to host" \
658        jexec $client ping6 -c 1 fd00::2
659
660    syslogd_log_jail $client -p user.debug -t test1 "hello there"
661    syslogd_log_jail $client -p ftp.debug -t test2 "hi there"
662
663    atf_check jexec $client ifconfig ${epair}b inet6 fd00::1/64
664    atf_check -o ignore jexec $client ping6 -c 1 fd00::2
665
666    syslogd_check_log_nomatch "test1: hello there"
667    syslogd_check_log_nomatch "test2: hi there"
668
669    syslogd_log_jail $client \
670        -p user.debug -t test1 -h ${PWD}/client "how about now"
671    syslogd_check_log "test1: how about now"
672
673    syslogd_log_jail $client \
674        -p ftp.debug -t test2 -h ${PWD}/client "bing bong"
675    syslogd_check_log "test2: bing bong"
676}
677forward_reload_cleanup()
678{
679    syslogd_cleanup
680}
681
682atf_init_test_cases()
683{
684    atf_add_test_case "unix"
685    atf_add_test_case "inet"
686    atf_add_test_case "inet6"
687    atf_add_test_case "reload"
688    atf_add_test_case "prog_filter"
689    atf_add_test_case "host_filter"
690    atf_add_test_case "prop_filter"
691    atf_add_test_case "host_action"
692    atf_add_test_case "pipe_action"
693    atf_add_test_case "pipe_action_reload"
694    atf_add_test_case "jail_noinet"
695    atf_add_test_case "allowed_peer"
696    atf_add_test_case "allowed_peer_forwarding"
697    atf_add_test_case "allowed_peer_wildcard"
698    atf_add_test_case "forward"
699    atf_add_test_case "forward_reload"
700}
701