daily revision 1.78 1 1.1 cgd #!/bin/sh -
2 1.1 cgd #
3 1.78 darcy # $NetBSD: daily,v 1.78 2011/12/17 12:27:42 darcy 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.62 erh find / \( $ignfstypes \) -prune -o \
93 1.48 atatat -name 'lost+found' -prune -o \
94 1.48 atatat \( -name '*.core' -o -name 'core' \) -type f -print > $TMP
95 1.18 mrg # \( -name '[#,]*' -o -name '.#*' -o -name a.out \
96 1.18 mrg # -o -name '*.CKP' -o -name '.emacs_[0-9]*' \) \
97 1.18 mrg # -a -atime +3 -exec rm -f -- {} \; -a -print > $TMP
98 1.18 mrg
99 1.26 nathanw egrep '\.core$|^core$' $TMP > $TMP2
100 1.18 mrg if [ -s $TMP2 ]; then
101 1.18 mrg echo ""
102 1.18 mrg echo "Possible core dumps:"
103 1.18 mrg cat $TMP2
104 1.18 mrg fi
105 1.18 mrg
106 1.18 mrg # egrep -v '\.core' $TMP > $TMP2
107 1.18 mrg # if [ -s $TMP2 ]; then
108 1.18 mrg # echo ""
109 1.18 mrg # echo "Deleted files:"
110 1.18 mrg # cat $TMP2
111 1.18 mrg # fi
112 1.10 cgd
113 1.18 mrg rm -f $TMP $TMP2
114 1.18 mrg fi
115 1.10 cgd
116 1.25 lukem if checkyesno run_msgs; then
117 1.18 mrg msgs -c
118 1.18 mrg fi
119 1.1 cgd
120 1.25 lukem if checkyesno expire_news && [ -f /etc/news.expire ]; then
121 1.1 cgd /etc/news.expire
122 1.1 cgd fi
123 1.1 cgd
124 1.25 lukem if checkyesno purge_accounting && [ -f /var/account/acct ]; then
125 1.21 mikel echo ""
126 1.21 mikel echo "Purging accounting records:"
127 1.58 mrg if [ -f /var/account/acct.0.gz ]; then
128 1.58 mrg mv /var/account/acct.2.gz /var/account/acct.3.gz 2>/dev/null
129 1.58 mrg mv /var/account/acct.1.gz /var/account/acct.2.gz 2>/dev/null
130 1.58 mrg mv /var/account/acct.0.gz /var/account/acct.1.gz 2>/dev/null
131 1.58 mrg else
132 1.58 mrg mv /var/account/acct.2 /var/account/acct.3 2>/dev/null
133 1.58 mrg mv /var/account/acct.1 /var/account/acct.2 2>/dev/null
134 1.58 mrg mv /var/account/acct.0 /var/account/acct.1 2>/dev/null
135 1.58 mrg fi
136 1.21 mikel cp /var/account/acct /var/account/acct.0
137 1.21 mikel sa -sq
138 1.58 mrg if [ -f /var/account/acct.1.gz ]; then
139 1.58 mrg gzip /var/account/acct.0
140 1.58 mrg fi
141 1.1 cgd fi
142 1.1 cgd
143 1.25 lukem if checkyesno run_calendar; then
144 1.50 jhawk calendar -a > $TMP 2>&1
145 1.18 mrg if [ -s $TMP ]; then
146 1.18 mrg echo ""
147 1.18 mrg echo "Running calendar:"
148 1.18 mrg cat $TMP
149 1.18 mrg fi
150 1.18 mrg rm -f $TMP
151 1.18 mrg fi
152 1.1 cgd
153 1.25 lukem if checkyesno check_disks; then
154 1.55 perry if checkyesno show_remote_fs; then
155 1.72 perry df -hi -t nokernfs,procfs,ptyfs,null,fdesc > $TMP
156 1.55 perry else
157 1.72 perry df -hil -t nokernfs,procfs,ptyfs,null,fdesc > $TMP
158 1.55 perry fi
159 1.52 perry if [ -s /etc/dumpdates ] ; then
160 1.52 perry dump -W > $TMP2
161 1.52 perry fi
162 1.18 mrg if [ -s $TMP -o -s $TMP2 ]; then
163 1.18 mrg echo ""
164 1.18 mrg echo "Checking subsystem status:"
165 1.18 mrg echo ""
166 1.18 mrg echo "disks:"
167 1.18 mrg if [ -s $TMP ]; then
168 1.65 perry cat $TMP | sed 's/Mounted on/Mount/'
169 1.18 mrg echo ""
170 1.18 mrg fi
171 1.18 mrg if [ -s $TMP2 ]; then
172 1.18 mrg cat $TMP2
173 1.18 mrg echo ""
174 1.18 mrg fi
175 1.18 mrg echo ""
176 1.18 mrg fi
177 1.46 bouyer rm -f $TMP $TMP2
178 1.46 bouyer touch $TMP2
179 1.77 christos for dev in $(iostat -x | awk '/^raid/ { print $1 }'); do
180 1.46 bouyer raidctl -s $dev | awk '/^.*: failed$/ {print $0}' > $TMP
181 1.46 bouyer if [ -s $TMP ]; then
182 1.46 bouyer echo "$dev:" >> $TMP2
183 1.46 bouyer cat $TMP >> $TMP2
184 1.46 bouyer fi
185 1.46 bouyer rm -f $TMP
186 1.46 bouyer done
187 1.46 bouyer if [ -s $TMP2 ]; then
188 1.46 bouyer echo "failed RAIDframe component(s):"
189 1.46 bouyer cat $TMP2
190 1.46 bouyer fi
191 1.46 bouyer rm -f $TMP2
192 1.18 mrg fi
193 1.18 mrg
194 1.25 lukem if checkyesno check_mailq; then
195 1.18 mrg mailq > $TMP
196 1.44 lukem if ! grep -q "queue is empty$" $TMP; then
197 1.18 mrg echo ""
198 1.18 mrg echo "mail:"
199 1.18 mrg cat $TMP
200 1.18 mrg fi
201 1.18 mrg fi
202 1.18 mrg
203 1.18 mrg rm -f $TMP
204 1.1 cgd
205 1.25 lukem if checkyesno check_network; then
206 1.18 mrg echo ""
207 1.18 mrg echo "network:"
208 1.54 perry if checkyesno full_netstat; then
209 1.54 perry netstat -inv
210 1.54 perry else
211 1.61 martin netstat -inv | awk 'BEGIN {
212 1.54 perry ifs[""] = 0;
213 1.54 perry }
214 1.54 perry /^[^\*]* / {
215 1.54 perry if (NR == 1) {
216 1.66 jdolecek printf("%-8s %12s %6s %12s %6s %6s\n",
217 1.54 perry $1, $(NF-4), $(NF-3), $(NF-2), $(NF-1), $NF);
218 1.54 perry next;
219 1.54 perry }
220 1.54 perry if (!($1 in ifs)) {
221 1.66 jdolecek printf("%-8s %12s %6s %12s %6s %6s\n",
222 1.54 perry $1, $(NF-4), $(NF-3), $(NF-2), $(NF-1), $NF);
223 1.54 perry ifs[$1] = 1;
224 1.54 perry }
225 1.54 perry }'
226 1.54 perry fi
227 1.1 cgd echo ""
228 1.18 mrg t=/var/rwho/*
229 1.18 mrg if [ "$t" != '/var/rwho/*' ]; then
230 1.18 mrg ruptime
231 1.18 mrg fi
232 1.1 cgd fi
233 1.1 cgd
234 1.25 lukem if checkyesno run_fsck; then
235 1.18 mrg echo ""
236 1.18 mrg echo "Checking filesystems:"
237 1.71 bouyer fsck -n -f ${run_fsck_flags} | grep -v '^\*\* Phase'
238 1.18 mrg fi
239 1.1 cgd
240 1.1 cgd echo ""
241 1.25 lukem if checkyesno run_rdist && [ -f /etc/Distfile ]; then
242 1.1 cgd echo "Running rdist:"
243 1.20 mikel if [ -d /var/log/rdist ]; then
244 1.77 christos logf="$(date +%Y.%b.%d)"
245 1.20 mikel rdist -f /etc/Distfile 2>&1 | tee /var/log/rdist/$logf
246 1.20 mikel else
247 1.20 mikel rdist -f /etc/Distfile
248 1.20 mikel fi
249 1.1 cgd fi
250 1.1 cgd
251 1.76 jmmv if pkg_info ${_compat_K_flag} -q -E '*'; then
252 1.74 jmmv echo ""
253 1.74 jmmv echo "Fetching package vulnerabilities database:"
254 1.73 jmmv if checkyesno fetch_pkg_vulnerabilities; then
255 1.76 jmmv ( umask 022 && pkg_admin ${_compat_K_flag} \
256 1.75 jmmv fetch-pkg-vulnerabilities -u )
257 1.74 jmmv else
258 1.74 jmmv echo "fetch_pkg_vulnerabilities is set to NO in daily.conf(5)."
259 1.74 jmmv echo "You should set it to YES to enable vulnerability checks."
260 1.73 jmmv fi
261 1.73 jmmv fi
262 1.73 jmmv
263 1.25 lukem if checkyesno run_security; then
264 1.36 lukem SECOUT="$DAILYDIR/sec"
265 1.47 grant sh /etc/security > "$SECOUT" 2>&1
266 1.36 lukem if [ ! -s "$SECOUT" ]; then
267 1.49 jhawk if checkyesno send_empty_security; then
268 1.49 jhawk echo "Nothing to report on $date" > "$SECOUT"
269 1.49 jhawk else
270 1.49 jhawk echo ""
271 1.57 atatat echo "Suppressing empty security report."
272 1.49 jhawk fi
273 1.49 jhawk fi
274 1.49 jhawk if [ -s "$SECOUT" ]; then
275 1.78 darcy if checkyesno separate_security_email; then
276 1.78 darcy mail -s "$host daily insecurity output for $date" $MAILTO < $SECOUT
277 1.78 darcy else
278 1.78 darcy echo ""
279 1.78 darcy echo "$host daily insecurity output for $date:"
280 1.78 darcy cat $SECOUT
281 1.78 darcy fi
282 1.28 lukem fi
283 1.34 hubertf fi
284 1.34 hubertf
285 1.34 hubertf if checkyesno run_skeyaudit; then
286 1.52 perry if [ -s /etc/skeykeys ]; then
287 1.52 perry echo ""
288 1.52 perry echo "Checking remaining s/key OTPs:"
289 1.52 perry skeyaudit
290 1.52 perry fi
291 1.31 ad fi
292 1.31 ad
293 1.31 ad if [ -f /etc/daily.local ]; then
294 1.69 hubertf ( . /etc/daily.local ) > $TMP 2>&1
295 1.60 kim if [ -s $TMP ] ; then
296 1.60 kim printf "\nRunning /etc/daily.local:\n"
297 1.60 kim cat $TMP
298 1.60 kim fi
299 1.60 kim rm -f $TMP
300 1.18 mrg fi
301