Home | History | Annotate | Line # | Download | only in etc
      1 #!/bin/sh -
      2 #
      3 #	$NetBSD: daily,v 1.93 2018/09/23 23:16:34 kre Exp $
      4 #	@(#)daily	8.2 (Berkeley) 1/25/94
      5 #
      6 
      7 export PATH=/bin:/usr/bin:/sbin:/usr/sbin
      8 umask 077
      9 
     10 if [ -s /etc/daily.conf ]; then
     11 	. /etc/daily.conf
     12 fi
     13 if [ -s /etc/pkgpath.conf ]; then
     14 	. /etc/pkgpath.conf
     15 fi
     16 
     17 host="$(hostname)"
     18 date="$(date)"
     19 rcvar_manpage='daily.conf(5)'
     20 
     21 pkg_admin=${pkg_admin:-/usr/sbin/pkg_admin}
     22 pkg_info=${pkg_info:-/usr/sbin/pkg_info}
     23 
     24 echo "To: ${MAILTO:-root}"
     25 echo "Subject: $host daily output for $date"
     26 echo ""
     27 
     28 if [ -f /etc/rc.subr ]; then
     29 	. /etc/rc.subr
     30 else
     31 	echo "Can't read /etc/rc.subr; aborting."
     32 	exit 1;
     33 fi
     34 
     35 if [ -z "$MAILTO" ] || [ "$USER" != "root" ]; then
     36 	MAILTO=root
     37 fi
     38 
     39 if [ -n "${pkgdb_dir}" ]; then
     40 	echo "WARNING: Setting pkgdb_dir in daily.conf(5) is deprecated"
     41 	echo "WARNING: Please define PKG_DBDIR in pkg_install.conf(5) instead"
     42 	_compat_K_flag="-K ${pkgdb_dir}"
     43 fi
     44 
     45 echo ""
     46 echo "Uptime: $(uptime)"
     47 
     48 # Uncommenting any of the finds below would open up a race condition attack
     49 # based on symlinks, potentially allowing removal of any file on the system.
     50 #
     51 #echo ""
     52 #echo "Removing scratch and junk files:"
     53 #if [ -d /tmp ] && ! [ -h /tmp ]; then
     54 #	cd /tmp && {
     55 #	find . -type f -atime +3 -exec rm -f -- {} \;
     56 #	find . ! -name . -type d -mtime +1 -exec rmdir -- {} \; \
     57 #	    >/dev/null 2>&1; }
     58 #fi
     59 
     60 #if [ -d /var/tmp ] && ! [ -h /var/tmp ]; then
     61 #	cd /var/tmp && {
     62 #	find . ! -name . -atime +7 -exec rm -f -- {} \;
     63 #	find . ! \( -name . -o -name vi.recover \) -type d \
     64 #		-mtime +1 -exec rmdir -- {} \; \
     65 #	    >/dev/null 2>&1; }
     66 #fi
     67 
     68 # Additional junk directory cleanup would go like this:
     69 #if [ -d /scratch ] && ! [ -h /scratch ]; then
     70 #	cd /scratch && {
     71 #	find . ! -name . -atime +1 -exec rm -f -- {} \;
     72 #	find . ! -name . -type d -mtime +1 -exec rmdir -- {} \; \
     73 #	    >/dev/null 2>&1; }
     74 #fi
     75 
     76 #if [ -d /var/rwho ] && ! [ -h /var/rwho ] ; then
     77 #	cd /var/rwho && {
     78 #	find . ! -name . -mtime +7 -exec rm -f -- {} \; ; }
     79 #fi
     80 
     81 DAILYDIR=$(mktemp -d -t _daily) || exit 1
     82 
     83 trap "/bin/rm -rf $DAILYDIR ; exit 0" EXIT INT QUIT
     84 
     85 if ! cd "$DAILYDIR"; then
     86 	echo "Can not cd to $DAILYDIR".
     87 	exit 1
     88 fi
     89 
     90 TMP=daily.$$
     91 TMP2=daily2.$$
     92 
     93 if checkyesno find_core; then
     94 	# Turn "foo !bar bax" into "-fstype foo -o ! -fstype bar -o -fstype bax"
     95 	ignfstypes="$(echo $find_core_ignore_fstypes | \
     96 		sed -e's/\(!*\)\([^[:space:]]\{1,\}\)/-o \1 -fstype \2/g' \
     97 		    -e's/^-o //')"
     98 	# Turn "foo bar" into "( -path foo -o -path bar ) -prune -o"
     99 	# Set ignpaths empty if no find_core_ignore_paths given
    100 	if [ -n "$find_core_ignore_paths" ]; then
    101 		ignpaths="$(printf " -o -path %s" $find_core_ignore_paths)"
    102 		ignpaths="( ${ignpaths# -o } ) -prune -o"
    103 	else
    104 		ignpaths=""
    105 	fi
    106 	find / \( $ignfstypes \) -prune -o \
    107 		${ignpaths} \
    108 		-name 'lost+found' -prune -o \
    109 		\( -name '*.core' -o -name 'core' \) -type f -print > $TMP
    110 #		\( -name '[#,]*' -o -name '.#*' -o -name a.out \
    111 #		   -o -name '*.CKP' -o -name '.emacs_[0-9]*' \) \
    112 #			-a -atime +3 -exec rm -f -- {} \; -a -print > $TMP
    113 
    114 	egrep '\.core$|^core$' $TMP > $TMP2
    115 	if [ -s $TMP2 ]; then
    116 		echo ""
    117 		echo "Possible core dumps:"
    118 		cat $TMP2
    119 	fi
    120 
    121 #	egrep -v '\.core' $TMP > $TMP2
    122 #	if [ -s $TMP2 ]; then
    123 #		echo ""
    124 #		echo "Deleted files:"
    125 #		cat $TMP2
    126 #	fi
    127 
    128 	rm -f $TMP $TMP2
    129 fi
    130 
    131 if checkyesno run_msgs; then
    132 	msgs -c
    133 fi
    134 
    135 if checkyesno expire_news && [ -f /etc/news.expire ]; then
    136 	/etc/news.expire
    137 fi
    138 
    139 if checkyesno purge_accounting && [ -f /var/account/acct ]; then
    140 	echo ""
    141 	echo "Purging accounting records:"
    142 	if [ -f /var/account/acct.0.gz ]; then
    143 		mv /var/account/acct.2.gz /var/account/acct.3.gz 2>/dev/null
    144 		mv /var/account/acct.1.gz /var/account/acct.2.gz 2>/dev/null
    145 		mv /var/account/acct.0.gz /var/account/acct.1.gz 2>/dev/null
    146 	else
    147 		mv /var/account/acct.2 /var/account/acct.3 2>/dev/null
    148 		mv /var/account/acct.1 /var/account/acct.2 2>/dev/null
    149 		mv /var/account/acct.0 /var/account/acct.1 2>/dev/null
    150 	fi
    151 	cp /var/account/acct /var/account/acct.0
    152 	sa -sq
    153 	if [ -f /var/account/acct.1.gz ]; then
    154 		gzip /var/account/acct.0
    155 	fi
    156 fi
    157 
    158 if checkyesno run_calendar; then
    159 	calendar -a > $TMP 2>&1
    160 	if [ -s $TMP ]; then
    161 		echo ""
    162 		echo "Running calendar:"
    163 		cat $TMP
    164 	fi
    165 	rm -f $TMP
    166 fi
    167 
    168 if checkyesno check_disks; then
    169 	if checkyesno show_remote_fs; then
    170 		df -hi -t nokernfs,procfs,ptyfs,null,fdesc > $TMP
    171 	else
    172 		df -hil -t nokernfs,procfs,ptyfs,null,fdesc > $TMP
    173 	fi
    174 	if [ -s /etc/dumpdates ] ; then
    175 		dump -W > $TMP2
    176 	fi
    177 	if [ -s $TMP ] || [ -s $TMP2 ]; then
    178 		echo ""
    179 		echo "Checking subsystem status:"
    180 		echo ""
    181 		echo "disks:"
    182 		if [ -s $TMP ]; then
    183 			cat $TMP | sed 's/Mounted on/Mount/'
    184 			echo ""
    185 		fi
    186 		if [ -s $TMP2 ]; then
    187 			cat $TMP2
    188 			echo ""
    189 		fi
    190 		echo ""
    191 	fi
    192 	rm -f $TMP $TMP2
    193 	touch $TMP2
    194 	for dev in $(iostat -x | awk '/^raid/ { print $1 }'); do
    195 		raidctl -s $dev | awk '/^.*: failed$/ {print $0}' > $TMP
    196 		if [ -s $TMP ]; then
    197 			echo "$dev:" >> $TMP2
    198 			cat $TMP >> $TMP2
    199 		fi
    200 		rm -f $TMP
    201 	done
    202 	if [ -s $TMP2 ]; then
    203 		echo "failed RAIDframe component(s):"
    204 			cat $TMP2
    205 	fi
    206 	rm -f $TMP2
    207 fi
    208 
    209 if checkyesno check_mailq; then
    210 	mailq > $TMP
    211 	if ! grep -q "queue is empty$" $TMP; then
    212 		echo ""
    213 		echo "mail:"
    214 		cat $TMP
    215 	fi
    216 fi
    217 
    218 rm -f $TMP
    219 
    220 if checkyesno check_network; then
    221 	echo ""
    222 	echo "network:"
    223 	if checkyesno full_netstat; then
    224 		netstat -inv
    225 	else
    226 		netstat -inv | awk 'BEGIN {
    227 			ifs[""] = 0;
    228 		}
    229 		/^[^\*]* / {
    230 			if (NR == 1) {
    231 				printf("%-8s %12s %6s %12s %6s %6s\n",
    232 				  $1, $(NF-4), $(NF-3), $(NF-2), $(NF-1), $NF);
    233 				next;
    234 			}
    235 			if (!($1 in ifs)) {
    236 				printf("%-8s %12s %6s %12s %6s %6s\n",
    237 				  $1, $(NF-4), $(NF-3), $(NF-2), $(NF-1), $NF);
    238 				ifs[$1] = 1;
    239 			}
    240 		}'
    241 	fi
    242 	echo ""
    243 	t=/var/rwho/*
    244 	if [ "$t" != '/var/rwho/*' ]; then
    245 		ruptime
    246 	fi
    247 fi
    248 
    249 if checkyesno run_fsck; then
    250 	echo ""
    251 	echo "Checking file systems:"
    252 	fsck -n -f ${run_fsck_flags} | grep -v '^\*\* Phase'
    253 fi
    254 
    255 if checkyesno run_rdist && [ -f /etc/Distfile ]; then
    256 	echo ""
    257 	echo "Running rdist:"
    258 	if [ -d /var/log/rdist ]; then
    259 		logf="$(date +%Y.%b.%d)"
    260 		rdist -f /etc/Distfile 2>&1 | tee /var/log/rdist/$logf
    261 	else
    262 		rdist -f /etc/Distfile 
    263 	fi
    264 fi
    265 
    266 if ${pkg_info} ${_compat_K_flag} -q -E '*'; then
    267 	if [ -z "$fetch_pkg_vulnerabilities" ]; then
    268 		echo "fetch_pkg_vulnerabilities is not set in daily.conf(5)."
    269 		echo "You should set it to YES to enable vulnerability checks"
    270 		echo "or set it to NO to get rid of this warning."
    271 	elif checkyesno fetch_pkg_vulnerabilities; then
    272 		echo ""
    273 		echo "Fetching package vulnerabilities database:"
    274 		( umask 022 && ${pkg_admin} ${_compat_K_flag} \
    275 		    fetch-pkg-vulnerabilities -u )
    276 	fi
    277 fi
    278 
    279 if checkyesno run_security; then
    280 	SECOUT="$DAILYDIR/sec"
    281 	sh /etc/security > "$SECOUT" 2>&1
    282 	if [ ! -s "$SECOUT" ]; then
    283 		if checkyesno send_empty_security; then
    284 			echo "Nothing to report on $date" > "$SECOUT"
    285 		else
    286 			echo ""
    287 			echo "Suppressing empty security report."
    288 		fi
    289 	fi
    290 	if [ -s "$SECOUT" ]; then
    291 		if checkyesno separate_security_email; then
    292 			mail -s "$host daily insecurity output for $date" $MAILTO < $SECOUT
    293 		else
    294 		    echo ""
    295 		    echo "$host daily insecurity output for $date:"
    296 		    cat $SECOUT
    297 		fi
    298 	fi
    299 fi
    300 
    301 if checkyesno run_skeyaudit; then
    302 	if [ -s /etc/skeykeys ]; then
    303 		echo ""
    304 		echo "Checking remaining s/key OTPs:"
    305 		skeyaudit
    306 	fi
    307 fi
    308 
    309 if checkyesno run_makemandb; then
    310 	if [ -f /etc/man.conf ] && [ -x /usr/sbin/makemandb ]; then
    311 		echo ""
    312 		echo "Updating man page index:"
    313 		(umask 022; nice -n 5 /usr/sbin/makemandb -Q)
    314 	fi
    315 fi
    316 
    317 if [ -f /etc/daily.local ]; then
    318 	( . /etc/daily.local ) > $TMP 2>&1
    319 	if [ -s $TMP ] ; then
    320 		printf "\nRunning /etc/daily.local:\n"
    321 		cat $TMP
    322 	fi
    323 	rm -f $TMP
    324 fi
    325