xref: /freebsd/usr.sbin/syslogd/tests/syslogd_test_common.sh (revision b1bebaaba9b9c0ddfe503c43ca8e9e3917ee2c57)
1#-
2# SPDX-License-Identifier: BSD-2-Clause
3#
4# Copyright (c) 2021, 2023 The FreeBSD Foundation
5#
6# This software was developed by Mark Johnston under sponsorship from
7# the FreeBSD Foundation.
8#
9# This software was developed by Jake Freeland under sponsorship from
10# the FreeBSD Foundation.
11#
12
13readonly SYSLOGD_UDP_PORT="5140"
14readonly SYSLOGD_CONFIG="${PWD}/syslog.conf"
15readonly SYSLOGD_LOCAL_SOCKET="${PWD}/log.sock"
16readonly SYSLOGD_PIDFILE="${PWD}/syslogd.pid"
17readonly SYSLOGD_LOCAL_PRIVSOCKET="${PWD}/logpriv.sock"
18readonly SYSLOGD_LOGFILE="${PWD}/log"
19
20# Start a private syslogd instance.
21syslogd_start()
22{
23    local jail bind_arg conf_file pid_file socket privsocket
24    local opt next other_args
25
26    OPTIND=1
27    while getopts ":b:f:j:P:p:S:" opt; do
28        case "${opt}" in
29        b)
30            bind_arg="${bind_arg} -b ${OPTARG}"
31            ;;
32        f)
33            conf_file="${OPTARG}"
34            ;;
35        j)
36            jail="jexec ${OPTARG}"
37            ;;
38        P)
39            pid_file="${OPTARG}"
40            ;;
41        p)
42            socket="${OPTARG}"
43            ;;
44        S)
45            privsocket="${OPTARG}"
46            ;;
47        ?)
48            opt="${OPTARG}"
49            next="$(eval echo \${${OPTIND}})"
50
51            case "${next}" in
52            -* | "")
53                other_args="${other_args} -${opt}"
54                shift $((OPTIND - 1))
55                ;;
56            *)
57                other_args="${other_args} -${opt} ${next}"
58                shift ${OPTIND}
59                ;;
60            esac
61
62            # Tell getopts to continue parsing.
63            OPTIND=1
64            ;;
65        :)
66            atf_fail "The -${OPTARG} flag requires an argument"
67            ;;
68        esac
69    done
70
71    socket=${socket:-${SYSLOGD_LOCAL_SOCKET}}
72    if [ -S "${socket}" ]; then
73        atf_fail "socket ${socket} already exists"
74    fi
75
76    # Setup loopback so we can deliver messages to ourself.
77    if [ $($jail sysctl -n security.jail.vnet) -ne 0 ]; then
78        atf_check $jail ifconfig lo0 inet 127.0.0.1/8
79    fi
80
81    $jail syslogd \
82        ${bind_arg:--b :${SYSLOGD_UDP_PORT}} \
83        -C \
84        -d \
85        -f "${conf_file:-${SYSLOGD_CONFIG}}" \
86        -H \
87        -P "${pid_file:-${SYSLOGD_PIDFILE}}" \
88        -p "${socket}" \
89        -S "${privsocket:-${SYSLOGD_LOCAL_PRIVSOCKET}}" \
90        ${other_args} \
91        &
92
93    # Give syslogd a bit of time to spin up.
94    if grep -q "[[:space:]]${SYSLOGD_LOGFILE}$" "${conf_file:-${SYSLOGD_CONFIG}}"; then
95        while [ ! -f "${SYSLOGD_LOGFILE}" ]; do
96            sleep 0.1
97        done
98    fi
99    while [ "$((i+=1))" -le 20 ]; do
100        [ -S "${socket}" ] && return
101        sleep 0.1
102    done
103    atf_fail "timed out waiting for syslogd to start"
104}
105
106# Simple logger(1) wrapper.
107syslogd_log()
108{
109    atf_check -s exit:0 -o empty -e empty logger $*
110}
111
112syslogd_log_jail()
113{
114    local jailname=$1
115    shift
116    atf_check -s exit:0 -o empty -e empty jexec ${jailname} logger $*
117}
118
119# Make syslogd reload its configuration file.
120syslogd_reload()
121{
122    atf_check truncate -s 0 ${SYSLOGD_LOGFILE}
123    atf_check pkill -HUP -F "${1:-${SYSLOGD_PIDFILE}}"
124    sleep 0.1
125}
126
127# Stop a private syslogd instance.
128syslogd_stop()
129{
130    local pid_file="${1:-${SYSLOGD_PIDFILE}}"
131    local socket_file="${2:-${SYSLOGD_LOCAL_SOCKET}}"
132    local privsocket_file="${3:-${SYSLOGD_LOCAL_PRIVSOCKET}}"
133
134    pid=$(cat "${pid_file}")
135    if pkill -F "${pid_file}"; then
136        wait "${pid}"
137        rm -f "${pid_file}" "${socket_file}" "${privsocket_file}"
138    fi
139}
140
141# Check required kernel module.
142syslogd_check_req()
143{
144    type=$1
145
146    if kldstat -q -n if_${type}.ko; then
147        return
148    fi
149
150    if ! kldload -n -q if_${type}; then
151        atf_skip "if_${type}.ko is required to run this test."
152        return
153    fi
154}
155
156# Make a jail and save its name to the created_jails.lst file.
157# Accepts a name and optional arguments.
158syslogd_mkjail()
159{
160    jailname=$1
161    shift
162    args=$*
163
164    atf_check jail -c name=${jailname} ${args} persist
165
166    echo $jailname >> created_jails.lst
167}
168
169# Remove epair interfaces and jails.
170syslogd_cleanup()
171{
172    if [ -f created_jails.lst ]; then
173        while read jailname; do
174            jail -r ${jailname}
175        done < created_jails.lst
176        rm created_jails.lst
177    fi
178
179    if [ -f epair ]; then
180        ifconfig $(cat epair) destroy
181    fi
182}
183
184# Check the last entry in the log file for a given message.
185syslogd_check_log_nopoll()
186{
187    local msg=$1
188
189    atf_check -o match:"${msg}" tail -n 1 "${SYSLOGD_LOGFILE}"
190}
191
192# Same as above, but first wait for syslogd to write to the log file.
193syslogd_check_log()
194{
195    local msg=$1
196
197    atf_check -r 10 -o match:"${msg}" tail -n 1 "${SYSLOGD_LOGFILE}"
198}
199
200# Make sure no log entry matching the given message exists.
201syslogd_check_log_nomatch()
202{
203    local msg=$1
204
205    sleep 0.5
206    atf_check -o not-match:"${msg}" cat "${SYSLOGD_LOGFILE}"
207}
208