Систем за известување и управување преку СМС пораки – четврт дел

Ова е последен текст во серијата еднолето и последен додаток во системот за известување и управување преку СМС пораки. Како последен начин на искористување на СМС каналот за комуникација помеѓу еден систем и негов корисник, или администратор, ќе разгледаме едно решение, како може да надгледуваме активен сервис. Пример, на вашиот систем имате инсталирано apache сервер, или било кој веб сервер, и имате http daemon кој што работи во позадина и важно ви е сервисот да нема голем downtime. Во овој случај може да го искористиме kannel sms сервисот за, од една страна да може да го надгледуваме, а од друга страна да може да го конролираме сервисот преку испраќање на СМС пораки.

Прво, дефинираме нов смс сервис во конфигурацијата на kannel со содржина:

group = sms-service
keyword = MONITOR
exec = sh $HOME/Documents/development/ednoleto/smsmon.sh %p %P %s

Може да забележиме дека сервисот е стандардно дефиниран, со клучен збор MONITOR и со повик кон shell скрипта smsmon.sh проследувајќи ги на влез испраќачот, примачот и првиот збор после клучниот (командата). Сервисот е замислен да функционира на таков начин што ќе прима команди само за старт и стоп на друга скрипта која што ќе ја повикаме од код. Скриптата smsmon е со претходно опишаната структура, односно на почеток ги иницијализира променливите, дефинира функција за испраќање на СМС пораки и има case структура со две команди, help и default случај.

start)
#start the port monitor script as a background daemon from its location
if [ `ps ax | grep -i monitor.sh | wc -l` -gt “1” ]
then sendsms “The service is already active!”
else
sh $HOME/Documents/development/ednoleto/monitor.sh $sender $reciever &
sendsms “Port monitor service successfuly started!”
fi
;;

stop)
#stop the port monitor script
if [ `ps ax | grep -i monitor.sh | wc -l` -gt “1” ]
then
kill -9 `ps ax | grep -i monitor.sh | grep “sh ” | awk ‘{print $1}’`
sendsms “Port monitor stopped!”
else
sendsms “Port monitor service is not active!”
fi
;;

Командите за старт и стоп на сервисот се изведени со стандардно надгледување на состојба на листата со процеси, односно при повик на старт, доколку сервисот е активен, се ирпраќа одговор по СМС за потврда, инаку, како позадински процес се стартува скриптата monitor.sh (позадински процес се стартува доколку на крајот од командата се додаде знакот &) проследувајќи ги вредностите на испраќач и примач на пораката соодветно. Од друга страна, доколку испратиме команда за стоп на сервисот, првин проверуваме дали е активна скриптата и доколку е, ја стопираме истата.

Содржината на monitor.sh е малку поинаква од досега разгледаните. Како што може да се види во скриптата, на почеток повторно ги превземаме проследените вредности на испраќач и примач на пораката и ја дефинираме функцијата за испраќање на СМС пораки, но изостанува стандардната case структура за проследената команда (која сега ја нема). Наместо тоа, во скриптата е дефиниран бесконечен while циклус кој што се извршува на одредено време:

while [ 1 ]
do
nc -z localhost 80
#you can use -u for UDP services, -n for not resolving dns names etc…
#on some distributions ‘nc’ is called ‘netcat’
if [ $? -eq 0 ]; then
#everything is OK and now do nothing for the next 5 minutes
sleep 300
elif [ $? != 0 ]; then
#the service is down, send an SMS notification.
sendsms “The service on port 80 (httpd) is down!”
sleep 300
fi
done

Во циклусот, всушност, вршиме проверка на портата на сервисот, односно стандардната http порта – 80. За да потврдиме дали надгледуваниот сервис (во овој случај httpd) е активен, или не, на одредено време пробуваме да се конектираме на портата на која што работи сервисот преку алатката nc, или netcat. Со “nc -z localhost 80” пробуваме да се конектираме на порта 80 на хостот – localhost, односно локално кај нас (секако овде може да стои и некој оддалечен хост со IP адреса или име) и во зависност од излезот, извршуваме некоја акција. Доколку пробате да ја извршите командата надвор од скриптата, ќе видите дека како одговор добивате, или излез од типот: Connection to localhost 80 port [tcp/http] succeeded! или воопшто нема да добиете излез. Флегот, односно опцијата -z и кажува на алатката nc само да проба да се конектира и да се дисконектира веднаш, проследувајќи го резултатот од успешноста, па затоа, доколку добиеме било каков резултат, не правиме ништо (не треба да испраќаме известување доколку сервисот е во ред и активен) и ја “заспиваме” скриптата на одредено време, односно, посакуваното време на повторна проверка (времето е изразено во секунди). Но, доколку сервисот е паднат, односно портата е недостапна, испраќаме СМС порака до корисникот со известување и повторно ја “заспиваме” скриптата на одредено време. На овој начин корисникот може моментално да реагира, пример, да го стопира smsmon.sh сервисот со испраќање на порака со содржина “MONITOR stop” (за да не добива известување за статусот на сервисот на, пример, секои 5 минути) и да погледне во што е проблемот, или пак да ја почека следната проверка, за потврда дека сервисот сеуште е паднат и тогаш да реагира.

Секако, статусот на одреден сервис може да се провери на неколку начини, пример, да се провери дали е присутен процесот во листата со процеси (ps ax | grep -i httpd), или пак да се провери статусот на сервисот доколку е стартуван преку systemd (systemctl status httpd.service) или пак да се провери листата на “отворени” фајлови (sudo lsof -i :80 | grep LISTEN) и слично. Се зависи од навиките и посакуваниот начин на користење на можностите, кои во овој случај се огромни. И на крај, доколку констатираме дека сервисот е паднат, односно добиеме известување, многу едноставно, на неколку начини може да го рестартираме истиот додавајќи команда во претходно опишаната скипта smscmd.sh со, на пример, содржина sudo systemctl start httpd.service и слично.

Постојат голем број на софтверски решенија кои што, на можеби полесен, или поефикасен начин, се справуваат со истава проблематика. Разликата во користење на Kannel SMS gateway е само каналот на комуникација, но и можноста да се конфигурира и прошири во зависност од потребите. Користејќи го овој начин на управување, може да повикате, односно извршите, било каков код и било каква скрипта и да превземете било каква акција, но секако, најчесто решенијата мора сами да ги пишувате, а дали е тој начин поефикасен или не, оценете сами. Сепак, кај е забавата доколку секогаш користите готови решенија?

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s