Dynamic Asterisk na PostgreSQL (cz.1)

Ostatnio a dokładniej w piątek postawiono mi zadanie stworzenie zupełnie dynamicznego rozwiązania dla platformy Asterisk
(osobiście polecam ostatnią stabilną wersję o numerku 1.4.23.1).
Stworzenie konfiguracji dla składownia CDR’ów w psql nie jest problemem, jednak kiedy chcemy mieć klientów sip, iax “tworzyć” zupełnie dynamicznie bez
potrzeby restartowania serwera lub modułów jest to deko problem.
Łącząc Asteriska z bazą danym mamy aktualnie parę możliwych sterowników baz danych:

  • ODBCM
  • mysql
  • pgsql

Chcąc mieć bazę jak najbardziej jak to nazywam “strict” oraz mieć ją zupełnie za darmo stwierdziłem, że idealny będzie pgsql. Wstępna konfiguracja danych
potrzebnych do połączenia z bazą danych znajdują się w /etc/asterisk/res_pgsql.conf:

    [general]
    dbhost=127.0.0.1
    dbport=5432
    dbname=asterisk
    dbuser=asterisk
    dbpass=asterisk

Poniżej pełny scheme wraz z założeniem odpowiedniej bazy i roli w psql:

    -- ASTERISK psql Scheme by paramah


    CREATE DATABASE  asterisk;
    CREATE USER asterisk WITH PASSWORD 'asterisk';
    GRANT ALL PRIVILEGES ON DATABASE asterisk to asterisk;


    -- Asterisk SIP and IAX accounts

    CREATE TABLE t_conf_sip (
      id serial NOT NULL,
      name character varying(80) DEFAULT '' NOT NULL,
      accountcode character varying(20),
      amaflags character varying(7),
      callgroup character varying(10),
      callerid character varying(80),
      canreinvite character varying(3) DEFAULT 'yes',
      context character varying(80) DEFAULT 'default',
      defaultip character varying(15),
      dtmfmode character varying(7),
      fromuser character varying(80),
      fromdomain character varying(80),
      host character varying(31) DEFAULT '' NOT NULL,
      insecure character varying(4),
      "language" character varying(2),
      mailbox character varying(50),
      md5secret character varying(80),
      nat character varying(5) DEFAULT 'yes' NOT NULL,
      permit character varying(95),
      deny character varying(95),
      mask character varying(95),
      pickupgroup character varying(10),
      port character varying(5) DEFAULT '' NOT NULL,
      qualify character varying(3),
      restrictcid character varying(1),
      rtptimeout character varying(3),
      rtpholdtimeout character varying(3),
      secret character varying(80),
      "type" character varying DEFAULT 'friend' NOT NULL,
      username character varying(80) DEFAULT '' NOT NULL,
      disallow character varying(100) DEFAULT 'all',
      allow character varying(100) DEFAULT 'g729;ilbc;gsm;ulaw;alaw',
      musiconhold character varying(100),
      regseconds bigint DEFAULT 0::bigint NOT NULL,
      ipaddr character varying(15) DEFAULT '' NOT NULL,
      regexten character varying(80) DEFAULT '' NOT NULL,
      cancallforward character varying(3) DEFAULT 'yes'
    );

    ALTER TABLE t_conf_sip OWNER TO asterisk;

    -- Asterisk Extensions

    CREATE TABLE t_conf_extensions (
     id serial NOT NULL,
     context character varying(20) DEFAULT '' NOT NULL,
     exten character varying(20) DEFAULT '' NOT NULL,
     priority smallint DEFAULT 0 NOT NULL,
     app character varying(20) DEFAULT '' NOT NULL,
     appdata character varying(128)
    );

    ALTER TABLE t_conf_extensions OWNER TO asterisk;

    -- Asterisk VoiceMail users

    CREATE TABLE t_voicemail_users (
      id serial NOT NULL,
      customer_id bigint DEFAULT (0)::bigint NOT NULL,
      context character varying(50) DEFAULT '' NOT NULL,
      mailbox bigint DEFAULT (0)::bigint NOT NULL,
      "password" character varying(4) DEFAULT '0' NOT NULL,
      fullname character varying(50) DEFAULT '' NOT NULL,
      email character varying(50) DEFAULT '' NOT NULL,
      pager character varying(50) DEFAULT '' NOT NULL,
      stamp timestamp(6) without time zone NOT NULL
    );

    ALTER TABLE t_voicemail_users OWNER TO asterisk;

    -- Asterisk queue

    CREATE TABLE t_queue (
      name varchar(128),
      musiconhold varchar(128),
      announce varchar(128),
      context varchar(128),
      timeout int8,
      monitor_join bool,
      monitor_format varchar(128),
      queue_youarenext varchar(128),
      queue_thereare varchar(128),
      queue_callswaiting varchar(128),
      queue_holdtime varchar(128),
      queue_minutes varchar(128),
      queue_seconds varchar(128),
      queue_lessthan varchar(128),
      queue_thankyou varchar(128),
      queue_reporthold varchar(128),
      announce_frequency int8,
      announce_round_seconds int8,
      announce_holdtime varchar(128),
      retry int8,
      wrapuptime int8,
      maxlen int8,
      servicelevel int8,
      strategy varchar(128),
      joinempty varchar(128),
      leavewhenempty varchar(128),
      eventmemberstatus bool,
      eventwhencalled bool,
      reportholdtime bool,
      memberdelay int8,
      weight int8,
      timeoutrestart bool,
      PRIMARY KEY (name)
    ) WITHOUT OIDS;

    ALTER TABLE t_queue OWNER TO asterisk;

    -- Asterisk queue member

    CREATE TABLE t_queue_member
    (
      queue_name varchar(128),
      interface varchar(128),
      penalty int8,
      PRIMARY KEY (queue_name, interface)
    ) WITHOUT OIDS;

    ALTER TABLE t_queue_member OWNER TO asterisk;

    -- Asterisk CDR

    CREATE TABLE t_cdr (
      calldate timestamp with time zone DEFAULT now() NOT NULL,
      clid character varying(80) DEFAULT '' NOT NULL,
      src character varying(80) DEFAULT '' NOT NULL,
      dst character varying(80) DEFAULT '' NOT NULL,
      dcontext character varying(80) DEFAULT '' NOT NULL,
      channel character varying(80) DEFAULT '' NOT NULL,
      dstchannel character varying(80) DEFAULT '' NOT NULL,
      lastapp character varying(80) DEFAULT '' NOT NULL,
      lastdata character varying(80) DEFAULT '' NOT NULL,
      duration bigint DEFAULT 0::bigint NOT NULL,
      billsec bigint DEFAULT 0::bigint NOT NULL,
      disposition character varying(45) DEFAULT '' NOT NULL,
      amaflags bigint DEFAULT 0::bigint NOT NULL,
      accountcode character varying(20) DEFAULT '' NOT NULL,
      uniqueid character varying(32) DEFAULT '' NOT NULL,
      userfield character varying(255) DEFAULT '' NOT NULL
    );

    ALTER TABLE t_cdr OWNER TO asterisk;

    GRANT ALL ON TABLE t_cdr TO asterisk;
    GRANT ALL ON TABLE t_conf_extensions TO asterisk;
    GRANT ALL ON TABLE t_conf_sip TO asterisk;
    GRANT ALL ON TABLE t_voicemail_users TO asterisk;
    GRANT ALL ON TABLE t_queue_member TO asterisk;
    GRANT ALL ON TABLE t_queue TO asterisk;

Tutaj wszystko jest jasne, ale jak zrobić aby poszczególne funkcjonalności były przechowywane w bazie i realizowane były w trybie RealTime – nic prostrzego:
W pierwszej kolejności edytujemy sobie pliczek /etc/aterisk/extconfig.conf:

    [settings]

    extensions => pgsql,asterisk,extensions_conf
    ext_test => pgsql,asterisk,t_conf_extensions

    ;Reszta
    sipusers   => pgsql,asterisk,t_conf_sip
    sippeers   => pgsql,asterisk,t_conf_sip
    iaxusers   => pgsql,asterisk,t_conf_sip
    iaxpeers   => pgsql,asterisk,t_conf_sip
    voicemail  => pgsql,asterisk,t_voicemail_users
    queues     => pgsql,asterisk,t_queue
    queue_members => pgsql,asterisk,t_queue_member
    ;meetme => mysql,conferences

Dla pewności proponuję wyzerować /etc/asterisk/sip.conf

Dla testu można dodać użytkownika:

    INSERT INTO t_conf_sip (name, nat, secret, host, context) VALUES ('666', 'yes', 'dupa', 'dynamic', 'default');

Teraz zajmiemy się dialplanem i ogólnie extensions.conf:

    [general]
    static=no
    writeprotect=no
    clearglobalvars=no

    [globals]
    CONSOLE=Console/dsp
    IAXINFO=guest
    TRUNK=Zap/G2
    TRUNKMSD=1


    [default]
    switch => Realtime/default@extensions

    [test]
    switch => Realtime/default@ext_test

    [dynivr]
    exten => test,1,AGI(agi://localhost)

Prosty extension:

    INSERT INTO t_conf_extensions VALUES (2,'default', 700, 1, 'Playback' ,'demo-echotest');

I to wszystko :)
Smacznego, bo Asterisk teraz jest w 100% dynamiczny, oczwiście można jeszcze dodać do tego queue, voicemail etc…
Pisane w sumie na wykładach z zupełnie czegoś innego, jak znajdę znowu chwilkę czasu na następnych wykładach dopieszczę.

Dla ułatwienia i dla leniwych umieszczam SQL: http://tech.cynarski.pl/dasterisk/asterisk.sql