Menu Close

T2 – skriptovacie jazyky

 

CPL(Call Processing Language):
 
Call Processing jazyk (CPL) je jazyk, ktorý môže byť použitý na popis a organizáciu internetových telefónnych služieb. Jedná sa o jazyk pre tvorbu aplikácii, ktorého základ je postavený na XML špecifikácii. Nie je viazaný na konkrétne architektúry alebo signalizačné protokoly, preto sa predpokladá nasadenie v SIP sieťach, ale aj v sieťach H.323. Použitím CPL sme schopný popísať veľké množstvo služieb a funkcií. Môže byť implementovaný na sieťových serveroch alebo user agent serveroch(UAS). Je navrhnutý tak, aby bol jednoduchý, rozšíriteľný, ľahko editovateľný grafickým klientom a nezávislý na operačnom systéme alebo signálnom protokole. Je bezpečným jazykom pre neskúsených užívateľov, pretože má obmedzené možnosti nakoľko neposkytuje žiadne premenné, cykly, rekurzie alebo schopnosť spúšťať externé programy. Účelom CPL je byť dostatočne výkonný na popísanie veľkého množstva služieb a vlastností a sučasne byť dostatočne výkonovo limitovaný, takže môže bezpečne bežať na Internet Telephony serveroch. Úmysel CPL jazyka je znemožniť užívateľom urobiť niečo komplexné (a nebezpečné) a zároveň mať schopnosť relatívne dobre popisovať Internet Telephony služby. Výhodou tohto jazyka je okrem iného možné určiť validitu a vhodnú formu už na úrovni modelu (je prehľadnejší ako samotne XML-ko) a skutočnosť, že jeho výstupom je štandardizované “XML-ko”. Teda na parsovanie výstupu je možné použiť rôzne voľne dostupné XML parsery. Jazyk je navrhnutý tak, aby boli servery po uploadnutí skriptu schopné ľahko určiť jeho validitu.
 
 
 
Štruktúra CPL skriptu
 
Signalizačný server zvyčajne udržiava databázu miest (locations), kde môže užívateľ dosiahnuť. CPL skript nahrádza túto základnú vyhľadávaciu funkciu databázy, potrebné sú registračné informácie, požiadavky volajúceho a ďalšie informácií napr. požadované služby, a vyberie sa akcia, ktorá sa má vykonať. Za skript teda možno považovať zoznam podmienok / akcií, v prípade niektorých atribútom registrácie, požiadaviek a externých informácií, sa potom vykonávajú zodpovedajúce kroky.
 
Používatelia môžu mať CPL skripty uložené na sieťovom serveri, cez ktorý prebiehajú dané žiadosti a volania a samozrejme musia byť dôveryhodné. Skripty zvyčajne plnia rôzne funkcie, vzťahujúce sa na úlohu servera, na ktorom sú uložené.
 
CPL skripty sú obvykle spojené s konkrétnou internetovou telefónnou adresou.
Keď na server dorazí hovor s konkrétnou žiadosťou (signalizácia CPL servera), a ak je korektný(teda sú korektne uvedené zdrojové a cieľové adresy), tak je vykonaný príslušný CPL skript.
 
Hneď po vykonaní skript, ak sa vybrala proxy akcia, nová internetová telefónna adresa bude mať za cieľ proxy. Hneď ako sa to vykonalo, server znovu kontroluje databázu skriptov, aby zistil, či niektoré z nich sú spojené s novou adresu. Ak áno, tak sa daný skript vykoná.
 
Všeobecne platí, že v internetovej telefónnej sieti sa bude indikovať jedna z dvoch vecí: buď používateľ alebo zariadenie. Používateľova adresa odkazuje na konkrétne osobu, napríklad sip: meno@daco.com, bez ohľadu na to, kde daný používateľ skutočne je, alebo aký typ zariadenia používa. Alebo adresa zariadenia, ktorá sa naopak odvoláva na konkrétne fyzické zariadenia, ako napríklad sip: x27071@telefon.daco.com.
Príklad služby presmerovania hovoru:
<call>
<location url="sip:smith@phone.example.com">
<redirect />
</location>
</call>
 
Príklad denného presmerovania:
<call>
<time-switch>
<!-- During the work week, contact the user at his registered locations -- >
<time day="1-5" timeofday="0900-1700">
<lookup source="registration">
<success>
<proxy/>
</success>
</lookup>
</time>
<!-- The rest of the time, forward the call to voicemail -- >
<otherwise>
<location url="sip:jones@voicemail.example.com">
<proxy/>
</location>
</otherwise>
</time-switch>
</call>
 
 
 
 
1.      Vysoko-úrovňová štruktúra
CPL skript pozostáva z dvoch typov informácií: pomocné informácie o skripte a akcie vykonávanie hovoru.
 
  • Akcie vykonávanie hovoru vytvárajú štrukturovaný strom ktorý popisuje operácie a rozhodnutia, ktoré telefónny signalizačný server vykoná pri obdržani udalosti prichádzajúceho hovoru. Sú tu dva typy akcií spracúvajúcich prichádzajúci hovor: Akcie najvyššej vrstvy a subakcie najvyššej vrstvy.
 
  • Akcie najvyššej vrstvy sú akcie, ktoré sú spúštané signalizačnými udalosťami, ktoré prídu na server. Dve z nich sú definované ako „incoming“ (akcia nastane vtedy keď, príde hovor, ktorého destinácia je vlastník skriptu) a „outgoing“ (akcia nastane vtedy keď, príde hovor, ktorého originátor je aj vlastník skriptu).
 
  • Subakcie najvyššej vrstvy sú akcie, ktoré môžu byť volané z iných akcií. CPL zakazuje aby subakcie boli volané rekurzívne.
 
  • Pomocná informácia je informácia, ktorá je nevyhnutná pre server aby spracoval skript správne, ale ktorá priamo neopisuje žiadnu operáciu alebo rozhodnutie. Momentálne nie je definovaná žiadna pomocná informácia, ale táto sekcia je rezervovaná pre použitie výnimiek.
 
 
 
2.      Abstraktná štruktúra akcie vykonávania hovoru
 
Akcia vykonávania hovoru je abstraktne tvorená skupinou vrcholov, ktoré popisujú operácie (ktoré môžu byť vykonané) alebo rozhodnutia (ktoré môžu byť spravené). Vrchol môže obsahovať niekoľko parametrov, ktoré upresňujú konkrétne správanie vrcholu. Vrcholy zvyčajne mávajú výstup, ktorý závisí na výsledku ich rozhodnutia alebo akcie. Vrcholy a výstupy môžu byť reprezentované ako obdĺžniky a šípky.
 
Vrcholy sú v strome, ktorý začína v ROOT vrchole (koreň). Koreň je východiskovým bodom pre proces volania. Reprezentuje jeden štart a začína len jedným vzťahom. Výstup vrcholu je spojený s ďalšími vrcholmi. Keď akcia beží, akcia alebo rozhodnutie popísané v najvyššom vrchole sa vykoná a na základe výsledku vrcholu server nasleduje výstup vrcholu a pokračuje vo vrchole na ktorý ukazuje výsledok. Proces pokračuje dovtedy, kým nie je dosiahnutý vrchol s neurčeným výsledkom. Pretože graf je acyklický, dosiahne určitý počet navštívených vrcholov. Ak výstup do vrcholu neukazuje na ďalší vrchol, to znamená, že CPL server by mal vykonať vrcholovú alebo protokolovú špecifikačnú akciu. Niektoré vrcholy majú priradené špecifické predvolené správanie (pre iné sa špecifické predvolené správanie prekrýva so signalizačným protokolom, alebo môže byť nakonfigurované administrátorom servera).
 
 
 
3.      Model lokácií
 
Pre flexibilitu je jeden kúsok potrebných informácii pre CPL predávaný ako parameter vrcholu, a je to skupina lokácií, do ktorých má byť hovor smerovaný. Táto sada alokácie je uložená ako globálna premenná počas behu spustenej akcie (a subakcie).
Toto dovoľuje lokáciám aby boli prijaté z vonkajších zdrojov, filtrované, a vopred bez potreby hlavnej podpory jazyka pre takéto operácie (čo môže poškodiť jednoduchosť a ľahké chápanie jazyka). Pre akciu najvyššej vrstvy pre prichádzajúci hovor je sada lokácií nastavená na prázdnu sadu. Pre odchádzajúci hovor je nastavená na adresu kam smeruje hovor.
 
 
 
 
Programové vybavenie CPL skriptov
 
CPL skripty môžu byť umiestené kdekoľvek na dôveryhodných serveroch, cez ktoré prechádzajú požiadavky pre nadviazanie spojenia. Samotný skript môžu patriť SIP/H323 serverom, aplikačným serverom alebo inteligentným agentom.
Pri behu skriptu nad signalizačným serverom sa monitoruje proxy systém, presmerovania, zamietnutie činnosti pre nastavenie príslušných volaní. Prevezmú sa informácie o registrácií, podrobnosti žiadosti volania a rozhodne, či sa signalizovaná akcia vykoná.
 
1.       Prepínače
 
Prepínače reprezentujú možnosť, ktorú môže CPL skript vykonať, založenú tiež na atribútoch originálnej požiadavky hovoru alebo položke závisiacej na hovore. Existuje päť typov prepínačov, každý z nich má špecifické vlastnosti. Prepínačom môže byť adresa, jazyk, priorita, reťazec alebo čas. Všetky prepínače sú reprezentované ako zoznam podmienok, ktoré sa môžu rovnať premennej. Každá podmienka korešponduje s výstupom vrcholu. Výstup vedie k ďalšiemu vrcholu, ktorý by mal byť dosiahnutý ak je podmienka splnená. Podmienky sú testované v poradí v akom sa vyskytujú v skripte. Výstup korešponduje s prvým vrcholom ktorý vyhovuje podmienke.
 
2.       Lokačné meniče
 
Pri abstraktnom CPL modeli lokácií je správanie niektorých signalizačných operácií závislé na aktuálnej skupine lokácií. Vrcholy lokácií pridávajú alebo odoberajú lokácie zo skupiny lokácií. Sú definované tri typy vrcholov lokácií. Explicitné lokácie pridávajú lokácie špecifikované názvom do skupiny lokácií, vyhľadávacie lokácie obsahujú niektoré lokácie z vonkajších zdrojov a filtre lokácií odstraňujú lokácie zo skupiny lokácií podľa vyšpecifikovaných kritérií.
 
3.       Signalizačné operácie
 
Vrcholy signalizačných operácií spôsobujú signalizačné udalosti v podpornom signalizačnom protokole. Sú definované tri signalizačné operácie: „proxy“, „redirect“ a „reject“.
 
4.       Nesignalizačné operácie
 
Ako prídavok k signalizačným operáciám CPL definuje aj pár operácií, ktoré neovplyvňujú a nezávisia na telefónnom signalizačnom protokole.
 
Inštalácia:
 
Celá inštalácia prebiehala na operačnom systéme Ubuntu 9.10. Najprv sme teda nainštalovali príslušné baličky.
 
Pomocou príkazu aptcache search … si zistíme možné verzie balíčkov, ktoré chceme nainštalovať, potom môžeme začať s inštaláciou.
 
 
Inštalácia openser a potrebných modulov:
sudo apt-get install openser
sudo apt-get install openser-cpl-module 
sudo apt-get install openser-mysql-module
 
 
Inštalácia mysql servera a apache server (počas inštalácie bude treba zadať aj prihlasovacie heslo pre root):
sudo apt-get install apache2
sudo apt-get install mysql-server
sudo apt-get install phpmyadmin
 
Pre správny beh CPL je treba doinštalovať tieto balíčky:
sudo apt-get install libxml2
sudo apt-get install libxml2-dev
 
 

Po úspešnej inštalácii môžeme vyskúšať funkčnosť phpmyadminu(Ubuntu-môže sa vyskytnuť chyba pozn. *) na adrese: http://localhost/phpmyadmin.

 
*   zkopírovať konfiguračný súbor apache.conf (premenovať na phpmyadmin.conf) do /etc/apache2/conf.d/

 

 

Môžeme sa prihlásiť ako root s heslom, ktoré sme zadali pri inštalácií.
 
Konfigurácia Openser
(/etc/openser/openser.cfg)
 
Najprv treba odkomentovať potrebné moduly:
# mysql.so must be loaded !
loadmodule "/usr/lib/openser/modules/mysql.so"
loadmodule "/usr/lib/openser/modules/sl.so"   
loadmodule "/usr/lib/openser/modules/tm.so"   
loadmodule "/usr/lib/openser/modules/rr.so"   
loadmodule "/usr/lib/openser/modules/maxfwd.so"
loadmodule "/usr/lib/openser/modules/usrloc.so"
loadmodule "/usr/lib/openser/modules/registrar.so"
loadmodule "/usr/lib/openser/modules/textops.so" 

#cpl modul
loadmodule "/usr/lib/openser/modules/cpl-c.so"
 
 
Pridáme ešte parametre pre dané moduly:
 
#pridane parametre
modparam("cpl-c","db_url","mysql://Užívateľ:Heslo@localhost/NázovDatabázy") 
modparam("cpl-c", "log_dir", "/var/log/openser/cpl")
modparam("cpl-c","cpl_table","cpl")
modparam("cpl-c","cpl_dtd_file","/etc/openser/cpl-06.dtd")
 
Aby CPL modul dokázal spracovávať scripty, musíme ešte do smerovacej logiky pridať niektoré príkazy. Nájdeme nasledujúcu vetvu a doplníme riadok: cpl_process_register();
 if (is_method("REGISTER"))
        {
                # authenticate the REGISTER requests (uncomment to enable auth)
                ##if (!www_authorize("", "subscriber"))
                ##{
                ##      www_challenge("", "0");
                ##      exit;
                ##}
                ## 
                ##if (!check_to())
                ##{
                ##      sl_send_reply("403","Forbidden auth ID");
                ##      exit;
                ##}

                

                #PRIDÁME RIADOK:

                cpl_process_register();
                if (!save("location"))
                        sl_reply_error();
                exit;
        }
 
 
 
 
Hneď za tým pridáme vetvu:
 
# PRIDAME
        if (is_method("INVITE"))
        {
          if(!cpl_run_script("incoming","is_stateless"))
            {
              # script execution failed
              t_reply("500","CPL script execution failed");
           };
        };
 
 
 
Ďalej ešte treba nastaviť openserctlrc:
 
sudo joe /etc/openser/openserctlrc
 
Odkomentujeme nasledujúce riadky:
 
## your SIP domain
SIP_DOMAIN=NázovDomény

## database type: MYSQL, PGSQL, DB_BERKELEY, or DBTEXT, by default none is loaded
# If you want to setup a database with openserdbctl, you must at least specify
# this parameter.
DBENGINE=MYSQL

## database host
DBHOST=localhost

## database name
DBNAME=NázovDatabázy

# database path used by dbtext or db_berkeley
# DB_PATH="/usr/local/etc/openser/dbtext"

## database read/write user
DBRWUSER=NázovUžívateľa

## password for database read/write user
DBRWPW="HesloUžívateľa"
 
 
 
…podľa potreby odkomentujeme aj ďalšie riadky…
 
Cez nasledujúci príkaz vytvoríme databázu pre openser.
 
sudo openserdbctl create
 
Potom môžeme vytvoriť používateľov a to nasledovným spôsobom(tieto hodnoty sa pridajú do tabuľky subscriber):
 
openserctl add 1000 "1000" 1000@daco.com
openserctl add 1001 "1001" 1001@daco.com
 
Do adresára je potrebné nakopírovať súbor cpl.dtd a pomenovať ho ako cpl-06.dtd.
Cez daný príkaz môžeme kontrolovať stav servera: sudo openserctl moni
 
V prípade nejakých problémov pri spustení openser, treba postupovať podľa logu.
V súbore /etc/openser/openser.cfg nastavíme debug=9 a log_stderror=yes.
 
Svoje vlastne CPL skripty môžeme vytvárať cez CPLEd editor, ktorý si môžeme stiahnuť zo stránky: http://sourceforge.net/projects/cpled/
 
Ďalej je potrebné si stiahnuť a vložiť do adresára CPLEd súbor XML schémy (cpl.xsd), pre validáciu skriptov.
 
 
 
 
Po spustení CPLEd editora si nastavíme prihlasovacie údaje:
 
 
 
 
 
Vytvoríme vlastný skript.
 
 
 
 
 
 
 
A cez dané menu ho môžeme uploadnut na server. Daný skript a aj príslušne údaje(používateľ…) sa uloži do nami vytvorenej databázy s tabuľkou CPL.
 
 
 
 
 
 
Na testovanie funkčnosti sme použili program X-Lite.
 
Filtrovanie hovorov
 
<?xml version="1.0" encoding="UTF-8"?>
<cpl xmlns="urn:ietf:params:xml:ns:cpl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="urn:ietf:params:xml:ns:cpl cpl.xsd" >
 <incoming>
    <time-switch>
      <time dtstart="20081224T000000" dtend="20100107T235959">
        <address-switch field="origin" subfield="user">
          <address is="1111">
            <reject status="reject" reason="Neprijate od 1111" />
          </address>
          <otherwise>
                <proxy />
          </otherwise>
        </address-switch>
      </time>
      <otherwise>
        <proxy/>
      </otherwise>
    </time-switch>
 </incoming>
</cpl>
 
 
Presmerovanie hovoru
 
<?xml version="1.0" encoding="UTF-8"?>
<cpl xmlns="urn:ietf:params:xml:ns:cpl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="urn:ietf:params:xml:ns:cpl cpl.xsd" >
 <incoming>
                <log comment=" Call redirect on: 1112@127.0.0.1" name="p">
                               <location url="sip:1112@127.0.0.1">
                                      <redirect />
                     </location>
                </log>
 </incoming>
</cpl>
Príklady:
 
 
Obr.1: Príklad modelu CPL
 
 
 
 
 
 
Obr.2: CPL systém integruje oddelené systémy pre jednotné zasielanie správ, video a multimediálne konferencie.
Call Redirect Unconditional:
 
Tento CPL skript uploadnutý nejakým SIP používateľom na SIP server bezpodmienečne presmeruje hovory generované používateľom so SIP adresou sip: palo@sip.uniza.sk. Do logu je vložená poznámka o presmerovaní.
 
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE cpl SYSTEM "file:/home/cpl-01.dtd">
<cpl>
 <incoming>
   <log comment=" Call redirect on: palo@sip.uniza.sk" name=“test“>
     <location url="sip: palo@sip.uniza.sk">
       <redirect />
     </location>
   </log>
 </incoming>
</cpl>
 
 
 
 
Call screening:
 
Tento CPL skript presmeruje všetky volania od anonymných používateľov.
 
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE cpl SYSTEM "file:/home/cpl-02.dtd">
 <cpl>
    <incoming>
      <address-switch field="origin" subfield="user">
        <address is="anonymous">
          <reject status="reject" reason="I don’t accept anonymous calls" />
        </address>
      </address-switch>
    </incoming>
 </cpl>
 
 
Filtrovanie

Vyfiltrovanie určitého kontaktu, znázorňuje zamietnutie všetkých hovorov spojenia 2000.
 
<?xml version=1.0 ?>
<!DOCTYPE cpl SYSTEM cpl.dtd>
<cpl>
 <incoming>
   <address-switch field=”origin” subfield=”user>
     <address is=2000>
       <reject status=reject reason=I don’t take calls from extension 2000 />
      </address>
    </address-switch>
 </incoming>
</cpl>
Časový prepínač

Prichádzajúce hovory v pracovnom týždni v rozmedzí od 9:00 do 17:00 sú uskutočnené. Hovory, ktoré sú mimo daného rozsahu, sú presmerované k používateľským hlasovým mailom.
 
<?xml version=1.0 ?>
<!DOCTYPE cpl SYSTEM cpl.dtd>
<cpl>
 <time-switch>
    <time dtstart=9 dtend=5 wkst=MO|TU|WE|TH|FR>
      <lookup source=registration>
        <success>
          <proxy />
        </success>
      </lookup>
    </time>
    <otherwise>
      <location url=sip:2000@voicemail.server.com>
        <proxy />
      </location>
    </otherwise>
 </time-switch>
</cpl>
 
 
 
 
Forward on No Answer or Busy
 
<?xml version=1.0 ?>
<!DOCTYPE cpl SYSTEM cpl.dtd>
<cpl>
 <subaction id=voicemail>
 <location url=sip:2000@voicemail.server.com>
    <proxy />
 </location>
 </subaction>

 <incoming>
    <location url=sip:2000@pc.server.com>
      <proxy timeout=8>
        <busy>
          <sub ref=voicemail/>
        </busy>
        <noanswer>
          <sub ref=voicemail/>
        </noanswer>
      </proxy>
    </location>
 </incoming>
</cpl>
 
 
 
 
Prioritné a jazykové smerovanie
 
Príklad ilustruje služby ako prioritu a jazykové nastavenie. Ak má hovor prioritu neodkladné alebo vyššiu, tak sa vykonáva predvolený skript správania. V prípade jazykovej oblasti sa kontroluje jazyk (španielčina, angličtina), tak sa pridelí španielsky hovoriaci operátor, alebo anglicky hovoriaci operátor.
 
<?xml version=1.0 ?> 
<!DOCTYPE cpl SYSTEM cpl.dtd>
<cpl>
 <incoming>
    <priority-switch>
      <priority greater=urgent />
      <otherwise>
        <language-switch>
          <language matches=es>
            <location url=sip:Spanish@operator.server.com>
              < proxy />
            </location>
          </language>
          <location url=sip:English@operator.server.com>
            < proxy />
          </location>
        </language-switch>
      </otherwise>
    </priority-switch>
 </incoming>
</cpl>

 

Rate this post

Leave a Reply

Your email address will not be published. Required fields are marked *

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

The reCAPTCHA verification period has expired. Please reload the page.