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