Konfigurace Asterisku (11) - Přístup k databázi

Toto pokračování seriálu se věnuje práci s databází Asterisku. Jako příklad si ukážeme konfiguraci ústředny s jedním veřejným telefonním číslem a několika lokálními linkami. Při volání ven si ústředna zapamatuje, ze které linky a na jaké vnější telefonní číslo bylo voláno. Při příchozím volání pak ústředna inteligentně vybere tu linku, která s volajícím naposledy uskutečnila hovor.

Databáze Asterisku

Standardní instalace Asterisku má moduly pro přístup k databázi typu Berkeley DB. Jde o databázi s velmi jednoduchou strukturou. Každý záznam v databázi má jedinečný identifikátor key/family a hodnotu value. key má strukturu cesty, podobně jako v souborovém systému. Obsah databáze může vypadat například takto:

/posledni_hovory/800123456  : 223
/posledni_hovory/222111333  : 224

Databáze obsahuje jen dva záznamy s klíči /posledni_hovory/8001123456 a /posledni_hovory/222111333 a hodnotami 223 a 224. Z položek se dá vyčíst, že na telefonní číslo 800123456 bylo naposled voláno z linky 223 a na 2211333 bylo naposledy voláno linky 224. První část klíče (zde posledni_hovory) má speciální název family. Zbytku klíče se říká často jen key. Terminologie je nejednoznačná, protože key se používá i jako termín pro celý klíč včetně family.

CLI

Při ladění dialplanu se často hodí přístup k databázi z konzole Asterisku. Dostupné konzolové příkazy pro práci s databází lze zobrazit příkazem help database. Pro čtenářovo pohodlí je popis příkazů přeložen do češtiny:

astest*CLI> help database
             database del  Odstraní databázový key/value
         database deltree  Odstraní databázové keytree/values
             database get  Získá databázovou hodnotu
             database put  Přidá/aktualizuje databázovou hodnotu
            database show  Ukáže obsah databáze
         database showkey  Ukáže obsah databáze

Význam jednotlivých příkazů je celkem jasný. Ke každému z nich lze získat nápovědu pomocí příkazu help database, například help database get. Ukážeme si příklad práce s databází:

astest*CLI> database put ahoj pivo/limo ovoce
Updated database successfully
astest*CLI> database put ahoj rum zelenina
Updated database successfully
astest*CLI> database show ahoj
/ahoj/pivo/limo                                   : ovoce
/ahoj/rum                                         : zelenina
astest*CLI> database put ahoj pivo/kava vitaminy
Updated database successfully
astest*CLI> database get ahoj pivo/limo
Value: ovoce
astest*CLI> database deltree ahoj pivo
Database entries removed.
astest*CLI> database show ahoj
/ahoj/rum                                         : zelenina
astest*CLI> database del ahoj rum
Database entry removed.
astest*CLI> database get ahoj pivo/limo
Database entry not found.

Využití databáze v dialplanu

Přístup k databázi z dialplanu je velmi jednoduchý. Celá databáze se ukrývá pod speciální proměnnou $DB(family/key). Vrátíme se k původnímu příkladu s family posledni_hovory a ukážeme si, jak tyto záznamy využít při směrování příchozích hovorů na vnitřní linky. Předpokládejme, že ústředna má jen jedno veřejné telefonní číslo 123456789, které má nastaven kontext incoming.


[incoming]

exten => 123456789,1,Set(CALLER=${CALLERID(num)})
exten => 123456789,n,Set(LAST=${DB(posledni_hovory/${CALLER})})
exten => 123456789,n,GotoIf($["${LAST}" = ""]?vychozi)
exten => 123456789,n,Dial(SIP/${LAST},20)
exten => 123456789,n(vychozi),Dial(SIP/222)

Nejprve do proměnné ${CALLER} nastavíme telefonní číslo volajícího a pak vyzvedneme z databáze hodnotu odpovídajícího záznamu. Hodnota je uložena do proměnné ${LAST}. Není-li záznam nalezen, je do ${LAST} uložena prázdná hodnota. V takovém případě příkaz GotoIf skočí na label vychozi, kde Asterisk přepojí hovor na výchozí linku 222. Je-li záznam nalezen, použije se hodnota ${LAST} jako linka, ze které bylo naposledy voláno. Parametr 20 u příkazu Dial(SIP/${LAST},20) je timeout. Není-li hovor na lince z databáze přijat do 20 sekund, použije se opět výchozí linka 222.

Příchozí hovory bysme měli. Nyní si ukážeme, jak přidávat položky do databáze při odchozích hovorech. Stačí zapsat do pseudoproměnné DB.

[internal]
exten => _XXXXXXXXX,1,Set(DB(posledni_hovory/${EXTEN})=${CALLERID(num)})
exten => _XXXXXXXXX,n,Dial(SIP/${EXTEN}@trunk)

Ukázky dialplanu jsou samozřejmě jen nejjednodušší možné příklady. V praxi je často potřeba k položkám v databázi přidat ještě datum a čas jejich vzniku a databázi pak pravidelně čistit. K tomu se dá použít volba -x příkazu rasterisk, která spustí konzolový příkaz zadaný na příkazovém řádku. Záznamy v databázi lze opatřit datumem například pomocí speciální proměnné ${EPOCH}, která vrací počet vteřin od prvního ledna 1970.

budu dalsie pokracovania?

- praca s DB ako pridavat casove znacky, ako mazat atd....

- praca s externymi scriptami napr. php

 

vdaka za serial!

Dobrý den, redakce Telegra prochází časovou krizí, ale seriál i server určitě bude pokračovat dál. Od nového roku to snad bude lepší. Díky za projevenou přízeň.