slitaz-dev-tools rev 39
Add srvwatch
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Mon Mar 14 09:14:05 2011 +0100 (2011-03-14) |
parents | 50448e6a6061 |
children | 7392e83f539c |
files | mirror-tools/rootfs/usr/sbin/srvwatch |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/mirror-tools/rootfs/usr/sbin/srvwatch Mon Mar 14 09:14:05 2011 +0100 1.3 @@ -0,0 +1,179 @@ 1.4 +#!/bin/sh 1.5 + 1.6 +# Check daemon with pidfile: usage check_pidfile $PIDFILE $DAEMON 1.7 +active_pidfile() 1.8 +{ 1.9 + if [ ! -e $1 ]; then 1.10 + return 1 1.11 + elif grep -qs "Name:.$(basename $2)$" \ 1.12 + /proc/$(cat $1 | sed 's/[^0-9]//g')/status ; then 1.13 + return 0 1.14 + else 1.15 + rm -f $1 1.16 + return 2 1.17 + fi 1.18 +} 1.19 + 1.20 +log() 1.21 +{ 1.22 + cat > /var/log/svrwatch.log.$$ <<EOT 1.23 +$(tail -n 50 /var/log/svrwatch.log 2> /dev/null) 1.24 +$(date) $@ 1.25 +EOT 1.26 + mv -f /var/log/svrwatch.log.$$ /var/log/svrwatch.log 1.27 +} 1.28 + 1.29 +cron_leak() 1.30 +{ 1.31 + mem=$(top -b -n1 | grep cron | grep -v grep | awk '{ print $5 }') 1.32 + case "$mem" in 1.33 + *m) [ ${mem%m} -gt 500 ] && { 1.34 + log "restart crond (use $mem)" 1.35 + /etc/init.d/crond restart > /dev/null 2>&1 1.36 + } 1.37 + ;; 1.38 + esac 1.39 +} 1.40 + 1.41 +make_pem() 1.42 +{ 1.43 +names="DNS:*.$1, DNS:$1" 1.44 +if grep -q '# req_extensions' /etc/ssl/openssl.cnf; then 1.45 + sed -i 's/^# req_extensions.*/req_extensions = multiname/' \ 1.46 + /etc/ssl/openssl.cnf 1.47 + cat >> /etc/ssl/openssl.cnf << EOT 1.48 + 1.49 +[ multiname ] 1.50 +subjectAltName = $names 1.51 +EOT 1.52 +else 1.53 + sed -i "s/^subjectAltName.*/subjectAltName = $names/" /etc/ssl/openssl.cnf 1.54 +fi 1.55 +false && cat > multiname.ext <<EOT 1.56 +[ multiname ] 1.57 +subjectAltName = $names 1.58 +EOT 1.59 + 1.60 +# -extfile multiname.ext -extensions multiname 1.61 +openssl req -new -x509 -keyout $2 -extensions multiname \ 1.62 + -out $2 -days 3650 -nodes <<EOT 1.63 +$(. /etc/locale.conf ; echo ${LANG#*_}) 1.64 +$(cat /etc/TZ) 1.65 + 1.66 +*.$1 1.67 + 1.68 + 1.69 + 1.70 +EOT 1.71 +} 1.72 + 1.73 +check_pem() 1.74 +{ 1.75 +grep SSLCertificat /etc/apache/conf.d/* | awk '{ print $3 }' | uniq | \ 1.76 +while read file; do 1.77 + [ -s $file ] && continue 1.78 + make_pem $(basename $file .pem) $file 1.79 +done 1.80 +} 1.81 + 1.82 +check_certificates() 1.83 +{ 1.84 + if [ -n "$(check_pem)" ]; then 1.85 + /etc/init.d/apache stop 1.86 + /etc/init.d/apache start 1.87 + fi 1.88 +} 1.89 + 1.90 +daemon_crash() 1.91 +{ 1.92 + if [ -f /etc/aliases -a /etc/aliases -nt /etc/aliases.db ]; then 1.93 + log "/etc/aliases" 1.94 + postalias /etc/aliases 1.95 + fi 1.96 + eval $(grep ^RUN_DAEMONS= /etc/rcS.conf) 1.97 + checked="" 1.98 + while read command pidfile daemon; do 1.99 + case "$command" in 1.100 + \#*) continue 1.101 + esac 1.102 + checked="$checked $command" 1.103 + case " $RUN_DAEMONS " in 1.104 + *\ $command\ *) 1.105 + case "$command" in 1.106 + apache) 1.107 + check_certificates ;; 1.108 + esac 1.109 + active_pidfile $pidfile $daemon || { 1.110 + log "start daemon $command" 1.111 + /etc/init.d/$command start 1.112 + } 1.113 + if [ $command == mysql -a ! -e /var/run/mysqld/mysqld.sock ]; then 1.114 + log "mysql socket" 1.115 + killall mysqld 1.116 + killall -9 mysqld 1.117 + /etc/init.d/mysql start 1.118 + fi 1.119 + ;; 1.120 + esac 1.121 + done <<EOT 1.122 +rsyncd /var/run/rsyncd.pid rsync 1.123 +openssh /var/run/sshd.pid sshd 1.124 +lighttpd /var/run/lighttpd.pid lighttpd 1.125 +hald /var/run/hald/pid hald 1.126 +ajaxterm /var/run/ajaxterm.pid python 1.127 +apache /var/run/apache/httpd.pid httpd 1.128 +crond /var/run/crond.pid crond 1.129 +dbus /var/run/dbus/pid dbus-daemon 1.130 +dropbear /var/run/dropbear.pid dropbear 1.131 +hald /var/run/hald/pid hald 1.132 +mysql /var/run/mysqld/mysql.pid mysqld 1.133 +ntp /var/run/ntpd.pid ntpd 1.134 +postfix /var/spool/postfix/pid/master.pid master 1.135 +pure-ftpd /var/run/pure-ftpd.pid pure-ftpd 1.136 +slim /var/lock/slim.lock slim 1.137 +knock /var/run/knockd.pid knockd 1.138 +udhcpd /var/run/udhcpd.pid udhcpd 1.139 +dhcpd /var/run/dhcpd.pid dhcpd 1.140 +EOT 1.141 + rm -f /var/log/srvwatch.log 1.142 + for i in $RUN_DAEMONS ; do 1.143 + case " $checked " in 1.144 + *\ $i\ *) ;; 1.145 + *) echo "Not checked: $i" >> /var/log/srvwatch.log ;; 1.146 + esac 1.147 + done 1.148 +} 1.149 + 1.150 +swap_full() 1.151 +{ 1.152 + if [ -n "$(free | awk '/Swap/ { if ($2/$4 > 10) print }')" ]; then 1.153 + log "$(free | grep Swap)" 1.154 + top -b -n1 > /var/log/top.log 1.155 + sync 1.156 + reboot 1.157 + fi 1.158 +} 1.159 + 1.160 +case "$1" in 1.161 +install) 1.162 + [ $0 == $2/usr/sbin/srvwatch ] || mv $0 $2/usr/sbin/srvwatch 1.163 + if [ -x $2/usr/sbin/srvwatch ] && ! grep -q /usr/sbin/srvwatch $2/etc/inittab; then 1.164 + sed -i 's|^::sysinit.*|&\n::respawn:/usr/sbin/srvwatch loop|' \ 1.165 + $2/etc/inittab 1.166 + [ -n "$2" ] || kill -1 1 1.167 + fi 1.168 + ;; 1.169 +once) 1.170 + daemon_crash 1.171 + cron_leak 1.172 + swap_full ;; 1.173 +loop) 1.174 + while true; do 1.175 + daemon_crash 1.176 + cron_leak 1.177 + swap_full 1.178 + sleep 15m 1.179 + done > /dev/null 2>&1 ;; 1.180 +*) 1.181 + echo "Usage: $0 install" ;; 1.182 +esac