Source code pulled from OpenBSD for OpenNTPD. The place to contribute to this code is via the OpenBSD CVS tree.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

200 lines
5.2 KiB

11 years ago
11 years ago
11 years ago
  1. #
  2. # $OpenBSD: daily,v 1.80 2014/04/24 19:04:54 tedu Exp $
  3. # From: @(#)daily 8.2 (Berkeley) 1/25/94
  4. #
  5. # For local additions, create the file /etc/daily.local.
  6. # To get section headers, use the function next_part in daily.local.
  7. #
  8. umask 022
  9. PARTOUT=/var/log/daily.part
  10. MAINOUT=/var/log/daily.out
  11. install -o 0 -g 0 -m 600 /dev/null $PARTOUT
  12. install -o 0 -g 0 -m 600 -b /dev/null $MAINOUT
  13. start_part() {
  14. TITLE=$1
  15. exec > $PARTOUT 2>&1
  16. }
  17. end_part() {
  18. exec >> $MAINOUT 2>&1
  19. test -s $PARTOUT || return
  20. echo ""
  21. echo "$TITLE"
  22. cat $PARTOUT
  23. }
  24. next_part() {
  25. end_part
  26. start_part "$1"
  27. }
  28. run_script() {
  29. f=/etc/$1
  30. test -e $f || return
  31. if [ `stat -f '%Sp%u' $f | cut -b1,6,9,11-` != '---0' ]; then
  32. echo "$f has insecure permissions, skipping:"
  33. ls -l $f
  34. return
  35. fi
  36. . $f
  37. }
  38. start_part "Running daily.local:"
  39. run_script "daily.local"
  40. next_part "Removing scratch and junk files:"
  41. if [ -d /tmp -a ! -L /tmp ]; then
  42. cd /tmp && {
  43. find -x . \
  44. \( -path './ssh-*' -o -path ./.X11-unix -o -path ./.ICE-unix \
  45. -o -path ./portslocks \) \
  46. -prune -o -type f -atime +3 -execdir rm -f -- {} \; 2>/dev/null
  47. find -x . -type d -mtime +1 ! -path ./vi.recover ! -path ./.X11-unix \
  48. ! -path ./.ICE-unix ! -path ./portslocks ! -name . \
  49. -execdir rmdir -- {} \; >/dev/null 2>&1; }
  50. fi
  51. if [ -d /var/tmp -a ! -L /var/tmp ]; then
  52. cd /var/tmp && {
  53. find -x . \
  54. \( -path './ssh-*' -o -path ./.X11-unix -o -path ./.ICE-unix \
  55. -o -path ./portslocks \) \
  56. -prune -o ! -type d -atime +7 -execdir rm -f -- {} \; 2>/dev/null
  57. find -x . -type d -mtime +1 ! -path ./vi.recover ! -path ./.X11-unix \
  58. ! -path ./.ICE-unix ! -path ./portslocks ! -name . \
  59. -execdir rmdir -- {} \; >/dev/null 2>&1; }
  60. fi
  61. # Additional junk directory cleanup would go like this:
  62. #if [ -d /scratch -a ! -L /scratch ]; then
  63. # cd /scratch && {
  64. # find . ! -name . -atime +1 -execdir rm -f -- {} \;
  65. # find . ! -name . -type d -mtime +1 -execdir rmdir -- {} \; \
  66. # >/dev/null 2>&1; }
  67. #fi
  68. next_part "Purging accounting records:"
  69. if [ -f /var/account/acct ]; then
  70. mv -f /var/account/acct.2 /var/account/acct.3
  71. mv -f /var/account/acct.1 /var/account/acct.2
  72. mv -f /var/account/acct.0 /var/account/acct.1
  73. cp -f /var/account/acct /var/account/acct.0
  74. sa -sq
  75. fi
  76. # If ROOTBACKUP is set to 1 in the environment, and
  77. # if filesystem named /altroot is type ffs and mounted "xx",
  78. # use it as a backup root filesystem to be updated daily.
  79. next_part "Backing up root filesystem:"
  80. while [ "X$ROOTBACKUP" = X1 ]; do
  81. rootbak=`awk '$1 !~ /^#/ && $2 == "/altroot" && $3 == "ffs" && \
  82. $4 ~ /xx/ { print $1 }' < /etc/fstab`
  83. if [ -z "$rootbak" ]; then
  84. echo "No xx ffs /altroot device found in the fstab(5)."
  85. break
  86. fi
  87. rootbak=${rootbak#/dev/}
  88. bakdisk=${rootbak%%?(.)[a-p]}
  89. sysctl -n hw.disknames | grep -Fqw $bakdisk || break
  90. bakpart=${rootbak##$bakdisk?(.)}
  91. OLDIFS=$IFS
  92. IFS=,
  93. for d in `sysctl -n hw.disknames`; do
  94. # If the provided disk name is a duid, substitute the device.
  95. if [ X$bakdisk = X${d#*:} ]; then
  96. bakdisk=${d%:*}
  97. rootbak=$bakdisk$bakpart
  98. fi
  99. done
  100. IFS=$OLDIFS
  101. baksize=`disklabel $bakdisk 2>/dev/null | \
  102. awk -v "part=$bakpart:" '$1 == part { print $2 }'`
  103. rootdev=`mount | awk '$3 == "/" && $1 ~ /^\/dev\// && $5 == "ffs" \
  104. { print substr($1, 6) }'`
  105. if [ -z "$rootdev" ]; then
  106. echo "The root filesystem is not local or not ffs."
  107. break
  108. fi
  109. if [ X$rootdev = X$rootbak ]; then
  110. echo "The device $rootdev holds both root and /altroot."
  111. break
  112. fi
  113. rootdisk=${rootdev%[a-p]}
  114. rootpart=${rootdev#$rootdisk}
  115. rootsize=`disklabel $rootdisk 2>/dev/null | \
  116. awk -v "part=$rootpart:" '$1 == part { print $2 }'`
  117. if [ $rootsize -gt $baksize ]; then
  118. echo "Root ($rootsize) is larger than /altroot ($baksize)."
  119. break
  120. fi
  121. next_part "Backing up root=/dev/r$rootdev to /dev/r$rootbak:"
  122. sync
  123. dd if=/dev/r$rootdev of=/dev/r$rootbak bs=16b seek=1 skip=1 \
  124. conv=noerror
  125. fsck -y /dev/r$rootbak
  126. break
  127. done
  128. next_part "Checking subsystem status:"
  129. if [ "X$VERBOSESTATUS" != X0 ]; then
  130. echo ""
  131. echo "disks:"
  132. df -ikl
  133. echo ""
  134. dump W
  135. fi
  136. # The first two regular expressions handle sendmail, the third postfix.
  137. # When the queue is empty, smtpd(8) and exim -bp keep silent.
  138. next_part "mail:"
  139. mailq | grep -v -e "^/var/spool/mqueue is empty$" \
  140. -e "^[[:blank:]]*Total requests: 0$" \
  141. -e "^Mail queue is empty$"
  142. next_part "network:"
  143. if [ "X$VERBOSESTATUS" != X0 ]; then
  144. netstat -ivn
  145. fi
  146. next_part "Running calendar in the background:"
  147. if [ "X$CALENDAR" != X0 -a \
  148. \( -d /var/yp/`domainname` -o ! -d /var/yp/binding \) ]; then
  149. calendar -a &
  150. fi
  151. # If CHECKFILESYSTEMS is set to 1 in the environment, run fsck
  152. # with the no-write flag.
  153. next_part "Checking filesystems:"
  154. [ "X$CHECKFILESYSTEMS" = X1 ] && {
  155. fsck -n | grep -v '^\*\* Phase'
  156. }
  157. next_part "Running rdist:"
  158. if [ -f /etc/Distfile ]; then
  159. if [ -d /var/log/rdist ]; then
  160. rdist -f /etc/Distfile 2>&1 | tee /var/log/rdist/`date +%F`
  161. else
  162. rdist -f /etc/Distfile
  163. fi
  164. fi
  165. end_part
  166. [ -s $MAINOUT ] && {
  167. sysctl -n kern.version
  168. uptime
  169. cat $MAINOUT
  170. } 2>&1 | mail -s "`hostname` daily output" root
  171. MAINOUT=/var/log/security.out
  172. install -o 0 -g 0 -m 600 -b /dev/null $MAINOUT
  173. start_part "Running security(8):"
  174. export SUIDSKIP
  175. /usr/libexec/security
  176. end_part
  177. rm -f $PARTOUT
  178. [ -s $MAINOUT ] && mail -s "`hostname` daily insecurity output" root < $MAINOUT