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