#!/bin/sh # # Copyright (C) 2007 Dinko Korunic, CARNet, Grupa za izradu paketa # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation; either version 2 of the License, or (at your # option) any later version. MONIT_DIR=/etc/monit.d TEMPLATES_DIR=/usr/share/monit-cn check_service() { RET=0 filename="$1" if [ ! -r "$filename" ]; then RET=1 return 1 fi scriptpid='BEGIN { RS = "[ \t\n]+" } { line[NR] = $0 "" } END { for (j in line) if (line[j] == "pidfile") print line[j + 1] }' pidfiles=$(awk "$scriptpid" < "$filename" | sed -e 's/"//g') check_pidfile $pidfiles if [ $RET -eq 1 ]; then return 1 fi scriptinit='BEGIN { RS = "[ \t\n]+" } { line[NR] = $0 "" } END { for (j in line) if (((line[j] == "start") || (line[j] == "stop")) && (line[j + 1] == "program") && (line[j + 2] == "=")) print line[j + 3] }' initscripts=$(awk "$scriptinit" < "$filename" | sed -e 's/"//g') check_initscript $initscripts return $RET } check_pidfile() { RET=0 while [ -n "$1" ]; do if [ -r "$1" ]; then check_pid $(cat "$1") if [ $RET -eq 1 ]; then return 1 fi else RET=1 return 1 fi shift done return 0 } check_initscript() { RET=0 while [ -n "$1" ]; do if [ ! -x "$1" ]; then RET=1 return 1 fi shift done return 0 } check_pid() { RET=0 while [ -n "$1" ]; do if ! kill -0 "$1" >/dev/null 2>&1; then RET=1 return 1 fi shift done return 0 } ##################################################################### changed=0 if [ ! -d "$MONIT_DIR" ]; then mkdir -p "$MONIT_DIR" fi for i in $(find "$MONIT_DIR" -name '*.conf'); do check_service $i if [ ! $RET -eq 0 ]; then serviceconf=$(basename $i) echo "CN: Disabled $serviceconf" mv -f $i $i.disabled changed=1 fi done for i in $(find "$TEMPLATES_DIR" -name '*.conf'); do serviceconf=$(basename $i) if [ -r "$MONIT_DIR"/$serviceconf.disabled ]; then check_service "$MONIT_DIR"/$serviceconf.disabled if [ $RET -eq 0 ]; then if [ ! -r "$MONIT_DIR"/$serviceconf ]; then echo "CN: Enabled $serviceconf (previously disabled)" mv "$MONIT_DIR"/$serviceconf.disabled \ "$MONIT_DIR"/$serviceconf changed=1 fi fi else check_service $i if [ $RET -eq 0 ]; then if [ ! -r "$MONIT_DIR"/$serviceconf ]; then echo "CN: Enabled $serviceconf (new service)" cp -a $i "$MONIT_DIR" changed=1 fi fi fi done if [ $changed -eq 1 ]; then echo "CN: Stopping/restarting monit service" pkill -9 -f /usr/sbin/monit || true else echo "CN: No new services detected, sorry" fi exit 0