LINUX.ORG.RU
ФорумAdmin

Дешево, но сердито: система мониторинга RAID массивов

 ,


1

1

Как я уже писал ранее, мне нужно было следить за RAID, при этом не тратить на это кучу времени.

Я решил, что если CLI утилиты статусы как массивов целиком, так и дисков по отдельности выдают, остается только погрепать результат на значения ошибок. Но как быть если не знаешь как будет описана ошибка?

И я решил мониторить изменения того самого статуса целиком, то есть если в нем изменится хотя бы один символ, я получу сигнал.

root@pve02:~# cat ./CheckArray.sh
#!/bin/bash

ServerName="pve02"
OutputToCheck="/usr/sbin/arcconf GETCONFIG 1 LD"
StateToContol="/root/ArrayState.txt"
TLGGROUP="Admins_message"

if [[ 'init' = $1 ]]
then
    eval "$OutputToCheck > $StateToContol"
    MESSAGE="RAID monitoring activated | $ServerName "
    EXECCMD="\"msg ${TLGGROUP} \"\"${MESSAGE}\""
    eval /root/tg/bin/telegram-cli -k /root/tg/tg-server.pub -U root --disable-output  --wait-dialog-list --exec "${EXECCMD}"
    exit
fi




if [[ $(stat $StateToContol -c %s) = 0 ]]
then
    echo "Run script with 'init' key first"
    MESSAGE="Run script with 'init' key first | $ServerName"
    EXECCMD="\"msg ${TLGGROUP} \"\"${MESSAGE}\""
    eval /root/tg/bin/telegram-cli -k /root/tg/tg-server.pub -U root --disable-output  --wait-dialog-list --exec "${EXECCMD}"
    exit
fi

CurrentState="$(eval $OutputToCheck)"
InitState="$(cat $StateToContol)"

if [[ "$CurrentState" == "$InitState" ]]
then
    if [[ 'test' = $1 ]]
    then
        MESSAGE="Fine, current state equal init value | $ServerName"
        EXECCMD="\"msg ${TLGGROUP} \"\"${MESSAGE}\""
        eval /root/tg/bin/telegram-cli -k /root/tg/tg-server.pub -U root --disable-output  --wait-dialog-list --exec "${EXECCMD}"
        exit
    fi
else
    MESSAGE="Error, current state not equal init value | $ServerName"
    EXECCMD="\"msg ${TLGGROUP} \"\"${MESSAGE}\""
    eval /root/tg/bin/telegram-cli -k /root/tg/tg-server.pub -U root --disable-output  --wait-dialog-list --exec "${EXECCMD}"
    exit
fi

Да, да, все от рута, но зачем мне на этой системе еще пользователи?

Ну и расписание запуска:

firoot@pve02:~# crontab -l
# m h  dom mon dow   command
*/3     *       *       *       *       /root/CheckArray.sh
0       16      *       *       *       /root/CheckArray.sh test



Последнее исправление: Shulman (всего исправлений: 2)

ну и норм

anonymous
()

И я решил мониторить изменения того самого статуса целиком

Похоже, ты родил

#!/bin/bash
##
## Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2014 Thomas Eckert,
##      <thomas.eckert at it-eckert.de>
##      http://www.it-eckert.com/software/raid-monitor
##
## License
##      Copying and distribution of this package (raid-monitor for Xymon), with or
##      without modification, are permitted in any medium without royalty provided the
##      copyright notice and this notice are preserved. This package is offered as-is,
##      without any warranty.
##
## raid-monitor for Xymon
## generic RAID-Status-Checker


Но, кажется, этот скрипт утерян - url не живой (хотя у меня скрипт есть).

AS ★★★★★
()
Ответ на: комментарий от AS

Хорошо))) вот тебе мой скрипт, правда он прибит гвоздями к другому проекту, но не долго переделать нотификацию не на телегу

Shulman
() автор топика

telegram-cli

А на почту (в том числе локальную), конечно же, не судьба? Извращенец!

mord0d ★★★★★
()
Ответ на: комментарий от Shulman

почту блин мы поломали

Дять, msmtp работает в качестве локального MTA чуть ли не искаропки, ну. С чуть большим напилингом (на три-четыре строчки больше) настраивается передача на внешний MTA.

mord0d ★★★★★
()

Положи state в git, пусть ещё PR делает с дифами :)

kardapoltsev ★★★★★
()

Мысли вслух, можно игнорировать :-)

Ваш скрипт точно рабочий ? Есть большое подозрение, что все eval в нём лишние.

Зачем при запуске с параметром init отсылать ответ через telegram ? Это ж параметр одноразового запуска вручную, запускать будет человек руками. Почему бы сразу не выдать результат в stdout тут же ? Или, например, так:

alert(){
    [[ -t 0 ]] && echo '...' || /root/tg/bin/telegram-cli ...
}

Error, current state not equal init value

И ? Где diff с изменениями ? Или при каждой ошибке нужно идти на сервер, искать файл с эталонным значением и сравнивать вручную с текущим выводом ?

spirit ★★★★★
()
Ответ на: комментарий от spirit

Ваш скрипт точно рабочий ?

Это да

eval

Но как по другому сформировать команду, я просто не очень хорошо знаю bash, если что то сработало однажды, оно будет копироваться все время из сценария в сценарий.

Зачем при запуске с параметром init отсылать ответ через telegram

чтобы заодно проверить что телега настроена, я при первом запуске телеги вводил номер и валидацию.

И ? Где diff с изменениями ?

Думаю что если этот скрипт пришлет сообщение, то это повод заглянуть на сервер, как бы рейду может быть плохо. Событие согласитесь редкое, но меткое.

Shulman
() автор топика
Ответ на: комментарий от Shulman

искать файл с эталонным значением

а что его искать? если путь до него вы сами указываете?

Shulman
() автор топика

держи

#!/bin/sh
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/sbin:/usr/sbin:/usr/local/sbin:$HOME/bin

function arcraidstatus {
# $1 - timeout
# $2 - retries
  [[ -z "$1" ]] && timeout=60 || timeout=$1
  [[ -z "$2" ]] && retries=3  || retries=$2
  for i in $(seq 1 $retries); do 
    arcconf_data="$(timeout $timeout arcconf GETCONFIG 1)"
    [[ $? -eq 0 ]] && break
  done
  <<<"$arcconf_data" egrep -i 'Controller Status|Status of Logical Device|Status.*Cache'
}

pidof arcconf > /dev/null 2>&1 && ( for PID in `pidof arcconf`; do kill -STOP $PID; sleep 1; kill -CONT $PID; sleep 1; done )

RAIDSTATUS="$(arcraidstatus)"

if [ "`echo $RAIDSTATUS | grep -c -i Status`" -eq 0 ]; then
      echo "No adaptec controllers found!"
      exit 1
fi
echo "$RAIDSTATUS" | while read LINE
do
    STATUS=$(echo $LINE|sed 's/(.*//g;s/.*://g;s/[ \t]*$//;s/^[ \t]*//')
    if [ "$STATUS" != "Optimal" ]; then
        MESSAGE=$(echo $LINE|sed 's/:.*//g; s/[ \t]*$//;s/^[ \t]*//')
        echo "Adaptec raid problem! Bad ${MESSAGE}: ${STATUS}"
        exit 1
    fi
done
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.