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