diff --git a/etc/mtree/BSD.tests.dist b/etc/mtree/BSD.tests.dist index 48b6d9fffde2..fb755b4001ac 100644 --- a/etc/mtree/BSD.tests.dist +++ b/etc/mtree/BSD.tests.dist @@ -1,1187 +1,1189 @@ # # Please see the file src/etc/mtree/README before making changes to this file. # /set type=dir uname=root gname=wheel mode=0755 tags=package=tests . bin cat .. chflags .. chmod .. cp .. date .. dd .. echo .. expr .. ln .. ls .. mkdir .. mv .. pax .. pkill .. pwait .. rm .. rmdir .. sh builtins .. errors .. execution .. expansion .. invocation .. parameters .. parser .. set-e .. .. sleep .. test .. timeout .. .. cddl lib .. sbin .. usr.bin ctfconvert .. ztest .. .. usr.sbin dtrace common aggs .. arithmetic .. arrays .. assocs .. begin .. bitfields .. buffering .. builtinvar .. cg .. clauses .. cpc .. decls .. drops .. dtraceUtil .. end .. env .. enum .. error .. exit .. fbtprovider .. funcs .. grammar .. include .. inline .. io .. ip .. java_api .. json .. kinst .. lexer .. llquantize .. mdb .. mib .. misc .. multiaggs .. offsetof .. operators .. pid .. plockstat .. pointers .. pragma .. predicates .. preprocessor .. print .. printa .. printf .. privs .. probes .. proc .. profile-n .. providers .. raise .. rates .. safety .. scalars .. sched .. scripting .. sdt .. sizeof .. speculation .. stability .. stack .. stackdepth .. stop .. strlen .. strtoll .. struct .. sugar .. syscall .. sysevent .. tick-n .. trace .. tracemem .. translators .. typedef .. types .. uctf .. union .. usdt .. ustack .. vars .. version .. .. i386 arrays .. funcs .. pid .. ustack .. .. amd64 arrays .. .. .. zfsd .. .. .. etc rc.d .. .. examples .. games .. gnu lib .. usr.bin diff .. .. .. lib atf libatf-c detail .. .. libatf-c++ detail .. .. test-programs .. .. csu dynamic .. dynamiclib .. static .. .. googletest gmock .. gmock_main .. gtest .. gtest_main .. .. libarchive .. libbe .. libc c063 .. db .. gen execve .. posix_spawn .. .. hash data .. .. iconv .. inet .. locale .. net getaddrinfo data .. .. .. nss .. regex data .. .. resolv .. rpc .. ssp .. setjmp .. stdio .. stdlib .. string .. sys .. time .. tls dso .. .. termios .. ttyio .. .. libcam .. libcasper services cap_dns .. cap_grp .. cap_pwd .. cap_sysctl .. .. .. libcrypt .. libdevdctl .. libexecinfo .. libkvm .. libmp .. libnv .. libproc .. libregex data .. .. librt .. libsbuf .. libsysdecode .. libthr dlopen .. .. libutil .. libxo .. msun .. .. libexec atf atf-check .. atf-pytest-wrapper .. atf-sh .. .. rc .. rtld-elf .. tftpd .. .. sbin bectl .. dhclient .. devd .. growfs .. ifconfig .. ipfw .. md5 .. mdconfig .. newfs_msdos .. nvmecontrol .. pfctl files .. .. ping .. route .. sysctl .. .. secure lib .. libexec .. usr.bin .. usr.sbin .. .. share examples tests atf .. googletest .. plain .. tap .. .. .. zoneinfo .. .. sys acl .. aio .. audit .. auditpipe .. capsicum .. cddl zfs bin .. include .. tests acl cifs .. nontrivial .. trivial .. .. atime .. bootfs .. cache .. cachefile .. clean_mirror .. cli_root zfs_upgrade .. zfs_promote .. zfs_clone .. zfs_property .. zfs_destroy .. zpool_create .. zpool_history .. zpool_expand .. zpool_remove .. zfs_mount .. zfs_unshare .. zdb .. zpool_online .. zpool_get .. zpool_export .. zfs_copies .. zfs_get .. zfs .. zpool_clear .. zpool_import blockfiles .. .. zpool .. zpool_offline .. zpool_replace .. zfs_rollback .. zpool_set .. zfs_send .. zfs_set .. zpool_detach .. zfs_diff .. zpool_scrub .. zfs_inherit .. zfs_snapshot .. zfs_share .. zpool_destroy .. zpool_status .. zfs_unmount .. zfs_receive .. zfs_create .. zpool_upgrade blockfiles .. .. zpool_add .. zfs_rename .. zpool_attach .. zfs_reservation .. .. cli_user misc .. zfs_list .. zpool_iostat .. zpool_list .. .. compression .. ctime .. delegate .. devices .. exec .. grow_pool .. grow_replicas .. history .. hotplug .. hotspare .. inheritance .. interop .. inuse .. iscsi .. large_files .. largest_pool .. link_count .. migration .. mmap .. mount .. mv_files .. nestedfs .. no_space .. online_offline .. pool_names .. poolversion .. quota .. redundancy .. refquota .. refreserv .. rename_dirs .. replacement .. reservation .. rootpool .. rsend .. scrub_mirror .. slog .. snapshot .. snapused .. sparse .. threadsappend .. truncate .. txg_integrity .. userquota .. utils_test .. write_dirs .. xattr .. zfsd .. zil .. zinject .. zones .. zvol zvol_ENOSPC .. zvol_cli .. zvol_misc .. zvol_swap .. .. zvol_thrash .. .. .. .. compat32 .. devrandom .. dtrace .. fifo .. file .. fs fusefs .. tarfs .. tmpfs .. .. geom class concat .. eli .. gate .. gpt .. mirror .. multipath .. nop .. part .. raid3 .. shsec .. stripe .. uzip etalon .. .. .. .. kern acct .. execve .. pipe .. .. kqueue libkqueue .. .. mac bsdextended .. ipacl .. portacl .. .. mqueue .. net if_ovpn .. routing .. .. netgraph .. netinet .. netinet6 frag6 .. .. netipsec tunnel .. .. netlink .. netmap .. netpfil common .. ipfw .. pf ioctl .. .. .. opencrypto .. pjdfstest chflags .. chmod .. chown .. ftruncate .. granular .. link .. mkdir .. mkfifo .. mknod .. open .. rename .. rmdir .. symlink .. truncate .. unlink .. utimensat .. .. posixshm .. sys .. vfs .. vm stack .. .. vmm .. .. usr.bin apply .. asa .. awk bugs-fixed .. netbsd .. .. basename .. bintrans .. bmake archives fmt_44bsd .. fmt_44bsd_mod .. fmt_oldbsd .. .. basic t0 .. t1 .. t2 .. t3 .. .. execution ellipsis .. empty .. joberr .. plus .. .. shell builtin .. meta .. path .. path_select .. replace .. select .. .. suffixes basic .. src_wild1 .. src_wild2 .. .. syntax directive-t0 .. enl .. funny-targets .. semi .. .. sysmk t0 2 1 .. .. mk .. .. t1 2 1 .. .. mk .. .. t2 2 1 .. .. mk .. .. .. variables modifier_M .. modifier_t .. opt_V .. t0 .. .. .. bsdcat .. calendar .. cmp .. compress .. cpio .. col .. comm .. csplit .. cut .. dc .. diff .. diff3 .. dirname .. du .. factor .. file2c .. file .. find .. fold .. getconf .. gh-bc .. grep .. gzip .. head .. hexdump .. ident .. indent .. join .. jot .. lastcomm .. limits .. locale .. m4 .. mkimg .. mktemp .. ncal .. opensm .. patch .. pr .. printf .. procstat .. renice .. rs .. sdiff .. sed regress.multitest.out .. .. seq .. soelim .. sort .. split .. stat .. tail .. tar .. tftp .. tr .. truncate .. tsort .. units .. unifdef .. uniq .. unzip .. vmstat .. wc .. xargs .. xinstall .. xo .. yacc yacc .. .. .. usr.sbin chown .. daemon .. etcupdate .. extattr .. fstyp .. jail .. makefs .. mixer .. newsyslog .. nmtree .. praudit .. pw .. rpcbind .. sa .. + syslogd + .. .. .. # vim: set expandtab ts=4 sw=4: diff --git a/usr.sbin/syslogd/Makefile b/usr.sbin/syslogd/Makefile index 8bdc107dd1c1..803ec8c93056 100644 --- a/usr.sbin/syslogd/Makefile +++ b/usr.sbin/syslogd/Makefile @@ -1,47 +1,50 @@ # @(#)Makefile 8.1 (Berkeley) 6/6/93 .include .PATH: ${SRCTOP}/usr.bin/wall PACKAGE= syslogd CONFGROUPS= CONFS SYSLOGD_D CONFS= syslog.conf PROG= syslogd MAN= syslog.conf.5 syslogd.8 SRCS= syslogd.c ttymsg.c SYSLOGD_DPACAKGE= syslogd LIBADD= util .if ${MK_INET_SUPPORT} != "no" CFLAGS+= -DINET .endif .if ${MK_INET6_SUPPORT} != "no" CFLAGS+= -DINET6 .endif SYSLOGD_D= SYSLOGD_DDIR= /etc/syslog.d .if ${MK_FTP} != "no" CONFGROUPS+= FTP FTP+= ftp.conf FTPDIR= /etc/syslog.d FTPPACKAGE= ftpd .endif .if ${MK_LPR} != "no" SYSLOGD_D+= lpr.conf .endif .if ${MK_PPP} != "no" CONFGROUPS+= PPP PPP+= ppp.conf PPPDIR= /etc/syslog.d PPPPACKAGE= ppp .endif CFLAGS+= -I${SRCTOP}/usr.bin/wall +HAS_TESTS= +SUBDIR.${MK_TESTS}+= tests + .include diff --git a/usr.sbin/syslogd/tests/Makefile b/usr.sbin/syslogd/tests/Makefile new file mode 100644 index 000000000000..9f7e151a3938 --- /dev/null +++ b/usr.sbin/syslogd/tests/Makefile @@ -0,0 +1,3 @@ +ATF_TESTS_SH+= syslogd_test + +.include diff --git a/usr.sbin/syslogd/tests/syslogd_test.sh b/usr.sbin/syslogd/tests/syslogd_test.sh new file mode 100644 index 000000000000..e4927868e47f --- /dev/null +++ b/usr.sbin/syslogd/tests/syslogd_test.sh @@ -0,0 +1,299 @@ +#- +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2021, 2023 The FreeBSD Foundation +# +# This software was developed by Mark Johnston under sponsorship from +# the FreeBSD Foundation. +# +# This software was developed by Jake Freeland under sponsorship from +# the FreeBSD Foundation. +# + +# Tests to-do: +# actions: hostname, users + +readonly SYSLOGD_UDP_PORT="5140" +readonly SYSLOGD_CONFIG="${PWD}/syslog.conf" +readonly SYSLOGD_LOCAL_SOCKET="${PWD}/log.sock" +readonly SYSLOGD_PIDFILE="${PWD}/syslogd.pid" +readonly SYSLOGD_LOCAL_PRIVSOCKET="${PWD}/logpriv.sock" + +# Start a private syslogd instance. +syslogd_start() +{ + syslogd \ + -b ":${SYSLOGD_UDP_PORT}" \ + -C \ + -d \ + -f "${SYSLOGD_CONFIG}" \ + -H \ + -p "${SYSLOGD_LOCAL_SOCKET}" \ + -P "${SYSLOGD_PIDFILE}" \ + -S "${SYSLOGD_LOCAL_PRIVSOCKET}" \ + $@ \ + & + + # Give syslogd a bit of time to spin up. + while [ "$((i+=1))" -le 20 ]; do + [ -S "${SYSLOGD_LOCAL_SOCKET}" ] && return + sleep 0.1 + done + atf_fail "timed out waiting for syslogd to start" +} + +# Simple logger(1) wrapper. +syslogd_log() +{ + atf_check -s exit:0 -o empty -e empty logger $* +} + +# Make syslogd reload its configuration file. +syslogd_reload() +{ + pkill -HUP -F "${SYSLOGD_PIDFILE}" +} + +# Stop a private syslogd instance. +syslogd_stop() +{ + pid=$(cat "${SYSLOGD_PIDFILE}") + if pkill -F "${SYSLOGD_PIDFILE}"; then + wait "${pid}" + rm -f "${SYSLOGD_PIDFILE}" "${SYSLOGD_LOCAL_SOCKET}" \ + "${SYSLOGD_LOCAL_PRIVSOCKET}" + fi +} + +atf_test_case "basic" "cleanup" +basic_head() +{ + atf_set descr "Messages are logged via supported transports" +} +basic_body() +{ + logfile="${PWD}/basic.log" + printf "user.debug\t${logfile}\n" > "${SYSLOGD_CONFIG}" + syslogd_start + + syslogd_log -p user.debug -t basic -h "${SYSLOGD_LOCAL_SOCKET}" \ + "hello, world (unix)" + atf_check -s exit:0 -o match:"basic: hello, world \(unix\)" \ + tail -n 1 "${logfile}" + + # Grab kernel configuration file. + sysctl kern.conftxt > conf.txt + + # We have INET transport; make sure we can use it. + if grep -qw "INET" conf.txt; then + syslogd_log -4 -p user.debug -t basic -h 127.0.0.1 -P "${SYSLOGD_UDP_PORT}" \ + "hello, world (v4)" + atf_check -s exit:0 -o match:"basic: hello, world \(v4\)" \ + tail -n 1 "${logfile}" + fi + # We have INET6 transport; make sure we can use it. + if grep -qw "INET6" conf.txt; then + syslogd_log -6 -p user.debug -t basic -h ::1 -P "${SYSLOGD_UDP_PORT}" \ + "hello, world (v6)" + atf_check -s exit:0 -o match:"basic: hello, world \(v6\)" \ + tail -n 1 "${logfile}" + fi +} +basic_cleanup() +{ + syslogd_stop +} + +atf_test_case "reload" "cleanup" +reload_head() +{ + atf_set descr "SIGHUP correctly refreshes configuration" +} +reload_body() +{ + logfile="${PWD}/reload.log" + printf "user.debug\t/${logfile}\n" > "${SYSLOGD_CONFIG}" + syslogd_start + + syslogd_log -p user.debug -t reload -h "${SYSLOGD_LOCAL_SOCKET}" \ + "pre-reload" + atf_check -s exit:0 -o match:"reload: pre-reload" tail -n 1 "${logfile}" + + # Override the old rule. + truncate -s 0 "${logfile}" + printf "news.debug\t${logfile}\n" > "${SYSLOGD_CONFIG}" + syslogd_reload + + syslogd_log -p user.debug -t reload -h "${SYSLOGD_LOCAL_SOCKET}" \ + "post-reload user" + syslogd_log -p news.debug -t reload -h "${SYSLOGD_LOCAL_SOCKET}" \ + "post-reload news" + atf_check -s exit:0 -o not-match:"reload: post-reload user" cat ${logfile} + atf_check -s exit:0 -o match:"reload: post-reload news" cat ${logfile} +} +reload_cleanup() +{ + syslogd_stop +} + +atf_test_case "prog_filter" "cleanup" +prog_filter_head() +{ + atf_set descr "Messages are only received from programs in the filter" +} +prog_filter_body() +{ + logfile="${PWD}/prog_filter.log" + printf "!prog1,prog2\nuser.debug\t${logfile}\n" > "${SYSLOGD_CONFIG}" + syslogd_start + + for i in 1 2 3; do + syslogd_log -p user.debug -t "prog${i}" -h "${SYSLOGD_LOCAL_SOCKET}" \ + "hello this is prog${i}" + done + atf_check -s exit:0 -o match:"prog1: hello this is prog1" cat "${logfile}" + atf_check -s exit:0 -o match:"prog2: hello this is prog2" cat "${logfile}" + atf_check -s exit:0 -o not-match:"prog3: hello this is prog3" cat "${logfile}" + + # Override the old rule. + truncate -s 0 ${logfile} + printf "!-prog1,prog2\nuser.debug\t${logfile}\n" > "${SYSLOGD_CONFIG}" + syslogd_reload + + for i in 1 2 3; do + syslogd_log -p user.debug -t "prog${i}" -h "${SYSLOGD_LOCAL_SOCKET}" \ + "hello this is prog${i}" + done + atf_check -s exit:0 -o not-match:"prog1: hello this is prog1" cat "${logfile}" + atf_check -s exit:0 -o not-match:"prog2: hello this is prog2" cat "${logfile}" + atf_check -s exit:0 -o match:"prog3: hello this is prog3" cat "${logfile}" +} +prog_filter_cleanup() +{ + syslogd_stop +} + +atf_test_case "host_filter" "cleanup" +host_filter_head() +{ + atf_set descr "Messages are only received from hostnames in the filter" +} +host_filter_body() +{ + logfile="${PWD}/host_filter.log" + printf "+host1,host2\nuser.debug\t${logfile}\n" > "${SYSLOGD_CONFIG}" + syslogd_start + + for i in 1 2 3; do + syslogd_log -p user.debug -t "host${i}" -H "host${i}" \ + -h "${SYSLOGD_LOCAL_SOCKET}" "hello this is host${i}" + done + atf_check -s exit:0 -o match:"host1: hello this is host1" cat "${logfile}" + atf_check -s exit:0 -o match:"host2: hello this is host2" cat "${logfile}" + atf_check -s exit:0 -o not-match:"host3: hello this is host3" cat "${logfile}" + + # Override the old rule. + truncate -s 0 ${logfile} + printf "\-host1,host2\nuser.debug\t${logfile}\n" > "${SYSLOGD_CONFIG}" + syslogd_reload + + for i in 1 2 3; do + syslogd_log -p user.debug -t "host${i}" -H "host${i}" \ + -h "${SYSLOGD_LOCAL_SOCKET}" "hello this is host${i}" + done + atf_check -s exit:0 -o not-match:"host1: hello this is host1" cat "${logfile}" + atf_check -s exit:0 -o not-match:"host2: hello this is host2" cat "${logfile}" + atf_check -s exit:0 -o match:"host3: hello this is host3" cat "${logfile}" +} +host_filter_cleanup() +{ + syslogd_stop +} + +atf_test_case "prop_filter" "cleanup" +prop_filter_head() +{ + atf_set descr "Messages are received based on conditions in the propery based filter" +} +prop_filter_body() +{ + logfile="${PWD}/prop_filter.log" + printf ":msg,contains,\"FreeBSD\"\nuser.debug\t${logfile}\n" \ + > "${SYSLOGD_CONFIG}" + syslogd_start + + syslogd_log -p user.debug -t "prop1" -h "${SYSLOGD_LOCAL_SOCKET}" "FreeBSD" + syslogd_log -p user.debug -t "prop2" -h "${SYSLOGD_LOCAL_SOCKET}" "freebsd" + atf_check -s exit:0 -o match:"prop1: FreeBSD" cat "${logfile}" + atf_check -s exit:0 -o not-match:"prop2: freebsd" cat "${logfile}" + + truncate -s 0 ${logfile} + printf ":msg,!contains,\"FreeBSD\"\nuser.debug\t${logfile}\n" \ + > "${SYSLOGD_CONFIG}" + syslogd_reload + + syslogd_log -p user.debug -t "prop1" -h "${SYSLOGD_LOCAL_SOCKET}" "FreeBSD" + syslogd_log -p user.debug -t "prop2" -h "${SYSLOGD_LOCAL_SOCKET}" "freebsd" + atf_check -s exit:0 -o not-match:"prop1: FreeBSD" cat "${logfile}" + atf_check -s exit:0 -o match:"prop2: freebsd" cat "${logfile}" + + truncate -s 0 ${logfile} + printf ":msg,icase_contains,\"FreeBSD\"\nuser.debug\t${logfile}\n" \ + > "${SYSLOGD_CONFIG}" + syslogd_reload + + syslogd_log -p user.debug -t "prop1" -h "${SYSLOGD_LOCAL_SOCKET}" "FreeBSD" + syslogd_log -p user.debug -t "prop2" -h "${SYSLOGD_LOCAL_SOCKET}" "freebsd" + atf_check -s exit:0 -o match:"prop1: FreeBSD" cat "${logfile}" + atf_check -s exit:0 -o match:"prop2: freebsd" cat "${logfile}" + + truncate -s 0 ${logfile} + printf ":msg,!icase_contains,\"FreeBSD\"\nuser.debug\t${logfile}\n" \ + > "${SYSLOGD_CONFIG}" + syslogd_reload + + syslogd_log -p user.debug -t "prop1" -h "${SYSLOGD_LOCAL_SOCKET}" "FreeBSD" + syslogd_log -p user.debug -t "prop2" -h "${SYSLOGD_LOCAL_SOCKET}" "freebsd" + syslogd_log -p user.debug -t "prop3" -h "${SYSLOGD_LOCAL_SOCKET}" "Solaris" + atf_check -s exit:0 -o not-match:"prop1: FreeBSD" cat "${logfile}" + atf_check -s exit:0 -o not-match:"prop2: freebsd" cat "${logfile}" + atf_check -s exit:0 -o match:"prop3: Solaris" cat "${logfile}" +} +prop_filter_cleanup() +{ + syslogd_stop +} + +atf_test_case "pipe_action" "cleanup" +pipe_action_head() +{ + atf_set descr "The pipe action evaluates provided command in sh(1)" +} +pipe_action_body() +{ + logfile="${PWD}/pipe_action.log" + printf "\"While I'm digging in the tunnel, the elves will often come to me \ + with solutions to my problem.\"\n-Saymore Crey" > ${logfile} + + printf "!pipe\nuser.debug\t| sed -i '' -e 's/Saymore Crey/Seymour Cray/g' \ + ${logfile}\n" > "${SYSLOGD_CONFIG}" + syslogd_start + + syslogd_log -p user.debug -t "pipe" -h "${SYSLOGD_LOCAL_SOCKET}" \ + "fix spelling error" + atf_check -s exit:0 -o match:"Seymour Cray" cat "${logfile}" +} +pipe_action_cleanup() +{ + syslogd_stop +} + +atf_init_test_cases() +{ + atf_add_test_case "basic" + atf_add_test_case "reload" + atf_add_test_case "prog_filter" + atf_add_test_case "host_filter" + atf_add_test_case "prop_filter" + atf_add_test_case "pipe_action" +}