<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>http://opensips.com.br/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin</id>
	<title>opensipsbrasil - wiki - Contribuições do(a) usuário(a) [pt-br]</title>
	<link rel="self" type="application/atom+xml" href="http://opensips.com.br/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin"/>
	<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Especial:Contribui%C3%A7%C3%B5es/Admin"/>
	<updated>2026-04-30T01:57:03Z</updated>
	<subtitle>Contribuições do(a) usuário(a)</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Opensips_1.9&amp;diff=1531</id>
		<title>Opensips 1.9</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Opensips_1.9&amp;diff=1531"/>
		<updated>2021-04-15T22:57:58Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Precisando de recursos de númeração para fazer seus testes ? Contrate conosco em [http://www.brdvoz.com.br BRDVoz]&lt;br /&gt;
|Ou talvez gostaria de uma consultoria no seu proejto ? Também estamos disponiveis em [https://www.brdsoft.com.br BRDSoft]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este tutorial tem por finalidade, demonstrar o processo de instalação e configuração do OpenSIPS 1.9 utilizando a opção do mesmo para gerar o arquivo de script.&lt;br /&gt;
&lt;br /&gt;
==Informacoes==&lt;br /&gt;
Para este tutorial foi utilizado um Debian 6.0 com kernel 64bits&lt;br /&gt;
A versão utilizada do OpenSIPS foi 1.9.1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencias==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install gcc make libncurses5-dev libnewt-dev libxml2-dev unixodbc \ &lt;br /&gt;
unixodbc-dev libmysqlclient15-dev libxmlrpc-c3-dev libexpat1-dev zlib1g-dev \ &lt;br /&gt;
m4 bison flex libpcre3-dev mysql-server vim apache2-mpm-prefork libapache2-mod-php5 \&lt;br /&gt;
 php5-mysql php5-xmlrpc php-pear  ngrep g++ libjpeg62-dev libssl-dev libcurl4-gnutls-dev&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
 cd /usr/src/&lt;br /&gt;
 wget -c http://opensips.org/pub/opensips/1.9.1/src/opensips-1.9.1_src.tar.gz&lt;br /&gt;
 tar -xzvf opensips-1.9.1_src.tar.gz&lt;br /&gt;
 cd opensips-1.9.1-tls&lt;br /&gt;
 &lt;br /&gt;
==Compilação==&lt;br /&gt;
 make menuconfig&lt;br /&gt;
 &lt;br /&gt;
No menu selecione a opção '''Configure Compile Options''' , depois selecione '''Configure Excluded Modules'''&lt;br /&gt;
&lt;br /&gt;
Selecione os seguintes módulos&lt;br /&gt;
* db_mysql&lt;br /&gt;
* dialplan&lt;br /&gt;
* regex&lt;br /&gt;
* mi_xmlrpc&lt;br /&gt;
* presence&lt;br /&gt;
* presence_dialoginfo&lt;br /&gt;
* presence_mwi&lt;br /&gt;
* presence_xml&lt;br /&gt;
* xcap&lt;br /&gt;
* xcap_client&lt;br /&gt;
&lt;br /&gt;
Após as alterações salve os parametros e selecione no primeiro menu a opção '''Compile &amp;amp; Install OpenSIPS'''&lt;br /&gt;
&lt;br /&gt;
O processo deverá demorar um pouco, ao termino você voltará ao menu, neste selecione a opção '''Generate OpenSIPS Script''' , selecione então '''Residential Script''', e depois '''Configure Residencial Script'''&lt;br /&gt;
&lt;br /&gt;
Neste marque as seguintes opções&lt;br /&gt;
&lt;br /&gt;
* USE_ALIASES&lt;br /&gt;
* USE_AUTH&lt;br /&gt;
* USE_DBACC&lt;br /&gt;
* USE_DBUSRLOC&lt;br /&gt;
* USE_DIALOG&lt;br /&gt;
* USE_MULTIDOMAIN&lt;br /&gt;
* USE_NAT&lt;br /&gt;
* USE_PRESENCE&lt;br /&gt;
* USE_DIALPLAN&lt;br /&gt;
* HAVE_INBOUND_PSTN&lt;br /&gt;
* HAVE_OUTBOUND_PSTN&lt;br /&gt;
* USE_DR_PSTN&lt;br /&gt;
&lt;br /&gt;
Com todas as opções selecionadas selecione para gerar o script, o script será gerado no diretório '''etc''' dentro do diretório dos fontes, no meu caso o nome do arquivo foi '''opensips_residential_2013-8-17_11:37:45.cfg''' , no seu caso a data obviamente estará diferente.&lt;br /&gt;
&lt;br /&gt;
==Configuração==&lt;br /&gt;
&lt;br /&gt;
Precisamos executar alguns procedimentos para darmos continuidade, seguem os comandos abaixo.&lt;br /&gt;
 cd /usr/src/opensips-1.9.1-tls&lt;br /&gt;
 ln -s /usr/etc/opensips /etc/&lt;br /&gt;
 cp packaging/debian/opensips.default /etc/default/opensips&lt;br /&gt;
 cp packaging/debian/opensips.init /etc/init.d/opensips&lt;br /&gt;
 chmod +x /etc/init.d/opensips&lt;br /&gt;
 update-rc.d opensips defaults&lt;br /&gt;
 &lt;br /&gt;
Edite o arquivo /etc/default/opensips , a altere o parametro '''RUN_OPENSIPS''' para yes&lt;br /&gt;
&lt;br /&gt;
 groupadd opensips&lt;br /&gt;
 mkdir /var/run/opensips&lt;br /&gt;
 useradd -d /var/run/opensips/ -s /bin/false -g opensips opensips&lt;br /&gt;
 chown -R opensips.opensips /var/run/opensips&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Agora podemos dar continuidade.&lt;br /&gt;
&lt;br /&gt;
===opensipsctlrc===&lt;br /&gt;
O arquivo /etc/opensips/opensipsctlrc possue alguns parametros que precisamos definir referente a nossa estrutura, você deve analisar o script para verificar oque mais você pode usar, mas em ambito geral abaixo estão as opções que precisamos.&lt;br /&gt;
&lt;br /&gt;
SIP_DOMAIN:&lt;br /&gt;
* este parametro é o dominio que o script usará para gerar os dados no banco de dados, você pode usar o ip do seu servidor ou um nome de dominio se você possuir.&lt;br /&gt;
&lt;br /&gt;
DBENGINE&lt;br /&gt;
DBHOST&lt;br /&gt;
DBNAME&lt;br /&gt;
DBRWUSER&lt;br /&gt;
DBRWPW&lt;br /&gt;
DBROOTUSER&lt;br /&gt;
 * Estas opções são referentes ao banco de dados que utilizaremos, configure de acordo com seu ambiente&lt;br /&gt;
&lt;br /&gt;
ALIASES_TYPE&lt;br /&gt;
 * Esta opcão deve ser definida como DB, assim os alias das contas SIP estarão no banco de dados&lt;br /&gt;
&lt;br /&gt;
MI_CONNECTOR=FIFO&lt;br /&gt;
 * Defina esta opção como /tmp/opensips_fifo&lt;br /&gt;
&lt;br /&gt;
Após configurar, vamos executar o comando abaixo para criar nosso banco de dados.&lt;br /&gt;
 opensipsdbctl create opensips&lt;br /&gt;
&lt;br /&gt;
===Instalando o RTP Proxy===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /usr/src/&lt;br /&gt;
wget -c http://b2bua.org/chrome/site/rtpproxy-1.2.1.tar.gz&lt;br /&gt;
tar -xzvf rtpproxy-1.2.1.tar.gz&lt;br /&gt;
cd rtpproxy-1.2.1&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
groupadd rtpproxy&lt;br /&gt;
useradd -d /var/run/rtpproxy -s /bin/true -g rtpproxy rtpproxy&lt;br /&gt;
mkdir /var/log/rtpproxy&lt;br /&gt;
mkdir /var/run/rtpproxy&lt;br /&gt;
chown -R rtpproxy.rtpproxy /var/log/rtpproxy&lt;br /&gt;
chown -R rtpproxy.rtpproxy /var/run/rtpproxy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Arquivo de inicialização====&lt;br /&gt;
'''/etc/init.d/rtpproxy'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Este script e de autoria de Mike Tesliuk&lt;br /&gt;
# qualquer falha no mesmo por favor informe &lt;br /&gt;
# atraves do email mike (a) tesliuk.com&lt;br /&gt;
#&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          rtpproxy&lt;br /&gt;
# Required-Start:    $syslog $network $local_fs $time&lt;br /&gt;
# Required-Stop:     $syslog $network $local_fs&lt;br /&gt;
# Default-Start:     2 3 4 5&lt;br /&gt;
# Default-Stop:      0 1 6&lt;br /&gt;
# Short-Description: Start the RTPPROXY server&lt;br /&gt;
# Description:       Start the RTPPROXY server&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
&lt;br /&gt;
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin&lt;br /&gt;
USELOG=1&lt;br /&gt;
USER=rtpproxy&lt;br /&gt;
# Altere o ip abaixo para o ip de seu sistema&lt;br /&gt;
IPADDR=&amp;quot;_SEU_IP_AQUI_&amp;quot;&lt;br /&gt;
&lt;br /&gt;
. /lib/lsb/init-functions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
start(){&lt;br /&gt;
        echo &amp;quot;Iniciando RTP PROXY &amp;quot;&lt;br /&gt;
        if [ -z $(pidof rtpproxy) ]; then&lt;br /&gt;
                if [ &amp;quot;${USELOG}&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
                        echo &amp;quot;Iniciando com LOG&amp;quot;&lt;br /&gt;
                        /usr/local/bin/rtpproxy -l $IPADDR -s udp:127.0.0.1:7890 -u $USER -F -f -d DBUG 2&amp;amp;&amp;gt; /var/log/rtpproxy/rtpproxy.log &amp;amp;&lt;br /&gt;
                else&lt;br /&gt;
                        echo &amp;quot;Iniciando sem LOG&amp;quot;&lt;br /&gt;
                        /usr/local/bin/rtpproxy -l $IPADDR -s udp:127.0.0.1:7890 -u $USER  -F -f -d DBUG 2&amp;amp;&amp;gt; /dev/null&lt;br /&gt;
                fi&lt;br /&gt;
&lt;br /&gt;
                if [ -n $(pidof rtpproxy) ]; then&lt;br /&gt;
                        echo &amp;quot;START OK&amp;quot;&lt;br /&gt;
                fi&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Processo ja em execucao&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
stop(){&lt;br /&gt;
&lt;br /&gt;
        if [ -z $(pidof rtpproxy) ]; then&lt;br /&gt;
                echo &amp;quot;Processo nao encontrado&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                kill -9 $(pidof rtpproxy)&lt;br /&gt;
                if [ -n $(pidof rtpproxy) ]; then&lt;br /&gt;
                        echo &amp;quot;STOP OK&amp;quot;&lt;br /&gt;
                else&lt;br /&gt;
                        echo &amp;quot;Falha em realizar stop do servico&amp;quot;&lt;br /&gt;
                fi&lt;br /&gt;
&lt;br /&gt;
        fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
case $1 in&lt;br /&gt;
        start)&lt;br /&gt;
                start&lt;br /&gt;
        ;;&lt;br /&gt;
        stop)&lt;br /&gt;
                stop&lt;br /&gt;
        ;;&lt;br /&gt;
        restart)&lt;br /&gt;
                stop&lt;br /&gt;
                start&lt;br /&gt;
&lt;br /&gt;
        ;;&lt;br /&gt;
        *)&lt;br /&gt;
                echo &amp;quot;Utilize: stop | start | restart&amp;quot;&lt;br /&gt;
        ;;&lt;br /&gt;
esac&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vamos dar permissao e colocar na inicialização&lt;br /&gt;
 chmod +x /etc/init.d/rtpproxy &lt;br /&gt;
 update-rc.d rtpproxy defaults&lt;br /&gt;
 /etc/init.d/rtpproxy start&lt;br /&gt;
&lt;br /&gt;
===Arquivo autogerado===&lt;br /&gt;
&lt;br /&gt;
copie o arquivo que foi gerado para você para /etc/opensips/opensips.cfg&lt;br /&gt;
&lt;br /&gt;
O Arquivo padrão precisa de alguns ajustes, basicamente localize as opções '''CUSTOMIZE ME''' existentes no arquivo.&lt;br /&gt;
&lt;br /&gt;
Um parametro extra que vamos adicionar é a opção db_url para o modulo uri, para isso localize a opção onde está sendo carregado modulo uri.so e então adicione abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
modparam(&amp;quot;uri&amp;quot;, &amp;quot;db_url&amp;quot;,&lt;br /&gt;
        &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;) # CUSTOMIZE ME&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Termine de alterar os parametros onde traz a opção CUTOMIZE ME para os dados referentes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ao terminar as configurações temos que então configurar o nosso plano de discagem para chamadas externas.&lt;br /&gt;
&lt;br /&gt;
Localize a opção dp_translate, comente a mesma, nós não a usaremos aqui, abaixo acrescente&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        # definimos aqui pstn como padrao 0&lt;br /&gt;
        $avp(pstn)=0;&lt;br /&gt;
        xlog(&amp;quot;Verificando $rU para do_routing&amp;quot;);        &lt;br /&gt;
&lt;br /&gt;
        # Ligacao local (achar uma forma para pegar o ddd na base do usuario)&lt;br /&gt;
        # routeid 0 para gateway de ligacoes locais (acrescentar 5511)&lt;br /&gt;
        if ($rU=~&amp;quot;^0[0-9]{8}$&amp;quot;) {&lt;br /&gt;
                $avp(pstn)=1;&lt;br /&gt;
                $avp(routeid)=0;&lt;br /&gt;
&lt;br /&gt;
        # ligacao ddd (0 + ddd + numero) &lt;br /&gt;
        # routeid 1 para gateway para ddd (acrescenta 55)&lt;br /&gt;
        }else if( $rU =~ &amp;quot;^0[0-9]{2}[0-9]{8}$&amp;quot; ){&lt;br /&gt;
                $avp(pstn)=1;&lt;br /&gt;
                $avp(routeid)=1;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        # Ligacao ldn (00 + numero)&lt;br /&gt;
        # routeid 2 para remover o 00 e enviar a chamada diretamente&lt;br /&gt;
        }else if( $rU =~ &amp;quot;^00[0-9]+$&amp;quot; ){&lt;br /&gt;
                $avp(pstn)=1;&lt;br /&gt;
                $avp(routeid)=2;&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # pstn esta definido e vamos rotear&lt;br /&gt;
        if($avp(pstn) == 1){&lt;br /&gt;
                xlog(&amp;quot;Regra pre do_routing&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                # utilizamos o routeid que definimos para achar o gateway&lt;br /&gt;
                # correto para este perfil de chamada&lt;br /&gt;
                if (!do_routing(&amp;quot;$avp(routeid)&amp;quot;)) {&lt;br /&gt;
                        send_reply(&amp;quot;500&amp;quot;,&amp;quot;No PSTN Route found&amp;quot;);&lt;br /&gt;
                        exit;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                route(relay);&lt;br /&gt;
                exit;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Descendo um pouco o arquivo, após a sessão do if(!lookup('location','m'), acrescente a seguinte opção.&lt;br /&gt;
 rtpproxy_offer();&lt;br /&gt;
&lt;br /&gt;
Esta opção deve estar na linha anterior a linha abaixo&lt;br /&gt;
 if (isbflagset(NAT)) setflag(NAT);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Seu arquivo deverá estar semelhante ao arquivo abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# $Id: opensips_residential.m4 9742 2013-02-05 10:24:48Z vladut-paiu $&lt;br /&gt;
#&lt;br /&gt;
# OpenSIPS residential configuration script&lt;br /&gt;
#     by OpenSIPS Solutions &amp;lt;team@opensips-solutions.com&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
# This script was generated via &amp;quot;make menuconfig&amp;quot;, from&lt;br /&gt;
#   the &amp;quot;Residential&amp;quot; scenario.&lt;br /&gt;
# You can enable / disable more features / functionalities by&lt;br /&gt;
#   re-generating the scenario with different options.#&lt;br /&gt;
#&lt;br /&gt;
# Please refer to the Core CookBook at:&lt;br /&gt;
#      http://www.opensips.org/Resources/DocsCookbooks&lt;br /&gt;
# for a explanation of possible statements, functions and parameters.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Global Parameters #########&lt;br /&gt;
&lt;br /&gt;
debug=3&lt;br /&gt;
log_stderror=no&lt;br /&gt;
log_facility=LOG_LOCAL0&lt;br /&gt;
&lt;br /&gt;
fork=yes&lt;br /&gt;
children=4&lt;br /&gt;
&lt;br /&gt;
/* uncomment the following lines to enable debugging */&lt;br /&gt;
debug=6&lt;br /&gt;
fork=no&lt;br /&gt;
log_stderror=yes&lt;br /&gt;
&lt;br /&gt;
/* uncomment the next line to enable the auto temporary blacklisting of &lt;br /&gt;
   not available destinations (default disabled) */&lt;br /&gt;
#disable_dns_blacklist=no&lt;br /&gt;
&lt;br /&gt;
/* uncomment the next line to enable IPv6 lookup after IPv4 dns &lt;br /&gt;
   lookup failures (default disabled) */&lt;br /&gt;
#dns_try_ipv6=yes&lt;br /&gt;
&lt;br /&gt;
/* comment the next line to enable the auto discovery of local aliases&lt;br /&gt;
   based on revers DNS on IPs */&lt;br /&gt;
auto_aliases=no&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
listen=udp:_SEU_IP_AQUI_:5060   # CUSTOMIZE ME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
disable_tcp=yes&lt;br /&gt;
&lt;br /&gt;
disable_tls=yes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Modules Section ########&lt;br /&gt;
&lt;br /&gt;
#set module path&lt;br /&gt;
mpath=&amp;quot;/usr/lib/opensips/modules/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### SIGNALING module&lt;br /&gt;
loadmodule &amp;quot;signaling.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### StateLess module&lt;br /&gt;
loadmodule &amp;quot;sl.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Transaction Module&lt;br /&gt;
loadmodule &amp;quot;tm.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;fr_timer&amp;quot;, 5)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;fr_inv_timer&amp;quot;, 30)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;restart_fr_on_each_reply&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&lt;br /&gt;
&lt;br /&gt;
#### Record Route Module&lt;br /&gt;
loadmodule &amp;quot;rr.so&amp;quot;&lt;br /&gt;
/* do not append from tag to the RR (no need for this script) */&lt;br /&gt;
modparam(&amp;quot;rr&amp;quot;, &amp;quot;append_fromtag&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
#### MAX ForWarD module&lt;br /&gt;
loadmodule &amp;quot;maxfwd.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### SIP MSG OPerationS module&lt;br /&gt;
loadmodule &amp;quot;sipmsgops.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### FIFO Management Interface&lt;br /&gt;
loadmodule &amp;quot;mi_fifo.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;mi_fifo&amp;quot;, &amp;quot;fifo_name&amp;quot;, &amp;quot;/tmp/opensips_fifo&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;mi_fifo&amp;quot;, &amp;quot;fifo_mode&amp;quot;, 0666)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#### URI module&lt;br /&gt;
loadmodule &amp;quot;uri.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;uri&amp;quot;, &amp;quot;use_uri_table&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;uri&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:_SUA_SENHA_AQUI_@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#### MYSQL module&lt;br /&gt;
loadmodule &amp;quot;db_mysql.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#### USeR LOCation module&lt;br /&gt;
loadmodule &amp;quot;usrloc.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;nat_bflag&amp;quot;, &amp;quot;NAT&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;db_mode&amp;quot;,   2)&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;db_url&amp;quot;,&lt;br /&gt;
	&amp;quot;mysql://opensips:_SUA_SENHA_AQUI_@localhost/opensips&amp;quot;) # CUSTOMIZE ME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#### REGISTRAR module&lt;br /&gt;
loadmodule &amp;quot;registrar.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;registrar&amp;quot;, &amp;quot;tcp_persistent_flag&amp;quot;, &amp;quot;TCP_PERSISTENT&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;registrar&amp;quot;, &amp;quot;received_avp&amp;quot;, &amp;quot;$avp(received_nh)&amp;quot;)&lt;br /&gt;
/* uncomment the next line not to allow more than 10 contacts per AOR */&lt;br /&gt;
#modparam(&amp;quot;registrar&amp;quot;, &amp;quot;max_contacts&amp;quot;, 10)&lt;br /&gt;
&lt;br /&gt;
#### ACCounting module&lt;br /&gt;
loadmodule &amp;quot;acc.so&amp;quot;&lt;br /&gt;
/* what special events should be accounted ? */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;early_media&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;report_cancels&amp;quot;, 0)&lt;br /&gt;
/* by default we do not adjust the direct of the sequential requests.&lt;br /&gt;
   if you enable this parameter, be sure the enable &amp;quot;append_fromtag&amp;quot;&lt;br /&gt;
   in &amp;quot;rr&amp;quot; module */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;detect_direction&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;failed_transaction_flag&amp;quot;, &amp;quot;ACC_FAILED&amp;quot;)&lt;br /&gt;
/* account triggers (flags) */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_flag&amp;quot;, &amp;quot;ACC_DO&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_missed_flag&amp;quot;, &amp;quot;ACC_MISSED&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_url&amp;quot;,&lt;br /&gt;
	&amp;quot;mysql://opensips:_SUA_SENHA_AQUI_@localhost/opensips&amp;quot;) # CUSTOMIZE ME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#### AUTHentication modules&lt;br /&gt;
loadmodule &amp;quot;auth.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;auth_db.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;calculate_ha1&amp;quot;, yes)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;password_column&amp;quot;, &amp;quot;password&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;db_url&amp;quot;,&lt;br /&gt;
	&amp;quot;mysql://opensips:_SUA_SENHA_AQUI_@localhost/opensips&amp;quot;) # CUSTOMIZE ME&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;load_credentials&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#### ALIAS module&lt;br /&gt;
loadmodule &amp;quot;alias_db.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;alias_db&amp;quot;, &amp;quot;db_url&amp;quot;,&lt;br /&gt;
	&amp;quot;mysql://opensips:_SUA_SENHA_AQUI_@localhost/opensips&amp;quot;) # CUSTOMIZE ME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#### DOMAIN module&lt;br /&gt;
loadmodule &amp;quot;domain.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;domain&amp;quot;, &amp;quot;db_url&amp;quot;,&lt;br /&gt;
	&amp;quot;mysql://opensips:_SUA_SENHA_AQUI_@localhost/opensips&amp;quot;) # CUSTOMIZE ME&lt;br /&gt;
modparam(&amp;quot;domain&amp;quot;, &amp;quot;db_mode&amp;quot;, 1)   # Use caching&lt;br /&gt;
modparam(&amp;quot;auth_db|usrloc|uri&amp;quot;, &amp;quot;use_domain&amp;quot;, 1)&lt;br /&gt;
&lt;br /&gt;
### XCAP&lt;br /&gt;
loadmodule &amp;quot;xcap.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;xcap&amp;quot;, &amp;quot;db_url&amp;quot;,&lt;br /&gt;
	&amp;quot;mysql://opensips:_SUA_SENHA_AQUI_@localhost/opensips&amp;quot;) # CUSTOMIZE ME&lt;br /&gt;
modparam(&amp;quot;xcap&amp;quot;, &amp;quot;integrated_xcap_server&amp;quot;, 1)&lt;br /&gt;
&lt;br /&gt;
#### PRESENCE modules&lt;br /&gt;
loadmodule &amp;quot;presence.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;presence_xml.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;presence&amp;quot;, &amp;quot;db_url&amp;quot;,&lt;br /&gt;
	&amp;quot;mysql://opensips:_SUA_SENHA_AQUI_@localhost/opensips&amp;quot;) # CUSTOMIZE ME&lt;br /&gt;
modparam(&amp;quot;presence_xml&amp;quot;, &amp;quot;force_active&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;presence&amp;quot;, &amp;quot;server_address&amp;quot;, &amp;quot;sip:127.0.0.1:5060&amp;quot;) # CUSTOMIZE ME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#### DIALOG module&lt;br /&gt;
loadmodule &amp;quot;dialog.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;dlg_match_mode&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;default_timeout&amp;quot;, 21600)  # 6 hours timeout&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;db_mode&amp;quot;, 2)&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;db_url&amp;quot;,&lt;br /&gt;
	&amp;quot;mysql://opensips:_SUA_SENHA_AQUI_@localhost/opensips&amp;quot;) # CUSTOMIZE ME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####  NAT modules&lt;br /&gt;
loadmodule &amp;quot;nathelper.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;natping_interval&amp;quot;, 10)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;ping_nated_only&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;received_avp&amp;quot;, &amp;quot;$avp(received_nh)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;rtpproxy.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;rtpproxy&amp;quot;, &amp;quot;rtpproxy_sock&amp;quot;, &amp;quot;udp:localhost:7890&amp;quot;) # CUSTOMIZE ME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####  DIALPLAN module&lt;br /&gt;
loadmodule &amp;quot;dialplan.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;dialplan&amp;quot;, &amp;quot;db_url&amp;quot;,&lt;br /&gt;
	&amp;quot;mysql://opensips:_SUA_SENHA_AQUI_@localhost/opensips&amp;quot;) # CUSTOMIZE ME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####  DYNAMMIC ROUTING module&lt;br /&gt;
loadmodule &amp;quot;drouting.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;drouting&amp;quot;, &amp;quot;db_url&amp;quot;,&lt;br /&gt;
	&amp;quot;mysql://opensips:_SUA_SENHA_AQUI_@localhost/opensips&amp;quot;) # CUSTOMIZE ME&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Routing Logic ########&lt;br /&gt;
&lt;br /&gt;
# main request routing logic&lt;br /&gt;
&lt;br /&gt;
route{&lt;br /&gt;
	force_rport();&lt;br /&gt;
	&lt;br /&gt;
	if (nat_uac_test(&amp;quot;8&amp;quot;)) {&lt;br /&gt;
		if (is_method(&amp;quot;REGISTER&amp;quot;)) {&lt;br /&gt;
			fix_nated_register();&lt;br /&gt;
			setbflag(NAT);&lt;br /&gt;
		} else {&lt;br /&gt;
			fix_nated_contact();&lt;br /&gt;
			setflag(NAT);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 	&lt;br /&gt;
&lt;br /&gt;
	if (!mf_process_maxfwd_header(&amp;quot;10&amp;quot;)) {&lt;br /&gt;
		sl_send_reply(&amp;quot;483&amp;quot;,&amp;quot;Too Many Hops&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (has_totag()) {&lt;br /&gt;
		# sequential request withing a dialog should&lt;br /&gt;
		# take the path determined by record-routing&lt;br /&gt;
		if (loose_route()) {&lt;br /&gt;
			&lt;br /&gt;
			# validate the sequential request against dialog&lt;br /&gt;
			if ( $DLG_status!=NULL &amp;amp;&amp;amp; !validate_dialog() ) {&lt;br /&gt;
				xlog(&amp;quot;In-Dialog $rm from $si (callid=$ci) is not valid according to dialog\n&amp;quot;);&lt;br /&gt;
				## exit;&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			if (is_method(&amp;quot;BYE&amp;quot;)) {&lt;br /&gt;
				setflag(ACC_DO); # do accounting ...&lt;br /&gt;
				setflag(ACC_FAILED); # ... even if the transaction fails&lt;br /&gt;
			} else if (is_method(&amp;quot;INVITE&amp;quot;)) {&lt;br /&gt;
				# even if in most of the cases is useless, do RR for&lt;br /&gt;
				# re-INVITEs alos, as some buggy clients do change route set&lt;br /&gt;
				# during the dialog.&lt;br /&gt;
				record_route();&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if (check_route_param(&amp;quot;nat=yes&amp;quot;)) &lt;br /&gt;
				setflag(NAT);&lt;br /&gt;
&lt;br /&gt;
			# route it out to whatever destination was set by loose_route()&lt;br /&gt;
			# in $du (destination URI).&lt;br /&gt;
			route(relay);&lt;br /&gt;
		} else {&lt;br /&gt;
			if (is_method(&amp;quot;SUBSCRIBE&amp;quot;) &amp;amp;&amp;amp; $rd == &amp;quot;_SEU_IP_AQUI_:5060&amp;quot;) { # CUSTOMIZE ME&lt;br /&gt;
				# in-dialog subscribe requests&lt;br /&gt;
				route(handle_presence);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
			if ( is_method(&amp;quot;ACK&amp;quot;) ) {&lt;br /&gt;
				if ( t_check_trans() ) {&lt;br /&gt;
					# non loose-route, but stateful ACK; must be an ACK after &lt;br /&gt;
					# a 487 or e.g. 404 from upstream server&lt;br /&gt;
					t_relay();&lt;br /&gt;
					exit;&lt;br /&gt;
				} else {&lt;br /&gt;
					# ACK without matching transaction -&amp;gt;&lt;br /&gt;
					# ignore and discard&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			sl_send_reply(&amp;quot;404&amp;quot;,&amp;quot;Not here&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# CANCEL processing&lt;br /&gt;
	if (is_method(&amp;quot;CANCEL&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		if (t_check_trans())&lt;br /&gt;
			t_relay();&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	t_check_trans();&lt;br /&gt;
&lt;br /&gt;
	if ( !(is_method(&amp;quot;REGISTER&amp;quot;)  || is_from_gw() ) ) {&lt;br /&gt;
		&lt;br /&gt;
		if (is_from_local())&lt;br /&gt;
		{&lt;br /&gt;
			&lt;br /&gt;
			# authenticate if from local subscriber&lt;br /&gt;
			# authenticate all initial non-REGISTER request that pretend to be&lt;br /&gt;
			# generated by local subscriber (domain from FROM URI is local)&lt;br /&gt;
			if (!proxy_authorize(&amp;quot;&amp;quot;, &amp;quot;subscriber&amp;quot;)) {&lt;br /&gt;
				proxy_challenge(&amp;quot;&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
			if (!db_check_from()) {&lt;br /&gt;
				sl_send_reply(&amp;quot;403&amp;quot;,&amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
		&lt;br /&gt;
			consume_credentials();&lt;br /&gt;
			# caller authenticated&lt;br /&gt;
			&lt;br /&gt;
		} else {&lt;br /&gt;
			# if caller is not local, then called number must be local&lt;br /&gt;
			&lt;br /&gt;
			if (!is_uri_host_local()) {&lt;br /&gt;
				send_reply(&amp;quot;403&amp;quot;,&amp;quot;Rely forbidden&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# preloaded route checking&lt;br /&gt;
	if (loose_route()) {&lt;br /&gt;
		xlog(&amp;quot;L_ERR&amp;quot;,&lt;br /&gt;
		&amp;quot;Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]&amp;quot;);&lt;br /&gt;
		if (!is_method(&amp;quot;ACK&amp;quot;))&lt;br /&gt;
			sl_send_reply(&amp;quot;403&amp;quot;,&amp;quot;Preload Route denied&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# record routing&lt;br /&gt;
	if (!is_method(&amp;quot;REGISTER|MESSAGE&amp;quot;))&lt;br /&gt;
		record_route();&lt;br /&gt;
&lt;br /&gt;
	# account only INVITEs&lt;br /&gt;
	if (is_method(&amp;quot;INVITE&amp;quot;)) {&lt;br /&gt;
		&lt;br /&gt;
		if(has_totag()){&lt;br /&gt;
			engage_rtp_proxy();&lt;br /&gt;
		}&lt;br /&gt;
		# create dialog with timeout&lt;br /&gt;
		if ( !create_dialog(&amp;quot;B&amp;quot;) ) {&lt;br /&gt;
			send_reply(&amp;quot;500&amp;quot;,&amp;quot;Internal Server Error&amp;quot;);&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		setflag(ACC_DO); # do accounting&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	if (!is_uri_host_local()) {&lt;br /&gt;
		append_hf(&amp;quot;P-hint: outbound\r\n&amp;quot;); &lt;br /&gt;
		&lt;br /&gt;
		route(relay);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# requests for my domain&lt;br /&gt;
	&lt;br /&gt;
	if( is_method(&amp;quot;PUBLISH|SUBSCRIBE&amp;quot;))&lt;br /&gt;
			route(handle_presence);&lt;br /&gt;
&lt;br /&gt;
	if (is_method(&amp;quot;REGISTER&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		&lt;br /&gt;
		# authenticate the REGISTER requests&lt;br /&gt;
		if (!www_authorize(&amp;quot;&amp;quot;, &amp;quot;subscriber&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
			www_challenge(&amp;quot;&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		if (!db_check_to()) &lt;br /&gt;
		{&lt;br /&gt;
			sl_send_reply(&amp;quot;403&amp;quot;,&amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (   0 ) setflag(TCP_PERSISTENT);&lt;br /&gt;
&lt;br /&gt;
		if (!save(&amp;quot;location&amp;quot;))&lt;br /&gt;
			sl_reply_error();&lt;br /&gt;
&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if ($rU==NULL) {&lt;br /&gt;
		# request with no Username in RURI&lt;br /&gt;
		sl_send_reply(&amp;quot;484&amp;quot;,&amp;quot;Address Incomplete&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	# apply DB based aliases&lt;br /&gt;
	alias_db_lookup(&amp;quot;dbaliases&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	# apply transformations from dialplan table&lt;br /&gt;
	#xlog(&amp;quot;Verificando se temos rota para este destino $ru/$ru&amp;quot;);&lt;br /&gt;
	#dp_translate(&amp;quot;0&amp;quot;,&amp;quot;$rU/$rU&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	# definimos aqui pstn como padrao 0&lt;br /&gt;
	$avp(pstn)=0;&lt;br /&gt;
	xlog(&amp;quot;Verificando $rU para do_routing&amp;quot;);	&lt;br /&gt;
	&lt;br /&gt;
	# Ligacao local (achar uma forma para pegar o ddd na base do usuario)&lt;br /&gt;
	# routeid 0 para gateway de ligacoes locais (acrescentar 5511)&lt;br /&gt;
	if ($rU=~&amp;quot;^0[0-9]{8}$&amp;quot;) {&lt;br /&gt;
		$avp(pstn)=1;&lt;br /&gt;
		$avp(routeid)=0;&lt;br /&gt;
&lt;br /&gt;
	# ligacao ddd (0 + ddd + numero) &lt;br /&gt;
	# routeid 1 para gateway para ddd (acrescenta 55)&lt;br /&gt;
	}else if( $rU =~ &amp;quot;^0[0-9]{2}[0-9]{8}$&amp;quot; ){&lt;br /&gt;
		$avp(pstn)=1;&lt;br /&gt;
		$avp(routeid)=1;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	# Ligacao ldn (00 + numero)&lt;br /&gt;
	# routeid 2 para remover o 00 e enviar a chamada diretamente&lt;br /&gt;
	}else if( $rU =~ &amp;quot;^00[0-9]+$&amp;quot; ){&lt;br /&gt;
		$avp(pstn)=1;&lt;br /&gt;
		$avp(routeid)=2;&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# pstn esta definido e vamos rotear&lt;br /&gt;
	if($avp(pstn) == 1){&lt;br /&gt;
		xlog(&amp;quot;Regra pre do_routing&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
		# utilizamos o routeid que definimos para achar o gateway&lt;br /&gt;
		# correto para este perfil de chamada&lt;br /&gt;
		if (!do_routing(&amp;quot;$avp(routeid)&amp;quot;)) {&lt;br /&gt;
			send_reply(&amp;quot;500&amp;quot;,&amp;quot;No PSTN Route found&amp;quot;);&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		route(relay);&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
	 &lt;br /&gt;
&lt;br /&gt;
	# do lookup with method filtering&lt;br /&gt;
	if (!lookup(&amp;quot;location&amp;quot;,&amp;quot;m&amp;quot;)) {&lt;br /&gt;
		if (!db_does_uri_exist()) {&lt;br /&gt;
			send_reply(&amp;quot;420&amp;quot;,&amp;quot;Bad Extension&amp;quot;);&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		t_newtran();&lt;br /&gt;
		t_reply(&amp;quot;404&amp;quot;, &amp;quot;Not Found&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	} &lt;br /&gt;
&lt;br /&gt;
	# esta entrada fez a magica do sdp&lt;br /&gt;
	rtpproxy_offer();&lt;br /&gt;
	if (isbflagset(NAT)) setflag(NAT);&lt;br /&gt;
&lt;br /&gt;
	# when routing via usrloc, log the missed calls also&lt;br /&gt;
	setflag(ACC_MISSED);&lt;br /&gt;
	route(relay);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[relay] {&lt;br /&gt;
	# for INVITEs enable some additional helper routes&lt;br /&gt;
	if (is_method(&amp;quot;INVITE&amp;quot;)) {&lt;br /&gt;
		&lt;br /&gt;
		if (isflagset(NAT)) {&lt;br /&gt;
			rtpproxy_offer();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		t_on_branch(&amp;quot;per_branch_ops&amp;quot;);&lt;br /&gt;
		t_on_reply(&amp;quot;handle_nat&amp;quot;);&lt;br /&gt;
		t_on_failure(&amp;quot;missed_call&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (isflagset(NAT)) {&lt;br /&gt;
		add_rr_param(&amp;quot;;nat=yes&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	if (!t_relay()) {&lt;br /&gt;
		send_reply(&amp;quot;500&amp;quot;,&amp;quot;Internal Error&amp;quot;);&lt;br /&gt;
	};&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Presence route&lt;br /&gt;
route[handle_presence]&lt;br /&gt;
{&lt;br /&gt;
	if (!t_newtran())&lt;br /&gt;
	{&lt;br /&gt;
		sl_reply_error();&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;PUBLISH&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		handle_publish();&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	if( is_method(&amp;quot;SUBSCRIBE&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		handle_subscribe();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
branch_route[per_branch_ops] {&lt;br /&gt;
	xlog(&amp;quot;new branch at $ru\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
onreply_route[handle_nat] {&lt;br /&gt;
        #fix_nated_sdp(&amp;quot;3&amp;quot;);&lt;br /&gt;
	rtpproxy_answer();&lt;br /&gt;
&lt;br /&gt;
	if (nat_uac_test(&amp;quot;1&amp;quot;))&lt;br /&gt;
		fix_nated_contact();&lt;br /&gt;
	if ( isflagset(NAT) )&lt;br /&gt;
		rtpproxy_answer(&amp;quot;ro&amp;quot;);&lt;br /&gt;
	xlog(&amp;quot;incoming reply\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
failure_route[missed_call] {&lt;br /&gt;
	if (t_was_cancelled()) {&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# uncomment the following lines if you want to block client &lt;br /&gt;
	# redirect based on 3xx replies.&lt;br /&gt;
	##if (t_check_status(&amp;quot;3[0-9][0-9]&amp;quot;)) {&lt;br /&gt;
	##t_reply(&amp;quot;404&amp;quot;,&amp;quot;Not found&amp;quot;);&lt;br /&gt;
	##	exit;&lt;br /&gt;
	##}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local_route {&lt;br /&gt;
	if (is_method(&amp;quot;BYE&amp;quot;) &amp;amp;&amp;amp; $DLG_dir==&amp;quot;UPSTREAM&amp;quot;) {&lt;br /&gt;
		&lt;br /&gt;
		acc_db_request(&amp;quot;200 Dialog Timeout&amp;quot;, &amp;quot;acc&amp;quot;);&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Agora precisamos criar usuários, alias, e rota de saida.&lt;br /&gt;
&lt;br /&gt;
==Criando um usuario==&lt;br /&gt;
 opensipsctl add NOME_DO_USUARIO SENHA_DO_USUARIO&lt;br /&gt;
 opensipsctl add USUARIO2 SENHA_USUARIO2&lt;br /&gt;
&lt;br /&gt;
==Criando um alias==&lt;br /&gt;
O alias normalmente é utilizado para um número referente a este usuário, seja um número de telefone ou um ramal.&lt;br /&gt;
 opensipsctl alias_db add 05551234@IP_OU_DOMINIO NOME_DO_USUARIO@IP_OU_DOMINIO&lt;br /&gt;
&lt;br /&gt;
Neste caso, se um usuário ou uma chamada de fora vier para 05551234 ela será direcionada para o usuário especificado&lt;br /&gt;
&lt;br /&gt;
==Criando os troncos==&lt;br /&gt;
Agora precisamos criar os troncos de saida, você deve inserir no banco de dados, veja abaixo um exemplo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql&amp;gt; select * from dr_gateways;&lt;br /&gt;
+----+------+------+-------------+-------+------------+-------+------------+-------------+&lt;br /&gt;
| id | gwid | type | address     | strip | pri_prefix | attrs | probe_mode | description |&lt;br /&gt;
+----+------+------+-------------+-------+------------+-------+------------+-------------+&lt;br /&gt;
|  1 | 1    |    2 | IP_DO_TRONCO|     0 | 5511       |       |          2 | LOCAL SP    |&lt;br /&gt;
|  3 | 2    |    2 | IP_DO_TRONCO|     1 | 55         |       |          0 | LDN         |&lt;br /&gt;
|  4 | 3    |    2 | IP_DO_TRONCO|     2 |            |       |          0 | LDI         |&lt;br /&gt;
+----+------+------+-------------+-------+------------+-------+------------+-------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Veja que temos duas opções especificas ali, que é o strip, o strip é para remover um digito do numero recebido, &lt;br /&gt;
a opção pri_prefix é para adicionar um prefixo antes da discagem&lt;br /&gt;
&lt;br /&gt;
Com esta opção agora precisamos criar a regra que vai entrar para um tronco o outro, abaixo&lt;br /&gt;
segue as entradas do banco de dados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mysql&amp;gt; select * from dr_rules;&lt;br /&gt;
+--------+---------+--------+---------+----------+---------+--------+-------+-------------+&lt;br /&gt;
| ruleid | groupid | prefix | timerec | priority | routeid | gwlist | attrs | description |&lt;br /&gt;
+--------+---------+--------+---------+----------+---------+--------+-------+-------------+&lt;br /&gt;
|      4 | 0       |        |         |        0 | 1       | 1      |       | Local       |&lt;br /&gt;
|      5 | 1       |        |         |        0 | 1       | 2      |       | LDN         |&lt;br /&gt;
|      6 | 2       |        |         |        0 | 1       | 3      |       | LDI         |&lt;br /&gt;
+--------+---------+--------+---------+----------+---------+--------+-------+-------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Neste caso o detalhe está gwlist e no groupid, nós no nosso arquivo opensips.cfg nas regras para as ligações externas, definimos que ele buscará pelo grupo 0 para local, pelo grupo 1 para ldn , e pelo grupo 2 para internacional, e cada um destes grupos corresponde a um ip da tabela da anterior.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Com estes dados criados, podemos dar inicio nos testes.&lt;br /&gt;
&lt;br /&gt;
==Iniciando o OpenSIPS==&lt;br /&gt;
&lt;br /&gt;
Precisamos iniciar o OpenSIPS antes de mais nada, então para isso execute o comando abaixo.&lt;br /&gt;
 /etc/init.d/opensips start&lt;br /&gt;
&lt;br /&gt;
Se o sistema levantar, então é só dar sequencia, se não levantar, habilite as opções de debug do arquivo e então execute o comando abaixo para tnetar localizar o erro.&lt;br /&gt;
 /etc/init.d/opensips debug&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fazendo chamadas==&lt;br /&gt;
&lt;br /&gt;
Para fazer as chamadas as instruções são:&lt;br /&gt;
 LOCAL: 0 + 8 DIGITOS&lt;br /&gt;
 LDN  : 0 + DDD + 8 DIGITOS&lt;br /&gt;
 LDI  : 00 + NUMERO&lt;br /&gt;
&lt;br /&gt;
Para chamar um usuário você pode discar o alias que voce atribuiu ou o proprio nome do usuário se for softphone&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Opensips_NAT_Script_com_RTPproxy&amp;diff=1530</id>
		<title>Opensips NAT Script com RTPproxy</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Opensips_NAT_Script_com_RTPproxy&amp;diff=1530"/>
		<updated>2021-04-15T22:57:36Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Precisando de recursos de númeração para fazer seus testes ? Contrate conosco em [http://www.brdvoz.com.br BRDVoz]&lt;br /&gt;
|Ou talvez gostaria de uma consultoria no seu proejto ? Também estamos disponiveis em [https://www.brdsoft.com.br BRDSoft]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Prefacio==&lt;br /&gt;
Nat é uma questão que normalmente da um pouco de trabalho para entender no opensips, é bem diferente daquilo que estamos acostumados no asterisk por exemplo onde basta ativar uma flag e pronto tudo acontece.&lt;br /&gt;
&lt;br /&gt;
Não vou demonstrar aqui como instalar o opensips ou rtpproxy, apenas demonstro um arquivo de configuração todo comentado com uma configuração minima para aceitar registros e encaminhar chamadas de um usuario para outro atrás de nat&lt;br /&gt;
&lt;br /&gt;
O script não precisa de usuario previamente configurado, qualquer autenticacao enviada ele ira aceitar, e a cada restart voce tem que se registrar novamente pois a informacao esta toda na memoria, o proposito é unicamente demonstrar as questoes de nat&lt;br /&gt;
&lt;br /&gt;
==opensips.cfg==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###################################&lt;br /&gt;
# Este script tem por intuito demonstrar a configuracao&lt;br /&gt;
# de um script de roteamento com NAT&lt;br /&gt;
#&lt;br /&gt;
###################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Parametros Globais #########&lt;br /&gt;
&lt;br /&gt;
debug=3&lt;br /&gt;
log_stderror=no&lt;br /&gt;
log_facility=LOG_LOCAL0&lt;br /&gt;
&lt;br /&gt;
fork=yes&lt;br /&gt;
children=4&lt;br /&gt;
&lt;br /&gt;
/* Para fazer debug descomente as linhas abaixo */&lt;br /&gt;
#debug=6&lt;br /&gt;
#fork=no&lt;br /&gt;
#log_stderror=yes&lt;br /&gt;
&lt;br /&gt;
auto_aliases=no&lt;br /&gt;
&lt;br /&gt;
# IP no qual iremos aguardar por requisicoes&lt;br /&gt;
listen=udp:___IP_DO_OPENSIPS_AQUI___:5060  &lt;br /&gt;
&lt;br /&gt;
# Desativacao do suporte a SIP via TCP&lt;br /&gt;
disable_tcp=yes&lt;br /&gt;
&lt;br /&gt;
# Desativacao do suporte a TLS (criptografia) na sinalizacao&lt;br /&gt;
disable_tls=yes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Secao de Modulos ########&lt;br /&gt;
&lt;br /&gt;
# Definicao do diretorio de modulos&lt;br /&gt;
mpath=&amp;quot;/usr//lib64/opensips/modules/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Modulo de sinalizacao &lt;br /&gt;
loadmodule &amp;quot;signaling.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Modulo stateless &lt;br /&gt;
loadmodule &amp;quot;sl.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Modulo para suporte a transacoes &lt;br /&gt;
loadmodule &amp;quot;tm.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;fr_timer&amp;quot;, 5)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;fr_inv_timer&amp;quot;, 30)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;restart_fr_on_each_reply&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&lt;br /&gt;
&lt;br /&gt;
#### Modulo para Record Route &lt;br /&gt;
loadmodule &amp;quot;rr.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;rr&amp;quot;, &amp;quot;append_fromtag&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
#### Modulo para deteccao de loop (Max forward) &lt;br /&gt;
loadmodule &amp;quot;maxfwd.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Modulo para mensagens de operaca&lt;br /&gt;
loadmodule &amp;quot;sipmsgops.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Modulo para ativacao do gerenciamento via FIFO &lt;br /&gt;
loadmodule &amp;quot;mi_fifo.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;mi_fifo&amp;quot;, &amp;quot;fifo_name&amp;quot;, &amp;quot;/tmp/opensips_fifo&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;mi_fifo&amp;quot;, &amp;quot;fifo_mode&amp;quot;, 0666)&lt;br /&gt;
&lt;br /&gt;
#### Modulo URI &lt;br /&gt;
loadmodule &amp;quot;uri.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;uri&amp;quot;, &amp;quot;use_uri_table&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
#### Modulo para localizacao de usuario &lt;br /&gt;
loadmodule &amp;quot;usrloc.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;nat_bflag&amp;quot;, &amp;quot;NAT&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;db_mode&amp;quot;,   0)&lt;br /&gt;
&lt;br /&gt;
#### Modulo para suporte a registros&lt;br /&gt;
loadmodule &amp;quot;registrar.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#### Modulo para auxilio de NAT&lt;br /&gt;
loadmodule &amp;quot;nathelper.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;natping_interval&amp;quot;, 10)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;natping_socket&amp;quot;, &amp;quot;___IP_DO_OPENSIPS_AQUI___:5060&amp;quot;)&lt;br /&gt;
# o parametro abaixo armazena a uri do usuario quando chamada&lt;br /&gt;
# a funcao fix_nated_register&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;received_avp&amp;quot;, &amp;quot;$avp(42)&amp;quot;)&lt;br /&gt;
#modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;sipping_bflag&amp;quot;, &amp;quot;SIP_PING_FLAG&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;sipping_from&amp;quot;, &amp;quot;sip:pinger@___IP_DO_OPENSIPS_AQUI___&amp;quot;)&lt;br /&gt;
# o parametro abaixo define qual o formato do pacote a ser enviado&lt;br /&gt;
# ele pode ser OPTIONS (default) ou INFO&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;sipping_method&amp;quot;, &amp;quot;OPTIONS&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#### Modulo rtpproxy (forcar o audio atraves do opensips)&lt;br /&gt;
loadmodule &amp;quot;rtpproxy.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;rtpproxy&amp;quot;, &amp;quot;rtpproxy_sock&amp;quot;, &amp;quot;udp:localhost:7890&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Logica de roteamento ########&lt;br /&gt;
&lt;br /&gt;
#  Sessao principal&lt;br /&gt;
&lt;br /&gt;
route{&lt;br /&gt;
&lt;br /&gt;
	# Esta e uma configuracao minima recomendada para &lt;br /&gt;
	# previnir loops&lt;br /&gt;
	if (!mf_process_maxfwd_header(&amp;quot;10&amp;quot;)) {&lt;br /&gt;
		sl_send_reply(&amp;quot;483&amp;quot;,&amp;quot;Too Many Hops&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if (has_totag()) {&lt;br /&gt;
		# Requisicao previamente processada&lt;br /&gt;
		if (loose_route()) {&lt;br /&gt;
			xlog(&amp;quot;Estamos em loose_route&amp;quot;);&lt;br /&gt;
			if (is_method(&amp;quot;INVITE&amp;quot;)) {&lt;br /&gt;
				record_route();&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			route(relay);&lt;br /&gt;
		} else {&lt;br /&gt;
			if ( is_method(&amp;quot;ACK&amp;quot;) ) {&lt;br /&gt;
				if ( t_check_trans() ) {&lt;br /&gt;
					t_relay();&lt;br /&gt;
					exit;&lt;br /&gt;
				} else {&lt;br /&gt;
					xlog(&amp;quot;Nao estamos em loose, temos totag, metodo nao ack [ $rm ] &amp;quot;);&lt;br /&gt;
					# Transacao nao encontrada , vamos encerrar o roteamento&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			# Rota nao trata de encerramento e nem a resposta&lt;br /&gt;
			# de requisicao, entao enviamos um 404&lt;br /&gt;
			sl_send_reply(&amp;quot;404&amp;quot;,&amp;quot;Not here&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
		# Processando requisicao de cancelamento &lt;br /&gt;
	if (is_method(&amp;quot;CANCEL&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		if (t_check_trans())&lt;br /&gt;
			t_relay();&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	t_check_trans();&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	if ( !(is_method(&amp;quot;REGISTER&amp;quot;)  ) ) {&lt;br /&gt;
		# Verificando se o from e um usuario valido&lt;br /&gt;
		if (from_uri==myself)&lt;br /&gt;
		{&lt;br /&gt;
		} else {&lt;br /&gt;
			# From nao e usuario valido entao procedemos&lt;br /&gt;
			# para recusa pois o destino nao somos nos&lt;br /&gt;
			if (!uri==myself) {&lt;br /&gt;
				send_reply(&amp;quot;403&amp;quot;,&amp;quot;Rely forbidden&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Checando pacotes com rotas pre-carregadas &lt;br /&gt;
	if (loose_route()) {&lt;br /&gt;
		xlog(&amp;quot;L_ERR&amp;quot;,&lt;br /&gt;
		&amp;quot;Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]&amp;quot;);&lt;br /&gt;
		if (!is_method(&amp;quot;ACK&amp;quot;))&lt;br /&gt;
			sl_send_reply(&amp;quot;403&amp;quot;,&amp;quot;Preload Route denied&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Se metodo nao e register ou message entao gravamos a rota &lt;br /&gt;
	if (!is_method(&amp;quot;REGISTER|MESSAGE&amp;quot;))&lt;br /&gt;
		record_route();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	# Nao somos o destino da requisicao entao acrescentamos &lt;br /&gt;
	# uma informacao para identificar como saida e enviamos para relay	&lt;br /&gt;
	if (!uri==myself) {&lt;br /&gt;
		append_hf(&amp;quot;P-hint: outbound\r\n&amp;quot;); &lt;br /&gt;
		route(relay);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Requisicoes de PUBLISH e SUBSCRIBE&lt;br /&gt;
	# Nao vamos tratar neste documento &lt;br /&gt;
	if (is_method(&amp;quot;PUBLISH|SUBSCRIBE&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		sl_send_reply(&amp;quot;503&amp;quot;, &amp;quot;Service Unavailable&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Tratamento para metodo register&lt;br /&gt;
	if (is_method(&amp;quot;REGISTER&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		# Aqui estamos recebendo um pedido de register&lt;br /&gt;
		# vamos executar fix_nated_register&lt;br /&gt;
		fix_nated_register();&lt;br /&gt;
		fix_nated_contact();&lt;br /&gt;
&lt;br /&gt;
		# Este script e apenas ilustrativo , nao vamos criar usuarios&lt;br /&gt;
		# qualquer requisicao que chegue no mesmo sera aceita como valida&lt;br /&gt;
		# (registro) e a informacao sera salva&lt;br /&gt;
		if (!save(&amp;quot;location&amp;quot;))&lt;br /&gt;
			sl_reply_error();&lt;br /&gt;
&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if ($rU==NULL) {&lt;br /&gt;
		#requisicao com endereco incompleto&lt;br /&gt;
		sl_send_reply(&amp;quot;484&amp;quot;,&amp;quot;Address Incomplete&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Este processamento so vai acontecer quando for uma chamada&lt;br /&gt;
	# com destino a nosso opensips, neste caso ele ira &lt;br /&gt;
	# verificar se o usuario esta registrado, se estiver&lt;br /&gt;
	# ele apenas enviara para relay se nao ele vai responder&lt;br /&gt;
	# com uma mensagem de 404&lt;br /&gt;
	if (!lookup(&amp;quot;location&amp;quot;,&amp;quot;m&amp;quot;)) {&lt;br /&gt;
		t_newtran();&lt;br /&gt;
		t_reply(&amp;quot;404&amp;quot;, &amp;quot;Not Found&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	} &lt;br /&gt;
&lt;br /&gt;
	# Enviando para relay &lt;br /&gt;
	route(relay);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[relay] {&lt;br /&gt;
	# verificamos se trata-se de um invite&lt;br /&gt;
	# para entao podermos definir as funcoes&lt;br /&gt;
	# para resposta dos pacotes&lt;br /&gt;
	if (is_method(&amp;quot;INVITE&amp;quot;)) {&lt;br /&gt;
		# Para cada perna adicionada ele chama&lt;br /&gt;
		# a rota abaixo ( branch_route(per_branch_ops) )&lt;br /&gt;
		t_on_branch(&amp;quot;per_branch_ops&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		# Para cada reply recebido ele executa a rota abaixo&lt;br /&gt;
		# on_reply_route(handle_nat)&lt;br /&gt;
		t_on_reply(&amp;quot;handle_nat&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		# Chamadas que nao completaram sao procesadas&lt;br /&gt;
		# pela failure_route(missed_call)&lt;br /&gt;
		t_on_failure(&amp;quot;missed_call&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		# Vamos tentar identificar se o usuario esta atras de nat&lt;br /&gt;
		# fazemos isso no invite porque assim que recebemos &lt;br /&gt;
		# a requisicao procedemos com a correcao se necessaria&lt;br /&gt;
		if(nat_uac_test(&amp;quot;127&amp;quot;)){&lt;br /&gt;
			# Usuario identificado como atras de nat&lt;br /&gt;
			xlog(&amp;quot;Usuario atras de nat em handle nat&amp;quot;);&lt;br /&gt;
			fix_nated_contact();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		# Vamos verificar se temos cabecalho rtp e entao proceder com o rtpproxy&lt;br /&gt;
		if(has_body(&amp;quot;application/sdp&amp;quot;)){&lt;br /&gt;
			xlog(&amp;quot;Temos sdp no body para $rm&amp;quot;);&lt;br /&gt;
			rtpproxy_offer();&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Loose route quando tudo ok envia cancel e by para ca&lt;br /&gt;
	# entao aqui vamos desligar o rtp proxy&lt;br /&gt;
	if(is_method(&amp;quot;CANCEL|BYE&amp;quot;)){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	# Aqui finalmente fazemos o relay do pacote&lt;br /&gt;
	# se nao conseguirmos fazer o relay entao&lt;br /&gt;
	# retornarmos erro 500 como erro interno&lt;br /&gt;
	if (!t_relay()) {&lt;br /&gt;
		send_reply(&amp;quot;500&amp;quot;,&amp;quot;Internal Error&amp;quot;);&lt;br /&gt;
	};&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
branch_route[per_branch_ops] {&lt;br /&gt;
	# Nova perna adicionada a chamada&lt;br /&gt;
	xlog(&amp;quot;new branch at $ru\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
onreply_route[handle_nat] {&lt;br /&gt;
	# Recebemos resposta do pacote	&lt;br /&gt;
	xlog(&amp;quot;incoming reply\n&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	# Verificamos aqui se esta requisicao possui SDP&lt;br /&gt;
	if(is_method(&amp;quot;ACK&amp;quot;) &amp;amp;&amp;amp; has_body(&amp;quot;application/sdp&amp;quot;)){&lt;br /&gt;
		# Atendemos no rtpproxy&lt;br /&gt;
		rtpproxy_answer();&lt;br /&gt;
&lt;br /&gt;
	}else if(has_body(&amp;quot;application/sdp&amp;quot;)){&lt;br /&gt;
		# possuindo sdp vamos re-escrever a informacao&lt;br /&gt;
		#fix_nated_sdp(&amp;quot;2&amp;quot;);&lt;br /&gt;
		rtpproxy_offer();	&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	# Vamos tentar identificar se o usuario esta atras de nat&lt;br /&gt;
	# executamos neste nivel pois aqui sera executado&lt;br /&gt;
	# no momento que recebemos resposta, assim garantimos&lt;br /&gt;
	# que em todos os casos manipularemos o nat&lt;br /&gt;
	if(nat_uac_test(&amp;quot;127&amp;quot;)){&lt;br /&gt;
		# Usuario identificado como atras de nat&lt;br /&gt;
		xlog(&amp;quot;Usuario atras de nat em handle nat&amp;quot;);&lt;br /&gt;
		fix_nated_contact();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
failure_route[missed_call] {&lt;br /&gt;
	# Chamada nao completada&lt;br /&gt;
	# verificamos se Ã© um cancess e chamamos&lt;br /&gt;
	# a funcao responsavel por isso e entao&lt;br /&gt;
	# encerramos&lt;br /&gt;
	if (t_was_cancelled()) {&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPs_e_Asterisk&amp;diff=1529</id>
		<title>OpenSIPs e Asterisk</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPs_e_Asterisk&amp;diff=1529"/>
		<updated>2021-04-15T22:56:29Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Precisando de recursos de númeração para fazer seus testes ? Contrate conosco em [http://www.brdvoz.com.br BRDVoz]&lt;br /&gt;
|Ou talvez gostaria de uma consultoria no seu proejto ? Também estamos disponiveis em [https://www.brdsoft.com.br BRDSoft]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color: red;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;font color=white&amp;gt; Falta realizar os ajustes / testes para o NAT no mais esta tudo funcionado adequadamente a principio &amp;lt;/font&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este tutorial é baseado em um tutorial similar porém utilizando Kamailio e Freeswtich, se quiser verificar o tutorial original acesse http://kb.asipto.com/freeswitch:kamailio-3.1.x-freeswitch-1.0.6d-sbc.&lt;br /&gt;
&lt;br /&gt;
Para esta implementação utilizamos Debian 7.0 amd64 , OpenSIPS 1.9 e Asterisk 1.8.23 &lt;br /&gt;
&lt;br /&gt;
==Funcionalidades==&lt;br /&gt;
Este tutorial tem por objetivo atingir as seguintes funcionalidades.&lt;br /&gt;
*Autenticação de usuário&lt;br /&gt;
*Registro de usuário&lt;br /&gt;
*Localização de usuário (encaminhamento de chamadas)&lt;br /&gt;
*Roteamento de chamadas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Através do Asterisk estenderemos estas funcionalidades agregando.&lt;br /&gt;
*Correio de voz (Voicemail)&lt;br /&gt;
*Conferencia &lt;br /&gt;
*SBC ( Pode ser utilizado para transcoding, esconder topologia, play de mensagens e tarifação )&lt;br /&gt;
*Outros serviços de media (Anuncios, Ura's e coisas do tipo)&lt;br /&gt;
&lt;br /&gt;
==Definições==&lt;br /&gt;
Para um melhor entendimento da solução vamos expor aqui algumas definições de nosso sistema.&lt;br /&gt;
*Usuários locais terão ramais com 3 digitos (ex: 101, 102, 103)&lt;br /&gt;
*Identidade do correio de voz será o mesmo do ramal&lt;br /&gt;
*Serviços de media (acesso a voicemail e outros) receberão rotas de 4 digitos&lt;br /&gt;
*Opensips e Asterisk utilizarão o mesmo servidor (Neste caso IP: 10.254.254.6)&lt;br /&gt;
*Os serviços rodarão nas portas 5060 (opensips) , 5090 (Asterisk)&lt;br /&gt;
&lt;br /&gt;
==Funcionamento==&lt;br /&gt;
A autenticação do usuário será realizada pelo OpenSIPs, quando uma chamada é autenticada então ela serguirá:&lt;br /&gt;
*Se o usuário de destino não está online a chamada será enviada para o Asterisk para função de correio de voz&lt;br /&gt;
*Se o usuário está online a chamada será encaminhada para o Asterisk, dest forma é possivel acionar funcionalidades como anuncios, definição de tempo de chamada, forçar codecs e outras funcionalidades.&lt;br /&gt;
*Asterisk envia a chamada novamente para o OpenSIPs que verificará no location e entregará a chamada para o usuário.&lt;br /&gt;
*Se a chamada não for atendida o Opensips irá re-encaminhar para o Asterisk direcionando para função de voicemail&lt;br /&gt;
&lt;br /&gt;
==OpenSIPs==&lt;br /&gt;
Vamos iniciar o processo de instalação com o OpenSIPs, siga os procedimentos abaixo para evitar qualquer dificuldade.&lt;br /&gt;
&lt;br /&gt;
===Dependencias===&lt;br /&gt;
Execute o comando abaixo para instalar todas as dependencias necessárias&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install gcc make libncurses5-dev libnewt-dev libxml2-dev unixodbc \ &lt;br /&gt;
unixodbc-dev libmysqlclient15-dev libxmlrpc-c3-dev libexpat1-dev zlib1g-dev \ &lt;br /&gt;
m4 bison flex libpcre3-dev mysql-server vim apache2-mpm-prefork libapache2-mod-php5 \&lt;br /&gt;
 php5-mysql php5-xmlrpc php-pear  ngrep g++ libjpeg62-dev libssl-dev &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Durante a instalação o sistema irá lhe perguntar a senha de root para o servidor MySQL é importante que você se lembre da mesma posteriormente pois utilizaremos a mesma.&lt;br /&gt;
&lt;br /&gt;
===Compilando o OpenSIPs===&lt;br /&gt;
Para manter um padrão onde os dados estao vamos utilizar o diretório /usr/src/ para o download de código fonte.&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src/&lt;br /&gt;
 wget -c http://opensips.org/pub/opensips/1.9.1/src/opensips-1.9.1_src.tar.gz&lt;br /&gt;
 tar -xzvf opensips-1.9.1_src.tar.gz&lt;br /&gt;
 cd opensips-1.9.1-tls/&lt;br /&gt;
 make menuconfig&lt;br /&gt;
&lt;br /&gt;
Neste ponto o sistema irá abrir uma tela com algumas opções para selecionar, Acesse a primeira opção do menu, no submenu acesse a segunda opção ( Configure excluded modules ), selecione os módulos db_mysql , dialplan , mi_xmlrpc , presence e presence_xml&lt;br /&gt;
&lt;br /&gt;
Agora volte ao submenu, e selecione a opção Save Changes, volte para o menu principal e selecione '''Compile and Install OpenSips''' , deixe que o sistema execute suas funções.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ao finalizar a compilação você retornará ao menu, va na opção '''Exit and Save all changes'''&lt;br /&gt;
&lt;br /&gt;
===Preparando a Configuração===&lt;br /&gt;
&lt;br /&gt;
Antes de darmos inicio ao arquivo de configuração, vamos ajustar algumas questões, o opensips instala os arquivos (se voce nao alterar o parametro) em /usr, consequentemente as configurações ficam em /usr/etc , eu por padrão faço um link para o diretório /etc, assim acesso as configurações em /etc/opensips&lt;br /&gt;
&lt;br /&gt;
 ln -s /usr/etc/opensips /etc/&lt;br /&gt;
&lt;br /&gt;
No caso do debian o script de inicialização utiliza um arquivo extra de configuração&lt;br /&gt;
 cp packaging/debian/opensips.default /etc/default/opensips&lt;br /&gt;
&lt;br /&gt;
Para o script de inicialização execute o comando abaixo&lt;br /&gt;
 cp packaging/debian/opensips.init /etc/init.d/opensips&lt;br /&gt;
 chmod +x /etc/init.d/opensips&lt;br /&gt;
 update-rc.d opensips defaults&lt;br /&gt;
&lt;br /&gt;
Edite o arquivo /etc/default/opensips , a altere o parametro '''RUN_OPENSIPS''' para yes&lt;br /&gt;
&lt;br /&gt;
Você pode notar que no arquivo é mensionado o usuário de execução do opensips como opensips, então vamos ter de criar este usuário ( e grupo )&lt;br /&gt;
&lt;br /&gt;
 groupadd opensips&lt;br /&gt;
 mkdir /var/run/opensips&lt;br /&gt;
 useradd -d /var/run/opensips/ -s /bin/false -g opensips opensips&lt;br /&gt;
 chown -R opensips.opensips /var/run/opensips&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Configurando o opensipsctl===&lt;br /&gt;
O opensipsctl (e opensipsdbctl) utilizam o arquivo de configuração /etc/opensips/opensipsctlrc, abaixo segue o conteúdo do arquivo. (Sugiro que você faça um backup dos arquivos originais para ter uma copia, existem parametros que você pode estudar depois).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DBENGINE=MYSQL&lt;br /&gt;
DBHOST=localhost&lt;br /&gt;
DBNAME=opensips&lt;br /&gt;
DBRWUSER=opensips&lt;br /&gt;
DBRWPW=&amp;quot;opensipsrw&amp;quot;&lt;br /&gt;
SIP_DOMAIN=10.254.254.6  ### caso voce esteja usando outro ip altere aqui&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DBROOTUSER=&amp;quot;root&amp;quot;&lt;br /&gt;
INSTALL_EXTRA_TABLES=ask&lt;br /&gt;
ALIASES_TYPE=&amp;quot;DB&amp;quot;&lt;br /&gt;
MI_CONNECTOR=FIFO:/tmp/opensips_fifo&lt;br /&gt;
# VERIFY_ACL=1&lt;br /&gt;
# ACL_GROUPS=&amp;quot;local ld int voicemail free-pstn&amp;quot;&lt;br /&gt;
# VERBOSE=1&lt;br /&gt;
# STORE_PLAINTEXT_PW=0&lt;br /&gt;
# NOHLPRINT=1&lt;br /&gt;
PID_FILE=/var/run/opensips/opensips.pid&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Criando o banco de dados===&lt;br /&gt;
Agora que temos nosso arquivo configurado vamos fazer a criação do banco de dados, execute o comando abaixo.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
opensipsdbctl create opensips&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O sistema irá lhe perguntar algumas coisas, responda Y (sim) para todas para que ele instale todas as tabelas, não usaremos todas elas, mas desta forma você fica com praticamente tudo criado para o caso de uma expansão dos recursos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Instalando o RTP Proxy===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /usr/src/&lt;br /&gt;
wget -c http://b2bua.org/chrome/site/rtpproxy-1.2.1.tar.gz&lt;br /&gt;
tar -xzvf rtpproxy-1.2.1.tar.gz&lt;br /&gt;
cd rtpproxy-1.2.1&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
groupadd rtpproxy&lt;br /&gt;
useradd -d /var/run/rtpproxy -s /bin/true -g rtpproxy rtpproxy&lt;br /&gt;
mkdir /var/log/rtpproxy&lt;br /&gt;
mkdir /var/run/rtpproxy&lt;br /&gt;
chown -R rtpproxy.rtpproxy /var/log/rtpproxy&lt;br /&gt;
chown -R rtpproxy.rtpproxy /var/run/rtpproxy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Arquivo de inicialização====&lt;br /&gt;
'''/etc/init.d/rtpproxy'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Este script e de autoria de Mike Tesliuk&lt;br /&gt;
# qualquer falha no mesmo por favor informe &lt;br /&gt;
# atraves do email mike (a) tesliuk.com&lt;br /&gt;
#&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          rtpproxy&lt;br /&gt;
# Required-Start:    $syslog $network $local_fs $time&lt;br /&gt;
# Required-Stop:     $syslog $network $local_fs&lt;br /&gt;
# Default-Start:     2 3 4 5&lt;br /&gt;
# Default-Stop:      0 1 6&lt;br /&gt;
# Short-Description: Start the RTPPROXY server&lt;br /&gt;
# Description:       Start the RTPPROXY server&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
&lt;br /&gt;
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin&lt;br /&gt;
USELOG=1&lt;br /&gt;
USER=rtpproxy&lt;br /&gt;
# Altere o ip abaixo para o ip de seu sistema&lt;br /&gt;
IPADDR=&amp;quot;10.254.254.6&amp;quot;&lt;br /&gt;
&lt;br /&gt;
. /lib/lsb/init-functions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
start(){&lt;br /&gt;
        echo &amp;quot;Iniciando RTP PROXY &amp;quot;&lt;br /&gt;
        if [ -z $(pidof rtpproxy) ]; then&lt;br /&gt;
                if [ &amp;quot;${USELOG}&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
                        echo &amp;quot;Iniciando com LOG&amp;quot;&lt;br /&gt;
                        /usr/local/bin/rtpproxy -l $IPADDR -s udp:127.0.0.1:7722 -u $USER -F -f d DBUG 2&amp;amp;&amp;gt; /var/log/rtpproxy/rtpproxy.log &amp;amp;&lt;br /&gt;
                else&lt;br /&gt;
                        echo &amp;quot;Iniciando sem LOG&amp;quot;&lt;br /&gt;
                        /usr/local/bin/rtpproxy -l $IPADDR -s udp:127.0.0.1:7722 -u $USER  -F -f d DBUG 2&amp;amp;&amp;gt; /dev/null&lt;br /&gt;
                fi&lt;br /&gt;
&lt;br /&gt;
                if [ -n $(pidof rtpproxy) ]; then&lt;br /&gt;
                        echo &amp;quot;START OK&amp;quot;&lt;br /&gt;
                fi&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Processo ja em execucao&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
stop(){&lt;br /&gt;
&lt;br /&gt;
        if [ -z $(pidof rtpproxy) ]; then&lt;br /&gt;
                echo &amp;quot;Processo nao encontrado&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                kill -9 $(pidof rtpproxy)&lt;br /&gt;
                if [ -n $(pidof rtpproxy) ]; then&lt;br /&gt;
                        echo &amp;quot;STOP OK&amp;quot;&lt;br /&gt;
                else&lt;br /&gt;
                        echo &amp;quot;Falha em realizar stop do servico&amp;quot;&lt;br /&gt;
                fi&lt;br /&gt;
&lt;br /&gt;
        fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
case $1 in&lt;br /&gt;
        start)&lt;br /&gt;
                start&lt;br /&gt;
        ;;&lt;br /&gt;
        stop)&lt;br /&gt;
                stop&lt;br /&gt;
        ;;&lt;br /&gt;
        restart)&lt;br /&gt;
                stop&lt;br /&gt;
                start&lt;br /&gt;
&lt;br /&gt;
        ;;&lt;br /&gt;
        *)&lt;br /&gt;
                echo &amp;quot;Utilize: stop | start | restart&amp;quot;&lt;br /&gt;
        ;;&lt;br /&gt;
esac&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vamos dar permissao e colocar na inicialização&lt;br /&gt;
 chmod +x /etc/init.d/rtpproxy &lt;br /&gt;
 update-rc.d rtpproxy defaults&lt;br /&gt;
 /etc/init.d/rtpproxy start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Criando o arquivo opensips.cfg===&lt;br /&gt;
O arquivo opensips.cfg é a onde a coisa toda acontece para o opensips, claro que ele dependerá de informações que estarão no banco de dados, mas é onde criamos todas as nossas rotas e validações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
####### Global Parameters #########&lt;br /&gt;
debug=3&lt;br /&gt;
log_stderror=no&lt;br /&gt;
log_facility=LOG_LOCAL0&lt;br /&gt;
&lt;br /&gt;
fork=yes&lt;br /&gt;
children=4&lt;br /&gt;
&lt;br /&gt;
/* Descomente as linhas abaixo para ativar o debug */&lt;br /&gt;
#debug=7&lt;br /&gt;
#fork=no&lt;br /&gt;
#log_stderror=yes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Comente a linha abaixo para ativar a descoberta automatica de enderecos locais&lt;br /&gt;
 , isso significa que o sistema ira verificar todos os ips ativos e hosts e entao ativara&lt;br /&gt;
 o protocolo para todos eles */ &lt;br /&gt;
auto_aliases=no&lt;br /&gt;
&lt;br /&gt;
/* Defina aqui o ip a ser utilizado */&lt;br /&gt;
listen=udp:10.254.254.6:5060   # Altere este IP para o seu ambiente&lt;br /&gt;
&lt;br /&gt;
/* Nao usaremos sip por tcp nem tls neste script */&lt;br /&gt;
disable_tcp=yes&lt;br /&gt;
&lt;br /&gt;
disable_tls=yes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Secao de modulos ########&lt;br /&gt;
&lt;br /&gt;
#set module path&lt;br /&gt;
mpath=&amp;quot;/usr//lib64/opensips/modules/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;signaling.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;sl.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;tm.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;fr_timer&amp;quot;, 5)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;fr_inv_timer&amp;quot;, 30)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;restart_fr_on_each_reply&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;rr.so&amp;quot;&lt;br /&gt;
/* do not append from tag to the RR (no need for this script) */&lt;br /&gt;
modparam(&amp;quot;rr&amp;quot;, &amp;quot;append_fromtag&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;maxfwd.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;sipmsgops.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;mi_fifo.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;mi_fifo&amp;quot;, &amp;quot;fifo_name&amp;quot;, &amp;quot;/tmp/opensips_fifo&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;mi_fifo&amp;quot;, &amp;quot;fifo_mode&amp;quot;, 0666)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;db_mysql.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;uri.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;uri&amp;quot;, &amp;quot;use_uri_table&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;usrloc.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;nat_bflag&amp;quot;, &amp;quot;FLB_NATB&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;db_mode&amp;quot;,   2)&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;db_url&amp;quot;,  &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;registrar.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;registrar&amp;quot;, &amp;quot;tcp_persistent_flag&amp;quot;, &amp;quot;TCP_PERSISTENT&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
/* Descomente a linha abaixo para nao permitir mais de 10 contatos por conta */&lt;br /&gt;
#modparam(&amp;quot;registrar&amp;quot;, &amp;quot;max_contacts&amp;quot;, 10)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;acc.so&amp;quot;&lt;br /&gt;
/* Quais eventos deverao ser registrados ? */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;early_media&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;report_cancels&amp;quot;, 0)&lt;br /&gt;
/* por padrao nos nao ajustamos a direcao em requisicoes sequencias, &lt;br /&gt;
 se voce deseja usar este recurso tenha certeza de ativar o &amp;quot;appen_fromtag&amp;quot; &lt;br /&gt;
 para o modulo &amp;quot;rr&amp;quot; */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;detect_direction&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;failed_transaction_flag&amp;quot;, &amp;quot;FLT_ACCFAILED&amp;quot;)&lt;br /&gt;
/* Gatilhos para accounting  (flags) */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_flag&amp;quot;, &amp;quot;FLT_ACC&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_missed_flag&amp;quot;, &amp;quot;FLT_ACCMISSED&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_extra&amp;quot;, &lt;br /&gt;
	&amp;quot;src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_flag&amp;quot;, &amp;quot;FLT_ACC&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_missed_flag&amp;quot;, &amp;quot;FLT_ACCMISSED&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_extra&amp;quot;, &amp;quot;src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;auth.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;auth_db.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;db_url&amp;quot;,  &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;calculate_ha1&amp;quot;, yes)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;password_column&amp;quot;, &amp;quot;password&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;load_credentials&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;permissions.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;permissions&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;alias_db.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;alias_db&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;presence.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;presence&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#loadmodule &amp;quot;presence_xml.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;dialog.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;db_mode&amp;quot;, 2)&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;db_url&amp;quot;,&amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;dlg_match_mode&amp;quot;, 1)&lt;br /&gt;
#modparam(&amp;quot;dialog&amp;quot;, &amp;quot;default_timeout&amp;quot;, 60)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;siptrace.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;trace_flag&amp;quot;, 22)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;traced_user_avp&amp;quot;, &amp;quot;$avp(s:traceuser)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;nathelper.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;natping_interval&amp;quot;, 30)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;ping_nated_only&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;sipping_bflag&amp;quot;, &amp;quot;FLB_NATSIPPING&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;sipping_from&amp;quot;, &amp;quot;sip:pinger@10.254.254.6&amp;quot;) # Altere o ip para o ip do servidor&lt;br /&gt;
modparam(&amp;quot;nathelper|registrar&amp;quot;, &amp;quot;received_avp&amp;quot;, &amp;quot;$avp(RECEIVED)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;rtpproxy.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;rtpproxy&amp;quot;, &amp;quot;rtpproxy_sock&amp;quot;, &amp;quot;udp:127.0.0.1:7722&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Logica de roteamento ########&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route {&lt;br /&gt;
&lt;br /&gt;
	if (!mf_process_maxfwd_header(&amp;quot;3&amp;quot;)) {&lt;br /&gt;
                send_reply(&amp;quot;483&amp;quot;,&amp;quot;looping&amp;quot;);&lt;br /&gt;
                exit;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;REQUISICAO RECEBIDA, ENVIANDO PARA REQINIT&amp;quot;);&lt;br /&gt;
	# Checagem inicial por requisicao&lt;br /&gt;
	route(REQINIT);&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA NAT&amp;quot;);&lt;br /&gt;
	# Deteccao de nat&lt;br /&gt;
	route(NAT);&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA WITHINDLG&amp;quot;);&lt;br /&gt;
	# Gerenciando requisicaoes com dialog&lt;br /&gt;
	route(WITHINDLG);&lt;br /&gt;
&lt;br /&gt;
	# Manipulando requisicoes iniciais (nao consta To tag)&lt;br /&gt;
	&lt;br /&gt;
	# Processando CANCEL&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;CANCEL&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD CANCEL&amp;quot;);&lt;br /&gt;
		if(t_check_trans()){&lt;br /&gt;
			t_relay();&lt;br /&gt;
		}&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	t_check_trans();&lt;br /&gt;
&lt;br /&gt;
	# Enviando para autenticacao&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA AUTENTICACAO&amp;quot;);&lt;br /&gt;
	route(AUTH);&lt;br /&gt;
&lt;br /&gt;
	# gravando rota para formacao dos dialogs (caso sejam roteados)&lt;br /&gt;
	# removemos qualquer cabecalho de rota pre carregado&lt;br /&gt;
	remove_hf(&amp;quot;Route&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE|SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD INVITE OU SIBSCRIBE&amp;quot;);&lt;br /&gt;
		record_route();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Contabilizando (acc) INVITES&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD INVITE, FAZENDOA ACC&amp;quot;);&lt;br /&gt;
		setflag(FLT_ACC);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Enviando chamada para destinos externos&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA SIPOUT&amp;quot;);&lt;br /&gt;
	route(SIPOUT);&lt;br /&gt;
&lt;br /&gt;
	# Requisicoes para dominio local&lt;br /&gt;
	&lt;br /&gt;
	# Roteando requisicoes de PRESENCE&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA PRESENCE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	route(PRESENCE);&lt;br /&gt;
&lt;br /&gt;
	# Gerenciando pedidos de registro&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA REGISTRAR&amp;quot;);	&lt;br /&gt;
	route(REGISTRAR);&lt;br /&gt;
&lt;br /&gt;
	if($ru==&amp;quot;&amp;quot;){&lt;br /&gt;
		xlog(&amp;quot;ru --&amp;gt; vazio&amp;quot;);&lt;br /&gt;
		# Requisicao sem usuario na RURI&lt;br /&gt;
		sl_send_reply(&amp;quot;484&amp;quot;, &amp;quot;Address Incomplete&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Enviando requisicao para PSTN&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA PSTN&amp;quot;);&lt;br /&gt;
	route(PSTN);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	# Salvando informacao de quem originou a chamad&lt;br /&gt;
	$avp(callee)=$rU;&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA DISPATCH PSTN&amp;quot;);&lt;br /&gt;
	route(FSDISPATCH);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	# Servico de localizacao de usuario&lt;br /&gt;
	route(LOCATION);&lt;br /&gt;
&lt;br /&gt;
	# Efetuando o relay (encaminhamento)&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[RELAY] {&lt;br /&gt;
	if(check_route_param(&amp;quot;nat=yes&amp;quot;)){&lt;br /&gt;
		setbflag(FLB_NATB);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(isflagset(FLT_NATS) || isbflagset(FLB_NATB)){&lt;br /&gt;
		#route(RTPPROXY);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
#	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
#		t_on_reply(&amp;quot;REPLY_ONE&amp;quot;);&lt;br /&gt;
#		t_on_failure(&amp;quot;FAIL_ONE&amp;quot;);&lt;br /&gt;
#	}&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;AQUI TENTAMOS ENVIAR A CHAMADA $fU $tU&amp;quot;);&lt;br /&gt;
	if(!t_relay()){&lt;br /&gt;
		xlog(&amp;quot;FALHA EM ENVIAR A CHAMADA, NAO FOI POSSIVEL FAZER O RELAY&amp;quot;);&lt;br /&gt;
		sl_reply_error();&lt;br /&gt;
	}&lt;br /&gt;
	xlog(&amp;quot;CHAMADA FOI ENVIADA AQUI, QUAL O ERRO ENTAO&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[REQINIT] {&lt;br /&gt;
	if(!mf_process_maxfwd_header(&amp;quot;10&amp;quot;)){&lt;br /&gt;
		sl_send_reply(&amp;quot;483&amp;quot;, &amp;quot;Too Many Hops&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[WITHINDLG] {&lt;br /&gt;
	if(has_totag()){&lt;br /&gt;
		if(loose_route()){&lt;br /&gt;
			if(is_method(&amp;quot;BYE&amp;quot;)){&lt;br /&gt;
				setflag(FLT_ACC);&lt;br /&gt;
				setflag(FLT_ACCFAILED);&lt;br /&gt;
			}&lt;br /&gt;
			route(RELAY);&lt;br /&gt;
		}else{&lt;br /&gt;
			if(is_method(&amp;quot;SUBSCRIBE&amp;quot;) &amp;amp;&amp;amp; uri==myself) {&lt;br /&gt;
				# requisicao de subscribe pre-estabelecida&lt;br /&gt;
				route(PRESENCE);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if(is_method(&amp;quot;ACK&amp;quot;)){&lt;br /&gt;
				if(t_check_trans()){&lt;br /&gt;
					t_relay();&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
			}else{&lt;br /&gt;
				# ACK para transacao nao encontrada, ignoramos...&lt;br /&gt;
				exit;&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			sl_send_reply(&amp;quot;404&amp;quot;, &amp;quot;Not Here&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		}	&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[REGISTRAR] {&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;REGISTER&amp;quot;)){&lt;br /&gt;
		if(isflagset(FLT_NATS)){&lt;br /&gt;
			setbflag(FLB_NATB);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(!save(&amp;quot;location&amp;quot;)){&lt;br /&gt;
			sl_reply_error();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[LOCATION] {&lt;br /&gt;
&lt;br /&gt;
	alias_db_lookup(&amp;quot;dbaliases&amp;quot;);&lt;br /&gt;
	if(!lookup(&amp;quot;location&amp;quot;)){&lt;br /&gt;
		switch($rc) {&lt;br /&gt;
			case -1:&lt;br /&gt;
			case -3:&lt;br /&gt;
				t_newtran();&lt;br /&gt;
				t_reply(&amp;quot;404&amp;quot;,&amp;quot;Not Found&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			case -2:&lt;br /&gt;
				sl_send_reply(&amp;quot;405&amp;quot;, &amp;quot;Method Not Allowed&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		setflag(FLT_ACCMISSED);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[PRESENCE] {&lt;br /&gt;
	if(!is_method(&amp;quot;PUBLISH|SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!t_newtran()){&lt;br /&gt;
		sl_reply_error();&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;PUBLISH&amp;quot;)){&lt;br /&gt;
		handle_publish();&lt;br /&gt;
	}else if(is_method(&amp;quot;SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		handle_subscribe();&lt;br /&gt;
	}&lt;br /&gt;
	exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[AUTH]{&lt;br /&gt;
	xlog(&amp;quot;PEDIDO DE AUTENTICACAO&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;REGISTER&amp;quot;)){&lt;br /&gt;
		# atentica pedidos de registro&lt;br /&gt;
		if(!www_authorize(&amp;quot;&amp;quot;, &amp;quot;subscriber&amp;quot;)){&lt;br /&gt;
			www_challenge(&amp;quot;&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if($au!=$tU){&lt;br /&gt;
			sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
	}else{&lt;br /&gt;
		if(route(FSINBOUND)){&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(check_source_address(&amp;quot;0&amp;quot;)){&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(from_uri==myself){&lt;br /&gt;
			if(!proxy_authorize(&amp;quot;&amp;quot;, &amp;quot;subscriber&amp;quot;)){&lt;br /&gt;
				proxy_challenge(&amp;quot;&amp;quot;,&amp;quot;0&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if(is_method(&amp;quot;PUBLISH&amp;quot;)){&lt;br /&gt;
				if($au!=$tU){&lt;br /&gt;
					sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
			}else{&lt;br /&gt;
				if($au!=$fU){&lt;br /&gt;
					sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			&lt;br /&gt;
			# Validamos (autenticamos) o usuario&lt;br /&gt;
			consume_credentials();&lt;br /&gt;
		}else{&lt;br /&gt;
		&lt;br /&gt;
			# usuario nao e local, vamos negar&lt;br /&gt;
			if(!uri==myself){&lt;br /&gt;
				sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not relaying&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}	&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[NAT] {&lt;br /&gt;
	force_rport();&lt;br /&gt;
	if(nat_uac_test(&amp;quot;19&amp;quot;)){&lt;br /&gt;
		if(method==&amp;quot;REGISTER&amp;quot;){&lt;br /&gt;
			fix_nated_register();&lt;br /&gt;
		}else{&lt;br /&gt;
			fix_nated_contact();&lt;br /&gt;
		}&lt;br /&gt;
		setflag(FLT_NATS);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[RTPPROXY] {&lt;br /&gt;
	if(is_method(&amp;quot;BYE&amp;quot;)){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}else if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		engage_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!has_totag()){&lt;br /&gt;
&lt;br /&gt;
		if(!check_route_param(&amp;quot;nat=yes&amp;quot;)){&lt;br /&gt;
			add_rr_param(&amp;quot;;nat=yes&amp;quot;);&lt;br /&gt;
			xlog(&amp;quot;NAT yes NAO ENCONTRADO&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[SIPOUT]{&lt;br /&gt;
	if(!uri==myself){&lt;br /&gt;
		append_hf(&amp;quot;P-hint: outbound\r\n&amp;quot;);&lt;br /&gt;
		route(RELAY);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[PSTN]{&lt;br /&gt;
        # neste caso apenas para exemplificar um uso simples&lt;br /&gt;
        # vamos fazer o redirecionamento par ao asterisk&lt;br /&gt;
        # realizar a dicagem da chamada&lt;br /&gt;
&lt;br /&gt;
        if(!($rU=~&amp;quot;^(\+|00)[1-9][0-9]{3,20}$&amp;quot;))&lt;br /&gt;
                return;&lt;br /&gt;
&lt;br /&gt;
        ## a regra acima aceita para discagem externa qualquer numero&lt;br /&gt;
        # comecado com 00 ou +&lt;br /&gt;
        #&lt;br /&gt;
&lt;br /&gt;
        if(from_uri!=myself){&lt;br /&gt;
                sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not Allowed&amp;quot;);&lt;br /&gt;
                exit;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $ru = &amp;quot;sip:&amp;quot; + $rU + &amp;quot;@&amp;quot; + &amp;quot;10.254.254.6:5090&amp;quot;;&lt;br /&gt;
        xlog(&amp;quot;NOVO DESTINO: $ru&amp;quot;);&lt;br /&gt;
        route(RELAY);&lt;br /&gt;
        exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[XMLRPC]{&lt;br /&gt;
	# nao vamos implementar esta funcionalidade&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSINBOUND] {&lt;br /&gt;
	# verificar para validar o ip do asterisk:porta&lt;br /&gt;
	# se bater , responder com return 1;&lt;br /&gt;
	if($si==&amp;quot;10.254.254.6&amp;quot; &amp;amp;&amp;amp; $sp==&amp;quot;5090&amp;quot;){&lt;br /&gt;
		return(1);&lt;br /&gt;
	}else{&lt;br /&gt;
		return(-1);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSDISPATCH] {&lt;br /&gt;
&lt;br /&gt;
	if(!is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(route(FSINBOUND)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;CAIMOS NO SWITCH, VAMOS LOCALIZAR O PERFIL DA CHAMADA $rU&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if($rU =~ &amp;quot;^41$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWITCH expressa comeca e termina em 41&amp;quot;);&lt;br /&gt;
			#regra de menu de voicemail, apenas &lt;br /&gt;
			# usuarios autenticados&lt;br /&gt;
			if($au==&amp;quot;&amp;quot;){&lt;br /&gt;
				sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not Allowed&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$rU = &amp;quot;vma-&amp;quot; + $au;&lt;br /&gt;
	}else if($rU =~ &amp;quot;^441[0-9][0-9]$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWTICH OPCA 441XX &amp;quot;);&lt;br /&gt;
			# numero discado comeca com 441 seguido de dois digitos&lt;br /&gt;
			# chamada direta para inbox do voicemail&lt;br /&gt;
			strip(2);&lt;br /&gt;
			route(FSVBOX);&lt;br /&gt;
	}else if($rU =~ &amp;quot;^433[01][0-9][0-9]$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWITCH OPCAO 433[01]XX&amp;quot;);&lt;br /&gt;
			# numero comecado em 443, seguido de 0 ou 1, mais dois digitos&lt;br /&gt;
			# sistema de conferencia&lt;br /&gt;
			strip(2);&lt;br /&gt;
	}else if($rU =~ &amp;quot;^45[0-9]+$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWTICH OPCAO 45X.&amp;quot;);&lt;br /&gt;
			#numero comecado com 45, seguindo de numeros;&lt;br /&gt;
			strip(2);&lt;br /&gt;
	}else{&lt;br /&gt;
			xlog(&amp;quot;OPCAO DEFAULT DO SWITCH&amp;quot;);&lt;br /&gt;
			# usuario offline, enviando para voicemail&lt;br /&gt;
			if(!registered(&amp;quot;location&amp;quot;)){&lt;br /&gt;
				route(FSVBOX);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			# usuario online, fazendo bridging&lt;br /&gt;
			xlog(&amp;quot;USUARIO ESTA ONLINE VAMOS FAZER BRIDGE&amp;quot;);&lt;br /&gt;
			prefix(&amp;quot;kb-&amp;quot;);&lt;br /&gt;
			if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
				t_on_failure(&amp;quot;FAIL_FSVBOX&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
	}&lt;br /&gt;
	route(FSRELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSVBOX]{&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA FSVBOX&amp;quot;);&lt;br /&gt;
	$du = &amp;quot;sip:&amp;quot; + &amp;quot;10.254.254.6&amp;quot; + &amp;quot;:&amp;quot; + &amp;quot;5090&amp;quot;;&lt;br /&gt;
	if($rU =~ &amp;quot;^441[0-9][0-9]&amp;quot;){&lt;br /&gt;
		strip(2);&lt;br /&gt;
	}&lt;br /&gt;
	prefix(&amp;quot;vm-&amp;quot;);&lt;br /&gt;
	if($var(newbranch)==1){&lt;br /&gt;
		append_branch();&lt;br /&gt;
		$var(newbranch)=0;&lt;br /&gt;
	}&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[FSRELAY] {&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA FSRELAY&amp;quot;);&lt;br /&gt;
	$du = &amp;quot;sip:&amp;quot; + &amp;quot;10.254.254.6&amp;quot; + &amp;quot;:&amp;quot; + &amp;quot;5090&amp;quot;;&lt;br /&gt;
	if($var(newbranch)==1){&lt;br /&gt;
		append_branch();&lt;br /&gt;
		$var(newbranch)=0;&lt;br /&gt;
	}&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
branch_route[BRANCH_ONE]{&lt;br /&gt;
	xlog(&amp;quot;new branch at $ru&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
onreply_route[REPLY_ONE]{&lt;br /&gt;
	xlog(&amp;quot;Incoming reply&amp;quot;);&lt;br /&gt;
	if((isflagset(FLT_NATS) || isbflagset(FLB_NATB) &amp;amp;&amp;amp; status =~ &amp;quot;(183)|(2[0-9][0-9])&amp;quot;)){&lt;br /&gt;
		#rtpproxy_offer();&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	if(isbflagset(FLB_NATB)){&lt;br /&gt;
		fix_nated_contact();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
failure_route[FAIL_ONE]{&lt;br /&gt;
	xlog(&amp;quot;FAILURE ROUTE FAIL_ONE&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;) &amp;amp;&amp;amp; (isbflagset(FLB_NATB) || isflagset(FLT_NATS))){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_was_cancelled()){&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
failure_route[FAIL_FSVBOX]{&lt;br /&gt;
	xlog(&amp;quot;FAILURE ROUTE FAIL_FSVBOX&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;) &amp;amp;&amp;amp; (isbflagset(FLB_NATB) || isflagset(FLT_NATS))){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_was_cancelled()){&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_check_status(&amp;quot;486|408|480&amp;quot;)){&lt;br /&gt;
		$rU = $avp(callee);&lt;br /&gt;
		$var(newbranch) = 1;&lt;br /&gt;
		route(FSVBOX);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testes com Opensips (registro)==&lt;br /&gt;
&lt;br /&gt;
Antes de podermos testar precisamos iniciar o serviço, no momento estamos com ele operando em modo debug, então a inicialização deve ser realizada com o comando abaixo&lt;br /&gt;
 /etc/init.d/opensips debug&lt;br /&gt;
&lt;br /&gt;
Abra uma nova sessão no servidor e então vamos criar os usuários&lt;br /&gt;
 opensipsctl add 101 101&lt;br /&gt;
 opensipsctl add 102 102&lt;br /&gt;
 opensipsctl add 103 103&lt;br /&gt;
&lt;br /&gt;
usuario 101 com senha 101 e assim por diante&lt;br /&gt;
&lt;br /&gt;
Faça a onexão com seu softphone, aqui para testes utilizei o jitsi e o zoiper, neste momento vamos apenas fazer o registro do usuário para testar a autenticação, se você tentar realizar uma discagem não funcionará pois neste caso o processo depende do Asterisk que ainda não está configurado, vamos dar inicio nesta configuração agora.&lt;br /&gt;
&lt;br /&gt;
==Asterisk==&lt;br /&gt;
Não vamos dar muitos detalhes da instalação do asterisk aqui, a ideia é simplesmente ter o mesmo funcionando da forma que necessitamos.&lt;br /&gt;
 apt-get install asterisk&lt;br /&gt;
&lt;br /&gt;
Após a instalação , abra o arquivo /etc/asterisk/sip.conf, localize a linha '''udpbindaddr=0.0.0.0''' e altere para '''udpbindaddr=0.0.0.0:5090'''  , depois ao fim do arquivo adicione.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[opensips]&lt;br /&gt;
type=peer&lt;br /&gt;
host=10.254.254.6&lt;br /&gt;
port=5060&lt;br /&gt;
qualify=yes&lt;br /&gt;
context=opensips&lt;br /&gt;
insecure=port,invite&lt;br /&gt;
canreinvite=no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agora abra o arquivo '''/etc/asterisk/extensions.conf''' , crie no fim do arquivo a seguinte entrada.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[opensips]&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _kb-1XX,1,NoOp(CHAMADA INTERNA - FAZER BRIDGE - ${CALLERID(num)} ${EXTEN:3})&lt;br /&gt;
same =&amp;gt; n,Dial(SIP/opensips/${EXTEN:3})&lt;br /&gt;
same =&amp;gt; n,Goto(opensips,vm-${EXTEN:3},1)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _vm-1XX,1,NoOp(CHAMADA PARA VOICEMAIL)&lt;br /&gt;
same =&amp;gt; n,Voicemail(${EXTEN:3}@default)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _vma-1XX,1,NoOp(CHAMADA PARA VOICEMAIL - ADMINISTRATIVO)&lt;br /&gt;
same =&amp;gt; n,VoicemailMain(${EXTEN:4}@default)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _3[01]XX,1,NoOp(CHAMADA PARA CONFERENCIA)&lt;br /&gt;
same =&amp;gt; n,Answer()&lt;br /&gt;
same =&amp;gt; n,ConfBridge(${EXTEN},cM1)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _00.,1,NoOp(CHAMADA PARA PSTN)&lt;br /&gt;
same =&amp;gt; n,Wait(2)&lt;br /&gt;
same =&amp;gt; n,Answer()&lt;br /&gt;
same =&amp;gt; n,Wait(1)&lt;br /&gt;
same =&amp;gt; n,PlayBack(tt-monkeys)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; h,1,Hangup()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente precisamos criar as entradas do voicemail, para isso altere o arquivo '''/etc/asterisk/voicemail.conf''' localize o contexto '''[default]''' e então adicione as entradas para seu voicemail, segue dois exemplos abaixo.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
101 =&amp;gt; 123123,Mike Tesliuk&lt;br /&gt;
102 =&amp;gt; 123123,Mike Tesliuk 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Feito isso, faça um restart no asterisk&lt;br /&gt;
 /etc/init.d/asterisk restart&lt;br /&gt;
&lt;br /&gt;
Agora você ja poderá fazer os testes, basicamente criamos as seguintes situações para serem testadas.&lt;br /&gt;
&lt;br /&gt;
*1 Autenticação de usuários&lt;br /&gt;
*2 Chamada entre usuários&lt;br /&gt;
*3 Encaminhamento para caixa postal&lt;br /&gt;
*4 Acesso a caixa postal&lt;br /&gt;
*5 Acesso a conferência&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPs_e_Asterisk&amp;diff=1528</id>
		<title>OpenSIPs e Asterisk</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPs_e_Asterisk&amp;diff=1528"/>
		<updated>2021-04-15T22:55:38Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Precisando de recursos de númeração para fazer seus testes ? contrate conosco em [http://www.brdvoz.com.br|BRDVoz]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color: red;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;font color=white&amp;gt; Falta realizar os ajustes / testes para o NAT no mais esta tudo funcionado adequadamente a principio &amp;lt;/font&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este tutorial é baseado em um tutorial similar porém utilizando Kamailio e Freeswtich, se quiser verificar o tutorial original acesse http://kb.asipto.com/freeswitch:kamailio-3.1.x-freeswitch-1.0.6d-sbc.&lt;br /&gt;
&lt;br /&gt;
Para esta implementação utilizamos Debian 7.0 amd64 , OpenSIPS 1.9 e Asterisk 1.8.23 &lt;br /&gt;
&lt;br /&gt;
==Funcionalidades==&lt;br /&gt;
Este tutorial tem por objetivo atingir as seguintes funcionalidades.&lt;br /&gt;
*Autenticação de usuário&lt;br /&gt;
*Registro de usuário&lt;br /&gt;
*Localização de usuário (encaminhamento de chamadas)&lt;br /&gt;
*Roteamento de chamadas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Através do Asterisk estenderemos estas funcionalidades agregando.&lt;br /&gt;
*Correio de voz (Voicemail)&lt;br /&gt;
*Conferencia &lt;br /&gt;
*SBC ( Pode ser utilizado para transcoding, esconder topologia, play de mensagens e tarifação )&lt;br /&gt;
*Outros serviços de media (Anuncios, Ura's e coisas do tipo)&lt;br /&gt;
&lt;br /&gt;
==Definições==&lt;br /&gt;
Para um melhor entendimento da solução vamos expor aqui algumas definições de nosso sistema.&lt;br /&gt;
*Usuários locais terão ramais com 3 digitos (ex: 101, 102, 103)&lt;br /&gt;
*Identidade do correio de voz será o mesmo do ramal&lt;br /&gt;
*Serviços de media (acesso a voicemail e outros) receberão rotas de 4 digitos&lt;br /&gt;
*Opensips e Asterisk utilizarão o mesmo servidor (Neste caso IP: 10.254.254.6)&lt;br /&gt;
*Os serviços rodarão nas portas 5060 (opensips) , 5090 (Asterisk)&lt;br /&gt;
&lt;br /&gt;
==Funcionamento==&lt;br /&gt;
A autenticação do usuário será realizada pelo OpenSIPs, quando uma chamada é autenticada então ela serguirá:&lt;br /&gt;
*Se o usuário de destino não está online a chamada será enviada para o Asterisk para função de correio de voz&lt;br /&gt;
*Se o usuário está online a chamada será encaminhada para o Asterisk, dest forma é possivel acionar funcionalidades como anuncios, definição de tempo de chamada, forçar codecs e outras funcionalidades.&lt;br /&gt;
*Asterisk envia a chamada novamente para o OpenSIPs que verificará no location e entregará a chamada para o usuário.&lt;br /&gt;
*Se a chamada não for atendida o Opensips irá re-encaminhar para o Asterisk direcionando para função de voicemail&lt;br /&gt;
&lt;br /&gt;
==OpenSIPs==&lt;br /&gt;
Vamos iniciar o processo de instalação com o OpenSIPs, siga os procedimentos abaixo para evitar qualquer dificuldade.&lt;br /&gt;
&lt;br /&gt;
===Dependencias===&lt;br /&gt;
Execute o comando abaixo para instalar todas as dependencias necessárias&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install gcc make libncurses5-dev libnewt-dev libxml2-dev unixodbc \ &lt;br /&gt;
unixodbc-dev libmysqlclient15-dev libxmlrpc-c3-dev libexpat1-dev zlib1g-dev \ &lt;br /&gt;
m4 bison flex libpcre3-dev mysql-server vim apache2-mpm-prefork libapache2-mod-php5 \&lt;br /&gt;
 php5-mysql php5-xmlrpc php-pear  ngrep g++ libjpeg62-dev libssl-dev &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Durante a instalação o sistema irá lhe perguntar a senha de root para o servidor MySQL é importante que você se lembre da mesma posteriormente pois utilizaremos a mesma.&lt;br /&gt;
&lt;br /&gt;
===Compilando o OpenSIPs===&lt;br /&gt;
Para manter um padrão onde os dados estao vamos utilizar o diretório /usr/src/ para o download de código fonte.&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src/&lt;br /&gt;
 wget -c http://opensips.org/pub/opensips/1.9.1/src/opensips-1.9.1_src.tar.gz&lt;br /&gt;
 tar -xzvf opensips-1.9.1_src.tar.gz&lt;br /&gt;
 cd opensips-1.9.1-tls/&lt;br /&gt;
 make menuconfig&lt;br /&gt;
&lt;br /&gt;
Neste ponto o sistema irá abrir uma tela com algumas opções para selecionar, Acesse a primeira opção do menu, no submenu acesse a segunda opção ( Configure excluded modules ), selecione os módulos db_mysql , dialplan , mi_xmlrpc , presence e presence_xml&lt;br /&gt;
&lt;br /&gt;
Agora volte ao submenu, e selecione a opção Save Changes, volte para o menu principal e selecione '''Compile and Install OpenSips''' , deixe que o sistema execute suas funções.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ao finalizar a compilação você retornará ao menu, va na opção '''Exit and Save all changes'''&lt;br /&gt;
&lt;br /&gt;
===Preparando a Configuração===&lt;br /&gt;
&lt;br /&gt;
Antes de darmos inicio ao arquivo de configuração, vamos ajustar algumas questões, o opensips instala os arquivos (se voce nao alterar o parametro) em /usr, consequentemente as configurações ficam em /usr/etc , eu por padrão faço um link para o diretório /etc, assim acesso as configurações em /etc/opensips&lt;br /&gt;
&lt;br /&gt;
 ln -s /usr/etc/opensips /etc/&lt;br /&gt;
&lt;br /&gt;
No caso do debian o script de inicialização utiliza um arquivo extra de configuração&lt;br /&gt;
 cp packaging/debian/opensips.default /etc/default/opensips&lt;br /&gt;
&lt;br /&gt;
Para o script de inicialização execute o comando abaixo&lt;br /&gt;
 cp packaging/debian/opensips.init /etc/init.d/opensips&lt;br /&gt;
 chmod +x /etc/init.d/opensips&lt;br /&gt;
 update-rc.d opensips defaults&lt;br /&gt;
&lt;br /&gt;
Edite o arquivo /etc/default/opensips , a altere o parametro '''RUN_OPENSIPS''' para yes&lt;br /&gt;
&lt;br /&gt;
Você pode notar que no arquivo é mensionado o usuário de execução do opensips como opensips, então vamos ter de criar este usuário ( e grupo )&lt;br /&gt;
&lt;br /&gt;
 groupadd opensips&lt;br /&gt;
 mkdir /var/run/opensips&lt;br /&gt;
 useradd -d /var/run/opensips/ -s /bin/false -g opensips opensips&lt;br /&gt;
 chown -R opensips.opensips /var/run/opensips&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Configurando o opensipsctl===&lt;br /&gt;
O opensipsctl (e opensipsdbctl) utilizam o arquivo de configuração /etc/opensips/opensipsctlrc, abaixo segue o conteúdo do arquivo. (Sugiro que você faça um backup dos arquivos originais para ter uma copia, existem parametros que você pode estudar depois).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DBENGINE=MYSQL&lt;br /&gt;
DBHOST=localhost&lt;br /&gt;
DBNAME=opensips&lt;br /&gt;
DBRWUSER=opensips&lt;br /&gt;
DBRWPW=&amp;quot;opensipsrw&amp;quot;&lt;br /&gt;
SIP_DOMAIN=10.254.254.6  ### caso voce esteja usando outro ip altere aqui&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DBROOTUSER=&amp;quot;root&amp;quot;&lt;br /&gt;
INSTALL_EXTRA_TABLES=ask&lt;br /&gt;
ALIASES_TYPE=&amp;quot;DB&amp;quot;&lt;br /&gt;
MI_CONNECTOR=FIFO:/tmp/opensips_fifo&lt;br /&gt;
# VERIFY_ACL=1&lt;br /&gt;
# ACL_GROUPS=&amp;quot;local ld int voicemail free-pstn&amp;quot;&lt;br /&gt;
# VERBOSE=1&lt;br /&gt;
# STORE_PLAINTEXT_PW=0&lt;br /&gt;
# NOHLPRINT=1&lt;br /&gt;
PID_FILE=/var/run/opensips/opensips.pid&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Criando o banco de dados===&lt;br /&gt;
Agora que temos nosso arquivo configurado vamos fazer a criação do banco de dados, execute o comando abaixo.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
opensipsdbctl create opensips&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O sistema irá lhe perguntar algumas coisas, responda Y (sim) para todas para que ele instale todas as tabelas, não usaremos todas elas, mas desta forma você fica com praticamente tudo criado para o caso de uma expansão dos recursos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Instalando o RTP Proxy===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /usr/src/&lt;br /&gt;
wget -c http://b2bua.org/chrome/site/rtpproxy-1.2.1.tar.gz&lt;br /&gt;
tar -xzvf rtpproxy-1.2.1.tar.gz&lt;br /&gt;
cd rtpproxy-1.2.1&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
groupadd rtpproxy&lt;br /&gt;
useradd -d /var/run/rtpproxy -s /bin/true -g rtpproxy rtpproxy&lt;br /&gt;
mkdir /var/log/rtpproxy&lt;br /&gt;
mkdir /var/run/rtpproxy&lt;br /&gt;
chown -R rtpproxy.rtpproxy /var/log/rtpproxy&lt;br /&gt;
chown -R rtpproxy.rtpproxy /var/run/rtpproxy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Arquivo de inicialização====&lt;br /&gt;
'''/etc/init.d/rtpproxy'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Este script e de autoria de Mike Tesliuk&lt;br /&gt;
# qualquer falha no mesmo por favor informe &lt;br /&gt;
# atraves do email mike (a) tesliuk.com&lt;br /&gt;
#&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          rtpproxy&lt;br /&gt;
# Required-Start:    $syslog $network $local_fs $time&lt;br /&gt;
# Required-Stop:     $syslog $network $local_fs&lt;br /&gt;
# Default-Start:     2 3 4 5&lt;br /&gt;
# Default-Stop:      0 1 6&lt;br /&gt;
# Short-Description: Start the RTPPROXY server&lt;br /&gt;
# Description:       Start the RTPPROXY server&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
&lt;br /&gt;
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin&lt;br /&gt;
USELOG=1&lt;br /&gt;
USER=rtpproxy&lt;br /&gt;
# Altere o ip abaixo para o ip de seu sistema&lt;br /&gt;
IPADDR=&amp;quot;10.254.254.6&amp;quot;&lt;br /&gt;
&lt;br /&gt;
. /lib/lsb/init-functions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
start(){&lt;br /&gt;
        echo &amp;quot;Iniciando RTP PROXY &amp;quot;&lt;br /&gt;
        if [ -z $(pidof rtpproxy) ]; then&lt;br /&gt;
                if [ &amp;quot;${USELOG}&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
                        echo &amp;quot;Iniciando com LOG&amp;quot;&lt;br /&gt;
                        /usr/local/bin/rtpproxy -l $IPADDR -s udp:127.0.0.1:7722 -u $USER -F -f d DBUG 2&amp;amp;&amp;gt; /var/log/rtpproxy/rtpproxy.log &amp;amp;&lt;br /&gt;
                else&lt;br /&gt;
                        echo &amp;quot;Iniciando sem LOG&amp;quot;&lt;br /&gt;
                        /usr/local/bin/rtpproxy -l $IPADDR -s udp:127.0.0.1:7722 -u $USER  -F -f d DBUG 2&amp;amp;&amp;gt; /dev/null&lt;br /&gt;
                fi&lt;br /&gt;
&lt;br /&gt;
                if [ -n $(pidof rtpproxy) ]; then&lt;br /&gt;
                        echo &amp;quot;START OK&amp;quot;&lt;br /&gt;
                fi&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Processo ja em execucao&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
stop(){&lt;br /&gt;
&lt;br /&gt;
        if [ -z $(pidof rtpproxy) ]; then&lt;br /&gt;
                echo &amp;quot;Processo nao encontrado&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                kill -9 $(pidof rtpproxy)&lt;br /&gt;
                if [ -n $(pidof rtpproxy) ]; then&lt;br /&gt;
                        echo &amp;quot;STOP OK&amp;quot;&lt;br /&gt;
                else&lt;br /&gt;
                        echo &amp;quot;Falha em realizar stop do servico&amp;quot;&lt;br /&gt;
                fi&lt;br /&gt;
&lt;br /&gt;
        fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
case $1 in&lt;br /&gt;
        start)&lt;br /&gt;
                start&lt;br /&gt;
        ;;&lt;br /&gt;
        stop)&lt;br /&gt;
                stop&lt;br /&gt;
        ;;&lt;br /&gt;
        restart)&lt;br /&gt;
                stop&lt;br /&gt;
                start&lt;br /&gt;
&lt;br /&gt;
        ;;&lt;br /&gt;
        *)&lt;br /&gt;
                echo &amp;quot;Utilize: stop | start | restart&amp;quot;&lt;br /&gt;
        ;;&lt;br /&gt;
esac&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vamos dar permissao e colocar na inicialização&lt;br /&gt;
 chmod +x /etc/init.d/rtpproxy &lt;br /&gt;
 update-rc.d rtpproxy defaults&lt;br /&gt;
 /etc/init.d/rtpproxy start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Criando o arquivo opensips.cfg===&lt;br /&gt;
O arquivo opensips.cfg é a onde a coisa toda acontece para o opensips, claro que ele dependerá de informações que estarão no banco de dados, mas é onde criamos todas as nossas rotas e validações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
####### Global Parameters #########&lt;br /&gt;
debug=3&lt;br /&gt;
log_stderror=no&lt;br /&gt;
log_facility=LOG_LOCAL0&lt;br /&gt;
&lt;br /&gt;
fork=yes&lt;br /&gt;
children=4&lt;br /&gt;
&lt;br /&gt;
/* Descomente as linhas abaixo para ativar o debug */&lt;br /&gt;
#debug=7&lt;br /&gt;
#fork=no&lt;br /&gt;
#log_stderror=yes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Comente a linha abaixo para ativar a descoberta automatica de enderecos locais&lt;br /&gt;
 , isso significa que o sistema ira verificar todos os ips ativos e hosts e entao ativara&lt;br /&gt;
 o protocolo para todos eles */ &lt;br /&gt;
auto_aliases=no&lt;br /&gt;
&lt;br /&gt;
/* Defina aqui o ip a ser utilizado */&lt;br /&gt;
listen=udp:10.254.254.6:5060   # Altere este IP para o seu ambiente&lt;br /&gt;
&lt;br /&gt;
/* Nao usaremos sip por tcp nem tls neste script */&lt;br /&gt;
disable_tcp=yes&lt;br /&gt;
&lt;br /&gt;
disable_tls=yes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Secao de modulos ########&lt;br /&gt;
&lt;br /&gt;
#set module path&lt;br /&gt;
mpath=&amp;quot;/usr//lib64/opensips/modules/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;signaling.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;sl.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;tm.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;fr_timer&amp;quot;, 5)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;fr_inv_timer&amp;quot;, 30)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;restart_fr_on_each_reply&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;rr.so&amp;quot;&lt;br /&gt;
/* do not append from tag to the RR (no need for this script) */&lt;br /&gt;
modparam(&amp;quot;rr&amp;quot;, &amp;quot;append_fromtag&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;maxfwd.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;sipmsgops.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;mi_fifo.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;mi_fifo&amp;quot;, &amp;quot;fifo_name&amp;quot;, &amp;quot;/tmp/opensips_fifo&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;mi_fifo&amp;quot;, &amp;quot;fifo_mode&amp;quot;, 0666)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;db_mysql.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;uri.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;uri&amp;quot;, &amp;quot;use_uri_table&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;usrloc.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;nat_bflag&amp;quot;, &amp;quot;FLB_NATB&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;db_mode&amp;quot;,   2)&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;db_url&amp;quot;,  &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;registrar.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;registrar&amp;quot;, &amp;quot;tcp_persistent_flag&amp;quot;, &amp;quot;TCP_PERSISTENT&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
/* Descomente a linha abaixo para nao permitir mais de 10 contatos por conta */&lt;br /&gt;
#modparam(&amp;quot;registrar&amp;quot;, &amp;quot;max_contacts&amp;quot;, 10)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;acc.so&amp;quot;&lt;br /&gt;
/* Quais eventos deverao ser registrados ? */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;early_media&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;report_cancels&amp;quot;, 0)&lt;br /&gt;
/* por padrao nos nao ajustamos a direcao em requisicoes sequencias, &lt;br /&gt;
 se voce deseja usar este recurso tenha certeza de ativar o &amp;quot;appen_fromtag&amp;quot; &lt;br /&gt;
 para o modulo &amp;quot;rr&amp;quot; */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;detect_direction&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;failed_transaction_flag&amp;quot;, &amp;quot;FLT_ACCFAILED&amp;quot;)&lt;br /&gt;
/* Gatilhos para accounting  (flags) */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_flag&amp;quot;, &amp;quot;FLT_ACC&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_missed_flag&amp;quot;, &amp;quot;FLT_ACCMISSED&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_extra&amp;quot;, &lt;br /&gt;
	&amp;quot;src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_flag&amp;quot;, &amp;quot;FLT_ACC&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_missed_flag&amp;quot;, &amp;quot;FLT_ACCMISSED&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_extra&amp;quot;, &amp;quot;src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;auth.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;auth_db.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;db_url&amp;quot;,  &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;calculate_ha1&amp;quot;, yes)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;password_column&amp;quot;, &amp;quot;password&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;load_credentials&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;permissions.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;permissions&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;alias_db.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;alias_db&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;presence.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;presence&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#loadmodule &amp;quot;presence_xml.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;dialog.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;db_mode&amp;quot;, 2)&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;db_url&amp;quot;,&amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;dlg_match_mode&amp;quot;, 1)&lt;br /&gt;
#modparam(&amp;quot;dialog&amp;quot;, &amp;quot;default_timeout&amp;quot;, 60)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;siptrace.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;trace_flag&amp;quot;, 22)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;traced_user_avp&amp;quot;, &amp;quot;$avp(s:traceuser)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;nathelper.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;natping_interval&amp;quot;, 30)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;ping_nated_only&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;sipping_bflag&amp;quot;, &amp;quot;FLB_NATSIPPING&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;sipping_from&amp;quot;, &amp;quot;sip:pinger@10.254.254.6&amp;quot;) # Altere o ip para o ip do servidor&lt;br /&gt;
modparam(&amp;quot;nathelper|registrar&amp;quot;, &amp;quot;received_avp&amp;quot;, &amp;quot;$avp(RECEIVED)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;rtpproxy.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;rtpproxy&amp;quot;, &amp;quot;rtpproxy_sock&amp;quot;, &amp;quot;udp:127.0.0.1:7722&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Logica de roteamento ########&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route {&lt;br /&gt;
&lt;br /&gt;
	if (!mf_process_maxfwd_header(&amp;quot;3&amp;quot;)) {&lt;br /&gt;
                send_reply(&amp;quot;483&amp;quot;,&amp;quot;looping&amp;quot;);&lt;br /&gt;
                exit;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;REQUISICAO RECEBIDA, ENVIANDO PARA REQINIT&amp;quot;);&lt;br /&gt;
	# Checagem inicial por requisicao&lt;br /&gt;
	route(REQINIT);&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA NAT&amp;quot;);&lt;br /&gt;
	# Deteccao de nat&lt;br /&gt;
	route(NAT);&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA WITHINDLG&amp;quot;);&lt;br /&gt;
	# Gerenciando requisicaoes com dialog&lt;br /&gt;
	route(WITHINDLG);&lt;br /&gt;
&lt;br /&gt;
	# Manipulando requisicoes iniciais (nao consta To tag)&lt;br /&gt;
	&lt;br /&gt;
	# Processando CANCEL&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;CANCEL&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD CANCEL&amp;quot;);&lt;br /&gt;
		if(t_check_trans()){&lt;br /&gt;
			t_relay();&lt;br /&gt;
		}&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	t_check_trans();&lt;br /&gt;
&lt;br /&gt;
	# Enviando para autenticacao&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA AUTENTICACAO&amp;quot;);&lt;br /&gt;
	route(AUTH);&lt;br /&gt;
&lt;br /&gt;
	# gravando rota para formacao dos dialogs (caso sejam roteados)&lt;br /&gt;
	# removemos qualquer cabecalho de rota pre carregado&lt;br /&gt;
	remove_hf(&amp;quot;Route&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE|SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD INVITE OU SIBSCRIBE&amp;quot;);&lt;br /&gt;
		record_route();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Contabilizando (acc) INVITES&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD INVITE, FAZENDOA ACC&amp;quot;);&lt;br /&gt;
		setflag(FLT_ACC);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Enviando chamada para destinos externos&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA SIPOUT&amp;quot;);&lt;br /&gt;
	route(SIPOUT);&lt;br /&gt;
&lt;br /&gt;
	# Requisicoes para dominio local&lt;br /&gt;
	&lt;br /&gt;
	# Roteando requisicoes de PRESENCE&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA PRESENCE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	route(PRESENCE);&lt;br /&gt;
&lt;br /&gt;
	# Gerenciando pedidos de registro&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA REGISTRAR&amp;quot;);	&lt;br /&gt;
	route(REGISTRAR);&lt;br /&gt;
&lt;br /&gt;
	if($ru==&amp;quot;&amp;quot;){&lt;br /&gt;
		xlog(&amp;quot;ru --&amp;gt; vazio&amp;quot;);&lt;br /&gt;
		# Requisicao sem usuario na RURI&lt;br /&gt;
		sl_send_reply(&amp;quot;484&amp;quot;, &amp;quot;Address Incomplete&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Enviando requisicao para PSTN&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA PSTN&amp;quot;);&lt;br /&gt;
	route(PSTN);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	# Salvando informacao de quem originou a chamad&lt;br /&gt;
	$avp(callee)=$rU;&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA DISPATCH PSTN&amp;quot;);&lt;br /&gt;
	route(FSDISPATCH);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	# Servico de localizacao de usuario&lt;br /&gt;
	route(LOCATION);&lt;br /&gt;
&lt;br /&gt;
	# Efetuando o relay (encaminhamento)&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[RELAY] {&lt;br /&gt;
	if(check_route_param(&amp;quot;nat=yes&amp;quot;)){&lt;br /&gt;
		setbflag(FLB_NATB);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(isflagset(FLT_NATS) || isbflagset(FLB_NATB)){&lt;br /&gt;
		#route(RTPPROXY);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
#	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
#		t_on_reply(&amp;quot;REPLY_ONE&amp;quot;);&lt;br /&gt;
#		t_on_failure(&amp;quot;FAIL_ONE&amp;quot;);&lt;br /&gt;
#	}&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;AQUI TENTAMOS ENVIAR A CHAMADA $fU $tU&amp;quot;);&lt;br /&gt;
	if(!t_relay()){&lt;br /&gt;
		xlog(&amp;quot;FALHA EM ENVIAR A CHAMADA, NAO FOI POSSIVEL FAZER O RELAY&amp;quot;);&lt;br /&gt;
		sl_reply_error();&lt;br /&gt;
	}&lt;br /&gt;
	xlog(&amp;quot;CHAMADA FOI ENVIADA AQUI, QUAL O ERRO ENTAO&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[REQINIT] {&lt;br /&gt;
	if(!mf_process_maxfwd_header(&amp;quot;10&amp;quot;)){&lt;br /&gt;
		sl_send_reply(&amp;quot;483&amp;quot;, &amp;quot;Too Many Hops&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[WITHINDLG] {&lt;br /&gt;
	if(has_totag()){&lt;br /&gt;
		if(loose_route()){&lt;br /&gt;
			if(is_method(&amp;quot;BYE&amp;quot;)){&lt;br /&gt;
				setflag(FLT_ACC);&lt;br /&gt;
				setflag(FLT_ACCFAILED);&lt;br /&gt;
			}&lt;br /&gt;
			route(RELAY);&lt;br /&gt;
		}else{&lt;br /&gt;
			if(is_method(&amp;quot;SUBSCRIBE&amp;quot;) &amp;amp;&amp;amp; uri==myself) {&lt;br /&gt;
				# requisicao de subscribe pre-estabelecida&lt;br /&gt;
				route(PRESENCE);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if(is_method(&amp;quot;ACK&amp;quot;)){&lt;br /&gt;
				if(t_check_trans()){&lt;br /&gt;
					t_relay();&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
			}else{&lt;br /&gt;
				# ACK para transacao nao encontrada, ignoramos...&lt;br /&gt;
				exit;&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			sl_send_reply(&amp;quot;404&amp;quot;, &amp;quot;Not Here&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		}	&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[REGISTRAR] {&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;REGISTER&amp;quot;)){&lt;br /&gt;
		if(isflagset(FLT_NATS)){&lt;br /&gt;
			setbflag(FLB_NATB);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(!save(&amp;quot;location&amp;quot;)){&lt;br /&gt;
			sl_reply_error();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[LOCATION] {&lt;br /&gt;
&lt;br /&gt;
	alias_db_lookup(&amp;quot;dbaliases&amp;quot;);&lt;br /&gt;
	if(!lookup(&amp;quot;location&amp;quot;)){&lt;br /&gt;
		switch($rc) {&lt;br /&gt;
			case -1:&lt;br /&gt;
			case -3:&lt;br /&gt;
				t_newtran();&lt;br /&gt;
				t_reply(&amp;quot;404&amp;quot;,&amp;quot;Not Found&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			case -2:&lt;br /&gt;
				sl_send_reply(&amp;quot;405&amp;quot;, &amp;quot;Method Not Allowed&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		setflag(FLT_ACCMISSED);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[PRESENCE] {&lt;br /&gt;
	if(!is_method(&amp;quot;PUBLISH|SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!t_newtran()){&lt;br /&gt;
		sl_reply_error();&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;PUBLISH&amp;quot;)){&lt;br /&gt;
		handle_publish();&lt;br /&gt;
	}else if(is_method(&amp;quot;SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		handle_subscribe();&lt;br /&gt;
	}&lt;br /&gt;
	exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[AUTH]{&lt;br /&gt;
	xlog(&amp;quot;PEDIDO DE AUTENTICACAO&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;REGISTER&amp;quot;)){&lt;br /&gt;
		# atentica pedidos de registro&lt;br /&gt;
		if(!www_authorize(&amp;quot;&amp;quot;, &amp;quot;subscriber&amp;quot;)){&lt;br /&gt;
			www_challenge(&amp;quot;&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if($au!=$tU){&lt;br /&gt;
			sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
	}else{&lt;br /&gt;
		if(route(FSINBOUND)){&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(check_source_address(&amp;quot;0&amp;quot;)){&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(from_uri==myself){&lt;br /&gt;
			if(!proxy_authorize(&amp;quot;&amp;quot;, &amp;quot;subscriber&amp;quot;)){&lt;br /&gt;
				proxy_challenge(&amp;quot;&amp;quot;,&amp;quot;0&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if(is_method(&amp;quot;PUBLISH&amp;quot;)){&lt;br /&gt;
				if($au!=$tU){&lt;br /&gt;
					sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
			}else{&lt;br /&gt;
				if($au!=$fU){&lt;br /&gt;
					sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			&lt;br /&gt;
			# Validamos (autenticamos) o usuario&lt;br /&gt;
			consume_credentials();&lt;br /&gt;
		}else{&lt;br /&gt;
		&lt;br /&gt;
			# usuario nao e local, vamos negar&lt;br /&gt;
			if(!uri==myself){&lt;br /&gt;
				sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not relaying&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}	&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[NAT] {&lt;br /&gt;
	force_rport();&lt;br /&gt;
	if(nat_uac_test(&amp;quot;19&amp;quot;)){&lt;br /&gt;
		if(method==&amp;quot;REGISTER&amp;quot;){&lt;br /&gt;
			fix_nated_register();&lt;br /&gt;
		}else{&lt;br /&gt;
			fix_nated_contact();&lt;br /&gt;
		}&lt;br /&gt;
		setflag(FLT_NATS);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[RTPPROXY] {&lt;br /&gt;
	if(is_method(&amp;quot;BYE&amp;quot;)){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}else if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		engage_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!has_totag()){&lt;br /&gt;
&lt;br /&gt;
		if(!check_route_param(&amp;quot;nat=yes&amp;quot;)){&lt;br /&gt;
			add_rr_param(&amp;quot;;nat=yes&amp;quot;);&lt;br /&gt;
			xlog(&amp;quot;NAT yes NAO ENCONTRADO&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[SIPOUT]{&lt;br /&gt;
	if(!uri==myself){&lt;br /&gt;
		append_hf(&amp;quot;P-hint: outbound\r\n&amp;quot;);&lt;br /&gt;
		route(RELAY);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[PSTN]{&lt;br /&gt;
        # neste caso apenas para exemplificar um uso simples&lt;br /&gt;
        # vamos fazer o redirecionamento par ao asterisk&lt;br /&gt;
        # realizar a dicagem da chamada&lt;br /&gt;
&lt;br /&gt;
        if(!($rU=~&amp;quot;^(\+|00)[1-9][0-9]{3,20}$&amp;quot;))&lt;br /&gt;
                return;&lt;br /&gt;
&lt;br /&gt;
        ## a regra acima aceita para discagem externa qualquer numero&lt;br /&gt;
        # comecado com 00 ou +&lt;br /&gt;
        #&lt;br /&gt;
&lt;br /&gt;
        if(from_uri!=myself){&lt;br /&gt;
                sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not Allowed&amp;quot;);&lt;br /&gt;
                exit;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $ru = &amp;quot;sip:&amp;quot; + $rU + &amp;quot;@&amp;quot; + &amp;quot;10.254.254.6:5090&amp;quot;;&lt;br /&gt;
        xlog(&amp;quot;NOVO DESTINO: $ru&amp;quot;);&lt;br /&gt;
        route(RELAY);&lt;br /&gt;
        exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[XMLRPC]{&lt;br /&gt;
	# nao vamos implementar esta funcionalidade&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSINBOUND] {&lt;br /&gt;
	# verificar para validar o ip do asterisk:porta&lt;br /&gt;
	# se bater , responder com return 1;&lt;br /&gt;
	if($si==&amp;quot;10.254.254.6&amp;quot; &amp;amp;&amp;amp; $sp==&amp;quot;5090&amp;quot;){&lt;br /&gt;
		return(1);&lt;br /&gt;
	}else{&lt;br /&gt;
		return(-1);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSDISPATCH] {&lt;br /&gt;
&lt;br /&gt;
	if(!is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(route(FSINBOUND)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;CAIMOS NO SWITCH, VAMOS LOCALIZAR O PERFIL DA CHAMADA $rU&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if($rU =~ &amp;quot;^41$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWITCH expressa comeca e termina em 41&amp;quot;);&lt;br /&gt;
			#regra de menu de voicemail, apenas &lt;br /&gt;
			# usuarios autenticados&lt;br /&gt;
			if($au==&amp;quot;&amp;quot;){&lt;br /&gt;
				sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not Allowed&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$rU = &amp;quot;vma-&amp;quot; + $au;&lt;br /&gt;
	}else if($rU =~ &amp;quot;^441[0-9][0-9]$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWTICH OPCA 441XX &amp;quot;);&lt;br /&gt;
			# numero discado comeca com 441 seguido de dois digitos&lt;br /&gt;
			# chamada direta para inbox do voicemail&lt;br /&gt;
			strip(2);&lt;br /&gt;
			route(FSVBOX);&lt;br /&gt;
	}else if($rU =~ &amp;quot;^433[01][0-9][0-9]$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWITCH OPCAO 433[01]XX&amp;quot;);&lt;br /&gt;
			# numero comecado em 443, seguido de 0 ou 1, mais dois digitos&lt;br /&gt;
			# sistema de conferencia&lt;br /&gt;
			strip(2);&lt;br /&gt;
	}else if($rU =~ &amp;quot;^45[0-9]+$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWTICH OPCAO 45X.&amp;quot;);&lt;br /&gt;
			#numero comecado com 45, seguindo de numeros;&lt;br /&gt;
			strip(2);&lt;br /&gt;
	}else{&lt;br /&gt;
			xlog(&amp;quot;OPCAO DEFAULT DO SWITCH&amp;quot;);&lt;br /&gt;
			# usuario offline, enviando para voicemail&lt;br /&gt;
			if(!registered(&amp;quot;location&amp;quot;)){&lt;br /&gt;
				route(FSVBOX);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			# usuario online, fazendo bridging&lt;br /&gt;
			xlog(&amp;quot;USUARIO ESTA ONLINE VAMOS FAZER BRIDGE&amp;quot;);&lt;br /&gt;
			prefix(&amp;quot;kb-&amp;quot;);&lt;br /&gt;
			if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
				t_on_failure(&amp;quot;FAIL_FSVBOX&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
	}&lt;br /&gt;
	route(FSRELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSVBOX]{&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA FSVBOX&amp;quot;);&lt;br /&gt;
	$du = &amp;quot;sip:&amp;quot; + &amp;quot;10.254.254.6&amp;quot; + &amp;quot;:&amp;quot; + &amp;quot;5090&amp;quot;;&lt;br /&gt;
	if($rU =~ &amp;quot;^441[0-9][0-9]&amp;quot;){&lt;br /&gt;
		strip(2);&lt;br /&gt;
	}&lt;br /&gt;
	prefix(&amp;quot;vm-&amp;quot;);&lt;br /&gt;
	if($var(newbranch)==1){&lt;br /&gt;
		append_branch();&lt;br /&gt;
		$var(newbranch)=0;&lt;br /&gt;
	}&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[FSRELAY] {&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA FSRELAY&amp;quot;);&lt;br /&gt;
	$du = &amp;quot;sip:&amp;quot; + &amp;quot;10.254.254.6&amp;quot; + &amp;quot;:&amp;quot; + &amp;quot;5090&amp;quot;;&lt;br /&gt;
	if($var(newbranch)==1){&lt;br /&gt;
		append_branch();&lt;br /&gt;
		$var(newbranch)=0;&lt;br /&gt;
	}&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
branch_route[BRANCH_ONE]{&lt;br /&gt;
	xlog(&amp;quot;new branch at $ru&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
onreply_route[REPLY_ONE]{&lt;br /&gt;
	xlog(&amp;quot;Incoming reply&amp;quot;);&lt;br /&gt;
	if((isflagset(FLT_NATS) || isbflagset(FLB_NATB) &amp;amp;&amp;amp; status =~ &amp;quot;(183)|(2[0-9][0-9])&amp;quot;)){&lt;br /&gt;
		#rtpproxy_offer();&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	if(isbflagset(FLB_NATB)){&lt;br /&gt;
		fix_nated_contact();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
failure_route[FAIL_ONE]{&lt;br /&gt;
	xlog(&amp;quot;FAILURE ROUTE FAIL_ONE&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;) &amp;amp;&amp;amp; (isbflagset(FLB_NATB) || isflagset(FLT_NATS))){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_was_cancelled()){&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
failure_route[FAIL_FSVBOX]{&lt;br /&gt;
	xlog(&amp;quot;FAILURE ROUTE FAIL_FSVBOX&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;) &amp;amp;&amp;amp; (isbflagset(FLB_NATB) || isflagset(FLT_NATS))){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_was_cancelled()){&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_check_status(&amp;quot;486|408|480&amp;quot;)){&lt;br /&gt;
		$rU = $avp(callee);&lt;br /&gt;
		$var(newbranch) = 1;&lt;br /&gt;
		route(FSVBOX);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testes com Opensips (registro)==&lt;br /&gt;
&lt;br /&gt;
Antes de podermos testar precisamos iniciar o serviço, no momento estamos com ele operando em modo debug, então a inicialização deve ser realizada com o comando abaixo&lt;br /&gt;
 /etc/init.d/opensips debug&lt;br /&gt;
&lt;br /&gt;
Abra uma nova sessão no servidor e então vamos criar os usuários&lt;br /&gt;
 opensipsctl add 101 101&lt;br /&gt;
 opensipsctl add 102 102&lt;br /&gt;
 opensipsctl add 103 103&lt;br /&gt;
&lt;br /&gt;
usuario 101 com senha 101 e assim por diante&lt;br /&gt;
&lt;br /&gt;
Faça a onexão com seu softphone, aqui para testes utilizei o jitsi e o zoiper, neste momento vamos apenas fazer o registro do usuário para testar a autenticação, se você tentar realizar uma discagem não funcionará pois neste caso o processo depende do Asterisk que ainda não está configurado, vamos dar inicio nesta configuração agora.&lt;br /&gt;
&lt;br /&gt;
==Asterisk==&lt;br /&gt;
Não vamos dar muitos detalhes da instalação do asterisk aqui, a ideia é simplesmente ter o mesmo funcionando da forma que necessitamos.&lt;br /&gt;
 apt-get install asterisk&lt;br /&gt;
&lt;br /&gt;
Após a instalação , abra o arquivo /etc/asterisk/sip.conf, localize a linha '''udpbindaddr=0.0.0.0''' e altere para '''udpbindaddr=0.0.0.0:5090'''  , depois ao fim do arquivo adicione.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[opensips]&lt;br /&gt;
type=peer&lt;br /&gt;
host=10.254.254.6&lt;br /&gt;
port=5060&lt;br /&gt;
qualify=yes&lt;br /&gt;
context=opensips&lt;br /&gt;
insecure=port,invite&lt;br /&gt;
canreinvite=no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agora abra o arquivo '''/etc/asterisk/extensions.conf''' , crie no fim do arquivo a seguinte entrada.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[opensips]&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _kb-1XX,1,NoOp(CHAMADA INTERNA - FAZER BRIDGE - ${CALLERID(num)} ${EXTEN:3})&lt;br /&gt;
same =&amp;gt; n,Dial(SIP/opensips/${EXTEN:3})&lt;br /&gt;
same =&amp;gt; n,Goto(opensips,vm-${EXTEN:3},1)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _vm-1XX,1,NoOp(CHAMADA PARA VOICEMAIL)&lt;br /&gt;
same =&amp;gt; n,Voicemail(${EXTEN:3}@default)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _vma-1XX,1,NoOp(CHAMADA PARA VOICEMAIL - ADMINISTRATIVO)&lt;br /&gt;
same =&amp;gt; n,VoicemailMain(${EXTEN:4}@default)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _3[01]XX,1,NoOp(CHAMADA PARA CONFERENCIA)&lt;br /&gt;
same =&amp;gt; n,Answer()&lt;br /&gt;
same =&amp;gt; n,ConfBridge(${EXTEN},cM1)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _00.,1,NoOp(CHAMADA PARA PSTN)&lt;br /&gt;
same =&amp;gt; n,Wait(2)&lt;br /&gt;
same =&amp;gt; n,Answer()&lt;br /&gt;
same =&amp;gt; n,Wait(1)&lt;br /&gt;
same =&amp;gt; n,PlayBack(tt-monkeys)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; h,1,Hangup()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente precisamos criar as entradas do voicemail, para isso altere o arquivo '''/etc/asterisk/voicemail.conf''' localize o contexto '''[default]''' e então adicione as entradas para seu voicemail, segue dois exemplos abaixo.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
101 =&amp;gt; 123123,Mike Tesliuk&lt;br /&gt;
102 =&amp;gt; 123123,Mike Tesliuk 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Feito isso, faça um restart no asterisk&lt;br /&gt;
 /etc/init.d/asterisk restart&lt;br /&gt;
&lt;br /&gt;
Agora você ja poderá fazer os testes, basicamente criamos as seguintes situações para serem testadas.&lt;br /&gt;
&lt;br /&gt;
*1 Autenticação de usuários&lt;br /&gt;
*2 Chamada entre usuários&lt;br /&gt;
*3 Encaminhamento para caixa postal&lt;br /&gt;
*4 Acesso a caixa postal&lt;br /&gt;
*5 Acesso a conferência&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPs_e_Asterisk&amp;diff=1527</id>
		<title>OpenSIPs e Asterisk</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPs_e_Asterisk&amp;diff=1527"/>
		<updated>2021-04-15T22:55:27Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Precisando de recursos de númeração para fazer seus testes ? contrate conosco em [http://www.brdvoz.com.br]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color: red;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;font color=white&amp;gt; Falta realizar os ajustes / testes para o NAT no mais esta tudo funcionado adequadamente a principio &amp;lt;/font&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este tutorial é baseado em um tutorial similar porém utilizando Kamailio e Freeswtich, se quiser verificar o tutorial original acesse http://kb.asipto.com/freeswitch:kamailio-3.1.x-freeswitch-1.0.6d-sbc.&lt;br /&gt;
&lt;br /&gt;
Para esta implementação utilizamos Debian 7.0 amd64 , OpenSIPS 1.9 e Asterisk 1.8.23 &lt;br /&gt;
&lt;br /&gt;
==Funcionalidades==&lt;br /&gt;
Este tutorial tem por objetivo atingir as seguintes funcionalidades.&lt;br /&gt;
*Autenticação de usuário&lt;br /&gt;
*Registro de usuário&lt;br /&gt;
*Localização de usuário (encaminhamento de chamadas)&lt;br /&gt;
*Roteamento de chamadas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Através do Asterisk estenderemos estas funcionalidades agregando.&lt;br /&gt;
*Correio de voz (Voicemail)&lt;br /&gt;
*Conferencia &lt;br /&gt;
*SBC ( Pode ser utilizado para transcoding, esconder topologia, play de mensagens e tarifação )&lt;br /&gt;
*Outros serviços de media (Anuncios, Ura's e coisas do tipo)&lt;br /&gt;
&lt;br /&gt;
==Definições==&lt;br /&gt;
Para um melhor entendimento da solução vamos expor aqui algumas definições de nosso sistema.&lt;br /&gt;
*Usuários locais terão ramais com 3 digitos (ex: 101, 102, 103)&lt;br /&gt;
*Identidade do correio de voz será o mesmo do ramal&lt;br /&gt;
*Serviços de media (acesso a voicemail e outros) receberão rotas de 4 digitos&lt;br /&gt;
*Opensips e Asterisk utilizarão o mesmo servidor (Neste caso IP: 10.254.254.6)&lt;br /&gt;
*Os serviços rodarão nas portas 5060 (opensips) , 5090 (Asterisk)&lt;br /&gt;
&lt;br /&gt;
==Funcionamento==&lt;br /&gt;
A autenticação do usuário será realizada pelo OpenSIPs, quando uma chamada é autenticada então ela serguirá:&lt;br /&gt;
*Se o usuário de destino não está online a chamada será enviada para o Asterisk para função de correio de voz&lt;br /&gt;
*Se o usuário está online a chamada será encaminhada para o Asterisk, dest forma é possivel acionar funcionalidades como anuncios, definição de tempo de chamada, forçar codecs e outras funcionalidades.&lt;br /&gt;
*Asterisk envia a chamada novamente para o OpenSIPs que verificará no location e entregará a chamada para o usuário.&lt;br /&gt;
*Se a chamada não for atendida o Opensips irá re-encaminhar para o Asterisk direcionando para função de voicemail&lt;br /&gt;
&lt;br /&gt;
==OpenSIPs==&lt;br /&gt;
Vamos iniciar o processo de instalação com o OpenSIPs, siga os procedimentos abaixo para evitar qualquer dificuldade.&lt;br /&gt;
&lt;br /&gt;
===Dependencias===&lt;br /&gt;
Execute o comando abaixo para instalar todas as dependencias necessárias&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install gcc make libncurses5-dev libnewt-dev libxml2-dev unixodbc \ &lt;br /&gt;
unixodbc-dev libmysqlclient15-dev libxmlrpc-c3-dev libexpat1-dev zlib1g-dev \ &lt;br /&gt;
m4 bison flex libpcre3-dev mysql-server vim apache2-mpm-prefork libapache2-mod-php5 \&lt;br /&gt;
 php5-mysql php5-xmlrpc php-pear  ngrep g++ libjpeg62-dev libssl-dev &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Durante a instalação o sistema irá lhe perguntar a senha de root para o servidor MySQL é importante que você se lembre da mesma posteriormente pois utilizaremos a mesma.&lt;br /&gt;
&lt;br /&gt;
===Compilando o OpenSIPs===&lt;br /&gt;
Para manter um padrão onde os dados estao vamos utilizar o diretório /usr/src/ para o download de código fonte.&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src/&lt;br /&gt;
 wget -c http://opensips.org/pub/opensips/1.9.1/src/opensips-1.9.1_src.tar.gz&lt;br /&gt;
 tar -xzvf opensips-1.9.1_src.tar.gz&lt;br /&gt;
 cd opensips-1.9.1-tls/&lt;br /&gt;
 make menuconfig&lt;br /&gt;
&lt;br /&gt;
Neste ponto o sistema irá abrir uma tela com algumas opções para selecionar, Acesse a primeira opção do menu, no submenu acesse a segunda opção ( Configure excluded modules ), selecione os módulos db_mysql , dialplan , mi_xmlrpc , presence e presence_xml&lt;br /&gt;
&lt;br /&gt;
Agora volte ao submenu, e selecione a opção Save Changes, volte para o menu principal e selecione '''Compile and Install OpenSips''' , deixe que o sistema execute suas funções.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ao finalizar a compilação você retornará ao menu, va na opção '''Exit and Save all changes'''&lt;br /&gt;
&lt;br /&gt;
===Preparando a Configuração===&lt;br /&gt;
&lt;br /&gt;
Antes de darmos inicio ao arquivo de configuração, vamos ajustar algumas questões, o opensips instala os arquivos (se voce nao alterar o parametro) em /usr, consequentemente as configurações ficam em /usr/etc , eu por padrão faço um link para o diretório /etc, assim acesso as configurações em /etc/opensips&lt;br /&gt;
&lt;br /&gt;
 ln -s /usr/etc/opensips /etc/&lt;br /&gt;
&lt;br /&gt;
No caso do debian o script de inicialização utiliza um arquivo extra de configuração&lt;br /&gt;
 cp packaging/debian/opensips.default /etc/default/opensips&lt;br /&gt;
&lt;br /&gt;
Para o script de inicialização execute o comando abaixo&lt;br /&gt;
 cp packaging/debian/opensips.init /etc/init.d/opensips&lt;br /&gt;
 chmod +x /etc/init.d/opensips&lt;br /&gt;
 update-rc.d opensips defaults&lt;br /&gt;
&lt;br /&gt;
Edite o arquivo /etc/default/opensips , a altere o parametro '''RUN_OPENSIPS''' para yes&lt;br /&gt;
&lt;br /&gt;
Você pode notar que no arquivo é mensionado o usuário de execução do opensips como opensips, então vamos ter de criar este usuário ( e grupo )&lt;br /&gt;
&lt;br /&gt;
 groupadd opensips&lt;br /&gt;
 mkdir /var/run/opensips&lt;br /&gt;
 useradd -d /var/run/opensips/ -s /bin/false -g opensips opensips&lt;br /&gt;
 chown -R opensips.opensips /var/run/opensips&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Configurando o opensipsctl===&lt;br /&gt;
O opensipsctl (e opensipsdbctl) utilizam o arquivo de configuração /etc/opensips/opensipsctlrc, abaixo segue o conteúdo do arquivo. (Sugiro que você faça um backup dos arquivos originais para ter uma copia, existem parametros que você pode estudar depois).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DBENGINE=MYSQL&lt;br /&gt;
DBHOST=localhost&lt;br /&gt;
DBNAME=opensips&lt;br /&gt;
DBRWUSER=opensips&lt;br /&gt;
DBRWPW=&amp;quot;opensipsrw&amp;quot;&lt;br /&gt;
SIP_DOMAIN=10.254.254.6  ### caso voce esteja usando outro ip altere aqui&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DBROOTUSER=&amp;quot;root&amp;quot;&lt;br /&gt;
INSTALL_EXTRA_TABLES=ask&lt;br /&gt;
ALIASES_TYPE=&amp;quot;DB&amp;quot;&lt;br /&gt;
MI_CONNECTOR=FIFO:/tmp/opensips_fifo&lt;br /&gt;
# VERIFY_ACL=1&lt;br /&gt;
# ACL_GROUPS=&amp;quot;local ld int voicemail free-pstn&amp;quot;&lt;br /&gt;
# VERBOSE=1&lt;br /&gt;
# STORE_PLAINTEXT_PW=0&lt;br /&gt;
# NOHLPRINT=1&lt;br /&gt;
PID_FILE=/var/run/opensips/opensips.pid&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Criando o banco de dados===&lt;br /&gt;
Agora que temos nosso arquivo configurado vamos fazer a criação do banco de dados, execute o comando abaixo.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
opensipsdbctl create opensips&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O sistema irá lhe perguntar algumas coisas, responda Y (sim) para todas para que ele instale todas as tabelas, não usaremos todas elas, mas desta forma você fica com praticamente tudo criado para o caso de uma expansão dos recursos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Instalando o RTP Proxy===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /usr/src/&lt;br /&gt;
wget -c http://b2bua.org/chrome/site/rtpproxy-1.2.1.tar.gz&lt;br /&gt;
tar -xzvf rtpproxy-1.2.1.tar.gz&lt;br /&gt;
cd rtpproxy-1.2.1&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
groupadd rtpproxy&lt;br /&gt;
useradd -d /var/run/rtpproxy -s /bin/true -g rtpproxy rtpproxy&lt;br /&gt;
mkdir /var/log/rtpproxy&lt;br /&gt;
mkdir /var/run/rtpproxy&lt;br /&gt;
chown -R rtpproxy.rtpproxy /var/log/rtpproxy&lt;br /&gt;
chown -R rtpproxy.rtpproxy /var/run/rtpproxy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Arquivo de inicialização====&lt;br /&gt;
'''/etc/init.d/rtpproxy'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Este script e de autoria de Mike Tesliuk&lt;br /&gt;
# qualquer falha no mesmo por favor informe &lt;br /&gt;
# atraves do email mike (a) tesliuk.com&lt;br /&gt;
#&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          rtpproxy&lt;br /&gt;
# Required-Start:    $syslog $network $local_fs $time&lt;br /&gt;
# Required-Stop:     $syslog $network $local_fs&lt;br /&gt;
# Default-Start:     2 3 4 5&lt;br /&gt;
# Default-Stop:      0 1 6&lt;br /&gt;
# Short-Description: Start the RTPPROXY server&lt;br /&gt;
# Description:       Start the RTPPROXY server&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
&lt;br /&gt;
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin&lt;br /&gt;
USELOG=1&lt;br /&gt;
USER=rtpproxy&lt;br /&gt;
# Altere o ip abaixo para o ip de seu sistema&lt;br /&gt;
IPADDR=&amp;quot;10.254.254.6&amp;quot;&lt;br /&gt;
&lt;br /&gt;
. /lib/lsb/init-functions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
start(){&lt;br /&gt;
        echo &amp;quot;Iniciando RTP PROXY &amp;quot;&lt;br /&gt;
        if [ -z $(pidof rtpproxy) ]; then&lt;br /&gt;
                if [ &amp;quot;${USELOG}&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
                        echo &amp;quot;Iniciando com LOG&amp;quot;&lt;br /&gt;
                        /usr/local/bin/rtpproxy -l $IPADDR -s udp:127.0.0.1:7722 -u $USER -F -f d DBUG 2&amp;amp;&amp;gt; /var/log/rtpproxy/rtpproxy.log &amp;amp;&lt;br /&gt;
                else&lt;br /&gt;
                        echo &amp;quot;Iniciando sem LOG&amp;quot;&lt;br /&gt;
                        /usr/local/bin/rtpproxy -l $IPADDR -s udp:127.0.0.1:7722 -u $USER  -F -f d DBUG 2&amp;amp;&amp;gt; /dev/null&lt;br /&gt;
                fi&lt;br /&gt;
&lt;br /&gt;
                if [ -n $(pidof rtpproxy) ]; then&lt;br /&gt;
                        echo &amp;quot;START OK&amp;quot;&lt;br /&gt;
                fi&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Processo ja em execucao&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
stop(){&lt;br /&gt;
&lt;br /&gt;
        if [ -z $(pidof rtpproxy) ]; then&lt;br /&gt;
                echo &amp;quot;Processo nao encontrado&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                kill -9 $(pidof rtpproxy)&lt;br /&gt;
                if [ -n $(pidof rtpproxy) ]; then&lt;br /&gt;
                        echo &amp;quot;STOP OK&amp;quot;&lt;br /&gt;
                else&lt;br /&gt;
                        echo &amp;quot;Falha em realizar stop do servico&amp;quot;&lt;br /&gt;
                fi&lt;br /&gt;
&lt;br /&gt;
        fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
case $1 in&lt;br /&gt;
        start)&lt;br /&gt;
                start&lt;br /&gt;
        ;;&lt;br /&gt;
        stop)&lt;br /&gt;
                stop&lt;br /&gt;
        ;;&lt;br /&gt;
        restart)&lt;br /&gt;
                stop&lt;br /&gt;
                start&lt;br /&gt;
&lt;br /&gt;
        ;;&lt;br /&gt;
        *)&lt;br /&gt;
                echo &amp;quot;Utilize: stop | start | restart&amp;quot;&lt;br /&gt;
        ;;&lt;br /&gt;
esac&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vamos dar permissao e colocar na inicialização&lt;br /&gt;
 chmod +x /etc/init.d/rtpproxy &lt;br /&gt;
 update-rc.d rtpproxy defaults&lt;br /&gt;
 /etc/init.d/rtpproxy start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Criando o arquivo opensips.cfg===&lt;br /&gt;
O arquivo opensips.cfg é a onde a coisa toda acontece para o opensips, claro que ele dependerá de informações que estarão no banco de dados, mas é onde criamos todas as nossas rotas e validações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
####### Global Parameters #########&lt;br /&gt;
debug=3&lt;br /&gt;
log_stderror=no&lt;br /&gt;
log_facility=LOG_LOCAL0&lt;br /&gt;
&lt;br /&gt;
fork=yes&lt;br /&gt;
children=4&lt;br /&gt;
&lt;br /&gt;
/* Descomente as linhas abaixo para ativar o debug */&lt;br /&gt;
#debug=7&lt;br /&gt;
#fork=no&lt;br /&gt;
#log_stderror=yes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Comente a linha abaixo para ativar a descoberta automatica de enderecos locais&lt;br /&gt;
 , isso significa que o sistema ira verificar todos os ips ativos e hosts e entao ativara&lt;br /&gt;
 o protocolo para todos eles */ &lt;br /&gt;
auto_aliases=no&lt;br /&gt;
&lt;br /&gt;
/* Defina aqui o ip a ser utilizado */&lt;br /&gt;
listen=udp:10.254.254.6:5060   # Altere este IP para o seu ambiente&lt;br /&gt;
&lt;br /&gt;
/* Nao usaremos sip por tcp nem tls neste script */&lt;br /&gt;
disable_tcp=yes&lt;br /&gt;
&lt;br /&gt;
disable_tls=yes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Secao de modulos ########&lt;br /&gt;
&lt;br /&gt;
#set module path&lt;br /&gt;
mpath=&amp;quot;/usr//lib64/opensips/modules/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;signaling.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;sl.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;tm.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;fr_timer&amp;quot;, 5)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;fr_inv_timer&amp;quot;, 30)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;restart_fr_on_each_reply&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;rr.so&amp;quot;&lt;br /&gt;
/* do not append from tag to the RR (no need for this script) */&lt;br /&gt;
modparam(&amp;quot;rr&amp;quot;, &amp;quot;append_fromtag&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;maxfwd.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;sipmsgops.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;mi_fifo.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;mi_fifo&amp;quot;, &amp;quot;fifo_name&amp;quot;, &amp;quot;/tmp/opensips_fifo&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;mi_fifo&amp;quot;, &amp;quot;fifo_mode&amp;quot;, 0666)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;db_mysql.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;uri.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;uri&amp;quot;, &amp;quot;use_uri_table&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;usrloc.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;nat_bflag&amp;quot;, &amp;quot;FLB_NATB&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;db_mode&amp;quot;,   2)&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;db_url&amp;quot;,  &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;registrar.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;registrar&amp;quot;, &amp;quot;tcp_persistent_flag&amp;quot;, &amp;quot;TCP_PERSISTENT&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
/* Descomente a linha abaixo para nao permitir mais de 10 contatos por conta */&lt;br /&gt;
#modparam(&amp;quot;registrar&amp;quot;, &amp;quot;max_contacts&amp;quot;, 10)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;acc.so&amp;quot;&lt;br /&gt;
/* Quais eventos deverao ser registrados ? */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;early_media&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;report_cancels&amp;quot;, 0)&lt;br /&gt;
/* por padrao nos nao ajustamos a direcao em requisicoes sequencias, &lt;br /&gt;
 se voce deseja usar este recurso tenha certeza de ativar o &amp;quot;appen_fromtag&amp;quot; &lt;br /&gt;
 para o modulo &amp;quot;rr&amp;quot; */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;detect_direction&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;failed_transaction_flag&amp;quot;, &amp;quot;FLT_ACCFAILED&amp;quot;)&lt;br /&gt;
/* Gatilhos para accounting  (flags) */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_flag&amp;quot;, &amp;quot;FLT_ACC&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_missed_flag&amp;quot;, &amp;quot;FLT_ACCMISSED&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_extra&amp;quot;, &lt;br /&gt;
	&amp;quot;src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_flag&amp;quot;, &amp;quot;FLT_ACC&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_missed_flag&amp;quot;, &amp;quot;FLT_ACCMISSED&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_extra&amp;quot;, &amp;quot;src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;auth.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;auth_db.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;db_url&amp;quot;,  &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;calculate_ha1&amp;quot;, yes)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;password_column&amp;quot;, &amp;quot;password&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;load_credentials&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;permissions.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;permissions&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;alias_db.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;alias_db&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;presence.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;presence&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#loadmodule &amp;quot;presence_xml.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;dialog.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;db_mode&amp;quot;, 2)&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;db_url&amp;quot;,&amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;dlg_match_mode&amp;quot;, 1)&lt;br /&gt;
#modparam(&amp;quot;dialog&amp;quot;, &amp;quot;default_timeout&amp;quot;, 60)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;siptrace.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;trace_flag&amp;quot;, 22)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;traced_user_avp&amp;quot;, &amp;quot;$avp(s:traceuser)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;nathelper.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;natping_interval&amp;quot;, 30)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;ping_nated_only&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;sipping_bflag&amp;quot;, &amp;quot;FLB_NATSIPPING&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;sipping_from&amp;quot;, &amp;quot;sip:pinger@10.254.254.6&amp;quot;) # Altere o ip para o ip do servidor&lt;br /&gt;
modparam(&amp;quot;nathelper|registrar&amp;quot;, &amp;quot;received_avp&amp;quot;, &amp;quot;$avp(RECEIVED)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;rtpproxy.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;rtpproxy&amp;quot;, &amp;quot;rtpproxy_sock&amp;quot;, &amp;quot;udp:127.0.0.1:7722&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Logica de roteamento ########&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route {&lt;br /&gt;
&lt;br /&gt;
	if (!mf_process_maxfwd_header(&amp;quot;3&amp;quot;)) {&lt;br /&gt;
                send_reply(&amp;quot;483&amp;quot;,&amp;quot;looping&amp;quot;);&lt;br /&gt;
                exit;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;REQUISICAO RECEBIDA, ENVIANDO PARA REQINIT&amp;quot;);&lt;br /&gt;
	# Checagem inicial por requisicao&lt;br /&gt;
	route(REQINIT);&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA NAT&amp;quot;);&lt;br /&gt;
	# Deteccao de nat&lt;br /&gt;
	route(NAT);&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA WITHINDLG&amp;quot;);&lt;br /&gt;
	# Gerenciando requisicaoes com dialog&lt;br /&gt;
	route(WITHINDLG);&lt;br /&gt;
&lt;br /&gt;
	# Manipulando requisicoes iniciais (nao consta To tag)&lt;br /&gt;
	&lt;br /&gt;
	# Processando CANCEL&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;CANCEL&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD CANCEL&amp;quot;);&lt;br /&gt;
		if(t_check_trans()){&lt;br /&gt;
			t_relay();&lt;br /&gt;
		}&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	t_check_trans();&lt;br /&gt;
&lt;br /&gt;
	# Enviando para autenticacao&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA AUTENTICACAO&amp;quot;);&lt;br /&gt;
	route(AUTH);&lt;br /&gt;
&lt;br /&gt;
	# gravando rota para formacao dos dialogs (caso sejam roteados)&lt;br /&gt;
	# removemos qualquer cabecalho de rota pre carregado&lt;br /&gt;
	remove_hf(&amp;quot;Route&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE|SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD INVITE OU SIBSCRIBE&amp;quot;);&lt;br /&gt;
		record_route();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Contabilizando (acc) INVITES&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD INVITE, FAZENDOA ACC&amp;quot;);&lt;br /&gt;
		setflag(FLT_ACC);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Enviando chamada para destinos externos&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA SIPOUT&amp;quot;);&lt;br /&gt;
	route(SIPOUT);&lt;br /&gt;
&lt;br /&gt;
	# Requisicoes para dominio local&lt;br /&gt;
	&lt;br /&gt;
	# Roteando requisicoes de PRESENCE&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA PRESENCE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	route(PRESENCE);&lt;br /&gt;
&lt;br /&gt;
	# Gerenciando pedidos de registro&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA REGISTRAR&amp;quot;);	&lt;br /&gt;
	route(REGISTRAR);&lt;br /&gt;
&lt;br /&gt;
	if($ru==&amp;quot;&amp;quot;){&lt;br /&gt;
		xlog(&amp;quot;ru --&amp;gt; vazio&amp;quot;);&lt;br /&gt;
		# Requisicao sem usuario na RURI&lt;br /&gt;
		sl_send_reply(&amp;quot;484&amp;quot;, &amp;quot;Address Incomplete&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Enviando requisicao para PSTN&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA PSTN&amp;quot;);&lt;br /&gt;
	route(PSTN);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	# Salvando informacao de quem originou a chamad&lt;br /&gt;
	$avp(callee)=$rU;&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA DISPATCH PSTN&amp;quot;);&lt;br /&gt;
	route(FSDISPATCH);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	# Servico de localizacao de usuario&lt;br /&gt;
	route(LOCATION);&lt;br /&gt;
&lt;br /&gt;
	# Efetuando o relay (encaminhamento)&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[RELAY] {&lt;br /&gt;
	if(check_route_param(&amp;quot;nat=yes&amp;quot;)){&lt;br /&gt;
		setbflag(FLB_NATB);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(isflagset(FLT_NATS) || isbflagset(FLB_NATB)){&lt;br /&gt;
		#route(RTPPROXY);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
#	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
#		t_on_reply(&amp;quot;REPLY_ONE&amp;quot;);&lt;br /&gt;
#		t_on_failure(&amp;quot;FAIL_ONE&amp;quot;);&lt;br /&gt;
#	}&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;AQUI TENTAMOS ENVIAR A CHAMADA $fU $tU&amp;quot;);&lt;br /&gt;
	if(!t_relay()){&lt;br /&gt;
		xlog(&amp;quot;FALHA EM ENVIAR A CHAMADA, NAO FOI POSSIVEL FAZER O RELAY&amp;quot;);&lt;br /&gt;
		sl_reply_error();&lt;br /&gt;
	}&lt;br /&gt;
	xlog(&amp;quot;CHAMADA FOI ENVIADA AQUI, QUAL O ERRO ENTAO&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[REQINIT] {&lt;br /&gt;
	if(!mf_process_maxfwd_header(&amp;quot;10&amp;quot;)){&lt;br /&gt;
		sl_send_reply(&amp;quot;483&amp;quot;, &amp;quot;Too Many Hops&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[WITHINDLG] {&lt;br /&gt;
	if(has_totag()){&lt;br /&gt;
		if(loose_route()){&lt;br /&gt;
			if(is_method(&amp;quot;BYE&amp;quot;)){&lt;br /&gt;
				setflag(FLT_ACC);&lt;br /&gt;
				setflag(FLT_ACCFAILED);&lt;br /&gt;
			}&lt;br /&gt;
			route(RELAY);&lt;br /&gt;
		}else{&lt;br /&gt;
			if(is_method(&amp;quot;SUBSCRIBE&amp;quot;) &amp;amp;&amp;amp; uri==myself) {&lt;br /&gt;
				# requisicao de subscribe pre-estabelecida&lt;br /&gt;
				route(PRESENCE);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if(is_method(&amp;quot;ACK&amp;quot;)){&lt;br /&gt;
				if(t_check_trans()){&lt;br /&gt;
					t_relay();&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
			}else{&lt;br /&gt;
				# ACK para transacao nao encontrada, ignoramos...&lt;br /&gt;
				exit;&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			sl_send_reply(&amp;quot;404&amp;quot;, &amp;quot;Not Here&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		}	&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[REGISTRAR] {&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;REGISTER&amp;quot;)){&lt;br /&gt;
		if(isflagset(FLT_NATS)){&lt;br /&gt;
			setbflag(FLB_NATB);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(!save(&amp;quot;location&amp;quot;)){&lt;br /&gt;
			sl_reply_error();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[LOCATION] {&lt;br /&gt;
&lt;br /&gt;
	alias_db_lookup(&amp;quot;dbaliases&amp;quot;);&lt;br /&gt;
	if(!lookup(&amp;quot;location&amp;quot;)){&lt;br /&gt;
		switch($rc) {&lt;br /&gt;
			case -1:&lt;br /&gt;
			case -3:&lt;br /&gt;
				t_newtran();&lt;br /&gt;
				t_reply(&amp;quot;404&amp;quot;,&amp;quot;Not Found&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			case -2:&lt;br /&gt;
				sl_send_reply(&amp;quot;405&amp;quot;, &amp;quot;Method Not Allowed&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		setflag(FLT_ACCMISSED);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[PRESENCE] {&lt;br /&gt;
	if(!is_method(&amp;quot;PUBLISH|SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!t_newtran()){&lt;br /&gt;
		sl_reply_error();&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;PUBLISH&amp;quot;)){&lt;br /&gt;
		handle_publish();&lt;br /&gt;
	}else if(is_method(&amp;quot;SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		handle_subscribe();&lt;br /&gt;
	}&lt;br /&gt;
	exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[AUTH]{&lt;br /&gt;
	xlog(&amp;quot;PEDIDO DE AUTENTICACAO&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;REGISTER&amp;quot;)){&lt;br /&gt;
		# atentica pedidos de registro&lt;br /&gt;
		if(!www_authorize(&amp;quot;&amp;quot;, &amp;quot;subscriber&amp;quot;)){&lt;br /&gt;
			www_challenge(&amp;quot;&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if($au!=$tU){&lt;br /&gt;
			sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
	}else{&lt;br /&gt;
		if(route(FSINBOUND)){&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(check_source_address(&amp;quot;0&amp;quot;)){&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(from_uri==myself){&lt;br /&gt;
			if(!proxy_authorize(&amp;quot;&amp;quot;, &amp;quot;subscriber&amp;quot;)){&lt;br /&gt;
				proxy_challenge(&amp;quot;&amp;quot;,&amp;quot;0&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if(is_method(&amp;quot;PUBLISH&amp;quot;)){&lt;br /&gt;
				if($au!=$tU){&lt;br /&gt;
					sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
			}else{&lt;br /&gt;
				if($au!=$fU){&lt;br /&gt;
					sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			&lt;br /&gt;
			# Validamos (autenticamos) o usuario&lt;br /&gt;
			consume_credentials();&lt;br /&gt;
		}else{&lt;br /&gt;
		&lt;br /&gt;
			# usuario nao e local, vamos negar&lt;br /&gt;
			if(!uri==myself){&lt;br /&gt;
				sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not relaying&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}	&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[NAT] {&lt;br /&gt;
	force_rport();&lt;br /&gt;
	if(nat_uac_test(&amp;quot;19&amp;quot;)){&lt;br /&gt;
		if(method==&amp;quot;REGISTER&amp;quot;){&lt;br /&gt;
			fix_nated_register();&lt;br /&gt;
		}else{&lt;br /&gt;
			fix_nated_contact();&lt;br /&gt;
		}&lt;br /&gt;
		setflag(FLT_NATS);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[RTPPROXY] {&lt;br /&gt;
	if(is_method(&amp;quot;BYE&amp;quot;)){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}else if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		engage_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!has_totag()){&lt;br /&gt;
&lt;br /&gt;
		if(!check_route_param(&amp;quot;nat=yes&amp;quot;)){&lt;br /&gt;
			add_rr_param(&amp;quot;;nat=yes&amp;quot;);&lt;br /&gt;
			xlog(&amp;quot;NAT yes NAO ENCONTRADO&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[SIPOUT]{&lt;br /&gt;
	if(!uri==myself){&lt;br /&gt;
		append_hf(&amp;quot;P-hint: outbound\r\n&amp;quot;);&lt;br /&gt;
		route(RELAY);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[PSTN]{&lt;br /&gt;
        # neste caso apenas para exemplificar um uso simples&lt;br /&gt;
        # vamos fazer o redirecionamento par ao asterisk&lt;br /&gt;
        # realizar a dicagem da chamada&lt;br /&gt;
&lt;br /&gt;
        if(!($rU=~&amp;quot;^(\+|00)[1-9][0-9]{3,20}$&amp;quot;))&lt;br /&gt;
                return;&lt;br /&gt;
&lt;br /&gt;
        ## a regra acima aceita para discagem externa qualquer numero&lt;br /&gt;
        # comecado com 00 ou +&lt;br /&gt;
        #&lt;br /&gt;
&lt;br /&gt;
        if(from_uri!=myself){&lt;br /&gt;
                sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not Allowed&amp;quot;);&lt;br /&gt;
                exit;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $ru = &amp;quot;sip:&amp;quot; + $rU + &amp;quot;@&amp;quot; + &amp;quot;10.254.254.6:5090&amp;quot;;&lt;br /&gt;
        xlog(&amp;quot;NOVO DESTINO: $ru&amp;quot;);&lt;br /&gt;
        route(RELAY);&lt;br /&gt;
        exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[XMLRPC]{&lt;br /&gt;
	# nao vamos implementar esta funcionalidade&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSINBOUND] {&lt;br /&gt;
	# verificar para validar o ip do asterisk:porta&lt;br /&gt;
	# se bater , responder com return 1;&lt;br /&gt;
	if($si==&amp;quot;10.254.254.6&amp;quot; &amp;amp;&amp;amp; $sp==&amp;quot;5090&amp;quot;){&lt;br /&gt;
		return(1);&lt;br /&gt;
	}else{&lt;br /&gt;
		return(-1);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSDISPATCH] {&lt;br /&gt;
&lt;br /&gt;
	if(!is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(route(FSINBOUND)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;CAIMOS NO SWITCH, VAMOS LOCALIZAR O PERFIL DA CHAMADA $rU&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if($rU =~ &amp;quot;^41$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWITCH expressa comeca e termina em 41&amp;quot;);&lt;br /&gt;
			#regra de menu de voicemail, apenas &lt;br /&gt;
			# usuarios autenticados&lt;br /&gt;
			if($au==&amp;quot;&amp;quot;){&lt;br /&gt;
				sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not Allowed&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$rU = &amp;quot;vma-&amp;quot; + $au;&lt;br /&gt;
	}else if($rU =~ &amp;quot;^441[0-9][0-9]$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWTICH OPCA 441XX &amp;quot;);&lt;br /&gt;
			# numero discado comeca com 441 seguido de dois digitos&lt;br /&gt;
			# chamada direta para inbox do voicemail&lt;br /&gt;
			strip(2);&lt;br /&gt;
			route(FSVBOX);&lt;br /&gt;
	}else if($rU =~ &amp;quot;^433[01][0-9][0-9]$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWITCH OPCAO 433[01]XX&amp;quot;);&lt;br /&gt;
			# numero comecado em 443, seguido de 0 ou 1, mais dois digitos&lt;br /&gt;
			# sistema de conferencia&lt;br /&gt;
			strip(2);&lt;br /&gt;
	}else if($rU =~ &amp;quot;^45[0-9]+$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWTICH OPCAO 45X.&amp;quot;);&lt;br /&gt;
			#numero comecado com 45, seguindo de numeros;&lt;br /&gt;
			strip(2);&lt;br /&gt;
	}else{&lt;br /&gt;
			xlog(&amp;quot;OPCAO DEFAULT DO SWITCH&amp;quot;);&lt;br /&gt;
			# usuario offline, enviando para voicemail&lt;br /&gt;
			if(!registered(&amp;quot;location&amp;quot;)){&lt;br /&gt;
				route(FSVBOX);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			# usuario online, fazendo bridging&lt;br /&gt;
			xlog(&amp;quot;USUARIO ESTA ONLINE VAMOS FAZER BRIDGE&amp;quot;);&lt;br /&gt;
			prefix(&amp;quot;kb-&amp;quot;);&lt;br /&gt;
			if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
				t_on_failure(&amp;quot;FAIL_FSVBOX&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
	}&lt;br /&gt;
	route(FSRELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSVBOX]{&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA FSVBOX&amp;quot;);&lt;br /&gt;
	$du = &amp;quot;sip:&amp;quot; + &amp;quot;10.254.254.6&amp;quot; + &amp;quot;:&amp;quot; + &amp;quot;5090&amp;quot;;&lt;br /&gt;
	if($rU =~ &amp;quot;^441[0-9][0-9]&amp;quot;){&lt;br /&gt;
		strip(2);&lt;br /&gt;
	}&lt;br /&gt;
	prefix(&amp;quot;vm-&amp;quot;);&lt;br /&gt;
	if($var(newbranch)==1){&lt;br /&gt;
		append_branch();&lt;br /&gt;
		$var(newbranch)=0;&lt;br /&gt;
	}&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[FSRELAY] {&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA FSRELAY&amp;quot;);&lt;br /&gt;
	$du = &amp;quot;sip:&amp;quot; + &amp;quot;10.254.254.6&amp;quot; + &amp;quot;:&amp;quot; + &amp;quot;5090&amp;quot;;&lt;br /&gt;
	if($var(newbranch)==1){&lt;br /&gt;
		append_branch();&lt;br /&gt;
		$var(newbranch)=0;&lt;br /&gt;
	}&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
branch_route[BRANCH_ONE]{&lt;br /&gt;
	xlog(&amp;quot;new branch at $ru&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
onreply_route[REPLY_ONE]{&lt;br /&gt;
	xlog(&amp;quot;Incoming reply&amp;quot;);&lt;br /&gt;
	if((isflagset(FLT_NATS) || isbflagset(FLB_NATB) &amp;amp;&amp;amp; status =~ &amp;quot;(183)|(2[0-9][0-9])&amp;quot;)){&lt;br /&gt;
		#rtpproxy_offer();&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	if(isbflagset(FLB_NATB)){&lt;br /&gt;
		fix_nated_contact();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
failure_route[FAIL_ONE]{&lt;br /&gt;
	xlog(&amp;quot;FAILURE ROUTE FAIL_ONE&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;) &amp;amp;&amp;amp; (isbflagset(FLB_NATB) || isflagset(FLT_NATS))){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_was_cancelled()){&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
failure_route[FAIL_FSVBOX]{&lt;br /&gt;
	xlog(&amp;quot;FAILURE ROUTE FAIL_FSVBOX&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;) &amp;amp;&amp;amp; (isbflagset(FLB_NATB) || isflagset(FLT_NATS))){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_was_cancelled()){&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_check_status(&amp;quot;486|408|480&amp;quot;)){&lt;br /&gt;
		$rU = $avp(callee);&lt;br /&gt;
		$var(newbranch) = 1;&lt;br /&gt;
		route(FSVBOX);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testes com Opensips (registro)==&lt;br /&gt;
&lt;br /&gt;
Antes de podermos testar precisamos iniciar o serviço, no momento estamos com ele operando em modo debug, então a inicialização deve ser realizada com o comando abaixo&lt;br /&gt;
 /etc/init.d/opensips debug&lt;br /&gt;
&lt;br /&gt;
Abra uma nova sessão no servidor e então vamos criar os usuários&lt;br /&gt;
 opensipsctl add 101 101&lt;br /&gt;
 opensipsctl add 102 102&lt;br /&gt;
 opensipsctl add 103 103&lt;br /&gt;
&lt;br /&gt;
usuario 101 com senha 101 e assim por diante&lt;br /&gt;
&lt;br /&gt;
Faça a onexão com seu softphone, aqui para testes utilizei o jitsi e o zoiper, neste momento vamos apenas fazer o registro do usuário para testar a autenticação, se você tentar realizar uma discagem não funcionará pois neste caso o processo depende do Asterisk que ainda não está configurado, vamos dar inicio nesta configuração agora.&lt;br /&gt;
&lt;br /&gt;
==Asterisk==&lt;br /&gt;
Não vamos dar muitos detalhes da instalação do asterisk aqui, a ideia é simplesmente ter o mesmo funcionando da forma que necessitamos.&lt;br /&gt;
 apt-get install asterisk&lt;br /&gt;
&lt;br /&gt;
Após a instalação , abra o arquivo /etc/asterisk/sip.conf, localize a linha '''udpbindaddr=0.0.0.0''' e altere para '''udpbindaddr=0.0.0.0:5090'''  , depois ao fim do arquivo adicione.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[opensips]&lt;br /&gt;
type=peer&lt;br /&gt;
host=10.254.254.6&lt;br /&gt;
port=5060&lt;br /&gt;
qualify=yes&lt;br /&gt;
context=opensips&lt;br /&gt;
insecure=port,invite&lt;br /&gt;
canreinvite=no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agora abra o arquivo '''/etc/asterisk/extensions.conf''' , crie no fim do arquivo a seguinte entrada.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[opensips]&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _kb-1XX,1,NoOp(CHAMADA INTERNA - FAZER BRIDGE - ${CALLERID(num)} ${EXTEN:3})&lt;br /&gt;
same =&amp;gt; n,Dial(SIP/opensips/${EXTEN:3})&lt;br /&gt;
same =&amp;gt; n,Goto(opensips,vm-${EXTEN:3},1)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _vm-1XX,1,NoOp(CHAMADA PARA VOICEMAIL)&lt;br /&gt;
same =&amp;gt; n,Voicemail(${EXTEN:3}@default)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _vma-1XX,1,NoOp(CHAMADA PARA VOICEMAIL - ADMINISTRATIVO)&lt;br /&gt;
same =&amp;gt; n,VoicemailMain(${EXTEN:4}@default)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _3[01]XX,1,NoOp(CHAMADA PARA CONFERENCIA)&lt;br /&gt;
same =&amp;gt; n,Answer()&lt;br /&gt;
same =&amp;gt; n,ConfBridge(${EXTEN},cM1)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _00.,1,NoOp(CHAMADA PARA PSTN)&lt;br /&gt;
same =&amp;gt; n,Wait(2)&lt;br /&gt;
same =&amp;gt; n,Answer()&lt;br /&gt;
same =&amp;gt; n,Wait(1)&lt;br /&gt;
same =&amp;gt; n,PlayBack(tt-monkeys)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; h,1,Hangup()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente precisamos criar as entradas do voicemail, para isso altere o arquivo '''/etc/asterisk/voicemail.conf''' localize o contexto '''[default]''' e então adicione as entradas para seu voicemail, segue dois exemplos abaixo.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
101 =&amp;gt; 123123,Mike Tesliuk&lt;br /&gt;
102 =&amp;gt; 123123,Mike Tesliuk 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Feito isso, faça um restart no asterisk&lt;br /&gt;
 /etc/init.d/asterisk restart&lt;br /&gt;
&lt;br /&gt;
Agora você ja poderá fazer os testes, basicamente criamos as seguintes situações para serem testadas.&lt;br /&gt;
&lt;br /&gt;
*1 Autenticação de usuários&lt;br /&gt;
*2 Chamada entre usuários&lt;br /&gt;
*3 Encaminhamento para caixa postal&lt;br /&gt;
*4 Acesso a caixa postal&lt;br /&gt;
*5 Acesso a conferência&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPs_e_Asterisk&amp;diff=1526</id>
		<title>OpenSIPs e Asterisk</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPs_e_Asterisk&amp;diff=1526"/>
		<updated>2021-04-15T22:54:29Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Precisando de recursos de númeração para fazer seus testes ? contrate conosco em [www.brdvoz.com.br]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color: red;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;font color=white&amp;gt; Falta realizar os ajustes / testes para o NAT no mais esta tudo funcionado adequadamente a principio &amp;lt;/font&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este tutorial é baseado em um tutorial similar porém utilizando Kamailio e Freeswtich, se quiser verificar o tutorial original acesse http://kb.asipto.com/freeswitch:kamailio-3.1.x-freeswitch-1.0.6d-sbc.&lt;br /&gt;
&lt;br /&gt;
Para esta implementação utilizamos Debian 7.0 amd64 , OpenSIPS 1.9 e Asterisk 1.8.23 &lt;br /&gt;
&lt;br /&gt;
==Funcionalidades==&lt;br /&gt;
Este tutorial tem por objetivo atingir as seguintes funcionalidades.&lt;br /&gt;
*Autenticação de usuário&lt;br /&gt;
*Registro de usuário&lt;br /&gt;
*Localização de usuário (encaminhamento de chamadas)&lt;br /&gt;
*Roteamento de chamadas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Através do Asterisk estenderemos estas funcionalidades agregando.&lt;br /&gt;
*Correio de voz (Voicemail)&lt;br /&gt;
*Conferencia &lt;br /&gt;
*SBC ( Pode ser utilizado para transcoding, esconder topologia, play de mensagens e tarifação )&lt;br /&gt;
*Outros serviços de media (Anuncios, Ura's e coisas do tipo)&lt;br /&gt;
&lt;br /&gt;
==Definições==&lt;br /&gt;
Para um melhor entendimento da solução vamos expor aqui algumas definições de nosso sistema.&lt;br /&gt;
*Usuários locais terão ramais com 3 digitos (ex: 101, 102, 103)&lt;br /&gt;
*Identidade do correio de voz será o mesmo do ramal&lt;br /&gt;
*Serviços de media (acesso a voicemail e outros) receberão rotas de 4 digitos&lt;br /&gt;
*Opensips e Asterisk utilizarão o mesmo servidor (Neste caso IP: 10.254.254.6)&lt;br /&gt;
*Os serviços rodarão nas portas 5060 (opensips) , 5090 (Asterisk)&lt;br /&gt;
&lt;br /&gt;
==Funcionamento==&lt;br /&gt;
A autenticação do usuário será realizada pelo OpenSIPs, quando uma chamada é autenticada então ela serguirá:&lt;br /&gt;
*Se o usuário de destino não está online a chamada será enviada para o Asterisk para função de correio de voz&lt;br /&gt;
*Se o usuário está online a chamada será encaminhada para o Asterisk, dest forma é possivel acionar funcionalidades como anuncios, definição de tempo de chamada, forçar codecs e outras funcionalidades.&lt;br /&gt;
*Asterisk envia a chamada novamente para o OpenSIPs que verificará no location e entregará a chamada para o usuário.&lt;br /&gt;
*Se a chamada não for atendida o Opensips irá re-encaminhar para o Asterisk direcionando para função de voicemail&lt;br /&gt;
&lt;br /&gt;
==OpenSIPs==&lt;br /&gt;
Vamos iniciar o processo de instalação com o OpenSIPs, siga os procedimentos abaixo para evitar qualquer dificuldade.&lt;br /&gt;
&lt;br /&gt;
===Dependencias===&lt;br /&gt;
Execute o comando abaixo para instalar todas as dependencias necessárias&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install gcc make libncurses5-dev libnewt-dev libxml2-dev unixodbc \ &lt;br /&gt;
unixodbc-dev libmysqlclient15-dev libxmlrpc-c3-dev libexpat1-dev zlib1g-dev \ &lt;br /&gt;
m4 bison flex libpcre3-dev mysql-server vim apache2-mpm-prefork libapache2-mod-php5 \&lt;br /&gt;
 php5-mysql php5-xmlrpc php-pear  ngrep g++ libjpeg62-dev libssl-dev &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Durante a instalação o sistema irá lhe perguntar a senha de root para o servidor MySQL é importante que você se lembre da mesma posteriormente pois utilizaremos a mesma.&lt;br /&gt;
&lt;br /&gt;
===Compilando o OpenSIPs===&lt;br /&gt;
Para manter um padrão onde os dados estao vamos utilizar o diretório /usr/src/ para o download de código fonte.&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src/&lt;br /&gt;
 wget -c http://opensips.org/pub/opensips/1.9.1/src/opensips-1.9.1_src.tar.gz&lt;br /&gt;
 tar -xzvf opensips-1.9.1_src.tar.gz&lt;br /&gt;
 cd opensips-1.9.1-tls/&lt;br /&gt;
 make menuconfig&lt;br /&gt;
&lt;br /&gt;
Neste ponto o sistema irá abrir uma tela com algumas opções para selecionar, Acesse a primeira opção do menu, no submenu acesse a segunda opção ( Configure excluded modules ), selecione os módulos db_mysql , dialplan , mi_xmlrpc , presence e presence_xml&lt;br /&gt;
&lt;br /&gt;
Agora volte ao submenu, e selecione a opção Save Changes, volte para o menu principal e selecione '''Compile and Install OpenSips''' , deixe que o sistema execute suas funções.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ao finalizar a compilação você retornará ao menu, va na opção '''Exit and Save all changes'''&lt;br /&gt;
&lt;br /&gt;
===Preparando a Configuração===&lt;br /&gt;
&lt;br /&gt;
Antes de darmos inicio ao arquivo de configuração, vamos ajustar algumas questões, o opensips instala os arquivos (se voce nao alterar o parametro) em /usr, consequentemente as configurações ficam em /usr/etc , eu por padrão faço um link para o diretório /etc, assim acesso as configurações em /etc/opensips&lt;br /&gt;
&lt;br /&gt;
 ln -s /usr/etc/opensips /etc/&lt;br /&gt;
&lt;br /&gt;
No caso do debian o script de inicialização utiliza um arquivo extra de configuração&lt;br /&gt;
 cp packaging/debian/opensips.default /etc/default/opensips&lt;br /&gt;
&lt;br /&gt;
Para o script de inicialização execute o comando abaixo&lt;br /&gt;
 cp packaging/debian/opensips.init /etc/init.d/opensips&lt;br /&gt;
 chmod +x /etc/init.d/opensips&lt;br /&gt;
 update-rc.d opensips defaults&lt;br /&gt;
&lt;br /&gt;
Edite o arquivo /etc/default/opensips , a altere o parametro '''RUN_OPENSIPS''' para yes&lt;br /&gt;
&lt;br /&gt;
Você pode notar que no arquivo é mensionado o usuário de execução do opensips como opensips, então vamos ter de criar este usuário ( e grupo )&lt;br /&gt;
&lt;br /&gt;
 groupadd opensips&lt;br /&gt;
 mkdir /var/run/opensips&lt;br /&gt;
 useradd -d /var/run/opensips/ -s /bin/false -g opensips opensips&lt;br /&gt;
 chown -R opensips.opensips /var/run/opensips&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Configurando o opensipsctl===&lt;br /&gt;
O opensipsctl (e opensipsdbctl) utilizam o arquivo de configuração /etc/opensips/opensipsctlrc, abaixo segue o conteúdo do arquivo. (Sugiro que você faça um backup dos arquivos originais para ter uma copia, existem parametros que você pode estudar depois).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DBENGINE=MYSQL&lt;br /&gt;
DBHOST=localhost&lt;br /&gt;
DBNAME=opensips&lt;br /&gt;
DBRWUSER=opensips&lt;br /&gt;
DBRWPW=&amp;quot;opensipsrw&amp;quot;&lt;br /&gt;
SIP_DOMAIN=10.254.254.6  ### caso voce esteja usando outro ip altere aqui&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DBROOTUSER=&amp;quot;root&amp;quot;&lt;br /&gt;
INSTALL_EXTRA_TABLES=ask&lt;br /&gt;
ALIASES_TYPE=&amp;quot;DB&amp;quot;&lt;br /&gt;
MI_CONNECTOR=FIFO:/tmp/opensips_fifo&lt;br /&gt;
# VERIFY_ACL=1&lt;br /&gt;
# ACL_GROUPS=&amp;quot;local ld int voicemail free-pstn&amp;quot;&lt;br /&gt;
# VERBOSE=1&lt;br /&gt;
# STORE_PLAINTEXT_PW=0&lt;br /&gt;
# NOHLPRINT=1&lt;br /&gt;
PID_FILE=/var/run/opensips/opensips.pid&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Criando o banco de dados===&lt;br /&gt;
Agora que temos nosso arquivo configurado vamos fazer a criação do banco de dados, execute o comando abaixo.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
opensipsdbctl create opensips&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O sistema irá lhe perguntar algumas coisas, responda Y (sim) para todas para que ele instale todas as tabelas, não usaremos todas elas, mas desta forma você fica com praticamente tudo criado para o caso de uma expansão dos recursos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Instalando o RTP Proxy===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /usr/src/&lt;br /&gt;
wget -c http://b2bua.org/chrome/site/rtpproxy-1.2.1.tar.gz&lt;br /&gt;
tar -xzvf rtpproxy-1.2.1.tar.gz&lt;br /&gt;
cd rtpproxy-1.2.1&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
groupadd rtpproxy&lt;br /&gt;
useradd -d /var/run/rtpproxy -s /bin/true -g rtpproxy rtpproxy&lt;br /&gt;
mkdir /var/log/rtpproxy&lt;br /&gt;
mkdir /var/run/rtpproxy&lt;br /&gt;
chown -R rtpproxy.rtpproxy /var/log/rtpproxy&lt;br /&gt;
chown -R rtpproxy.rtpproxy /var/run/rtpproxy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Arquivo de inicialização====&lt;br /&gt;
'''/etc/init.d/rtpproxy'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Este script e de autoria de Mike Tesliuk&lt;br /&gt;
# qualquer falha no mesmo por favor informe &lt;br /&gt;
# atraves do email mike (a) tesliuk.com&lt;br /&gt;
#&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          rtpproxy&lt;br /&gt;
# Required-Start:    $syslog $network $local_fs $time&lt;br /&gt;
# Required-Stop:     $syslog $network $local_fs&lt;br /&gt;
# Default-Start:     2 3 4 5&lt;br /&gt;
# Default-Stop:      0 1 6&lt;br /&gt;
# Short-Description: Start the RTPPROXY server&lt;br /&gt;
# Description:       Start the RTPPROXY server&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
&lt;br /&gt;
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin&lt;br /&gt;
USELOG=1&lt;br /&gt;
USER=rtpproxy&lt;br /&gt;
# Altere o ip abaixo para o ip de seu sistema&lt;br /&gt;
IPADDR=&amp;quot;10.254.254.6&amp;quot;&lt;br /&gt;
&lt;br /&gt;
. /lib/lsb/init-functions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
start(){&lt;br /&gt;
        echo &amp;quot;Iniciando RTP PROXY &amp;quot;&lt;br /&gt;
        if [ -z $(pidof rtpproxy) ]; then&lt;br /&gt;
                if [ &amp;quot;${USELOG}&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
                        echo &amp;quot;Iniciando com LOG&amp;quot;&lt;br /&gt;
                        /usr/local/bin/rtpproxy -l $IPADDR -s udp:127.0.0.1:7722 -u $USER -F -f d DBUG 2&amp;amp;&amp;gt; /var/log/rtpproxy/rtpproxy.log &amp;amp;&lt;br /&gt;
                else&lt;br /&gt;
                        echo &amp;quot;Iniciando sem LOG&amp;quot;&lt;br /&gt;
                        /usr/local/bin/rtpproxy -l $IPADDR -s udp:127.0.0.1:7722 -u $USER  -F -f d DBUG 2&amp;amp;&amp;gt; /dev/null&lt;br /&gt;
                fi&lt;br /&gt;
&lt;br /&gt;
                if [ -n $(pidof rtpproxy) ]; then&lt;br /&gt;
                        echo &amp;quot;START OK&amp;quot;&lt;br /&gt;
                fi&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Processo ja em execucao&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
stop(){&lt;br /&gt;
&lt;br /&gt;
        if [ -z $(pidof rtpproxy) ]; then&lt;br /&gt;
                echo &amp;quot;Processo nao encontrado&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                kill -9 $(pidof rtpproxy)&lt;br /&gt;
                if [ -n $(pidof rtpproxy) ]; then&lt;br /&gt;
                        echo &amp;quot;STOP OK&amp;quot;&lt;br /&gt;
                else&lt;br /&gt;
                        echo &amp;quot;Falha em realizar stop do servico&amp;quot;&lt;br /&gt;
                fi&lt;br /&gt;
&lt;br /&gt;
        fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
case $1 in&lt;br /&gt;
        start)&lt;br /&gt;
                start&lt;br /&gt;
        ;;&lt;br /&gt;
        stop)&lt;br /&gt;
                stop&lt;br /&gt;
        ;;&lt;br /&gt;
        restart)&lt;br /&gt;
                stop&lt;br /&gt;
                start&lt;br /&gt;
&lt;br /&gt;
        ;;&lt;br /&gt;
        *)&lt;br /&gt;
                echo &amp;quot;Utilize: stop | start | restart&amp;quot;&lt;br /&gt;
        ;;&lt;br /&gt;
esac&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vamos dar permissao e colocar na inicialização&lt;br /&gt;
 chmod +x /etc/init.d/rtpproxy &lt;br /&gt;
 update-rc.d rtpproxy defaults&lt;br /&gt;
 /etc/init.d/rtpproxy start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Criando o arquivo opensips.cfg===&lt;br /&gt;
O arquivo opensips.cfg é a onde a coisa toda acontece para o opensips, claro que ele dependerá de informações que estarão no banco de dados, mas é onde criamos todas as nossas rotas e validações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
####### Global Parameters #########&lt;br /&gt;
debug=3&lt;br /&gt;
log_stderror=no&lt;br /&gt;
log_facility=LOG_LOCAL0&lt;br /&gt;
&lt;br /&gt;
fork=yes&lt;br /&gt;
children=4&lt;br /&gt;
&lt;br /&gt;
/* Descomente as linhas abaixo para ativar o debug */&lt;br /&gt;
#debug=7&lt;br /&gt;
#fork=no&lt;br /&gt;
#log_stderror=yes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Comente a linha abaixo para ativar a descoberta automatica de enderecos locais&lt;br /&gt;
 , isso significa que o sistema ira verificar todos os ips ativos e hosts e entao ativara&lt;br /&gt;
 o protocolo para todos eles */ &lt;br /&gt;
auto_aliases=no&lt;br /&gt;
&lt;br /&gt;
/* Defina aqui o ip a ser utilizado */&lt;br /&gt;
listen=udp:10.254.254.6:5060   # Altere este IP para o seu ambiente&lt;br /&gt;
&lt;br /&gt;
/* Nao usaremos sip por tcp nem tls neste script */&lt;br /&gt;
disable_tcp=yes&lt;br /&gt;
&lt;br /&gt;
disable_tls=yes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Secao de modulos ########&lt;br /&gt;
&lt;br /&gt;
#set module path&lt;br /&gt;
mpath=&amp;quot;/usr//lib64/opensips/modules/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;signaling.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;sl.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;tm.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;fr_timer&amp;quot;, 5)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;fr_inv_timer&amp;quot;, 30)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;restart_fr_on_each_reply&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;rr.so&amp;quot;&lt;br /&gt;
/* do not append from tag to the RR (no need for this script) */&lt;br /&gt;
modparam(&amp;quot;rr&amp;quot;, &amp;quot;append_fromtag&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;maxfwd.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;sipmsgops.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;mi_fifo.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;mi_fifo&amp;quot;, &amp;quot;fifo_name&amp;quot;, &amp;quot;/tmp/opensips_fifo&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;mi_fifo&amp;quot;, &amp;quot;fifo_mode&amp;quot;, 0666)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;db_mysql.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;uri.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;uri&amp;quot;, &amp;quot;use_uri_table&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;usrloc.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;nat_bflag&amp;quot;, &amp;quot;FLB_NATB&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;db_mode&amp;quot;,   2)&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;db_url&amp;quot;,  &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;registrar.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;registrar&amp;quot;, &amp;quot;tcp_persistent_flag&amp;quot;, &amp;quot;TCP_PERSISTENT&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
/* Descomente a linha abaixo para nao permitir mais de 10 contatos por conta */&lt;br /&gt;
#modparam(&amp;quot;registrar&amp;quot;, &amp;quot;max_contacts&amp;quot;, 10)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;acc.so&amp;quot;&lt;br /&gt;
/* Quais eventos deverao ser registrados ? */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;early_media&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;report_cancels&amp;quot;, 0)&lt;br /&gt;
/* por padrao nos nao ajustamos a direcao em requisicoes sequencias, &lt;br /&gt;
 se voce deseja usar este recurso tenha certeza de ativar o &amp;quot;appen_fromtag&amp;quot; &lt;br /&gt;
 para o modulo &amp;quot;rr&amp;quot; */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;detect_direction&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;failed_transaction_flag&amp;quot;, &amp;quot;FLT_ACCFAILED&amp;quot;)&lt;br /&gt;
/* Gatilhos para accounting  (flags) */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_flag&amp;quot;, &amp;quot;FLT_ACC&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_missed_flag&amp;quot;, &amp;quot;FLT_ACCMISSED&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_extra&amp;quot;, &lt;br /&gt;
	&amp;quot;src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_flag&amp;quot;, &amp;quot;FLT_ACC&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_missed_flag&amp;quot;, &amp;quot;FLT_ACCMISSED&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_extra&amp;quot;, &amp;quot;src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;auth.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;auth_db.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;db_url&amp;quot;,  &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;calculate_ha1&amp;quot;, yes)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;password_column&amp;quot;, &amp;quot;password&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;load_credentials&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;permissions.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;permissions&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;alias_db.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;alias_db&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;presence.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;presence&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#loadmodule &amp;quot;presence_xml.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;dialog.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;db_mode&amp;quot;, 2)&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;db_url&amp;quot;,&amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;dlg_match_mode&amp;quot;, 1)&lt;br /&gt;
#modparam(&amp;quot;dialog&amp;quot;, &amp;quot;default_timeout&amp;quot;, 60)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;siptrace.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;trace_flag&amp;quot;, 22)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;traced_user_avp&amp;quot;, &amp;quot;$avp(s:traceuser)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;nathelper.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;natping_interval&amp;quot;, 30)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;ping_nated_only&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;sipping_bflag&amp;quot;, &amp;quot;FLB_NATSIPPING&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;sipping_from&amp;quot;, &amp;quot;sip:pinger@10.254.254.6&amp;quot;) # Altere o ip para o ip do servidor&lt;br /&gt;
modparam(&amp;quot;nathelper|registrar&amp;quot;, &amp;quot;received_avp&amp;quot;, &amp;quot;$avp(RECEIVED)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;rtpproxy.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;rtpproxy&amp;quot;, &amp;quot;rtpproxy_sock&amp;quot;, &amp;quot;udp:127.0.0.1:7722&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Logica de roteamento ########&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route {&lt;br /&gt;
&lt;br /&gt;
	if (!mf_process_maxfwd_header(&amp;quot;3&amp;quot;)) {&lt;br /&gt;
                send_reply(&amp;quot;483&amp;quot;,&amp;quot;looping&amp;quot;);&lt;br /&gt;
                exit;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;REQUISICAO RECEBIDA, ENVIANDO PARA REQINIT&amp;quot;);&lt;br /&gt;
	# Checagem inicial por requisicao&lt;br /&gt;
	route(REQINIT);&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA NAT&amp;quot;);&lt;br /&gt;
	# Deteccao de nat&lt;br /&gt;
	route(NAT);&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA WITHINDLG&amp;quot;);&lt;br /&gt;
	# Gerenciando requisicaoes com dialog&lt;br /&gt;
	route(WITHINDLG);&lt;br /&gt;
&lt;br /&gt;
	# Manipulando requisicoes iniciais (nao consta To tag)&lt;br /&gt;
	&lt;br /&gt;
	# Processando CANCEL&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;CANCEL&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD CANCEL&amp;quot;);&lt;br /&gt;
		if(t_check_trans()){&lt;br /&gt;
			t_relay();&lt;br /&gt;
		}&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	t_check_trans();&lt;br /&gt;
&lt;br /&gt;
	# Enviando para autenticacao&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA AUTENTICACAO&amp;quot;);&lt;br /&gt;
	route(AUTH);&lt;br /&gt;
&lt;br /&gt;
	# gravando rota para formacao dos dialogs (caso sejam roteados)&lt;br /&gt;
	# removemos qualquer cabecalho de rota pre carregado&lt;br /&gt;
	remove_hf(&amp;quot;Route&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE|SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD INVITE OU SIBSCRIBE&amp;quot;);&lt;br /&gt;
		record_route();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Contabilizando (acc) INVITES&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD INVITE, FAZENDOA ACC&amp;quot;);&lt;br /&gt;
		setflag(FLT_ACC);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Enviando chamada para destinos externos&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA SIPOUT&amp;quot;);&lt;br /&gt;
	route(SIPOUT);&lt;br /&gt;
&lt;br /&gt;
	# Requisicoes para dominio local&lt;br /&gt;
	&lt;br /&gt;
	# Roteando requisicoes de PRESENCE&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA PRESENCE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	route(PRESENCE);&lt;br /&gt;
&lt;br /&gt;
	# Gerenciando pedidos de registro&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA REGISTRAR&amp;quot;);	&lt;br /&gt;
	route(REGISTRAR);&lt;br /&gt;
&lt;br /&gt;
	if($ru==&amp;quot;&amp;quot;){&lt;br /&gt;
		xlog(&amp;quot;ru --&amp;gt; vazio&amp;quot;);&lt;br /&gt;
		# Requisicao sem usuario na RURI&lt;br /&gt;
		sl_send_reply(&amp;quot;484&amp;quot;, &amp;quot;Address Incomplete&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Enviando requisicao para PSTN&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA PSTN&amp;quot;);&lt;br /&gt;
	route(PSTN);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	# Salvando informacao de quem originou a chamad&lt;br /&gt;
	$avp(callee)=$rU;&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA DISPATCH PSTN&amp;quot;);&lt;br /&gt;
	route(FSDISPATCH);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	# Servico de localizacao de usuario&lt;br /&gt;
	route(LOCATION);&lt;br /&gt;
&lt;br /&gt;
	# Efetuando o relay (encaminhamento)&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[RELAY] {&lt;br /&gt;
	if(check_route_param(&amp;quot;nat=yes&amp;quot;)){&lt;br /&gt;
		setbflag(FLB_NATB);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(isflagset(FLT_NATS) || isbflagset(FLB_NATB)){&lt;br /&gt;
		#route(RTPPROXY);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
#	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
#		t_on_reply(&amp;quot;REPLY_ONE&amp;quot;);&lt;br /&gt;
#		t_on_failure(&amp;quot;FAIL_ONE&amp;quot;);&lt;br /&gt;
#	}&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;AQUI TENTAMOS ENVIAR A CHAMADA $fU $tU&amp;quot;);&lt;br /&gt;
	if(!t_relay()){&lt;br /&gt;
		xlog(&amp;quot;FALHA EM ENVIAR A CHAMADA, NAO FOI POSSIVEL FAZER O RELAY&amp;quot;);&lt;br /&gt;
		sl_reply_error();&lt;br /&gt;
	}&lt;br /&gt;
	xlog(&amp;quot;CHAMADA FOI ENVIADA AQUI, QUAL O ERRO ENTAO&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[REQINIT] {&lt;br /&gt;
	if(!mf_process_maxfwd_header(&amp;quot;10&amp;quot;)){&lt;br /&gt;
		sl_send_reply(&amp;quot;483&amp;quot;, &amp;quot;Too Many Hops&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[WITHINDLG] {&lt;br /&gt;
	if(has_totag()){&lt;br /&gt;
		if(loose_route()){&lt;br /&gt;
			if(is_method(&amp;quot;BYE&amp;quot;)){&lt;br /&gt;
				setflag(FLT_ACC);&lt;br /&gt;
				setflag(FLT_ACCFAILED);&lt;br /&gt;
			}&lt;br /&gt;
			route(RELAY);&lt;br /&gt;
		}else{&lt;br /&gt;
			if(is_method(&amp;quot;SUBSCRIBE&amp;quot;) &amp;amp;&amp;amp; uri==myself) {&lt;br /&gt;
				# requisicao de subscribe pre-estabelecida&lt;br /&gt;
				route(PRESENCE);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if(is_method(&amp;quot;ACK&amp;quot;)){&lt;br /&gt;
				if(t_check_trans()){&lt;br /&gt;
					t_relay();&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
			}else{&lt;br /&gt;
				# ACK para transacao nao encontrada, ignoramos...&lt;br /&gt;
				exit;&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			sl_send_reply(&amp;quot;404&amp;quot;, &amp;quot;Not Here&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		}	&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[REGISTRAR] {&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;REGISTER&amp;quot;)){&lt;br /&gt;
		if(isflagset(FLT_NATS)){&lt;br /&gt;
			setbflag(FLB_NATB);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(!save(&amp;quot;location&amp;quot;)){&lt;br /&gt;
			sl_reply_error();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[LOCATION] {&lt;br /&gt;
&lt;br /&gt;
	alias_db_lookup(&amp;quot;dbaliases&amp;quot;);&lt;br /&gt;
	if(!lookup(&amp;quot;location&amp;quot;)){&lt;br /&gt;
		switch($rc) {&lt;br /&gt;
			case -1:&lt;br /&gt;
			case -3:&lt;br /&gt;
				t_newtran();&lt;br /&gt;
				t_reply(&amp;quot;404&amp;quot;,&amp;quot;Not Found&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			case -2:&lt;br /&gt;
				sl_send_reply(&amp;quot;405&amp;quot;, &amp;quot;Method Not Allowed&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		setflag(FLT_ACCMISSED);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[PRESENCE] {&lt;br /&gt;
	if(!is_method(&amp;quot;PUBLISH|SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!t_newtran()){&lt;br /&gt;
		sl_reply_error();&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;PUBLISH&amp;quot;)){&lt;br /&gt;
		handle_publish();&lt;br /&gt;
	}else if(is_method(&amp;quot;SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		handle_subscribe();&lt;br /&gt;
	}&lt;br /&gt;
	exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[AUTH]{&lt;br /&gt;
	xlog(&amp;quot;PEDIDO DE AUTENTICACAO&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;REGISTER&amp;quot;)){&lt;br /&gt;
		# atentica pedidos de registro&lt;br /&gt;
		if(!www_authorize(&amp;quot;&amp;quot;, &amp;quot;subscriber&amp;quot;)){&lt;br /&gt;
			www_challenge(&amp;quot;&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if($au!=$tU){&lt;br /&gt;
			sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
	}else{&lt;br /&gt;
		if(route(FSINBOUND)){&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(check_source_address(&amp;quot;0&amp;quot;)){&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(from_uri==myself){&lt;br /&gt;
			if(!proxy_authorize(&amp;quot;&amp;quot;, &amp;quot;subscriber&amp;quot;)){&lt;br /&gt;
				proxy_challenge(&amp;quot;&amp;quot;,&amp;quot;0&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if(is_method(&amp;quot;PUBLISH&amp;quot;)){&lt;br /&gt;
				if($au!=$tU){&lt;br /&gt;
					sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
			}else{&lt;br /&gt;
				if($au!=$fU){&lt;br /&gt;
					sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			&lt;br /&gt;
			# Validamos (autenticamos) o usuario&lt;br /&gt;
			consume_credentials();&lt;br /&gt;
		}else{&lt;br /&gt;
		&lt;br /&gt;
			# usuario nao e local, vamos negar&lt;br /&gt;
			if(!uri==myself){&lt;br /&gt;
				sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not relaying&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}	&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[NAT] {&lt;br /&gt;
	force_rport();&lt;br /&gt;
	if(nat_uac_test(&amp;quot;19&amp;quot;)){&lt;br /&gt;
		if(method==&amp;quot;REGISTER&amp;quot;){&lt;br /&gt;
			fix_nated_register();&lt;br /&gt;
		}else{&lt;br /&gt;
			fix_nated_contact();&lt;br /&gt;
		}&lt;br /&gt;
		setflag(FLT_NATS);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[RTPPROXY] {&lt;br /&gt;
	if(is_method(&amp;quot;BYE&amp;quot;)){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}else if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		engage_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!has_totag()){&lt;br /&gt;
&lt;br /&gt;
		if(!check_route_param(&amp;quot;nat=yes&amp;quot;)){&lt;br /&gt;
			add_rr_param(&amp;quot;;nat=yes&amp;quot;);&lt;br /&gt;
			xlog(&amp;quot;NAT yes NAO ENCONTRADO&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[SIPOUT]{&lt;br /&gt;
	if(!uri==myself){&lt;br /&gt;
		append_hf(&amp;quot;P-hint: outbound\r\n&amp;quot;);&lt;br /&gt;
		route(RELAY);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[PSTN]{&lt;br /&gt;
        # neste caso apenas para exemplificar um uso simples&lt;br /&gt;
        # vamos fazer o redirecionamento par ao asterisk&lt;br /&gt;
        # realizar a dicagem da chamada&lt;br /&gt;
&lt;br /&gt;
        if(!($rU=~&amp;quot;^(\+|00)[1-9][0-9]{3,20}$&amp;quot;))&lt;br /&gt;
                return;&lt;br /&gt;
&lt;br /&gt;
        ## a regra acima aceita para discagem externa qualquer numero&lt;br /&gt;
        # comecado com 00 ou +&lt;br /&gt;
        #&lt;br /&gt;
&lt;br /&gt;
        if(from_uri!=myself){&lt;br /&gt;
                sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not Allowed&amp;quot;);&lt;br /&gt;
                exit;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $ru = &amp;quot;sip:&amp;quot; + $rU + &amp;quot;@&amp;quot; + &amp;quot;10.254.254.6:5090&amp;quot;;&lt;br /&gt;
        xlog(&amp;quot;NOVO DESTINO: $ru&amp;quot;);&lt;br /&gt;
        route(RELAY);&lt;br /&gt;
        exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[XMLRPC]{&lt;br /&gt;
	# nao vamos implementar esta funcionalidade&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSINBOUND] {&lt;br /&gt;
	# verificar para validar o ip do asterisk:porta&lt;br /&gt;
	# se bater , responder com return 1;&lt;br /&gt;
	if($si==&amp;quot;10.254.254.6&amp;quot; &amp;amp;&amp;amp; $sp==&amp;quot;5090&amp;quot;){&lt;br /&gt;
		return(1);&lt;br /&gt;
	}else{&lt;br /&gt;
		return(-1);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSDISPATCH] {&lt;br /&gt;
&lt;br /&gt;
	if(!is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(route(FSINBOUND)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;CAIMOS NO SWITCH, VAMOS LOCALIZAR O PERFIL DA CHAMADA $rU&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if($rU =~ &amp;quot;^41$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWITCH expressa comeca e termina em 41&amp;quot;);&lt;br /&gt;
			#regra de menu de voicemail, apenas &lt;br /&gt;
			# usuarios autenticados&lt;br /&gt;
			if($au==&amp;quot;&amp;quot;){&lt;br /&gt;
				sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not Allowed&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$rU = &amp;quot;vma-&amp;quot; + $au;&lt;br /&gt;
	}else if($rU =~ &amp;quot;^441[0-9][0-9]$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWTICH OPCA 441XX &amp;quot;);&lt;br /&gt;
			# numero discado comeca com 441 seguido de dois digitos&lt;br /&gt;
			# chamada direta para inbox do voicemail&lt;br /&gt;
			strip(2);&lt;br /&gt;
			route(FSVBOX);&lt;br /&gt;
	}else if($rU =~ &amp;quot;^433[01][0-9][0-9]$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWITCH OPCAO 433[01]XX&amp;quot;);&lt;br /&gt;
			# numero comecado em 443, seguido de 0 ou 1, mais dois digitos&lt;br /&gt;
			# sistema de conferencia&lt;br /&gt;
			strip(2);&lt;br /&gt;
	}else if($rU =~ &amp;quot;^45[0-9]+$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWTICH OPCAO 45X.&amp;quot;);&lt;br /&gt;
			#numero comecado com 45, seguindo de numeros;&lt;br /&gt;
			strip(2);&lt;br /&gt;
	}else{&lt;br /&gt;
			xlog(&amp;quot;OPCAO DEFAULT DO SWITCH&amp;quot;);&lt;br /&gt;
			# usuario offline, enviando para voicemail&lt;br /&gt;
			if(!registered(&amp;quot;location&amp;quot;)){&lt;br /&gt;
				route(FSVBOX);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			# usuario online, fazendo bridging&lt;br /&gt;
			xlog(&amp;quot;USUARIO ESTA ONLINE VAMOS FAZER BRIDGE&amp;quot;);&lt;br /&gt;
			prefix(&amp;quot;kb-&amp;quot;);&lt;br /&gt;
			if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
				t_on_failure(&amp;quot;FAIL_FSVBOX&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
	}&lt;br /&gt;
	route(FSRELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSVBOX]{&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA FSVBOX&amp;quot;);&lt;br /&gt;
	$du = &amp;quot;sip:&amp;quot; + &amp;quot;10.254.254.6&amp;quot; + &amp;quot;:&amp;quot; + &amp;quot;5090&amp;quot;;&lt;br /&gt;
	if($rU =~ &amp;quot;^441[0-9][0-9]&amp;quot;){&lt;br /&gt;
		strip(2);&lt;br /&gt;
	}&lt;br /&gt;
	prefix(&amp;quot;vm-&amp;quot;);&lt;br /&gt;
	if($var(newbranch)==1){&lt;br /&gt;
		append_branch();&lt;br /&gt;
		$var(newbranch)=0;&lt;br /&gt;
	}&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[FSRELAY] {&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA FSRELAY&amp;quot;);&lt;br /&gt;
	$du = &amp;quot;sip:&amp;quot; + &amp;quot;10.254.254.6&amp;quot; + &amp;quot;:&amp;quot; + &amp;quot;5090&amp;quot;;&lt;br /&gt;
	if($var(newbranch)==1){&lt;br /&gt;
		append_branch();&lt;br /&gt;
		$var(newbranch)=0;&lt;br /&gt;
	}&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
branch_route[BRANCH_ONE]{&lt;br /&gt;
	xlog(&amp;quot;new branch at $ru&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
onreply_route[REPLY_ONE]{&lt;br /&gt;
	xlog(&amp;quot;Incoming reply&amp;quot;);&lt;br /&gt;
	if((isflagset(FLT_NATS) || isbflagset(FLB_NATB) &amp;amp;&amp;amp; status =~ &amp;quot;(183)|(2[0-9][0-9])&amp;quot;)){&lt;br /&gt;
		#rtpproxy_offer();&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	if(isbflagset(FLB_NATB)){&lt;br /&gt;
		fix_nated_contact();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
failure_route[FAIL_ONE]{&lt;br /&gt;
	xlog(&amp;quot;FAILURE ROUTE FAIL_ONE&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;) &amp;amp;&amp;amp; (isbflagset(FLB_NATB) || isflagset(FLT_NATS))){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_was_cancelled()){&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
failure_route[FAIL_FSVBOX]{&lt;br /&gt;
	xlog(&amp;quot;FAILURE ROUTE FAIL_FSVBOX&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;) &amp;amp;&amp;amp; (isbflagset(FLB_NATB) || isflagset(FLT_NATS))){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_was_cancelled()){&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_check_status(&amp;quot;486|408|480&amp;quot;)){&lt;br /&gt;
		$rU = $avp(callee);&lt;br /&gt;
		$var(newbranch) = 1;&lt;br /&gt;
		route(FSVBOX);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testes com Opensips (registro)==&lt;br /&gt;
&lt;br /&gt;
Antes de podermos testar precisamos iniciar o serviço, no momento estamos com ele operando em modo debug, então a inicialização deve ser realizada com o comando abaixo&lt;br /&gt;
 /etc/init.d/opensips debug&lt;br /&gt;
&lt;br /&gt;
Abra uma nova sessão no servidor e então vamos criar os usuários&lt;br /&gt;
 opensipsctl add 101 101&lt;br /&gt;
 opensipsctl add 102 102&lt;br /&gt;
 opensipsctl add 103 103&lt;br /&gt;
&lt;br /&gt;
usuario 101 com senha 101 e assim por diante&lt;br /&gt;
&lt;br /&gt;
Faça a onexão com seu softphone, aqui para testes utilizei o jitsi e o zoiper, neste momento vamos apenas fazer o registro do usuário para testar a autenticação, se você tentar realizar uma discagem não funcionará pois neste caso o processo depende do Asterisk que ainda não está configurado, vamos dar inicio nesta configuração agora.&lt;br /&gt;
&lt;br /&gt;
==Asterisk==&lt;br /&gt;
Não vamos dar muitos detalhes da instalação do asterisk aqui, a ideia é simplesmente ter o mesmo funcionando da forma que necessitamos.&lt;br /&gt;
 apt-get install asterisk&lt;br /&gt;
&lt;br /&gt;
Após a instalação , abra o arquivo /etc/asterisk/sip.conf, localize a linha '''udpbindaddr=0.0.0.0''' e altere para '''udpbindaddr=0.0.0.0:5090'''  , depois ao fim do arquivo adicione.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[opensips]&lt;br /&gt;
type=peer&lt;br /&gt;
host=10.254.254.6&lt;br /&gt;
port=5060&lt;br /&gt;
qualify=yes&lt;br /&gt;
context=opensips&lt;br /&gt;
insecure=port,invite&lt;br /&gt;
canreinvite=no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agora abra o arquivo '''/etc/asterisk/extensions.conf''' , crie no fim do arquivo a seguinte entrada.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[opensips]&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _kb-1XX,1,NoOp(CHAMADA INTERNA - FAZER BRIDGE - ${CALLERID(num)} ${EXTEN:3})&lt;br /&gt;
same =&amp;gt; n,Dial(SIP/opensips/${EXTEN:3})&lt;br /&gt;
same =&amp;gt; n,Goto(opensips,vm-${EXTEN:3},1)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _vm-1XX,1,NoOp(CHAMADA PARA VOICEMAIL)&lt;br /&gt;
same =&amp;gt; n,Voicemail(${EXTEN:3}@default)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _vma-1XX,1,NoOp(CHAMADA PARA VOICEMAIL - ADMINISTRATIVO)&lt;br /&gt;
same =&amp;gt; n,VoicemailMain(${EXTEN:4}@default)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _3[01]XX,1,NoOp(CHAMADA PARA CONFERENCIA)&lt;br /&gt;
same =&amp;gt; n,Answer()&lt;br /&gt;
same =&amp;gt; n,ConfBridge(${EXTEN},cM1)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _00.,1,NoOp(CHAMADA PARA PSTN)&lt;br /&gt;
same =&amp;gt; n,Wait(2)&lt;br /&gt;
same =&amp;gt; n,Answer()&lt;br /&gt;
same =&amp;gt; n,Wait(1)&lt;br /&gt;
same =&amp;gt; n,PlayBack(tt-monkeys)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; h,1,Hangup()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente precisamos criar as entradas do voicemail, para isso altere o arquivo '''/etc/asterisk/voicemail.conf''' localize o contexto '''[default]''' e então adicione as entradas para seu voicemail, segue dois exemplos abaixo.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
101 =&amp;gt; 123123,Mike Tesliuk&lt;br /&gt;
102 =&amp;gt; 123123,Mike Tesliuk 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Feito isso, faça um restart no asterisk&lt;br /&gt;
 /etc/init.d/asterisk restart&lt;br /&gt;
&lt;br /&gt;
Agora você ja poderá fazer os testes, basicamente criamos as seguintes situações para serem testadas.&lt;br /&gt;
&lt;br /&gt;
*1 Autenticação de usuários&lt;br /&gt;
*2 Chamada entre usuários&lt;br /&gt;
*3 Encaminhamento para caixa postal&lt;br /&gt;
*4 Acesso a caixa postal&lt;br /&gt;
*5 Acesso a conferência&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPs_e_Asterisk&amp;diff=1525</id>
		<title>OpenSIPs e Asterisk</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPs_e_Asterisk&amp;diff=1525"/>
		<updated>2021-04-15T22:54:15Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Precisando de recursos de númeração para fazer seus testes ? contrate conosco em [www.brdvoz.com.br|BRDVOZ]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color: red;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;font color=white&amp;gt; Falta realizar os ajustes / testes para o NAT no mais esta tudo funcionado adequadamente a principio &amp;lt;/font&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este tutorial é baseado em um tutorial similar porém utilizando Kamailio e Freeswtich, se quiser verificar o tutorial original acesse http://kb.asipto.com/freeswitch:kamailio-3.1.x-freeswitch-1.0.6d-sbc.&lt;br /&gt;
&lt;br /&gt;
Para esta implementação utilizamos Debian 7.0 amd64 , OpenSIPS 1.9 e Asterisk 1.8.23 &lt;br /&gt;
&lt;br /&gt;
==Funcionalidades==&lt;br /&gt;
Este tutorial tem por objetivo atingir as seguintes funcionalidades.&lt;br /&gt;
*Autenticação de usuário&lt;br /&gt;
*Registro de usuário&lt;br /&gt;
*Localização de usuário (encaminhamento de chamadas)&lt;br /&gt;
*Roteamento de chamadas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Através do Asterisk estenderemos estas funcionalidades agregando.&lt;br /&gt;
*Correio de voz (Voicemail)&lt;br /&gt;
*Conferencia &lt;br /&gt;
*SBC ( Pode ser utilizado para transcoding, esconder topologia, play de mensagens e tarifação )&lt;br /&gt;
*Outros serviços de media (Anuncios, Ura's e coisas do tipo)&lt;br /&gt;
&lt;br /&gt;
==Definições==&lt;br /&gt;
Para um melhor entendimento da solução vamos expor aqui algumas definições de nosso sistema.&lt;br /&gt;
*Usuários locais terão ramais com 3 digitos (ex: 101, 102, 103)&lt;br /&gt;
*Identidade do correio de voz será o mesmo do ramal&lt;br /&gt;
*Serviços de media (acesso a voicemail e outros) receberão rotas de 4 digitos&lt;br /&gt;
*Opensips e Asterisk utilizarão o mesmo servidor (Neste caso IP: 10.254.254.6)&lt;br /&gt;
*Os serviços rodarão nas portas 5060 (opensips) , 5090 (Asterisk)&lt;br /&gt;
&lt;br /&gt;
==Funcionamento==&lt;br /&gt;
A autenticação do usuário será realizada pelo OpenSIPs, quando uma chamada é autenticada então ela serguirá:&lt;br /&gt;
*Se o usuário de destino não está online a chamada será enviada para o Asterisk para função de correio de voz&lt;br /&gt;
*Se o usuário está online a chamada será encaminhada para o Asterisk, dest forma é possivel acionar funcionalidades como anuncios, definição de tempo de chamada, forçar codecs e outras funcionalidades.&lt;br /&gt;
*Asterisk envia a chamada novamente para o OpenSIPs que verificará no location e entregará a chamada para o usuário.&lt;br /&gt;
*Se a chamada não for atendida o Opensips irá re-encaminhar para o Asterisk direcionando para função de voicemail&lt;br /&gt;
&lt;br /&gt;
==OpenSIPs==&lt;br /&gt;
Vamos iniciar o processo de instalação com o OpenSIPs, siga os procedimentos abaixo para evitar qualquer dificuldade.&lt;br /&gt;
&lt;br /&gt;
===Dependencias===&lt;br /&gt;
Execute o comando abaixo para instalar todas as dependencias necessárias&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install gcc make libncurses5-dev libnewt-dev libxml2-dev unixodbc \ &lt;br /&gt;
unixodbc-dev libmysqlclient15-dev libxmlrpc-c3-dev libexpat1-dev zlib1g-dev \ &lt;br /&gt;
m4 bison flex libpcre3-dev mysql-server vim apache2-mpm-prefork libapache2-mod-php5 \&lt;br /&gt;
 php5-mysql php5-xmlrpc php-pear  ngrep g++ libjpeg62-dev libssl-dev &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Durante a instalação o sistema irá lhe perguntar a senha de root para o servidor MySQL é importante que você se lembre da mesma posteriormente pois utilizaremos a mesma.&lt;br /&gt;
&lt;br /&gt;
===Compilando o OpenSIPs===&lt;br /&gt;
Para manter um padrão onde os dados estao vamos utilizar o diretório /usr/src/ para o download de código fonte.&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src/&lt;br /&gt;
 wget -c http://opensips.org/pub/opensips/1.9.1/src/opensips-1.9.1_src.tar.gz&lt;br /&gt;
 tar -xzvf opensips-1.9.1_src.tar.gz&lt;br /&gt;
 cd opensips-1.9.1-tls/&lt;br /&gt;
 make menuconfig&lt;br /&gt;
&lt;br /&gt;
Neste ponto o sistema irá abrir uma tela com algumas opções para selecionar, Acesse a primeira opção do menu, no submenu acesse a segunda opção ( Configure excluded modules ), selecione os módulos db_mysql , dialplan , mi_xmlrpc , presence e presence_xml&lt;br /&gt;
&lt;br /&gt;
Agora volte ao submenu, e selecione a opção Save Changes, volte para o menu principal e selecione '''Compile and Install OpenSips''' , deixe que o sistema execute suas funções.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ao finalizar a compilação você retornará ao menu, va na opção '''Exit and Save all changes'''&lt;br /&gt;
&lt;br /&gt;
===Preparando a Configuração===&lt;br /&gt;
&lt;br /&gt;
Antes de darmos inicio ao arquivo de configuração, vamos ajustar algumas questões, o opensips instala os arquivos (se voce nao alterar o parametro) em /usr, consequentemente as configurações ficam em /usr/etc , eu por padrão faço um link para o diretório /etc, assim acesso as configurações em /etc/opensips&lt;br /&gt;
&lt;br /&gt;
 ln -s /usr/etc/opensips /etc/&lt;br /&gt;
&lt;br /&gt;
No caso do debian o script de inicialização utiliza um arquivo extra de configuração&lt;br /&gt;
 cp packaging/debian/opensips.default /etc/default/opensips&lt;br /&gt;
&lt;br /&gt;
Para o script de inicialização execute o comando abaixo&lt;br /&gt;
 cp packaging/debian/opensips.init /etc/init.d/opensips&lt;br /&gt;
 chmod +x /etc/init.d/opensips&lt;br /&gt;
 update-rc.d opensips defaults&lt;br /&gt;
&lt;br /&gt;
Edite o arquivo /etc/default/opensips , a altere o parametro '''RUN_OPENSIPS''' para yes&lt;br /&gt;
&lt;br /&gt;
Você pode notar que no arquivo é mensionado o usuário de execução do opensips como opensips, então vamos ter de criar este usuário ( e grupo )&lt;br /&gt;
&lt;br /&gt;
 groupadd opensips&lt;br /&gt;
 mkdir /var/run/opensips&lt;br /&gt;
 useradd -d /var/run/opensips/ -s /bin/false -g opensips opensips&lt;br /&gt;
 chown -R opensips.opensips /var/run/opensips&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Configurando o opensipsctl===&lt;br /&gt;
O opensipsctl (e opensipsdbctl) utilizam o arquivo de configuração /etc/opensips/opensipsctlrc, abaixo segue o conteúdo do arquivo. (Sugiro que você faça um backup dos arquivos originais para ter uma copia, existem parametros que você pode estudar depois).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DBENGINE=MYSQL&lt;br /&gt;
DBHOST=localhost&lt;br /&gt;
DBNAME=opensips&lt;br /&gt;
DBRWUSER=opensips&lt;br /&gt;
DBRWPW=&amp;quot;opensipsrw&amp;quot;&lt;br /&gt;
SIP_DOMAIN=10.254.254.6  ### caso voce esteja usando outro ip altere aqui&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DBROOTUSER=&amp;quot;root&amp;quot;&lt;br /&gt;
INSTALL_EXTRA_TABLES=ask&lt;br /&gt;
ALIASES_TYPE=&amp;quot;DB&amp;quot;&lt;br /&gt;
MI_CONNECTOR=FIFO:/tmp/opensips_fifo&lt;br /&gt;
# VERIFY_ACL=1&lt;br /&gt;
# ACL_GROUPS=&amp;quot;local ld int voicemail free-pstn&amp;quot;&lt;br /&gt;
# VERBOSE=1&lt;br /&gt;
# STORE_PLAINTEXT_PW=0&lt;br /&gt;
# NOHLPRINT=1&lt;br /&gt;
PID_FILE=/var/run/opensips/opensips.pid&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Criando o banco de dados===&lt;br /&gt;
Agora que temos nosso arquivo configurado vamos fazer a criação do banco de dados, execute o comando abaixo.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
opensipsdbctl create opensips&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O sistema irá lhe perguntar algumas coisas, responda Y (sim) para todas para que ele instale todas as tabelas, não usaremos todas elas, mas desta forma você fica com praticamente tudo criado para o caso de uma expansão dos recursos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Instalando o RTP Proxy===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /usr/src/&lt;br /&gt;
wget -c http://b2bua.org/chrome/site/rtpproxy-1.2.1.tar.gz&lt;br /&gt;
tar -xzvf rtpproxy-1.2.1.tar.gz&lt;br /&gt;
cd rtpproxy-1.2.1&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
groupadd rtpproxy&lt;br /&gt;
useradd -d /var/run/rtpproxy -s /bin/true -g rtpproxy rtpproxy&lt;br /&gt;
mkdir /var/log/rtpproxy&lt;br /&gt;
mkdir /var/run/rtpproxy&lt;br /&gt;
chown -R rtpproxy.rtpproxy /var/log/rtpproxy&lt;br /&gt;
chown -R rtpproxy.rtpproxy /var/run/rtpproxy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Arquivo de inicialização====&lt;br /&gt;
'''/etc/init.d/rtpproxy'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Este script e de autoria de Mike Tesliuk&lt;br /&gt;
# qualquer falha no mesmo por favor informe &lt;br /&gt;
# atraves do email mike (a) tesliuk.com&lt;br /&gt;
#&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          rtpproxy&lt;br /&gt;
# Required-Start:    $syslog $network $local_fs $time&lt;br /&gt;
# Required-Stop:     $syslog $network $local_fs&lt;br /&gt;
# Default-Start:     2 3 4 5&lt;br /&gt;
# Default-Stop:      0 1 6&lt;br /&gt;
# Short-Description: Start the RTPPROXY server&lt;br /&gt;
# Description:       Start the RTPPROXY server&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
&lt;br /&gt;
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin&lt;br /&gt;
USELOG=1&lt;br /&gt;
USER=rtpproxy&lt;br /&gt;
# Altere o ip abaixo para o ip de seu sistema&lt;br /&gt;
IPADDR=&amp;quot;10.254.254.6&amp;quot;&lt;br /&gt;
&lt;br /&gt;
. /lib/lsb/init-functions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
start(){&lt;br /&gt;
        echo &amp;quot;Iniciando RTP PROXY &amp;quot;&lt;br /&gt;
        if [ -z $(pidof rtpproxy) ]; then&lt;br /&gt;
                if [ &amp;quot;${USELOG}&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
                        echo &amp;quot;Iniciando com LOG&amp;quot;&lt;br /&gt;
                        /usr/local/bin/rtpproxy -l $IPADDR -s udp:127.0.0.1:7722 -u $USER -F -f d DBUG 2&amp;amp;&amp;gt; /var/log/rtpproxy/rtpproxy.log &amp;amp;&lt;br /&gt;
                else&lt;br /&gt;
                        echo &amp;quot;Iniciando sem LOG&amp;quot;&lt;br /&gt;
                        /usr/local/bin/rtpproxy -l $IPADDR -s udp:127.0.0.1:7722 -u $USER  -F -f d DBUG 2&amp;amp;&amp;gt; /dev/null&lt;br /&gt;
                fi&lt;br /&gt;
&lt;br /&gt;
                if [ -n $(pidof rtpproxy) ]; then&lt;br /&gt;
                        echo &amp;quot;START OK&amp;quot;&lt;br /&gt;
                fi&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Processo ja em execucao&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
stop(){&lt;br /&gt;
&lt;br /&gt;
        if [ -z $(pidof rtpproxy) ]; then&lt;br /&gt;
                echo &amp;quot;Processo nao encontrado&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                kill -9 $(pidof rtpproxy)&lt;br /&gt;
                if [ -n $(pidof rtpproxy) ]; then&lt;br /&gt;
                        echo &amp;quot;STOP OK&amp;quot;&lt;br /&gt;
                else&lt;br /&gt;
                        echo &amp;quot;Falha em realizar stop do servico&amp;quot;&lt;br /&gt;
                fi&lt;br /&gt;
&lt;br /&gt;
        fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
case $1 in&lt;br /&gt;
        start)&lt;br /&gt;
                start&lt;br /&gt;
        ;;&lt;br /&gt;
        stop)&lt;br /&gt;
                stop&lt;br /&gt;
        ;;&lt;br /&gt;
        restart)&lt;br /&gt;
                stop&lt;br /&gt;
                start&lt;br /&gt;
&lt;br /&gt;
        ;;&lt;br /&gt;
        *)&lt;br /&gt;
                echo &amp;quot;Utilize: stop | start | restart&amp;quot;&lt;br /&gt;
        ;;&lt;br /&gt;
esac&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vamos dar permissao e colocar na inicialização&lt;br /&gt;
 chmod +x /etc/init.d/rtpproxy &lt;br /&gt;
 update-rc.d rtpproxy defaults&lt;br /&gt;
 /etc/init.d/rtpproxy start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Criando o arquivo opensips.cfg===&lt;br /&gt;
O arquivo opensips.cfg é a onde a coisa toda acontece para o opensips, claro que ele dependerá de informações que estarão no banco de dados, mas é onde criamos todas as nossas rotas e validações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
####### Global Parameters #########&lt;br /&gt;
debug=3&lt;br /&gt;
log_stderror=no&lt;br /&gt;
log_facility=LOG_LOCAL0&lt;br /&gt;
&lt;br /&gt;
fork=yes&lt;br /&gt;
children=4&lt;br /&gt;
&lt;br /&gt;
/* Descomente as linhas abaixo para ativar o debug */&lt;br /&gt;
#debug=7&lt;br /&gt;
#fork=no&lt;br /&gt;
#log_stderror=yes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Comente a linha abaixo para ativar a descoberta automatica de enderecos locais&lt;br /&gt;
 , isso significa que o sistema ira verificar todos os ips ativos e hosts e entao ativara&lt;br /&gt;
 o protocolo para todos eles */ &lt;br /&gt;
auto_aliases=no&lt;br /&gt;
&lt;br /&gt;
/* Defina aqui o ip a ser utilizado */&lt;br /&gt;
listen=udp:10.254.254.6:5060   # Altere este IP para o seu ambiente&lt;br /&gt;
&lt;br /&gt;
/* Nao usaremos sip por tcp nem tls neste script */&lt;br /&gt;
disable_tcp=yes&lt;br /&gt;
&lt;br /&gt;
disable_tls=yes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Secao de modulos ########&lt;br /&gt;
&lt;br /&gt;
#set module path&lt;br /&gt;
mpath=&amp;quot;/usr//lib64/opensips/modules/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;signaling.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;sl.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;tm.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;fr_timer&amp;quot;, 5)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;fr_inv_timer&amp;quot;, 30)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;restart_fr_on_each_reply&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;rr.so&amp;quot;&lt;br /&gt;
/* do not append from tag to the RR (no need for this script) */&lt;br /&gt;
modparam(&amp;quot;rr&amp;quot;, &amp;quot;append_fromtag&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;maxfwd.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;sipmsgops.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;mi_fifo.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;mi_fifo&amp;quot;, &amp;quot;fifo_name&amp;quot;, &amp;quot;/tmp/opensips_fifo&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;mi_fifo&amp;quot;, &amp;quot;fifo_mode&amp;quot;, 0666)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;db_mysql.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;uri.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;uri&amp;quot;, &amp;quot;use_uri_table&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;usrloc.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;nat_bflag&amp;quot;, &amp;quot;FLB_NATB&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;db_mode&amp;quot;,   2)&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;db_url&amp;quot;,  &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;registrar.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;registrar&amp;quot;, &amp;quot;tcp_persistent_flag&amp;quot;, &amp;quot;TCP_PERSISTENT&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
/* Descomente a linha abaixo para nao permitir mais de 10 contatos por conta */&lt;br /&gt;
#modparam(&amp;quot;registrar&amp;quot;, &amp;quot;max_contacts&amp;quot;, 10)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;acc.so&amp;quot;&lt;br /&gt;
/* Quais eventos deverao ser registrados ? */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;early_media&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;report_cancels&amp;quot;, 0)&lt;br /&gt;
/* por padrao nos nao ajustamos a direcao em requisicoes sequencias, &lt;br /&gt;
 se voce deseja usar este recurso tenha certeza de ativar o &amp;quot;appen_fromtag&amp;quot; &lt;br /&gt;
 para o modulo &amp;quot;rr&amp;quot; */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;detect_direction&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;failed_transaction_flag&amp;quot;, &amp;quot;FLT_ACCFAILED&amp;quot;)&lt;br /&gt;
/* Gatilhos para accounting  (flags) */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_flag&amp;quot;, &amp;quot;FLT_ACC&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_missed_flag&amp;quot;, &amp;quot;FLT_ACCMISSED&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_extra&amp;quot;, &lt;br /&gt;
	&amp;quot;src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_flag&amp;quot;, &amp;quot;FLT_ACC&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_missed_flag&amp;quot;, &amp;quot;FLT_ACCMISSED&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_extra&amp;quot;, &amp;quot;src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;auth.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;auth_db.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;db_url&amp;quot;,  &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;calculate_ha1&amp;quot;, yes)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;password_column&amp;quot;, &amp;quot;password&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;load_credentials&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;permissions.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;permissions&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;alias_db.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;alias_db&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;presence.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;presence&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#loadmodule &amp;quot;presence_xml.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;dialog.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;db_mode&amp;quot;, 2)&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;db_url&amp;quot;,&amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;dlg_match_mode&amp;quot;, 1)&lt;br /&gt;
#modparam(&amp;quot;dialog&amp;quot;, &amp;quot;default_timeout&amp;quot;, 60)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;siptrace.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;trace_flag&amp;quot;, 22)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;traced_user_avp&amp;quot;, &amp;quot;$avp(s:traceuser)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;nathelper.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;natping_interval&amp;quot;, 30)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;ping_nated_only&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;sipping_bflag&amp;quot;, &amp;quot;FLB_NATSIPPING&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;sipping_from&amp;quot;, &amp;quot;sip:pinger@10.254.254.6&amp;quot;) # Altere o ip para o ip do servidor&lt;br /&gt;
modparam(&amp;quot;nathelper|registrar&amp;quot;, &amp;quot;received_avp&amp;quot;, &amp;quot;$avp(RECEIVED)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;rtpproxy.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;rtpproxy&amp;quot;, &amp;quot;rtpproxy_sock&amp;quot;, &amp;quot;udp:127.0.0.1:7722&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Logica de roteamento ########&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route {&lt;br /&gt;
&lt;br /&gt;
	if (!mf_process_maxfwd_header(&amp;quot;3&amp;quot;)) {&lt;br /&gt;
                send_reply(&amp;quot;483&amp;quot;,&amp;quot;looping&amp;quot;);&lt;br /&gt;
                exit;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;REQUISICAO RECEBIDA, ENVIANDO PARA REQINIT&amp;quot;);&lt;br /&gt;
	# Checagem inicial por requisicao&lt;br /&gt;
	route(REQINIT);&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA NAT&amp;quot;);&lt;br /&gt;
	# Deteccao de nat&lt;br /&gt;
	route(NAT);&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA WITHINDLG&amp;quot;);&lt;br /&gt;
	# Gerenciando requisicaoes com dialog&lt;br /&gt;
	route(WITHINDLG);&lt;br /&gt;
&lt;br /&gt;
	# Manipulando requisicoes iniciais (nao consta To tag)&lt;br /&gt;
	&lt;br /&gt;
	# Processando CANCEL&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;CANCEL&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD CANCEL&amp;quot;);&lt;br /&gt;
		if(t_check_trans()){&lt;br /&gt;
			t_relay();&lt;br /&gt;
		}&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	t_check_trans();&lt;br /&gt;
&lt;br /&gt;
	# Enviando para autenticacao&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA AUTENTICACAO&amp;quot;);&lt;br /&gt;
	route(AUTH);&lt;br /&gt;
&lt;br /&gt;
	# gravando rota para formacao dos dialogs (caso sejam roteados)&lt;br /&gt;
	# removemos qualquer cabecalho de rota pre carregado&lt;br /&gt;
	remove_hf(&amp;quot;Route&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE|SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD INVITE OU SIBSCRIBE&amp;quot;);&lt;br /&gt;
		record_route();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Contabilizando (acc) INVITES&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD INVITE, FAZENDOA ACC&amp;quot;);&lt;br /&gt;
		setflag(FLT_ACC);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Enviando chamada para destinos externos&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA SIPOUT&amp;quot;);&lt;br /&gt;
	route(SIPOUT);&lt;br /&gt;
&lt;br /&gt;
	# Requisicoes para dominio local&lt;br /&gt;
	&lt;br /&gt;
	# Roteando requisicoes de PRESENCE&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA PRESENCE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	route(PRESENCE);&lt;br /&gt;
&lt;br /&gt;
	# Gerenciando pedidos de registro&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA REGISTRAR&amp;quot;);	&lt;br /&gt;
	route(REGISTRAR);&lt;br /&gt;
&lt;br /&gt;
	if($ru==&amp;quot;&amp;quot;){&lt;br /&gt;
		xlog(&amp;quot;ru --&amp;gt; vazio&amp;quot;);&lt;br /&gt;
		# Requisicao sem usuario na RURI&lt;br /&gt;
		sl_send_reply(&amp;quot;484&amp;quot;, &amp;quot;Address Incomplete&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Enviando requisicao para PSTN&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA PSTN&amp;quot;);&lt;br /&gt;
	route(PSTN);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	# Salvando informacao de quem originou a chamad&lt;br /&gt;
	$avp(callee)=$rU;&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA DISPATCH PSTN&amp;quot;);&lt;br /&gt;
	route(FSDISPATCH);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	# Servico de localizacao de usuario&lt;br /&gt;
	route(LOCATION);&lt;br /&gt;
&lt;br /&gt;
	# Efetuando o relay (encaminhamento)&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[RELAY] {&lt;br /&gt;
	if(check_route_param(&amp;quot;nat=yes&amp;quot;)){&lt;br /&gt;
		setbflag(FLB_NATB);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(isflagset(FLT_NATS) || isbflagset(FLB_NATB)){&lt;br /&gt;
		#route(RTPPROXY);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
#	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
#		t_on_reply(&amp;quot;REPLY_ONE&amp;quot;);&lt;br /&gt;
#		t_on_failure(&amp;quot;FAIL_ONE&amp;quot;);&lt;br /&gt;
#	}&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;AQUI TENTAMOS ENVIAR A CHAMADA $fU $tU&amp;quot;);&lt;br /&gt;
	if(!t_relay()){&lt;br /&gt;
		xlog(&amp;quot;FALHA EM ENVIAR A CHAMADA, NAO FOI POSSIVEL FAZER O RELAY&amp;quot;);&lt;br /&gt;
		sl_reply_error();&lt;br /&gt;
	}&lt;br /&gt;
	xlog(&amp;quot;CHAMADA FOI ENVIADA AQUI, QUAL O ERRO ENTAO&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[REQINIT] {&lt;br /&gt;
	if(!mf_process_maxfwd_header(&amp;quot;10&amp;quot;)){&lt;br /&gt;
		sl_send_reply(&amp;quot;483&amp;quot;, &amp;quot;Too Many Hops&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[WITHINDLG] {&lt;br /&gt;
	if(has_totag()){&lt;br /&gt;
		if(loose_route()){&lt;br /&gt;
			if(is_method(&amp;quot;BYE&amp;quot;)){&lt;br /&gt;
				setflag(FLT_ACC);&lt;br /&gt;
				setflag(FLT_ACCFAILED);&lt;br /&gt;
			}&lt;br /&gt;
			route(RELAY);&lt;br /&gt;
		}else{&lt;br /&gt;
			if(is_method(&amp;quot;SUBSCRIBE&amp;quot;) &amp;amp;&amp;amp; uri==myself) {&lt;br /&gt;
				# requisicao de subscribe pre-estabelecida&lt;br /&gt;
				route(PRESENCE);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if(is_method(&amp;quot;ACK&amp;quot;)){&lt;br /&gt;
				if(t_check_trans()){&lt;br /&gt;
					t_relay();&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
			}else{&lt;br /&gt;
				# ACK para transacao nao encontrada, ignoramos...&lt;br /&gt;
				exit;&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			sl_send_reply(&amp;quot;404&amp;quot;, &amp;quot;Not Here&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		}	&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[REGISTRAR] {&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;REGISTER&amp;quot;)){&lt;br /&gt;
		if(isflagset(FLT_NATS)){&lt;br /&gt;
			setbflag(FLB_NATB);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(!save(&amp;quot;location&amp;quot;)){&lt;br /&gt;
			sl_reply_error();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[LOCATION] {&lt;br /&gt;
&lt;br /&gt;
	alias_db_lookup(&amp;quot;dbaliases&amp;quot;);&lt;br /&gt;
	if(!lookup(&amp;quot;location&amp;quot;)){&lt;br /&gt;
		switch($rc) {&lt;br /&gt;
			case -1:&lt;br /&gt;
			case -3:&lt;br /&gt;
				t_newtran();&lt;br /&gt;
				t_reply(&amp;quot;404&amp;quot;,&amp;quot;Not Found&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			case -2:&lt;br /&gt;
				sl_send_reply(&amp;quot;405&amp;quot;, &amp;quot;Method Not Allowed&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		setflag(FLT_ACCMISSED);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[PRESENCE] {&lt;br /&gt;
	if(!is_method(&amp;quot;PUBLISH|SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!t_newtran()){&lt;br /&gt;
		sl_reply_error();&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;PUBLISH&amp;quot;)){&lt;br /&gt;
		handle_publish();&lt;br /&gt;
	}else if(is_method(&amp;quot;SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		handle_subscribe();&lt;br /&gt;
	}&lt;br /&gt;
	exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[AUTH]{&lt;br /&gt;
	xlog(&amp;quot;PEDIDO DE AUTENTICACAO&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;REGISTER&amp;quot;)){&lt;br /&gt;
		# atentica pedidos de registro&lt;br /&gt;
		if(!www_authorize(&amp;quot;&amp;quot;, &amp;quot;subscriber&amp;quot;)){&lt;br /&gt;
			www_challenge(&amp;quot;&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if($au!=$tU){&lt;br /&gt;
			sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
	}else{&lt;br /&gt;
		if(route(FSINBOUND)){&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(check_source_address(&amp;quot;0&amp;quot;)){&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(from_uri==myself){&lt;br /&gt;
			if(!proxy_authorize(&amp;quot;&amp;quot;, &amp;quot;subscriber&amp;quot;)){&lt;br /&gt;
				proxy_challenge(&amp;quot;&amp;quot;,&amp;quot;0&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if(is_method(&amp;quot;PUBLISH&amp;quot;)){&lt;br /&gt;
				if($au!=$tU){&lt;br /&gt;
					sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
			}else{&lt;br /&gt;
				if($au!=$fU){&lt;br /&gt;
					sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			&lt;br /&gt;
			# Validamos (autenticamos) o usuario&lt;br /&gt;
			consume_credentials();&lt;br /&gt;
		}else{&lt;br /&gt;
		&lt;br /&gt;
			# usuario nao e local, vamos negar&lt;br /&gt;
			if(!uri==myself){&lt;br /&gt;
				sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not relaying&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}	&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[NAT] {&lt;br /&gt;
	force_rport();&lt;br /&gt;
	if(nat_uac_test(&amp;quot;19&amp;quot;)){&lt;br /&gt;
		if(method==&amp;quot;REGISTER&amp;quot;){&lt;br /&gt;
			fix_nated_register();&lt;br /&gt;
		}else{&lt;br /&gt;
			fix_nated_contact();&lt;br /&gt;
		}&lt;br /&gt;
		setflag(FLT_NATS);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[RTPPROXY] {&lt;br /&gt;
	if(is_method(&amp;quot;BYE&amp;quot;)){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}else if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		engage_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!has_totag()){&lt;br /&gt;
&lt;br /&gt;
		if(!check_route_param(&amp;quot;nat=yes&amp;quot;)){&lt;br /&gt;
			add_rr_param(&amp;quot;;nat=yes&amp;quot;);&lt;br /&gt;
			xlog(&amp;quot;NAT yes NAO ENCONTRADO&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[SIPOUT]{&lt;br /&gt;
	if(!uri==myself){&lt;br /&gt;
		append_hf(&amp;quot;P-hint: outbound\r\n&amp;quot;);&lt;br /&gt;
		route(RELAY);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[PSTN]{&lt;br /&gt;
        # neste caso apenas para exemplificar um uso simples&lt;br /&gt;
        # vamos fazer o redirecionamento par ao asterisk&lt;br /&gt;
        # realizar a dicagem da chamada&lt;br /&gt;
&lt;br /&gt;
        if(!($rU=~&amp;quot;^(\+|00)[1-9][0-9]{3,20}$&amp;quot;))&lt;br /&gt;
                return;&lt;br /&gt;
&lt;br /&gt;
        ## a regra acima aceita para discagem externa qualquer numero&lt;br /&gt;
        # comecado com 00 ou +&lt;br /&gt;
        #&lt;br /&gt;
&lt;br /&gt;
        if(from_uri!=myself){&lt;br /&gt;
                sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not Allowed&amp;quot;);&lt;br /&gt;
                exit;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $ru = &amp;quot;sip:&amp;quot; + $rU + &amp;quot;@&amp;quot; + &amp;quot;10.254.254.6:5090&amp;quot;;&lt;br /&gt;
        xlog(&amp;quot;NOVO DESTINO: $ru&amp;quot;);&lt;br /&gt;
        route(RELAY);&lt;br /&gt;
        exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[XMLRPC]{&lt;br /&gt;
	# nao vamos implementar esta funcionalidade&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSINBOUND] {&lt;br /&gt;
	# verificar para validar o ip do asterisk:porta&lt;br /&gt;
	# se bater , responder com return 1;&lt;br /&gt;
	if($si==&amp;quot;10.254.254.6&amp;quot; &amp;amp;&amp;amp; $sp==&amp;quot;5090&amp;quot;){&lt;br /&gt;
		return(1);&lt;br /&gt;
	}else{&lt;br /&gt;
		return(-1);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSDISPATCH] {&lt;br /&gt;
&lt;br /&gt;
	if(!is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(route(FSINBOUND)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;CAIMOS NO SWITCH, VAMOS LOCALIZAR O PERFIL DA CHAMADA $rU&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if($rU =~ &amp;quot;^41$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWITCH expressa comeca e termina em 41&amp;quot;);&lt;br /&gt;
			#regra de menu de voicemail, apenas &lt;br /&gt;
			# usuarios autenticados&lt;br /&gt;
			if($au==&amp;quot;&amp;quot;){&lt;br /&gt;
				sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not Allowed&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$rU = &amp;quot;vma-&amp;quot; + $au;&lt;br /&gt;
	}else if($rU =~ &amp;quot;^441[0-9][0-9]$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWTICH OPCA 441XX &amp;quot;);&lt;br /&gt;
			# numero discado comeca com 441 seguido de dois digitos&lt;br /&gt;
			# chamada direta para inbox do voicemail&lt;br /&gt;
			strip(2);&lt;br /&gt;
			route(FSVBOX);&lt;br /&gt;
	}else if($rU =~ &amp;quot;^433[01][0-9][0-9]$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWITCH OPCAO 433[01]XX&amp;quot;);&lt;br /&gt;
			# numero comecado em 443, seguido de 0 ou 1, mais dois digitos&lt;br /&gt;
			# sistema de conferencia&lt;br /&gt;
			strip(2);&lt;br /&gt;
	}else if($rU =~ &amp;quot;^45[0-9]+$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWTICH OPCAO 45X.&amp;quot;);&lt;br /&gt;
			#numero comecado com 45, seguindo de numeros;&lt;br /&gt;
			strip(2);&lt;br /&gt;
	}else{&lt;br /&gt;
			xlog(&amp;quot;OPCAO DEFAULT DO SWITCH&amp;quot;);&lt;br /&gt;
			# usuario offline, enviando para voicemail&lt;br /&gt;
			if(!registered(&amp;quot;location&amp;quot;)){&lt;br /&gt;
				route(FSVBOX);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			# usuario online, fazendo bridging&lt;br /&gt;
			xlog(&amp;quot;USUARIO ESTA ONLINE VAMOS FAZER BRIDGE&amp;quot;);&lt;br /&gt;
			prefix(&amp;quot;kb-&amp;quot;);&lt;br /&gt;
			if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
				t_on_failure(&amp;quot;FAIL_FSVBOX&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
	}&lt;br /&gt;
	route(FSRELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSVBOX]{&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA FSVBOX&amp;quot;);&lt;br /&gt;
	$du = &amp;quot;sip:&amp;quot; + &amp;quot;10.254.254.6&amp;quot; + &amp;quot;:&amp;quot; + &amp;quot;5090&amp;quot;;&lt;br /&gt;
	if($rU =~ &amp;quot;^441[0-9][0-9]&amp;quot;){&lt;br /&gt;
		strip(2);&lt;br /&gt;
	}&lt;br /&gt;
	prefix(&amp;quot;vm-&amp;quot;);&lt;br /&gt;
	if($var(newbranch)==1){&lt;br /&gt;
		append_branch();&lt;br /&gt;
		$var(newbranch)=0;&lt;br /&gt;
	}&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[FSRELAY] {&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA FSRELAY&amp;quot;);&lt;br /&gt;
	$du = &amp;quot;sip:&amp;quot; + &amp;quot;10.254.254.6&amp;quot; + &amp;quot;:&amp;quot; + &amp;quot;5090&amp;quot;;&lt;br /&gt;
	if($var(newbranch)==1){&lt;br /&gt;
		append_branch();&lt;br /&gt;
		$var(newbranch)=0;&lt;br /&gt;
	}&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
branch_route[BRANCH_ONE]{&lt;br /&gt;
	xlog(&amp;quot;new branch at $ru&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
onreply_route[REPLY_ONE]{&lt;br /&gt;
	xlog(&amp;quot;Incoming reply&amp;quot;);&lt;br /&gt;
	if((isflagset(FLT_NATS) || isbflagset(FLB_NATB) &amp;amp;&amp;amp; status =~ &amp;quot;(183)|(2[0-9][0-9])&amp;quot;)){&lt;br /&gt;
		#rtpproxy_offer();&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	if(isbflagset(FLB_NATB)){&lt;br /&gt;
		fix_nated_contact();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
failure_route[FAIL_ONE]{&lt;br /&gt;
	xlog(&amp;quot;FAILURE ROUTE FAIL_ONE&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;) &amp;amp;&amp;amp; (isbflagset(FLB_NATB) || isflagset(FLT_NATS))){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_was_cancelled()){&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
failure_route[FAIL_FSVBOX]{&lt;br /&gt;
	xlog(&amp;quot;FAILURE ROUTE FAIL_FSVBOX&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;) &amp;amp;&amp;amp; (isbflagset(FLB_NATB) || isflagset(FLT_NATS))){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_was_cancelled()){&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_check_status(&amp;quot;486|408|480&amp;quot;)){&lt;br /&gt;
		$rU = $avp(callee);&lt;br /&gt;
		$var(newbranch) = 1;&lt;br /&gt;
		route(FSVBOX);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testes com Opensips (registro)==&lt;br /&gt;
&lt;br /&gt;
Antes de podermos testar precisamos iniciar o serviço, no momento estamos com ele operando em modo debug, então a inicialização deve ser realizada com o comando abaixo&lt;br /&gt;
 /etc/init.d/opensips debug&lt;br /&gt;
&lt;br /&gt;
Abra uma nova sessão no servidor e então vamos criar os usuários&lt;br /&gt;
 opensipsctl add 101 101&lt;br /&gt;
 opensipsctl add 102 102&lt;br /&gt;
 opensipsctl add 103 103&lt;br /&gt;
&lt;br /&gt;
usuario 101 com senha 101 e assim por diante&lt;br /&gt;
&lt;br /&gt;
Faça a onexão com seu softphone, aqui para testes utilizei o jitsi e o zoiper, neste momento vamos apenas fazer o registro do usuário para testar a autenticação, se você tentar realizar uma discagem não funcionará pois neste caso o processo depende do Asterisk que ainda não está configurado, vamos dar inicio nesta configuração agora.&lt;br /&gt;
&lt;br /&gt;
==Asterisk==&lt;br /&gt;
Não vamos dar muitos detalhes da instalação do asterisk aqui, a ideia é simplesmente ter o mesmo funcionando da forma que necessitamos.&lt;br /&gt;
 apt-get install asterisk&lt;br /&gt;
&lt;br /&gt;
Após a instalação , abra o arquivo /etc/asterisk/sip.conf, localize a linha '''udpbindaddr=0.0.0.0''' e altere para '''udpbindaddr=0.0.0.0:5090'''  , depois ao fim do arquivo adicione.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[opensips]&lt;br /&gt;
type=peer&lt;br /&gt;
host=10.254.254.6&lt;br /&gt;
port=5060&lt;br /&gt;
qualify=yes&lt;br /&gt;
context=opensips&lt;br /&gt;
insecure=port,invite&lt;br /&gt;
canreinvite=no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agora abra o arquivo '''/etc/asterisk/extensions.conf''' , crie no fim do arquivo a seguinte entrada.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[opensips]&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _kb-1XX,1,NoOp(CHAMADA INTERNA - FAZER BRIDGE - ${CALLERID(num)} ${EXTEN:3})&lt;br /&gt;
same =&amp;gt; n,Dial(SIP/opensips/${EXTEN:3})&lt;br /&gt;
same =&amp;gt; n,Goto(opensips,vm-${EXTEN:3},1)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _vm-1XX,1,NoOp(CHAMADA PARA VOICEMAIL)&lt;br /&gt;
same =&amp;gt; n,Voicemail(${EXTEN:3}@default)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _vma-1XX,1,NoOp(CHAMADA PARA VOICEMAIL - ADMINISTRATIVO)&lt;br /&gt;
same =&amp;gt; n,VoicemailMain(${EXTEN:4}@default)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _3[01]XX,1,NoOp(CHAMADA PARA CONFERENCIA)&lt;br /&gt;
same =&amp;gt; n,Answer()&lt;br /&gt;
same =&amp;gt; n,ConfBridge(${EXTEN},cM1)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _00.,1,NoOp(CHAMADA PARA PSTN)&lt;br /&gt;
same =&amp;gt; n,Wait(2)&lt;br /&gt;
same =&amp;gt; n,Answer()&lt;br /&gt;
same =&amp;gt; n,Wait(1)&lt;br /&gt;
same =&amp;gt; n,PlayBack(tt-monkeys)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; h,1,Hangup()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente precisamos criar as entradas do voicemail, para isso altere o arquivo '''/etc/asterisk/voicemail.conf''' localize o contexto '''[default]''' e então adicione as entradas para seu voicemail, segue dois exemplos abaixo.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
101 =&amp;gt; 123123,Mike Tesliuk&lt;br /&gt;
102 =&amp;gt; 123123,Mike Tesliuk 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Feito isso, faça um restart no asterisk&lt;br /&gt;
 /etc/init.d/asterisk restart&lt;br /&gt;
&lt;br /&gt;
Agora você ja poderá fazer os testes, basicamente criamos as seguintes situações para serem testadas.&lt;br /&gt;
&lt;br /&gt;
*1 Autenticação de usuários&lt;br /&gt;
*2 Chamada entre usuários&lt;br /&gt;
*3 Encaminhamento para caixa postal&lt;br /&gt;
*4 Acesso a caixa postal&lt;br /&gt;
*5 Acesso a conferência&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPs_e_Asterisk&amp;diff=1524</id>
		<title>OpenSIPs e Asterisk</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPs_e_Asterisk&amp;diff=1524"/>
		<updated>2021-04-15T22:53:51Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Precisando de recursos de númeração para fazer seus testes ? contrate conosco em www.brdvoz.com.br&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color: red;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;font color=white&amp;gt; Falta realizar os ajustes / testes para o NAT no mais esta tudo funcionado adequadamente a principio &amp;lt;/font&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este tutorial é baseado em um tutorial similar porém utilizando Kamailio e Freeswtich, se quiser verificar o tutorial original acesse http://kb.asipto.com/freeswitch:kamailio-3.1.x-freeswitch-1.0.6d-sbc.&lt;br /&gt;
&lt;br /&gt;
Para esta implementação utilizamos Debian 7.0 amd64 , OpenSIPS 1.9 e Asterisk 1.8.23 &lt;br /&gt;
&lt;br /&gt;
==Funcionalidades==&lt;br /&gt;
Este tutorial tem por objetivo atingir as seguintes funcionalidades.&lt;br /&gt;
*Autenticação de usuário&lt;br /&gt;
*Registro de usuário&lt;br /&gt;
*Localização de usuário (encaminhamento de chamadas)&lt;br /&gt;
*Roteamento de chamadas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Através do Asterisk estenderemos estas funcionalidades agregando.&lt;br /&gt;
*Correio de voz (Voicemail)&lt;br /&gt;
*Conferencia &lt;br /&gt;
*SBC ( Pode ser utilizado para transcoding, esconder topologia, play de mensagens e tarifação )&lt;br /&gt;
*Outros serviços de media (Anuncios, Ura's e coisas do tipo)&lt;br /&gt;
&lt;br /&gt;
==Definições==&lt;br /&gt;
Para um melhor entendimento da solução vamos expor aqui algumas definições de nosso sistema.&lt;br /&gt;
*Usuários locais terão ramais com 3 digitos (ex: 101, 102, 103)&lt;br /&gt;
*Identidade do correio de voz será o mesmo do ramal&lt;br /&gt;
*Serviços de media (acesso a voicemail e outros) receberão rotas de 4 digitos&lt;br /&gt;
*Opensips e Asterisk utilizarão o mesmo servidor (Neste caso IP: 10.254.254.6)&lt;br /&gt;
*Os serviços rodarão nas portas 5060 (opensips) , 5090 (Asterisk)&lt;br /&gt;
&lt;br /&gt;
==Funcionamento==&lt;br /&gt;
A autenticação do usuário será realizada pelo OpenSIPs, quando uma chamada é autenticada então ela serguirá:&lt;br /&gt;
*Se o usuário de destino não está online a chamada será enviada para o Asterisk para função de correio de voz&lt;br /&gt;
*Se o usuário está online a chamada será encaminhada para o Asterisk, dest forma é possivel acionar funcionalidades como anuncios, definição de tempo de chamada, forçar codecs e outras funcionalidades.&lt;br /&gt;
*Asterisk envia a chamada novamente para o OpenSIPs que verificará no location e entregará a chamada para o usuário.&lt;br /&gt;
*Se a chamada não for atendida o Opensips irá re-encaminhar para o Asterisk direcionando para função de voicemail&lt;br /&gt;
&lt;br /&gt;
==OpenSIPs==&lt;br /&gt;
Vamos iniciar o processo de instalação com o OpenSIPs, siga os procedimentos abaixo para evitar qualquer dificuldade.&lt;br /&gt;
&lt;br /&gt;
===Dependencias===&lt;br /&gt;
Execute o comando abaixo para instalar todas as dependencias necessárias&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install gcc make libncurses5-dev libnewt-dev libxml2-dev unixodbc \ &lt;br /&gt;
unixodbc-dev libmysqlclient15-dev libxmlrpc-c3-dev libexpat1-dev zlib1g-dev \ &lt;br /&gt;
m4 bison flex libpcre3-dev mysql-server vim apache2-mpm-prefork libapache2-mod-php5 \&lt;br /&gt;
 php5-mysql php5-xmlrpc php-pear  ngrep g++ libjpeg62-dev libssl-dev &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Durante a instalação o sistema irá lhe perguntar a senha de root para o servidor MySQL é importante que você se lembre da mesma posteriormente pois utilizaremos a mesma.&lt;br /&gt;
&lt;br /&gt;
===Compilando o OpenSIPs===&lt;br /&gt;
Para manter um padrão onde os dados estao vamos utilizar o diretório /usr/src/ para o download de código fonte.&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src/&lt;br /&gt;
 wget -c http://opensips.org/pub/opensips/1.9.1/src/opensips-1.9.1_src.tar.gz&lt;br /&gt;
 tar -xzvf opensips-1.9.1_src.tar.gz&lt;br /&gt;
 cd opensips-1.9.1-tls/&lt;br /&gt;
 make menuconfig&lt;br /&gt;
&lt;br /&gt;
Neste ponto o sistema irá abrir uma tela com algumas opções para selecionar, Acesse a primeira opção do menu, no submenu acesse a segunda opção ( Configure excluded modules ), selecione os módulos db_mysql , dialplan , mi_xmlrpc , presence e presence_xml&lt;br /&gt;
&lt;br /&gt;
Agora volte ao submenu, e selecione a opção Save Changes, volte para o menu principal e selecione '''Compile and Install OpenSips''' , deixe que o sistema execute suas funções.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ao finalizar a compilação você retornará ao menu, va na opção '''Exit and Save all changes'''&lt;br /&gt;
&lt;br /&gt;
===Preparando a Configuração===&lt;br /&gt;
&lt;br /&gt;
Antes de darmos inicio ao arquivo de configuração, vamos ajustar algumas questões, o opensips instala os arquivos (se voce nao alterar o parametro) em /usr, consequentemente as configurações ficam em /usr/etc , eu por padrão faço um link para o diretório /etc, assim acesso as configurações em /etc/opensips&lt;br /&gt;
&lt;br /&gt;
 ln -s /usr/etc/opensips /etc/&lt;br /&gt;
&lt;br /&gt;
No caso do debian o script de inicialização utiliza um arquivo extra de configuração&lt;br /&gt;
 cp packaging/debian/opensips.default /etc/default/opensips&lt;br /&gt;
&lt;br /&gt;
Para o script de inicialização execute o comando abaixo&lt;br /&gt;
 cp packaging/debian/opensips.init /etc/init.d/opensips&lt;br /&gt;
 chmod +x /etc/init.d/opensips&lt;br /&gt;
 update-rc.d opensips defaults&lt;br /&gt;
&lt;br /&gt;
Edite o arquivo /etc/default/opensips , a altere o parametro '''RUN_OPENSIPS''' para yes&lt;br /&gt;
&lt;br /&gt;
Você pode notar que no arquivo é mensionado o usuário de execução do opensips como opensips, então vamos ter de criar este usuário ( e grupo )&lt;br /&gt;
&lt;br /&gt;
 groupadd opensips&lt;br /&gt;
 mkdir /var/run/opensips&lt;br /&gt;
 useradd -d /var/run/opensips/ -s /bin/false -g opensips opensips&lt;br /&gt;
 chown -R opensips.opensips /var/run/opensips&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Configurando o opensipsctl===&lt;br /&gt;
O opensipsctl (e opensipsdbctl) utilizam o arquivo de configuração /etc/opensips/opensipsctlrc, abaixo segue o conteúdo do arquivo. (Sugiro que você faça um backup dos arquivos originais para ter uma copia, existem parametros que você pode estudar depois).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DBENGINE=MYSQL&lt;br /&gt;
DBHOST=localhost&lt;br /&gt;
DBNAME=opensips&lt;br /&gt;
DBRWUSER=opensips&lt;br /&gt;
DBRWPW=&amp;quot;opensipsrw&amp;quot;&lt;br /&gt;
SIP_DOMAIN=10.254.254.6  ### caso voce esteja usando outro ip altere aqui&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DBROOTUSER=&amp;quot;root&amp;quot;&lt;br /&gt;
INSTALL_EXTRA_TABLES=ask&lt;br /&gt;
ALIASES_TYPE=&amp;quot;DB&amp;quot;&lt;br /&gt;
MI_CONNECTOR=FIFO:/tmp/opensips_fifo&lt;br /&gt;
# VERIFY_ACL=1&lt;br /&gt;
# ACL_GROUPS=&amp;quot;local ld int voicemail free-pstn&amp;quot;&lt;br /&gt;
# VERBOSE=1&lt;br /&gt;
# STORE_PLAINTEXT_PW=0&lt;br /&gt;
# NOHLPRINT=1&lt;br /&gt;
PID_FILE=/var/run/opensips/opensips.pid&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Criando o banco de dados===&lt;br /&gt;
Agora que temos nosso arquivo configurado vamos fazer a criação do banco de dados, execute o comando abaixo.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
opensipsdbctl create opensips&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O sistema irá lhe perguntar algumas coisas, responda Y (sim) para todas para que ele instale todas as tabelas, não usaremos todas elas, mas desta forma você fica com praticamente tudo criado para o caso de uma expansão dos recursos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Instalando o RTP Proxy===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /usr/src/&lt;br /&gt;
wget -c http://b2bua.org/chrome/site/rtpproxy-1.2.1.tar.gz&lt;br /&gt;
tar -xzvf rtpproxy-1.2.1.tar.gz&lt;br /&gt;
cd rtpproxy-1.2.1&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
groupadd rtpproxy&lt;br /&gt;
useradd -d /var/run/rtpproxy -s /bin/true -g rtpproxy rtpproxy&lt;br /&gt;
mkdir /var/log/rtpproxy&lt;br /&gt;
mkdir /var/run/rtpproxy&lt;br /&gt;
chown -R rtpproxy.rtpproxy /var/log/rtpproxy&lt;br /&gt;
chown -R rtpproxy.rtpproxy /var/run/rtpproxy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Arquivo de inicialização====&lt;br /&gt;
'''/etc/init.d/rtpproxy'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Este script e de autoria de Mike Tesliuk&lt;br /&gt;
# qualquer falha no mesmo por favor informe &lt;br /&gt;
# atraves do email mike (a) tesliuk.com&lt;br /&gt;
#&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          rtpproxy&lt;br /&gt;
# Required-Start:    $syslog $network $local_fs $time&lt;br /&gt;
# Required-Stop:     $syslog $network $local_fs&lt;br /&gt;
# Default-Start:     2 3 4 5&lt;br /&gt;
# Default-Stop:      0 1 6&lt;br /&gt;
# Short-Description: Start the RTPPROXY server&lt;br /&gt;
# Description:       Start the RTPPROXY server&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
&lt;br /&gt;
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin&lt;br /&gt;
USELOG=1&lt;br /&gt;
USER=rtpproxy&lt;br /&gt;
# Altere o ip abaixo para o ip de seu sistema&lt;br /&gt;
IPADDR=&amp;quot;10.254.254.6&amp;quot;&lt;br /&gt;
&lt;br /&gt;
. /lib/lsb/init-functions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
start(){&lt;br /&gt;
        echo &amp;quot;Iniciando RTP PROXY &amp;quot;&lt;br /&gt;
        if [ -z $(pidof rtpproxy) ]; then&lt;br /&gt;
                if [ &amp;quot;${USELOG}&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
                        echo &amp;quot;Iniciando com LOG&amp;quot;&lt;br /&gt;
                        /usr/local/bin/rtpproxy -l $IPADDR -s udp:127.0.0.1:7722 -u $USER -F -f d DBUG 2&amp;amp;&amp;gt; /var/log/rtpproxy/rtpproxy.log &amp;amp;&lt;br /&gt;
                else&lt;br /&gt;
                        echo &amp;quot;Iniciando sem LOG&amp;quot;&lt;br /&gt;
                        /usr/local/bin/rtpproxy -l $IPADDR -s udp:127.0.0.1:7722 -u $USER  -F -f d DBUG 2&amp;amp;&amp;gt; /dev/null&lt;br /&gt;
                fi&lt;br /&gt;
&lt;br /&gt;
                if [ -n $(pidof rtpproxy) ]; then&lt;br /&gt;
                        echo &amp;quot;START OK&amp;quot;&lt;br /&gt;
                fi&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Processo ja em execucao&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
stop(){&lt;br /&gt;
&lt;br /&gt;
        if [ -z $(pidof rtpproxy) ]; then&lt;br /&gt;
                echo &amp;quot;Processo nao encontrado&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                kill -9 $(pidof rtpproxy)&lt;br /&gt;
                if [ -n $(pidof rtpproxy) ]; then&lt;br /&gt;
                        echo &amp;quot;STOP OK&amp;quot;&lt;br /&gt;
                else&lt;br /&gt;
                        echo &amp;quot;Falha em realizar stop do servico&amp;quot;&lt;br /&gt;
                fi&lt;br /&gt;
&lt;br /&gt;
        fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
case $1 in&lt;br /&gt;
        start)&lt;br /&gt;
                start&lt;br /&gt;
        ;;&lt;br /&gt;
        stop)&lt;br /&gt;
                stop&lt;br /&gt;
        ;;&lt;br /&gt;
        restart)&lt;br /&gt;
                stop&lt;br /&gt;
                start&lt;br /&gt;
&lt;br /&gt;
        ;;&lt;br /&gt;
        *)&lt;br /&gt;
                echo &amp;quot;Utilize: stop | start | restart&amp;quot;&lt;br /&gt;
        ;;&lt;br /&gt;
esac&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vamos dar permissao e colocar na inicialização&lt;br /&gt;
 chmod +x /etc/init.d/rtpproxy &lt;br /&gt;
 update-rc.d rtpproxy defaults&lt;br /&gt;
 /etc/init.d/rtpproxy start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Criando o arquivo opensips.cfg===&lt;br /&gt;
O arquivo opensips.cfg é a onde a coisa toda acontece para o opensips, claro que ele dependerá de informações que estarão no banco de dados, mas é onde criamos todas as nossas rotas e validações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
####### Global Parameters #########&lt;br /&gt;
debug=3&lt;br /&gt;
log_stderror=no&lt;br /&gt;
log_facility=LOG_LOCAL0&lt;br /&gt;
&lt;br /&gt;
fork=yes&lt;br /&gt;
children=4&lt;br /&gt;
&lt;br /&gt;
/* Descomente as linhas abaixo para ativar o debug */&lt;br /&gt;
#debug=7&lt;br /&gt;
#fork=no&lt;br /&gt;
#log_stderror=yes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Comente a linha abaixo para ativar a descoberta automatica de enderecos locais&lt;br /&gt;
 , isso significa que o sistema ira verificar todos os ips ativos e hosts e entao ativara&lt;br /&gt;
 o protocolo para todos eles */ &lt;br /&gt;
auto_aliases=no&lt;br /&gt;
&lt;br /&gt;
/* Defina aqui o ip a ser utilizado */&lt;br /&gt;
listen=udp:10.254.254.6:5060   # Altere este IP para o seu ambiente&lt;br /&gt;
&lt;br /&gt;
/* Nao usaremos sip por tcp nem tls neste script */&lt;br /&gt;
disable_tcp=yes&lt;br /&gt;
&lt;br /&gt;
disable_tls=yes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Secao de modulos ########&lt;br /&gt;
&lt;br /&gt;
#set module path&lt;br /&gt;
mpath=&amp;quot;/usr//lib64/opensips/modules/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;signaling.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;sl.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;tm.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;fr_timer&amp;quot;, 5)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;fr_inv_timer&amp;quot;, 30)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;restart_fr_on_each_reply&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;rr.so&amp;quot;&lt;br /&gt;
/* do not append from tag to the RR (no need for this script) */&lt;br /&gt;
modparam(&amp;quot;rr&amp;quot;, &amp;quot;append_fromtag&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;maxfwd.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;sipmsgops.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;mi_fifo.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;mi_fifo&amp;quot;, &amp;quot;fifo_name&amp;quot;, &amp;quot;/tmp/opensips_fifo&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;mi_fifo&amp;quot;, &amp;quot;fifo_mode&amp;quot;, 0666)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;db_mysql.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;uri.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;uri&amp;quot;, &amp;quot;use_uri_table&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;usrloc.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;nat_bflag&amp;quot;, &amp;quot;FLB_NATB&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;db_mode&amp;quot;,   2)&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;db_url&amp;quot;,  &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;registrar.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;registrar&amp;quot;, &amp;quot;tcp_persistent_flag&amp;quot;, &amp;quot;TCP_PERSISTENT&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
/* Descomente a linha abaixo para nao permitir mais de 10 contatos por conta */&lt;br /&gt;
#modparam(&amp;quot;registrar&amp;quot;, &amp;quot;max_contacts&amp;quot;, 10)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;acc.so&amp;quot;&lt;br /&gt;
/* Quais eventos deverao ser registrados ? */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;early_media&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;report_cancels&amp;quot;, 0)&lt;br /&gt;
/* por padrao nos nao ajustamos a direcao em requisicoes sequencias, &lt;br /&gt;
 se voce deseja usar este recurso tenha certeza de ativar o &amp;quot;appen_fromtag&amp;quot; &lt;br /&gt;
 para o modulo &amp;quot;rr&amp;quot; */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;detect_direction&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;failed_transaction_flag&amp;quot;, &amp;quot;FLT_ACCFAILED&amp;quot;)&lt;br /&gt;
/* Gatilhos para accounting  (flags) */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_flag&amp;quot;, &amp;quot;FLT_ACC&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_missed_flag&amp;quot;, &amp;quot;FLT_ACCMISSED&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_extra&amp;quot;, &lt;br /&gt;
	&amp;quot;src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_flag&amp;quot;, &amp;quot;FLT_ACC&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_missed_flag&amp;quot;, &amp;quot;FLT_ACCMISSED&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_extra&amp;quot;, &amp;quot;src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;auth.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;auth_db.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;db_url&amp;quot;,  &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;calculate_ha1&amp;quot;, yes)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;password_column&amp;quot;, &amp;quot;password&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;load_credentials&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;permissions.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;permissions&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;alias_db.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;alias_db&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;presence.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;presence&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#loadmodule &amp;quot;presence_xml.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;dialog.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;db_mode&amp;quot;, 2)&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;db_url&amp;quot;,&amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;dlg_match_mode&amp;quot;, 1)&lt;br /&gt;
#modparam(&amp;quot;dialog&amp;quot;, &amp;quot;default_timeout&amp;quot;, 60)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;siptrace.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;trace_flag&amp;quot;, 22)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;traced_user_avp&amp;quot;, &amp;quot;$avp(s:traceuser)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;nathelper.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;natping_interval&amp;quot;, 30)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;ping_nated_only&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;sipping_bflag&amp;quot;, &amp;quot;FLB_NATSIPPING&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;sipping_from&amp;quot;, &amp;quot;sip:pinger@10.254.254.6&amp;quot;) # Altere o ip para o ip do servidor&lt;br /&gt;
modparam(&amp;quot;nathelper|registrar&amp;quot;, &amp;quot;received_avp&amp;quot;, &amp;quot;$avp(RECEIVED)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;rtpproxy.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;rtpproxy&amp;quot;, &amp;quot;rtpproxy_sock&amp;quot;, &amp;quot;udp:127.0.0.1:7722&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Logica de roteamento ########&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route {&lt;br /&gt;
&lt;br /&gt;
	if (!mf_process_maxfwd_header(&amp;quot;3&amp;quot;)) {&lt;br /&gt;
                send_reply(&amp;quot;483&amp;quot;,&amp;quot;looping&amp;quot;);&lt;br /&gt;
                exit;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;REQUISICAO RECEBIDA, ENVIANDO PARA REQINIT&amp;quot;);&lt;br /&gt;
	# Checagem inicial por requisicao&lt;br /&gt;
	route(REQINIT);&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA NAT&amp;quot;);&lt;br /&gt;
	# Deteccao de nat&lt;br /&gt;
	route(NAT);&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA WITHINDLG&amp;quot;);&lt;br /&gt;
	# Gerenciando requisicaoes com dialog&lt;br /&gt;
	route(WITHINDLG);&lt;br /&gt;
&lt;br /&gt;
	# Manipulando requisicoes iniciais (nao consta To tag)&lt;br /&gt;
	&lt;br /&gt;
	# Processando CANCEL&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;CANCEL&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD CANCEL&amp;quot;);&lt;br /&gt;
		if(t_check_trans()){&lt;br /&gt;
			t_relay();&lt;br /&gt;
		}&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	t_check_trans();&lt;br /&gt;
&lt;br /&gt;
	# Enviando para autenticacao&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA AUTENTICACAO&amp;quot;);&lt;br /&gt;
	route(AUTH);&lt;br /&gt;
&lt;br /&gt;
	# gravando rota para formacao dos dialogs (caso sejam roteados)&lt;br /&gt;
	# removemos qualquer cabecalho de rota pre carregado&lt;br /&gt;
	remove_hf(&amp;quot;Route&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE|SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD INVITE OU SIBSCRIBE&amp;quot;);&lt;br /&gt;
		record_route();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Contabilizando (acc) INVITES&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD INVITE, FAZENDOA ACC&amp;quot;);&lt;br /&gt;
		setflag(FLT_ACC);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Enviando chamada para destinos externos&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA SIPOUT&amp;quot;);&lt;br /&gt;
	route(SIPOUT);&lt;br /&gt;
&lt;br /&gt;
	# Requisicoes para dominio local&lt;br /&gt;
	&lt;br /&gt;
	# Roteando requisicoes de PRESENCE&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA PRESENCE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	route(PRESENCE);&lt;br /&gt;
&lt;br /&gt;
	# Gerenciando pedidos de registro&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA REGISTRAR&amp;quot;);	&lt;br /&gt;
	route(REGISTRAR);&lt;br /&gt;
&lt;br /&gt;
	if($ru==&amp;quot;&amp;quot;){&lt;br /&gt;
		xlog(&amp;quot;ru --&amp;gt; vazio&amp;quot;);&lt;br /&gt;
		# Requisicao sem usuario na RURI&lt;br /&gt;
		sl_send_reply(&amp;quot;484&amp;quot;, &amp;quot;Address Incomplete&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Enviando requisicao para PSTN&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA PSTN&amp;quot;);&lt;br /&gt;
	route(PSTN);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	# Salvando informacao de quem originou a chamad&lt;br /&gt;
	$avp(callee)=$rU;&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA DISPATCH PSTN&amp;quot;);&lt;br /&gt;
	route(FSDISPATCH);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	# Servico de localizacao de usuario&lt;br /&gt;
	route(LOCATION);&lt;br /&gt;
&lt;br /&gt;
	# Efetuando o relay (encaminhamento)&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[RELAY] {&lt;br /&gt;
	if(check_route_param(&amp;quot;nat=yes&amp;quot;)){&lt;br /&gt;
		setbflag(FLB_NATB);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(isflagset(FLT_NATS) || isbflagset(FLB_NATB)){&lt;br /&gt;
		#route(RTPPROXY);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
#	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
#		t_on_reply(&amp;quot;REPLY_ONE&amp;quot;);&lt;br /&gt;
#		t_on_failure(&amp;quot;FAIL_ONE&amp;quot;);&lt;br /&gt;
#	}&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;AQUI TENTAMOS ENVIAR A CHAMADA $fU $tU&amp;quot;);&lt;br /&gt;
	if(!t_relay()){&lt;br /&gt;
		xlog(&amp;quot;FALHA EM ENVIAR A CHAMADA, NAO FOI POSSIVEL FAZER O RELAY&amp;quot;);&lt;br /&gt;
		sl_reply_error();&lt;br /&gt;
	}&lt;br /&gt;
	xlog(&amp;quot;CHAMADA FOI ENVIADA AQUI, QUAL O ERRO ENTAO&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[REQINIT] {&lt;br /&gt;
	if(!mf_process_maxfwd_header(&amp;quot;10&amp;quot;)){&lt;br /&gt;
		sl_send_reply(&amp;quot;483&amp;quot;, &amp;quot;Too Many Hops&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[WITHINDLG] {&lt;br /&gt;
	if(has_totag()){&lt;br /&gt;
		if(loose_route()){&lt;br /&gt;
			if(is_method(&amp;quot;BYE&amp;quot;)){&lt;br /&gt;
				setflag(FLT_ACC);&lt;br /&gt;
				setflag(FLT_ACCFAILED);&lt;br /&gt;
			}&lt;br /&gt;
			route(RELAY);&lt;br /&gt;
		}else{&lt;br /&gt;
			if(is_method(&amp;quot;SUBSCRIBE&amp;quot;) &amp;amp;&amp;amp; uri==myself) {&lt;br /&gt;
				# requisicao de subscribe pre-estabelecida&lt;br /&gt;
				route(PRESENCE);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if(is_method(&amp;quot;ACK&amp;quot;)){&lt;br /&gt;
				if(t_check_trans()){&lt;br /&gt;
					t_relay();&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
			}else{&lt;br /&gt;
				# ACK para transacao nao encontrada, ignoramos...&lt;br /&gt;
				exit;&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			sl_send_reply(&amp;quot;404&amp;quot;, &amp;quot;Not Here&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		}	&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[REGISTRAR] {&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;REGISTER&amp;quot;)){&lt;br /&gt;
		if(isflagset(FLT_NATS)){&lt;br /&gt;
			setbflag(FLB_NATB);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(!save(&amp;quot;location&amp;quot;)){&lt;br /&gt;
			sl_reply_error();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[LOCATION] {&lt;br /&gt;
&lt;br /&gt;
	alias_db_lookup(&amp;quot;dbaliases&amp;quot;);&lt;br /&gt;
	if(!lookup(&amp;quot;location&amp;quot;)){&lt;br /&gt;
		switch($rc) {&lt;br /&gt;
			case -1:&lt;br /&gt;
			case -3:&lt;br /&gt;
				t_newtran();&lt;br /&gt;
				t_reply(&amp;quot;404&amp;quot;,&amp;quot;Not Found&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			case -2:&lt;br /&gt;
				sl_send_reply(&amp;quot;405&amp;quot;, &amp;quot;Method Not Allowed&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		setflag(FLT_ACCMISSED);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[PRESENCE] {&lt;br /&gt;
	if(!is_method(&amp;quot;PUBLISH|SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!t_newtran()){&lt;br /&gt;
		sl_reply_error();&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;PUBLISH&amp;quot;)){&lt;br /&gt;
		handle_publish();&lt;br /&gt;
	}else if(is_method(&amp;quot;SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		handle_subscribe();&lt;br /&gt;
	}&lt;br /&gt;
	exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[AUTH]{&lt;br /&gt;
	xlog(&amp;quot;PEDIDO DE AUTENTICACAO&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;REGISTER&amp;quot;)){&lt;br /&gt;
		# atentica pedidos de registro&lt;br /&gt;
		if(!www_authorize(&amp;quot;&amp;quot;, &amp;quot;subscriber&amp;quot;)){&lt;br /&gt;
			www_challenge(&amp;quot;&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if($au!=$tU){&lt;br /&gt;
			sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
	}else{&lt;br /&gt;
		if(route(FSINBOUND)){&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(check_source_address(&amp;quot;0&amp;quot;)){&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(from_uri==myself){&lt;br /&gt;
			if(!proxy_authorize(&amp;quot;&amp;quot;, &amp;quot;subscriber&amp;quot;)){&lt;br /&gt;
				proxy_challenge(&amp;quot;&amp;quot;,&amp;quot;0&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if(is_method(&amp;quot;PUBLISH&amp;quot;)){&lt;br /&gt;
				if($au!=$tU){&lt;br /&gt;
					sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
			}else{&lt;br /&gt;
				if($au!=$fU){&lt;br /&gt;
					sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			&lt;br /&gt;
			# Validamos (autenticamos) o usuario&lt;br /&gt;
			consume_credentials();&lt;br /&gt;
		}else{&lt;br /&gt;
		&lt;br /&gt;
			# usuario nao e local, vamos negar&lt;br /&gt;
			if(!uri==myself){&lt;br /&gt;
				sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not relaying&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}	&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[NAT] {&lt;br /&gt;
	force_rport();&lt;br /&gt;
	if(nat_uac_test(&amp;quot;19&amp;quot;)){&lt;br /&gt;
		if(method==&amp;quot;REGISTER&amp;quot;){&lt;br /&gt;
			fix_nated_register();&lt;br /&gt;
		}else{&lt;br /&gt;
			fix_nated_contact();&lt;br /&gt;
		}&lt;br /&gt;
		setflag(FLT_NATS);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[RTPPROXY] {&lt;br /&gt;
	if(is_method(&amp;quot;BYE&amp;quot;)){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}else if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		engage_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!has_totag()){&lt;br /&gt;
&lt;br /&gt;
		if(!check_route_param(&amp;quot;nat=yes&amp;quot;)){&lt;br /&gt;
			add_rr_param(&amp;quot;;nat=yes&amp;quot;);&lt;br /&gt;
			xlog(&amp;quot;NAT yes NAO ENCONTRADO&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[SIPOUT]{&lt;br /&gt;
	if(!uri==myself){&lt;br /&gt;
		append_hf(&amp;quot;P-hint: outbound\r\n&amp;quot;);&lt;br /&gt;
		route(RELAY);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[PSTN]{&lt;br /&gt;
        # neste caso apenas para exemplificar um uso simples&lt;br /&gt;
        # vamos fazer o redirecionamento par ao asterisk&lt;br /&gt;
        # realizar a dicagem da chamada&lt;br /&gt;
&lt;br /&gt;
        if(!($rU=~&amp;quot;^(\+|00)[1-9][0-9]{3,20}$&amp;quot;))&lt;br /&gt;
                return;&lt;br /&gt;
&lt;br /&gt;
        ## a regra acima aceita para discagem externa qualquer numero&lt;br /&gt;
        # comecado com 00 ou +&lt;br /&gt;
        #&lt;br /&gt;
&lt;br /&gt;
        if(from_uri!=myself){&lt;br /&gt;
                sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not Allowed&amp;quot;);&lt;br /&gt;
                exit;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $ru = &amp;quot;sip:&amp;quot; + $rU + &amp;quot;@&amp;quot; + &amp;quot;10.254.254.6:5090&amp;quot;;&lt;br /&gt;
        xlog(&amp;quot;NOVO DESTINO: $ru&amp;quot;);&lt;br /&gt;
        route(RELAY);&lt;br /&gt;
        exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[XMLRPC]{&lt;br /&gt;
	# nao vamos implementar esta funcionalidade&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSINBOUND] {&lt;br /&gt;
	# verificar para validar o ip do asterisk:porta&lt;br /&gt;
	# se bater , responder com return 1;&lt;br /&gt;
	if($si==&amp;quot;10.254.254.6&amp;quot; &amp;amp;&amp;amp; $sp==&amp;quot;5090&amp;quot;){&lt;br /&gt;
		return(1);&lt;br /&gt;
	}else{&lt;br /&gt;
		return(-1);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSDISPATCH] {&lt;br /&gt;
&lt;br /&gt;
	if(!is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(route(FSINBOUND)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;CAIMOS NO SWITCH, VAMOS LOCALIZAR O PERFIL DA CHAMADA $rU&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if($rU =~ &amp;quot;^41$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWITCH expressa comeca e termina em 41&amp;quot;);&lt;br /&gt;
			#regra de menu de voicemail, apenas &lt;br /&gt;
			# usuarios autenticados&lt;br /&gt;
			if($au==&amp;quot;&amp;quot;){&lt;br /&gt;
				sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not Allowed&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$rU = &amp;quot;vma-&amp;quot; + $au;&lt;br /&gt;
	}else if($rU =~ &amp;quot;^441[0-9][0-9]$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWTICH OPCA 441XX &amp;quot;);&lt;br /&gt;
			# numero discado comeca com 441 seguido de dois digitos&lt;br /&gt;
			# chamada direta para inbox do voicemail&lt;br /&gt;
			strip(2);&lt;br /&gt;
			route(FSVBOX);&lt;br /&gt;
	}else if($rU =~ &amp;quot;^433[01][0-9][0-9]$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWITCH OPCAO 433[01]XX&amp;quot;);&lt;br /&gt;
			# numero comecado em 443, seguido de 0 ou 1, mais dois digitos&lt;br /&gt;
			# sistema de conferencia&lt;br /&gt;
			strip(2);&lt;br /&gt;
	}else if($rU =~ &amp;quot;^45[0-9]+$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWTICH OPCAO 45X.&amp;quot;);&lt;br /&gt;
			#numero comecado com 45, seguindo de numeros;&lt;br /&gt;
			strip(2);&lt;br /&gt;
	}else{&lt;br /&gt;
			xlog(&amp;quot;OPCAO DEFAULT DO SWITCH&amp;quot;);&lt;br /&gt;
			# usuario offline, enviando para voicemail&lt;br /&gt;
			if(!registered(&amp;quot;location&amp;quot;)){&lt;br /&gt;
				route(FSVBOX);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			# usuario online, fazendo bridging&lt;br /&gt;
			xlog(&amp;quot;USUARIO ESTA ONLINE VAMOS FAZER BRIDGE&amp;quot;);&lt;br /&gt;
			prefix(&amp;quot;kb-&amp;quot;);&lt;br /&gt;
			if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
				t_on_failure(&amp;quot;FAIL_FSVBOX&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
	}&lt;br /&gt;
	route(FSRELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSVBOX]{&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA FSVBOX&amp;quot;);&lt;br /&gt;
	$du = &amp;quot;sip:&amp;quot; + &amp;quot;10.254.254.6&amp;quot; + &amp;quot;:&amp;quot; + &amp;quot;5090&amp;quot;;&lt;br /&gt;
	if($rU =~ &amp;quot;^441[0-9][0-9]&amp;quot;){&lt;br /&gt;
		strip(2);&lt;br /&gt;
	}&lt;br /&gt;
	prefix(&amp;quot;vm-&amp;quot;);&lt;br /&gt;
	if($var(newbranch)==1){&lt;br /&gt;
		append_branch();&lt;br /&gt;
		$var(newbranch)=0;&lt;br /&gt;
	}&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[FSRELAY] {&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA FSRELAY&amp;quot;);&lt;br /&gt;
	$du = &amp;quot;sip:&amp;quot; + &amp;quot;10.254.254.6&amp;quot; + &amp;quot;:&amp;quot; + &amp;quot;5090&amp;quot;;&lt;br /&gt;
	if($var(newbranch)==1){&lt;br /&gt;
		append_branch();&lt;br /&gt;
		$var(newbranch)=0;&lt;br /&gt;
	}&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
branch_route[BRANCH_ONE]{&lt;br /&gt;
	xlog(&amp;quot;new branch at $ru&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
onreply_route[REPLY_ONE]{&lt;br /&gt;
	xlog(&amp;quot;Incoming reply&amp;quot;);&lt;br /&gt;
	if((isflagset(FLT_NATS) || isbflagset(FLB_NATB) &amp;amp;&amp;amp; status =~ &amp;quot;(183)|(2[0-9][0-9])&amp;quot;)){&lt;br /&gt;
		#rtpproxy_offer();&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	if(isbflagset(FLB_NATB)){&lt;br /&gt;
		fix_nated_contact();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
failure_route[FAIL_ONE]{&lt;br /&gt;
	xlog(&amp;quot;FAILURE ROUTE FAIL_ONE&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;) &amp;amp;&amp;amp; (isbflagset(FLB_NATB) || isflagset(FLT_NATS))){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_was_cancelled()){&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
failure_route[FAIL_FSVBOX]{&lt;br /&gt;
	xlog(&amp;quot;FAILURE ROUTE FAIL_FSVBOX&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;) &amp;amp;&amp;amp; (isbflagset(FLB_NATB) || isflagset(FLT_NATS))){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_was_cancelled()){&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_check_status(&amp;quot;486|408|480&amp;quot;)){&lt;br /&gt;
		$rU = $avp(callee);&lt;br /&gt;
		$var(newbranch) = 1;&lt;br /&gt;
		route(FSVBOX);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testes com Opensips (registro)==&lt;br /&gt;
&lt;br /&gt;
Antes de podermos testar precisamos iniciar o serviço, no momento estamos com ele operando em modo debug, então a inicialização deve ser realizada com o comando abaixo&lt;br /&gt;
 /etc/init.d/opensips debug&lt;br /&gt;
&lt;br /&gt;
Abra uma nova sessão no servidor e então vamos criar os usuários&lt;br /&gt;
 opensipsctl add 101 101&lt;br /&gt;
 opensipsctl add 102 102&lt;br /&gt;
 opensipsctl add 103 103&lt;br /&gt;
&lt;br /&gt;
usuario 101 com senha 101 e assim por diante&lt;br /&gt;
&lt;br /&gt;
Faça a onexão com seu softphone, aqui para testes utilizei o jitsi e o zoiper, neste momento vamos apenas fazer o registro do usuário para testar a autenticação, se você tentar realizar uma discagem não funcionará pois neste caso o processo depende do Asterisk que ainda não está configurado, vamos dar inicio nesta configuração agora.&lt;br /&gt;
&lt;br /&gt;
==Asterisk==&lt;br /&gt;
Não vamos dar muitos detalhes da instalação do asterisk aqui, a ideia é simplesmente ter o mesmo funcionando da forma que necessitamos.&lt;br /&gt;
 apt-get install asterisk&lt;br /&gt;
&lt;br /&gt;
Após a instalação , abra o arquivo /etc/asterisk/sip.conf, localize a linha '''udpbindaddr=0.0.0.0''' e altere para '''udpbindaddr=0.0.0.0:5090'''  , depois ao fim do arquivo adicione.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[opensips]&lt;br /&gt;
type=peer&lt;br /&gt;
host=10.254.254.6&lt;br /&gt;
port=5060&lt;br /&gt;
qualify=yes&lt;br /&gt;
context=opensips&lt;br /&gt;
insecure=port,invite&lt;br /&gt;
canreinvite=no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agora abra o arquivo '''/etc/asterisk/extensions.conf''' , crie no fim do arquivo a seguinte entrada.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[opensips]&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _kb-1XX,1,NoOp(CHAMADA INTERNA - FAZER BRIDGE - ${CALLERID(num)} ${EXTEN:3})&lt;br /&gt;
same =&amp;gt; n,Dial(SIP/opensips/${EXTEN:3})&lt;br /&gt;
same =&amp;gt; n,Goto(opensips,vm-${EXTEN:3},1)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _vm-1XX,1,NoOp(CHAMADA PARA VOICEMAIL)&lt;br /&gt;
same =&amp;gt; n,Voicemail(${EXTEN:3}@default)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _vma-1XX,1,NoOp(CHAMADA PARA VOICEMAIL - ADMINISTRATIVO)&lt;br /&gt;
same =&amp;gt; n,VoicemailMain(${EXTEN:4}@default)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _3[01]XX,1,NoOp(CHAMADA PARA CONFERENCIA)&lt;br /&gt;
same =&amp;gt; n,Answer()&lt;br /&gt;
same =&amp;gt; n,ConfBridge(${EXTEN},cM1)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _00.,1,NoOp(CHAMADA PARA PSTN)&lt;br /&gt;
same =&amp;gt; n,Wait(2)&lt;br /&gt;
same =&amp;gt; n,Answer()&lt;br /&gt;
same =&amp;gt; n,Wait(1)&lt;br /&gt;
same =&amp;gt; n,PlayBack(tt-monkeys)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; h,1,Hangup()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente precisamos criar as entradas do voicemail, para isso altere o arquivo '''/etc/asterisk/voicemail.conf''' localize o contexto '''[default]''' e então adicione as entradas para seu voicemail, segue dois exemplos abaixo.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
101 =&amp;gt; 123123,Mike Tesliuk&lt;br /&gt;
102 =&amp;gt; 123123,Mike Tesliuk 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Feito isso, faça um restart no asterisk&lt;br /&gt;
 /etc/init.d/asterisk restart&lt;br /&gt;
&lt;br /&gt;
Agora você ja poderá fazer os testes, basicamente criamos as seguintes situações para serem testadas.&lt;br /&gt;
&lt;br /&gt;
*1 Autenticação de usuários&lt;br /&gt;
*2 Chamada entre usuários&lt;br /&gt;
*3 Encaminhamento para caixa postal&lt;br /&gt;
*4 Acesso a caixa postal&lt;br /&gt;
*5 Acesso a conferência&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPs_e_Asterisk&amp;diff=1523</id>
		<title>OpenSIPs e Asterisk</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPs_e_Asterisk&amp;diff=1523"/>
		<updated>2021-04-15T22:53:22Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Precisando de recursos de númeração para fazer seus testes ? contrate conosco em www.brdvoz.com.br|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color: red;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;&amp;lt;font color=white&amp;gt; Falta realizar os ajustes / testes para o NAT no mais esta tudo funcionado adequadamente a principio &amp;lt;/font&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Este tutorial é baseado em um tutorial similar porém utilizando Kamailio e Freeswtich, se quiser verificar o tutorial original acesse http://kb.asipto.com/freeswitch:kamailio-3.1.x-freeswitch-1.0.6d-sbc.&lt;br /&gt;
&lt;br /&gt;
Para esta implementação utilizamos Debian 7.0 amd64 , OpenSIPS 1.9 e Asterisk 1.8.23 &lt;br /&gt;
&lt;br /&gt;
==Funcionalidades==&lt;br /&gt;
Este tutorial tem por objetivo atingir as seguintes funcionalidades.&lt;br /&gt;
*Autenticação de usuário&lt;br /&gt;
*Registro de usuário&lt;br /&gt;
*Localização de usuário (encaminhamento de chamadas)&lt;br /&gt;
*Roteamento de chamadas&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Através do Asterisk estenderemos estas funcionalidades agregando.&lt;br /&gt;
*Correio de voz (Voicemail)&lt;br /&gt;
*Conferencia &lt;br /&gt;
*SBC ( Pode ser utilizado para transcoding, esconder topologia, play de mensagens e tarifação )&lt;br /&gt;
*Outros serviços de media (Anuncios, Ura's e coisas do tipo)&lt;br /&gt;
&lt;br /&gt;
==Definições==&lt;br /&gt;
Para um melhor entendimento da solução vamos expor aqui algumas definições de nosso sistema.&lt;br /&gt;
*Usuários locais terão ramais com 3 digitos (ex: 101, 102, 103)&lt;br /&gt;
*Identidade do correio de voz será o mesmo do ramal&lt;br /&gt;
*Serviços de media (acesso a voicemail e outros) receberão rotas de 4 digitos&lt;br /&gt;
*Opensips e Asterisk utilizarão o mesmo servidor (Neste caso IP: 10.254.254.6)&lt;br /&gt;
*Os serviços rodarão nas portas 5060 (opensips) , 5090 (Asterisk)&lt;br /&gt;
&lt;br /&gt;
==Funcionamento==&lt;br /&gt;
A autenticação do usuário será realizada pelo OpenSIPs, quando uma chamada é autenticada então ela serguirá:&lt;br /&gt;
*Se o usuário de destino não está online a chamada será enviada para o Asterisk para função de correio de voz&lt;br /&gt;
*Se o usuário está online a chamada será encaminhada para o Asterisk, dest forma é possivel acionar funcionalidades como anuncios, definição de tempo de chamada, forçar codecs e outras funcionalidades.&lt;br /&gt;
*Asterisk envia a chamada novamente para o OpenSIPs que verificará no location e entregará a chamada para o usuário.&lt;br /&gt;
*Se a chamada não for atendida o Opensips irá re-encaminhar para o Asterisk direcionando para função de voicemail&lt;br /&gt;
&lt;br /&gt;
==OpenSIPs==&lt;br /&gt;
Vamos iniciar o processo de instalação com o OpenSIPs, siga os procedimentos abaixo para evitar qualquer dificuldade.&lt;br /&gt;
&lt;br /&gt;
===Dependencias===&lt;br /&gt;
Execute o comando abaixo para instalar todas as dependencias necessárias&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install gcc make libncurses5-dev libnewt-dev libxml2-dev unixodbc \ &lt;br /&gt;
unixodbc-dev libmysqlclient15-dev libxmlrpc-c3-dev libexpat1-dev zlib1g-dev \ &lt;br /&gt;
m4 bison flex libpcre3-dev mysql-server vim apache2-mpm-prefork libapache2-mod-php5 \&lt;br /&gt;
 php5-mysql php5-xmlrpc php-pear  ngrep g++ libjpeg62-dev libssl-dev &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Durante a instalação o sistema irá lhe perguntar a senha de root para o servidor MySQL é importante que você se lembre da mesma posteriormente pois utilizaremos a mesma.&lt;br /&gt;
&lt;br /&gt;
===Compilando o OpenSIPs===&lt;br /&gt;
Para manter um padrão onde os dados estao vamos utilizar o diretório /usr/src/ para o download de código fonte.&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src/&lt;br /&gt;
 wget -c http://opensips.org/pub/opensips/1.9.1/src/opensips-1.9.1_src.tar.gz&lt;br /&gt;
 tar -xzvf opensips-1.9.1_src.tar.gz&lt;br /&gt;
 cd opensips-1.9.1-tls/&lt;br /&gt;
 make menuconfig&lt;br /&gt;
&lt;br /&gt;
Neste ponto o sistema irá abrir uma tela com algumas opções para selecionar, Acesse a primeira opção do menu, no submenu acesse a segunda opção ( Configure excluded modules ), selecione os módulos db_mysql , dialplan , mi_xmlrpc , presence e presence_xml&lt;br /&gt;
&lt;br /&gt;
Agora volte ao submenu, e selecione a opção Save Changes, volte para o menu principal e selecione '''Compile and Install OpenSips''' , deixe que o sistema execute suas funções.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ao finalizar a compilação você retornará ao menu, va na opção '''Exit and Save all changes'''&lt;br /&gt;
&lt;br /&gt;
===Preparando a Configuração===&lt;br /&gt;
&lt;br /&gt;
Antes de darmos inicio ao arquivo de configuração, vamos ajustar algumas questões, o opensips instala os arquivos (se voce nao alterar o parametro) em /usr, consequentemente as configurações ficam em /usr/etc , eu por padrão faço um link para o diretório /etc, assim acesso as configurações em /etc/opensips&lt;br /&gt;
&lt;br /&gt;
 ln -s /usr/etc/opensips /etc/&lt;br /&gt;
&lt;br /&gt;
No caso do debian o script de inicialização utiliza um arquivo extra de configuração&lt;br /&gt;
 cp packaging/debian/opensips.default /etc/default/opensips&lt;br /&gt;
&lt;br /&gt;
Para o script de inicialização execute o comando abaixo&lt;br /&gt;
 cp packaging/debian/opensips.init /etc/init.d/opensips&lt;br /&gt;
 chmod +x /etc/init.d/opensips&lt;br /&gt;
 update-rc.d opensips defaults&lt;br /&gt;
&lt;br /&gt;
Edite o arquivo /etc/default/opensips , a altere o parametro '''RUN_OPENSIPS''' para yes&lt;br /&gt;
&lt;br /&gt;
Você pode notar que no arquivo é mensionado o usuário de execução do opensips como opensips, então vamos ter de criar este usuário ( e grupo )&lt;br /&gt;
&lt;br /&gt;
 groupadd opensips&lt;br /&gt;
 mkdir /var/run/opensips&lt;br /&gt;
 useradd -d /var/run/opensips/ -s /bin/false -g opensips opensips&lt;br /&gt;
 chown -R opensips.opensips /var/run/opensips&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Configurando o opensipsctl===&lt;br /&gt;
O opensipsctl (e opensipsdbctl) utilizam o arquivo de configuração /etc/opensips/opensipsctlrc, abaixo segue o conteúdo do arquivo. (Sugiro que você faça um backup dos arquivos originais para ter uma copia, existem parametros que você pode estudar depois).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DBENGINE=MYSQL&lt;br /&gt;
DBHOST=localhost&lt;br /&gt;
DBNAME=opensips&lt;br /&gt;
DBRWUSER=opensips&lt;br /&gt;
DBRWPW=&amp;quot;opensipsrw&amp;quot;&lt;br /&gt;
SIP_DOMAIN=10.254.254.6  ### caso voce esteja usando outro ip altere aqui&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DBROOTUSER=&amp;quot;root&amp;quot;&lt;br /&gt;
INSTALL_EXTRA_TABLES=ask&lt;br /&gt;
ALIASES_TYPE=&amp;quot;DB&amp;quot;&lt;br /&gt;
MI_CONNECTOR=FIFO:/tmp/opensips_fifo&lt;br /&gt;
# VERIFY_ACL=1&lt;br /&gt;
# ACL_GROUPS=&amp;quot;local ld int voicemail free-pstn&amp;quot;&lt;br /&gt;
# VERBOSE=1&lt;br /&gt;
# STORE_PLAINTEXT_PW=0&lt;br /&gt;
# NOHLPRINT=1&lt;br /&gt;
PID_FILE=/var/run/opensips/opensips.pid&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Criando o banco de dados===&lt;br /&gt;
Agora que temos nosso arquivo configurado vamos fazer a criação do banco de dados, execute o comando abaixo.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
opensipsdbctl create opensips&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O sistema irá lhe perguntar algumas coisas, responda Y (sim) para todas para que ele instale todas as tabelas, não usaremos todas elas, mas desta forma você fica com praticamente tudo criado para o caso de uma expansão dos recursos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Instalando o RTP Proxy===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /usr/src/&lt;br /&gt;
wget -c http://b2bua.org/chrome/site/rtpproxy-1.2.1.tar.gz&lt;br /&gt;
tar -xzvf rtpproxy-1.2.1.tar.gz&lt;br /&gt;
cd rtpproxy-1.2.1&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
groupadd rtpproxy&lt;br /&gt;
useradd -d /var/run/rtpproxy -s /bin/true -g rtpproxy rtpproxy&lt;br /&gt;
mkdir /var/log/rtpproxy&lt;br /&gt;
mkdir /var/run/rtpproxy&lt;br /&gt;
chown -R rtpproxy.rtpproxy /var/log/rtpproxy&lt;br /&gt;
chown -R rtpproxy.rtpproxy /var/run/rtpproxy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Arquivo de inicialização====&lt;br /&gt;
'''/etc/init.d/rtpproxy'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Este script e de autoria de Mike Tesliuk&lt;br /&gt;
# qualquer falha no mesmo por favor informe &lt;br /&gt;
# atraves do email mike (a) tesliuk.com&lt;br /&gt;
#&lt;br /&gt;
### BEGIN INIT INFO&lt;br /&gt;
# Provides:          rtpproxy&lt;br /&gt;
# Required-Start:    $syslog $network $local_fs $time&lt;br /&gt;
# Required-Stop:     $syslog $network $local_fs&lt;br /&gt;
# Default-Start:     2 3 4 5&lt;br /&gt;
# Default-Stop:      0 1 6&lt;br /&gt;
# Short-Description: Start the RTPPROXY server&lt;br /&gt;
# Description:       Start the RTPPROXY server&lt;br /&gt;
### END INIT INFO&lt;br /&gt;
&lt;br /&gt;
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin&lt;br /&gt;
USELOG=1&lt;br /&gt;
USER=rtpproxy&lt;br /&gt;
# Altere o ip abaixo para o ip de seu sistema&lt;br /&gt;
IPADDR=&amp;quot;10.254.254.6&amp;quot;&lt;br /&gt;
&lt;br /&gt;
. /lib/lsb/init-functions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
start(){&lt;br /&gt;
        echo &amp;quot;Iniciando RTP PROXY &amp;quot;&lt;br /&gt;
        if [ -z $(pidof rtpproxy) ]; then&lt;br /&gt;
                if [ &amp;quot;${USELOG}&amp;quot; = &amp;quot;1&amp;quot; ]; then&lt;br /&gt;
                        echo &amp;quot;Iniciando com LOG&amp;quot;&lt;br /&gt;
                        /usr/local/bin/rtpproxy -l $IPADDR -s udp:127.0.0.1:7722 -u $USER -F -f d DBUG 2&amp;amp;&amp;gt; /var/log/rtpproxy/rtpproxy.log &amp;amp;&lt;br /&gt;
                else&lt;br /&gt;
                        echo &amp;quot;Iniciando sem LOG&amp;quot;&lt;br /&gt;
                        /usr/local/bin/rtpproxy -l $IPADDR -s udp:127.0.0.1:7722 -u $USER  -F -f d DBUG 2&amp;amp;&amp;gt; /dev/null&lt;br /&gt;
                fi&lt;br /&gt;
&lt;br /&gt;
                if [ -n $(pidof rtpproxy) ]; then&lt;br /&gt;
                        echo &amp;quot;START OK&amp;quot;&lt;br /&gt;
                fi&lt;br /&gt;
        else&lt;br /&gt;
                echo &amp;quot;Processo ja em execucao&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
stop(){&lt;br /&gt;
&lt;br /&gt;
        if [ -z $(pidof rtpproxy) ]; then&lt;br /&gt;
                echo &amp;quot;Processo nao encontrado&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
                kill -9 $(pidof rtpproxy)&lt;br /&gt;
                if [ -n $(pidof rtpproxy) ]; then&lt;br /&gt;
                        echo &amp;quot;STOP OK&amp;quot;&lt;br /&gt;
                else&lt;br /&gt;
                        echo &amp;quot;Falha em realizar stop do servico&amp;quot;&lt;br /&gt;
                fi&lt;br /&gt;
&lt;br /&gt;
        fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
case $1 in&lt;br /&gt;
        start)&lt;br /&gt;
                start&lt;br /&gt;
        ;;&lt;br /&gt;
        stop)&lt;br /&gt;
                stop&lt;br /&gt;
        ;;&lt;br /&gt;
        restart)&lt;br /&gt;
                stop&lt;br /&gt;
                start&lt;br /&gt;
&lt;br /&gt;
        ;;&lt;br /&gt;
        *)&lt;br /&gt;
                echo &amp;quot;Utilize: stop | start | restart&amp;quot;&lt;br /&gt;
        ;;&lt;br /&gt;
esac&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vamos dar permissao e colocar na inicialização&lt;br /&gt;
 chmod +x /etc/init.d/rtpproxy &lt;br /&gt;
 update-rc.d rtpproxy defaults&lt;br /&gt;
 /etc/init.d/rtpproxy start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Criando o arquivo opensips.cfg===&lt;br /&gt;
O arquivo opensips.cfg é a onde a coisa toda acontece para o opensips, claro que ele dependerá de informações que estarão no banco de dados, mas é onde criamos todas as nossas rotas e validações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
####### Global Parameters #########&lt;br /&gt;
debug=3&lt;br /&gt;
log_stderror=no&lt;br /&gt;
log_facility=LOG_LOCAL0&lt;br /&gt;
&lt;br /&gt;
fork=yes&lt;br /&gt;
children=4&lt;br /&gt;
&lt;br /&gt;
/* Descomente as linhas abaixo para ativar o debug */&lt;br /&gt;
#debug=7&lt;br /&gt;
#fork=no&lt;br /&gt;
#log_stderror=yes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Comente a linha abaixo para ativar a descoberta automatica de enderecos locais&lt;br /&gt;
 , isso significa que o sistema ira verificar todos os ips ativos e hosts e entao ativara&lt;br /&gt;
 o protocolo para todos eles */ &lt;br /&gt;
auto_aliases=no&lt;br /&gt;
&lt;br /&gt;
/* Defina aqui o ip a ser utilizado */&lt;br /&gt;
listen=udp:10.254.254.6:5060   # Altere este IP para o seu ambiente&lt;br /&gt;
&lt;br /&gt;
/* Nao usaremos sip por tcp nem tls neste script */&lt;br /&gt;
disable_tcp=yes&lt;br /&gt;
&lt;br /&gt;
disable_tls=yes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Secao de modulos ########&lt;br /&gt;
&lt;br /&gt;
#set module path&lt;br /&gt;
mpath=&amp;quot;/usr//lib64/opensips/modules/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;signaling.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;sl.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;tm.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;fr_timer&amp;quot;, 5)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;fr_inv_timer&amp;quot;, 30)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;restart_fr_on_each_reply&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;rr.so&amp;quot;&lt;br /&gt;
/* do not append from tag to the RR (no need for this script) */&lt;br /&gt;
modparam(&amp;quot;rr&amp;quot;, &amp;quot;append_fromtag&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;maxfwd.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;sipmsgops.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;mi_fifo.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;mi_fifo&amp;quot;, &amp;quot;fifo_name&amp;quot;, &amp;quot;/tmp/opensips_fifo&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;mi_fifo&amp;quot;, &amp;quot;fifo_mode&amp;quot;, 0666)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;db_mysql.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;uri.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;uri&amp;quot;, &amp;quot;use_uri_table&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;usrloc.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;nat_bflag&amp;quot;, &amp;quot;FLB_NATB&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;db_mode&amp;quot;,   2)&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;db_url&amp;quot;,  &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;registrar.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;registrar&amp;quot;, &amp;quot;tcp_persistent_flag&amp;quot;, &amp;quot;TCP_PERSISTENT&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
/* Descomente a linha abaixo para nao permitir mais de 10 contatos por conta */&lt;br /&gt;
#modparam(&amp;quot;registrar&amp;quot;, &amp;quot;max_contacts&amp;quot;, 10)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;acc.so&amp;quot;&lt;br /&gt;
/* Quais eventos deverao ser registrados ? */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;early_media&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;report_cancels&amp;quot;, 0)&lt;br /&gt;
/* por padrao nos nao ajustamos a direcao em requisicoes sequencias, &lt;br /&gt;
 se voce deseja usar este recurso tenha certeza de ativar o &amp;quot;appen_fromtag&amp;quot; &lt;br /&gt;
 para o modulo &amp;quot;rr&amp;quot; */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;detect_direction&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;failed_transaction_flag&amp;quot;, &amp;quot;FLT_ACCFAILED&amp;quot;)&lt;br /&gt;
/* Gatilhos para accounting  (flags) */&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_flag&amp;quot;, &amp;quot;FLT_ACC&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_missed_flag&amp;quot;, &amp;quot;FLT_ACCMISSED&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;log_extra&amp;quot;, &lt;br /&gt;
	&amp;quot;src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_flag&amp;quot;, &amp;quot;FLT_ACC&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_missed_flag&amp;quot;, &amp;quot;FLT_ACCMISSED&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;acc&amp;quot;, &amp;quot;db_extra&amp;quot;, &amp;quot;src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;auth.so&amp;quot;&lt;br /&gt;
loadmodule &amp;quot;auth_db.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;db_url&amp;quot;,  &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;calculate_ha1&amp;quot;, yes)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;password_column&amp;quot;, &amp;quot;password&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;auth_db&amp;quot;, &amp;quot;load_credentials&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;permissions.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;permissions&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;alias_db.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;alias_db&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;presence.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;presence&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
#loadmodule &amp;quot;presence_xml.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;dialog.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;db_mode&amp;quot;, 2)&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;db_url&amp;quot;,&amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;dialog&amp;quot;, &amp;quot;dlg_match_mode&amp;quot;, 1)&lt;br /&gt;
#modparam(&amp;quot;dialog&amp;quot;, &amp;quot;default_timeout&amp;quot;, 60)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;siptrace.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;db_url&amp;quot;, &amp;quot;mysql://opensips:opensipsrw@localhost/opensips&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;trace_flag&amp;quot;, 22)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;traced_user_avp&amp;quot;, &amp;quot;$avp(s:traceuser)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;nathelper.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;natping_interval&amp;quot;, 30)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;ping_nated_only&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;sipping_bflag&amp;quot;, &amp;quot;FLB_NATSIPPING&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;sipping_from&amp;quot;, &amp;quot;sip:pinger@10.254.254.6&amp;quot;) # Altere o ip para o ip do servidor&lt;br /&gt;
modparam(&amp;quot;nathelper|registrar&amp;quot;, &amp;quot;received_avp&amp;quot;, &amp;quot;$avp(RECEIVED)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
loadmodule &amp;quot;rtpproxy.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;rtpproxy&amp;quot;, &amp;quot;rtpproxy_sock&amp;quot;, &amp;quot;udp:127.0.0.1:7722&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Logica de roteamento ########&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route {&lt;br /&gt;
&lt;br /&gt;
	if (!mf_process_maxfwd_header(&amp;quot;3&amp;quot;)) {&lt;br /&gt;
                send_reply(&amp;quot;483&amp;quot;,&amp;quot;looping&amp;quot;);&lt;br /&gt;
                exit;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;REQUISICAO RECEBIDA, ENVIANDO PARA REQINIT&amp;quot;);&lt;br /&gt;
	# Checagem inicial por requisicao&lt;br /&gt;
	route(REQINIT);&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA NAT&amp;quot;);&lt;br /&gt;
	# Deteccao de nat&lt;br /&gt;
	route(NAT);&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA WITHINDLG&amp;quot;);&lt;br /&gt;
	# Gerenciando requisicaoes com dialog&lt;br /&gt;
	route(WITHINDLG);&lt;br /&gt;
&lt;br /&gt;
	# Manipulando requisicoes iniciais (nao consta To tag)&lt;br /&gt;
	&lt;br /&gt;
	# Processando CANCEL&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;CANCEL&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD CANCEL&amp;quot;);&lt;br /&gt;
		if(t_check_trans()){&lt;br /&gt;
			t_relay();&lt;br /&gt;
		}&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	t_check_trans();&lt;br /&gt;
&lt;br /&gt;
	# Enviando para autenticacao&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA AUTENTICACAO&amp;quot;);&lt;br /&gt;
	route(AUTH);&lt;br /&gt;
&lt;br /&gt;
	# gravando rota para formacao dos dialogs (caso sejam roteados)&lt;br /&gt;
	# removemos qualquer cabecalho de rota pre carregado&lt;br /&gt;
	remove_hf(&amp;quot;Route&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE|SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD INVITE OU SIBSCRIBE&amp;quot;);&lt;br /&gt;
		record_route();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Contabilizando (acc) INVITES&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		xlog(&amp;quot;METHOD INVITE, FAZENDOA ACC&amp;quot;);&lt;br /&gt;
		setflag(FLT_ACC);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Enviando chamada para destinos externos&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA SIPOUT&amp;quot;);&lt;br /&gt;
	route(SIPOUT);&lt;br /&gt;
&lt;br /&gt;
	# Requisicoes para dominio local&lt;br /&gt;
	&lt;br /&gt;
	# Roteando requisicoes de PRESENCE&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA PRESENCE&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	route(PRESENCE);&lt;br /&gt;
&lt;br /&gt;
	# Gerenciando pedidos de registro&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA REGISTRAR&amp;quot;);	&lt;br /&gt;
	route(REGISTRAR);&lt;br /&gt;
&lt;br /&gt;
	if($ru==&amp;quot;&amp;quot;){&lt;br /&gt;
		xlog(&amp;quot;ru --&amp;gt; vazio&amp;quot;);&lt;br /&gt;
		# Requisicao sem usuario na RURI&lt;br /&gt;
		sl_send_reply(&amp;quot;484&amp;quot;, &amp;quot;Address Incomplete&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Enviando requisicao para PSTN&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA PSTN&amp;quot;);&lt;br /&gt;
	route(PSTN);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	# Salvando informacao de quem originou a chamad&lt;br /&gt;
	$avp(callee)=$rU;&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA DISPATCH PSTN&amp;quot;);&lt;br /&gt;
	route(FSDISPATCH);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	# Servico de localizacao de usuario&lt;br /&gt;
	route(LOCATION);&lt;br /&gt;
&lt;br /&gt;
	# Efetuando o relay (encaminhamento)&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[RELAY] {&lt;br /&gt;
	if(check_route_param(&amp;quot;nat=yes&amp;quot;)){&lt;br /&gt;
		setbflag(FLB_NATB);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(isflagset(FLT_NATS) || isbflagset(FLB_NATB)){&lt;br /&gt;
		#route(RTPPROXY);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
#	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
#		t_on_reply(&amp;quot;REPLY_ONE&amp;quot;);&lt;br /&gt;
#		t_on_failure(&amp;quot;FAIL_ONE&amp;quot;);&lt;br /&gt;
#	}&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;AQUI TENTAMOS ENVIAR A CHAMADA $fU $tU&amp;quot;);&lt;br /&gt;
	if(!t_relay()){&lt;br /&gt;
		xlog(&amp;quot;FALHA EM ENVIAR A CHAMADA, NAO FOI POSSIVEL FAZER O RELAY&amp;quot;);&lt;br /&gt;
		sl_reply_error();&lt;br /&gt;
	}&lt;br /&gt;
	xlog(&amp;quot;CHAMADA FOI ENVIADA AQUI, QUAL O ERRO ENTAO&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[REQINIT] {&lt;br /&gt;
	if(!mf_process_maxfwd_header(&amp;quot;10&amp;quot;)){&lt;br /&gt;
		sl_send_reply(&amp;quot;483&amp;quot;, &amp;quot;Too Many Hops&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[WITHINDLG] {&lt;br /&gt;
	if(has_totag()){&lt;br /&gt;
		if(loose_route()){&lt;br /&gt;
			if(is_method(&amp;quot;BYE&amp;quot;)){&lt;br /&gt;
				setflag(FLT_ACC);&lt;br /&gt;
				setflag(FLT_ACCFAILED);&lt;br /&gt;
			}&lt;br /&gt;
			route(RELAY);&lt;br /&gt;
		}else{&lt;br /&gt;
			if(is_method(&amp;quot;SUBSCRIBE&amp;quot;) &amp;amp;&amp;amp; uri==myself) {&lt;br /&gt;
				# requisicao de subscribe pre-estabelecida&lt;br /&gt;
				route(PRESENCE);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if(is_method(&amp;quot;ACK&amp;quot;)){&lt;br /&gt;
				if(t_check_trans()){&lt;br /&gt;
					t_relay();&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
			}else{&lt;br /&gt;
				# ACK para transacao nao encontrada, ignoramos...&lt;br /&gt;
				exit;&lt;br /&gt;
&lt;br /&gt;
			}&lt;br /&gt;
			&lt;br /&gt;
			sl_send_reply(&amp;quot;404&amp;quot;, &amp;quot;Not Here&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		}	&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[REGISTRAR] {&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;REGISTER&amp;quot;)){&lt;br /&gt;
		if(isflagset(FLT_NATS)){&lt;br /&gt;
			setbflag(FLB_NATB);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(!save(&amp;quot;location&amp;quot;)){&lt;br /&gt;
			sl_reply_error();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[LOCATION] {&lt;br /&gt;
&lt;br /&gt;
	alias_db_lookup(&amp;quot;dbaliases&amp;quot;);&lt;br /&gt;
	if(!lookup(&amp;quot;location&amp;quot;)){&lt;br /&gt;
		switch($rc) {&lt;br /&gt;
			case -1:&lt;br /&gt;
			case -3:&lt;br /&gt;
				t_newtran();&lt;br /&gt;
				t_reply(&amp;quot;404&amp;quot;,&amp;quot;Not Found&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			case -2:&lt;br /&gt;
				sl_send_reply(&amp;quot;405&amp;quot;, &amp;quot;Method Not Allowed&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		setflag(FLT_ACCMISSED);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[PRESENCE] {&lt;br /&gt;
	if(!is_method(&amp;quot;PUBLISH|SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!t_newtran()){&lt;br /&gt;
		sl_reply_error();&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(is_method(&amp;quot;PUBLISH&amp;quot;)){&lt;br /&gt;
		handle_publish();&lt;br /&gt;
	}else if(is_method(&amp;quot;SUBSCRIBE&amp;quot;)){&lt;br /&gt;
		handle_subscribe();&lt;br /&gt;
	}&lt;br /&gt;
	exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[AUTH]{&lt;br /&gt;
	xlog(&amp;quot;PEDIDO DE AUTENTICACAO&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;REGISTER&amp;quot;)){&lt;br /&gt;
		# atentica pedidos de registro&lt;br /&gt;
		if(!www_authorize(&amp;quot;&amp;quot;, &amp;quot;subscriber&amp;quot;)){&lt;br /&gt;
			www_challenge(&amp;quot;&amp;quot;, &amp;quot;0&amp;quot;);&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if($au!=$tU){&lt;br /&gt;
			sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
			exit;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
	}else{&lt;br /&gt;
		if(route(FSINBOUND)){&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(check_source_address(&amp;quot;0&amp;quot;)){&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if(from_uri==myself){&lt;br /&gt;
			if(!proxy_authorize(&amp;quot;&amp;quot;, &amp;quot;subscriber&amp;quot;)){&lt;br /&gt;
				proxy_challenge(&amp;quot;&amp;quot;,&amp;quot;0&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			if(is_method(&amp;quot;PUBLISH&amp;quot;)){&lt;br /&gt;
				if($au!=$tU){&lt;br /&gt;
					sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
				&lt;br /&gt;
			}else{&lt;br /&gt;
				if($au!=$fU){&lt;br /&gt;
					sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Forbidden auth ID&amp;quot;);&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			&lt;br /&gt;
			# Validamos (autenticamos) o usuario&lt;br /&gt;
			consume_credentials();&lt;br /&gt;
		}else{&lt;br /&gt;
		&lt;br /&gt;
			# usuario nao e local, vamos negar&lt;br /&gt;
			if(!uri==myself){&lt;br /&gt;
				sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not relaying&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}	&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[NAT] {&lt;br /&gt;
	force_rport();&lt;br /&gt;
	if(nat_uac_test(&amp;quot;19&amp;quot;)){&lt;br /&gt;
		if(method==&amp;quot;REGISTER&amp;quot;){&lt;br /&gt;
			fix_nated_register();&lt;br /&gt;
		}else{&lt;br /&gt;
			fix_nated_contact();&lt;br /&gt;
		}&lt;br /&gt;
		setflag(FLT_NATS);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[RTPPROXY] {&lt;br /&gt;
	if(is_method(&amp;quot;BYE&amp;quot;)){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}else if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		engage_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(!has_totag()){&lt;br /&gt;
&lt;br /&gt;
		if(!check_route_param(&amp;quot;nat=yes&amp;quot;)){&lt;br /&gt;
			add_rr_param(&amp;quot;;nat=yes&amp;quot;);&lt;br /&gt;
			xlog(&amp;quot;NAT yes NAO ENCONTRADO&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[SIPOUT]{&lt;br /&gt;
	if(!uri==myself){&lt;br /&gt;
		append_hf(&amp;quot;P-hint: outbound\r\n&amp;quot;);&lt;br /&gt;
		route(RELAY);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[PSTN]{&lt;br /&gt;
        # neste caso apenas para exemplificar um uso simples&lt;br /&gt;
        # vamos fazer o redirecionamento par ao asterisk&lt;br /&gt;
        # realizar a dicagem da chamada&lt;br /&gt;
&lt;br /&gt;
        if(!($rU=~&amp;quot;^(\+|00)[1-9][0-9]{3,20}$&amp;quot;))&lt;br /&gt;
                return;&lt;br /&gt;
&lt;br /&gt;
        ## a regra acima aceita para discagem externa qualquer numero&lt;br /&gt;
        # comecado com 00 ou +&lt;br /&gt;
        #&lt;br /&gt;
&lt;br /&gt;
        if(from_uri!=myself){&lt;br /&gt;
                sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not Allowed&amp;quot;);&lt;br /&gt;
                exit;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $ru = &amp;quot;sip:&amp;quot; + $rU + &amp;quot;@&amp;quot; + &amp;quot;10.254.254.6:5090&amp;quot;;&lt;br /&gt;
        xlog(&amp;quot;NOVO DESTINO: $ru&amp;quot;);&lt;br /&gt;
        route(RELAY);&lt;br /&gt;
        exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[XMLRPC]{&lt;br /&gt;
	# nao vamos implementar esta funcionalidade&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSINBOUND] {&lt;br /&gt;
	# verificar para validar o ip do asterisk:porta&lt;br /&gt;
	# se bater , responder com return 1;&lt;br /&gt;
	if($si==&amp;quot;10.254.254.6&amp;quot; &amp;amp;&amp;amp; $sp==&amp;quot;5090&amp;quot;){&lt;br /&gt;
		return(1);&lt;br /&gt;
	}else{&lt;br /&gt;
		return(-1);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSDISPATCH] {&lt;br /&gt;
&lt;br /&gt;
	if(!is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(route(FSINBOUND)){&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	xlog(&amp;quot;CAIMOS NO SWITCH, VAMOS LOCALIZAR O PERFIL DA CHAMADA $rU&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if($rU =~ &amp;quot;^41$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWITCH expressa comeca e termina em 41&amp;quot;);&lt;br /&gt;
			#regra de menu de voicemail, apenas &lt;br /&gt;
			# usuarios autenticados&lt;br /&gt;
			if($au==&amp;quot;&amp;quot;){&lt;br /&gt;
				sl_send_reply(&amp;quot;403&amp;quot;, &amp;quot;Not Allowed&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			$rU = &amp;quot;vma-&amp;quot; + $au;&lt;br /&gt;
	}else if($rU =~ &amp;quot;^441[0-9][0-9]$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWTICH OPCA 441XX &amp;quot;);&lt;br /&gt;
			# numero discado comeca com 441 seguido de dois digitos&lt;br /&gt;
			# chamada direta para inbox do voicemail&lt;br /&gt;
			strip(2);&lt;br /&gt;
			route(FSVBOX);&lt;br /&gt;
	}else if($rU =~ &amp;quot;^433[01][0-9][0-9]$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWITCH OPCAO 433[01]XX&amp;quot;);&lt;br /&gt;
			# numero comecado em 443, seguido de 0 ou 1, mais dois digitos&lt;br /&gt;
			# sistema de conferencia&lt;br /&gt;
			strip(2);&lt;br /&gt;
	}else if($rU =~ &amp;quot;^45[0-9]+$&amp;quot;){&lt;br /&gt;
			xlog(&amp;quot;SWTICH OPCAO 45X.&amp;quot;);&lt;br /&gt;
			#numero comecado com 45, seguindo de numeros;&lt;br /&gt;
			strip(2);&lt;br /&gt;
	}else{&lt;br /&gt;
			xlog(&amp;quot;OPCAO DEFAULT DO SWITCH&amp;quot;);&lt;br /&gt;
			# usuario offline, enviando para voicemail&lt;br /&gt;
			if(!registered(&amp;quot;location&amp;quot;)){&lt;br /&gt;
				route(FSVBOX);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			# usuario online, fazendo bridging&lt;br /&gt;
			xlog(&amp;quot;USUARIO ESTA ONLINE VAMOS FAZER BRIDGE&amp;quot;);&lt;br /&gt;
			prefix(&amp;quot;kb-&amp;quot;);&lt;br /&gt;
			if(is_method(&amp;quot;INVITE&amp;quot;)){&lt;br /&gt;
				t_on_failure(&amp;quot;FAIL_FSVBOX&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
	}&lt;br /&gt;
	route(FSRELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
route[FSVBOX]{&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA FSVBOX&amp;quot;);&lt;br /&gt;
	$du = &amp;quot;sip:&amp;quot; + &amp;quot;10.254.254.6&amp;quot; + &amp;quot;:&amp;quot; + &amp;quot;5090&amp;quot;;&lt;br /&gt;
	if($rU =~ &amp;quot;^441[0-9][0-9]&amp;quot;){&lt;br /&gt;
		strip(2);&lt;br /&gt;
	}&lt;br /&gt;
	prefix(&amp;quot;vm-&amp;quot;);&lt;br /&gt;
	if($var(newbranch)==1){&lt;br /&gt;
		append_branch();&lt;br /&gt;
		$var(newbranch)=0;&lt;br /&gt;
	}&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[FSRELAY] {&lt;br /&gt;
	xlog(&amp;quot;ENVIANDO PARA FSRELAY&amp;quot;);&lt;br /&gt;
	$du = &amp;quot;sip:&amp;quot; + &amp;quot;10.254.254.6&amp;quot; + &amp;quot;:&amp;quot; + &amp;quot;5090&amp;quot;;&lt;br /&gt;
	if($var(newbranch)==1){&lt;br /&gt;
		append_branch();&lt;br /&gt;
		$var(newbranch)=0;&lt;br /&gt;
	}&lt;br /&gt;
	route(RELAY);&lt;br /&gt;
	exit;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
branch_route[BRANCH_ONE]{&lt;br /&gt;
	xlog(&amp;quot;new branch at $ru&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
onreply_route[REPLY_ONE]{&lt;br /&gt;
	xlog(&amp;quot;Incoming reply&amp;quot;);&lt;br /&gt;
	if((isflagset(FLT_NATS) || isbflagset(FLB_NATB) &amp;amp;&amp;amp; status =~ &amp;quot;(183)|(2[0-9][0-9])&amp;quot;)){&lt;br /&gt;
		#rtpproxy_offer();&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
	if(isbflagset(FLB_NATB)){&lt;br /&gt;
		fix_nated_contact();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
failure_route[FAIL_ONE]{&lt;br /&gt;
	xlog(&amp;quot;FAILURE ROUTE FAIL_ONE&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;) &amp;amp;&amp;amp; (isbflagset(FLB_NATB) || isflagset(FLT_NATS))){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_was_cancelled()){&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
failure_route[FAIL_FSVBOX]{&lt;br /&gt;
	xlog(&amp;quot;FAILURE ROUTE FAIL_FSVBOX&amp;quot;);&lt;br /&gt;
	if(is_method(&amp;quot;INVITE&amp;quot;) &amp;amp;&amp;amp; (isbflagset(FLB_NATB) || isflagset(FLT_NATS))){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_was_cancelled()){&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(t_check_status(&amp;quot;486|408|480&amp;quot;)){&lt;br /&gt;
		$rU = $avp(callee);&lt;br /&gt;
		$var(newbranch) = 1;&lt;br /&gt;
		route(FSVBOX);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Testes com Opensips (registro)==&lt;br /&gt;
&lt;br /&gt;
Antes de podermos testar precisamos iniciar o serviço, no momento estamos com ele operando em modo debug, então a inicialização deve ser realizada com o comando abaixo&lt;br /&gt;
 /etc/init.d/opensips debug&lt;br /&gt;
&lt;br /&gt;
Abra uma nova sessão no servidor e então vamos criar os usuários&lt;br /&gt;
 opensipsctl add 101 101&lt;br /&gt;
 opensipsctl add 102 102&lt;br /&gt;
 opensipsctl add 103 103&lt;br /&gt;
&lt;br /&gt;
usuario 101 com senha 101 e assim por diante&lt;br /&gt;
&lt;br /&gt;
Faça a onexão com seu softphone, aqui para testes utilizei o jitsi e o zoiper, neste momento vamos apenas fazer o registro do usuário para testar a autenticação, se você tentar realizar uma discagem não funcionará pois neste caso o processo depende do Asterisk que ainda não está configurado, vamos dar inicio nesta configuração agora.&lt;br /&gt;
&lt;br /&gt;
==Asterisk==&lt;br /&gt;
Não vamos dar muitos detalhes da instalação do asterisk aqui, a ideia é simplesmente ter o mesmo funcionando da forma que necessitamos.&lt;br /&gt;
 apt-get install asterisk&lt;br /&gt;
&lt;br /&gt;
Após a instalação , abra o arquivo /etc/asterisk/sip.conf, localize a linha '''udpbindaddr=0.0.0.0''' e altere para '''udpbindaddr=0.0.0.0:5090'''  , depois ao fim do arquivo adicione.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[opensips]&lt;br /&gt;
type=peer&lt;br /&gt;
host=10.254.254.6&lt;br /&gt;
port=5060&lt;br /&gt;
qualify=yes&lt;br /&gt;
context=opensips&lt;br /&gt;
insecure=port,invite&lt;br /&gt;
canreinvite=no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Agora abra o arquivo '''/etc/asterisk/extensions.conf''' , crie no fim do arquivo a seguinte entrada.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[opensips]&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _kb-1XX,1,NoOp(CHAMADA INTERNA - FAZER BRIDGE - ${CALLERID(num)} ${EXTEN:3})&lt;br /&gt;
same =&amp;gt; n,Dial(SIP/opensips/${EXTEN:3})&lt;br /&gt;
same =&amp;gt; n,Goto(opensips,vm-${EXTEN:3},1)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _vm-1XX,1,NoOp(CHAMADA PARA VOICEMAIL)&lt;br /&gt;
same =&amp;gt; n,Voicemail(${EXTEN:3}@default)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _vma-1XX,1,NoOp(CHAMADA PARA VOICEMAIL - ADMINISTRATIVO)&lt;br /&gt;
same =&amp;gt; n,VoicemailMain(${EXTEN:4}@default)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _3[01]XX,1,NoOp(CHAMADA PARA CONFERENCIA)&lt;br /&gt;
same =&amp;gt; n,Answer()&lt;br /&gt;
same =&amp;gt; n,ConfBridge(${EXTEN},cM1)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _00.,1,NoOp(CHAMADA PARA PSTN)&lt;br /&gt;
same =&amp;gt; n,Wait(2)&lt;br /&gt;
same =&amp;gt; n,Answer()&lt;br /&gt;
same =&amp;gt; n,Wait(1)&lt;br /&gt;
same =&amp;gt; n,PlayBack(tt-monkeys)&lt;br /&gt;
same =&amp;gt; n,Hangup()&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; h,1,Hangup()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente precisamos criar as entradas do voicemail, para isso altere o arquivo '''/etc/asterisk/voicemail.conf''' localize o contexto '''[default]''' e então adicione as entradas para seu voicemail, segue dois exemplos abaixo.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
101 =&amp;gt; 123123,Mike Tesliuk&lt;br /&gt;
102 =&amp;gt; 123123,Mike Tesliuk 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Feito isso, faça um restart no asterisk&lt;br /&gt;
 /etc/init.d/asterisk restart&lt;br /&gt;
&lt;br /&gt;
Agora você ja poderá fazer os testes, basicamente criamos as seguintes situações para serem testadas.&lt;br /&gt;
&lt;br /&gt;
*1 Autenticação de usuários&lt;br /&gt;
*2 Chamada entre usuários&lt;br /&gt;
*3 Encaminhamento para caixa postal&lt;br /&gt;
*4 Acesso a caixa postal&lt;br /&gt;
*5 Acesso a conferência&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=MediaWiki:Sidebar&amp;diff=1522</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=MediaWiki:Sidebar&amp;diff=1522"/>
		<updated>2021-04-15T22:49:36Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** http://www.opensips.com.br/wp|OpensipsBrasil&lt;br /&gt;
** http://www.opensips.org|OpenSIPs&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
* Documentacoes&lt;br /&gt;
** traducoes-opensips|Traducoes&lt;br /&gt;
** Documentacoes|Documentacoes&lt;br /&gt;
* Parcerias&lt;br /&gt;
** http://www.brdsoft.com.br|BRDSoft&lt;br /&gt;
** http://www.brdvoz.com.br|BRDVoz&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;br /&gt;
* MediaWiki&lt;br /&gt;
** helppage|help&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=P%C3%A1gina_principal&amp;diff=1367</id>
		<title>Página principal</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=P%C3%A1gina_principal&amp;diff=1367"/>
		<updated>2013-08-12T00:03:31Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bem vindo ao wiki da comunidade OpenSIPs Brasil&lt;br /&gt;
&lt;br /&gt;
Este wiki tem como objetivo ser uma ferramenta para centralização de documentações sobre OpenSIPs preferencialmente em lingua portuguesa, obviamente algumas documentações temos certeza que merecerão uma tradução para outra lingua para garantir a disseminação do conhecimento aqui gerado.&lt;br /&gt;
&lt;br /&gt;
Se você tem interesse em participar, acesse nosso site http://www.opensips.com.br/wp/ e veja como, participe da comunidade, gere documentações, vamos tornar acessivel este conhecimento.&lt;br /&gt;
&lt;br /&gt;
No momento a criação de usuários está desativada para prevenção de SPAM (muito comum em wiki's), desta forma se você deseja contribuir com o wiki por favor entre em contato conosco através da lista de email solicitando a criação de um usuário.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Traducoes-opensips&amp;diff=1366</id>
		<title>Traducoes-opensips</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Traducoes-opensips&amp;diff=1366"/>
		<updated>2013-08-12T00:02:27Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esta área é reservada para criação de traduções de documentos existentes no site opensips.org , este é um trabalho lento pois demanda tempo e temos que fazer isso no decorrer de nossas horas livres, desta forma, todo mundo que quiser contribuir será bem vindo.&lt;br /&gt;
&lt;br /&gt;
==[[OpenSIPS 1.9 Manual]]==&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Teste&amp;diff=227</id>
		<title>Teste</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Teste&amp;diff=227"/>
		<updated>2013-08-01T18:47:51Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ambox|type='speedy'|text=Teste do mike}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Arquivos_de_configura%C3%A7%C3%A3o&amp;diff=226</id>
		<title>Arquivos de configuração</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Arquivos_de_configura%C3%A7%C3%A3o&amp;diff=226"/>
		<updated>2013-08-01T18:37:14Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O arquivo de configuração do OpenSIPS contém todos os parâmetros que controlam o núcleo e os módulos do OpenSIPS, juntamente com a lógica de roteamento que OpenSIPS usará para rotear o tráfego SIP.&lt;br /&gt;
&lt;br /&gt;
Após a instalação, o local do arquivo de configuração padrão é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
INSTALL_PATH/etc/opensips/opensips.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O arquivo de configuração é baseado em texto, escrita em uma linguagem personalizada para o OpenSISP, muito similar a linguagem C. Você irá encontra variáveis diferentes ( cada uma com diferentes escopos - explicado mais abaixo neste manual ), você pode fazer construções clássicas como if / while / switch, etc, e você pode também chamar sub-rotinas com parâmetros, então o script deverá ser facilmente legível para qualquer um com habilidades em programação SIP.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Devido ao fato de ter que reiniciar o OpenSIPS a cada mudança no arquivo de configuração, isto é de vital importância garantir que tudas as mudanças tenham efeito de acordo com a sintaxe de linguagem do OpenSIPS.&lt;br /&gt;
&lt;br /&gt;
Você pode verificar a validade do arquivo de configuração do OpenSIPS executando o seguinte comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[INSTALL_PATH]/sbin/opensips -C [PATH_TO_CFG]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ao verificar o arquivo de configuração através do validador, se o cfg estiver OK, o OpenSIPS irá retornar 0.&lt;br /&gt;
&lt;br /&gt;
Se a configuração conter algum erro, eles serão apresentados no console e o OpenSIPS irá retornar -1.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Arquivos_de_configura%C3%A7%C3%A3o&amp;diff=225</id>
		<title>Arquivos de configuração</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Arquivos_de_configura%C3%A7%C3%A3o&amp;diff=225"/>
		<updated>2013-08-01T18:36:50Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;O arquivo de configuração do OpenSIPS contém todos os parâmetros que controlam o núcleo e os módulos do OpenSIPS, juntamente com a lógica de roteamento que OpenSIPS usará para rotear o tráfego SIP.&lt;br /&gt;
&lt;br /&gt;
Após a instalação, o local do arquivo de configuração padrão é:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
INSTALL_PATH/etc/opensips/opensips.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O arquivo de configuração é baseado em texto, escrita em uma linguagem personalizada para o OpenSISP, muito similar a linguagem C. Você irá encontra variáveis diferentes ( cada uma com diferentes escopos - explicado mais abaixo neste manual ), você pode fazer construções clássicas como if / while / switch, etc, e você pode também chamar sub-rotinas com parâmetros, então o script deverá ser facilmente legível para qualquer um com habilidades em programação SIP.&lt;br /&gt;
&lt;br /&gt;
{{ambox | text = Some text.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Devido ao fato de ter que reiniciar o OpenSIPS a cada mudança no arquivo de configuração, isto é de vital importância garantir que tudas as mudanças tenham efeito de acordo com a sintaxe de linguagem do OpenSIPS.&lt;br /&gt;
&lt;br /&gt;
Você pode verificar a validade do arquivo de configuração do OpenSIPS executando o seguinte comando:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[INSTALL_PATH]/sbin/opensips -C [PATH_TO_CFG]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ao verificar o arquivo de configuração através do validador, se o cfg estiver OK, o OpenSIPS irá retornar 0.&lt;br /&gt;
&lt;br /&gt;
Se a configuração conter algum erro, eles serão apresentados no console e o OpenSIPS irá retornar -1.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Teste&amp;diff=224</id>
		<title>Teste</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Teste&amp;diff=224"/>
		<updated>2013-08-01T18:33:48Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{mbox|text=Teste do mike}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=M%C3%B3dulo:HtmlBuilder&amp;diff=217</id>
		<title>Módulo:HtmlBuilder</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=M%C3%B3dulo:HtmlBuilder&amp;diff=217"/>
		<updated>2013-08-01T18:33:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Experimental module for building complex HTML (e.g. infoboxes, navboxes) using a fluent interface&lt;br /&gt;
&lt;br /&gt;
local HtmlBuilder = {}&lt;br /&gt;
&lt;br /&gt;
local metatable = {}&lt;br /&gt;
&lt;br /&gt;
metatable.__index = function(t, key)&lt;br /&gt;
    local ret = rawget(t, key)&lt;br /&gt;
    if ret then&lt;br /&gt;
        return ret&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    ret = metatable[key]&lt;br /&gt;
    if type(ret) == 'function' then&lt;br /&gt;
        return function(...) &lt;br /&gt;
            return ret(t, ...) &lt;br /&gt;
        end &lt;br /&gt;
    else&lt;br /&gt;
        return ret&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
metatable.__tostring = function(t)&lt;br /&gt;
    local ret = {}&lt;br /&gt;
    t._build(ret)&lt;br /&gt;
    return table.concat(ret, '')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
metatable._build = function(t, ret)&lt;br /&gt;
    if t.tagName then &lt;br /&gt;
        table.insert(ret, '&amp;lt;' .. t.tagName)&lt;br /&gt;
        for i, attr in ipairs(t.attributes) do&lt;br /&gt;
            table.insert(ret, ' ' .. attr.name .. '=&amp;quot;' .. attr.val .. '&amp;quot;') &lt;br /&gt;
        end&lt;br /&gt;
        if #t.styles &amp;gt; 0 then&lt;br /&gt;
            table.insert(ret, ' style=&amp;quot;')&lt;br /&gt;
            for i, prop in ipairs(t.styles) do&lt;br /&gt;
                if type(prop) == 'string' then -- added with cssText()&lt;br /&gt;
                    table.insert(ret, prop .. ';')&lt;br /&gt;
                else -- added with css()&lt;br /&gt;
                    table.insert(ret, prop.name .. ':' .. prop.val .. ';')&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            table.insert(ret, '&amp;quot;')&lt;br /&gt;
        end&lt;br /&gt;
        if t.selfClosing then&lt;br /&gt;
            table.insert(ret, ' /')&lt;br /&gt;
        end&lt;br /&gt;
        table.insert(ret, '&amp;gt;') &lt;br /&gt;
    end&lt;br /&gt;
    for i, node in ipairs(t.nodes) do&lt;br /&gt;
        if node then&lt;br /&gt;
            if type(node) == 'table' then&lt;br /&gt;
                node._build(ret)&lt;br /&gt;
            else&lt;br /&gt;
                table.insert(ret, tostring(node))&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if t.tagName and not t.unclosed and not t.selfClosing then&lt;br /&gt;
        table.insert(ret, '&amp;lt;/' .. t.tagName .. '&amp;gt;')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
   &lt;br /&gt;
metatable.node = function(t, builder)&lt;br /&gt;
    if builder then&lt;br /&gt;
        table.insert(t.nodes, builder)&lt;br /&gt;
    end&lt;br /&gt;
    return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
metatable.wikitext = function(t, ...) &lt;br /&gt;
    local vals = {...}&lt;br /&gt;
    for i = 1, #vals do&lt;br /&gt;
        if vals[i] then&lt;br /&gt;
            table.insert(t.nodes, vals[i])&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
metatable.newline = function(t)&lt;br /&gt;
    table.insert(t.nodes, '\n')&lt;br /&gt;
    return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
metatable.tag = function(t, tagName, args)&lt;br /&gt;
    args = args or {}&lt;br /&gt;
    args.parent = t&lt;br /&gt;
    local builder = HtmlBuilder.create(tagName, args)&lt;br /&gt;
    table.insert(t.nodes, builder)&lt;br /&gt;
    return builder&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getAttr(t, name)&lt;br /&gt;
    for i, attr in ipairs(t.attributes) do&lt;br /&gt;
        if attr.name == name then&lt;br /&gt;
            return attr&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
metatable.attr = function(t, name, val)&lt;br /&gt;
    -- if caller sets the style attribute explicitly, then replace all styles previously added with css() and cssText()&lt;br /&gt;
    if name == 'style' then&lt;br /&gt;
        t.styles = {val}&lt;br /&gt;
        return t&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local attr = getAttr(t, name)&lt;br /&gt;
    if attr then&lt;br /&gt;
        attr.val = val&lt;br /&gt;
    else&lt;br /&gt;
        table.insert(t.attributes, {name = name, val = val})&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
metatable.addClass = function(t, class)&lt;br /&gt;
    if class then&lt;br /&gt;
        local attr = getAttr(t, 'class')&lt;br /&gt;
        if attr then&lt;br /&gt;
            attr.val = attr.val .. ' ' .. class&lt;br /&gt;
        else&lt;br /&gt;
            t.attr('class', class)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
metatable.css = function(t, name, val)&lt;br /&gt;
    if type(val) == 'string' or type(val) == 'number' then&lt;br /&gt;
        for i, prop in ipairs(t.styles) do&lt;br /&gt;
            if prop.name == name then&lt;br /&gt;
                prop.val = val&lt;br /&gt;
                return t&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        table.insert(t.styles, {name = name, val = val})&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
metatable.cssText = function(t, css)&lt;br /&gt;
    if css then&lt;br /&gt;
        table.insert(t.styles, css)&lt;br /&gt;
    end&lt;br /&gt;
    return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
metatable.done = function(t)&lt;br /&gt;
    return t.parent or t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
metatable.allDone = function(t)&lt;br /&gt;
    while t.parent do&lt;br /&gt;
        t = t.parent&lt;br /&gt;
    end&lt;br /&gt;
    return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function HtmlBuilder.create(tagName, args)&lt;br /&gt;
    args = args or {}&lt;br /&gt;
    local builder = {}&lt;br /&gt;
    setmetatable(builder, metatable)&lt;br /&gt;
    builder.nodes = {}&lt;br /&gt;
    builder.attributes = {}&lt;br /&gt;
    builder.styles = {}&lt;br /&gt;
    builder.tagName = tagName&lt;br /&gt;
    builder.parent = args.parent&lt;br /&gt;
    builder.unclosed = args.unclosed or false&lt;br /&gt;
    builder.selfClosing = args.selfClosing or false&lt;br /&gt;
    return builder&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return HtmlBuilder&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=M%C3%B3dulo:Namespace_detect&amp;diff=219</id>
		<title>Módulo:Namespace detect</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=M%C3%B3dulo:Namespace_detect&amp;diff=219"/>
		<updated>2013-08-01T18:33:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----------------------------------------------------------------------&lt;br /&gt;
--                                                                  --&lt;br /&gt;
--                        NAMESPACE DETECT                          --&lt;br /&gt;
--                                                                  --&lt;br /&gt;
--      This module implements the {{namespace detect}} template    --&lt;br /&gt;
--      in Lua, with a few improvements: all namespaces and all     --&lt;br /&gt;
--      namespace aliases are supported, and namespace names are    --&lt;br /&gt;
--      detected automatically for the local wiki. Function names   --&lt;br /&gt;
--      can be configured for different wikis by altering the       --&lt;br /&gt;
--      values in the &amp;quot;cfg&amp;quot; table.                                  --&lt;br /&gt;
--                                                                  --&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
--                      Configuration data                          --&lt;br /&gt;
--      Language-specific parameter names can be set here.          --&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local cfg = {}&lt;br /&gt;
&lt;br /&gt;
-- The name for the parameter to display content for the main namespace:&lt;br /&gt;
cfg.main = 'main'&lt;br /&gt;
&lt;br /&gt;
-- The name for the parameter to display content in talk namespaces:&lt;br /&gt;
cfg.talk = 'talk'&lt;br /&gt;
&lt;br /&gt;
-- The name for the parameter to display content for &amp;quot;other&amp;quot; namespaces&lt;br /&gt;
-- (namespaces for which parameters have not been specified, or for when&lt;br /&gt;
-- cfg.demospace is set to cfg.other):&lt;br /&gt;
cfg.other = 'other'&lt;br /&gt;
&lt;br /&gt;
-- The name for the parameter to set a demonstration namespace:&lt;br /&gt;
cfg.demospace = 'demospace'&lt;br /&gt;
&lt;br /&gt;
-- The name for the parameter to set a specific page to compare:&lt;br /&gt;
cfg.page = 'page'&lt;br /&gt;
&lt;br /&gt;
-- The header for the namespace column in the wikitable containing the &lt;br /&gt;
-- list of possible subject-space parameters.&lt;br /&gt;
cfg.wikitableNamespaceHeader = 'Namespace'&lt;br /&gt;
&lt;br /&gt;
-- The header for the wikitable containing the list of possible&lt;br /&gt;
-- subject-space parameters.&lt;br /&gt;
cfg.wikitableAliasesHeader = 'Aliases'&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
--                     End configuration data                       --&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
--                        Global functions                          --&lt;br /&gt;
--      The following functions are global, because we want them    --&lt;br /&gt;
--      to be accessible from other Lua modules called using        --&lt;br /&gt;
--      require().                                                  --&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Declare the table of functions to return.&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Get the page object. This will return the page object for the page&lt;br /&gt;
-- specified, or nil if there are errors in the title or if the&lt;br /&gt;
-- expensive function count has been exceeded.&lt;br /&gt;
function p.getPageObject( page )&lt;br /&gt;
    -- Get the title object for args.page if it is specified. Otherwise&lt;br /&gt;
    -- get the title object for the current page.&lt;br /&gt;
    if page then&lt;br /&gt;
        -- Get the page object, passing the function through pcall &lt;br /&gt;
        -- in case we are over the expensive function count limit.&lt;br /&gt;
        local noError, pageObject = pcall(mw.title.new, page)&lt;br /&gt;
        if not noError then&lt;br /&gt;
            return nil&lt;br /&gt;
        else&lt;br /&gt;
            return pageObject&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        return mw.title.getCurrentTitle()&lt;br /&gt;
    end    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ Returns a table of how parameter names map to namespace names.&lt;br /&gt;
The keys are the actual namespace names, in lower case, and the &lt;br /&gt;
values are the possible parameter names for that namespace, also&lt;br /&gt;
in lower case. The table entries are structured like this:&lt;br /&gt;
    [''] = {&lt;br /&gt;
        {'main'},&lt;br /&gt;
    },&lt;br /&gt;
    ['wikipedia'] = {&lt;br /&gt;
        {'wikipedia', 'project', 'wp' }&lt;br /&gt;
    }&lt;br /&gt;
]] &lt;br /&gt;
function p.getParamMappings()&lt;br /&gt;
    local mappings = {}&lt;br /&gt;
    mappings[mw.ustring.lower( mw.site.namespaces[0].name )] = { cfg.main }&lt;br /&gt;
    mappings[cfg.talk] = { cfg.talk }&lt;br /&gt;
    for nsid, ns in pairs( mw.site.subjectNamespaces ) do&lt;br /&gt;
        if nsid ~= 0 then -- Exclude main namespace.&lt;br /&gt;
            local nsname = mw.ustring.lower( ns.name )&lt;br /&gt;
            local canonicalName = mw.ustring.lower( ns.canonicalName )&lt;br /&gt;
            mappings[nsname] = { nsname }&lt;br /&gt;
            if canonicalName ~= nsname then&lt;br /&gt;
                table.insert( mappings[nsname], canonicalName )&lt;br /&gt;
            end&lt;br /&gt;
            for _, alias in ipairs( ns.aliases ) do&lt;br /&gt;
                table.insert( mappings[nsname], mw.ustring.lower( alias ) )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return mappings&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ Create a wikitable of all subject namespace parameters, for documentation&lt;br /&gt;
  purposes. Talk is excluded, as it should usually be treated separately in&lt;br /&gt;
  the documentation.&lt;br /&gt;
]]&lt;br /&gt;
function p.table()&lt;br /&gt;
    -- Get the parameter mappings.&lt;br /&gt;
    local mappings = p.getParamMappings()&lt;br /&gt;
    &lt;br /&gt;
    -- Start the wikitable.&lt;br /&gt;
    local ret = '{| class=&amp;quot;wikitable&amp;quot;'&lt;br /&gt;
        .. '\n|-'&lt;br /&gt;
        .. '\n! ' .. cfg.wikitableNamespaceHeader&lt;br /&gt;
        .. '\n! ' .. cfg.wikitableAliasesHeader&lt;br /&gt;
    &lt;br /&gt;
    -- Generate the row for the main namespace, as we want this&lt;br /&gt;
    -- to be first in the list.&lt;br /&gt;
    ret = ret .. '\n|-'&lt;br /&gt;
        .. '\n| &amp;lt;code&amp;gt;' .. cfg.main .. '&amp;lt;/code&amp;gt;'&lt;br /&gt;
        .. '\n|'&lt;br /&gt;
        &lt;br /&gt;
    -- Enclose all parameter names in &amp;lt;code&amp;gt; tags.&lt;br /&gt;
    for ns, params in pairs( mappings ) do&lt;br /&gt;
        if ns ~= mw.site.namespaces[0].name then&lt;br /&gt;
            for i, param in ipairs( params ) do&lt;br /&gt;
                mappings[ns][i] = '&amp;lt;code&amp;gt;' .. param .. '&amp;lt;/code&amp;gt;'&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Generate the other wikitable rows.&lt;br /&gt;
    for ns, params in pairs( mappings ) do&lt;br /&gt;
        if ns ~= mw.site.namespaces[0].name then -- Ignore the main namespace.&lt;br /&gt;
            ret = ret .. '\n|-'&lt;br /&gt;
                .. '\n| ' .. params[1]&lt;br /&gt;
                .. '\n| ' .. table.concat( params, ', ', 2 )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- End the wikitable.&lt;br /&gt;
    ret = ret .. '\n|-'&lt;br /&gt;
        .. '\n|}'&lt;br /&gt;
    &lt;br /&gt;
    return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
--                         Local functions                          --&lt;br /&gt;
--      The following are internal functions, which we do not want  --&lt;br /&gt;
--      to be accessible from other modules.                        --&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Gets the namespace name to compare to the arguments. The returned value&lt;br /&gt;
-- is lower-case.&lt;br /&gt;
local function getNamespace( page, demospace )&lt;br /&gt;
    local ret&lt;br /&gt;
    if demospace then&lt;br /&gt;
        -- Handle &amp;quot;demospace = main&amp;quot; properly.&lt;br /&gt;
        if mw.ustring.lower( demospace ) == cfg.main then&lt;br /&gt;
            ret = mw.site.namespaces[0].name&lt;br /&gt;
        else&lt;br /&gt;
            ret = demospace&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        local pageObject = p.getPageObject( page )&lt;br /&gt;
        if pageObject then&lt;br /&gt;
            if pageObject.isTalkPage then&lt;br /&gt;
                -- {{namespace detect}} uses the same value for all talk&lt;br /&gt;
                -- namespaces, so that's what the module should do too.&lt;br /&gt;
                ret = cfg.talk&lt;br /&gt;
            else&lt;br /&gt;
                ret = pageObject.nsText&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            return nil -- return nil if the page object doesn't exist.&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return mw.ustring.lower(ret)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Compare the namespace found with the parameters that have been&lt;br /&gt;
-- specified, and return content of the appropriate parameter.&lt;br /&gt;
local function compare( args )&lt;br /&gt;
    -- Get the namespace to compare the parameters to, and the parameter&lt;br /&gt;
    -- mapping table.&lt;br /&gt;
    local namespace = getNamespace( args[cfg.page], args[cfg.demospace] )&lt;br /&gt;
    local mappings = p.getParamMappings()&lt;br /&gt;
    &lt;br /&gt;
    -- Check for any matches in the namespace arguments. The order we check&lt;br /&gt;
    -- them doesn't matter, as there can only be one match.&lt;br /&gt;
    for ns, params in pairs( mappings ) do&lt;br /&gt;
        if ns == namespace then&lt;br /&gt;
            -- Check all aliases for matches. The default local namespace is&lt;br /&gt;
            -- checked first, as {{namespace detect}} checked these before&lt;br /&gt;
            -- alias names.&lt;br /&gt;
            for _, param in ipairs( params ) do&lt;br /&gt;
                if args[param] then&lt;br /&gt;
                    return args[param]&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- If there were no matches, return parameters for other namespaces. &lt;br /&gt;
    -- This happens if there was no text specified for the namespace that&lt;br /&gt;
    -- was detected or if the demospace parameter is not a valid namespace.&lt;br /&gt;
    -- Note that the parameter for the detected namespace must be completely&lt;br /&gt;
    -- absent for this to happen, not merely blank.&lt;br /&gt;
    if args[cfg.other] then&lt;br /&gt;
        return args[cfg.other]&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
--                             Main function                        --&lt;br /&gt;
--      This is the function that will be most used. It processes   --&lt;br /&gt;
--      the arguments and calls the compare() function. It is       --&lt;br /&gt;
--      global, but is put down here as it depends on the other     --&lt;br /&gt;
--      local in order for it to work.                              --&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    -- If called via #invoke, use the args passed into the invoking&lt;br /&gt;
    -- template, or the args passed to #invoke if any exist. Otherwise&lt;br /&gt;
    -- assume args are being passed directly in.&lt;br /&gt;
    local origArgs&lt;br /&gt;
    if frame == mw.getCurrentFrame() then&lt;br /&gt;
        origArgs = frame:getParent().args&lt;br /&gt;
        for k, v in pairs( frame.args ) do&lt;br /&gt;
            origArgs = frame.args&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        origArgs = frame&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Trim whitespace and remove blank arguments for demospace and &lt;br /&gt;
    -- page parameters.&lt;br /&gt;
    local args = {}&lt;br /&gt;
    for k, v in pairs(origArgs) do&lt;br /&gt;
        v = mw.text.trim(v) -- Trim whitespace.&lt;br /&gt;
        if k == cfg.demospace or k == cfg.page then&lt;br /&gt;
            if v ~= '' then&lt;br /&gt;
                args[k] = v&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            args[k] = v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return compare(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=M%C3%B3dulo:Navbar&amp;diff=221</id>
		<title>Módulo:Navbar</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=M%C3%B3dulo:Navbar&amp;diff=221"/>
		<updated>2013-08-01T18:33:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local HtmlBuilder = require('Module:HtmlBuilder')&lt;br /&gt;
&lt;br /&gt;
function trim(s)&lt;br /&gt;
    return mw.ustring.match( s, &amp;quot;^%s*(.-)%s*$&amp;quot; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function error(s)&lt;br /&gt;
    local span = HtmlBuilder.create('span')&lt;br /&gt;
&lt;br /&gt;
    span&lt;br /&gt;
        .addClass('error')&lt;br /&gt;
        .css('float', 'left')&lt;br /&gt;
        .css('white-space', 'nowrap')&lt;br /&gt;
        .wikitext('Error: ' .. s)&lt;br /&gt;
&lt;br /&gt;
    return tostring(span)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getTitle( pageName )&lt;br /&gt;
    pageName = trim( pageName );&lt;br /&gt;
    local page_title, talk_page_title;&lt;br /&gt;
    &lt;br /&gt;
    if mw.ustring.sub(pageName, 1, 1) == ':' then&lt;br /&gt;
        page_title = mw.title.new( mw.ustring.sub(pageName, 2) );&lt;br /&gt;
    else&lt;br /&gt;
        page_title = mw.title.new( pageName, 'Template' );&lt;br /&gt;
    end    &lt;br /&gt;
    &lt;br /&gt;
    if page_title then &lt;br /&gt;
        talk_page_title = page_title.talkPageTitle;&lt;br /&gt;
    else&lt;br /&gt;
        talk_page_title = nil;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return page_title, talk_page_title;    &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function _navbar( args )&lt;br /&gt;
    if not args[1] then&lt;br /&gt;
        return error('No name provided')&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    local good, title, talk_title;&lt;br /&gt;
    good, title, talk_title = pcall( getTitle, args[1] );&lt;br /&gt;
    if not good then&lt;br /&gt;
        return error('Expensive parser function limit exceeded');&lt;br /&gt;
    end    &lt;br /&gt;
&lt;br /&gt;
    if not title then&lt;br /&gt;
        return error('Page does not exist')&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    local mainpage = title.fullText;&lt;br /&gt;
    local talkpage = talk_title and talk_title.fullText or ''&lt;br /&gt;
    local editurl = title:fullUrl( 'action=edit' ); &lt;br /&gt;
 &lt;br /&gt;
    local viewLink, talkLink, editLink = 'view', 'talk', 'edit'&lt;br /&gt;
    if args.mini then&lt;br /&gt;
        viewLink, talkLink, editLink = 'v', 't', 'e'&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    local div = HtmlBuilder.create( 'div' )&lt;br /&gt;
    div&lt;br /&gt;
        .addClass( 'noprint' )&lt;br /&gt;
        .addClass( 'plainlinks' )&lt;br /&gt;
        .addClass( 'hlist' )&lt;br /&gt;
        .addClass( 'navbar')&lt;br /&gt;
        .cssText( args.style )&lt;br /&gt;
 &lt;br /&gt;
    if args.mini then div.addClass('mini') end&lt;br /&gt;
 &lt;br /&gt;
    if not (args.mini or args.plain) then&lt;br /&gt;
        div&lt;br /&gt;
            .tag( 'span' )&lt;br /&gt;
                .css( 'word-spacing', 0 )&lt;br /&gt;
                .cssText( args.fontstyle )&lt;br /&gt;
                .wikitext( args.text or 'This box:' )&lt;br /&gt;
                .wikitext( ' ' )&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    if args.brackets then&lt;br /&gt;
        div&lt;br /&gt;
            .tag('span')&lt;br /&gt;
                .css('margin-right', '-0.125em')&lt;br /&gt;
                .cssText( args.fontstyle )&lt;br /&gt;
                .wikitext( '&amp;amp;#91;' )&lt;br /&gt;
                .newline();&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    local ul = div.tag('ul');&lt;br /&gt;
 &lt;br /&gt;
    ul&lt;br /&gt;
        .tag( 'li' )&lt;br /&gt;
            .addClass( 'nv-view' )&lt;br /&gt;
            .wikitext( '[[' .. mainpage .. '|' )&lt;br /&gt;
            .tag( 'span ' )&lt;br /&gt;
                .attr( 'title', 'View this template' )&lt;br /&gt;
                .cssText( args.fontstyle or '' )&lt;br /&gt;
                .wikitext( viewLink )&lt;br /&gt;
                .done()&lt;br /&gt;
            .wikitext( ']]' )&lt;br /&gt;
            .done()&lt;br /&gt;
        .tag( 'li' )&lt;br /&gt;
            .addClass( 'nv-talk' )&lt;br /&gt;
            .wikitext( '[[' .. talkpage .. '|' )&lt;br /&gt;
            .tag( 'span ' )&lt;br /&gt;
                .attr( 'title', 'Discuss this template' )&lt;br /&gt;
                .cssText( args.fontstyle or '' )&lt;br /&gt;
                .wikitext( talkLink )&lt;br /&gt;
                .done()&lt;br /&gt;
            .wikitext( ']]' );&lt;br /&gt;
 &lt;br /&gt;
    if not args.noedit then &lt;br /&gt;
        ul&lt;br /&gt;
            .tag( 'li' )&lt;br /&gt;
                .addClass( 'nv-edit' )&lt;br /&gt;
                .wikitext( '[' .. editurl .. ' ' )&lt;br /&gt;
                .tag( 'span ' )&lt;br /&gt;
                    .attr( 'title', 'Edit this template' )&lt;br /&gt;
                    .cssText( args.fontstyle or '' )&lt;br /&gt;
                    .wikitext( editLink )&lt;br /&gt;
                    .done()&lt;br /&gt;
                .wikitext( ']' );&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    if args.brackets then&lt;br /&gt;
        div&lt;br /&gt;
            .tag('span')&lt;br /&gt;
                .css('margin-left', '-0.125em')&lt;br /&gt;
                .cssText( args.fontstyle or '' )&lt;br /&gt;
                .wikitext( '&amp;amp;#93;' )&lt;br /&gt;
                .newline();&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    return tostring(div)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.navbar(frame)&lt;br /&gt;
    local origArgs&lt;br /&gt;
    -- If called via #invoke, use the args passed into the invoking template.&lt;br /&gt;
    -- Otherwise, for testing purposes, assume args are being passed directly in.&lt;br /&gt;
    if frame == mw.getCurrentFrame() then&lt;br /&gt;
        origArgs = frame:getParent().args&lt;br /&gt;
    else&lt;br /&gt;
        origArgs = frame&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    -- ParserFunctions considers the empty string to be false, so to preserve the previous &lt;br /&gt;
    -- behavior of {{navbar}}, change any empty arguments to nil, so Lua will consider&lt;br /&gt;
    -- them false too.&lt;br /&gt;
    args = {}&lt;br /&gt;
    for k, v in pairs(origArgs) do&lt;br /&gt;
        if v ~= '' then&lt;br /&gt;
            args[k] = v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    return _navbar(args)&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=M%C3%B3dulo:Navbox&amp;diff=223</id>
		<title>Módulo:Navbox</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=M%C3%B3dulo:Navbox&amp;diff=223"/>
		<updated>2013-08-01T18:33:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module will implement {{Navbox}}&lt;br /&gt;
--&lt;br /&gt;
 &lt;br /&gt;
local p = {}&lt;br /&gt;
 &lt;br /&gt;
local HtmlBuilder = require('Module:HtmlBuilder')&lt;br /&gt;
local Navbar = require('Module:Navbar')&lt;br /&gt;
&lt;br /&gt;
local args&lt;br /&gt;
local frame&lt;br /&gt;
local tableRowAdded = false&lt;br /&gt;
local border&lt;br /&gt;
local listnums = {}&lt;br /&gt;
 &lt;br /&gt;
function trim(s)&lt;br /&gt;
    return (mw.ustring.gsub(s, &amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function addTableRow(tbl)&lt;br /&gt;
    -- If any other rows have already been added, then we add a 2px gutter row.&lt;br /&gt;
    if tableRowAdded then&lt;br /&gt;
        tbl&lt;br /&gt;
            .tag('tr')&lt;br /&gt;
                .css('height', '2px')&lt;br /&gt;
                .tag('td')&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    tableRowAdded = true&lt;br /&gt;
    &lt;br /&gt;
    return tbl.tag('tr')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Title row&lt;br /&gt;
--&lt;br /&gt;
function renderTitleRow(tbl)&lt;br /&gt;
    if not args.title then return end&lt;br /&gt;
 &lt;br /&gt;
    local titleRow = addTableRow(tbl)&lt;br /&gt;
     &lt;br /&gt;
    if args.titlegroup then&lt;br /&gt;
        titleRow&lt;br /&gt;
            .tag('th')&lt;br /&gt;
                .attr('scope', 'row')&lt;br /&gt;
                .addClass('navbox-group')&lt;br /&gt;
                .addClass(args.titlegroupclass)&lt;br /&gt;
                .cssText(args.basestyle)&lt;br /&gt;
                .cssText(args.groupstyle)&lt;br /&gt;
                .cssText(args.titlegroupstyle)&lt;br /&gt;
                .wikitext(args.titlegroup)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local titleCell = titleRow.tag('th').attr('scope', 'col')&lt;br /&gt;
            &lt;br /&gt;
    if args.titlegroup then&lt;br /&gt;
        titleCell&lt;br /&gt;
            .css('border-left', '2px solid #fdfdfd')&lt;br /&gt;
            .css('width', '100%')&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local titleColspan = 2&lt;br /&gt;
    if args.imageleft then titleColspan = titleColspan + 1 end&lt;br /&gt;
    if args.image then titleColspan = titleColspan + 1 end&lt;br /&gt;
    if args.titlegroup then titleColspan = titleColspan - 1 end&lt;br /&gt;
    &lt;br /&gt;
    titleCell&lt;br /&gt;
        .cssText(args.basestyle)&lt;br /&gt;
        .cssText(args.titlestyle)&lt;br /&gt;
        .addClass('navbox-title')&lt;br /&gt;
        .attr('colspan', titleColspan)&lt;br /&gt;
 &lt;br /&gt;
     renderNavBar(titleCell)&lt;br /&gt;
 &lt;br /&gt;
     titleCell&lt;br /&gt;
         .tag('div')&lt;br /&gt;
             .addClass(args.titleclass)&lt;br /&gt;
             .css('font-size', '110%')&lt;br /&gt;
             .newline()&lt;br /&gt;
             .wikitext(args.title)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function renderNavBar(titleCell)&lt;br /&gt;
    -- Depending on the presence of the navbar and/or show/hide link, we may need to add a spacer div on the left&lt;br /&gt;
    -- or right to keep the title centered.&lt;br /&gt;
    local spacerSide = nil&lt;br /&gt;
&lt;br /&gt;
    if args.navbar == 'off' then&lt;br /&gt;
        -- No navbar, and client wants no spacer, i.e. wants the title to be shifted to the left. If there's&lt;br /&gt;
        -- also no show/hide link, then we need a spacer on the right to achieve the left shift.&lt;br /&gt;
        if args.state == 'plain' then spacerSide = 'right' end&lt;br /&gt;
    elseif args.navbar == 'plain' or args.navbar == 'off' or (not args.name and (border == 'subgroup' or border == 'child' or border == 'none')) then&lt;br /&gt;
        -- No navbar. Need a spacer on the left to balance out the width of the show/hide link.&lt;br /&gt;
        if args.state ~= 'plain' then spacerSide = 'left' end&lt;br /&gt;
    else&lt;br /&gt;
        -- Will render navbar (or error message). If there's no show/hide link, need a spacer on the right&lt;br /&gt;
        -- to balance out the width of the navbar.&lt;br /&gt;
        if args.state == 'plain' then spacerSide = 'right' end&lt;br /&gt;
&lt;br /&gt;
        titleCell.wikitext(Navbar.navbar({ &lt;br /&gt;
            args.name, &lt;br /&gt;
            mini = 1, &lt;br /&gt;
            fontstyle = (args.basestyle or '') .. ';' .. (args.titlestyle or '') ..  ';background:none transparent;border:none;'&lt;br /&gt;
        }))&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Render the spacer div.&lt;br /&gt;
    if spacerSide then&lt;br /&gt;
        titleCell&lt;br /&gt;
            .tag('span')&lt;br /&gt;
                .css('float', spacerSide)&lt;br /&gt;
                .css('width', '6em')&lt;br /&gt;
                .wikitext('&amp;amp;nbsp;')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Above/Below rows&lt;br /&gt;
--&lt;br /&gt;
function renderAboveRow(tbl)&lt;br /&gt;
    if not args.above then return end&lt;br /&gt;
 &lt;br /&gt;
    addTableRow(tbl)&lt;br /&gt;
        .tag('td')&lt;br /&gt;
            .addClass('navbox-abovebelow')&lt;br /&gt;
            .addClass(args.aboveclass)&lt;br /&gt;
            .cssText(args.basestyle)&lt;br /&gt;
            .cssText(args.abovestyle)&lt;br /&gt;
            .attr('colspan', getAboveBelowColspan())&lt;br /&gt;
            .tag('div')&lt;br /&gt;
                .newline()&lt;br /&gt;
                .wikitext(args.above)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function renderBelowRow(tbl)&lt;br /&gt;
    if not args.below then return end&lt;br /&gt;
    &lt;br /&gt;
    addTableRow(tbl)&lt;br /&gt;
        .tag('td')&lt;br /&gt;
            .addClass('navbox-abovebelow')&lt;br /&gt;
            .addClass(args.belowclass)&lt;br /&gt;
            .cssText(args.basestyle)&lt;br /&gt;
            .cssText(args.belowstyle)&lt;br /&gt;
            .attr('colspan', getAboveBelowColspan())&lt;br /&gt;
            .tag('div')&lt;br /&gt;
                .newline()&lt;br /&gt;
                .wikitext(args.below)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getAboveBelowColspan()&lt;br /&gt;
    local ret = 2&lt;br /&gt;
    if args.imageleft then ret = ret + 1 end&lt;br /&gt;
    if args.image then ret = ret + 1 end&lt;br /&gt;
    return ret&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
--&lt;br /&gt;
--   List rows&lt;br /&gt;
--&lt;br /&gt;
function renderListRow(tbl, listnum)&lt;br /&gt;
    local row = addTableRow(tbl)&lt;br /&gt;
    &lt;br /&gt;
    if listnum == 1 and args.imageleft then&lt;br /&gt;
        row&lt;br /&gt;
            .tag('td')&lt;br /&gt;
                .addClass('navbox-image')&lt;br /&gt;
                .addClass(args.imageclass)&lt;br /&gt;
                .css('width', '0%')&lt;br /&gt;
                .css('padding', '0px 2px 0px 0px')&lt;br /&gt;
                .cssText(args.imageleftstyle)&lt;br /&gt;
                .attr('rowspan', 2 * #listnums - 1)&lt;br /&gt;
                .tag('div')&lt;br /&gt;
                    .newline()&lt;br /&gt;
                    .wikitext(args.imageleft)&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    if args['group' .. listnum] then&lt;br /&gt;
        local groupCell = row.tag('th')&lt;br /&gt;
        &lt;br /&gt;
        groupCell&lt;br /&gt;
               .attr('scope', 'row')&lt;br /&gt;
               .addClass('navbox-group')&lt;br /&gt;
               .addClass(args.groupclass)&lt;br /&gt;
               .cssText(args.basestyle)&lt;br /&gt;
               &lt;br /&gt;
        if args.groupwidth then&lt;br /&gt;
            groupCell.css('width', args.groupwidth)&lt;br /&gt;
        end&lt;br /&gt;
           &lt;br /&gt;
        groupCell&lt;br /&gt;
            .cssText(args.groupstyle)&lt;br /&gt;
            .cssText(args['group' .. listnum .. 'style'])&lt;br /&gt;
            .wikitext(args['group' .. listnum])&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local listCell = row.tag('td')&lt;br /&gt;
&lt;br /&gt;
    if args['group' .. listnum] then&lt;br /&gt;
        listCell&lt;br /&gt;
            .css('text-align', 'left')&lt;br /&gt;
            .css('border-left-width', '2px')&lt;br /&gt;
            .css('border-left-style', 'solid')&lt;br /&gt;
    else&lt;br /&gt;
        listCell.attr('colspan', 2)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if not args.groupwidth then &lt;br /&gt;
        listCell.css('width', '100%')&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local isOdd = (listnum % 2) == 1&lt;br /&gt;
    local rowstyle = args.evenstyle&lt;br /&gt;
    if isOdd then rowstyle = args.oddstyle end&lt;br /&gt;
 &lt;br /&gt;
    local evenOdd&lt;br /&gt;
    if args.evenodd == 'swap' then&lt;br /&gt;
        if isOdd then evenOdd = 'even' else evenOdd = 'odd' end&lt;br /&gt;
    else&lt;br /&gt;
        if isOdd then evenOdd = args.evenodd or 'odd' else evenOdd = args.evenodd or 'even' end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    listCell&lt;br /&gt;
        .css('padding', '0px')&lt;br /&gt;
        .cssText(args.liststyle)&lt;br /&gt;
        .cssText(rowstyle)&lt;br /&gt;
        .cssText(args['list' .. listnum .. 'style'])&lt;br /&gt;
        .addClass('navbox-list')&lt;br /&gt;
        .addClass('navbox-' .. evenOdd)&lt;br /&gt;
        .addClass(args.listclass)&lt;br /&gt;
        .tag('div')&lt;br /&gt;
            .css('padding', (listnum == 1 and args.list1padding) or args.listpadding or '0em 0.25em')&lt;br /&gt;
            .newline()&lt;br /&gt;
            .wikitext(args['list' .. listnum])&lt;br /&gt;
&lt;br /&gt;
    if listnum == 1 and args.image then&lt;br /&gt;
        row&lt;br /&gt;
            .tag('td')&lt;br /&gt;
                .addClass('navbox-image')&lt;br /&gt;
                .addClass(args.imageclass)&lt;br /&gt;
                .css('width', '0%')&lt;br /&gt;
                .css('padding', '0px 0px 0px 2px')&lt;br /&gt;
                .cssText(args.imagestyle)&lt;br /&gt;
                .attr('rowspan', 2 * #listnums - 1)&lt;br /&gt;
                .tag('div')&lt;br /&gt;
                    .newline()&lt;br /&gt;
                    .wikitext(args.image)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Tracking categories&lt;br /&gt;
--&lt;br /&gt;
function renderTrackingCategories(builder)&lt;br /&gt;
    local frame = mw.getCurrentFrame()&lt;br /&gt;
    &lt;br /&gt;
    if not frame then return end&lt;br /&gt;
    &lt;br /&gt;
    local s = frame:preprocess('{{#ifeq:{{NAMESPACE}}|{{ns:10}}|1|0}}{{SUBPAGENAME}}')&lt;br /&gt;
    if mw.ustring.sub(s, 1, 1) == '0' then return end -- not in template space&lt;br /&gt;
    local subpage = mw.ustring.lower(mw.ustring.sub(s, 2))&lt;br /&gt;
    if subpage == 'doc' or subpage == 'sandbox' or subpage == 'testcases' then return end&lt;br /&gt;
    &lt;br /&gt;
    for i, cat in ipairs(getTrackingCategories()) do&lt;br /&gt;
        builder.wikitext('[[Category:' .. cat .. ']]') &lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getTrackingCategories()&lt;br /&gt;
    local cats = {}&lt;br /&gt;
    if needsHorizontalLists() then table.insert(cats, 'Navigational boxes without horizontal lists') end&lt;br /&gt;
    if hasBackgroundColors() then table.insert(cats, 'Navboxes using background colours') end&lt;br /&gt;
    return cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function needsHorizontalLists()&lt;br /&gt;
    if border == 'child' or border == 'subgroup'  or args.tracking == 'no' then return false end&lt;br /&gt;
    &lt;br /&gt;
    local listClasses = {'plainlist', 'hlist', 'hlist hnum', 'hlist vcard', 'vcard hlist'}&lt;br /&gt;
    for i, cls in ipairs(listClasses) do&lt;br /&gt;
        if args.listclass == cls or args.bodyclass == cls then&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function hasBackgroundColors()&lt;br /&gt;
    return args.titlestyle or args.groupstyle&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Main navbox tables&lt;br /&gt;
--&lt;br /&gt;
function renderMainTable()&lt;br /&gt;
    local tbl = HtmlBuilder.create('table')&lt;br /&gt;
        .attr('cellspacing', 0)&lt;br /&gt;
        .addClass('nowraplinks')&lt;br /&gt;
        .addClass(args.bodyclass)&lt;br /&gt;
             &lt;br /&gt;
    if args.title and (args.state ~= 'plain' and args.state ~= 'off') then&lt;br /&gt;
        tbl&lt;br /&gt;
            .addClass('collapsible')&lt;br /&gt;
            .addClass(args.state or 'autocollapse')&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    tbl.css('border-spacing', 0)&lt;br /&gt;
    if border == 'subgroup' or border == 'child' or border == 'none' then&lt;br /&gt;
        tbl&lt;br /&gt;
            .addClass('navbox-subgroup')&lt;br /&gt;
            .cssText(args.bodystyle)&lt;br /&gt;
            .cssText(args.style)&lt;br /&gt;
    else -- regular navobx - bodystyle and style will be applied to the wrapper table&lt;br /&gt;
        tbl&lt;br /&gt;
            .addClass('navbox-inner')&lt;br /&gt;
            .css('background', 'transparent')&lt;br /&gt;
            .css('color', 'inherit')&lt;br /&gt;
    end&lt;br /&gt;
    tbl.cssText(args.innerstyle)&lt;br /&gt;
 &lt;br /&gt;
    renderTitleRow(tbl)&lt;br /&gt;
    renderAboveRow(tbl)&lt;br /&gt;
    for i, listnum in ipairs(listnums) do&lt;br /&gt;
        renderListRow(tbl, listnum) &lt;br /&gt;
    end&lt;br /&gt;
    renderBelowRow(tbl)&lt;br /&gt;
    &lt;br /&gt;
    return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._navbox(navboxArgs)&lt;br /&gt;
    args = navboxArgs&lt;br /&gt;
    &lt;br /&gt;
    for k, v in pairs(args) do&lt;br /&gt;
        local listnum = ('' .. k):match('^list(%d+)$')&lt;br /&gt;
        if listnum then table.insert(listnums, tonumber(listnum)) end&lt;br /&gt;
    end&lt;br /&gt;
    table.sort(listnums)&lt;br /&gt;
 &lt;br /&gt;
    border = trim(args.border or args[1] or '')&lt;br /&gt;
&lt;br /&gt;
    -- render the main body of the navbox&lt;br /&gt;
    local tbl = renderMainTable()&lt;br /&gt;
&lt;br /&gt;
    -- render the appropriate wrapper around the navbox, depending on the border param&lt;br /&gt;
    local res = HtmlBuilder.create()&lt;br /&gt;
    if border == 'none' then&lt;br /&gt;
        res.node(tbl)&lt;br /&gt;
    elseif border == 'subgroup' or border == 'child' then&lt;br /&gt;
        -- We assume that this navbox is being rendered in a list cell of a parent navbox, and is&lt;br /&gt;
        -- therefore inside a div with padding:0em 0.25em. We start with a &amp;lt;/div&amp;gt; to avoid the&lt;br /&gt;
        -- padding being applied, and at the end add a &amp;lt;div&amp;gt; to balance out the parent's &amp;lt;/div&amp;gt;&lt;br /&gt;
        res&lt;br /&gt;
            .tag('/div', {unclosed = true})&lt;br /&gt;
                .done()&lt;br /&gt;
            .node(tbl)&lt;br /&gt;
            .tag('div', {unclosed = true})&lt;br /&gt;
    else&lt;br /&gt;
        res&lt;br /&gt;
            .tag('table')&lt;br /&gt;
                .attr('cellspacing', 0)&lt;br /&gt;
                .addClass('navbox')&lt;br /&gt;
                .css('border-spacing', 0)&lt;br /&gt;
                .cssText(args.bodystyle)&lt;br /&gt;
                .cssText(args.style)&lt;br /&gt;
                .tag('tr')&lt;br /&gt;
                    .tag('td')&lt;br /&gt;
                        .css('padding', '2px')&lt;br /&gt;
                        .node(tbl)&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    renderTrackingCategories(res)&lt;br /&gt;
 &lt;br /&gt;
    return tostring(res)&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function p.navbox(frame)&lt;br /&gt;
    -- ParserFunctions considers the empty string to be false, so to preserve the previous &lt;br /&gt;
    -- behavior of {{navbox}}, change any empty arguments to nil, so Lua will consider&lt;br /&gt;
    -- them false too.&lt;br /&gt;
    local args = {}&lt;br /&gt;
    local parent_args = frame:getParent().args;&lt;br /&gt;
&lt;br /&gt;
    -- Out of order parsing bug.&lt;br /&gt;
    local temp;&lt;br /&gt;
    temp = parent_args.title;&lt;br /&gt;
    temp = parent_args.above;&lt;br /&gt;
    for i = 1, 20 do&lt;br /&gt;
        temp = parent_args[&amp;quot;group&amp;quot; .. tostring(i)];&lt;br /&gt;
        temp = parent_args[&amp;quot;list&amp;quot; .. tostring(i)];&lt;br /&gt;
    end    &lt;br /&gt;
    temp = parent_args.below;&lt;br /&gt;
    &lt;br /&gt;
    for k, v in pairs(parent_args) do&lt;br /&gt;
        if v ~= '' then&lt;br /&gt;
            args[k] = v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return p._navbox(args)&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Teste&amp;diff=215</id>
		<title>Teste</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Teste&amp;diff=215"/>
		<updated>2013-08-01T18:25:44Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ambox|text=Teste do mike}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Underlinked&amp;diff=214</id>
		<title>Predefinição:Underlinked</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Underlinked&amp;diff=214"/>
		<updated>2013-08-01T18:24:58Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--{{Underlinked}} begin--&amp;gt;{{#ifeq:{{NAMESPACE}}|{{&amp;lt;includeonly&amp;gt;subst:&amp;lt;/includeonly&amp;gt;NAMESPACE}}|&amp;lt;includeonly&amp;gt;[[Category:Pages with incorrectly substituted templates|{{PAGENAME}}]]&amp;lt;/includeonly&amp;gt;|}}{{Ambox&lt;br /&gt;
| name  = Underlinked&lt;br /&gt;
| type  = style&lt;br /&gt;
| image = [[File:Ambox wikify.svg|50x40px|link=|alt=]]&lt;br /&gt;
| issue = This {{{1|article}}} '''needs more [[Wikipedia:Manual of Style/Linking|links to other articles]] to help [[WP:BUILD|integrate it into the encyclopedia]]'''.&lt;br /&gt;
| fix   = Please help [{{fullurl:{{FULLPAGENAME}}|action=edit}} improve this article] by adding links [[Wikipedia:Only make links that are relevant to the context|that are relevant to the context]] within the existing text.&lt;br /&gt;
| date  = {{{date|}}}&lt;br /&gt;
| cat   = Articles with too few wikilinks&lt;br /&gt;
| all   = All articles with too few wikilinks&lt;br /&gt;
| cat2  = Articles covered by WikiProject Wikify&lt;br /&gt;
| all2  = All articles covered by WikiProject Wikify&lt;br /&gt;
}}&amp;lt;!--{{Underlinked}} end--&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Sidebar&amp;diff=204</id>
		<title>Predefinição:Sidebar</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Sidebar&amp;diff=204"/>
		<updated>2013-08-01T18:24:57Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#ifeq:{{{child|}}}|yes||&amp;lt;table class=&amp;quot;vertical-navbox {{#ifeq:{{{wraplinks|}}}|true||nowraplinks}} {{{bodyclass|{{{class|}}}}}}&amp;quot; &amp;lt;!--&lt;br /&gt;
    --&amp;gt;cellspacing=&amp;quot;{{#if:{{{cellspacing|}}} |{{{cellspacing}}} |5}}&amp;quot; &amp;lt;!--&lt;br /&gt;
    --&amp;gt;cellpadding=&amp;quot;{{#if:{{{cellpadding|}}} |{{{cellpadding}}} |0}}&amp;quot; &amp;lt;!--&lt;br /&gt;
    --&amp;gt;style=&amp;quot;float:{{#if:{{{float|}}} |{{{float}}} |right}};&amp;lt;!--&lt;br /&gt;
           --&amp;gt;clear:{{#ifeq:{{{float|}}}|none |both |{{#if:{{{float|}}} |{{{float}}} |right}}}};&amp;lt;!--&lt;br /&gt;
           --&amp;gt;width:{{#if:{{{width|}}} |{{{width}}} |22.0em}};&amp;lt;!--&lt;br /&gt;
             (margins:)--&amp;gt;{{#switch:{{{float|}}} |left=margin:0 1.0em 1.0em 0; |none|right|#default=margin:0 0 1.0em 1.0em;}}&amp;lt;!--&lt;br /&gt;
           --&amp;gt;background:#f9f9f9;border:1px solid #aaa;padding:0.2em;border-spacing:0.4em 0;text-align:center;line-height:1.4em;font-size:88%;{{{bodystyle|{{{style|}}}}}}&amp;quot;&amp;gt;}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
 --&amp;gt;{{#ifeq:{{{child|}}}|yes||{{#if:{{{outertitle|}}}&lt;br /&gt;
     |&amp;lt;caption class=&amp;quot;{{{outertitleclass|}}}&amp;quot; style=&amp;quot;padding-bottom:0.2em;font-size:125%;line-height:1.2em;font-weight:bold;{{{outertitlestyle|}}}&amp;quot;&amp;gt;{{{outertitle}}}&amp;lt;/caption&amp;gt;&amp;lt;!--&lt;br /&gt;
 --&amp;gt;}}}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
 --&amp;gt;{{#ifeq:{{{child|}}}|yes||{{#if:{{{topimage|}}}&lt;br /&gt;
     |&amp;lt;tr&amp;gt;&amp;lt;td class=&amp;quot;{{{topimageclass|}}}&amp;quot; style=&amp;quot;padding:0.4em 0;{{{topimagestyle|}}}&amp;quot;&amp;gt;{{{topimage}}}&amp;lt;!--&lt;br /&gt;
           --&amp;gt;{{#if:{{{topcaption|}}} |&amp;lt;div style=&amp;quot;padding-top:0.2em;line-height:1.2em;{{{topcaptionstyle|}}}&amp;quot;&amp;gt;{{{topcaption}}}&amp;lt;/div&amp;gt;}}&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    }}}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
 --&amp;gt;{{#ifeq:{{{child|}}}|yes||{{#if:{{{pretitle|}}}&lt;br /&gt;
     |&amp;lt;tr&amp;gt;&amp;lt;td class=&amp;quot;{{{pretitleclass|}}}&amp;quot; style=&amp;quot;{{{basestyle|}}};{{#if:{{{topimage|}}} |padding-top:0.2em |padding-top:0.4em}};line-height:1.2em;{{{pretitlestyle|}}}&amp;quot;&amp;gt;{{{pretitle}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    }}}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
 --&amp;gt;{{#if:{{{title|}}}&lt;br /&gt;
     |{{#ifeq:{{{child|}}}|yes||&amp;lt;tr&amp;gt;&amp;lt;th class=&amp;quot;{{{titleclass|}}}&amp;quot; style=&amp;quot;{{{basestyle|}}};padding:0.2em 0.4em 0.2em;{{#if:{{{pretitle|}}} |padding-top:0}};font-size:145%;line-height:1.2em;{{{titlestyle|}}}&amp;quot;&amp;gt;}}{{{title}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    }}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
 --&amp;gt;{{#if:{{{image|}}}&lt;br /&gt;
     |&amp;lt;tr&amp;gt;&amp;lt;td class=&amp;quot;{{{imageclass|}}}&amp;quot; style=&amp;quot;padding:0.2em 0 0.4em;{{{imagestyle|}}}&amp;quot;&amp;gt;{{{image}}}&amp;lt;!--&lt;br /&gt;
           --&amp;gt;{{#if:{{{caption|}}} |&amp;lt;div style=&amp;quot;padding-top:0.2em;line-height:1.2em;{{{captionstyle|}}}&amp;quot;&amp;gt;{{{caption}}}&amp;lt;/div&amp;gt;}}&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    }}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
 --&amp;gt;{{#if:{{{above|}}}&lt;br /&gt;
     |&amp;lt;tr&amp;gt;&amp;lt;td class=&amp;quot;{{{aboveclass|}}}&amp;quot; style=&amp;quot;padding:0.3em 0.4em 0.3em;font-weight:bold;{{{abovestyle|}}}&amp;quot;&amp;gt;&amp;lt;!--newline required for bullet-points to work:--&amp;gt;&lt;br /&gt;
{{{above}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;/tr&amp;gt;&lt;br /&gt;
    }}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
 heading#/content# starts here:&lt;br /&gt;
&lt;br /&gt;
 --&amp;gt;{{#if: {{{heading1|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading1style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading1}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content1|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content1style|}}}&amp;quot;&amp;gt;&amp;lt;!-- newline required before contents# for bullets to work --&amp;gt;&lt;br /&gt;
{{{content1}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading2|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading2style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading2}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content2|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content2style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content2}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading3|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading3style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading3}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content3|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content3style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content3}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading4|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading4style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading4}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content4|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content4style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content4|}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading5|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading5style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading5}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content5|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content5style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content5}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading6|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading6style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading6}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content6|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content6style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content6}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading7|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading7style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading7}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content7|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content7style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content7}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading8|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading8style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading8}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content8|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content8style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content8}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading9|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading9style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading9}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content9|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content9style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content9}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading10|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading10style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading10}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content10|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content10style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content10}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading11|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading11style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading11}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content11|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content11style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content11}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading12|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading12style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading12}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content12|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content12style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content12}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading13|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading13style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading13}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content13|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content13style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content13}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading14|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading14style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading14}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content14|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content14style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content14}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading15|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading15style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading15}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content15|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content15style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content15}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading16|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading16style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading16}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content16|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content16style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content16}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading17|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading17style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading17}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content17|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content17style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content17}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading18|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading18style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading18}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content18|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content18style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content18}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading19|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading19style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading19}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content19|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content19style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content19}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading20|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading20style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading20}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content20|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content20style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content20}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading21|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading21style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading21}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content21|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content21style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content21}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading22|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading22style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading22}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content22|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content22style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content22}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading23|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading23style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading23}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content23|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content23style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content23}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading24|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading24style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading24}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content24|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content24style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content24}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading25|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading25style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading25}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content25|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content25style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content25}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading26|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading26style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading26}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content26|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content26style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content26}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading27|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading27style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading27}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content27|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content27style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content27}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading28|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading28style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading28}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content28|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content28style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content28}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading29|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading29style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading29}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content29|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content29style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content29}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading30|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading30style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading30}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content30|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content30style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content30}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading31|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading31style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading31}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content31|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content31style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content31}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading32|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading32style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading32}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content32|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content32style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content32}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading33|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading33style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading33}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content33|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content33style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content33}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading34|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading34style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading34}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content34|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content34style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content34}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if: {{{heading35|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;th class=&amp;quot;{{{headingclass|}}}&amp;quot; style=&amp;quot;padding:0.1em;{{{basestyle|}}};{{{headingstyle|}}};{{{heading35style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{heading35}}}&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}{{#if:&lt;br /&gt;
{{{content35|}}}|&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
&amp;lt;td class=&amp;quot;{{{contentclass|}}}&amp;quot; style=&amp;quot;padding:0 0.1em 0.4em;{{{contentstyle|}}};{{{content35style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{content35}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
 --&amp;gt;{{#if: {{{below|}}}&lt;br /&gt;
     |&amp;lt;tr&amp;gt;&amp;lt;td class=&amp;quot;{{{belowclass|}}}&amp;quot; style=&amp;quot;padding:0.3em 0.4em 0.3em;font-weight:bold;{{{belowstyle|}}}&amp;quot;&amp;gt;&lt;br /&gt;
{{{below}}}&amp;lt;/td&amp;gt;&lt;br /&gt;
     &amp;lt;/tr&amp;gt;&lt;br /&gt;
    }}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
 --&amp;gt;{{#ifeq:{{{child|}}}|yes||{{#switch:{{{navbar|{{{tnavbar|&amp;lt;noinclude&amp;gt;off&amp;lt;/noinclude&amp;gt;}}}}}}&lt;br /&gt;
     |none |off=&lt;br /&gt;
     |#default=&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;text-align:right;font-size:115%;{{{navbarstyle|{{{tnavbarstyle|}}}}}}&amp;quot;&amp;gt;{{navbar|{{{name|{{PAGENAME}}}}}|mini=1|fontstyle={{{navbarfontstyle|{{{tnavbarfontstyle|}}}}}}}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;!--&lt;br /&gt;
 --&amp;gt;}}&lt;br /&gt;
&amp;lt;/table&amp;gt;}}&amp;lt;noinclude&amp;gt;{{documentation}}&amp;lt;!-- Please add categories and interwikis to the bottom of Template:Sidebar/doc, not here --&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Template_other&amp;diff=206</id>
		<title>Predefinição:Template other</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Template_other&amp;diff=206"/>
		<updated>2013-08-01T18:24:57Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#switch:&lt;br /&gt;
  &amp;lt;!--If no or empty &amp;quot;demospace&amp;quot; parameter then detect namespace--&amp;gt;&lt;br /&gt;
  {{#if:{{{demospace|}}}&lt;br /&gt;
  | {{lc: {{{demospace}}} }}    &amp;lt;!--Use lower case &amp;quot;demospace&amp;quot;--&amp;gt;&lt;br /&gt;
  | {{#ifeq:{{NAMESPACE}}|{{ns:Template}}&lt;br /&gt;
    | template&lt;br /&gt;
    | other&lt;br /&gt;
    }}&lt;br /&gt;
  }}&lt;br /&gt;
| template = {{{1|}}}&lt;br /&gt;
| other&lt;br /&gt;
| #default = {{{2|}}}&lt;br /&gt;
}}&amp;lt;!--End switch--&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Tl&amp;diff=208</id>
		<title>Predefinição:Tl</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Tl&amp;diff=208"/>
		<updated>2013-08-01T18:24:57Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{[[Template:{{{1}}}|{{{1}}}]]}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Tlx&amp;diff=210</id>
		<title>Predefinição:Tlx</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Tlx&amp;diff=210"/>
		<updated>2013-08-01T18:24:57Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;lt;/nowiki&amp;gt;{{#if:{{{subst|}}}|[[Help:Substitution|subst]]:}}[[{{{LANG|}}}{{{SISTER|}}}{{ns:Template}}:{{{1|}}}|{{{1|}}}]]&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{2|}}}|&lt;br /&gt;
&amp;amp;#124;{{{2}}}&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{3|}}}|&lt;br /&gt;
&amp;amp;#124;{{{3}}}&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{4|}}}|&lt;br /&gt;
&amp;amp;#124;{{{4}}}&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{5|}}}|&lt;br /&gt;
&amp;amp;#124;{{{5}}}&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{6|}}}|&lt;br /&gt;
&amp;amp;#124;{{{6}}}&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{7|}}}|&lt;br /&gt;
&amp;amp;#124;{{{7}}}&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{8|}}}|&lt;br /&gt;
&amp;amp;#124;{{{8}}}&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{9|}}}|&lt;br /&gt;
&amp;amp;#124;{{{9}}}&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{10|}}}|&lt;br /&gt;
&amp;amp;#124;{{{10}}}&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{11|}}}|&lt;br /&gt;
&amp;amp;#124;{{{11}}}&lt;br /&gt;
}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{12|}}}|&lt;br /&gt;
&amp;amp;#124;''...''&lt;br /&gt;
}}&amp;lt;nowiki&amp;gt;}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Transclude&amp;diff=212</id>
		<title>Predefinição:Transclude</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Transclude&amp;diff=212"/>
		<updated>2013-08-01T18:24:57Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#switch: {{NAMESPACE: {{{1}}} }}&lt;br /&gt;
 |#default = {{FULLPAGENAME: {{{1}}} }} &amp;lt;!-- eg &amp;quot;User:Foo&amp;quot; --&amp;gt;&lt;br /&gt;
 |{{ns:0}} = &lt;br /&gt;
    {{#ifeq: {{NAMESPACE: {{{1}}} }} | {{NAMESPACE: Template{{{1}}} }}&lt;br /&gt;
      | Template:{{{1}}}            &amp;lt;!-- no leading colon, eg &amp;quot;Foo&amp;quot; --&amp;gt;&lt;br /&gt;
      | {{PAGENAME: {{{1}}} }}      &amp;lt;!-- leading colon, eg &amp;quot;:Foo&amp;quot;, so we want the article --&amp;gt;&lt;br /&gt;
    }}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Pp-template&amp;diff=200</id>
		<title>Predefinição:Pp-template</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Pp-template&amp;diff=200"/>
		<updated>2013-08-01T18:24:56Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{pp-meta&lt;br /&gt;
|type={{#switch:{{{demolevel|{{#ifeq:{{PROTECTIONLEVEL:edit}}-{{PROTECTIONLEVEL:move}}|-sysop|move|{{PROTECTIONLEVEL:edit}}}}}}}&lt;br /&gt;
   |semi&lt;br /&gt;
   |autoconfirmed=semi&lt;br /&gt;
   |administrator&lt;br /&gt;
   |full&lt;br /&gt;
   |sysop=indef&lt;br /&gt;
   |move=move&lt;br /&gt;
   |#default=indef&amp;lt;!--fallback value--&amp;gt;}}&lt;br /&gt;
|small={{{small|yes}}}&lt;br /&gt;
|demospace={{{demospace|}}}&lt;br /&gt;
|demolevel={{#ifeq:{{PAGENAME}}/{{NAMESPACE}}|{{SUBPAGENAME}}/{{ns:Template}}|{{{demolevel|undefined}}}|{{#ifeq:{{lc:{{SUBPAGENAME}}}}|sandbox|sysop|{{{demolevel|undefined}}}}}}}&lt;br /&gt;
|expiry=&amp;lt;!--not applicable--&amp;gt;&lt;br /&gt;
|dispute=no&lt;br /&gt;
|icon-text=This {{#ifeq:{{NAMESPACE}}|{{ns:6}}|image, included in a high-risk template or message,|high-risk template}} is indefinitely {{#switch:{{{demolevel|{{#ifeq:{{PROTECTIONLEVEL:edit}}-{{PROTECTIONLEVEL:move}}|-sysop|move|{{PROTECTIONLEVEL:edit}}}}}}}&lt;br /&gt;
   |semi&lt;br /&gt;
   |autoconfirmed=semi-protected from editing&lt;br /&gt;
   |move=move-protected&lt;br /&gt;
   |administrator&lt;br /&gt;
   |full&lt;br /&gt;
   |sysop&lt;br /&gt;
   |#default=&amp;lt;!--fallback value--&amp;gt;protected from editing}} to prevent vandalism.&lt;br /&gt;
|reason-text=This {{#switch:{{NAMESPACE}}&lt;br /&gt;
  |{{ns:image}}=image, used in one or more [[Wikipedia:High-risk templates|high-risk templates]]{{#switch:{{{demolevel|{{PROTECTIONLEVEL:edit}}}}}&lt;br /&gt;
   |semi&lt;br /&gt;
   |autoconfirmed=&lt;br /&gt;
   |administrator&lt;br /&gt;
   |full&lt;br /&gt;
   |sysop=&amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;and/or [[Special:Allmessages|system messages]],&lt;br /&gt;
   |#default=&amp;lt;!--fallback value--&amp;gt;}}&lt;br /&gt;
  |#default=[[Wikipedia:High-risk templates|high-risk template]]&lt;br /&gt;
}} has been [[Wikipedia:This page is protected|{{#switch:{{{demolevel|{{#ifeq:{{PROTECTIONLEVEL:edit}}-{{PROTECTIONLEVEL:move}}|-sysop|move|{{PROTECTIONLEVEL:edit}}}}}}}&lt;br /&gt;
   |semi&lt;br /&gt;
   |autoconfirmed=semi-&lt;br /&gt;
   |move=move-&lt;br /&gt;
   |administrator&lt;br /&gt;
   |full&lt;br /&gt;
   |sysop&amp;lt;!--uses default--&amp;gt;&lt;br /&gt;
   |#default=&amp;lt;!--fallback value--&amp;gt;}}protected]]{{#ifeq:{{PROTECTIONLEVEL:edit}}-{{PROTECTIONLEVEL:move}}|-sysop||&amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;from editing}} to prevent [[Wikipedia:Vandalism|vandalism]]. {{#switch:{{{demolevel|{{PROTECTIONLEVEL:edit}}}}}&lt;br /&gt;
   |semi&lt;br /&gt;
   |autoconfirmed=&lt;br /&gt;
   |administrator&lt;br /&gt;
   |full&lt;br /&gt;
   |sysop&amp;lt;!--uses default--&amp;gt;&lt;br /&gt;
   |#default={{#switch:{{NAMESPACE}}|{{ns:image}}=&amp;lt;br /&amp;gt;&amp;lt;small&amp;gt;'''Do not move this image''' to [[commons:|Wikimedia Commons]].&amp;lt;/small&amp;gt;}}}}&lt;br /&gt;
|categories={{{categories|{{#ifeq:{{NAMESPACE}}|{{ns:10}}|{{#switch:{{{demolevel|{{#ifeq:{{PROTECTIONLEVEL:edit}}-{{PROTECTIONLEVEL:move}}|-sysop|move|{{PROTECTIONLEVEL:edit}}}}}}}&lt;br /&gt;
   |semi&lt;br /&gt;
   |autoconfirmed=[[Category:Wikipedia semi-protected templates|{{PAGENAME}}]]{{#ifeq:{{PROTECTIONLEVEL:move}}|sysop|[[Category:Wikipedia move-protected templates|{{PAGENAME}}]]}}&lt;br /&gt;
   |move=[[Category:Wikipedia move-protected templates|{{PAGENAME}}]]&lt;br /&gt;
   |administrator&lt;br /&gt;
   |full&lt;br /&gt;
   |sysop&amp;lt;!--uses default--&amp;gt;&lt;br /&gt;
   |#default=[[Category:Wikipedia protected templates|{{PAGENAME}}]]&amp;lt;!--fallback value--&amp;gt;}}}}{{#ifeq:{{NAMESPACE}}|{{ns:6}}|[[Category:{{#switch:{{{demolevel|{{PROTECTIONLEVEL:edit}}}}}&lt;br /&gt;
   |semi&lt;br /&gt;
   |autoconfirmed=Semi-protected&lt;br /&gt;
   |administrator&lt;br /&gt;
   |full&lt;br /&gt;
   |sysop&amp;lt;!--uses default--&amp;gt;&lt;br /&gt;
   |#default=Protected&amp;lt;!--fallback value--&amp;gt;}} images|{{PAGENAME}}]]}}}}}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{pp-template|categories=no}}  &amp;lt;!-- Show the small version --&amp;gt;&lt;br /&gt;
{{pp-template|small=no}}      &amp;lt;!-- Show the large version --&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Purge&amp;diff=202</id>
		<title>Predefinição:Purge</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Purge&amp;diff=202"/>
		<updated>2013-08-01T18:24:56Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span class=&amp;quot;noprint plainlinks purgelink&amp;quot;&amp;gt;[{{fullurl:{{{page|{{FULLPAGENAME}}}}}|action=purge}} &amp;lt;span title=&amp;quot;Purge this page&amp;quot;&amp;gt;{{{1|Purge}}}&amp;lt;/span&amp;gt;]&amp;lt;/span&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Ombox/core&amp;diff=192</id>
		<title>Predefinição:Ombox/core</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Ombox/core&amp;diff=192"/>
		<updated>2013-08-01T18:24:55Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;table class=&amp;quot;plainlinks ombox {{#ifeq:{{{small}}}|yes|mbox-small}} &lt;br /&gt;
{{#switch:{{{type|}}}&lt;br /&gt;
| speedy     = ombox-speedy&lt;br /&gt;
| delete     = ombox-delete&lt;br /&gt;
| content    = ombox-content&lt;br /&gt;
| style      = ombox-style&lt;br /&gt;
| move       = ombox-move&lt;br /&gt;
| protection = ombox-protection&lt;br /&gt;
| notice          &amp;lt;!-- notice = default --&amp;gt;&lt;br /&gt;
| #default   = ombox-notice&lt;br /&gt;
}} {{{class|}}}&amp;quot; style=&amp;quot;{{{style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
{{#ifeq:{{{image|}}}|none&lt;br /&gt;
| &amp;lt;!-- No image. Cell with some width or padding necessary for text cell to have 100% width. --&amp;gt;&amp;lt;td class=&amp;quot;mbox-empty-cell&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
| &amp;lt;td class=&amp;quot;mbox-image&amp;quot;&amp;gt;&lt;br /&gt;
  {{#if:{{{image|}}}&lt;br /&gt;
  | {{{image}}}&lt;br /&gt;
  | [[Image:{{#switch:{{{type|}}}&lt;br /&gt;
    | speedy     = Imbox speedy deletion.png&lt;br /&gt;
    | delete     = Imbox deletion.png&lt;br /&gt;
    | content    = Imbox content.png&lt;br /&gt;
    | style      = Edit-clear.svg&lt;br /&gt;
    | move       = Imbox move.png&lt;br /&gt;
    | protection = Imbox protection.png&lt;br /&gt;
    | notice          &amp;lt;!-- notice = default --&amp;gt;&lt;br /&gt;
    | #default   = Imbox notice.png&lt;br /&gt;
    }} | {{#ifeq:{{{small|}}}|yes&lt;br /&gt;
    | 30x30px&lt;br /&gt;
    | 40x40px&lt;br /&gt;
    }}|link=|alt=]]&lt;br /&gt;
  }}&amp;lt;/td&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;td class=&amp;quot;mbox-text&amp;quot; style=&amp;quot;{{{textstyle|}}}&amp;quot;&amp;gt; {{{text}}} &amp;lt;/td&amp;gt;&lt;br /&gt;
{{#if:{{{imageright|}}}&lt;br /&gt;
| {{#ifeq:{{{imageright|}}}|none&lt;br /&gt;
  | &amp;lt;!-- No image. --&amp;gt;&lt;br /&gt;
  | &amp;lt;td class=&amp;quot;mbox-imageright&amp;quot;&amp;gt; {{{imageright}}} &amp;lt;/td&amp;gt;&lt;br /&gt;
  }}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;lt;!-- Detect and report usage with faulty &amp;quot;type&amp;quot; parameter:&lt;br /&gt;
--&amp;gt;{{#switch:{{{type|}}}&lt;br /&gt;
|   &amp;lt;!-- No type fed, is also valid input --&amp;gt;&lt;br /&gt;
| speedy&lt;br /&gt;
| delete&lt;br /&gt;
| content&lt;br /&gt;
| style&lt;br /&gt;
| move&lt;br /&gt;
| protection&lt;br /&gt;
| notice     =    &amp;lt;!-- Do nothing, valid &amp;quot;type&amp;quot; --&amp;gt;&lt;br /&gt;
| #default   = &amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;This message box is using an invalid &amp;quot;type={{{type|}}}&amp;quot; parameter and needs fixing.&amp;lt;/div&amp;gt;[[Category:Wikipedia message box parameter needs fixing|{{main other|Main:}}{{FULLPAGENAME}}]]&amp;lt;!-- Sort on namespace --&amp;gt;&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:POV&amp;diff=194</id>
		<title>Predefinição:POV</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:POV&amp;diff=194"/>
		<updated>2013-08-01T18:24:55Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--{{POV}} begin--&amp;gt;{{Ambox&lt;br /&gt;
| name  = POV&lt;br /&gt;
| subst = &amp;lt;includeonly&amp;gt;{{subst:substcheck}}&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
| small = {{{small|}}}&lt;br /&gt;
| type  = content&lt;br /&gt;
| class = ambox-POV&lt;br /&gt;
| image = [[File:Unbalanced scales.svg|50x40px|link=]] &lt;br /&gt;
| issue = The '''[[Wikipedia:Neutral point of view|neutrality]] of this {{{what|article}}} is [[Wikipedia:NPOV dispute|disputed]]'''.&lt;br /&gt;
| talk  = {{{talk|{{{1|#}}}}}}&lt;br /&gt;
| fix   = Please do not remove this message until the [[WP:NPOVD#What is an NPOV dispute?|dispute is resolved]].&lt;br /&gt;
| date  = {{{date|}}}&lt;br /&gt;
| cat   = NPOV disputes&lt;br /&gt;
| all   = All NPOV disputes&lt;br /&gt;
}}&amp;lt;!--{{POV}} end--&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Para&amp;diff=196</id>
		<title>Predefinição:Para</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Para&amp;diff=196"/>
		<updated>2013-08-01T18:24:55Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;{{#if:{{{1|}}}|{{{1}}}&amp;lt;nowiki&amp;gt;=&amp;lt;/nowiki&amp;gt;}}{{{2|}}}&amp;lt;/code&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;!--Categories and interwikis go near the bottom of the /doc subpage.--&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Pp-meta&amp;diff=198</id>
		<title>Predefinição:Pp-meta</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Pp-meta&amp;diff=198"/>
		<updated>2013-08-01T18:24:55Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#ifeq:{{#switch:{{lc:{{{type}}}}}&lt;br /&gt;
  |move=&amp;lt;!--&lt;br /&gt;
 --&amp;gt;{{#ifeq:&lt;br /&gt;
      {{#switch:{{lc:{{{demolevel|undefined}}}}}&lt;br /&gt;
        |semi |autoconfirmed           = autoconfirmed&lt;br /&gt;
        |administrator |full |sysop    = sysop&lt;br /&gt;
        |undefined                     = {{PROTECTIONLEVEL:move}}&lt;br /&gt;
        |#default                      = &amp;lt;!--fallback value: null&lt;br /&gt;
   --&amp;gt;}}&lt;br /&gt;
      |sysop|yes|no&lt;br /&gt;
    }}&lt;br /&gt;
  |create=&amp;lt;!--&lt;br /&gt;
 --&amp;gt;{{#if:&lt;br /&gt;
      {{#switch:{{lc:{{{demolevel|undefined}}}}}&lt;br /&gt;
        |semi |autoconfirmed           = autoconfirmed&lt;br /&gt;
        |administrator |full |sysop    = sysop&lt;br /&gt;
        |undefined                     = {{PROTECTIONLEVEL:create}}&lt;br /&gt;
        |#default                      = &amp;lt;!--fallback value: null&lt;br /&gt;
   --&amp;gt;}}&lt;br /&gt;
      |yes|no&lt;br /&gt;
    }}&lt;br /&gt;
  |pc1 =&amp;lt;!--&lt;br /&gt;
 --&amp;gt;{{#ifeq:&lt;br /&gt;
      {{#switch:{{lc:{{{demolevel|undefined}}}}}&lt;br /&gt;
        |pc1                           = autoconfirmed &amp;lt;!-- this is the value that the PENDINGCHANGELEVEL magic word returns for pc1 --&amp;gt;&lt;br /&gt;
        |undefined                     = {{PENDINGCHANGELEVEL}}&lt;br /&gt;
        |#default                      = &amp;lt;!--fallback value: null&lt;br /&gt;
   --&amp;gt;}}&lt;br /&gt;
      |autoconfirmed&lt;br /&gt;
      |yes|no&lt;br /&gt;
    }}&lt;br /&gt;
  |pc2 =&amp;lt;!--&lt;br /&gt;
 --&amp;gt;{{#ifeq:&lt;br /&gt;
      {{#switch:{{lc:{{{demolevel|undefined}}}}}&lt;br /&gt;
        |pc2                           = review &amp;lt;!-- this is the value that the PENDINGCHANGELEVEL magic word returns for pc2 --&amp;gt;&lt;br /&gt;
        |undefined                     = {{PENDINGCHANGELEVEL}}&lt;br /&gt;
        |#default                      = &amp;lt;!--fallback value: null&lt;br /&gt;
   --&amp;gt;}}&lt;br /&gt;
      |review&lt;br /&gt;
      |yes|no&lt;br /&gt;
    }}&lt;br /&gt;
|#default&amp;lt;!--includes all other types--&amp;gt;=&amp;lt;!--&lt;br /&gt;
 --&amp;gt;{{#if:&lt;br /&gt;
      {{#switch:{{lc:{{{demolevel|undefined}}}}}&lt;br /&gt;
        |semi |autoconfirmed           = autoconfirmed&lt;br /&gt;
        |administrator |full |sysop    = sysop&lt;br /&gt;
        |undefined                     = {{PROTECTIONLEVEL:edit}}&lt;br /&gt;
        |#default                      = &amp;lt;!--fallback value: null&lt;br /&gt;
   --&amp;gt;}}&lt;br /&gt;
      |{{#ifeq:{{#switch:{{lc:{{{disallowlevel|}}}}}&lt;br /&gt;
                 |semi |autoconfirmed           = autoconfirmed&lt;br /&gt;
                 |administrator |full |sysop    = sysop&lt;br /&gt;
                 |#default                      = &amp;lt;!--fallback value: null--&amp;gt;}}&lt;br /&gt;
         |{{#switch:{{lc:{{{demolevel|undefined}}}}}&lt;br /&gt;
            |semi |autoconfirmed           = autoconfirmed&lt;br /&gt;
            |administrator |full |sysop    = sysop&lt;br /&gt;
            |undefined                     = {{PROTECTIONLEVEL:edit}}&lt;br /&gt;
            |#default                      = &amp;lt;!--fallback value: null&lt;br /&gt;
       --&amp;gt;}}&lt;br /&gt;
         |no|yes&lt;br /&gt;
       }}&lt;br /&gt;
   |no}}&lt;br /&gt;
}}|yes|{{#ifeq:{{lc:{{{small|}}}}}|yes|&lt;br /&gt;
{{#switch:{{lc:{{{type}}}}} &lt;br /&gt;
  | pc1 | pc2 = &amp;lt;div class=&amp;quot;metadata topicon nopopups&amp;quot; id=&amp;quot;protected-icon&amp;quot; style=&amp;quot;display:none; right:25px;&amp;quot;&amp;gt; &lt;br /&gt;
  | #default = &amp;lt;div class=&amp;quot;metadata topicon nopopups&amp;quot; id=&amp;quot;protected-icon&amp;quot; style=&amp;quot;display:none; right:55px;&amp;quot;&amp;gt;&lt;br /&gt;
}}[[Image:{{{image|{{#switch:{{lc:{{{type}}}}}&lt;br /&gt;
 |full=Padlock.svg&lt;br /&gt;
 |semi=Padlock-silver.svg&lt;br /&gt;
 |pc1=Padlock-silver-light.svg&lt;br /&gt;
 |pc2=Padlock-orange.svg&lt;br /&gt;
 |move=Padlock-olive.svg&lt;br /&gt;
 |indef=Padlock-red.svg&lt;br /&gt;
 |office=Padlock-black.svg&lt;br /&gt;
 |create=Padlock-skyblue.svg&lt;br /&gt;
 |#default=Transparent.gif&lt;br /&gt;
}}}}}|20px|link={{{icon-link|Wikipedia:Protection policy#{{lc:{{{type}}}}}}}}|{{{icon-text|{{#switch:{{lc:{{{type}}}}}&lt;br /&gt;
|pc1 = All edits by unregistered and new users are subject to review&lt;br /&gt;
|pc2 = All edits by users who are not reviewers or administrators are subject to review&lt;br /&gt;
|#default = This {{pp-meta/pagetype}} is {{#switch:{{lc:{{{type}}}}}&lt;br /&gt;
  |semi=semi-&lt;br /&gt;
  |move=move-&lt;br /&gt;
  |indef=permanently&amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  |create=creation-&lt;br /&gt;
  |office=&amp;lt;!--null, but should this have a special tag?--&amp;gt;&lt;br /&gt;
  |full&lt;br /&gt;
  |#default=&amp;lt;!--null--&amp;gt;&lt;br /&gt;
  }}protected&lt;br /&gt;
}}{{#ifeq:{{lc:{{{type}}}}}|indef||{{#if:{{{expiry|}}}|&amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;until {{#time:F j, Y|{{{expiry}}}}}}}}}{{#if:{{{icon-reason|}}}|&amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;{{{icon-reason}}}}}.}}}|alt=Page {{#switch:{{lc:{{{type}}}}}&lt;br /&gt;
 |pc1=protected with pending changes level 1&lt;br /&gt;
 |pc2=protected with pending changes level 2&lt;br /&gt;
 |semi=semi-protected&lt;br /&gt;
 |move=move-protected&lt;br /&gt;
 |indef=permanently protected&lt;br /&gt;
 |create=creation-protected&lt;br /&gt;
 |office=protected&amp;lt;!--should this have a special tag?--&amp;gt;&lt;br /&gt;
 |full&lt;br /&gt;
 |#default=protected&lt;br /&gt;
}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
|&amp;lt;!-- else, not small --&amp;gt;&lt;br /&gt;
{{mbox &lt;br /&gt;
| name = {{{name|Pp-meta}}}&lt;br /&gt;
| subst = {{{subst|}}}&lt;br /&gt;
| demospace = {{{demospace|}}}&lt;br /&gt;
| type = protection&lt;br /&gt;
| image = [[Image:{{{image|{{#switch:{{lc:{{{type}}}}}&lt;br /&gt;
 |full=Padlock.svg&lt;br /&gt;
 |semi=Padlock-silver.svg&lt;br /&gt;
 |pc1=Padlock-silver-light.svg&lt;br /&gt;
 |pc2=Padlock-orange.svg&lt;br /&gt;
 |move=Padlock-olive.svg&lt;br /&gt;
 |indef=Padlock-red.svg&lt;br /&gt;
 |office=Padlock-black.svg&lt;br /&gt;
 |create=Padlock-skyblue.svg&lt;br /&gt;
 |#default=Transparent.gif&lt;br /&gt;
}}}}}|40px|{{{icon-text|This page is {{#switch:{{lc:{{{type}}}}}&lt;br /&gt;
 |pc1=protected with pending changes level 1&lt;br /&gt;
 |pc2=protected with pending changes level 2&lt;br /&gt;
 |semi=semi-protected&lt;br /&gt;
 |move=move-protected&lt;br /&gt;
 |indef=permanently protected&lt;br /&gt;
 |create=creation-protected&lt;br /&gt;
 |office=protected&amp;lt;!--should this have a special tag?--&amp;gt;&lt;br /&gt;
 |full&lt;br /&gt;
 |#default=protected&lt;br /&gt;
}}.}}}]]&lt;br /&gt;
| text = '''{{{reason-text|{{#switch:{{lc:{{{type}}}}}&lt;br /&gt;
 |full=This page is currently [[Wikipedia:This page is protected|protected]] from editing&lt;br /&gt;
 |semi=Editing of this {{pp-meta/pagetype}} by [[Wikipedia:User access levels#Autoconfirmed_users|new]] or [[Wikipedia:User access levels#Anonymous_users|unregistered]] users is currently [[Wikipedia:Protection policy|disabled]]&lt;br /&gt;
 |pc1=All edits made to this {{pp-meta/pagetype}} by [[Wikipedia:User access levels#Autoconfirmed_users|new]] or [[Wikipedia:User access levels#Anonymous_users|unregistered]] users are currently [[Wikipedia:Pending changes|subject to review]]&lt;br /&gt;
 |pc2=All edits made to this {{pp-meta/pagetype}} by users who are not [[Wikipedia:Reviewing|reviewers]] or [[Wikipedia:Administrators|administrators]] are currently [[Wikipedia:Pending changes|subject to review]]&lt;br /&gt;
 |move=This {{pp-meta/pagetype}} is currently [[Wikipedia:This page is protected|protected]] from [[Help:Moving a page|page moves]]&lt;br /&gt;
 |indef=This page is [[Wikipedia:This page is protected|protected]] from editing ''indefinitely''&lt;br /&gt;
 |office=This {{pp-meta/pagetype}} is currently [[Wikipedia:This page is protected|protected]] from editing&lt;br /&gt;
 |create=[[Help:Starting a new page|Recreation]] of this {{pp-meta/pagetype}} [[Wikipedia:This page is protected|has been disabled]]&lt;br /&gt;
}}{{#ifeq:{{lc:{{{type}}}}}|indef||{{#if:{{{expiry|}}}|&amp;amp;#32;until {{#time:F j, Y|{{{expiry}}}}}}}}}{{{reason&amp;lt;includeonly&amp;gt;|&amp;lt;/includeonly&amp;gt;}}}.}}}'''&amp;lt;br /&amp;gt; {{{explanation-text|{{#ifeq:{{lc:{{{dispute}}}}}|yes|This protection is '''not''' an endorsement of the {{#ifeq:{{{type}}}|move|[{{fullurl:Special:Log|type=move&amp;amp;page={{FULLPAGENAMEE}}}} current title]|[{{fullurl:{{FULLPAGENAMEE}}|action=history}} current version]}}.}} See the [[Wikipedia:Protection policy|protection policy]] and [{{fullurl:Special:Log|type={{#switch:{{lc:{{{type}}}}} | pc1 | pc2 = stable | #default = protect }}&amp;amp;page={{FULLPAGENAMEE}}}} {{#switch:{{lc:{{{type}}}}} | pc1 | pc2 = pending changes | #default = protection }} log] for more details. {{#switch:{{lc:{{{type}}}}}&lt;br /&gt;
 |full|indef=Please discuss any changes on the [[{{TALKPAGENAME}}#{{#if:{{{section|}}}|{{{section}}}|top}}|talk page]]; you may use the {{tlx|editprotected}} template to ask an [[Wikipedia:Administrator|administrator]] to make an edit if it is supported by [[Wikipedia:Consensus|consensus]]. {{#ifeq:{{NAMESPACE}}|{{ns:8}}&amp;lt;!--MediaWiki--&amp;gt;||You may also [[Wikipedia:Requests for page protection|request]] that this page be unprotected.}}&lt;br /&gt;
 |semi=If you cannot edit this {{pp-meta/pagetype}} and you wish to make a change, you can {{#ifeq:{{NAMESPACE}}|{{TALKSPACE}}||[[Template:Editsemiprotected|request an edit]], [[{{TALKPAGENAME}}|discuss changes on the talk page]],}} [[Wikipedia:Requests for page protection#Current requests for unprotection|request unprotection]], [[Special:Userlogin|log in]], or [[Special:UserLogin/signup|create an account]].&lt;br /&gt;
 |move=The page may still be edited but cannot be moved until unprotected. Please discuss any suggested moves on the [[{{TALKPAGENAME}}|talk page]] or at [[Wikipedia:Requested moves]].  You can also [[Wikipedia:Requests for page protection|request]] that the page be unprotected.  &lt;br /&gt;
 |office=If you can edit this page, please discuss all changes and additions on the [[{{TALKPAGENAME}}|talk page]] first. '''Do not remove protection from this page unless you are authorized by the Wikimedia Foundation to do so.'''&lt;br /&gt;
 |create=Please see the {{#if:{{{xfd|}}}|'''[[{{{xfd}}}|deletion discussion]]''' or the}} [{{fullurl:Special:Log|type=delete&amp;amp;page={{FULLPAGENAMEE}}}} deletion log] for details of why this page was deleted. If you would like to create a page at this title, you must first [[Wikipedia:Requests for page protection|request]] for it to be unprotected, or contact the administrator who deleted the page for the deleted material to be restored. If unsuccessful, you can use [[Wikipedia:Deletion review|deletion review]].&lt;br /&gt;
}}}}}&lt;br /&gt;
}}&lt;br /&gt;
}}|&amp;lt;includeonly&amp;gt;[[Category:Wikipedia pages with incorrect protection templates]]&amp;lt;/includeonly&amp;gt;}}&amp;lt;!--End if small--&amp;gt;&amp;lt;includeonly&amp;gt;{{#ifeq:{{lc:{{{categories|no}}}}}|no||{{{categories|}}}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Namespace_detect&amp;diff=184</id>
		<title>Predefinição:Namespace detect</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Namespace_detect&amp;diff=184"/>
		<updated>2013-08-01T18:24:54Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:Namespace detect|main}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Navbar&amp;diff=186</id>
		<title>Predefinição:Navbar</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Navbar&amp;diff=186"/>
		<updated>2013-08-01T18:24:54Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;div class=&amp;quot;noprint plainlinks hlist navbar {{#if:{{{mini|}}}|mini}}&amp;quot; style=&amp;quot;{{{style|}}}&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#if:{{{mini|}}}{{{plain|}}}|&amp;lt;!--nothing--&amp;gt;|&amp;lt;!--else:&lt;br /&gt;
--&amp;gt;&amp;lt;span style=&amp;quot;word-spacing:0;{{{fontstyle|}}}&amp;quot;&amp;gt;{{{text|This box:}}} &amp;lt;/span&amp;gt;}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#if:{{{brackets|}}}|&amp;lt;span style=&amp;quot;margin-right:-0.125em;{{{fontstyle|}}}&amp;quot;&amp;gt;&amp;amp;#91;&amp;lt;/span&amp;gt;}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;li class=&amp;quot;nv-view&amp;quot;&amp;gt;[[{{transclude|{{{1}}}}}|&amp;lt;span title=&amp;quot;View this template&amp;quot; &amp;lt;!--&lt;br /&gt;
--&amp;gt;style=&amp;quot;{{{fontstyle|}}}&amp;quot;&amp;gt;{{#if:{{{mini|}}}|v|view}}&amp;lt;/span&amp;gt;]]&amp;lt;/li&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;li class=&amp;quot;nv-talk&amp;quot;&amp;gt;[[{{TALKPAGENAME:{{transclude|{{{1}}}}}}}|&amp;lt;span title=&amp;quot;Discuss this template&amp;quot; &amp;lt;!--&lt;br /&gt;
--&amp;gt;style=&amp;quot;{{{fontstyle|}}}&amp;quot;&amp;gt;{{#if:{{{mini|}}}|t|talk}}&amp;lt;/span&amp;gt;]]&amp;lt;/li&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#if:{{{noedit|}}}|&amp;lt;!--nothing--&amp;gt;|&amp;lt;!--else:&lt;br /&gt;
--&amp;gt;&amp;lt;li class=&amp;quot;nv-edit&amp;quot;&amp;gt;[{{fullurl:{{transclude|{{{1}}}}}|action=edit}} &amp;lt;span title=&amp;quot;Edit this template&amp;quot; &amp;lt;!--&lt;br /&gt;
--&amp;gt;style=&amp;quot;{{{fontstyle|}}}&amp;quot;&amp;gt;{{#if:{{{mini|}}}|e|edit}}&amp;lt;/span&amp;gt;]&amp;lt;/li&amp;gt;}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;{{#if:{{{brackets|}}}|&amp;lt;span style=&amp;quot;margin-left:-0.125em;{{{fontstyle|}}}&amp;quot;&amp;gt;&amp;amp;#93;&amp;lt;/span&amp;gt;}}&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Navbox&amp;diff=188</id>
		<title>Predefinição:Navbox</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Navbox&amp;diff=188"/>
		<updated>2013-08-01T18:24:54Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke: Navbox | navbox }}&amp;lt;noinclude&amp;gt;{{documentation}}&amp;lt;!-- Add categories and interwikis to the /doc sub-page --&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Ombox&amp;diff=190</id>
		<title>Predefinição:Ombox</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Ombox&amp;diff=190"/>
		<updated>2013-08-01T18:24:54Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#ifeq:{{{small|}}}|yes&lt;br /&gt;
| {{ombox/core&lt;br /&gt;
  | small = yes&lt;br /&gt;
  | type  = {{{type|}}}&lt;br /&gt;
  | image = {{#if:{{{smallimage|}}}| {{{smallimage}}} | {{{image|}}} }}&lt;br /&gt;
  | imageright = {{#if:{{{smallimageright|}}} | {{{smallimageright}}} | {{{imageright|}}} }}&lt;br /&gt;
  | class = {{{class|}}}&lt;br /&gt;
  | style = {{{style|}}}&lt;br /&gt;
  | textstyle = {{{textstyle|}}}&lt;br /&gt;
  | text  = {{#if:{{{smalltext|}}}| {{{smalltext}}} | {{{text}}} }}&lt;br /&gt;
  }}&lt;br /&gt;
| {{ombox/core&lt;br /&gt;
  | type  = {{{type|}}}&lt;br /&gt;
  | image = {{{image|}}}&lt;br /&gt;
  | imageright = {{{imageright|}}} &lt;br /&gt;
  | class = {{{class|}}}&lt;br /&gt;
  | style = {{{style|}}}&lt;br /&gt;
  | textstyle = {{{textstyle|}}}&lt;br /&gt;
  | text  = {{{text}}}&lt;br /&gt;
  }}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;{{documentation}}&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Mbox_templates_see_also&amp;diff=178</id>
		<title>Predefinição:Mbox templates see also</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Mbox_templates_see_also&amp;diff=178"/>
		<updated>2013-08-01T18:24:53Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are several meta-templates in the mbox family:&lt;br /&gt;
* {{tl|ambox}} – For article message boxes.&lt;br /&gt;
* {{tl|cmbox}} – For category message boxes.&lt;br /&gt;
* {{tl|imbox}} – For file (image) page message boxes.&lt;br /&gt;
* {{tl|mbox}} – Has namespace detection, for message boxes that are used on several types of pages and thus need to change style depending on what page they are used on.&lt;br /&gt;
* {{tl|ombox}} – For other pages message boxes.&lt;br /&gt;
* {{tl|tmbox}} – For talk page message boxes.&lt;br /&gt;
&lt;br /&gt;
Closely related meta-templates:&lt;br /&gt;
* {{tl|asbox}} – For article stub message boxes.&lt;br /&gt;
* {{tl|dmbox}} – For disambiguation and set index message boxes.&lt;br /&gt;
* {{tl|fmbox}} – For header and footer message boxes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Multiple_issues&amp;diff=180</id>
		<title>Predefinição:Multiple issues</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Multiple_issues&amp;diff=180"/>
		<updated>2013-08-01T18:24:53Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Ambox&lt;br /&gt;
|name  = Multiple issues&lt;br /&gt;
|doc   = no&lt;br /&gt;
|subst = &amp;lt;includeonly&amp;gt;{{subst:&amp;lt;/includeonly&amp;gt;&amp;lt;includeonly&amp;gt;substcheck}}&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
|class = ambox-multiple_issues compact-ambox&lt;br /&gt;
|type  = content&lt;br /&gt;
|text  = '''This {{#if:{{{section|}}}&lt;br /&gt;
 |section&lt;br /&gt;
 |article&lt;br /&gt;
}} has multiple issues'''. Please help '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} improve it]''' or discuss these issues on the '''[[{{TALKPAGENAME}}|talk page]]'''.{{{1|}}}{{#if:{{{BLP unsourced|{{{BLPunsourced|}}}}}}|&lt;br /&gt;
 |{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
  | name       = {{{unreferenced|{{{unref|}}}}}}&lt;br /&gt;
  | template   = Unreferenced&lt;br /&gt;
 }}&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{BLP unsourced|{{{BLPunsourced|}}}}}}&lt;br /&gt;
| template   = BLP unsourced&lt;br /&gt;
}}{{#if:{{{BLP sources|{{{BLPsources|}}}}}}|&lt;br /&gt;
 |{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
  | name       = {{{refimprove|}}}&lt;br /&gt;
  | template   = Refimprove&lt;br /&gt;
 }}&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{BLP sources|{{{BLPsources|}}}}}}&lt;br /&gt;
| template   = BLP sources&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{BLP IMDb-only refimprove|{{{BLP IMDB-only refimprove|}}}}}}&lt;br /&gt;
| template   = BLP IMDb-only refimprove&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{BLP IMDb refimprove|{{{BLP IMDB refimprove|}}}}}}&lt;br /&gt;
| template   = BLP IMDb refimprove&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{citation style|{{{citationstyle|{{{citation-style|}}}}}}}}}&lt;br /&gt;
| template   = Citation style&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{citecheck|{{{cite check|}}}}}}&lt;br /&gt;
| template   = Cite check&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{more footnotes|}}}&lt;br /&gt;
| template   = More footnotes&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{no footnotes|}}}&lt;br /&gt;
| template   = No footnotes&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{one source|{{{onesource|}}}}}}&lt;br /&gt;
| template   = One source&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{primary sources|{{{primarysources|}}}}}}&lt;br /&gt;
| template   = Primary sources&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{unreliable sources|{{{unreliable|}}}}}}&lt;br /&gt;
| template   = Unreliable sources&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{abbreviations|}}}&lt;br /&gt;
| template   = Abbreviations&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{advert|}}}&lt;br /&gt;
| template   = Advert&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{autobiography|}}}&lt;br /&gt;
| template   = Autobiography&lt;br /&gt;
}}{{#if:{{{cleanup|}}}&lt;br /&gt;
 |{{Cleanup&lt;br /&gt;
  |1={{#if:{{{section|}}}|section}}&lt;br /&gt;
  |reason={{{reason|}}}&lt;br /&gt;
  |date={{Check date|{{{cleanup|}}}}}&lt;br /&gt;
  |demospace={{{demospace|}}}&lt;br /&gt;
  |nocat={{{nocat|}}}&lt;br /&gt;
 }}&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{cleanup-laundry|{{{laundrylists|{{{laundry|}}}}}}}}}&lt;br /&gt;
| template   = Cleanup-laundry&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{cleanup-link rot|{{{linkrot|}}}}}}&lt;br /&gt;
| template   = Cleanup-link rot&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{cleanup-reorganize|{{{restructure|{{{reorganisation|{{{organize|}}}}}}}}}}}} &lt;br /&gt;
| template   = Cleanup-reorganize&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{cleanup-rewrite|{{{rewrite|}}}}}}&lt;br /&gt;
| template   = Cleanup-rewrite&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{cleanup-spam|{{{spam|}}}}}}&lt;br /&gt;
| template   = Cleanup-spam&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{COI|{{{coi|}}}}}}&lt;br /&gt;
| template   = COI&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{colloquial|}}}&lt;br /&gt;
| template   = Colloquial&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{confusing|}}}&lt;br /&gt;
| template   = Confusing&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{context|}}}&lt;br /&gt;
| template   = Context&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{contradict|}}}&lt;br /&gt;
| template   = Contradict&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{copy edit|{{{copyedit|}}}}}}&lt;br /&gt;
| template   = Copy edit&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{criticism section|{{{criticisms|}}}}}}&lt;br /&gt;
| template   = Criticism section&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{crystal|}}}&lt;br /&gt;
| template   = Crystal&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{dead end|{{{deadend|}}}}}}&lt;br /&gt;
| template   = Dead end&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{disputed|}}}&lt;br /&gt;
| template   = Disputed&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{essay-like|{{{essay|}}}}}}&lt;br /&gt;
| template   = Essay-like&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{example farm|{{{examplefarm|}}}}}}&lt;br /&gt;
| template   = Example farm&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{external links|}}}&lt;br /&gt;
| template   = External links&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{fanpov|{{{fansite|}}}}}}&lt;br /&gt;
| template   = Fanpov&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{fiction|}}}&lt;br /&gt;
| template   = Fiction&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{game guide|{{{gameguide|}}}}}}&lt;br /&gt;
| template   = Game guide&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{globalize|}}}&lt;br /&gt;
| template   = Globalize&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{histinfo|}}}&lt;br /&gt;
| template   = Historical information needed&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{hoax|}}}&lt;br /&gt;
| template   = Hoax&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{howto|}}}&lt;br /&gt;
| template   = Howto&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{inappropriate person|}}}&lt;br /&gt;
| template   = Inappropriate person&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{incomplete|}}}&lt;br /&gt;
| template   = Incomplete&lt;br /&gt;
| demospace  = {{{demospace|}}}&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{in-universe|}}}&lt;br /&gt;
| template   = In-universe&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{lead missing|{{{intromissing|}}}}}}&lt;br /&gt;
| template   = Lead missing&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{lead rewrite|{{{introrewrite|}}}}}}&lt;br /&gt;
| template   = Lead rewrite&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{lead too long|{{{intro length|{{{intro-toolong|}}}}}}}}}&lt;br /&gt;
| template   = Lead too long&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{lead too short|{{{intro-tooshort|}}}}}}&lt;br /&gt;
| template   = Lead too short&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{like resume|{{{likeresume|}}}}}}&lt;br /&gt;
| template   = Like resume&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{news release|{{{newsrelease|}}}}}}&lt;br /&gt;
| template   = News release&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{notability|{{{notable|}}}}}}&lt;br /&gt;
| template   = Notability&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{original research|}}}&lt;br /&gt;
| template   = Original research&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{orphan|}}}&lt;br /&gt;
| template   = Orphan&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{update|{{{out of date|}}}}}}&lt;br /&gt;
| template   = Update&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{overly detailed|{{{fancruft|}}}}}}&lt;br /&gt;
| template   = Overly detailed&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{peacock|}}}&lt;br /&gt;
| template   = Peacock&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{plot|}}}&lt;br /&gt;
| template   = Plot&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{POV|{{{NPOV|{{{pov|{{{npov|}}}}}}}}}}}}&lt;br /&gt;
| template   = POV&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{POV-check|{{{pov-check|}}}}}}&lt;br /&gt;
| template   = POV-check&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{prose|}}}&lt;br /&gt;
| template   = Prose&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{over-quotation|{{{quote farm|}}}}}}&lt;br /&gt;
| template   = Over-quotation&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{recentism|}}}&lt;br /&gt;
| template   = Recentism&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{review|}}}&lt;br /&gt;
| template   = Review&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{sections|}}}&lt;br /&gt;
| template   = Sections&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{self-published|}}}&lt;br /&gt;
| template   = Self-published&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{story|}}}&lt;br /&gt;
| template   = Story&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{synthesis|}}}&lt;br /&gt;
| template   = Synthesis&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{technical|{{{jargon|}}}}}}&lt;br /&gt;
| template   = Technical&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{tone|{{{inappropriate tone|}}}}}}&lt;br /&gt;
| template   = Tone&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{travel guide|{{{travelguide|}}}}}}&lt;br /&gt;
| template   = Travel guide&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{trivia|}}}&lt;br /&gt;
| template   = Trivia&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{unbalanced|}}}&lt;br /&gt;
| template   = Unbalanced&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{very long|{{{long|{{{verylong|}}}}}}}}}&lt;br /&gt;
| template   = Very long&lt;br /&gt;
}}{{Multiple issues/message|{{{section|}}}&lt;br /&gt;
| name       = {{{weasel|}}}&lt;br /&gt;
| template   = Weasel&lt;br /&gt;
}}&lt;br /&gt;
{{#ifeq:{{{2|a}}}|{{{2|b}}}|[[Category:Pages using multiple issues with incorrect parameters]]}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Multiple_issues/message&amp;diff=182</id>
		<title>Predefinição:Multiple issues/message</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Multiple_issues/message&amp;diff=182"/>
		<updated>2013-08-01T18:24:53Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#if:{{{name|}}}&lt;br /&gt;
 |{{ {{{template}}}&lt;br /&gt;
  |1={{#if:{{{1|}}}|section|article}}&lt;br /&gt;
  |date={{Check date|{{{name}}}}}&lt;br /&gt;
  |demospace={{{demospace|}}}&lt;br /&gt;
 }}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Fmbox&amp;diff=168</id>
		<title>Predefinição:Fmbox</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Fmbox&amp;diff=168"/>
		<updated>2013-08-01T18:24:52Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;table {{#if:{{{id|}}}|id=&amp;quot;{{{id|}}}&amp;quot;}} class=&amp;quot;plainlinks fmbox&lt;br /&gt;
{{#switch:{{{type|}}}&lt;br /&gt;
| warning    = fmbox-warning&lt;br /&gt;
| editnotice = fmbox-editnotice&lt;br /&gt;
| system          &amp;lt;!-- system = default --&amp;gt;&lt;br /&gt;
| #default   = fmbox-system&lt;br /&gt;
}} {{{class|}}}&amp;quot; style=&amp;quot;{{{style|}}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
{{#ifeq:{{{image|}}}|none&lt;br /&gt;
| &amp;lt;!-- No image. --&amp;gt;&lt;br /&gt;
| &amp;lt;td class=&amp;quot;mbox-image&amp;quot;&amp;gt;&lt;br /&gt;
  {{#if:{{{image|}}}&lt;br /&gt;
  | {{{image}}}&lt;br /&gt;
  | [[File:{{#switch:{{{type|}}}&lt;br /&gt;
    | warning    = Cmbox deletion.png&lt;br /&gt;
    | editnotice = Imbox notice.png&lt;br /&gt;
    | system          &amp;lt;!-- system = default --&amp;gt;&lt;br /&gt;
    | #default   = Imbox notice.png&lt;br /&gt;
    }}|40x40px|link=|alt=]]&lt;br /&gt;
  }}&amp;lt;/td&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;td class=&amp;quot;mbox-text&amp;quot; style=&amp;quot;{{{textstyle|}}}&amp;quot;&amp;gt; {{{text}}} &amp;lt;/td&amp;gt;&lt;br /&gt;
{{#if:{{{imageright|}}}&lt;br /&gt;
| &amp;lt;td class=&amp;quot;mbox-imageright&amp;quot;&amp;gt; {{{imageright}}} &amp;lt;/td&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;lt;!--&lt;br /&gt;
  Detect and report usage with faulty &amp;quot;type&amp;quot; parameter:&lt;br /&gt;
--&amp;gt;{{#switch:{{{type|}}}&lt;br /&gt;
|   &amp;lt;!-- No type fed, is also valid input --&amp;gt;&lt;br /&gt;
| warning&lt;br /&gt;
| editnotice&lt;br /&gt;
| system     =    &amp;lt;!-- Do nothing, valid &amp;quot;type&amp;quot; --&amp;gt;&lt;br /&gt;
| #default   = &amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;This message box is using an invalid &amp;quot;type={{{type|}}}&amp;quot; parameter and needs fixing.&amp;lt;/div&amp;gt;[[Category:Wikipedia message box parameter needs fixing|{{main other|Main:}}{{FULLPAGENAME}}]]&amp;lt;!-- Sort on namespace --&amp;gt;&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:High-risk&amp;diff=170</id>
		<title>Predefinição:High-risk</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:High-risk&amp;diff=170"/>
		<updated>2013-08-01T18:24:52Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ombox&lt;br /&gt;
| type = content&lt;br /&gt;
| text = &lt;br /&gt;
'''This {{&lt;br /&gt;
#switch:{{NAMESPACE}}&lt;br /&gt;
|Module=Lua module&lt;br /&gt;
|#default=template&lt;br /&gt;
}} is used on [[Wikipedia:Database reports/Templates transcluded on the most pages|{{#if:{{{1|}}}|{{{1}}}|a very large number of}} pages]].'''&amp;lt;br /&amp;gt;To avoid large-scale disruption and unnecessary server load, any changes to this {{&lt;br /&gt;
#switch:{{NAMESPACE}}&lt;br /&gt;
|Module=module&lt;br /&gt;
|#default=template&lt;br /&gt;
}} should first be tested in its [[{{#ifeq:{{SUBPAGENAME}}|doc| {{SUBJECTSPACE}}:{{BASEPAGENAME}} | {{SUBJECTPAGENAME}} }}/sandbox|/sandbox]] or [[{{#ifeq:{{SUBPAGENAME}}|doc| {{SUBJECTSPACE}}:{{BASEPAGENAME}} | {{SUBJECTPAGENAME}} }}/testcases|/testcases]] subpages{{&lt;br /&gt;
#switch:{{NAMESPACE}}&lt;br /&gt;
|Module=.&lt;br /&gt;
|#default=, or in your own [[Wikipedia:Subpages#How to create user subpages|user space]].&lt;br /&gt;
}} The tested changes can then be added to this page in one single edit. Please consider discussing any changes on {{#if:{{{2|}}}|[[{{{2}}}]]|the [[{{#ifeq:{{SUBPAGENAME}}|doc| {{TALKSPACE}}:{{BASEPAGENAME}} | {{TALKPAGENAME}} }}|talk page]]}} before implementing them.&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:If_pagename&amp;diff=172</id>
		<title>Predefinição:If pagename</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:If_pagename&amp;diff=172"/>
		<updated>2013-08-01T18:24:52Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#if:x   &amp;lt;!--Remove surrounding whitespace--&amp;gt;&lt;br /&gt;
| &amp;lt;!--Check for match with full pagename--&amp;gt;&lt;br /&gt;
  {{{ {{#if:{{{page|}}}| {{{page|}}} | {{FULLPAGENAME}} }}   &amp;lt;!--Has data, or is empty but defined--&amp;gt;&lt;br /&gt;
  | &amp;lt;!--Check for match with &amp;quot;User:Somepage/+&amp;quot;--&amp;gt;&lt;br /&gt;
    {{{ {{#titleparts:{{#if:{{{page|}}}| {{{page|}}} | {{FULLPAGENAME}} }}|1|1}}/+&lt;br /&gt;
    | &amp;lt;!--Else, are we on a subpage or a basepage?--&amp;gt;&lt;br /&gt;
      {{#if:{{#titleparts:{{#if:{{{page|}}}| {{{page|}}} | {{FULLPAGENAME}} }}|0|2}}&lt;br /&gt;
      | &amp;lt;!--We are on a subpage, check for match with &amp;quot;User:Somepage/*&amp;quot;--&amp;gt;&lt;br /&gt;
        {{{ {{#titleparts:{{#if:{{{page|}}}| {{{page|}}} | {{FULLPAGENAME}} }}|1|1}}/*&lt;br /&gt;
        | &amp;lt;!--Check for match with &amp;quot;Somepage/*&amp;quot;--&amp;gt;&lt;br /&gt;
          {{{ {{#titleparts:{{#if:{{{page|}}}| {{PAGENAME:{{{page|}}}}} | {{PAGENAME}} }}|1|1}}/*&lt;br /&gt;
          | &amp;lt;!--Check for match with &amp;quot;/something&amp;quot;--&amp;gt;&lt;br /&gt;
            {{{ /{{#titleparts:{{#if:{{{page|}}}| {{{page|}}} | {{FULLPAGENAME}} }}|0|-1}}&lt;br /&gt;
            | &amp;lt;!--Check for match with &amp;quot;/somethin*&amp;quot;--&amp;gt;&lt;br /&gt;
              {{{ /{{lc: {{padleft:|8| {{#titleparts:{{#if:{{{page|}}}| {{{page|}}} | {{FULLPAGENAME}} }}|0|-1}}# }} }}*&lt;br /&gt;
              | &amp;lt;!--Check for match with &amp;quot;/someth*&amp;quot;--&amp;gt;&lt;br /&gt;
                {{{ /{{lc: {{padleft:|6| {{#titleparts:{{#if:{{{page|}}}| {{{page|}}} | {{FULLPAGENAME}} }}|0|-1}}# }} }}*&lt;br /&gt;
                | &amp;lt;!--Check for match with &amp;quot;/some*&amp;quot;--&amp;gt;&lt;br /&gt;
                  {{{ /{{lc: {{padleft:|4| {{#titleparts:{{#if:{{{page|}}}| {{{page|}}} | {{FULLPAGENAME}} }}|0|-1}}# }} }}*   &amp;lt;!--Pad with # so &amp;quot;/a&amp;quot; doesn't match &amp;quot;/aaaa*&amp;quot;--&amp;gt;&lt;br /&gt;
                  | {{{subpage| {{{other|}}} }}}   &amp;lt;!--Respecting empty parameter on purpose--&amp;gt;&lt;br /&gt;
                  }}}&lt;br /&gt;
                }}}&lt;br /&gt;
              }}}&lt;br /&gt;
            }}}&lt;br /&gt;
          }}}&lt;br /&gt;
        }}}&lt;br /&gt;
      | &amp;lt;!--We are on a basepage, check for match with &amp;quot;Somepage&amp;quot;--&amp;gt;&lt;br /&gt;
        {{{ {{#if:{{{page|}}}| {{PAGENAME:{{{page|}}}}} | {{PAGENAME}} }}&lt;br /&gt;
        | {{{basepage| {{{other|}}} }}}   &amp;lt;!--Respecting empty parameter on purpose--&amp;gt;&lt;br /&gt;
        }}}&lt;br /&gt;
      }}   &amp;lt;!--End if, are we on a subpage or a basepage?--&amp;gt;&lt;br /&gt;
    }}}&lt;br /&gt;
  }}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Mbox_template_family&amp;diff=174</id>
		<title>Predefinição:Mbox template family</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Mbox_template_family&amp;diff=174"/>
		<updated>2013-08-01T18:24:52Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Navbox&lt;br /&gt;
|name = mbox template family&lt;br /&gt;
|bodyclass = hlist&lt;br /&gt;
|title = [[Template:mbox|mbox]] template family&lt;br /&gt;
&lt;br /&gt;
|group1 = Foundation&lt;br /&gt;
|list1 =&lt;br /&gt;
* [[Template:mbox|mbox]]&lt;br /&gt;
&lt;br /&gt;
|group2 = [[Template:mbox#See also|Message types]] built using mbox&lt;br /&gt;
|list2 =&lt;br /&gt;
* [[Template:ambox|Article]]&lt;br /&gt;
** [[Template:asbox|stub]]&lt;br /&gt;
* [[Template:cmbox|Category]]&lt;br /&gt;
* [[Template:dmbox|Disambiguation]]&lt;br /&gt;
* [[Template:fmbox|Footer or header]]&lt;br /&gt;
* [[Template:imbox|Image]]&lt;br /&gt;
* [[Template:ombox|Other]]&lt;br /&gt;
* [[Template:tmbox|Talkpage]]&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Wikipedia metatemplates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Mbox_templates&amp;diff=176</id>
		<title>Predefinição:Mbox templates</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Mbox_templates&amp;diff=176"/>
		<updated>2013-08-01T18:24:52Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{sidebar&lt;br /&gt;
| name         = mbox templates&lt;br /&gt;
| title        = Message box&amp;lt;br /&amp;gt;meta-templates&lt;br /&gt;
| titlestyle   = font-size: inherit&lt;br /&gt;
| contentstyle = text-align: left&lt;br /&gt;
| contentclass = plainlist&lt;br /&gt;
| style        = width: auto&lt;br /&gt;
| content1     =&lt;br /&gt;
*{{tlx|ambox}}&lt;br /&gt;
*{{tlx|cmbox}}&lt;br /&gt;
*{{tlx|imbox}}&lt;br /&gt;
*{{tlx|mbox}}&lt;br /&gt;
*{{tlx|ombox}}&lt;br /&gt;
*{{tlx|tmbox}}&lt;br /&gt;
*{{tlx|asbox}}&lt;br /&gt;
*{{tlx|dmbox}}&lt;br /&gt;
*{{tlx|fmbox}}&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;{{documentation}}&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Documentation/end_box&amp;diff=156</id>
		<title>Predefinição:Documentation/end box</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Documentation/end_box&amp;diff=156"/>
		<updated>2013-08-01T18:24:51Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&amp;lt;div&amp;gt;&amp;lt;/noinclude&amp;gt;&amp;lt;div style=&amp;quot;clear: both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!--So right or left floating items don't stick out of the doc box.--&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;!--End of green doc box--&amp;gt;&amp;lt;!--&lt;br /&gt;
  Link box below for the doc meta-data:&lt;br /&gt;
--&amp;gt;{{#if: &lt;br /&gt;
  &amp;lt;!--Check if we should show the link box--&amp;gt;&lt;br /&gt;
  {{#ifeq: {{{link box|}}} | off&lt;br /&gt;
  |&lt;br /&gt;
  | {{{doc exist|yes}}}{{&lt;br /&gt;
    #switch: {{SUBJECTSPACE}}&lt;br /&gt;
    | {{ns:User}}&lt;br /&gt;
    | {{ns:Template}} = yes&lt;br /&gt;
    }}&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
| {{fmbox&lt;br /&gt;
  | id = documentation-meta-data&lt;br /&gt;
  | image = none&lt;br /&gt;
  | style = background-color: #ecfcf4;&lt;br /&gt;
  | textstyle = font-style: italic;&lt;br /&gt;
  | text = &lt;br /&gt;
    {{#if: {{{link box|}}}&lt;br /&gt;
    | {{{link box}}}   &amp;lt;!--Use custom link box content--&amp;gt;&lt;br /&gt;
    | {{#if: {{{doc exist|yes}}}&lt;br /&gt;
      | &amp;lt;!--/doc exists, link to it--&amp;gt;&lt;br /&gt;
        The above [[Wikipedia:Template documentation|documentation]] is [[Wikipedia:Transclusion|transcluded]] from [[{{{docpage|{{FULLPAGENAME}}/doc}}}]]. &amp;lt;small style=&amp;quot;font-style: normal&amp;quot;&amp;gt;([{{fullurl:{{{docpage|{{FULLPAGENAME}}/doc}}}|action=edit}} edit] &amp;amp;#124; [{{fullurl:{{{docpage|{{FULLPAGENAME}}/doc}}}|action=history}} history])&amp;lt;/small&amp;gt; &amp;lt;br /&amp;gt;&lt;br /&gt;
      }}&amp;lt;!-- &lt;br /&gt;
        Add links to /sandbox and /testcases when appropriate:&lt;br /&gt;
   --&amp;gt;{{#switch: {{SUBJECTSPACE}}&lt;br /&gt;
      | {{ns:User}}&lt;br /&gt;
      | {{ns:Template}} = &lt;br /&gt;
        Editors can experiment in this template's {{&lt;br /&gt;
        #ifexist: {{{sandbox| {{FULLPAGENAME}}/sandbox }}}&lt;br /&gt;
        | [[{{{sandbox| {{FULLPAGENAME}}/sandbox }}}|sandbox]] &amp;lt;small style=&amp;quot;font-style: normal&amp;quot;&amp;gt;([{{fullurl: {{{sandbox| {{FULLPAGENAME}}/sandbox }}} | action=edit }} edit] &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; [{{fullurl:Special:ComparePages | page1={{urlencode:{{{template page|{{FULLPAGENAME}}}}}}}&amp;amp;page2={{urlencode:{{{sandbox|{{FULLPAGENAME}}/sandbox}}}}}}} diff])&amp;lt;/small&amp;gt; &lt;br /&gt;
        | sandbox &amp;lt;small style=&amp;quot;font-style: normal&amp;quot;&amp;gt;([{{fullurl: {{{sandbox| {{FULLPAGENAME}}/sandbox }}} | action=edit&amp;amp;preload=Template:Documentation/preload-sandbox }} create] &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; [{{fullurl: {{{sandbox| {{FULLPAGENAME}}/sandbox }}} | action=edit&amp;amp;preload={{urlencode:{{{template page|{{FULLPAGENAME}}}}}}}&amp;amp;summary={{urlencode:Create sandbox version of [[{{{template page|{{FULLPAGENAME}}}}}]]}} }} mirror])&amp;lt;/small&amp;gt; &lt;br /&gt;
        }} and {{&lt;br /&gt;
        #ifexist: {{{testcases| {{FULLPAGENAME}}/testcases }}}&lt;br /&gt;
        | [[{{{testcases| {{FULLPAGENAME}}/testcases }}}|testcases]] &amp;lt;small style=&amp;quot;font-style: normal&amp;quot;&amp;gt;([{{fullurl: {{{testcases| {{FULLPAGENAME}}/testcases }}} | action=edit }} edit])&amp;lt;/small&amp;gt;&lt;br /&gt;
        | testcases &amp;lt;small style=&amp;quot;font-style: normal&amp;quot;&amp;gt;([{{fullurl: {{{testcases| {{FULLPAGENAME}}/testcases }}} | action=edit&amp;amp;preload=Template:Documentation/preload-testcases }} create])&amp;lt;/small&amp;gt;&lt;br /&gt;
        }} pages. &amp;lt;br /&amp;gt;&lt;br /&gt;
      }}&amp;lt;!--&lt;br /&gt;
        Show the cats text, but not &lt;br /&gt;
        if &amp;quot;content&amp;quot; fed or &amp;quot;docname fed&amp;quot; since then it is &lt;br /&gt;
        unclear where to add the cats.&lt;br /&gt;
   --&amp;gt;{{#if: {{{content|}}} {{{docname fed|}}}&lt;br /&gt;
      | &lt;br /&gt;
      | Please add categories to the [[{{{docpage|{{FULLPAGENAME}}/doc}}}|/doc]] subpage.&lt;br /&gt;
      }}&amp;lt;!--&lt;br /&gt;
        Show the &amp;quot;Subpages&amp;quot; link:&lt;br /&gt;
   --&amp;gt;{{#switch: {{SUBJECTSPACE}}&lt;br /&gt;
      | {{ns:File}} =   &amp;lt;!--Don't show it--&amp;gt;&lt;br /&gt;
      | {{ns:Template}} = &amp;amp;#32;[[Special:PrefixIndex/{{{template page|{{FULLPAGENAME}}}}}/|Subpages of this template]].&lt;br /&gt;
      | #default = &amp;amp;#32;[[Special:PrefixIndex/{{{template page|{{FULLPAGENAME}}}}}/|Subpages of this page]].&lt;br /&gt;
      }}&lt;br /&gt;
    }}{{#ifexist:{{FULLPAGENAME}}/Print&lt;br /&gt;
     |&amp;lt;br /&amp;gt;A [[Help:Books/for experts#Improving the book layout|print version]] of this template exists at [[/Print]]. If you make a change to this template, please update the print version as well.[[Category:Templates with print versions]]&lt;br /&gt;
    }}&lt;br /&gt;
  }}&lt;br /&gt;
}}&amp;lt;!--End link box--&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
  Detect and report strange usage:&lt;br /&gt;
--&amp;gt;{{#if:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!--Check if {{documentation}} is transcluded &lt;br /&gt;
      on a /doc or /testcases page--&amp;gt;&lt;br /&gt;
  {{#switch: {{SUBPAGENAME}}&lt;br /&gt;
  | doc&lt;br /&gt;
  | testcases = strange&lt;br /&gt;
  }}&lt;br /&gt;
  &amp;lt;!--More checks can be added here, just return anything&lt;br /&gt;
      to make the surrounding if-case trigger--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| &amp;lt;includeonly&amp;gt;[[Category:Wikipedia pages with strange ((documentation)) usage|{{main other|Main:}}{{FULLPAGENAME}}]]&amp;lt;!-- Sort on namespace --&amp;gt;&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{pp-template|small=yes}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Documentation/end_box2&amp;diff=158</id>
		<title>Predefinição:Documentation/end box2</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Documentation/end_box2&amp;diff=158"/>
		<updated>2013-08-01T18:24:51Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{documentation/end box&lt;br /&gt;
| preload = {{{preload|}}}   &amp;lt;!--Allow custom preloads--&amp;gt;&lt;br /&gt;
| content = {{{content|}}}&lt;br /&gt;
| link box = {{{link box|}}}   &amp;lt;!--So &amp;quot;link box=off&amp;quot; works--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| docpage = &lt;br /&gt;
  {{#if: {{{1|}}}&lt;br /&gt;
  | {{{1|}}}&lt;br /&gt;
  | {{{docspace|{{NAMESPACE}}}}}:{{{template page|{{PAGENAME}}}}}/doc&lt;br /&gt;
  }}&lt;br /&gt;
| doc exist = &lt;br /&gt;
  {{#ifexist: &lt;br /&gt;
    {{#if: {{{1|}}}&lt;br /&gt;
    | {{{1|}}}   &amp;lt;!--Other docname fed--&amp;gt;&lt;br /&gt;
    | {{{docspace|{{NAMESPACE}}}}}:{{{template page|{{PAGENAME}}}}}/doc&lt;br /&gt;
    }}&lt;br /&gt;
  | yes&lt;br /&gt;
  }}&lt;br /&gt;
| docname fed =&lt;br /&gt;
  {{#if: {{{1|}}}&lt;br /&gt;
  | yes&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
| sandbox = &lt;br /&gt;
  {{{docspace|{{NAMESPACE}}}}}:{{{template page|{{PAGENAME}}}}}/sandbox&lt;br /&gt;
| testcases = &lt;br /&gt;
  {{{docspace|{{NAMESPACE}}}}}:{{{template page|{{PAGENAME}}}}}/testcases&lt;br /&gt;
&lt;br /&gt;
| template page = &lt;br /&gt;
  {{NAMESPACE}}:{{{template page|{{PAGENAME}}}}}&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{pp-template}}&lt;br /&gt;
&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Documentation/start_box&amp;diff=160</id>
		<title>Predefinição:Documentation/start box</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Documentation/start_box&amp;diff=160"/>
		<updated>2013-08-01T18:24:51Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
  Start of green doc box&lt;br /&gt;
--&amp;gt;&amp;lt;div id=&amp;quot;template-documentation&amp;quot; class=&amp;quot;template-documentation iezoomfix&amp;quot;&amp;gt;&amp;lt;!--&lt;br /&gt;
  Add the heading at the top of the doc box:&lt;br /&gt;
--&amp;gt;{{#ifeq: {{{heading|¬}}} | &amp;lt;!--Defined but empty--&amp;gt;&lt;br /&gt;
| &amp;lt;!--&amp;quot;heading=&amp;quot;, do nothing--&amp;gt;&lt;br /&gt;
| &amp;lt;div style=&amp;quot;padding-bottom: 3px; border-bottom: 1px solid #aaa; margin-bottom: 1ex;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;{{#if: {{{heading-style|}}}&lt;br /&gt;
  | {{{heading-style|}}}&lt;br /&gt;
  | {{#ifeq: {{SUBJECTSPACE}} | {{ns:Template}}&lt;br /&gt;
    | font-weight: bold; font-size: 125%&lt;br /&gt;
    | font-size: 150%&lt;br /&gt;
    }}&lt;br /&gt;
  }}&amp;quot;&amp;gt;{{#switch: {{{heading|¬}}}&lt;br /&gt;
  | ¬ =   &lt;br /&gt;
    &amp;lt;!--&amp;quot;heading&amp;quot; not defined in this or previous level--&amp;gt;&lt;br /&gt;
    {{#switch: {{SUBJECTSPACE}} &lt;br /&gt;
    | {{ns:Template}} = [[File:Template-info.png|50px|link=|alt=Documentation icon]] Template documentation&lt;br /&gt;
    | {{ns:Module}} = [[File:Template-info.png|50px|link=|alt=Documentation icon]] Module documentation&lt;br /&gt;
    | {{ns:File}} = Summary&lt;br /&gt;
    | #default = Documentation&lt;br /&gt;
    }}&lt;br /&gt;
  | #default = &lt;br /&gt;
    &amp;lt;!--&amp;quot;heading&amp;quot; has data or is empty but defined--&amp;gt;&lt;br /&gt;
    {{{heading|}}}&lt;br /&gt;
  }}&amp;lt;/span&amp;gt;{{&lt;br /&gt;
  #if: {{{content|}}}&lt;br /&gt;
  | &lt;br /&gt;
  | &amp;lt;!--Add the [view][edit][history][purge] or [create] links--&amp;gt;&lt;br /&gt;
    &amp;lt;span class=&amp;quot;mw-editsection plainlinks&amp;quot; id=&amp;quot;doc_editlinks&amp;quot;&amp;gt;{{&lt;br /&gt;
    #if: {{{doc exist|yes}}}&lt;br /&gt;
    | &amp;amp;#91;[[{{{docpage|{{FULLPAGENAME}}/doc}}}|view]]&amp;amp;#93; [[{{fullurl:{{{docpage|{{FULLPAGENAME}}/doc}}}|action=edit}} edit]] [[{{fullurl:{{{docpage|{{FULLPAGENAME}}/doc}}}|action=history}} history]] [{{purge|purge}}] &lt;br /&gt;
    | &amp;lt;!--/doc doesn't exist--&amp;gt;&lt;br /&gt;
      [[{{fullurl:{{{docpage|{{FULLPAGENAME}}/doc}}}| action=edit&amp;amp;preload={{&lt;br /&gt;
        #if: {{{preload|}}} &lt;br /&gt;
        | {{urlencode:{{{preload}}}}}&lt;br /&gt;
        | {{#ifeq: {{SUBJECTSPACE}} | {{ns:File}}&lt;br /&gt;
          | Template:Documentation/preload-filespace&lt;br /&gt;
          | Template:Documentation/preload&lt;br /&gt;
          }} }} }} create]]&lt;br /&gt;
    }}&amp;lt;/span&amp;gt;&lt;br /&gt;
  }}&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&amp;lt;!-- close the div --&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{pp-template}}&lt;br /&gt;
&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Documentation/start_box2&amp;diff=162</id>
		<title>Predefinição:Documentation/start box2</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Documentation/start_box2&amp;diff=162"/>
		<updated>2013-08-01T18:24:51Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{documentation/start box&lt;br /&gt;
| preload = {{{preload|}}}   &amp;lt;!--Allow custom preloads--&amp;gt;&lt;br /&gt;
| heading = {{{heading|¬}}}   &amp;lt;!--Empty but defined means no header--&amp;gt;&lt;br /&gt;
| heading-style = {{{heading-style|}}}&lt;br /&gt;
| content = {{{content|}}}&lt;br /&gt;
&lt;br /&gt;
| docpage = &lt;br /&gt;
  {{#if: {{{1|}}}&lt;br /&gt;
  | {{{1|}}}&lt;br /&gt;
  | {{{docspace|{{NAMESPACE}}}}}:{{{template page|{{PAGENAME}}}}}/doc&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
| doc exist = &lt;br /&gt;
  {{#ifexist: &lt;br /&gt;
    {{#if: {{{1|}}}&lt;br /&gt;
    | {{{1|}}}   &amp;lt;!--Other docname fed--&amp;gt;&lt;br /&gt;
    | {{{docspace|{{NAMESPACE}}}}}:{{{template page|{{PAGENAME}}}}}/doc&lt;br /&gt;
    }}&lt;br /&gt;
  | yes&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{pp-template}}&lt;br /&gt;
&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Documentation/template_page&amp;diff=164</id>
		<title>Predefinição:Documentation/template page</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Predefini%C3%A7%C3%A3o:Documentation/template_page&amp;diff=164"/>
		<updated>2013-08-01T18:24:51Z</updated>

		<summary type="html">&lt;p&gt;Admin: uma edição&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#switch: {{SUBPAGENAME}}&lt;br /&gt;
| sandbox&lt;br /&gt;
| testcases = {{BASEPAGENAME}}&lt;br /&gt;
| #default = {{PAGENAME}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;{{documentation|content=&lt;br /&gt;
This subtemplate of {{tl|documentation}} is used to determine the template page name.&lt;br /&gt;
}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
</feed>