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

Во првиот пост посветен на проектот од еднолето, видовме како се инсталира Kannel пакетот, со неговите WAP и SMS gateways и како функционира една основна конфигурација на истиот. Овојпат повеќе ќе се задржиме на можностите на алатката за известување во една GNU/Linux околина, односно ќе видиме како може да добиеме вредности на одредени системски параметри преку СМС порака.

Сега кога веќе знаеме како функционира системот, може директно да преминеме на пишување на sms-service во конфигурацискиот документ. За нашите моментални потреби, дефинираме СМС сервис кој што ќе ги препознава пораките наменети за него според клучниот збор “CMD” и притоа ќе изврши одредена shell скрипта на која ќе проследи одредени параметри. Целосната конфигурација изгледа вака:

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

Во exec делот од конфигурацијата всушност се дефинира извршување на скрипта поставена на дадената локација (секако локацијата може да се промени во зависност од потребите) на која што се проследуваат три параметри чии што алиаси може да ги видиме во документацијата на алатката. Во овој случај, %p и %P претставуваат броевите на испраќачот на пораката (кој ни ја пратил пораката – %p) и примачот, односно ние, соодветно, а %s го претставува вториот збор во пораката, т.е. зборот што доаѓа после клучниот збор.

Резултатот што сакаме да го постигнеме, во овој случај, е систем кој што на дадена СМС порака, со одреден клучен збор и одредена додатна команда, ќе врати СМС порака, во зависност од побараната содржина. Конретно, сервисот го дефиниравме да реагира на клучниот збор CMD и притоа на shell скриптата да и ги испраќа вредностите на испраќачот, примачот и додатниот збор, според кој ќе одредиме каква порака, односно каков системски параметар треба да врати системот на испраќачот. Скриптата ја започнуваме со запишување на параметрите од СМС пораката во одредени променливи (со # се означени коментарите):

sender=$1 #who sent us the SMS
reciever=$2 #we are the reciever in this case
command=$3 #what command is passed to the system from the SMS message

Следи еден од поважните делови во скриптата, односно функцијата за испраќање на СМС пораки.

function sendsms(){
msg=$1 #the message passed to the function is not url coded
message=$(python -c “import urllib; print urllib.quote(”’$msg”’)”) #we use a simple python command to url code the message
curl “http://localhost:13013/cgi-bin/sendsms?user=test&password=test&from=$reciever&to=$sender&text=$message”
}

Ја дефинираме променливата msg во која што го запишуваме проследениот параметар кон функцијата и после тоа, со едноставен повик кон функција од urllib библиотеката од python (стандардна python библиотека, нема потреба од додатно инсталирање) во променливата message ја запишуваме вредноста на msg, url кодирана, поради тоа што sendsms сервисот од Kannel SMS gateway препознава и работи само со url кодирани пораки. Откако ја добивме пораката, останува само да го изградиме целосното URL и со помош на curl, го повикуваме веб сервисот на kannel за испраќање на СМС пораки. Во URL-то може да се види дека се користат параметри за корисник (group = sendsms-user; корисничко име и лозинка) претходно дефиниран во конфигурацискиот фајл.

Сега кога веќе ја дефиниравме функцијата за испраќање на СМС пораки, останува само уште да се справиме со сите можни вредности на променливата command, дојдени на влез во скриптата. За таа цел пишуваме една едноставна case структура во која што ги опишуваме сите можни случаи, односно дефинираме, во овој случај пет валидни команди, help команда и останато. Како прва од петте команди ја дефинираме командата temperature, односно на испратена СМС порака со содржина CMD temperature, дефинираме случај во кој што shell скриптата ќе испрати одговор со содржина – моменталната температура на процесорот. Во case структурата, командата за temperature изгледа вака:

temperature=`acpi -t`
sendsms “$temperature”

едноставно ја запишуваме излезната вредност на shell командата “acpi -t” (acpi – advanced configuration and power interface, алатка која што чита вредности од /proc, односно прикажува параметри на вградени батерии, температури и слично ) во променлива насловена како temperature и вредноста на истата променлива ја проследуваме на функцијата за испраќање на СМС пораки, која што испраќа порака на корисникот кој побарал со дадената проследена вредност.

Како втора команда ја дефинираме командата uptime која што е скоро иста со претходната:

uptme=”Uptime:”`uptime`
sendsms “$uptme”

Овде гледаме дека во променливата uptme се проследува вредноста на shell командата uptime (колку време е активна сесијата на дадениот компјутер) пред тоа додавајќи го стрингот “Uptime:” и истата вредност ја испраќаме на функцијата за испраќање на СМС пораки. Како следна, трета команда, ја дефинираме cpuinfo (CMD cpuinfo) која што треба да врати вредност – информации за моделот на процесорот. Информациите ги добиваме читајќи од /proc/cpuinfo парсирајќи го целосниот текст за да ја добиеме бараната вредност. Делот за читање на информации за моделот на процесорот изгледа вака:

cpuinfo=`cat /proc/cpuinfo | grep “model name” | head -n 1 | awk ‘{ print substr( $0, 17 )}’`
sendsms “Model name: $cpuinfo”

каде што може да видиме дека текстот од /proc/cpuinfo најпрвин се филтрира, односно се прикажуваат само редовите кои што содржат стринг “model info”, па од нив се зима само првиот ред, од кој што се зема подстринг почнувајќи од позиција 17 (позицијата од кај што почнува името на моделот на процесорот) па до крај. Резултатот од филтрирањето се запишува во променлива cpuinfo и се проследува кон функцијата за испраќање пораки.

На сличен начин се формира и четвртата команда – memory која што како одговор треба да ја даде моменталната состојба на РАМ меморијата. Содржината на пораката која што ќе се испрати ја добиваме со филтрирање на излезот од “free -m“, shell командата која што ни дава информации за состојбата на меморијата.

mem=`free -m | grep -i Mem | awk ‘{print “used: ” $3 ” free: ” $4 “, cached: ” $7 }’`
sendsms “$mem”

Последната петта команда, wicd, всушност прикажува една од многуте можности на новиот систем за иницијализација и управување – systemd, кој што во основа е предвиден да го замени досегашниот system V, или init V имплементирајќи во него многу поширок спектар на функционалности. Петтата команда, всушност само го рестартира wicd мрежниот сервис преку systemctl алатката од systemd која што се грижи за правилно рестартирање на истиот, справувајќи се со сите деца процеси на wicd и со останатите зависности дефинирани во wicd.service-от.

systemctl restart wicd.service
sendsms “Wicd successfully (re)started”

Откако ќе биде извршена командата, апликацијата испраќа СМС порака со дадената содржина, како известување за извршената акција. Вакви команди, кои што се служат со можностите на systemd, може да бидат дефинирани на ист начин за сите можни сервиси кои што постојат, без разлика дали станува збор за стартување, рестартирање, исклучување на сервис и слично, во зависност од потребите на корисникот.

Освен овие пет команди, во case структурата имаме дефинирано и help команда (CMD help) која што враќа резултат – порака со сите присутни команди и начин на користење на истите:

sendsms “Available commands: wicd, uptime, temperature, memory, cpuinfo”

како и default случај кој што се активира доколку не е погодена ниту една од претходно опишаните команди и кој што исто така прикажува начин на користење на системот:

sendsms “usage: ‘CMD command’ command IN [wicd, uptime, temperature, memory, cpuinfo]”

Со ова е завршена нашата скрипта која што служи за справување со СМС пораките, односно ново дефинираниот СМС сервис во конфигурациската датотека на kannel. Целосната скрипта може да ја најдете на оваа локација. За тестирање на системот, како што опишавме во претходниот пост, ги стартуваме bearerbox и smsbox, на ист начин, проследувајќи го конфигурацискиот фајл и испраќаме СМС порака преку fake sms центарот:

fakesmsc -m 1 -H localhost -r 20000 “123 456 text CMD cpuinfo”

и како одговор добиваме:

2011-09-10 03:58:54 [30133] [0] INFO: Got message 1: <13013 123 text Model name: Athlon(tm) II Neo K325 Dual-Core Processor>

што значи дека системот функционира.