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