#!/bin/bash
# Telegram API Á¤º¸
BOT_TOKEN="XXXXXXXXXXXXXXX"
CHAT_IDS=("9XXXXX" "516XXXXX")
# Ű¿öµå ¼³Á¤ (ÄÞ¸¶·Î ±¸ºÐ)
KEYWORDS=("i/o error" \
"ovs is dead" \
"reset adapter" \
"segfault at" \
"Instance rollback" \
"Adapter removed" \
"exception Emask" \
"Switch connection timeout" \
"The process should not have died" \
"unable to handle page fault for address" \
"unable to handle kernel NULL pointe" \
"timeout policy" \
"OVS is down" \
"Out of memory" \
"Killed process" \
"Failed to communicate with the switch" \
"neighbor table overflow!" \
"IO_PAGE_FAULT" \
"protection fault" \
"failed to assign" \
"database was removed" \
"can't for" )
# ·Î±× ÆÄÀÏ °æ·Î
LOG_FILE="/var/log/syslog"
# Áߺ¹ ¾Ë¸² Á¦ÇÑ ½Ã°£(ÃÊ)
ALERT_INTERVAL=30
# Àӽà ÆÄÀÏ °æ·Î (Ű¿öµåº° ¾Ë¸² »óÅ ÀúÀå)
TEMP_FILE="/tmp/telegram_alert_keywords.tmp"
# Telegram ¸Þ½ÃÁö Àü¼Û ÇÔ¼ö
send_telegram_message() {
local message="$1"
for chat_id in "${CHAT_IDS[@]}"; do
curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
-d chat_id="${chat_id}" \
-d text="${message}" > /dev/null
done
}
# Áߺ¹ ¸Þ½ÃÁö Á¦ÇÑ ÇÔ¼ö
should_send_alert() {
local message="$1"
local current_time
current_time=$(date +%s)
if [ ! -f "$TEMP_FILE" ]; then
touch "$TEMP_FILE"
fi
# ¸Þ½ÃÁöº° ½Ã°£ È®ÀÎ
if grep -qF "$message" "$TEMP_FILE"; then
last_sent_time=$(grep -F "$message" "$TEMP_FILE" | awk '{print $1}')
if (( current_time - last_sent_time < ALERT_INTERVAL )); then
return 1 # Á¦ÇÑ ½Ã°£ ³»
else
# Á¦ÇÑ ½Ã°£ Ãʰú, °»½Å
sed -i "/$message/d" "$TEMP_FILE"
fi
fi
# »õ ±â·Ï Ãß°¡
echo "$current_time $message" >> "$TEMP_FILE"
return 0 # ¾Ë¸² Àü¼Û °¡´É
}
# ·Î±× ÆÄÀÏ ¸ð´ÏÅ͸µ
tail -F "$LOG_FILE" |egrep -v "pcieport|containment event|guest rIP|nrpe|rsyslog|snmp|kvm_set_msr_common" | while read -r line; do
for sentence in "${KEYWORDS[@]}"; do
if [[ "$line" == *"$sentence"* ]]; then
if should_send_alert "$sentence"; then
message="[`hostname`] $line"
send_telegram_message "$message"
fi
break
fi
done
done
# ln -sf /etc/init.d/logmon /etc/rc3.d/S01logmon
# service enable logmon
# cat > /etc/init.d/logmon
#!/bin/bash
SERVICE_NAME="LogMonService"
COMMAND="/root/interval_test_logalarm.sh"
LOG_FILE="/var/log/${SERVICE_NAME}.log"
PID_FILE="/var/run/${SERVICE_NAME}.pid"
start() {
if [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE")" > /dev/null 2>&1; then
echo "$SERVICE_NAME is already running with PID $(cat "$PID_FILE")."
exit 1
fi
echo "Starting $SERVICE_NAME..."
nohup $COMMAND > "$LOG_FILE" 2>&1 &
echo $! > "$PID_FILE"
echo "$SERVICE_NAME started with PID $(cat "$PID_FILE")."
}
stop() {
if [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE")" > /dev/null 2>&1; then
echo "Stopping $SERVICE_NAME..."
#kill "$(cat "$PID_FILE")"
kill -9 $(ps aux |grep interval |grep -v grep |awk '{print $2}')
rm -f "$PID_FILE"
echo "$SERVICE_NAME stopped."
else
echo "$SERVICE_NAME is not running."
fi
}
status() {
if [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE")" > /dev/null 2>&1; then
echo "$SERVICE_NAME is running with PID $(cat "$PID_FILE")."
else
echo "$SERVICE_NAME is not running."
fi
}
restart() {
stop
sleep 1
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac