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

Ова е последен текст во серијата еднолето и последен додаток во системот за известување и управување преку СМС пораки. Како последен начин на искористување на СМС каналот за комуникација помеѓу еден систем и негов корисник, или администратор, ќе разгледаме едно решение, како може да надгледуваме активен сервис. Пример, на вашиот систем имате инсталирано 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

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

Инспириран од софтверски решенија, како што е Prey – плен и од неколкуте стории за тоа како некој хакер останал без лаптопот и што сѐ не му се случило подоцна на крадецот, решив да напишам уште еден СМС сервис, кој што ќе вклучи дел од функционалностите на дадените безбедносни софтверски решенија. Во претходниот пост веќе видовме како може да ја добиеме јавната IP адреса на системот (секако системот едноставно може да биде и вашиот лаптоп). Откако ја имаме адресата, многу лесно може да дознаеме кај се наоѓа системот, или барем на кој интернет провајдер е приклучен. На пример, копирајте ја адресата и извршете пребарување во базата на RIPE – еден од петте регионални интернет регистри, одговорен за подрачјето на Европа, за да проверите кој е сопственик на сабнетот во кој што се наоѓа IP адресата на системот. Јавете се во провајдерот и соопштете им дека ви е украден лаптопот и тој моментално се наоѓа на таа и таа адреса и во меѓувреме известете ја и полицијата. Можно е адресата да припаѓа на некое јавно proxy, но и тука постапката е иста. Следно што би било прикладно е, ако може да обезбедиме слика од крадецот!? Или пак, доволно филмски сценарија и да се вратиме на kannel SMS gateway-от.
Но сепак, следно што ќе дефинираме е СМС сервис кој што ќе може да ви испрати слика од веб камера, доколку е присутна, или пак слика од тековната активност на екранот, односно screenshot од екранот. Сервисот немора да се користи само во случај ако ви е украден лаптопот, може едноставно да го користите доколку сакате да видите каква е моменталната ситуација на, и околу истиот. Онака, чисто шпијунски 😀

Дефинирањето на сервисот е скоро идентично со претходниот СМС сервис, со една минимална разлика:

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

Како што може да видиме, сервисот реагира на зборот INFO и повикува скрипта со име smsinfo.sh, проследувајќи ѝ четири параметри, односно, броевите на примачот и испраќачот, како и два збора напишани после клучниот, од кои што првиот треба да биде името на командата, а вториот треба да биде email адреса на која што ќе бидат испратени сликите. За жал, kannel нема подршка за MMS пораки, па затоа мора да се послужиме со алтернативни методи за испорака на мултимедијални содржини. Целосната содржина на smsinfo.sh може да ја погледнете на следнава локација. Како што може да забележите, скриптата е со скоро иста структура како и претходната. Додаден е нов параметар на почеток – email, во кој што се запишува четвртиот параметар проследен на влез, притоа заменувајќи ги карактерите %40 со @, поради тоа што параметарот се добива url кодиран. Следи истата функција за испраќање на смс порака и истата case структура, овојпат со две команди, help и default одговор.

Првата команда е snapshot и како одговор испраќа слика од веб камера на дадена email адреса.

 snapshot)
#taking snapshot from webcam
if [ ${email:-0} = “0” ] #if the email variable is not set (not passed as an argument), set it to 0
then sendsms “No e-mail specified! Please try again [INFO snapshot user@domain.com]”
else
timestamp=`date ‘+%d-%b-%y_%H-%M-%S’`

#now take 4 snapshots from the webcam (the camera need 2-3 frames to initialize)
mplayer tv:// -tv driver=v4l2:width=640:height=480:device=/dev/video0 -frames 4 -vo png
#send e-mail via mutt with the snapshot as attachement
mutt -s “Snapshot from webcam taken on: $timestamp” $email < /etc/issue.net -a $HOME/Documents/development/ednoleto/00000004.png
#remove the remaining snapshots
rm $HOME/Documents/development/ednoleto/0000000*

fi
#Mplayer will save a file 0000000n.jpg with a snapshot, where n is 1,2,3 and 4
#Mplayer uses ffmpeg to do the conversion, so you will usually need the ffmpeg suite installed too.
;;

Доколку не е внесена email адреса, сервисот испраќа СМС порака со известување за настанатата ситуација и со информации како се користи сервисот. Следно, или инаку, доколку е во ред email параметарот, најпрвин во променливата timestamp го запишуваме тековниот датум и час кога е повикана командата, па после повикуваме команда која што треба да направи 4 последователни слики со големина од 640×480 од уредот кој што се наоѓа на /dev/video0, односно default локацијата за пристап на веб камера. Во овој случај, како алатка за снимање на слики го користиме конзолниот видео player – mplayer и снимаме 4 слики поради тоа што на камерата (со која што тестирав) и беа потребни 3 фрејма за да се иницијализира, односно вклучи (првите 3 слики се црни, четвртата излегува нормално, во зависност од осветленоста, спецификациите на камерата и слично). Сликите ги снимаме во png формат и може да ги најдеме под име 0000000?.png во истиот фолдер во кој што се наоѓа скриптата.
Откако ги направивме сликите, останува само уште да ги испратиме. Сликите ги испраќаме преку конзолната алатка за менаџирање со email сандачиња mutt. Секако може да искористите било која друга алатка, како што се sendmail, mailx, nail и слично, во зависност од потреба. email пораката ја испраќаме со наслов “Snapshot from webcam taken on: (вредноста на timestamp)” содржина – името на GNU/Linux дистрибуцијата која што ја користи системот (немора воопшто да има содржина) и со attachment – четвртата направена слика од камерата. Откако ја испративме сликата, ги бришеме сите, за да не ни зафаќаат место, и опционално може да испратиме СМС порака со потврда за извршената акција.

Втората команда, screenshot, на сличен начин испраќа слика од тековниот екран на системот.

 screenshot)
#part for saving current screenshots
if [ ${email:-0} = “0” ] #if the email variable is not set (not passed as an argument), set it to 0
then sendsms “No e-mail specified! Please try again [INFO screenshot user@domain.com]”
else
timestamp=`date ‘+%d%b%y-%N’`;
scrot screenshot$timestamp.png #take a screenshot using this simple CLI program
mutt -s “Screenshot from $timestamp” $email < /etc/issue.net -a screenshot$timestamp.png
sendsms “screenshot sent to e-mail: $email”
rm screenshot$timestamp.png
fi
;;

Разликата, како што може да забележиме, е во начинот на кој што ја добиваме сликата која што ја испраќаме. Овде користиме една многу едноставна конзолна алатка наречена scrot, најчесто достапна во нативните репозиториуми на поголемите дистрибуции, која што се користи многу едноставно. Се повикува алатката со локацијата, односно посакуваното име на сликата што сакаме да ја снимиме и готово. Во овој случај, во самото име на сликата го додаваме моменталниот timestamp, односно моментот кога е направена истата. Сликата ја испраќаме на email преку mutt и после ја бришеме, исто како во претходниот случај, притоа испраќајќи СМС порака за потврда.

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

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

Долго време помина откако го напишав првиот дел од овој туторијал, или како сакате наречете го, си имам оправдувања, можеби и не, но сепак, да не оддолжувам многу, може да продолжиме. Во првиот дел од текстот, видовме едноставни примери за надгледување на некои системски параметри, искористувајќи го опишаниот канал на комуникација.

Како продолжение на претходно опишаната shell скрипта, дадената case структура може да ја збогатиме и со уште три случаи:

intIP)
#get all the internal IP addresses (written in one line as a pair of interface: address)
intIP=`ip -o addr show | egrep –regexp=”(^[2-9]: |^[0-9]{2,}: )[a-zA-Z0-9]*[ ]*inet” | awk ‘{ printf $2 ” ” $4 “; ” }’`
sendsms “$intIP”
;;

extIP)
#get the external IP
extIP=`curl http://whatismyip.org`
sendsms “Your external IP address is: $extIP”
;;

ipv6start)
#start the gogoc IPv6 service on a system with systemd
if [ `ps ax | grep -i gogoc | wc -l` -gt “1” ]
then sendsms “Servisot raboti!”
else systemctl start gogoc.service; sendsms “Sistemot e uspeshno startuvan!”
fi
;;

кои што би се справиле со СМС пораки со содржина “CMD intIP/extIP/ipv6start” и кои што би додале интересна и понекогаш дури и потребна функционалност на системот. Во првиот случај intIP, при повикување, системот во СМС порака ја враќа тековната, или тековните, IP адреси на сите интерфејси присутни во системот кои што имаат дефинирано, парсирајќи го излезот од командата “ip -o addr show” која што е дескриптивна сама по себе. Во вториот случај extIP, при повикување, назад ја добивате надворешната IP адреса, односно адресата под која што е јавно достапен системот на интернет, која што може, но не мора да биде директно доделена на некој од интерфејсите на системот. (Мало појаснување: Доколку системот се наоѓа зад NAT рутер, интерфејсот преку кој што е поврзан на интернет, ќе има IP адреса од приватен опсег и на никој начин нема да биде достапен од “надвор” според таа адреса – затоа ни е потребна јавната). Јавната IP адреса ја наоѓаме искористувајќи еден јавен сервис кој што, како излез при повикување, ја дава јавната интернет адреса од каде што е пристапен. Третата функционалност која што ја додаваме е стартување на ipv6 тунел преку алатка (gogoc сервис кој што овозможува ipv6 тунел преку ipv4 мрежа) и systemd. Овде може да се види дека при повикување на сервисот, најпрвин се проверува дали алатката (во овој случај gogoc) е активна, проверувајќи ја листата на процеси, и доколку не е, тогаш се стартува истата.

Една мала напомена – shell скриптите, како и конфигурацијата на kannel-от опишана во постовите, може да ги погледнете во јавниот репозиториум на мојата github сметка на следната локација.

Секако, претходно опишаниот СМС сервис (целосниот сервис, со сите опишани случаи) може да се користи со било која конзолна алатка и во било која ситуација. Потребно е само да го побарате потребниот параметар, или пак да го повикате саканиот сервис, односно ја дефинирате наредбата во shell скриптата, или пак да повикате било каков код и било каква скрипта при извршување на СМС сервисот. Јас го преферирам овој начин на работа, но изборот е оставен на вас.

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

Во првиот пост посветен на проектот од еднолето, видовме како се инсталира 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&#8221;
}

Ја дефинираме променливата 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>

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

Инсталирање, конфигурирање и тестирање на Kannel SMS Gateway

Годинава земав учество во ЕдноЛето – македонска верзија од Google Summer of Code, организирано од Слободен Софтвер Македонија. Се пријавив и бев примен на проектот насловен како: Систем за известување и управување преку СМС пораки. Како главна алатка што ќе се користи во проектот, ви го претставувам Kannel. Kannel претставува компактен и моќен open source, WAP и SMS gateway развиен за GNU/Linux оперативните системи, широко употребуван насекаде во светот.

За да го инсталирате, најпрвин побарајте го во репозиториумите на вашиот оперативен систем, или пак директно симнете го од нивниот официјален сајт како стабилна верзија, или како дневен snapshot од нивтниот SVN репозиториум. Бидејќи моментално користам Fedora 15, може да ја инсталирам алатката на два начина. Првиот и полесен начин е алатката да ја инсталирам директно од главниот репозиториум на Fedora, со едноставно повикување на командата:

$ sudo yum install kannel.i686

со ова, алатката е инсталирана и готова за користење, со конфигурацискиот фајл поставен на локација /etc/kannel.conf кој што подоцна може да го едитираме за тест примерот. Од друга страна, доколку ја немате во репозиториум, алатката може и да ја искомпајлирате од код, кој што може да го симнете од следната локација: http://kannel.org/download/kannel-snapshot.tar.gz. Значи отворете го омилениот конзолен емулатор, дојдете до посакуваната патека кај што сакате да ја спуштите архивата и пишете:

$ wget http://kannel.org/download/kannel-snapshot.tar.gz
$ tar xvfz kannel-snapshot.tar.gz

за да ја симнете и отпакувате алатката во kannel-snapshot фолдер. Влезете во фолдерот и претпоставувајќи дека ги имате инсталирано развојните алатки и библиотеки, пишете:

$ ./configure
$ make

за да ја искомпајлирате алатката. Доколку во процесот ви се јави грешка, најверојатно немате некоја од потребните алатки и библиотеки и препорачувам да ја прочитате документацијата на Kannel за специфични побарувања – http://kannel.org/overview.shtml#req.

Во Yum пакет менаџерот на Fedora постои опција за групна инсталација на алатки според име на група, така да, за да ги инсталирате најчесто бараните алатки за компајлирање, односно развојни алатки (make, gcc и слично), пишете во конзола:

$ sudo yum groupinstall “Development Tools”

Откако ќе ги инсталирате развојните алатки, потребно е додатно да ја инсталирате и libxml2 библиотеката:

$ sudo yum install libxml2.i686 libxml2-devel.i686

Со ова би требало да ги одбегнете грешките и успешно да може да ја искомпајлирате алатката. Доколку сеуште компајлирањето ви јавува грешка, пишете коментар и испратете ми го текстот со грешката, за подетално да го разгледаме проблемот.

Откако успешно ја имаме инсталирано алатката, на ред е нејзино конфигурирање и тестирање. Default конфигурацијата може да ја најдете во /etc/kannel.conf, но ние ќе се послужиме со подетална конфигурација за SMS gateway. Ако ја инсталиравте алатката од репозиториум, побарајте го тест конфигурацискиот фајл во /usr/doc/kannel-VERSION/examples или /usr/share/doc/kannel-VERSION/examples насловен како smskannel.conf, или пак доколку го компајлиравте рачно, побарајте во ../kannel-snapshot/gw/smskannel.conf. Тука може да ги видиме дефинирано основните потребни групи за тестирање на SMS gateway. Дефиниран е fake sms centar на порта 20000 (или 10000) како симулатор за испраќање на смс пораки, како и корисник (group = sendsms-user) кој што може да испраќа смс пораки, со тест корисничко име и лозинка. Дефиниран е и default смс сервис кој што се справува со добиените смс пораки доколку нема дефинирано друг соодветен смс сервис.

Ние за тестирање ќе напишеме наједноставен смс сервис кој што ќе ни испраќа известување за секоја примена порака. На крај на конфигурацискиот фајл додадете ги следниве три линии:

group = sms-service
keyword = test
exec = notify-send “A message is received – %a”

Првата линија покажува дека тука почнува дефиниција на нов смс сервис, втората линија дефинира според кој филтер ќе биде препознаена пораката, односно keyword претставува првиот збор од пораката, а во третиот ред е дефинирана акција што треба да се изврши, при што %a претставува алиас за целата содржина на пораката url кодирана.

За подетално да се запознаете со синтаксата и начинот на конфигурирање, како и можностите за филтрирање – одбивање на барање од одредени хостови, привилегирани корисници и слично, прочитајте ја документацијата на kannel која што се наоѓа на http://kannel.org/download/kannel-userguide-snapshot/userguide.html. Таму на пример во табела 6-9 се дадени сите параметри, односно алиаси како што се %a – целата содржина на смс поракта и %k – првиот збор од пораката, а во табела 6-8 се дадени сите применливи и ограничувања што може да се додадат во еден смс сервис. Треба да се напомене дека штом ќе се добие една смс порака, со неа се справува само првиот сервис кој што ќе ги исполнува сите параметри (испраќач, клучен збор и слично). Сервисите се проверуваат линеарно почнувајќи од првиот дефиниран.

Откако го дефиниравме сервисот, сега ни преостанува само да го тестираме. Првин треба да стартуваме bearerbox, за да би можеле да стартуваме smsbox. Ако го инсталиравте пакетот рачно, стартувајте ги сервисите (по овој редослед):

$ ./kannel-snapshot/gw/bearerbox -v 1 kannel-snapshot/gw/smskannel.conf
$ ./kannel-snapshot/gw/smsbox -v 1 kannel-snapshot/gw/smskannel.conf

притоа со -v дефинираме ниво на verbosity, кај што 0 прикажува debug информации, а 1 ги прикажува грешките (конфигурацискиот фајл и алатките се повикуваат според патека).

Ако го инсталиравте пакетот од репозиториум, постапката е иста, со што алатките се повикуваат од било која локација, а конфигурацискиот фајл се повикува според патека.

Со smsbox-от стартуван, останува само да испратиме лажна тест порака за нашиот дефиниран сервис, со помош на fakesmsc алатката. И пак, доколку го инсталиравте пакетот рачно, алатката ја повикувате според локација, инаку, од било каде.

$ ./kannel-snapshot/test/fakesmsc -m 1 -H localhost -r 20000 “123 456 text test message”

Во повикот на fakesmsc дефинираме број на пораки што треба да се испратат со -m, дефинираме хост на кој што сакаме да ја пратиме пораката со -H и дефинираме порта на која што работи сервисот со -r, потоа во наводници е пораката што ја испраќаме во облик “испраќач примач text тело на пораката”. Испраќачот и примачот во нашиот случај не се битни, text е филтерот според кој се испраќа текстот на пораката (може, на пример, да биде и url кодирана пораката и наместо text треба да стои udh, исто така објаснето во документацијата) и во телото на пораката го пишуваме првиот збор да се совпаѓа со keyword-от, а останатиот дел од пораката, моментално не ни е важен. Откако ќе ја испратиме пораката, во прозорецот добиваме повратна информација:

[8303] [0] INFO: Got message 1: <13013 123 text <Empty reply from service provider>>

а во прозорецот кај што е стартуван smsbox-от добиваме информација:

[5202] [4] INFO: Starting to service <test message> from <123> to <456>

и во едно се појавува нотификација, односно известување со содржина: “A message is received – test+message” каде што примената порака ја добиваме како url кодирана, со што добиваме потврда за успешно испратена/примена порака.

Толку за инсталација, конфигурирање и почетно тестирање на Kannel SMS gateway-от. Во иднина, повеќе за можностите на сервисот и идеи за сервиси и начини на управување на системи преку обични смс пораки.