#!/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