xref: /netbsd-src/etc/daily (revision ebc67df82ae2491b692b8f41c1e3f5f12004edfd)
161f28255Scgd#!/bin/sh -
261f28255Scgd#
3*ebc67df8Skre#	$NetBSD: daily,v 1.93 2018/09/23 23:16:34 kre Exp $
4d351214aSmikel#	@(#)daily	8.2 (Berkeley) 1/25/94
561f28255Scgd#
6016b324aSmrg
7bd8157b7Smycroftexport PATH=/bin:/usr/bin:/sbin:/usr/sbin
8016b324aSmrgumask 077
9016b324aSmrg
10d1f7e40eSlukemif [ -s /etc/daily.conf ]; then
11d1f7e40eSlukem	. /etc/daily.conf
12d1f7e40eSlukemfi
131410cf30Sagcif [ -s /etc/pkgpath.conf ]; then
141410cf30Sagc	. /etc/pkgpath.conf
151410cf30Sagcfi
16d1f7e40eSlukem
174f848eeeSchristoshost="$(hostname)"
184f848eeeSchristosdate="$(date)"
193c8a1444Sjmmvrcvar_manpage='daily.conf(5)'
20d1f7e40eSlukem
21dc76b0b0Sprlw1pkg_admin=${pkg_admin:-/usr/sbin/pkg_admin}
22dc76b0b0Sprlw1pkg_info=${pkg_info:-/usr/sbin/pkg_info}
23dc76b0b0Sprlw1
24d1f7e40eSlukemecho "To: ${MAILTO:-root}"
25d1f7e40eSlukemecho "Subject: $host daily output for $date"
26d1f7e40eSlukemecho ""
27d1f7e40eSlukem
288f59ce8eSlukemif [ -f /etc/rc.subr ]; then
298f59ce8eSlukem	. /etc/rc.subr
308f59ce8eSlukemelse
318f59ce8eSlukem	echo "Can't read /etc/rc.subr; aborting."
328f59ce8eSlukem	exit 1;
338f59ce8eSlukemfi
348f59ce8eSlukem
35*ebc67df8Skreif [ -z "$MAILTO" ] || [ "$USER" != "root" ]; then
36ce3196e8Sphil	MAILTO=root
37ce3196e8Sphilfi
38ce3196e8Sphil
3953cb2117Sjmmvif [ -n "${pkgdb_dir}" ]; then
4053cb2117Sjmmv	echo "WARNING: Setting pkgdb_dir in daily.conf(5) is deprecated"
4153cb2117Sjmmv	echo "WARNING: Please define PKG_DBDIR in pkg_install.conf(5) instead"
4253cb2117Sjmmv	_compat_K_flag="-K ${pkgdb_dir}"
4353cb2117Sjmmvfi
4453cb2117Sjmmv
45f067035dSlukemecho ""
464f848eeeSchristosecho "Uptime: $(uptime)"
47f067035dSlukem
480780a6b0Sabs# Uncommenting any of the finds below would open up a race condition attack
490780a6b0Sabs# based on symlinks, potentially allowing removal of any file on the system.
500780a6b0Sabs#
514371fb29Sjtc#echo ""
524371fb29Sjtc#echo "Removing scratch and junk files:"
53*ebc67df8Skre#if [ -d /tmp ] && ! [ -h /tmp ]; then
544371fb29Sjtc#	cd /tmp && {
554371fb29Sjtc#	find . -type f -atime +3 -exec rm -f -- {} \;
564371fb29Sjtc#	find . ! -name . -type d -mtime +1 -exec rmdir -- {} \; \
574371fb29Sjtc#	    >/dev/null 2>&1; }
584371fb29Sjtc#fi
5961f28255Scgd
60*ebc67df8Skre#if [ -d /var/tmp ] && ! [ -h /var/tmp ]; then
614371fb29Sjtc#	cd /var/tmp && {
624371fb29Sjtc#	find . ! -name . -atime +7 -exec rm -f -- {} \;
63eea58e84Saymeric#	find . ! \( -name . -o -name vi.recover \) -type d \
64eea58e84Saymeric#		-mtime +1 -exec rmdir -- {} \; \
654371fb29Sjtc#	    >/dev/null 2>&1; }
664371fb29Sjtc#fi
678671b6cbScgd
68e471d816Spk# Additional junk directory cleanup would go like this:
69*ebc67df8Skre#if [ -d /scratch ] && ! [ -h /scratch ]; then
70e471d816Spk#	cd /scratch && {
71e471d816Spk#	find . ! -name . -atime +1 -exec rm -f -- {} \;
72e471d816Spk#	find . ! -name . -type d -mtime +1 -exec rmdir -- {} \; \
73e471d816Spk#	    >/dev/null 2>&1; }
74e471d816Spk#fi
758671b6cbScgd
76*ebc67df8Skre#if [ -d /var/rwho ] && ! [ -h /var/rwho ] ; then
774371fb29Sjtc#	cd /var/rwho && {
784371fb29Sjtc#	find . ! -name . -mtime +7 -exec rm -f -- {} \; ; }
794371fb29Sjtc#fi
808671b6cbScgd
81d405da7fSmarttiDAILYDIR=$(mktemp -d -t _daily) || exit 1
82016b324aSmrg
83684e89f3Slukemtrap "/bin/rm -rf $DAILYDIR ; exit 0" EXIT INT QUIT
84016b324aSmrg
85684e89f3Slukemif ! cd "$DAILYDIR"; then
86684e89f3Slukem	echo "Can not cd to $DAILYDIR".
87016b324aSmrg	exit 1
88016b324aSmrgfi
89016b324aSmrg
908671b6cbScgdTMP=daily.$$
91016b324aSmrgTMP2=daily2.$$
92016b324aSmrg
938f59ce8eSlukemif checkyesno find_core; then
947da8bb10Serh	# Turn "foo !bar bax" into "-fstype foo -o ! -fstype bar -o -fstype bax"
954f848eeeSchristos	ignfstypes="$(echo $find_core_ignore_fstypes | \
967da8bb10Serh		sed -e's/\(!*\)\([^[:space:]]\{1,\}\)/-o \1 -fstype \2/g' \
974f848eeeSchristos		    -e's/^-o //')"
98e763a079Schristos	# Turn "foo bar" into "( -path foo -o -path bar ) -prune -o"
99e763a079Schristos	# Set ignpaths empty if no find_core_ignore_paths given
100e763a079Schristos	if [ -n "$find_core_ignore_paths" ]; then
101e763a079Schristos		ignpaths="$(printf " -o -path %s" $find_core_ignore_paths)"
102e763a079Schristos		ignpaths="( ${ignpaths# -o } ) -prune -o"
103e763a079Schristos	else
104e763a079Schristos		ignpaths=""
105e763a079Schristos	fi
1067da8bb10Serh	find / \( $ignfstypes \) -prune -o \
107e763a079Schristos		${ignpaths} \
1083ce3a9a2Satatat		-name 'lost+found' -prune -o \
1093ce3a9a2Satatat		\( -name '*.core' -o -name 'core' \) -type f -print > $TMP
1104371fb29Sjtc#		\( -name '[#,]*' -o -name '.#*' -o -name a.out \
1114371fb29Sjtc#		   -o -name '*.CKP' -o -name '.emacs_[0-9]*' \) \
1124371fb29Sjtc#			-a -atime +3 -exec rm -f -- {} \; -a -print > $TMP
1138671b6cbScgd
114a93021e9Snathanw	egrep '\.core$|^core$' $TMP > $TMP2
115016b324aSmrg	if [ -s $TMP2 ]; then
1168671b6cbScgd		echo ""
1178671b6cbScgd		echo "Possible core dumps:"
118016b324aSmrg		cat $TMP2
119016b324aSmrg	fi
1208671b6cbScgd
121016b324aSmrg#	egrep -v '\.core' $TMP > $TMP2
122016b324aSmrg#	if [ -s $TMP2 ]; then
123016b324aSmrg#		echo ""
124016b324aSmrg#		echo "Deleted files:"
125016b324aSmrg#		cat $TMP2
126016b324aSmrg#	fi
1278671b6cbScgd
128016b324aSmrg	rm -f $TMP $TMP2
129016b324aSmrgfi
1309bc01e96Scgd
1318f59ce8eSlukemif checkyesno run_msgs; then
1328671b6cbScgd	msgs -c
133016b324aSmrgfi
1347bdc3a61Scgd
1358f59ce8eSlukemif checkyesno expire_news && [ -f /etc/news.expire ]; then
13661f28255Scgd	/etc/news.expire
13761f28255Scgdfi
13861f28255Scgd
1398f59ce8eSlukemif checkyesno purge_accounting && [ -f /var/account/acct ]; then
140d351214aSmikel	echo ""
141d351214aSmikel	echo "Purging accounting records:"
1429be30af8Smrg	if [ -f /var/account/acct.0.gz ]; then
1439be30af8Smrg		mv /var/account/acct.2.gz /var/account/acct.3.gz 2>/dev/null
1449be30af8Smrg		mv /var/account/acct.1.gz /var/account/acct.2.gz 2>/dev/null
1459be30af8Smrg		mv /var/account/acct.0.gz /var/account/acct.1.gz 2>/dev/null
1469be30af8Smrg	else
1476297d767Slukem		mv /var/account/acct.2 /var/account/acct.3 2>/dev/null
1486297d767Slukem		mv /var/account/acct.1 /var/account/acct.2 2>/dev/null
1496297d767Slukem		mv /var/account/acct.0 /var/account/acct.1 2>/dev/null
1509be30af8Smrg	fi
151d351214aSmikel	cp /var/account/acct /var/account/acct.0
152d351214aSmikel	sa -sq
1539be30af8Smrg	if [ -f /var/account/acct.1.gz ]; then
1549be30af8Smrg		gzip /var/account/acct.0
1559be30af8Smrg	fi
156b09f56e8Scgdfi
15761f28255Scgd
1588f59ce8eSlukemif checkyesno run_calendar; then
15974f5f0daSjhawk	calendar -a > $TMP 2>&1
160016b324aSmrg	if [ -s $TMP ]; then
16161f28255Scgd		echo ""
16261f28255Scgd		echo "Running calendar:"
163016b324aSmrg		cat $TMP
164016b324aSmrg	fi
165016b324aSmrg	rm -f $TMP
166016b324aSmrgfi
16761f28255Scgd
1688f59ce8eSlukemif checkyesno check_disks; then
16916a3b1f9Sperry	if checkyesno show_remote_fs; then
170b2595274Sperry		df -hi -t nokernfs,procfs,ptyfs,null,fdesc > $TMP
17116a3b1f9Sperry	else
172b2595274Sperry		df -hil -t nokernfs,procfs,ptyfs,null,fdesc > $TMP
17316a3b1f9Sperry	fi
174eda014eaSperry	if [ -s /etc/dumpdates ] ; then
1750d724a7bSperry		dump -W > $TMP2
176eda014eaSperry	fi
177*ebc67df8Skre	if [ -s $TMP ] || [ -s $TMP2 ]; then
17861f28255Scgd		echo ""
17961f28255Scgd		echo "Checking subsystem status:"
18061f28255Scgd		echo ""
18161f28255Scgd		echo "disks:"
182016b324aSmrg		if [ -s $TMP ]; then
18315e3f0ccSperry			cat $TMP | sed 's/Mounted on/Mount/'
18461f28255Scgd			echo ""
185016b324aSmrg		fi
186016b324aSmrg		if [ -s $TMP2 ]; then
187016b324aSmrg			cat $TMP2
18861f28255Scgd			echo ""
189016b324aSmrg		fi
19061f28255Scgd		echo ""
191016b324aSmrg	fi
192016b324aSmrg	rm -f $TMP $TMP2
19342b4a643Sbouyer	touch $TMP2
1944f848eeeSchristos	for dev in $(iostat -x | awk '/^raid/ { print $1 }'); do
19542b4a643Sbouyer		raidctl -s $dev | awk '/^.*: failed$/ {print $0}' > $TMP
19642b4a643Sbouyer		if [ -s $TMP ]; then
19742b4a643Sbouyer			echo "$dev:" >> $TMP2
19842b4a643Sbouyer			cat $TMP >> $TMP2
19942b4a643Sbouyer		fi
20042b4a643Sbouyer		rm -f $TMP
20142b4a643Sbouyer	done
20242b4a643Sbouyer	if [ -s $TMP2 ]; then
20342b4a643Sbouyer		echo "failed RAIDframe component(s):"
20442b4a643Sbouyer			cat $TMP2
20542b4a643Sbouyer	fi
20642b4a643Sbouyer	rm -f $TMP2
20742b4a643Sbouyerfi
208016b324aSmrg
2098f59ce8eSlukemif checkyesno check_mailq; then
210016b324aSmrg	mailq > $TMP
2110770a23fSlukem	if ! grep -q "queue is empty$" $TMP; then
212016b324aSmrg		echo ""
213016b324aSmrg		echo "mail:"
214016b324aSmrg		cat $TMP
215016b324aSmrg	fi
216016b324aSmrgfi
217016b324aSmrg
218016b324aSmrgrm -f $TMP
219016b324aSmrg
2208f59ce8eSlukemif checkyesno check_network; then
22161f28255Scgd	echo ""
22261f28255Scgd	echo "network:"
22343a0fc6fSperry	if checkyesno full_netstat; then
2242ece7fc4Sitojun		netstat -inv
22543a0fc6fSperry	else
2265a942efbSmartin		netstat -inv | awk 'BEGIN {
22743a0fc6fSperry			ifs[""] = 0;
22843a0fc6fSperry		}
22943a0fc6fSperry		/^[^\*]* / {
23043a0fc6fSperry			if (NR == 1) {
23194172cbcSjdolecek				printf("%-8s %12s %6s %12s %6s %6s\n",
23243a0fc6fSperry				  $1, $(NF-4), $(NF-3), $(NF-2), $(NF-1), $NF);
23343a0fc6fSperry				next;
23443a0fc6fSperry			}
23543a0fc6fSperry			if (!($1 in ifs)) {
23694172cbcSjdolecek				printf("%-8s %12s %6s %12s %6s %6s\n",
23743a0fc6fSperry				  $1, $(NF-4), $(NF-3), $(NF-2), $(NF-1), $NF);
23843a0fc6fSperry				ifs[$1] = 1;
23943a0fc6fSperry			}
24043a0fc6fSperry		}'
24143a0fc6fSperry	fi
24261f28255Scgd	echo ""
243016b324aSmrg	t=/var/rwho/*
244016b324aSmrg	if [ "$t" != '/var/rwho/*' ]; then
24561f28255Scgd		ruptime
246016b324aSmrg	fi
247016b324aSmrgfi
24861f28255Scgd
2498f59ce8eSlukemif checkyesno run_fsck; then
25061f28255Scgd	echo ""
25161f28255Scgd	echo "Checking file systems:"
252db3a1845Sbouyer	fsck -n -f ${run_fsck_flags} | grep -v '^\*\* Phase'
253016b324aSmrgfi
25461f28255Scgd
2558f59ce8eSlukemif checkyesno run_rdist && [ -f /etc/Distfile ]; then
256778f4384Schristos	echo ""
25761f28255Scgd	echo "Running rdist:"
258ef538c31Smikel	if [ -d /var/log/rdist ]; then
2594f848eeeSchristos		logf="$(date +%Y.%b.%d)"
260ef538c31Smikel		rdist -f /etc/Distfile 2>&1 | tee /var/log/rdist/$logf
261ef538c31Smikel	else
26261f28255Scgd		rdist -f /etc/Distfile
26361f28255Scgd	fi
264ef538c31Smikelfi
26561f28255Scgd
2661410cf30Sagcif ${pkg_info} ${_compat_K_flag} -q -E '*'; then
267774aa666Schristos	if [ -z "$fetch_pkg_vulnerabilities" ]; then
268da43ca12Schristos		echo "fetch_pkg_vulnerabilities is not set in daily.conf(5)."
269da43ca12Schristos		echo "You should set it to YES to enable vulnerability checks"
270da43ca12Schristos		echo "or set it to NO to get rid of this warning."
271778f4384Schristos	elif checkyesno fetch_pkg_vulnerabilities; then
2723351729aSchristos		echo ""
2733351729aSchristos		echo "Fetching package vulnerabilities database:"
2741410cf30Sagc		( umask 022 && ${pkg_admin} ${_compat_K_flag} \
275778f4384Schristos		    fetch-pkg-vulnerabilities -u )
276497b5f80Sjmmv	fi
277497b5f80Sjmmvfi
278497b5f80Sjmmv
2798f59ce8eSlukemif checkyesno run_security; then
280684e89f3Slukem	SECOUT="$DAILYDIR/sec"
28147224db0Sgrant	sh /etc/security > "$SECOUT" 2>&1
282684e89f3Slukem	if [ ! -s "$SECOUT" ]; then
2833b390ffbSjhawk		if checkyesno send_empty_security; then
284684e89f3Slukem			echo "Nothing to report on $date" > "$SECOUT"
2853b390ffbSjhawk		else
2863b390ffbSjhawk			echo ""
287da4f7330Satatat			echo "Suppressing empty security report."
288d1f7e40eSlukem		fi
2893b390ffbSjhawk	fi
2903b390ffbSjhawk	if [ -s "$SECOUT" ]; then
2915bc4a2e2Sdarcy		if checkyesno separate_security_email; then
2925bc4a2e2Sdarcy			mail -s "$host daily insecurity output for $date" $MAILTO < $SECOUT
2935bc4a2e2Sdarcy		else
2945bc4a2e2Sdarcy		    echo ""
2955bc4a2e2Sdarcy		    echo "$host daily insecurity output for $date:"
2965bc4a2e2Sdarcy		    cat $SECOUT
2975bc4a2e2Sdarcy		fi
2983b390ffbSjhawk	fi
299016b324aSmrgfi
300016b324aSmrg
301389581c1Shubertfif checkyesno run_skeyaudit; then
302eda014eaSperry	if [ -s /etc/skeykeys ]; then
303389581c1Shubertf		echo ""
304389581c1Shubertf		echo "Checking remaining s/key OTPs:"
305389581c1Shubertf		skeyaudit
306389581c1Shubertf	fi
307eda014eaSperryfi
308389581c1Shubertf
309410d0f43Sjoergif checkyesno run_makemandb; then
310*ebc67df8Skre	if [ -f /etc/man.conf ] && [ -x /usr/sbin/makemandb ]; then
311410d0f43Sjoerg		echo ""
312410d0f43Sjoerg		echo "Updating man page index:"
313c9ea1856Swiz		(umask 022; nice -n 5 /usr/sbin/makemandb -Q)
314410d0f43Sjoerg	fi
315410d0f43Sjoergfi
316410d0f43Sjoerg
317645ee407Sadif [ -f /etc/daily.local ]; then
318bfc08843Shubertf	( . /etc/daily.local ) > $TMP 2>&1
319ed816845Skim	if [ -s $TMP ] ; then
320ed816845Skim		printf "\nRunning /etc/daily.local:\n"
321ed816845Skim		cat $TMP
322ed816845Skim	fi
323ed816845Skim	rm -f $TMP
324645ee407Sadfi
325