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