\\ ====== Integração Do Asterisk Realtime Com O OpenSER ====== \\ \\ === Válido para as versões do openser 1.1.x e do asterisk 1.2.x === \\ \\ O OpenSER é um simples servidor de sinalização VoIP usando o SIP. É flexível e altamente configurável, mas não pode ser usado para fornecer serviços de media como voicemail, URA ou conferência. Para tais serviços, o Asterisk é o produto open source mais adequado. Neste documento vai ser apresentado um 'HowTo' de como configurar o Asterisk para usar a base de dados de usuários do OpenSER com o objetivo de implementar o serviço de voicemail. Uma configuração básica do arquivo de configuração do OpenSER é postada no final desta página, a fim de que se possa ter um sistema funcional seguindo tão somente os passos desse tutorial.\\ \\ \\ ===== Requerimentos ===== \\ • Sistema Operacional Linux e assemelhados (os exemplos neste documento são específicos para o Debian)\\ • asterisk 1.2.x+ - http://www.asterisk.org\\ • mysql 5.0.x+ - http://www.mysql.com\\ • openser 1.0.x+ - http://www.openser.org\\ • unixodbc 2.2.11+ - http://www.unixodbc.org\\ • unixodbc mysql driver - libmyodbc\\ \\ \\ ===== Instalação do UnixODBC ===== \\ Baixar os arquivos fontes do site http://www.unixodbc.org, compilar e os instalar no seu sistema.\\ \\ ''cd /usr/local/src\\ wget http://www.unixodbc.org/unixODBC-2.2.11.tar.gz\\ tar xvfz unixODBC-2.2.11.tar.gz\\ cd unixODBC-2.2.11\\ ./configure “enable-gui=no\\ make\\ make install''\\ \\ \\ NOTA: Se você se deparar com erro durante a compilação na 'sqp/lex.l', a linha 240, relacionado à 'YY_FLUSH_BUFFER', você pode seguramente comentar/remover essa linha.\\ \\ NOTA: você precisa ter /usr/local/lib no seu arquivo /etc/ld.so.conf ou na variável de ambiente LD_LIBRARY_PATH.\\ \\ \\ ===== Instalação do MySQL ===== \\ Você pode instalar o MySQL usando o sistema de pacotes de sua distribuição Linux. A única exigência é que o MySQL tenha versão 5.0 ou superior. Por exemplo, http://dotdeb.org fornece pacotes estáveis para o Debian.\\ \\ Após a instalação, você pode definir a senha de root MySQL com um comando igual a esse:\\ ''/usr/bin/mysqladmin -u root password 'your-new-password'''\\ \\ **Obs.:** Também pode ser feito com o Postgresql. Se você tem bom conhecimento deste, pode iniciar sua experiência seguindo as dicas [[realtime_postgresql|desse tutorial]] e postando o resultado aqui neste repositório, contribuindo para enriquecer a documentação em Português do Asterisk.\\ \\ \\ ===== Instalação do Asterisk ===== \\ \\ Baixar os arquivos fontes do Asterisk do site http://www.asterisk.org. Neste momento, o Asterisk 1.2.9.1 é a última versão estável.\\ \\ ''cd /usr/local/src\\ wget http://ftp.digium.com/pub/asterisk/releases/asterisk-1.2.9.1.tar.gz\\ tar xvfz asterisk-1.2.9.1.tar.gz\\ cd asterisk-1.2.9.1''\\ \\ \\ Edite o arquivo 'apps/Makefile' e descomente as linhas seguintes:\\ ''CFLAGS+=-DUSE_ODBC_STORAGE\\ CFLAGS+=-DEXTENDED_ODBC_STORAGE''\\ \\ \\ Edite o arquivo 'apps/app_voicemail.c' e altere o tamanho do número 'uniqueid' na 'struct ast_vm_user' para 64:\\ \\ \\ ''/* Structure for linked list of users */\\ struct ast_vm_user {\\ char context[AST_MAX_CONTEXT]; /* Voicemail context */\\ char mailbox[AST_MAX_EXTENSION];/* Mailbox id, unique within vm context */\\ char password[80]; /* Secret pin code, numbers only */\\ char fullname[80]; /* Full name, for directory app */\\ char email[80]; /* E-mail address */\\ char pager[80]; /* E-mail address to pager (no attachme */\\ char serveremail[80]; /* From: Mail address */\\ char mailcmd[160]; /* Configurable mail command */\\ char language[MAX_LANGUAGE]; /* Config: Language setting */\\ char zonetag[80]; /* Time zone */\\ char callback[80];\\ char dialout[80];\\ **char uniqueid[64]; /* Unique integer identifier */**\\ char exit[80];\\ unsigned int flags; /* VM_ flags */\\ int saydurationm;\\ int maxmsg; /* Maximum number of msgs per folder fo */\\ struct ast_vm_user *next;\\ };''\\ \\ \\ Prossiga com a instalação padrão do Asterisk:\\ \\ ''make\\ make install''\\ \\ \\ \\ ===== Instalação do OpenSER ===== \\ \\ Você pode baixar a versão mais recente via CVS snapshots. Para a árvore 1.0.0 (latest release in this branch is 1.0.1) voce pode fazer:\\ \\ ''cd /usr/local/src\\ wget http://www.openser.org/downloads/snapshots/openser-1.0.0/openser-1.0.0-cvs-latest.tgz\\ tar xvfz openser-1.0.0-cvs-latest.tgz\\ cd openser-1.0.0\\ make all include_modules="mysql"\\ make install include_modules="mysql"''\\ \\ \\ \\ ===== Instalação do Driver UnixODBC MySQL ===== \\ \\ Simplesmente instale o pacote usando as ferramentas da sua distribuição Linux. Por exemplo, para o Debian:\\ \\ ''apt-get install libmyodbc'' \\ \\ \\ ===== Criação da Base de Dados do OpenSER ===== \\ \\ Para criar a base de dados necessária para o OpenSER:\\ \\ ''/usr/local/sbin/openser_mysql.sh create''\\ \\ \\ Isso vai criar uma base de dados chamada 'openser' e vai adicionar um usuário 'openser' ao MySQL com acesso completo ao banco. O senha padrão é 'openserrw', altere-a antes (editando usr/local/sbin/openser_mysql.sh) ou imediatamente após você ter criado o base de dados.\\ \\ Uma vez que você tenha criado a base de dados, você precisa adicionar uma nova coluna a sua tabela 'subscriber' para armazenar o PIN de acesso ao voicemail:\\ \\ ''ALTER TABLE subscriber ADD vmail_password varchar(32);''\\ \\ \\ \\ ===== Criação da Base de Dados Asterisk ===== \\ \\ A base de dados necessária para o funcionamento do Asterisk vai conter duas views ('vmusers' e 'sipusers') das tabelas da base de dados do OpenSER, portanto é exigido se tenha o MySQL 5.0+ porque as views foram introduzidas nesta versão. Existe uma tabela real no MySQL ('voicemessages') que vai estocar as mensagens de voz.\\ \\ \\ Entre com o usuário root no servidor MySQL:\\ \\ ''create database asterisk;\\ \\ use asterisk; \\ CREATE TABLE `voicemessages` (\\ `id` int(11) NOT NULL auto_increment,\\ `msgnum` int(11) NOT NULL default '0',\\ `dir` varchar(80) default %%''%%,\\ `context` varchar(80) default %%''%%, `macrocontext` varchar(80) default %%''%%,\\ `callerid` varchar(40) default %%''%%,\\ `origtime` varchar(40) default %%''%%,\\ `duration` varchar(20) default %%''%%,\\ `mailboxuser` varchar(80) default %%''%%,\\ `mailboxcontext` varchar(80) default %%''%%,\\ `recording` longblob,\\ PRIMARY KEY (`id`),\\ KEY `dir` (`dir`)\\ ) ENGINE=MyISAM;''\\ \\ \\ ''CREATE VIEW vmusers AS\\ SELECT phplib_id as uniqueid,\\ username as customer_id,\\ 'default' as context,\\ username as mailbox,\\ vmail_password as password,\\ CONCAT(first_name,%%' '%%,last_name) as fullname,\\ email_address as email,\\ NULL as pager,\\ datetime_created as stamp\\ FROM openser.subscriber;''\\ \\ \\ ''CREATE VIEW sipusers AS\\ SELECT username as name,\\ username,\\ 'friend' as type,\\ NULL as secret,\\ domain as host,\\ CONCAT(rpid, %%' '%%,'<',username,'>') as callerid,\\ 'default' as context,\\ username as mailbox,\\ 'yes' as nat,\\ 'no' as qualify,\\ username as fromuser,\\ NULL as authuser,\\ domain as fromdomain,\\ NULL as insecure,\\ 'no' as canreinvite,\\ NULL as disallow,\\ NULL as allow,\\ NULL as restrictcid,\\ domain as defaultip,\\ domain as ipaddr,\\ '5060' as port,\\ NULL as regseconds\\ FROM openser.subscriber;''\\ \\ \\ Adicione um usuário ao MySQL que vai ter direito de acesso completo ao banco de dados 'asterisk'.\\ \\ ''GRANT ALL ON asterisk.* to asterisk@localhost IDENTIFIED BY 'some_password';''\\ \\ \\ \\ ===== Configurar o UnixODBC ===== \\ No arquivo ‘/usr/local/etc/odbcinst.ini’ você precisa acrescentar:\\ '' [MySQL]\\ Description = MySQL driver\\ Driver = /usr/lib/odbc/libmyodbc.so\\ Setup = /usr/lib/odbc/libodbcmyS.so\\ CPTimeout =\\ CPReuse =\\ UsageCount = 1''\\ \\ \\ No arquivo '/usr/local/etc/odbc.ini' você precisa acrescentar:\\ '' [MySQL-asterisk]\\ Description = MySQL Asterisk database\\ Trace = Off\\ TraceFile = stderr\\ Driver = MySQL\\ SERVER = localhost\\ USER = asterisk\\ PASSWORD = some_password\\ PORT = 3306\\ DATABASE = asterisk''\\ \\ \\ \\ ===== Configurar o Asterisk ===== \\ \\ No arquivo '/etc/asterisk/res_odbc.conf':\\ '' [asterisk]\\ enabled => yes\\ dsn => MySQL-asterisk\\ username => asterisk\\ password => asterisk\\ pre-connect => yes''\\ \\ \\ No arquivo '/etc/asterisk/extconfig.conf': ''sipusers => odbc,asterisk,sipusers\\ sippeers => odbc,asterisk,sipusers\\ voicemail => odbc,asterisk,vmusers''\\ \\ \\ No arquivo '/etc/asterisk/sip.conf':\\ \\ Se você deseja habilitar [[http://www.voip-info.org/wiki/view/MWI|MWI]], não esqueça de definir o atributo checkmwi.\\ \\ ''checkmwi=10'' \\ \\ Existem Guidelines a respeito de configuração do canal SIP que você encontra no http://www.voip-info.org/wiki-Asterisk+config+sip.conf. Você não precisa acrescentar nenhum usuário ou peer SIP no arquivo de configuração, eles vão ser carregados da base de dados.\\ \\ No arquivo ‘/etc/asterisk/voicemail.conf’ você não precisa acrescentar nenhum mailbox. Elas vão ser carregadas a partir da base de dados. A parte de configuração geral da aplicação voicemail é apresentada em http://www.voip-info.org/wiki/index.php?page=Asterisk+config+voicemail.conf\\ \\ Para nosso tutorial, consideramos que os usuários vão ter ID de 4 dígitos. Para implementar um plano de discagem claro no Asterisk que permita extensibilidade e extensões claras para diferentes serviços, as chamadas para o voicemail serão prefixadas com '1' no proxy OpenSER. Esse prefixo vai ser transparente para os usuários. Se a caixa de voz não existir, o Asterisk vai tocar a mensagem "invalid extension".\\ \\ No arquivo '/etc/asterisk/extensions.conf':\\ ''exten => 1,1,Ringing\\ exten => 1,2,VoicemailMain(${CALLERIDNUM})\\ exten => 1,3,Hangup\\ \\ exten => 11,1,Ringing\\ exten => 11,2,VoicemailMain()\\ exten => 11,3,Hangup\\ \\ exten => _1XXXX,1,Ringing\\ exten => _1XXXX,2,MailboxExists(${EXTEN:1})\\ exten => _1XXXX,3,Playback(invalid)\\ exten => _1XXXX,4,Hangup\\ exten => _1XXXX,103,Voicemail(u${EXTEN:1})\\ exten => _1XXXX,104,Hangup''\\ \\ \\ \\ ===== Configurar o OpenSER ===== \\ \\ Plano de Discagem:\\ - usuários locais tem extensões de 4 dígitos\\ - para escutar suas mensagens de voz a partir do seu telefone SIP, o usuário tem que discar *98 (o Asterisk vai anunciar somente pelo PIN)\\ - para escutar suas mensagens de voz a partir de outro telefone SIP, o usuário tem que discar *981 (o Asterisk vai anunciar pelo ID e PIN da caixa de voz)\\ - para chamar diretamente e deixar mensagem de voz para o usuário XXXX, o usuário tem que discar *89XXXX\\ \\ No arquivo '/usr/local/etc/openser/openser.cfg':\\ \\ '' #\\ # $Id$\\ #\\ \\ # ----------- global configuration parameters ------------------------\\ \\ debug=3 # debug level (cmd line: -dddddddddd)\\ fork=yes # daemonize\\ log_stderror=no # (cmd line: -E)\\ \\ check_via=no # (cmd. line: -v)\\ dns=no # (cmd. line: -r)\\ rev_dns=no # (cmd. line: -R)\\ children=4\\ fifo="/tmp/openser_fifo"\\ \\ listen=udp:10.10.10.10:5060\\ \\ #\\ # ------------------ module loading ----------------------------------\\ \\ # Uncomment this if you want to use SQL database\\ mpath="/usr/local/lib/openser/modules"\\ loadmodule "mysql.so"\\ \\ loadmodule "xlog.so"\\ loadmodule "sl.so"\\ loadmodule "tm.so"\\ loadmodule "rr.so"\\ loadmodule "maxfwd.so"\\ loadmodule "usrloc.so"\\ loadmodule "registrar.so"\\ loadmodule "textops.so"\\ loadmodule "avpops.so"\\ loadmodule "auth.so"\\ loadmodule "auth_db.so"\\ loadmodule "group.so"\\ loadmodule "uri.so"\\ \\ # ----------------- setting module-specific parameters ---------------\\ modparam("usrloc|auth_db|avpops|group",\\ "db_url", "mysql:%%//%%openser:openserrw@localhost/openser")\\ \\ # -- usrloc params --\\ # persistent storage\\ modparam("usrloc", "db_mode", 2)\\ \\ # -- auth params --\\ # Uncomment if you are using auth module\\ #\\ modparam("auth_db", "calculate_ha1", yes)\\ #\\ # If you set "calculate_ha1" parameter to yes (which true in this config), \\ # uncomment also the following parameter)\\ #\\ modparam("auth_db", "password_column", "password")\\ \\ # -- rr params --\\ # add value to ;lr param to make some broken UAs happy\\ modparam("rr", "enable_full_lr", 1)\\ \\ \\ modparam("avpops", "avp_table", "usr_preferences")\\ \\ # %%------------------------- request routing logic -------------------%%\\ \\ # main routing logic\\ \\ route{\\ \\ # initial sanity checks -- messages with\\ # max_forwards==0, or excessively long requests\\ if (!mf_process_maxfwd_header("10")) {\\ sl_send_reply("483","Too Many Hops");\\ exit;\\ };\\ \\ if (msg:len >= 2048 ) {\\ sl_send_reply("513", "Message too big");\\ exit;\\ };\\ \\ # we record-route all messages -- to make sure that\\ # subsequent messages will go through our proxy; that's\\ # particularly good if upstream and downstream entities\\ # use different transport protocol\\ if (!method=="REGISTER")\\ record_route();\\ \\ # subsequent messages withing a dialog should take the\\ # path determined by record-routing\\ if (loose_route()) {\\ # mark routing logic in request\\ append_hf("P-hint: rr-enforced\r\n");\\ route(1);\\ };\\ \\ if (!uri==myself) {\\ # mark routing logic in request\\ append_hf("P-hint: outbound\r\n");\\ route(1);\\ };\\ \\ # if the request is for other domain use UsrLoc\\ # (in case, it does not work, use the following command\\ # with proper names and addresses in it)\\ if (uri==myself) {\\ \\ if (method=="REGISTER") {\\ if (!www_authorize("openser.org", "subscriber")) {\\ www_challenge("openser.org", "0");\\ exit;\\ };\\ \\ save("location");\\ exit;\\ };\\ \\ # requests for Media server\\ if(is_method("INVITE") && !has_totag() && uri=~"sip:\*9") {\\ route(3);\\ exit;\\ }\\ \\ # mark transaction if user is in voicemail group\\ if(is_method("INVITE") && !has_totag()\\ && is_user_in("Request-URI","voicemail"))\\ {\\ xdbg("user [$ru] has voicemail redirection enabled\n");\\ # backup R-URI\\ avp_write("$ruri", "i:10");\\ setflag(2);\\ };\\ \\ # native SIP destinations are handled using our USRLOC DB\\ if (!lookup("location")) {\\ if(isflagset(2)) {\\ \\ # route to Asterisk Media Server\\ prefix("1");\\ rewritehostport("10.10.10.11:5060");\\ route(1);\\ } else {\\ sl_send_reply("404", "Not Found");\\ exit;\\ }\\ };\\ append_hf("P-hint: usrloc applied\r\n"); \\ };\\ \\ route(1);\\ }\\ \\ \\ route[1] {\\ \\ if(isflagset(2))\\ t_on_failure("1");\\ \\ if (!t_relay()) {\\ sl_reply_error();\\ };\\ exit;\\ }\\ \\ \\ # voicemail access\\ # - *98 - listen caller's voice messages, being prompted for pin\\ # - *981 - listen voice messages, being promted for mailbox and pin\\ # - *98XXXX - leave voice message to XXXX\\ #\\ \\ route[3] {\\ # direct voicemail\\ if (uri =~ "sip:\*98@" ) {\\ rewriteuser("1");\\ xdbg("voicemail access\n");\\ } else if (uri =~ "sip:\*981@" ) {\\ strip(4);\\ rewriteuser("11");\\ } else if (uri =~ "sip:\*98.+@" ) {\\ strip(3);\\ prefix("1");\\ } else {\\ xlog("unknown media extension $rU\n");\\ sl_send_reply("404", "Unknown media service");\\ exit;\\ }\\ \\ # route to Asterisk Media Server\\ rewritehostport("10.10.10.11:5060");\\ route(1);\\ }\\ \\ failure_route[1] {\\ if (t_was_cancelled()) {\\ xdbg("transaction was cancelled by UAC\n");\\ return;\\ }\\ \\ # restore initial uri\\ avp_pushto("$ruri", "i:10");\\ prefix("1");\\ # route to Asterisk Media Server\\ rewritehostport("10.10.10.11:5060");\\ resetflag(2);\\ route(1);\\ }''\\ \\ \\ \\ //Apesar desse tutorial contemplar um cenário específico, ele pode servir de ponto de partida para implementações de outras variações. Como por exemplo, o OpenSER atuando como Proxy Registrador e [[modulo_dispatcher|balanceador de carga]] para os vários servidores Asterisk (neste caso, o Asterisk implementando as funcionalidades de PABX e Midia Gateway com RTPC). A documentação do módulo dispatcher pode ser lida [[modulo_dispatcher|aqui]].// \\ \\ \\ ===== Veja também: ===== \\ • [[http://openser.org/dokuwiki/doku.php/asterisk:realtime-integration|Tutorial inicial]] sobre esse assunto no site do [[http://www.voip-info.org/wiki/view/OpenSER|OpenSER]]\\ • [[http://www.voip-info.org/wiki/view/OpenSER|OpenSER]] - servidor [[http://www.voip-info.org/wiki/view/SIP|SIP]] com o código fonte aberto com suporte TLS\\ • http://www.openser.org - site do [[http://www.voip-info.org/wiki/view/OpenSER|OpenSER]]\\ • [[http://www.voip-info.org/wiki/view/Asterisk|Asterisk]] - PABX com o código fonte aberto\\ • http://www.asterisk.org - site do [[http://www.voip-info.org/wiki/view/Asterisk|Asterisk]]\\ \\ \\ \\