<?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=Mike</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=Mike"/>
	<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Especial:Contribui%C3%A7%C3%B5es/Mike"/>
	<updated>2026-04-14T19:42:08Z</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=Traducoes-opensips&amp;diff=1521</id>
		<title>Traducoes-opensips</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Traducoes-opensips&amp;diff=1521"/>
		<updated>2020-06-06T23:06:01Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==[[OpenSIPS 1.9 Manual]]==&lt;br /&gt;
Manual versao 1.9 do opensips&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=P%C3%A1gina_principal&amp;diff=1520</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=1520"/>
		<updated>2020-04-28T20:28:37Z</updated>

		<summary type="html">&lt;p&gt;Mike: Desfeita a edição 1385 de Mike (Discussão)&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;br /&gt;
&lt;br /&gt;
No menu a sua esquerda temos dois itens principais, sendo eles, traduções e documentações, no menu traduções são apenas documentos referente ao site oficial do opensips, e em Documentações temos tutoriais ou traduzidos ou criados por nós, obviamente ainda temos pouca coisa porque somos apenas três pessoas trabalhando para isso, e tão logo tenhamos mais pessoas dispostas a contribuir as coisas andarão mais rapidamente.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Docs em Destaque}}&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Traducoes-opensips&amp;diff=1519</id>
		<title>Traducoes-opensips</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Traducoes-opensips&amp;diff=1519"/>
		<updated>2020-04-28T20:27:46Z</updated>

		<summary type="html">&lt;p&gt;Mike: Desfeita a edição 1366 de Admin (Discussão)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==[[OpenSIPS 1.9 Manual]]==&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Opensips_1.9&amp;diff=1518</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=1518"/>
		<updated>2014-06-20T20:44:40Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1517</id>
		<title>OpenSIPs CP no Debian com OpenSIPs 1.9</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1517"/>
		<updated>2014-06-19T03:53:06Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Prefacio==&lt;br /&gt;
&lt;br /&gt;
O OpenSIPs CP é um painel de controle para as funções básicas do OpenSIPS sua instalação não é complexa, porém baseado na forma modular do OpenSIPs é necessário entender bem oque você precisa executar/instalar para o correto funcionamento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencias==&lt;br /&gt;
&lt;br /&gt;
Antes de mais nada é preciso ter o OpenSIPs instalado e funcionando, este tutorial é montado sobre a instalação da versão [[Opensips 1.9]] que temos neste wiki, apenas as funcionalidades desta instalação serão cobertas por este tutorial, então siga todas as instruções que descrevemos no tutorial para ter um perfeito funcionamento, logo você entenderá melhor cada função e poderá fazer uma instalação tanto do OpenSIPS quanto do OpenSIPS CP mais customizada para suas necessidades.&lt;br /&gt;
&lt;br /&gt;
===Apache e PHP===&lt;br /&gt;
&lt;br /&gt;
Para rodar esta aplicação precisamos instalar o apache e os módulos de php necessários, se você tiver familiaridade com outro servidor web como lighttpd ou outro fique avontade em testar a instalação, basicamente precisamos do suporte ao php ativado , vamos seguir utilizando o apache pois é o web server que costumo utilizar.&lt;br /&gt;
&lt;br /&gt;
 apt-get install apache2-mpm-prefork libapache2-mod-php5 php5-mysql php5-curl php5-xmlrpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PEAR===&lt;br /&gt;
&lt;br /&gt;
 pear install MDB2&lt;br /&gt;
 pear install MDB2#mysql&lt;br /&gt;
 pear install log&lt;br /&gt;
&lt;br /&gt;
==OpenSIP CP==&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src/&lt;br /&gt;
 wget -c http://downloads.sourceforge.net/project/opensips-cp/opensips-cp/5.0/opensips-cp_5.0.tgz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fopensips-cp%2Ffiles%2F&amp;amp;ts=1403145228&amp;amp;use_mirror=ufpr&lt;br /&gt;
&lt;br /&gt;
 Renomeie o arquivo do download para opensips-cp-5.0.tgz e depois descompacte&lt;br /&gt;
 tar -xzvf opensips-cp-5.0.tgz&lt;br /&gt;
&lt;br /&gt;
==Instalando==&lt;br /&gt;
&lt;br /&gt;
Dentro do diretorio 5.0 temos os seguintes diretórios&lt;br /&gt;
 config - arquivos de configuração para o banco e outras funcionalidades&lt;br /&gt;
 cron_job - arquivos de cron, em especial o arquivo que junta as informações de dialogos para gerar o cdr&lt;br /&gt;
 doc - documentacao&lt;br /&gt;
 web - Arquivos web&lt;br /&gt;
 INSTALL - as mesmas instruções que temos aqui :)&lt;br /&gt;
 README - explicação sobre oque é o que dentro da estrutura&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nós iremos seguir baseado no conteúdo do README&lt;br /&gt;
&lt;br /&gt;
===Copiando os arquivos para o diretorio web===&lt;br /&gt;
 cd /usr/src&lt;br /&gt;
 mv 5.0 /var/www/opensips-cp&lt;br /&gt;
 &lt;br /&gt;
===Criando alias no apache===&lt;br /&gt;
Abra o arquivo /etc/apache2/sites-enable/000-default , acrescente ao fim do arquivo (antes da tag &amp;lt;/VirtualHost&amp;gt;) &lt;br /&gt;
 Alias /cp /var/www/opensips-cp/web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reiniciando o apache===&lt;br /&gt;
 /etc/init.d/apache2 restart&lt;br /&gt;
 chown www-data.www-data /var/www/opensips-cp/config/access.log&lt;br /&gt;
&lt;br /&gt;
===Instalando as tabelas===&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/admin/add_admin&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; ocp_admin_privileges.mysql&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/system/cdrviewer&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
&lt;br /&gt;
Feito isso entre no mysql e adicione o usuário de administração&lt;br /&gt;
 INSERT INTO ocp_admin_privileges (username,password,ha1,available_tools,permissions) values ('admin','admin',md5('admin:admin'),'all','all');&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===Adicionando ao cron===&lt;br /&gt;
 cd /var/www/opensips-cp/cron_job&lt;br /&gt;
&lt;br /&gt;
Edite o arquivo generate-cdrs_mysql.sh e altere os parametros de conexão, também altere &lt;br /&gt;
 call opensips_cdrs_1_6();&lt;br /&gt;
para &lt;br /&gt;
 call opensips_cdrs();&lt;br /&gt;
&lt;br /&gt;
Acrescente em seu arquivo /etc/crontab a seguinte entrada&lt;br /&gt;
&lt;br /&gt;
         */3 * * * * root /var/www/opensips-cp/cron_job/generate-cdrs_mysql.sh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Configuração Geral==&lt;br /&gt;
Agora que fizemos as configurações básicas, precisamos gerar as configurações nos módulos que utilizaremos.&lt;br /&gt;
&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/db.inc.php e altere os parametros de banco de dados&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/boxes.global.inc.php , e descomente a linha&lt;br /&gt;
 $boxes[$box_id]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Acessando a interface==&lt;br /&gt;
&lt;br /&gt;
Agora coloque em seu browser http://__SEU__IP__/cp , entre com usuario e senha admin e pronto, você está na tela do opensipscp, através desta você poderá criar usuários e realizar outras operações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ajustando os módulos==&lt;br /&gt;
&lt;br /&gt;
Não sei bem se por erro ou outra razão porém muitos módulos necessitam de alguns ajustes especiais, vamos tratar os mesmos aqui.&lt;br /&gt;
&lt;br /&gt;
===dialog===&lt;br /&gt;
 Arquivo: /var/www/opensips-cp/config/tools/system/dialog/local.inc.php&lt;br /&gt;
Altere o parametro: &lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_proxy_fifo&amp;quot;;;&lt;br /&gt;
para&lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Existem outros módulos ainda que você pode precisar criar algumas tabelas adicionais, porém vamos deixar isso para um outro tutorial, o objetivo deste é apenas por a ferramenta pra funcionar com funcionalidades básicas.&lt;br /&gt;
&lt;br /&gt;
===siptrace===&lt;br /&gt;
&lt;br /&gt;
O siptrace é necessário ativar pois ele não é coberto em nossa instalação, de forma básica, você deve chamar o módulo em seu opensips.cfg (após a configuração do dialog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### SIP TRACE&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;, &amp;quot;TRACE_FLAG&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;trace_on&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;enable_ack_trace&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;traced_user_avp&amp;quot;, &amp;quot;$avp(traced_user)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
finalmente localize a seguinte entrada&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;)) {&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E logo após o setflag, acrescente&lt;br /&gt;
                 trace_dialog();&lt;br /&gt;
&lt;br /&gt;
Altere o arquivo /var/www/opensips-cp/config/tools/system/siptrace/local.inc.php e altere o conteúdo de proxy_list para os ips que você está usando em seu opensips&lt;br /&gt;
 $proxy_list=array(&amp;quot;udp:192.168.0.6:5060&amp;quot;,&amp;quot;tcp:192.168.0.6:5060&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Desta forma o siptrace esta desativado, para ativar durante a execução do seu opensips, basta enviar o comando&lt;br /&gt;
 opensipsctl fifo sip_trace on&lt;br /&gt;
&lt;br /&gt;
Ou então pela propria interface voce pode ativar e desativar o recurso.&lt;br /&gt;
&lt;br /&gt;
Abaixo você pode ver o resultado desta utilização&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Siptrace01.jpg|frameless|400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Com a configuração no formato atual, você possue recursos para criar usuários, aliases, dominios, fazer tracer , possue cdr, visualizar e manipular dialogos, e usar o módulo de dinamic routing para fazer as regras de discagem externa.&lt;br /&gt;
&lt;br /&gt;
isso é o básico de OpenSIPs CP , no mais é só você verificar os diretórios do módulos e ir ativando de acordo com oque você coloca no seu opensips, ele basicamente é uma interface para gerenciar o banco de dados.&lt;br /&gt;
&lt;br /&gt;
[[Documentacoes|Voltar]]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1516</id>
		<title>OpenSIPs CP no Debian com OpenSIPs 1.9</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1516"/>
		<updated>2014-06-19T03:49:14Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Prefacio==&lt;br /&gt;
&lt;br /&gt;
O OpenSIPs CP é um painel de controle para as funções básicas do OpenSIPS sua instalação não é complexa, porém baseado na forma modular do OpenSIPs é necessário entender bem oque você precisa executar/instalar para o correto funcionamento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencias==&lt;br /&gt;
&lt;br /&gt;
Antes de mais nada é preciso ter o OpenSIPs instalado e funcionando, este tutorial é montado sobre a instalação da versão [[Opensips 1.9]] que temos neste wiki, apenas as funcionalidades desta instalação serão cobertas por este tutorial, então siga todas as instruções que descrevemos no tutorial para ter um perfeito funcionamento, logo você entenderá melhor cada função e poderá fazer uma instalação tanto do OpenSIPS quanto do OpenSIPS CP mais customizada para suas necessidades.&lt;br /&gt;
&lt;br /&gt;
===Apache e PHP===&lt;br /&gt;
&lt;br /&gt;
Para rodar esta aplicação precisamos instalar o apache e os módulos de php necessários, se você tiver familiaridade com outro servidor web como lighttpd ou outro fique avontade em testar a instalação, basicamente precisamos do suporte ao php ativado , vamos seguir utilizando o apache pois é o web server que costumo utilizar.&lt;br /&gt;
&lt;br /&gt;
 apt-get install apache2-mpm-prefork libapache2-mod-php5 php5-mysql php5-curl php5-xmlrpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PEAR===&lt;br /&gt;
&lt;br /&gt;
 pear install MDB2&lt;br /&gt;
 pear install MDB2#mysql&lt;br /&gt;
 pear install log&lt;br /&gt;
&lt;br /&gt;
==OpenSIP CP==&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src/&lt;br /&gt;
 wget -c http://downloads.sourceforge.net/project/opensips-cp/opensips-cp/5.0/opensips-cp_5.0.tgz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fopensips-cp%2Ffiles%2F&amp;amp;ts=1403145228&amp;amp;use_mirror=ufpr&lt;br /&gt;
&lt;br /&gt;
 Renomeie o arquivo do download para opensips-cp-5.0.tgz e depois descompacte&lt;br /&gt;
 tar -xzvf opensips-cp-5.0.tgz&lt;br /&gt;
&lt;br /&gt;
==Instalando==&lt;br /&gt;
&lt;br /&gt;
Dentro do diretorio 5.0 temos os seguintes diretórios&lt;br /&gt;
 config - arquivos de configuração para o banco e outras funcionalidades&lt;br /&gt;
 cron_job - arquivos de cron, em especial o arquivo que junta as informações de dialogos para gerar o cdr&lt;br /&gt;
 doc - documentacao&lt;br /&gt;
 web - Arquivos web&lt;br /&gt;
 INSTALL - as mesmas instruções que temos aqui :)&lt;br /&gt;
 README - explicação sobre oque é o que dentro da estrutura&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nós iremos seguir baseado no conteúdo do README&lt;br /&gt;
&lt;br /&gt;
===Copiando os arquivos para o diretorio web===&lt;br /&gt;
 cd /usr/src&lt;br /&gt;
 mv 5.0 /var/www/opensips-cp&lt;br /&gt;
 &lt;br /&gt;
===Criando alias no apache===&lt;br /&gt;
Abra o arquivo /etc/apache2/sites-enable/000-default , acrescente ao fim do arquivo (antes da tag &amp;lt;/VirtualHost&amp;gt;) &lt;br /&gt;
 Alias /cp /var/www/opensips-cp/web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reiniciando o apache===&lt;br /&gt;
 /etc/init.d/apache2 restart&lt;br /&gt;
 chown www-data.www-data /var/www/opensips-cp/config/access.log&lt;br /&gt;
&lt;br /&gt;
===Instalando as tabelas===&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/admin/add_admin&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; ocp_admin_privileges.mysql&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/system/cdrviewer&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
&lt;br /&gt;
Feito isso entre no mysql e adicione o usuário de administração&lt;br /&gt;
 INSERT INTO ocp_admin_privileges (username,password,ha1,available_tools,permissions) values ('admin','admin',md5('admin:admin'),'all','all');&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===Adicionando ao cron===&lt;br /&gt;
 cd /var/www/opensips-cp/cron_job&lt;br /&gt;
&lt;br /&gt;
Edite o arquivo generate-cdrs_mysql.sh e altere os parametros de conexão, também altere &lt;br /&gt;
 call opensips_cdrs_1_6();&lt;br /&gt;
para &lt;br /&gt;
 call opensips_cdrs();&lt;br /&gt;
&lt;br /&gt;
Acrescente em seu arquivo /etc/crontab a seguinte entrada&lt;br /&gt;
&lt;br /&gt;
         */3 * * * * root /var/www/opensips-cp/cron_job/generate-cdrs_mysql.sh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Configuração Geral==&lt;br /&gt;
Agora que fizemos as configurações básicas, precisamos gerar as configurações nos módulos que utilizaremos.&lt;br /&gt;
&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/db.inc.php e altere os parametros de banco de dados&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/boxes.global.inc.php , e descomente a linha&lt;br /&gt;
 $boxes[$box_id]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Acessando a interface==&lt;br /&gt;
&lt;br /&gt;
Agora coloque em seu browser http://__SEU__IP__/cp , entre com usuario e senha admin e pronto, você está na tela do opensipscp, através desta você poderá criar usuários e realizar outras operações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ajustando os módulos==&lt;br /&gt;
&lt;br /&gt;
Não sei bem se por erro ou outra razão porém muitos módulos necessitam de alguns ajustes especiais, vamos tratar os mesmos aqui.&lt;br /&gt;
&lt;br /&gt;
===dialog===&lt;br /&gt;
 Arquivo: /var/www/opensips-cp/config/tools/system/dialog/local.inc.php&lt;br /&gt;
Altere o parametro: &lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_proxy_fifo&amp;quot;;;&lt;br /&gt;
para&lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Existem outros módulos ainda que você pode precisar criar algumas tabelas adicionais, porém vamos deixar isso para um outro tutorial, o objetivo deste é apenas por a ferramenta pra funcionar com funcionalidades básicas.&lt;br /&gt;
&lt;br /&gt;
===siptrace===&lt;br /&gt;
&lt;br /&gt;
O siptrace é necessário ativar pois ele não é coberto em nossa instalação, de forma básica, você deve chamar o módulo em seu opensips.cfg (após a configuração do dialog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### SIP TRACE&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;, &amp;quot;TRACE_FLAG&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;trace_on&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;enable_ack_trace&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;traced_user_avp&amp;quot;, &amp;quot;$avp(traced_user)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
finalmente localize a seguinte entrada&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;)) {&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E logo após o setflag, acrescente&lt;br /&gt;
                 trace_dialog();&lt;br /&gt;
&lt;br /&gt;
Altere o arquivo /var/www/opensips-cp/config/tools/system/siptrace/local.inc.php e altere o conteúdo de proxy_list para os ips que você está usando em seu opensips&lt;br /&gt;
 $proxy_list=array(&amp;quot;udp:192.168.0.6:5060&amp;quot;,&amp;quot;tcp:192.168.0.6:5060&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Desta forma o siptrace esta desativado, para ativar durante a execução do seu opensips, basta enviar o comando&lt;br /&gt;
 opensipsctl fifo sip_trace on&lt;br /&gt;
&lt;br /&gt;
Ou então pela propria interface voce pode ativar e desativar o recurso.&lt;br /&gt;
&lt;br /&gt;
Abaixo você pode ver o resultado desta utilização&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Siptrace01.jpg|frameless|400px]]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1515</id>
		<title>OpenSIPs CP no Debian com OpenSIPs 1.9</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1515"/>
		<updated>2014-06-19T03:48:33Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Prefacio==&lt;br /&gt;
&lt;br /&gt;
O OpenSIPs CP é um painel de controle para as funções básicas do OpenSIPS sua instalação não é complexa, porém baseado na forma modular do OpenSIPs é necessário entender bem oque você precisa executar/instalar para o correto funcionamento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencias==&lt;br /&gt;
&lt;br /&gt;
Antes de mais nada é preciso ter o OpenSIPs instalado e funcionando, este tutorial é montado sobre a instalação da versão [[Opensips 1.9]] que temos neste wiki, apenas as funcionalidades desta instalação serão cobertas por este tutorial, então siga todas as instruções que descrevemos no tutorial para ter um perfeito funcionamento, logo você entenderá melhor cada função e poderá fazer uma instalação tanto do OpenSIPS quanto do OpenSIPS CP mais customizada para suas necessidades.&lt;br /&gt;
&lt;br /&gt;
===Apache e PHP===&lt;br /&gt;
&lt;br /&gt;
Para rodar esta aplicação precisamos instalar o apache e os módulos de php necessários, se você tiver familiaridade com outro servidor web como lighttpd ou outro fique avontade em testar a instalação, basicamente precisamos do suporte ao php ativado , vamos seguir utilizando o apache pois é o web server que costumo utilizar.&lt;br /&gt;
&lt;br /&gt;
 apt-get install apache2-mpm-prefork libapache2-mod-php5 php5-mysql php5-curl php5-xmlrpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PEAR===&lt;br /&gt;
&lt;br /&gt;
 pear install MDB2&lt;br /&gt;
 pear install MDB2#mysql&lt;br /&gt;
 pear install log&lt;br /&gt;
&lt;br /&gt;
==OpenSIP CP==&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src/&lt;br /&gt;
 wget -c http://downloads.sourceforge.net/project/opensips-cp/opensips-cp/5.0/opensips-cp_5.0.tgz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fopensips-cp%2Ffiles%2F&amp;amp;ts=1403145228&amp;amp;use_mirror=ufpr&lt;br /&gt;
&lt;br /&gt;
 Renomeie o arquivo do download para opensips-cp-5.0.tgz e depois descompacte&lt;br /&gt;
 tar -xzvf opensips-cp-5.0.tgz&lt;br /&gt;
&lt;br /&gt;
==Instalando==&lt;br /&gt;
&lt;br /&gt;
Dentro do diretorio 5.0 temos os seguintes diretórios&lt;br /&gt;
 config - arquivos de configuração para o banco e outras funcionalidades&lt;br /&gt;
 cron_job - arquivos de cron, em especial o arquivo que junta as informações de dialogos para gerar o cdr&lt;br /&gt;
 doc - documentacao&lt;br /&gt;
 web - Arquivos web&lt;br /&gt;
 INSTALL - as mesmas instruções que temos aqui :)&lt;br /&gt;
 README - explicação sobre oque é o que dentro da estrutura&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nós iremos seguir baseado no conteúdo do README&lt;br /&gt;
&lt;br /&gt;
===Copiando os arquivos para o diretorio web===&lt;br /&gt;
 cd /usr/src&lt;br /&gt;
 mv 5.0 /var/www/opensips-cp&lt;br /&gt;
 &lt;br /&gt;
===Criando alias no apache===&lt;br /&gt;
Abra o arquivo /etc/apache2/sites-enable/000-default , acrescente ao fim do arquivo (antes da tag &amp;lt;/VirtualHost&amp;gt;) &lt;br /&gt;
 Alias /cp /var/www/opensips-cp/web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reiniciando o apache===&lt;br /&gt;
 /etc/init.d/apache2 restart&lt;br /&gt;
 chown www-data.www-data /var/www/opensips-cp/config/access.log&lt;br /&gt;
&lt;br /&gt;
===Instalando as tabelas===&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/admin/add_admin&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; ocp_admin_privileges.mysql&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/system/cdrviewer&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
&lt;br /&gt;
Feito isso entre no mysql e adicione o usuário de administração&lt;br /&gt;
 INSERT INTO ocp_admin_privileges (username,password,ha1,available_tools,permissions) values ('admin','admin',md5('admin:admin'),'all','all');&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===Adicionando ao cron===&lt;br /&gt;
 cd /var/www/opensips-cp/cron_job&lt;br /&gt;
&lt;br /&gt;
Edite o arquivo generate-cdrs_mysql.sh e altere os parametros de conexão, também altere &lt;br /&gt;
 call opensips_cdrs_1_6();&lt;br /&gt;
para &lt;br /&gt;
 call opensips_cdrs();&lt;br /&gt;
&lt;br /&gt;
Acrescente em seu arquivo /etc/crontab a seguinte entrada&lt;br /&gt;
&lt;br /&gt;
         */3 * * * * root /var/www/opensips-cp/cron_job/generate-cdrs_mysql.sh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Configuração Geral==&lt;br /&gt;
Agora que fizemos as configurações básicas, precisamos gerar as configurações nos módulos que utilizaremos.&lt;br /&gt;
&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/db.inc.php e altere os parametros de banco de dados&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/boxes.global.inc.php , e descomente a linha&lt;br /&gt;
 $boxes[$box_id]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Acessando a interface==&lt;br /&gt;
&lt;br /&gt;
Agora coloque em seu browser http://__SEU__IP__/cp , entre com usuario e senha admin e pronto, você está na tela do opensipscp, através desta você poderá criar usuários e realizar outras operações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ajustando os módulos==&lt;br /&gt;
&lt;br /&gt;
Não sei bem se por erro ou outra razão porém muitos módulos necessitam de alguns ajustes especiais, vamos tratar os mesmos aqui.&lt;br /&gt;
&lt;br /&gt;
===dialog===&lt;br /&gt;
 Arquivo: /var/www/opensips-cp/config/tools/system/dialog/local.inc.php&lt;br /&gt;
Altere o parametro: &lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_proxy_fifo&amp;quot;;;&lt;br /&gt;
para&lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Existem outros módulos ainda que você pode precisar criar algumas tabelas adicionais, porém vamos deixar isso para um outro tutorial, o objetivo deste é apenas por a ferramenta pra funcionar com funcionalidades básicas.&lt;br /&gt;
&lt;br /&gt;
===siptrace===&lt;br /&gt;
&lt;br /&gt;
O siptrace é necessário ativar pois ele não é coberto em nossa instalação, de forma básica, você deve chamar o módulo em seu opensips.cfg (após a configuração do dialog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### SIP TRACE&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;, &amp;quot;TRACE_FLAG&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;trace_on&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;enable_ack_trace&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;traced_user_avp&amp;quot;, &amp;quot;$avp(traced_user)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
finalmente localize a seguinte entrada&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;)) {&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E logo após o setflag, acrescente&lt;br /&gt;
                 trace_dialog();&lt;br /&gt;
&lt;br /&gt;
Altere o arquivo /var/www/opensips-cp/config/tools/system/siptrace/local.inc.php e altere o conteúdo de proxy_list para os ips que você está usando em seu opensips&lt;br /&gt;
 $proxy_list=array(&amp;quot;udp:192.168.0.6:5060&amp;quot;,&amp;quot;tcp:192.168.0.6:5060&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Desta forma o siptrace esta desativado, para ativar durante a execução do seu opensips, basta enviar o comando&lt;br /&gt;
 opensipsctl fifo sip_trace on&lt;br /&gt;
&lt;br /&gt;
Ou então pela propria interface voce pode ativar e desativar o recurso.&lt;br /&gt;
&lt;br /&gt;
Abaixo você pode ver o resultado desta utilização&lt;br /&gt;
[[Arquivo:Siptrace01.jpg|300px]]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1514</id>
		<title>OpenSIPs CP no Debian com OpenSIPs 1.9</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1514"/>
		<updated>2014-06-19T03:46:58Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Prefacio==&lt;br /&gt;
&lt;br /&gt;
O OpenSIPs CP é um painel de controle para as funções básicas do OpenSIPS sua instalação não é complexa, porém baseado na forma modular do OpenSIPs é necessário entender bem oque você precisa executar/instalar para o correto funcionamento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencias==&lt;br /&gt;
&lt;br /&gt;
Antes de mais nada é preciso ter o OpenSIPs instalado e funcionando, este tutorial é montado sobre a instalação da versão [[Opensips 1.9]] que temos neste wiki, apenas as funcionalidades desta instalação serão cobertas por este tutorial, então siga todas as instruções que descrevemos no tutorial para ter um perfeito funcionamento, logo você entenderá melhor cada função e poderá fazer uma instalação tanto do OpenSIPS quanto do OpenSIPS CP mais customizada para suas necessidades.&lt;br /&gt;
&lt;br /&gt;
===Apache e PHP===&lt;br /&gt;
&lt;br /&gt;
Para rodar esta aplicação precisamos instalar o apache e os módulos de php necessários, se você tiver familiaridade com outro servidor web como lighttpd ou outro fique avontade em testar a instalação, basicamente precisamos do suporte ao php ativado , vamos seguir utilizando o apache pois é o web server que costumo utilizar.&lt;br /&gt;
&lt;br /&gt;
 apt-get install apache2-mpm-prefork libapache2-mod-php5 php5-mysql php5-curl php5-xmlrpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PEAR===&lt;br /&gt;
&lt;br /&gt;
 pear install MDB2&lt;br /&gt;
 pear install MDB2#mysql&lt;br /&gt;
 pear install log&lt;br /&gt;
&lt;br /&gt;
==OpenSIP CP==&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src/&lt;br /&gt;
 wget -c http://downloads.sourceforge.net/project/opensips-cp/opensips-cp/5.0/opensips-cp_5.0.tgz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fopensips-cp%2Ffiles%2F&amp;amp;ts=1403145228&amp;amp;use_mirror=ufpr&lt;br /&gt;
&lt;br /&gt;
 Renomeie o arquivo do download para opensips-cp-5.0.tgz e depois descompacte&lt;br /&gt;
 tar -xzvf opensips-cp-5.0.tgz&lt;br /&gt;
&lt;br /&gt;
==Instalando==&lt;br /&gt;
&lt;br /&gt;
Dentro do diretorio 5.0 temos os seguintes diretórios&lt;br /&gt;
 config - arquivos de configuração para o banco e outras funcionalidades&lt;br /&gt;
 cron_job - arquivos de cron, em especial o arquivo que junta as informações de dialogos para gerar o cdr&lt;br /&gt;
 doc - documentacao&lt;br /&gt;
 web - Arquivos web&lt;br /&gt;
 INSTALL - as mesmas instruções que temos aqui :)&lt;br /&gt;
 README - explicação sobre oque é o que dentro da estrutura&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nós iremos seguir baseado no conteúdo do README&lt;br /&gt;
&lt;br /&gt;
===Copiando os arquivos para o diretorio web===&lt;br /&gt;
 cd /usr/src&lt;br /&gt;
 mv 5.0 /var/www/opensips-cp&lt;br /&gt;
 &lt;br /&gt;
===Criando alias no apache===&lt;br /&gt;
Abra o arquivo /etc/apache2/sites-enable/000-default , acrescente ao fim do arquivo (antes da tag &amp;lt;/VirtualHost&amp;gt;) &lt;br /&gt;
 Alias /cp /var/www/opensips-cp/web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reiniciando o apache===&lt;br /&gt;
 /etc/init.d/apache2 restart&lt;br /&gt;
 chown www-data.www-data /var/www/opensips-cp/config/access.log&lt;br /&gt;
&lt;br /&gt;
===Instalando as tabelas===&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/admin/add_admin&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; ocp_admin_privileges.mysql&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/system/cdrviewer&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
&lt;br /&gt;
Feito isso entre no mysql e adicione o usuário de administração&lt;br /&gt;
 INSERT INTO ocp_admin_privileges (username,password,ha1,available_tools,permissions) values ('admin','admin',md5('admin:admin'),'all','all');&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===Adicionando ao cron===&lt;br /&gt;
 cd /var/www/opensips-cp/cron_job&lt;br /&gt;
&lt;br /&gt;
Edite o arquivo generate-cdrs_mysql.sh e altere os parametros de conexão, também altere &lt;br /&gt;
 call opensips_cdrs_1_6();&lt;br /&gt;
para &lt;br /&gt;
 call opensips_cdrs();&lt;br /&gt;
&lt;br /&gt;
Acrescente em seu arquivo /etc/crontab a seguinte entrada&lt;br /&gt;
&lt;br /&gt;
         */3 * * * * root /var/www/opensips-cp/cron_job/generate-cdrs_mysql.sh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Configuração Geral==&lt;br /&gt;
Agora que fizemos as configurações básicas, precisamos gerar as configurações nos módulos que utilizaremos.&lt;br /&gt;
&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/db.inc.php e altere os parametros de banco de dados&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/boxes.global.inc.php , e descomente a linha&lt;br /&gt;
 $boxes[$box_id]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Acessando a interface==&lt;br /&gt;
&lt;br /&gt;
Agora coloque em seu browser http://__SEU__IP__/cp , entre com usuario e senha admin e pronto, você está na tela do opensipscp, através desta você poderá criar usuários e realizar outras operações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ajustando os módulos==&lt;br /&gt;
&lt;br /&gt;
Não sei bem se por erro ou outra razão porém muitos módulos necessitam de alguns ajustes especiais, vamos tratar os mesmos aqui.&lt;br /&gt;
&lt;br /&gt;
===dialog===&lt;br /&gt;
 Arquivo: /var/www/opensips-cp/config/tools/system/dialog/local.inc.php&lt;br /&gt;
Altere o parametro: &lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_proxy_fifo&amp;quot;;;&lt;br /&gt;
para&lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Existem outros módulos ainda que você pode precisar criar algumas tabelas adicionais, porém vamos deixar isso para um outro tutorial, o objetivo deste é apenas por a ferramenta pra funcionar com funcionalidades básicas.&lt;br /&gt;
&lt;br /&gt;
===siptrace===&lt;br /&gt;
&lt;br /&gt;
O siptrace é necessário ativar pois ele não é coberto em nossa instalação, de forma básica, você deve chamar o módulo em seu opensips.cfg (após a configuração do dialog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### SIP TRACE&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;, &amp;quot;TRACE_FLAG&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;trace_on&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;enable_ack_trace&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;traced_user_avp&amp;quot;, &amp;quot;$avp(traced_user)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
finalmente localize a seguinte entrada&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;)) {&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E logo após o setflag, acrescente&lt;br /&gt;
                 trace_dialog();&lt;br /&gt;
&lt;br /&gt;
Altere o arquivo /var/www/opensips-cp/config/tools/system/siptrace/local.inc.php e altere o conteúdo de proxy_list para os ips que você está usando em seu opensips&lt;br /&gt;
 $proxy_list=array(&amp;quot;udp:192.168.0.6:5060&amp;quot;,&amp;quot;tcp:192.168.0.6:5060&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Desta forma o siptrace esta desativado, para ativar durante a execução do seu opensips, basta enviar o comando&lt;br /&gt;
 opensipsctl fifo sip_trace on&lt;br /&gt;
&lt;br /&gt;
Ou então pela propria interface voce pode ativar e desativar o recurso.&lt;br /&gt;
&lt;br /&gt;
Abaixo você pode ver o resultado desta utilização&lt;br /&gt;
[[Arquivo:Siptrace01.jpg]]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Arquivo:Siptrace01.jpg&amp;diff=1513</id>
		<title>Arquivo:Siptrace01.jpg</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Arquivo:Siptrace01.jpg&amp;diff=1513"/>
		<updated>2014-06-19T03:46:30Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1512</id>
		<title>OpenSIPs CP no Debian com OpenSIPs 1.9</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1512"/>
		<updated>2014-06-19T03:44:23Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Prefacio==&lt;br /&gt;
&lt;br /&gt;
O OpenSIPs CP é um painel de controle para as funções básicas do OpenSIPS sua instalação não é complexa, porém baseado na forma modular do OpenSIPs é necessário entender bem oque você precisa executar/instalar para o correto funcionamento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencias==&lt;br /&gt;
&lt;br /&gt;
Antes de mais nada é preciso ter o OpenSIPs instalado e funcionando, este tutorial é montado sobre a instalação da versão [[Opensips 1.9]] que temos neste wiki, apenas as funcionalidades desta instalação serão cobertas por este tutorial, então siga todas as instruções que descrevemos no tutorial para ter um perfeito funcionamento, logo você entenderá melhor cada função e poderá fazer uma instalação tanto do OpenSIPS quanto do OpenSIPS CP mais customizada para suas necessidades.&lt;br /&gt;
&lt;br /&gt;
===Apache e PHP===&lt;br /&gt;
&lt;br /&gt;
Para rodar esta aplicação precisamos instalar o apache e os módulos de php necessários, se você tiver familiaridade com outro servidor web como lighttpd ou outro fique avontade em testar a instalação, basicamente precisamos do suporte ao php ativado , vamos seguir utilizando o apache pois é o web server que costumo utilizar.&lt;br /&gt;
&lt;br /&gt;
 apt-get install apache2-mpm-prefork libapache2-mod-php5 php5-mysql php5-curl php5-xmlrpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PEAR===&lt;br /&gt;
&lt;br /&gt;
 pear install MDB2&lt;br /&gt;
 pear install MDB2#mysql&lt;br /&gt;
 pear install log&lt;br /&gt;
&lt;br /&gt;
==OpenSIP CP==&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src/&lt;br /&gt;
 wget -c http://downloads.sourceforge.net/project/opensips-cp/opensips-cp/5.0/opensips-cp_5.0.tgz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fopensips-cp%2Ffiles%2F&amp;amp;ts=1403145228&amp;amp;use_mirror=ufpr&lt;br /&gt;
&lt;br /&gt;
 Renomeie o arquivo do download para opensips-cp-5.0.tgz e depois descompacte&lt;br /&gt;
 tar -xzvf opensips-cp-5.0.tgz&lt;br /&gt;
&lt;br /&gt;
==Instalando==&lt;br /&gt;
&lt;br /&gt;
Dentro do diretorio 5.0 temos os seguintes diretórios&lt;br /&gt;
 config - arquivos de configuração para o banco e outras funcionalidades&lt;br /&gt;
 cron_job - arquivos de cron, em especial o arquivo que junta as informações de dialogos para gerar o cdr&lt;br /&gt;
 doc - documentacao&lt;br /&gt;
 web - Arquivos web&lt;br /&gt;
 INSTALL - as mesmas instruções que temos aqui :)&lt;br /&gt;
 README - explicação sobre oque é o que dentro da estrutura&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nós iremos seguir baseado no conteúdo do README&lt;br /&gt;
&lt;br /&gt;
===Copiando os arquivos para o diretorio web===&lt;br /&gt;
 cd /usr/src&lt;br /&gt;
 mv 5.0 /var/www/opensips-cp&lt;br /&gt;
 &lt;br /&gt;
===Criando alias no apache===&lt;br /&gt;
Abra o arquivo /etc/apache2/sites-enable/000-default , acrescente ao fim do arquivo (antes da tag &amp;lt;/VirtualHost&amp;gt;) &lt;br /&gt;
 Alias /cp /var/www/opensips-cp/web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reiniciando o apache===&lt;br /&gt;
 /etc/init.d/apache2 restart&lt;br /&gt;
 chown www-data.www-data /var/www/opensips-cp/config/access.log&lt;br /&gt;
&lt;br /&gt;
===Instalando as tabelas===&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/admin/add_admin&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; ocp_admin_privileges.mysql&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/system/cdrviewer&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
&lt;br /&gt;
Feito isso entre no mysql e adicione o usuário de administração&lt;br /&gt;
 INSERT INTO ocp_admin_privileges (username,password,ha1,available_tools,permissions) values ('admin','admin',md5('admin:admin'),'all','all');&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===Adicionando ao cron===&lt;br /&gt;
 cd /var/www/opensips-cp/cron_job&lt;br /&gt;
&lt;br /&gt;
Edite o arquivo generate-cdrs_mysql.sh e altere os parametros de conexão, também altere &lt;br /&gt;
 call opensips_cdrs_1_6();&lt;br /&gt;
para &lt;br /&gt;
 call opensips_cdrs();&lt;br /&gt;
&lt;br /&gt;
Acrescente em seu arquivo /etc/crontab a seguinte entrada&lt;br /&gt;
&lt;br /&gt;
         */3 * * * * root /var/www/opensips-cp/cron_job/generate-cdrs_mysql.sh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Configuração Geral==&lt;br /&gt;
Agora que fizemos as configurações básicas, precisamos gerar as configurações nos módulos que utilizaremos.&lt;br /&gt;
&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/db.inc.php e altere os parametros de banco de dados&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/boxes.global.inc.php , e descomente a linha&lt;br /&gt;
 $boxes[$box_id]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Acessando a interface==&lt;br /&gt;
&lt;br /&gt;
Agora coloque em seu browser http://__SEU__IP__/cp , entre com usuario e senha admin e pronto, você está na tela do opensipscp, através desta você poderá criar usuários e realizar outras operações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ajustando os módulos==&lt;br /&gt;
&lt;br /&gt;
Não sei bem se por erro ou outra razão porém muitos módulos necessitam de alguns ajustes especiais, vamos tratar os mesmos aqui.&lt;br /&gt;
&lt;br /&gt;
===dialog===&lt;br /&gt;
 Arquivo: /var/www/opensips-cp/config/tools/system/dialog/local.inc.php&lt;br /&gt;
Altere o parametro: &lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_proxy_fifo&amp;quot;;;&lt;br /&gt;
para&lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Existem outros módulos ainda que você pode precisar criar algumas tabelas adicionais, porém vamos deixar isso para um outro tutorial, o objetivo deste é apenas por a ferramenta pra funcionar com funcionalidades básicas.&lt;br /&gt;
&lt;br /&gt;
===siptrace===&lt;br /&gt;
&lt;br /&gt;
O siptrace é necessário ativar pois ele não é coberto em nossa instalação, de forma básica, você deve chamar o módulo em seu opensips.cfg (após a configuração do dialog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### SIP TRACE&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;, &amp;quot;TRACE_FLAG&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;trace_on&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;enable_ack_trace&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;traced_user_avp&amp;quot;, &amp;quot;$avp(traced_user)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
finalmente localize a seguinte entrada&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;)) {&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E logo após o setflag, acrescente&lt;br /&gt;
                 trace_dialog();&lt;br /&gt;
&lt;br /&gt;
Altere o arquivo /var/www/opensips-cp/config/tools/system/siptrace/local.inc.php e altere o conteúdo de proxy_list para os ips que você está usando em seu opensips&lt;br /&gt;
 $proxy_list=array(&amp;quot;udp:192.168.0.6:5060&amp;quot;,&amp;quot;tcp:192.168.0.6:5060&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Desta forma o siptrace esta desativado, para ativar durante a execução do seu opensips, basta enviar o comando&lt;br /&gt;
 opensipsctl fifo sip_trace on&lt;br /&gt;
&lt;br /&gt;
Ou então pela propria interface voce pode ativar e desativar o recurso.&lt;br /&gt;
&lt;br /&gt;
Abaixo você pode ver o resultado desta utilização&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.tesliuk.com/imagens/siptrace01.jpg&amp;quot;&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1511</id>
		<title>OpenSIPs CP no Debian com OpenSIPs 1.9</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1511"/>
		<updated>2014-06-19T03:43:18Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Prefacio==&lt;br /&gt;
&lt;br /&gt;
O OpenSIPs CP é um painel de controle para as funções básicas do OpenSIPS sua instalação não é complexa, porém baseado na forma modular do OpenSIPs é necessário entender bem oque você precisa executar/instalar para o correto funcionamento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencias==&lt;br /&gt;
&lt;br /&gt;
Antes de mais nada é preciso ter o OpenSIPs instalado e funcionando, este tutorial é montado sobre a instalação da versão [[Opensips 1.9]] que temos neste wiki, apenas as funcionalidades desta instalação serão cobertas por este tutorial, então siga todas as instruções que descrevemos no tutorial para ter um perfeito funcionamento, logo você entenderá melhor cada função e poderá fazer uma instalação tanto do OpenSIPS quanto do OpenSIPS CP mais customizada para suas necessidades.&lt;br /&gt;
&lt;br /&gt;
===Apache e PHP===&lt;br /&gt;
&lt;br /&gt;
Para rodar esta aplicação precisamos instalar o apache e os módulos de php necessários, se você tiver familiaridade com outro servidor web como lighttpd ou outro fique avontade em testar a instalação, basicamente precisamos do suporte ao php ativado , vamos seguir utilizando o apache pois é o web server que costumo utilizar.&lt;br /&gt;
&lt;br /&gt;
 apt-get install apache2-mpm-prefork libapache2-mod-php5 php5-mysql php5-curl php5-xmlrpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PEAR===&lt;br /&gt;
&lt;br /&gt;
 pear install MDB2&lt;br /&gt;
 pear install MDB2#mysql&lt;br /&gt;
 pear install log&lt;br /&gt;
&lt;br /&gt;
==OpenSIP CP==&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src/&lt;br /&gt;
 wget -c http://downloads.sourceforge.net/project/opensips-cp/opensips-cp/5.0/opensips-cp_5.0.tgz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fopensips-cp%2Ffiles%2F&amp;amp;ts=1403145228&amp;amp;use_mirror=ufpr&lt;br /&gt;
&lt;br /&gt;
 Renomeie o arquivo do download para opensips-cp-5.0.tgz e depois descompacte&lt;br /&gt;
 tar -xzvf opensips-cp-5.0.tgz&lt;br /&gt;
&lt;br /&gt;
==Instalando==&lt;br /&gt;
&lt;br /&gt;
Dentro do diretorio 5.0 temos os seguintes diretórios&lt;br /&gt;
 config - arquivos de configuração para o banco e outras funcionalidades&lt;br /&gt;
 cron_job - arquivos de cron, em especial o arquivo que junta as informações de dialogos para gerar o cdr&lt;br /&gt;
 doc - documentacao&lt;br /&gt;
 web - Arquivos web&lt;br /&gt;
 INSTALL - as mesmas instruções que temos aqui :)&lt;br /&gt;
 README - explicação sobre oque é o que dentro da estrutura&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nós iremos seguir baseado no conteúdo do README&lt;br /&gt;
&lt;br /&gt;
===Copiando os arquivos para o diretorio web===&lt;br /&gt;
 cd /usr/src&lt;br /&gt;
 mv 5.0 /var/www/opensips-cp&lt;br /&gt;
 &lt;br /&gt;
===Criando alias no apache===&lt;br /&gt;
Abra o arquivo /etc/apache2/sites-enable/000-default , acrescente ao fim do arquivo (antes da tag &amp;lt;/VirtualHost&amp;gt;) &lt;br /&gt;
 Alias /cp /var/www/opensips-cp/web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reiniciando o apache===&lt;br /&gt;
 /etc/init.d/apache2 restart&lt;br /&gt;
 chown www-data.www-data /var/www/opensips-cp/config/access.log&lt;br /&gt;
&lt;br /&gt;
===Instalando as tabelas===&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/admin/add_admin&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; ocp_admin_privileges.mysql&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/system/cdrviewer&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
&lt;br /&gt;
Feito isso entre no mysql e adicione o usuário de administração&lt;br /&gt;
 INSERT INTO ocp_admin_privileges (username,password,ha1,available_tools,permissions) values ('admin','admin',md5('admin:admin'),'all','all');&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===Adicionando ao cron===&lt;br /&gt;
 cd /var/www/opensips-cp/cron_job&lt;br /&gt;
&lt;br /&gt;
Edite o arquivo generate-cdrs_mysql.sh e altere os parametros de conexão, também altere &lt;br /&gt;
 call opensips_cdrs_1_6();&lt;br /&gt;
para &lt;br /&gt;
 call opensips_cdrs();&lt;br /&gt;
&lt;br /&gt;
Acrescente em seu arquivo /etc/crontab a seguinte entrada&lt;br /&gt;
&lt;br /&gt;
         */3 * * * * root /var/www/opensips-cp/cron_job/generate-cdrs_mysql.sh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Configuração Geral==&lt;br /&gt;
Agora que fizemos as configurações básicas, precisamos gerar as configurações nos módulos que utilizaremos.&lt;br /&gt;
&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/db.inc.php e altere os parametros de banco de dados&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/boxes.global.inc.php , e descomente a linha&lt;br /&gt;
 $boxes[$box_id]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Acessando a interface==&lt;br /&gt;
&lt;br /&gt;
Agora coloque em seu browser http://__SEU__IP__/cp , entre com usuario e senha admin e pronto, você está na tela do opensipscp, através desta você poderá criar usuários e realizar outras operações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ajustando os módulos==&lt;br /&gt;
&lt;br /&gt;
Não sei bem se por erro ou outra razão porém muitos módulos necessitam de alguns ajustes especiais, vamos tratar os mesmos aqui.&lt;br /&gt;
&lt;br /&gt;
===dialog===&lt;br /&gt;
 Arquivo: /var/www/opensips-cp/config/tools/system/dialog/local.inc.php&lt;br /&gt;
Altere o parametro: &lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_proxy_fifo&amp;quot;;;&lt;br /&gt;
para&lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Existem outros módulos ainda que você pode precisar criar algumas tabelas adicionais, porém vamos deixar isso para um outro tutorial, o objetivo deste é apenas por a ferramenta pra funcionar com funcionalidades básicas.&lt;br /&gt;
&lt;br /&gt;
===siptrace===&lt;br /&gt;
&lt;br /&gt;
O siptrace é necessário ativar pois ele não é coberto em nossa instalação, de forma básica, você deve chamar o módulo em seu opensips.cfg (após a configuração do dialog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### SIP TRACE&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;, &amp;quot;TRACE_FLAG&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;trace_on&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;enable_ack_trace&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;traced_user_avp&amp;quot;, &amp;quot;$avp(traced_user)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
finalmente localize a seguinte entrada&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;)) {&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E logo após o setflag, acrescente&lt;br /&gt;
                 trace_dialog();&lt;br /&gt;
&lt;br /&gt;
Altere o arquivo /var/www/opensips-cp/config/tools/system/siptrace/local.inc.php e altere o conteúdo de proxy_list para os ips que você está usando em seu opensips&lt;br /&gt;
 $proxy_list=array(&amp;quot;udp:192.168.0.6:5060&amp;quot;,&amp;quot;tcp:192.168.0.6:5060&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Desta forma o siptrace esta desativado, para ativar durante a execução do seu opensips, basta enviar o comando&lt;br /&gt;
 opensipsctl fifo sip_trace on&lt;br /&gt;
&lt;br /&gt;
Ou então pela propria interface voce pode ativar e desativar o recurso.&lt;br /&gt;
&lt;br /&gt;
Abaixo você pode ver o resultado desta utilização&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;img src=&amp;quot;http://www.tesliuk.com/imagens/siptrace01.jpg&amp;quot;&amp;gt;&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1510</id>
		<title>OpenSIPs CP no Debian com OpenSIPs 1.9</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1510"/>
		<updated>2014-06-19T03:35:21Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Prefacio==&lt;br /&gt;
&lt;br /&gt;
O OpenSIPs CP é um painel de controle para as funções básicas do OpenSIPS sua instalação não é complexa, porém baseado na forma modular do OpenSIPs é necessário entender bem oque você precisa executar/instalar para o correto funcionamento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencias==&lt;br /&gt;
&lt;br /&gt;
Antes de mais nada é preciso ter o OpenSIPs instalado e funcionando, este tutorial é montado sobre a instalação da versão [[Opensips 1.9]] que temos neste wiki, apenas as funcionalidades desta instalação serão cobertas por este tutorial, então siga todas as instruções que descrevemos no tutorial para ter um perfeito funcionamento, logo você entenderá melhor cada função e poderá fazer uma instalação tanto do OpenSIPS quanto do OpenSIPS CP mais customizada para suas necessidades.&lt;br /&gt;
&lt;br /&gt;
===Apache e PHP===&lt;br /&gt;
&lt;br /&gt;
Para rodar esta aplicação precisamos instalar o apache e os módulos de php necessários, se você tiver familiaridade com outro servidor web como lighttpd ou outro fique avontade em testar a instalação, basicamente precisamos do suporte ao php ativado , vamos seguir utilizando o apache pois é o web server que costumo utilizar.&lt;br /&gt;
&lt;br /&gt;
 apt-get install apache2-mpm-prefork libapache2-mod-php5 php5-mysql php5-curl php5-xmlrpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PEAR===&lt;br /&gt;
&lt;br /&gt;
 pear install MDB2&lt;br /&gt;
 pear install MDB2#mysql&lt;br /&gt;
 pear install log&lt;br /&gt;
&lt;br /&gt;
==OpenSIP CP==&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src/&lt;br /&gt;
 wget -c http://downloads.sourceforge.net/project/opensips-cp/opensips-cp/5.0/opensips-cp_5.0.tgz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fopensips-cp%2Ffiles%2F&amp;amp;ts=1403145228&amp;amp;use_mirror=ufpr&lt;br /&gt;
&lt;br /&gt;
 Renomeie o arquivo do download para opensips-cp-5.0.tgz e depois descompacte&lt;br /&gt;
 tar -xzvf opensips-cp-5.0.tgz&lt;br /&gt;
&lt;br /&gt;
==Instalando==&lt;br /&gt;
&lt;br /&gt;
Dentro do diretorio 5.0 temos os seguintes diretórios&lt;br /&gt;
 config - arquivos de configuração para o banco e outras funcionalidades&lt;br /&gt;
 cron_job - arquivos de cron, em especial o arquivo que junta as informações de dialogos para gerar o cdr&lt;br /&gt;
 doc - documentacao&lt;br /&gt;
 web - Arquivos web&lt;br /&gt;
 INSTALL - as mesmas instruções que temos aqui :)&lt;br /&gt;
 README - explicação sobre oque é o que dentro da estrutura&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nós iremos seguir baseado no conteúdo do README&lt;br /&gt;
&lt;br /&gt;
===Copiando os arquivos para o diretorio web===&lt;br /&gt;
 cd /usr/src&lt;br /&gt;
 mv 5.0 /var/www/opensips-cp&lt;br /&gt;
 &lt;br /&gt;
===Criando alias no apache===&lt;br /&gt;
Abra o arquivo /etc/apache2/sites-enable/000-default , acrescente ao fim do arquivo (antes da tag &amp;lt;/VirtualHost&amp;gt;) &lt;br /&gt;
 Alias /cp /var/www/opensips-cp/web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reiniciando o apache===&lt;br /&gt;
 /etc/init.d/apache2 restart&lt;br /&gt;
 chown www-data.www-data /var/www/opensips-cp/config/access.log&lt;br /&gt;
&lt;br /&gt;
===Instalando as tabelas===&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/admin/add_admin&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; ocp_admin_privileges.mysql&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/system/cdrviewer&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
&lt;br /&gt;
Feito isso entre no mysql e adicione o usuário de administração&lt;br /&gt;
 INSERT INTO ocp_admin_privileges (username,password,ha1,available_tools,permissions) values ('admin','admin',md5('admin:admin'),'all','all');&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===Adicionando ao cron===&lt;br /&gt;
 cd /var/www/opensips-cp/cron_job&lt;br /&gt;
&lt;br /&gt;
Edite o arquivo generate-cdrs_mysql.sh e altere os parametros de conexão, também altere &lt;br /&gt;
 call opensips_cdrs_1_6();&lt;br /&gt;
para &lt;br /&gt;
 call opensips_cdrs();&lt;br /&gt;
&lt;br /&gt;
Acrescente em seu arquivo /etc/crontab a seguinte entrada&lt;br /&gt;
&lt;br /&gt;
         */3 * * * * root /var/www/opensips-cp/cron_job/generate-cdrs_mysql.sh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Configuração Geral==&lt;br /&gt;
Agora que fizemos as configurações básicas, precisamos gerar as configurações nos módulos que utilizaremos.&lt;br /&gt;
&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/db.inc.php e altere os parametros de banco de dados&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/boxes.global.inc.php , e descomente a linha&lt;br /&gt;
 $boxes[$box_id]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Acessando a interface==&lt;br /&gt;
&lt;br /&gt;
Agora coloque em seu browser http://__SEU__IP__/cp , entre com usuario e senha admin e pronto, você está na tela do opensipscp, através desta você poderá criar usuários e realizar outras operações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ajustando os módulos==&lt;br /&gt;
&lt;br /&gt;
Não sei bem se por erro ou outra razão porém muitos módulos necessitam de alguns ajustes especiais, vamos tratar os mesmos aqui.&lt;br /&gt;
&lt;br /&gt;
===dialog===&lt;br /&gt;
 Arquivo: /var/www/opensips-cp/config/tools/system/dialog/local.inc.php&lt;br /&gt;
Altere o parametro: &lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_proxy_fifo&amp;quot;;;&lt;br /&gt;
para&lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Existem outros módulos ainda que você pode precisar criar algumas tabelas adicionais, porém vamos deixar isso para um outro tutorial, o objetivo deste é apenas por a ferramenta pra funcionar com funcionalidades básicas.&lt;br /&gt;
&lt;br /&gt;
===siptrace===&lt;br /&gt;
&lt;br /&gt;
O siptrace é necessário ativar pois ele não é coberto em nossa instalação, de forma básica, você deve chamar o módulo em seu opensips.cfg (após a configuração do dialog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### SIP TRACE&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;, &amp;quot;TRACE_FLAG&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;trace_on&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;enable_ack_trace&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;traced_user_avp&amp;quot;, &amp;quot;$avp(traced_user)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
finalmente localize a seguinte entrada&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;)) {&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E logo após o setflag, acrescente&lt;br /&gt;
                 trace_dialog();&lt;br /&gt;
&lt;br /&gt;
Altere o arquivo /var/www/opensips-cp/config/tools/system/siptrace/local.inc.php e altere o conteúdo de proxy_list para os ips que você está usando em seu opensips&lt;br /&gt;
 $proxy_list=array(&amp;quot;udp:192.168.0.6:5060&amp;quot;,&amp;quot;tcp:192.168.0.6:5060&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Desta forma o siptrace esta desativado, para ativar durante a execução do seu opensips, basta enviar o comando&lt;br /&gt;
 opensipsctl fifo sip_trace on&lt;br /&gt;
&lt;br /&gt;
Ou então pela propria interface voce pode ativar e desativar o recurso.&lt;br /&gt;
&lt;br /&gt;
Abaixo você pode ver o resultado desta utilização&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.tesliuk.com/imagens/siptrace01.jpg&amp;quot;&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1509</id>
		<title>OpenSIPs CP no Debian com OpenSIPs 1.9</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1509"/>
		<updated>2014-06-19T03:34:49Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Prefacio==&lt;br /&gt;
&lt;br /&gt;
O OpenSIPs CP é um painel de controle para as funções básicas do OpenSIPS sua instalação não é complexa, porém baseado na forma modular do OpenSIPs é necessário entender bem oque você precisa executar/instalar para o correto funcionamento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencias==&lt;br /&gt;
&lt;br /&gt;
Antes de mais nada é preciso ter o OpenSIPs instalado e funcionando, este tutorial é montado sobre a instalação da versão [[Opensips 1.9]] que temos neste wiki, apenas as funcionalidades desta instalação serão cobertas por este tutorial, então siga todas as instruções que descrevemos no tutorial para ter um perfeito funcionamento, logo você entenderá melhor cada função e poderá fazer uma instalação tanto do OpenSIPS quanto do OpenSIPS CP mais customizada para suas necessidades.&lt;br /&gt;
&lt;br /&gt;
===Apache e PHP===&lt;br /&gt;
&lt;br /&gt;
Para rodar esta aplicação precisamos instalar o apache e os módulos de php necessários, se você tiver familiaridade com outro servidor web como lighttpd ou outro fique avontade em testar a instalação, basicamente precisamos do suporte ao php ativado , vamos seguir utilizando o apache pois é o web server que costumo utilizar.&lt;br /&gt;
&lt;br /&gt;
 apt-get install apache2-mpm-prefork libapache2-mod-php5 php5-mysql php5-curl php5-xmlrpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PEAR===&lt;br /&gt;
&lt;br /&gt;
 pear install MDB2&lt;br /&gt;
 pear install MDB2#mysql&lt;br /&gt;
 pear install log&lt;br /&gt;
&lt;br /&gt;
==OpenSIP CP==&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src/&lt;br /&gt;
 wget -c http://downloads.sourceforge.net/project/opensips-cp/opensips-cp/5.0/opensips-cp_5.0.tgz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fopensips-cp%2Ffiles%2F&amp;amp;ts=1403145228&amp;amp;use_mirror=ufpr&lt;br /&gt;
&lt;br /&gt;
 Renomeie o arquivo do download para opensips-cp-5.0.tgz e depois descompacte&lt;br /&gt;
 tar -xzvf opensips-cp-5.0.tgz&lt;br /&gt;
&lt;br /&gt;
==Instalando==&lt;br /&gt;
&lt;br /&gt;
Dentro do diretorio 5.0 temos os seguintes diretórios&lt;br /&gt;
 config - arquivos de configuração para o banco e outras funcionalidades&lt;br /&gt;
 cron_job - arquivos de cron, em especial o arquivo que junta as informações de dialogos para gerar o cdr&lt;br /&gt;
 doc - documentacao&lt;br /&gt;
 web - Arquivos web&lt;br /&gt;
 INSTALL - as mesmas instruções que temos aqui :)&lt;br /&gt;
 README - explicação sobre oque é o que dentro da estrutura&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nós iremos seguir baseado no conteúdo do README&lt;br /&gt;
&lt;br /&gt;
===Copiando os arquivos para o diretorio web===&lt;br /&gt;
 cd /usr/src&lt;br /&gt;
 mv 5.0 /var/www/opensips-cp&lt;br /&gt;
 &lt;br /&gt;
===Criando alias no apache===&lt;br /&gt;
Abra o arquivo /etc/apache2/sites-enable/000-default , acrescente ao fim do arquivo (antes da tag &amp;lt;/VirtualHost&amp;gt;) &lt;br /&gt;
 Alias /cp /var/www/opensips-cp/web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reiniciando o apache===&lt;br /&gt;
 /etc/init.d/apache2 restart&lt;br /&gt;
 chown www-data.www-data /var/www/opensips-cp/config/access.log&lt;br /&gt;
&lt;br /&gt;
===Instalando as tabelas===&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/admin/add_admin&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; ocp_admin_privileges.mysql&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/system/cdrviewer&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
&lt;br /&gt;
Feito isso entre no mysql e adicione o usuário de administração&lt;br /&gt;
 INSERT INTO ocp_admin_privileges (username,password,ha1,available_tools,permissions) values ('admin','admin',md5('admin:admin'),'all','all');&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===Adicionando ao cron===&lt;br /&gt;
 cd /var/www/opensips-cp/cron_job&lt;br /&gt;
&lt;br /&gt;
Edite o arquivo generate-cdrs_mysql.sh e altere os parametros de conexão, também altere &lt;br /&gt;
 call opensips_cdrs_1_6();&lt;br /&gt;
para &lt;br /&gt;
 call opensips_cdrs();&lt;br /&gt;
&lt;br /&gt;
Acrescente em seu arquivo /etc/crontab a seguinte entrada&lt;br /&gt;
&lt;br /&gt;
         */3 * * * * root /var/www/opensips-cp/cron_job/generate-cdrs_mysql.sh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Configuração Geral==&lt;br /&gt;
Agora que fizemos as configurações básicas, precisamos gerar as configurações nos módulos que utilizaremos.&lt;br /&gt;
&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/db.inc.php e altere os parametros de banco de dados&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/boxes.global.inc.php , e descomente a linha&lt;br /&gt;
 $boxes[$box_id]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Acessando a interface==&lt;br /&gt;
&lt;br /&gt;
Agora coloque em seu browser http://__SEU__IP__/cp , entre com usuario e senha admin e pronto, você está na tela do opensipscp, através desta você poderá criar usuários e realizar outras operações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ajustando os módulos==&lt;br /&gt;
&lt;br /&gt;
Não sei bem se por erro ou outra razão porém muitos módulos necessitam de alguns ajustes especiais, vamos tratar os mesmos aqui.&lt;br /&gt;
&lt;br /&gt;
===dialog===&lt;br /&gt;
 Arquivo: /var/www/opensips-cp/config/tools/system/dialog/local.inc.php&lt;br /&gt;
Altere o parametro: &lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_proxy_fifo&amp;quot;;;&lt;br /&gt;
para&lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Existem outros módulos ainda que você pode precisar criar algumas tabelas adicionais, porém vamos deixar isso para um outro tutorial, o objetivo deste é apenas por a ferramenta pra funcionar com funcionalidades básicas.&lt;br /&gt;
&lt;br /&gt;
===siptrace===&lt;br /&gt;
&lt;br /&gt;
O siptrace é necessário ativar pois ele não é coberto em nossa instalação, de forma básica, você deve chamar o módulo em seu opensips.cfg (após a configuração do dialog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### SIP TRACE&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;, &amp;quot;TRACE_FLAG&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;trace_on&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;enable_ack_trace&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;traced_user_avp&amp;quot;, &amp;quot;$avp(traced_user)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
finalmente localize a seguinte entrada&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;)) {&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E logo após o setflag, acrescente&lt;br /&gt;
                 trace_dialog();&lt;br /&gt;
&lt;br /&gt;
Altere o arquivo /var/www/opensips-cp/config/tools/system/siptrace/local.inc.php e altere o conteúdo de proxy_list para os ips que você está usando em seu opensips&lt;br /&gt;
 $proxy_list=array(&amp;quot;udp:192.168.0.6:5060&amp;quot;,&amp;quot;tcp:192.168.0.6:5060&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Desta forma o siptrace esta desativado, para ativar durante a execução do seu opensips, basta enviar o comando&lt;br /&gt;
 opensipsctl fifo sip_trace on&lt;br /&gt;
&lt;br /&gt;
Ou então pela propria interface voce pode ativar e desativar o recurso.&lt;br /&gt;
&lt;br /&gt;
Abaixo você pode ver o resultado desta utilização&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:http://www.tesliuk.com/imagens/siptrace01.jpg]]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1508</id>
		<title>OpenSIPs CP no Debian com OpenSIPs 1.9</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1508"/>
		<updated>2014-06-19T03:34:25Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Prefacio==&lt;br /&gt;
&lt;br /&gt;
O OpenSIPs CP é um painel de controle para as funções básicas do OpenSIPS sua instalação não é complexa, porém baseado na forma modular do OpenSIPs é necessário entender bem oque você precisa executar/instalar para o correto funcionamento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencias==&lt;br /&gt;
&lt;br /&gt;
Antes de mais nada é preciso ter o OpenSIPs instalado e funcionando, este tutorial é montado sobre a instalação da versão [[Opensips 1.9]] que temos neste wiki, apenas as funcionalidades desta instalação serão cobertas por este tutorial, então siga todas as instruções que descrevemos no tutorial para ter um perfeito funcionamento, logo você entenderá melhor cada função e poderá fazer uma instalação tanto do OpenSIPS quanto do OpenSIPS CP mais customizada para suas necessidades.&lt;br /&gt;
&lt;br /&gt;
===Apache e PHP===&lt;br /&gt;
&lt;br /&gt;
Para rodar esta aplicação precisamos instalar o apache e os módulos de php necessários, se você tiver familiaridade com outro servidor web como lighttpd ou outro fique avontade em testar a instalação, basicamente precisamos do suporte ao php ativado , vamos seguir utilizando o apache pois é o web server que costumo utilizar.&lt;br /&gt;
&lt;br /&gt;
 apt-get install apache2-mpm-prefork libapache2-mod-php5 php5-mysql php5-curl php5-xmlrpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PEAR===&lt;br /&gt;
&lt;br /&gt;
 pear install MDB2&lt;br /&gt;
 pear install MDB2#mysql&lt;br /&gt;
 pear install log&lt;br /&gt;
&lt;br /&gt;
==OpenSIP CP==&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src/&lt;br /&gt;
 wget -c http://downloads.sourceforge.net/project/opensips-cp/opensips-cp/5.0/opensips-cp_5.0.tgz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fopensips-cp%2Ffiles%2F&amp;amp;ts=1403145228&amp;amp;use_mirror=ufpr&lt;br /&gt;
&lt;br /&gt;
 Renomeie o arquivo do download para opensips-cp-5.0.tgz e depois descompacte&lt;br /&gt;
 tar -xzvf opensips-cp-5.0.tgz&lt;br /&gt;
&lt;br /&gt;
==Instalando==&lt;br /&gt;
&lt;br /&gt;
Dentro do diretorio 5.0 temos os seguintes diretórios&lt;br /&gt;
 config - arquivos de configuração para o banco e outras funcionalidades&lt;br /&gt;
 cron_job - arquivos de cron, em especial o arquivo que junta as informações de dialogos para gerar o cdr&lt;br /&gt;
 doc - documentacao&lt;br /&gt;
 web - Arquivos web&lt;br /&gt;
 INSTALL - as mesmas instruções que temos aqui :)&lt;br /&gt;
 README - explicação sobre oque é o que dentro da estrutura&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nós iremos seguir baseado no conteúdo do README&lt;br /&gt;
&lt;br /&gt;
===Copiando os arquivos para o diretorio web===&lt;br /&gt;
 cd /usr/src&lt;br /&gt;
 mv 5.0 /var/www/opensips-cp&lt;br /&gt;
 &lt;br /&gt;
===Criando alias no apache===&lt;br /&gt;
Abra o arquivo /etc/apache2/sites-enable/000-default , acrescente ao fim do arquivo (antes da tag &amp;lt;/VirtualHost&amp;gt;) &lt;br /&gt;
 Alias /cp /var/www/opensips-cp/web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reiniciando o apache===&lt;br /&gt;
 /etc/init.d/apache2 restart&lt;br /&gt;
 chown www-data.www-data /var/www/opensips-cp/config/access.log&lt;br /&gt;
&lt;br /&gt;
===Instalando as tabelas===&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/admin/add_admin&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; ocp_admin_privileges.mysql&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/system/cdrviewer&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
&lt;br /&gt;
Feito isso entre no mysql e adicione o usuário de administração&lt;br /&gt;
 INSERT INTO ocp_admin_privileges (username,password,ha1,available_tools,permissions) values ('admin','admin',md5('admin:admin'),'all','all');&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===Adicionando ao cron===&lt;br /&gt;
 cd /var/www/opensips-cp/cron_job&lt;br /&gt;
&lt;br /&gt;
Edite o arquivo generate-cdrs_mysql.sh e altere os parametros de conexão, também altere &lt;br /&gt;
 call opensips_cdrs_1_6();&lt;br /&gt;
para &lt;br /&gt;
 call opensips_cdrs();&lt;br /&gt;
&lt;br /&gt;
Acrescente em seu arquivo /etc/crontab a seguinte entrada&lt;br /&gt;
&lt;br /&gt;
         */3 * * * * root /var/www/opensips-cp/cron_job/generate-cdrs_mysql.sh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Configuração Geral==&lt;br /&gt;
Agora que fizemos as configurações básicas, precisamos gerar as configurações nos módulos que utilizaremos.&lt;br /&gt;
&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/db.inc.php e altere os parametros de banco de dados&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/boxes.global.inc.php , e descomente a linha&lt;br /&gt;
 $boxes[$box_id]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Acessando a interface==&lt;br /&gt;
&lt;br /&gt;
Agora coloque em seu browser http://__SEU__IP__/cp , entre com usuario e senha admin e pronto, você está na tela do opensipscp, através desta você poderá criar usuários e realizar outras operações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ajustando os módulos==&lt;br /&gt;
&lt;br /&gt;
Não sei bem se por erro ou outra razão porém muitos módulos necessitam de alguns ajustes especiais, vamos tratar os mesmos aqui.&lt;br /&gt;
&lt;br /&gt;
===dialog===&lt;br /&gt;
 Arquivo: /var/www/opensips-cp/config/tools/system/dialog/local.inc.php&lt;br /&gt;
Altere o parametro: &lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_proxy_fifo&amp;quot;;;&lt;br /&gt;
para&lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Existem outros módulos ainda que você pode precisar criar algumas tabelas adicionais, porém vamos deixar isso para um outro tutorial, o objetivo deste é apenas por a ferramenta pra funcionar com funcionalidades básicas.&lt;br /&gt;
&lt;br /&gt;
===siptrace===&lt;br /&gt;
&lt;br /&gt;
O siptrace é necessário ativar pois ele não é coberto em nossa instalação, de forma básica, você deve chamar o módulo em seu opensips.cfg (após a configuração do dialog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### SIP TRACE&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;, &amp;quot;TRACE_FLAG&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;trace_on&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;enable_ack_trace&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;traced_user_avp&amp;quot;, &amp;quot;$avp(traced_user)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
finalmente localize a seguinte entrada&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;)) {&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E logo após o setflag, acrescente&lt;br /&gt;
                 trace_dialog();&lt;br /&gt;
&lt;br /&gt;
Altere o arquivo /var/www/opensips-cp/config/tools/system/siptrace/local.inc.php e altere o conteúdo de proxy_list para os ips que você está usando em seu opensips&lt;br /&gt;
 $proxy_list=array(&amp;quot;udp:192.168.0.6:5060&amp;quot;,&amp;quot;tcp:192.168.0.6:5060&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Desta forma o siptrace esta desativado, para ativar durante a execução do seu opensips, basta enviar o comando&lt;br /&gt;
 opensipsctl fifo sip_trace on&lt;br /&gt;
&lt;br /&gt;
Ou então pela propria interface voce pode ativar e desativar o recurso.&lt;br /&gt;
&lt;br /&gt;
Abaixo você pode ver o resultado desta utilização&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.tesliuk.com/imagens/siptrace01.jpg&amp;quot;&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1507</id>
		<title>OpenSIPs CP no Debian com OpenSIPs 1.9</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1507"/>
		<updated>2014-06-19T03:31:38Z</updated>

		<summary type="html">&lt;p&gt;Mike: /* siptrace */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Prefacio==&lt;br /&gt;
&lt;br /&gt;
O OpenSIPs CP é um painel de controle para as funções básicas do OpenSIPS sua instalação não é complexa, porém baseado na forma modular do OpenSIPs é necessário entender bem oque você precisa executar/instalar para o correto funcionamento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencias==&lt;br /&gt;
&lt;br /&gt;
Antes de mais nada é preciso ter o OpenSIPs instalado e funcionando, este tutorial é montado sobre a instalação da versão [[Opensips 1.9]] que temos neste wiki, apenas as funcionalidades desta instalação serão cobertas por este tutorial, então siga todas as instruções que descrevemos no tutorial para ter um perfeito funcionamento, logo você entenderá melhor cada função e poderá fazer uma instalação tanto do OpenSIPS quanto do OpenSIPS CP mais customizada para suas necessidades.&lt;br /&gt;
&lt;br /&gt;
===Apache e PHP===&lt;br /&gt;
&lt;br /&gt;
Para rodar esta aplicação precisamos instalar o apache e os módulos de php necessários, se você tiver familiaridade com outro servidor web como lighttpd ou outro fique avontade em testar a instalação, basicamente precisamos do suporte ao php ativado , vamos seguir utilizando o apache pois é o web server que costumo utilizar.&lt;br /&gt;
&lt;br /&gt;
 apt-get install apache2-mpm-prefork libapache2-mod-php5 php5-mysql php5-curl php5-xmlrpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PEAR===&lt;br /&gt;
&lt;br /&gt;
 pear install MDB2&lt;br /&gt;
 pear install MDB2#mysql&lt;br /&gt;
 pear install log&lt;br /&gt;
&lt;br /&gt;
==OpenSIP CP==&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src/&lt;br /&gt;
 wget -c http://downloads.sourceforge.net/project/opensips-cp/opensips-cp/5.0/opensips-cp_5.0.tgz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fopensips-cp%2Ffiles%2F&amp;amp;ts=1403145228&amp;amp;use_mirror=ufpr&lt;br /&gt;
&lt;br /&gt;
 Renomeie o arquivo do download para opensips-cp-5.0.tgz e depois descompacte&lt;br /&gt;
 tar -xzvf opensips-cp-5.0.tgz&lt;br /&gt;
&lt;br /&gt;
==Instalando==&lt;br /&gt;
&lt;br /&gt;
Dentro do diretorio 5.0 temos os seguintes diretórios&lt;br /&gt;
 config - arquivos de configuração para o banco e outras funcionalidades&lt;br /&gt;
 cron_job - arquivos de cron, em especial o arquivo que junta as informações de dialogos para gerar o cdr&lt;br /&gt;
 doc - documentacao&lt;br /&gt;
 web - Arquivos web&lt;br /&gt;
 INSTALL - as mesmas instruções que temos aqui :)&lt;br /&gt;
 README - explicação sobre oque é o que dentro da estrutura&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nós iremos seguir baseado no conteúdo do README&lt;br /&gt;
&lt;br /&gt;
===Copiando os arquivos para o diretorio web===&lt;br /&gt;
 cd /usr/src&lt;br /&gt;
 mv 5.0 /var/www/opensips-cp&lt;br /&gt;
 &lt;br /&gt;
===Criando alias no apache===&lt;br /&gt;
Abra o arquivo /etc/apache2/sites-enable/000-default , acrescente ao fim do arquivo (antes da tag &amp;lt;/VirtualHost&amp;gt;) &lt;br /&gt;
 Alias /cp /var/www/opensips-cp/web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reiniciando o apache===&lt;br /&gt;
 /etc/init.d/apache2 restart&lt;br /&gt;
 chown www-data.www-data /var/www/opensips-cp/config/access.log&lt;br /&gt;
&lt;br /&gt;
===Instalando as tabelas===&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/admin/add_admin&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; ocp_admin_privileges.mysql&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/system/cdrviewer&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
&lt;br /&gt;
Feito isso entre no mysql e adicione o usuário de administração&lt;br /&gt;
 INSERT INTO ocp_admin_privileges (username,password,ha1,available_tools,permissions) values ('admin','admin',md5('admin:admin'),'all','all');&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===Adicionando ao cron===&lt;br /&gt;
 cd /var/www/opensips-cp/cron_job&lt;br /&gt;
&lt;br /&gt;
Edite o arquivo generate-cdrs_mysql.sh e altere os parametros de conexão, também altere &lt;br /&gt;
 call opensips_cdrs_1_6();&lt;br /&gt;
para &lt;br /&gt;
 call opensips_cdrs();&lt;br /&gt;
&lt;br /&gt;
Acrescente em seu arquivo /etc/crontab a seguinte entrada&lt;br /&gt;
&lt;br /&gt;
         */3 * * * * root /var/www/opensips-cp/cron_job/generate-cdrs_mysql.sh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Configuração Geral==&lt;br /&gt;
Agora que fizemos as configurações básicas, precisamos gerar as configurações nos módulos que utilizaremos.&lt;br /&gt;
&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/db.inc.php e altere os parametros de banco de dados&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/boxes.global.inc.php , e descomente a linha&lt;br /&gt;
 $boxes[$box_id]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Acessando a interface==&lt;br /&gt;
&lt;br /&gt;
Agora coloque em seu browser http://__SEU__IP__/cp , entre com usuario e senha admin e pronto, você está na tela do opensipscp, através desta você poderá criar usuários e realizar outras operações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ajustando os módulos==&lt;br /&gt;
&lt;br /&gt;
Não sei bem se por erro ou outra razão porém muitos módulos necessitam de alguns ajustes especiais, vamos tratar os mesmos aqui.&lt;br /&gt;
&lt;br /&gt;
===dialog===&lt;br /&gt;
 Arquivo: /var/www/opensips-cp/config/tools/system/dialog/local.inc.php&lt;br /&gt;
Altere o parametro: &lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_proxy_fifo&amp;quot;;;&lt;br /&gt;
para&lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Existem outros módulos ainda que você pode precisar criar algumas tabelas adicionais, porém vamos deixar isso para um outro tutorial, o objetivo deste é apenas por a ferramenta pra funcionar com funcionalidades básicas.&lt;br /&gt;
&lt;br /&gt;
===siptrace===&lt;br /&gt;
&lt;br /&gt;
O siptrace é necessário ativar pois ele não é coberto em nossa instalação, de forma básica, você deve chamar o módulo em seu opensips.cfg (após a configuração do dialog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### SIP TRACE&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;, &amp;quot;TRACE_FLAG&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;trace_on&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;enable_ack_trace&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;traced_user_avp&amp;quot;, &amp;quot;$avp(traced_user)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
finalmente localize a seguinte entrada&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;)) {&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E logo após o setflag, acrescente&lt;br /&gt;
                 trace_dialog();&lt;br /&gt;
&lt;br /&gt;
Altere o arquivo /var/www/opensips-cp/config/tools/system/siptrace/local.inc.php e altere o conteúdo de proxy_list para os ips que você está usando em seu opensips&lt;br /&gt;
 $proxy_list=array(&amp;quot;udp:192.168.0.6:5060&amp;quot;,&amp;quot;tcp:192.168.0.6:5060&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Desta forma o siptrace esta desativado, para ativar durante a execução do seu opensips, basta enviar o comando&lt;br /&gt;
 opensipsctl fifo sip_trace on&lt;br /&gt;
&lt;br /&gt;
Ou então pela propria interface voce pode ativar e desativar o recurso.&lt;br /&gt;
&lt;br /&gt;
Abaixo você pode ver o resultado desta utilização&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Siptrace01.png]]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1506</id>
		<title>OpenSIPs CP no Debian com OpenSIPs 1.9</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1506"/>
		<updated>2014-06-19T03:30:20Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Prefacio==&lt;br /&gt;
&lt;br /&gt;
O OpenSIPs CP é um painel de controle para as funções básicas do OpenSIPS sua instalação não é complexa, porém baseado na forma modular do OpenSIPs é necessário entender bem oque você precisa executar/instalar para o correto funcionamento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencias==&lt;br /&gt;
&lt;br /&gt;
Antes de mais nada é preciso ter o OpenSIPs instalado e funcionando, este tutorial é montado sobre a instalação da versão [[Opensips 1.9]] que temos neste wiki, apenas as funcionalidades desta instalação serão cobertas por este tutorial, então siga todas as instruções que descrevemos no tutorial para ter um perfeito funcionamento, logo você entenderá melhor cada função e poderá fazer uma instalação tanto do OpenSIPS quanto do OpenSIPS CP mais customizada para suas necessidades.&lt;br /&gt;
&lt;br /&gt;
===Apache e PHP===&lt;br /&gt;
&lt;br /&gt;
Para rodar esta aplicação precisamos instalar o apache e os módulos de php necessários, se você tiver familiaridade com outro servidor web como lighttpd ou outro fique avontade em testar a instalação, basicamente precisamos do suporte ao php ativado , vamos seguir utilizando o apache pois é o web server que costumo utilizar.&lt;br /&gt;
&lt;br /&gt;
 apt-get install apache2-mpm-prefork libapache2-mod-php5 php5-mysql php5-curl php5-xmlrpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PEAR===&lt;br /&gt;
&lt;br /&gt;
 pear install MDB2&lt;br /&gt;
 pear install MDB2#mysql&lt;br /&gt;
 pear install log&lt;br /&gt;
&lt;br /&gt;
==OpenSIP CP==&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src/&lt;br /&gt;
 wget -c http://downloads.sourceforge.net/project/opensips-cp/opensips-cp/5.0/opensips-cp_5.0.tgz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fopensips-cp%2Ffiles%2F&amp;amp;ts=1403145228&amp;amp;use_mirror=ufpr&lt;br /&gt;
&lt;br /&gt;
 Renomeie o arquivo do download para opensips-cp-5.0.tgz e depois descompacte&lt;br /&gt;
 tar -xzvf opensips-cp-5.0.tgz&lt;br /&gt;
&lt;br /&gt;
==Instalando==&lt;br /&gt;
&lt;br /&gt;
Dentro do diretorio 5.0 temos os seguintes diretórios&lt;br /&gt;
 config - arquivos de configuração para o banco e outras funcionalidades&lt;br /&gt;
 cron_job - arquivos de cron, em especial o arquivo que junta as informações de dialogos para gerar o cdr&lt;br /&gt;
 doc - documentacao&lt;br /&gt;
 web - Arquivos web&lt;br /&gt;
 INSTALL - as mesmas instruções que temos aqui :)&lt;br /&gt;
 README - explicação sobre oque é o que dentro da estrutura&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nós iremos seguir baseado no conteúdo do README&lt;br /&gt;
&lt;br /&gt;
===Copiando os arquivos para o diretorio web===&lt;br /&gt;
 cd /usr/src&lt;br /&gt;
 mv 5.0 /var/www/opensips-cp&lt;br /&gt;
 &lt;br /&gt;
===Criando alias no apache===&lt;br /&gt;
Abra o arquivo /etc/apache2/sites-enable/000-default , acrescente ao fim do arquivo (antes da tag &amp;lt;/VirtualHost&amp;gt;) &lt;br /&gt;
 Alias /cp /var/www/opensips-cp/web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reiniciando o apache===&lt;br /&gt;
 /etc/init.d/apache2 restart&lt;br /&gt;
 chown www-data.www-data /var/www/opensips-cp/config/access.log&lt;br /&gt;
&lt;br /&gt;
===Instalando as tabelas===&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/admin/add_admin&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; ocp_admin_privileges.mysql&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/system/cdrviewer&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
&lt;br /&gt;
Feito isso entre no mysql e adicione o usuário de administração&lt;br /&gt;
 INSERT INTO ocp_admin_privileges (username,password,ha1,available_tools,permissions) values ('admin','admin',md5('admin:admin'),'all','all');&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===Adicionando ao cron===&lt;br /&gt;
 cd /var/www/opensips-cp/cron_job&lt;br /&gt;
&lt;br /&gt;
Edite o arquivo generate-cdrs_mysql.sh e altere os parametros de conexão, também altere &lt;br /&gt;
 call opensips_cdrs_1_6();&lt;br /&gt;
para &lt;br /&gt;
 call opensips_cdrs();&lt;br /&gt;
&lt;br /&gt;
Acrescente em seu arquivo /etc/crontab a seguinte entrada&lt;br /&gt;
&lt;br /&gt;
         */3 * * * * root /var/www/opensips-cp/cron_job/generate-cdrs_mysql.sh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Configuração Geral==&lt;br /&gt;
Agora que fizemos as configurações básicas, precisamos gerar as configurações nos módulos que utilizaremos.&lt;br /&gt;
&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/db.inc.php e altere os parametros de banco de dados&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/boxes.global.inc.php , e descomente a linha&lt;br /&gt;
 $boxes[$box_id]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Acessando a interface==&lt;br /&gt;
&lt;br /&gt;
Agora coloque em seu browser http://__SEU__IP__/cp , entre com usuario e senha admin e pronto, você está na tela do opensipscp, através desta você poderá criar usuários e realizar outras operações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Ajustando os módulos==&lt;br /&gt;
&lt;br /&gt;
Não sei bem se por erro ou outra razão porém muitos módulos necessitam de alguns ajustes especiais, vamos tratar os mesmos aqui.&lt;br /&gt;
&lt;br /&gt;
===dialog===&lt;br /&gt;
 Arquivo: /var/www/opensips-cp/config/tools/system/dialog/local.inc.php&lt;br /&gt;
Altere o parametro: &lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_proxy_fifo&amp;quot;;;&lt;br /&gt;
para&lt;br /&gt;
  $box[1]['mi']['conn']=&amp;quot;/tmp/opensips_fifo&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Existem outros módulos ainda que você pode precisar criar algumas tabelas adicionais, porém vamos deixar isso para um outro tutorial, o objetivo deste é apenas por a ferramenta pra funcionar com funcionalidades básicas.&lt;br /&gt;
&lt;br /&gt;
===siptrace===&lt;br /&gt;
&lt;br /&gt;
O siptrace é necessário ativar pois ele não é coberto em nossa instalação, de forma básica, você deve chamar o módulo em seu opensips.cfg (após a configuração do dialog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
### SIP TRACE&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;, &amp;quot;TRACE_FLAG&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;trace_on&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;enable_ack_trace&amp;quot;, 1)&lt;br /&gt;
modparam(&amp;quot;siptrace&amp;quot;, &amp;quot;traced_user_avp&amp;quot;, &amp;quot;$avp(traced_user)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
finalmente localize a seguinte entrada&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;)) {&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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
E logo após o setflag, acrescente&lt;br /&gt;
                 trace_dialog();&lt;br /&gt;
&lt;br /&gt;
Altere o arquivo /var/www/opensips-cp/config/tools/system/siptrace/local.inc.php e altere o conteúdo de proxy_list para os ips que você está usando em seu opensips&lt;br /&gt;
 $proxy_list=array(&amp;quot;udp:192.168.0.6:5060&amp;quot;,&amp;quot;tcp:192.168.0.6:5060&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Desta forma o siptrace esta desativado, para ativar durante a execução do seu opensips, basta enviar o comando&lt;br /&gt;
 opensipsctl fifo sip_trace on&lt;br /&gt;
&lt;br /&gt;
Ou então pela propria interface voce pode ativar e desativar o recurso.&lt;br /&gt;
&lt;br /&gt;
Abaixo você pode ver o resultado desta utilização&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Siptrace01.jpg]]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1505</id>
		<title>OpenSIPs CP no Debian com OpenSIPs 1.9</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1505"/>
		<updated>2014-06-19T02:57:10Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Prefacio==&lt;br /&gt;
&lt;br /&gt;
O OpenSIPs CP é um painel de controle para as funções básicas do OpenSIPS sua instalação não é complexa, porém baseado na forma modular do OpenSIPs é necessário entender bem oque você precisa executar/instalar para o correto funcionamento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencias==&lt;br /&gt;
&lt;br /&gt;
Antes de mais nada é preciso ter o OpenSIPs instalado e funcionando, este tutorial é montado sobre a instalação da versão [[Opensips 1.9]] que temos neste wiki, apenas as funcionalidades desta instalação serão cobertas por este tutorial, então siga todas as instruções que descrevemos no tutorial para ter um perfeito funcionamento, logo você entenderá melhor cada função e poderá fazer uma instalação tanto do OpenSIPS quanto do OpenSIPS CP mais customizada para suas necessidades.&lt;br /&gt;
&lt;br /&gt;
===Apache e PHP===&lt;br /&gt;
&lt;br /&gt;
Para rodar esta aplicação precisamos instalar o apache e os módulos de php necessários, se você tiver familiaridade com outro servidor web como lighttpd ou outro fique avontade em testar a instalação, basicamente precisamos do suporte ao php ativado , vamos seguir utilizando o apache pois é o web server que costumo utilizar.&lt;br /&gt;
&lt;br /&gt;
 apt-get install apache2-mpm-prefork libapache2-mod-php5 php5-mysql php5-curl php5-xmlrpc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PEAR===&lt;br /&gt;
&lt;br /&gt;
 pear install MDB2&lt;br /&gt;
 pear install MDB2#mysql&lt;br /&gt;
 pear install log&lt;br /&gt;
&lt;br /&gt;
==OpenSIP CP==&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src/&lt;br /&gt;
 wget -c http://downloads.sourceforge.net/project/opensips-cp/opensips-cp/5.0/opensips-cp_5.0.tgz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fopensips-cp%2Ffiles%2F&amp;amp;ts=1403145228&amp;amp;use_mirror=ufpr&lt;br /&gt;
&lt;br /&gt;
 Renomeie o arquivo do download para opensips-cp-5.0.tgz e depois descompacte&lt;br /&gt;
 tar -xzvf opensips-cp-5.0.tgz&lt;br /&gt;
&lt;br /&gt;
==Instalando==&lt;br /&gt;
&lt;br /&gt;
Dentro do diretorio 5.0 temos os seguintes diretórios&lt;br /&gt;
 config - arquivos de configuração para o banco e outras funcionalidades&lt;br /&gt;
 cron_job - arquivos de cron, em especial o arquivo que junta as informações de dialogos para gerar o cdr&lt;br /&gt;
 doc - documentacao&lt;br /&gt;
 web - Arquivos web&lt;br /&gt;
 INSTALL - as mesmas instruções que temos aqui :)&lt;br /&gt;
 README - explicação sobre oque é o que dentro da estrutura&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nós iremos seguir baseado no conteúdo do README&lt;br /&gt;
&lt;br /&gt;
===Copiando os arquivos para o diretorio web===&lt;br /&gt;
 cd /usr/src&lt;br /&gt;
 mv 5.0 /var/www/opensips-cp&lt;br /&gt;
 &lt;br /&gt;
===Criando alias no apache===&lt;br /&gt;
Abra o arquivo /etc/apache2/sites-enable/000-default , acrescente ao fim do arquivo (antes da tag &amp;lt;/VirtualHost&amp;gt;) &lt;br /&gt;
 Alias /cp /var/www/opensips-cp/web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Reiniciando o apache===&lt;br /&gt;
 /etc/init.d/apache2 restart&lt;br /&gt;
 chown www-data.www-data /var/www/opensips-cp/config/access.log&lt;br /&gt;
&lt;br /&gt;
===Instalando as tabelas===&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/admin/add_admin&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; ocp_admin_privileges.mysql&lt;br /&gt;
&lt;br /&gt;
 cd /var/www/opensips-cp/config/tools/system/cdrviewer&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
 mysql -uopensips -popensipsrw opensips &amp;lt; cdrs.mysql&lt;br /&gt;
&lt;br /&gt;
Feito isso entre no mysql e adicione o usuário de administração&lt;br /&gt;
 INSERT INTO ocp_admin_privileges (username,password,ha1,available_tools,permissions) values ('admin','admin',md5('admin:admin'),'all','all');&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
===Adicionando ao cron===&lt;br /&gt;
 cd /var/www/opensips-cp/cron_job&lt;br /&gt;
&lt;br /&gt;
Edite o arquivo generate-cdrs_mysql.sh e altere os parametros de conexão, também altere &lt;br /&gt;
 call opensips_cdrs_1_6();&lt;br /&gt;
para &lt;br /&gt;
 call opensips_cdrs();&lt;br /&gt;
&lt;br /&gt;
Acrescente em seu arquivo /etc/crontab a seguinte entrada&lt;br /&gt;
&lt;br /&gt;
         */3 * * * * root /var/www/opensips-cp/cron_job/generate-cdrs_mysql.sh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Configuração Geral==&lt;br /&gt;
Agora que fizemos as configurações básicas, precisamos gerar as configurações nos módulos que utilizaremos.&lt;br /&gt;
&lt;br /&gt;
Abra o arquivo /var/www/opensips-cp/config/db.inc.php e altere os parametros de banco de dados&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Opensips_1.9&amp;diff=1504</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=1504"/>
		<updated>2014-06-19T02:19:10Z</updated>

		<summary type="html">&lt;p&gt;Mike: /* Criando um alias */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Opensips_1.9&amp;diff=1503</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=1503"/>
		<updated>2014-06-19T02:16:49Z</updated>

		<summary type="html">&lt;p&gt;Mike: /* Arquivo de inicialização */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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 NOME_DO_USUARIO&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>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1502</id>
		<title>OpenSIPs CP no Debian com OpenSIPs 1.9</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPs_CP_no_Debian_com_OpenSIPs_1.9&amp;diff=1502"/>
		<updated>2014-06-19T01:55:03Z</updated>

		<summary type="html">&lt;p&gt;Mike: Criou página com '==Prefacio==  O OpenSIPs CP é um painel de controle para as funções básicas do OpenSIPS sua instalação não é complexa, porém baseado na forma modular do OpenSIPs é n...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Prefacio==&lt;br /&gt;
&lt;br /&gt;
O OpenSIPs CP é um painel de controle para as funções básicas do OpenSIPS sua instalação não é complexa, porém baseado na forma modular do OpenSIPs é necessário entender bem oque você precisa executar/instalar para o correto funcionamento.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dependencias==&lt;br /&gt;
&lt;br /&gt;
Antes de mais nada é preciso ter o OpenSIPs instalado e funcionando, este tutorial é montado sobre a instalação da versão [[Opensips 1.9]] que temos neste wiki, apenas as funcionalidades desta instalação serão cobertas por este tutorial, então siga todas as instruções que descrevemos no tutorial para ter um perfeito funcionamento, logo você entenderá melhor cada função e poderá fazer uma instalação tanto do OpenSIPS quanto do OpenSIPS CP mais customizada para suas necessidades.&lt;br /&gt;
&lt;br /&gt;
===Apache e PHP===&lt;br /&gt;
&lt;br /&gt;
Para rodar esta aplicação precisamos instalar o apache e os módulos de php necessários, se você tiver familiaridade com outro servidor web como lighttpd ou outro fique avontade em testar a instalação, basicamente precisamos do suporte ao php ativado , vamos seguir utilizando o apache pois é o web server que costumo utilizar.&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Opensips_1.9&amp;diff=1501</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=1501"/>
		<updated>2014-06-19T01:49:27Z</updated>

		<summary type="html">&lt;p&gt;Mike: /* opensipsctlrc */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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 NOME_DO_USUARIO&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>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Opensips_1.9&amp;diff=1500</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=1500"/>
		<updated>2014-06-19T01:47:31Z</updated>

		<summary type="html">&lt;p&gt;Mike: /* Configuração */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
ALIAS_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;
&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 NOME_DO_USUARIO&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>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Opensips_1.9&amp;diff=1499</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=1499"/>
		<updated>2014-06-19T01:42:44Z</updated>

		<summary type="html">&lt;p&gt;Mike: /* Dependencias */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
 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;
ALIAS_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;
&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 NOME_DO_USUARIO&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>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Opensips_1.9&amp;diff=1498</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=1498"/>
		<updated>2014-06-19T01:39:35Z</updated>

		<summary type="html">&lt;p&gt;Mike: /* Compilação */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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 &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;
 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;
ALIAS_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;
&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 NOME_DO_USUARIO&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>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Documentacoes&amp;diff=1497</id>
		<title>Documentacoes</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Documentacoes&amp;diff=1497"/>
		<updated>2014-06-19T01:33:45Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==[[OpenSIPs e Asterisk]]==&lt;br /&gt;
Configuração de um OpenSIPs com Asterisk&lt;br /&gt;
&lt;br /&gt;
==[[OpenSIPs e Asterisk - LIKE CentOS]]==&lt;br /&gt;
Fork do documento original do Mike portado para CentOS 6.4 &lt;br /&gt;
&lt;br /&gt;
==[[Opensips 1.9]]==&lt;br /&gt;
Tutorial de compilação e instalação do OpenSIPS 1.9 utilizando os &lt;br /&gt;
recursos de geração de arquivo&lt;br /&gt;
&lt;br /&gt;
==[[Opensips com RASPBERRY PI]]==&lt;br /&gt;
Tutorial mostrando como é possivel utilizar o Raspberry PI com OpenSIPS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==[[Opensips NAT Script com RTPproxy]]==&lt;br /&gt;
Script simples apenas para demonstrar configuracao de nat&lt;br /&gt;
&lt;br /&gt;
==[[Oopensips Nat script with RTPPROXY - English]]==&lt;br /&gt;
A simple script just to show how to implement the nat on opensips&lt;br /&gt;
&lt;br /&gt;
==[[OpenSIPs CP no Debian com OpenSIPs 1.9]]==&lt;br /&gt;
Instalação do OpenSIPs CP utilizando a instalação de [[Opensips 1.9]] deste wiki&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Comandos_do_Core_para_MI&amp;diff=1496</id>
		<title>Comandos do Core para MI</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Comandos_do_Core_para_MI&amp;diff=1496"/>
		<updated>2014-04-24T21:17:25Z</updated>

		<summary type="html">&lt;p&gt;Mike: Criou página com 'Funções para MI (management interface) suportados pelo core do '''OpenSIPS'''.   ==arq==  Retorna a lista completa de argumentos usados quando o '''OpenSIPS''' é iniciado. ...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Funções para MI (management interface) suportados pelo core do '''OpenSIPS'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==arq==&lt;br /&gt;
&lt;br /&gt;
Retorna a lista completa de argumentos usados quando o '''OpenSIPS''' é iniciado. Como no UNIX, o primeiro argumento é o nome do executavel.&lt;br /&gt;
&lt;br /&gt;
'''Argumentos''': não\\&lt;br /&gt;
'''Saída''': Várias saidas (nodes), cada node contem um argumento, a saída não possui nome, apenas valores.&lt;br /&gt;
&lt;br /&gt;
Exemplo de uso:&lt;br /&gt;
&lt;br /&gt;
    # opensipsctl fifo arg&lt;br /&gt;
    ./opensips&lt;br /&gt;
    -f&lt;br /&gt;
    /etc/openser/test.cfg&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==debug [level]==&lt;br /&gt;
&lt;br /&gt;
Verifica ou define o valor para a variável de debug do core, você pode utilizar para dinamicamente (durante a execução) alterar ou inspecionar o level de debug de seu '''OpenSIPS''' . Se nenhum argumento for passado a função irá exibir o nivel de debug atual.&lt;br /&gt;
&lt;br /&gt;
'''Argumentos''': nivel de debug (-3...4)&lt;br /&gt;
'''Saída''': Nivel de debug (apenas se não for informado um argumento), o valor será retornado como um unico node (unica linha) com o nome &amp;quot;DEBUG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Exemplo de uso:&lt;br /&gt;
&lt;br /&gt;
    # opensipsctl fifo debug&lt;br /&gt;
    DEBUG:: 4&lt;br /&gt;
    # opensipsctl fifo debug 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==kill==&lt;br /&gt;
&lt;br /&gt;
O comando ao ser executado irá encerrar o processo do &lt;br /&gt;
The command will terminate '''OpenSIPS''' (and internal shutdown).\\&lt;br /&gt;
'''Arguments''': none\\&lt;br /&gt;
'''Output''': none&lt;br /&gt;
&lt;br /&gt;
Examples of usage:&lt;br /&gt;
[@&lt;br /&gt;
    # opensipsctl fifo kill&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!list_blacklists&lt;br /&gt;
The command lists all the defined (static or learned) blacklists from '''OpenSIPS'''.\\&lt;br /&gt;
'''Arguments''': none\\&lt;br /&gt;
'''Output''': an MI tree - first level (nodes named &amp;quot;List&amp;quot;) will describe the list (name, owner, flags); Second level (nodes named &amp;quot;Rules) will describe the rules (blacklists) for each list (IP/mask, protocol, port, matching regexp, flags)&lt;br /&gt;
&lt;br /&gt;
Examples of usage:&lt;br /&gt;
[@&lt;br /&gt;
    # opensipsctl fifo list_blacklists&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!list_tcp_conns&lt;br /&gt;
The command lists all ongoing TCP/TLS connection from '''OpenSIPS'''.\\&lt;br /&gt;
'''Arguments''': none\\&lt;br /&gt;
'''Output''': an MI tree - one record per connection with the following attributes : ID, state, proto, source, destination, timeout, lifetime&lt;br /&gt;
&lt;br /&gt;
Examples of usage:&lt;br /&gt;
[@&lt;br /&gt;
    # opensipsctl fifo list_tcp_conns&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!ps&lt;br /&gt;
The command will list all all '''OpenSIPS''' processes, along with type and description.\\&lt;br /&gt;
'''Arguments''': none\\&lt;br /&gt;
'''Output''': multiple MI nodes (named &amp;quot;Process&amp;quot;) - each node contains process ID (internal), PID (OS), Type and description &lt;br /&gt;
&lt;br /&gt;
Examples of usage:&lt;br /&gt;
[@&lt;br /&gt;
    # opensipsctl fifo ps&lt;br /&gt;
    Process::  ID=0 PID=16224 Type=attendant&lt;br /&gt;
    Process::  ID=1 PID=16225 Type=SIP receiver udp:192.168.1.2:5060 &lt;br /&gt;
    Process::  ID=2 PID=16226 Type=timer&lt;br /&gt;
    Process::  ID=3 PID=16227 Type=MI FIFO&lt;br /&gt;
    Process::  ID=4 PID=16228 Type=TCP receiver&lt;br /&gt;
    Process::  ID=5 PID=16230 Type=TCP main&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!pwd&lt;br /&gt;
Prints the working directory of '''OpenSIPS''' instance.\\&lt;br /&gt;
'''Arguments''': none\\&lt;br /&gt;
'''Output''': a single MI node with name &amp;quot;WD&amp;quot; containing the working directory full path.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples of usage:&lt;br /&gt;
[@&lt;br /&gt;
    # opensipsctl fifo pwd&lt;br /&gt;
    WD:: /&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!uptime&lt;br /&gt;
Prints various time information about '''OpenSIPS''' - when it started to run, for how long it runs.\\&lt;br /&gt;
'''Arguments''': none\\&lt;br /&gt;
'''Output''': three MI nodes: &amp;quot;Now&amp;quot; - current time; &amp;quot;Up since&amp;quot; - start time ; &amp;quot;Up time&amp;quot; - number of seconds since started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examples of usage:&lt;br /&gt;
[@&lt;br /&gt;
    # opensipsctl fifo uptime&lt;br /&gt;
    Now:: Mon Jul 21 17:41:03 2008&lt;br /&gt;
    Up since:: Mon Jul 21 17:36:33 2008&lt;br /&gt;
    Up time:: 270 [sec]&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!version&lt;br /&gt;
Prints the version string of a running'''OpenSIPS'''.\\&lt;br /&gt;
'''Arguments''': none\\&lt;br /&gt;
'''Output''': one MI node (named &amp;quot;Server&amp;quot;) containing the version string.&lt;br /&gt;
&lt;br /&gt;
Examples of usage:&lt;br /&gt;
[@&lt;br /&gt;
    # opensipsctl fifo version&lt;br /&gt;
    Server:: OpenSIPS (1.4.0dev14-notls (i386/linux))&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!which&lt;br /&gt;
Prints all available MI commands from the queried '''OpenSIPS'''instance.\\&lt;br /&gt;
'''Arguments''': none\\&lt;br /&gt;
'''Output''': multiple MI nodes (no name), each node containing (as value) the name of an available MI command. NOTE that the list of available MI commands may differ depending of what modules your '''OpenSIPS''' is using.&lt;br /&gt;
&lt;br /&gt;
Examples of usage:&lt;br /&gt;
[@&lt;br /&gt;
    # opensipsctl fifo which&lt;br /&gt;
    get_statistics&lt;br /&gt;
    reset_statistics&lt;br /&gt;
    uptime&lt;br /&gt;
    version&lt;br /&gt;
    pwd&lt;br /&gt;
    arg&lt;br /&gt;
    which&lt;br /&gt;
    ps&lt;br /&gt;
    kill&lt;br /&gt;
    debug&lt;br /&gt;
    list_blacklists&lt;br /&gt;
    ul_rm&lt;br /&gt;
    ul_rm_contact&lt;br /&gt;
    ul_dump&lt;br /&gt;
    ul_flush&lt;br /&gt;
    ul_add&lt;br /&gt;
    ul_show_contact&lt;br /&gt;
    nh_enable_ping&lt;br /&gt;
    nh_enable_rtpp&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!get_statistics&lt;br /&gt;
Prints the statistics (all, group or one) realtime values.\\&lt;br /&gt;
'''Arguments''': input may be &amp;quot;all&amp;quot; - print all available statistics; &amp;quot;group:&amp;quot; - print only statistics from a certain group; &amp;quot;name&amp;quot; - print only this statistic. The '''OpenSIPS''' core defines the following groups: ''core'', ''shmem''; Modules export groups typically named like the module itself.\\&lt;br /&gt;
'''Output''': list of MI nodes (no name) - each MI mode contains the name and value of a single statistic variable.&lt;br /&gt;
&lt;br /&gt;
Examples of usage:&lt;br /&gt;
[@&lt;br /&gt;
    # opensipsctl fifo get_statistics rcv_requests&lt;br /&gt;
    core:rcv_requests = 35243&lt;br /&gt;
    # opensipsctl fifo get_statistics shmem:      &lt;br /&gt;
    shmem:total_size = 33554432&lt;br /&gt;
    shmem:used_size = 1686952&lt;br /&gt;
    shmem:real_used_size = 1704592&lt;br /&gt;
    shmem:max_used_size = 1704592&lt;br /&gt;
    shmem:free_size = 31849840&lt;br /&gt;
    shmem:fragments = 1&lt;br /&gt;
    # opensipsctl fifo get_statistics all&lt;br /&gt;
    ....&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!reset_statistics&lt;br /&gt;
Reset (to zero) the value of a statistic variable. Note that not all variables allow reset (depending of the nature of the information they carry - example &amp;quot;shmem:used_size&amp;quot;).\\&lt;br /&gt;
'''Arguments''': name of the variable to be reset.\\&lt;br /&gt;
'''Output''': none.&lt;br /&gt;
&lt;br /&gt;
Examples of usage:&lt;br /&gt;
[@&lt;br /&gt;
    # opensipsctl fifo get_statistics received_replies&lt;br /&gt;
    core:received_replies = 14543&lt;br /&gt;
    # opensipsctl fifo reset_statistics received_replies&lt;br /&gt;
    # opensipsctl fifo get_statistics received_replies&lt;br /&gt;
    core:received_replies = 0&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!cache_store&lt;br /&gt;
This command stores in a cache system a string value.\\&lt;br /&gt;
'''Arguments''': \\&lt;br /&gt;
   - cache system to use - for the cache system implemented by '''OpenSIPS''' module 'localcache' the value of this parameter should be 'local' \\&lt;br /&gt;
   - the label to be associated with this value \\&lt;br /&gt;
   - the string to be stored \\&lt;br /&gt;
'''Output''': none. \\&lt;br /&gt;
&lt;br /&gt;
Examples of usage:&lt;br /&gt;
[@&lt;br /&gt;
    # opensipsctl fifo cache_store local password_user1 password&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!cache_fetch&lt;br /&gt;
This command queries for a stored value.\\&lt;br /&gt;
'''Arguments''': \\&lt;br /&gt;
   - cache system to use - for the cache system implemented by '''OpenSIPS''' module 'localcache' the value of this parameter should be 'local' \\&lt;br /&gt;
   - the label associated with the value \\&lt;br /&gt;
'''Output''': MI tree containing the value if a record is found or 'Value not found' string otherwise.\\&lt;br /&gt;
&lt;br /&gt;
Examples of usage:&lt;br /&gt;
[@&lt;br /&gt;
    # opensipsctl fifo cache_fetch local password_user1&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!cache_remove&lt;br /&gt;
This command removes a record from the cache system.\\&lt;br /&gt;
'''Arguments''': \\&lt;br /&gt;
   - cache system to use\\&lt;br /&gt;
  - the label associated with the stored value \\&lt;br /&gt;
'''Output''': None.\\&lt;br /&gt;
Examples of usage:&lt;br /&gt;
[@&lt;br /&gt;
    # opensipsctl fifo cache_remove local password_user1&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
[[#event_subscribe]]&lt;br /&gt;
!!!!event_subscribe&lt;br /&gt;
Subscribes an external application to a certain event.\\&lt;br /&gt;
'''Arguments''': \\&lt;br /&gt;
   - event name\\&lt;br /&gt;
   - external application socket \\&lt;br /&gt;
   - expire time, in seconds - if absent, the subscription is valid only one hour (3600 s)\\&lt;br /&gt;
'''Output''': None.\\&lt;br /&gt;
Examples of usage:&lt;br /&gt;
[@&lt;br /&gt;
    # opensipsctl fifo event_subscribe E_PIKE_BLOCKED udp:127.0.0.1:8888 1200&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!events_list&lt;br /&gt;
Lists all the events published through the Event Interface.\\&lt;br /&gt;
'''Arguments''': None. \\&lt;br /&gt;
'''Output''': None.\\&lt;br /&gt;
Examples of usage:&lt;br /&gt;
[@&lt;br /&gt;
    # opensipsctl fifo events_list&lt;br /&gt;
    Event:: E_CORE_THRESHOLD id=0&lt;br /&gt;
    Event:: E_RTPPROXY_STATUS id=1&lt;br /&gt;
    Event:: E_PIKE_BLOCKED id=2&lt;br /&gt;
&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!subscribers_list&lt;br /&gt;
Lists information about the subscribers\\&lt;br /&gt;
'''Arguments''': \\&lt;br /&gt;
   - event name\\&lt;br /&gt;
   - external application socket \\&lt;br /&gt;
'''Output''': If no parameter is specified, then the command returns information about all events and their subscribers. If the event is specified, only the external applications subscribed for that event are returned. If the socket is also specified, only one subscriber information is returned.\\&lt;br /&gt;
Examples of usage:&lt;br /&gt;
[@&lt;br /&gt;
    # opensipsctl fifo subscribers_list&lt;br /&gt;
    Event:: E_CORE_THRESHOLD id=0&lt;br /&gt;
    Event:: E_RTPPROXY_STATUS id=1&lt;br /&gt;
	Subscriber::  socket=unix:/tmp/event.sock expire=never&lt;br /&gt;
	Subscriber::  socket=udp:127.0.0.1:8888 expire=1100&lt;br /&gt;
    Event:: E_PIKE_BLOCKED id=2&lt;br /&gt;
	Subscriber::  socket=rabbitmq:guest@127.0.0.1/hello expire=never&lt;br /&gt;
&lt;br /&gt;
    # opensipsctl fifo subscribers_list E_RTPPROXY_STATUS&lt;br /&gt;
    Event:: E_RTPPROXY_STATUS id=1&lt;br /&gt;
	Subscriber::  socket=unix:/tmp/event.sock expire=never&lt;br /&gt;
	Subscriber::  socket=udp:127.0.0.1:8888 expire=1100&lt;br /&gt;
&lt;br /&gt;
    # opensipsctl fifo subscribers_list E_RTPPROXY_STATUS unix:/tmp/event.sock&lt;br /&gt;
    Event:: E_RTPPROXY_STATUS id=1&lt;br /&gt;
	Subscriber::  socket=unix:/tmp/event.sock expire=never&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
(:commentboxchrono:)&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPS_1.9_Manual&amp;diff=1495</id>
		<title>OpenSIPS 1.9 Manual</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPS_1.9_Manual&amp;diff=1495"/>
		<updated>2014-04-24T17:58:35Z</updated>

		<summary type="html">&lt;p&gt;Mike: /* Core MI comandos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalação== &lt;br /&gt;
===[[Baixando o OpenSIPS]]===&lt;br /&gt;
===[[Compilando e instalando o OpenSIPS]]===&lt;br /&gt;
=== [[Banco de Dados]]===&lt;br /&gt;
===[[Banco de dados SCHEMA]]===&lt;br /&gt;
== Configurando== &lt;br /&gt;
===[[Arquivos RC]]===&lt;br /&gt;
=== [[Arquivos de configuração]]===&lt;br /&gt;
===[[Gerando os arquivos de configuração]]===&lt;br /&gt;
== OpenSIPS scripting==&lt;br /&gt;
===[[Formato do script]]===&lt;br /&gt;
===[[Parâmetros globais]]===&lt;br /&gt;
===[[Tipos de rotas]]===&lt;br /&gt;
===[[Operador script]]===&lt;br /&gt;
===[[Statements]]===&lt;br /&gt;
===[[Funções Core]]===&lt;br /&gt;
===[[Variáveis Core]]===&lt;br /&gt;
===[[Scripting Flags]]===&lt;br /&gt;
===[[Transformações]]===&lt;br /&gt;
===[[Documentação dos módulos]]===&lt;br /&gt;
===[[Indices de funções]]===&lt;br /&gt;
== Interface OpenSIPS==&lt;br /&gt;
===[[MI Interface]]===&lt;br /&gt;
===[[Comandos do Core para MI]]===&lt;br /&gt;
&lt;br /&gt;
===[[Evento de interface]]===&lt;br /&gt;
===[[Eventos Core]]===&lt;br /&gt;
===[[Estatísticas de interface]]===&lt;br /&gt;
===[[Estatísticas Core]]===&lt;br /&gt;
==Problemas conhecidos==&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=MI_Interface&amp;diff=1494</id>
		<title>MI Interface</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=MI_Interface&amp;diff=1494"/>
		<updated>2014-04-24T17:55:10Z</updated>

		<summary type="html">&lt;p&gt;Mike: /* Visao Geral */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
A interface de gerenciamento ( '''Management Interface''' [ ou '''MI''' ] ) é uma interface do OpenSIPS que permite aplicações externas a executarem comandos predefinidos dentro do OpenSIPS.&lt;br /&gt;
&lt;br /&gt;
==Visao Geral==&lt;br /&gt;
&lt;br /&gt;
Estes comandos normalmente permitem aplicações externa a:&lt;br /&gt;
# inserir dados no OpenSIPS ( como alteração de nivel de debug, registrar um contato, etc.. )&lt;br /&gt;
# requisitar dados do OpenSIPS ( verificar usuários registrados, verificar chamadas em andamento, coletar estatisticas , etc..)&lt;br /&gt;
# ativar uma ação interna no OpenSIPS (recarregar dados, enviar mensagem, etc..)&lt;br /&gt;
&lt;br /&gt;
Os comandos para o '''MI''' são providos pelo core do OpenSIPS ([[Funções_Core|Lista Completa]]), e também por módulos ( verifica os comandos de cada módulo em ([[Documentação_dos_módulos|Módulos]])&lt;br /&gt;
&lt;br /&gt;
==Protocols==&lt;br /&gt;
&lt;br /&gt;
Vários protocolos estão disponiveis para a conexão (de um aplicativo externo) ao '''MI''' do OpenSIPS, como a interface em si é provida pelo core do OpenSIPS cada protocolo é provido por um módulo separado, você pode ativar multiplas interfaces e utilizar ao mesmo tempo os diferentes protocolos.&lt;br /&gt;
&lt;br /&gt;
Protocolos disponiveis são:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''mi_fifo''' - protocolo orientado a texto (veja a sintaxe na documentação do módulo), comunicação realizada via arquivo FIFO, OpenSIPS le os dados apartir de um arquivo predefinido, as aplicações externas irão enviar os comanods neste, como o arquivo é na verdade um fluxo de dados não existem restrições da quantidade de dados que o OpenSIPS pode retornar (quando solicitando alguma informação)&lt;br /&gt;
&lt;br /&gt;
* '''mi_datagram''' - protocolo orientado a texto similar ao fifo (veja a sintaxe na documentação do módulo), comunicação feita via SOCKET UNIX , além de pacotes UDP, o OpenSIPS fica aguardando pelos comandos na porta UDP ou no arquivo de socket, a informação transportada é limitada ao tamanho do datagrama (65K)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''mi_xmlrpc''' - protocolo XMLRPC (XML sobre HTTP). Como TCP é utilizado, não existe limite referente a quantidade de dados transferidos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Todos os protocolos permitem multiaplicação (vários clientes ao mesmo tempo) conectarem na mesma interface MI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemplos==&lt;br /&gt;
&lt;br /&gt;
Um exemplo simples de interação com o OpenSIPS via interface MI é quando usamos o utilitário '''opensipsctl''' , ele utiliza FIFO ou XMLRPC para enviar os comandos via MI para o OpenSIPS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O '''opensipsctl'' permite você rodar um comando através dos arquivos FIFO:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    opensipsctl fifo _mi_cmd_&lt;br /&gt;
    opensipsctl fifo ps&lt;br /&gt;
    opensipsctl fifo debug 4&lt;br /&gt;
&lt;br /&gt;
Ou ele internamente de forma transparente utiliza comandos da MI provendo funcionalidades diferentes ou mais complexas.&lt;br /&gt;
&lt;br /&gt;
Um programa simples em Python para executar um comando via MI no OpenSIPS através de XMLRPC:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
import xmlrpclib&lt;br /&gt;
opensips = xmlrpclib.ServerProxy('http://127.0.0.1:8080/RPC2')&lt;br /&gt;
print opensips.ps();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[OpenSIPS_1.9_Manual|Voltar]]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=MI_Interface&amp;diff=1493</id>
		<title>MI Interface</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=MI_Interface&amp;diff=1493"/>
		<updated>2014-04-24T17:54:46Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
A interface de gerenciamento ( '''Management Interface''' [ ou '''MI''' ] ) é uma interface do OpenSIPS que permite aplicações externas a executarem comandos predefinidos dentro do OpenSIPS.&lt;br /&gt;
&lt;br /&gt;
==Visao Geral==&lt;br /&gt;
&lt;br /&gt;
Estes comandos normalmente permitem aplicações externa a:&lt;br /&gt;
# inserir dados no OpenSIPS ( como alteração de nivel de debug, registrar um contato, etc.. )&lt;br /&gt;
# requisitar dados do OpenSIPS ( verificar usuários registrados, verificar chamadas em andamento, coletar estatisticas , etc..)&lt;br /&gt;
# ativar uma ação interna no OpenSIPS (recarregar dados, enviar mensagem, etc..)&lt;br /&gt;
&lt;br /&gt;
Os comandos para o '''MI''' são providos pelo core do OpenSIPS [[Funções_Core|Lista Completa]], e também por módulos ( verifica os comandos de cada módulo em ([[Documentação_dos_módulos|Módulos]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Protocols==&lt;br /&gt;
&lt;br /&gt;
Vários protocolos estão disponiveis para a conexão (de um aplicativo externo) ao '''MI''' do OpenSIPS, como a interface em si é provida pelo core do OpenSIPS cada protocolo é provido por um módulo separado, você pode ativar multiplas interfaces e utilizar ao mesmo tempo os diferentes protocolos.&lt;br /&gt;
&lt;br /&gt;
Protocolos disponiveis são:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''mi_fifo''' - protocolo orientado a texto (veja a sintaxe na documentação do módulo), comunicação realizada via arquivo FIFO, OpenSIPS le os dados apartir de um arquivo predefinido, as aplicações externas irão enviar os comanods neste, como o arquivo é na verdade um fluxo de dados não existem restrições da quantidade de dados que o OpenSIPS pode retornar (quando solicitando alguma informação)&lt;br /&gt;
&lt;br /&gt;
* '''mi_datagram''' - protocolo orientado a texto similar ao fifo (veja a sintaxe na documentação do módulo), comunicação feita via SOCKET UNIX , além de pacotes UDP, o OpenSIPS fica aguardando pelos comandos na porta UDP ou no arquivo de socket, a informação transportada é limitada ao tamanho do datagrama (65K)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''mi_xmlrpc''' - protocolo XMLRPC (XML sobre HTTP). Como TCP é utilizado, não existe limite referente a quantidade de dados transferidos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Todos os protocolos permitem multiaplicação (vários clientes ao mesmo tempo) conectarem na mesma interface MI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemplos==&lt;br /&gt;
&lt;br /&gt;
Um exemplo simples de interação com o OpenSIPS via interface MI é quando usamos o utilitário '''opensipsctl''' , ele utiliza FIFO ou XMLRPC para enviar os comandos via MI para o OpenSIPS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O '''opensipsctl'' permite você rodar um comando através dos arquivos FIFO:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    opensipsctl fifo _mi_cmd_&lt;br /&gt;
    opensipsctl fifo ps&lt;br /&gt;
    opensipsctl fifo debug 4&lt;br /&gt;
&lt;br /&gt;
Ou ele internamente de forma transparente utiliza comandos da MI provendo funcionalidades diferentes ou mais complexas.&lt;br /&gt;
&lt;br /&gt;
Um programa simples em Python para executar um comando via MI no OpenSIPS através de XMLRPC:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
import xmlrpclib&lt;br /&gt;
opensips = xmlrpclib.ServerProxy('http://127.0.0.1:8080/RPC2')&lt;br /&gt;
print opensips.ps();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[OpenSIPS_1.9_Manual|Voltar]]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=MI_Interface&amp;diff=1492</id>
		<title>MI Interface</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=MI_Interface&amp;diff=1492"/>
		<updated>2014-04-24T17:53:31Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
A interface de gerenciamento ( '''Management Interface''' [ ou '''MI''' ] ) é uma interface do OpenSIPS que permite aplicações externas a executarem comandos predefinidos dentro do OpenSIPS.&lt;br /&gt;
&lt;br /&gt;
==Visao Geral==&lt;br /&gt;
&lt;br /&gt;
Estes comandos normalmente permitem aplicações externa a:&lt;br /&gt;
# inserir dados no OpenSIPS ( como alteração de nivel de debug, registrar um contato, etc.. )&lt;br /&gt;
# requisitar dados do OpenSIPS ( verificar usuários registrados, verificar chamadas em andamento, coletar estatisticas , etc..)&lt;br /&gt;
# ativar uma ação interna no OpenSIPS (recarregar dados, enviar mensagem, etc..)&lt;br /&gt;
&lt;br /&gt;
Os comandos para o '''MI''' são providos pelo core do OpenSIPS [[Funções_Core]], e também por módulos ( verifica os comandos de cada módulo em [[Documentação_dos_módulos]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Protocols==&lt;br /&gt;
&lt;br /&gt;
Vários protocolos estão disponiveis para a conexão (de um aplicativo externo) ao '''MI''' do OpenSIPS, como a interface em si é provida pelo core do OpenSIPS cada protocolo é provido por um módulo separado, você pode ativar multiplas interfaces e utilizar ao mesmo tempo os diferentes protocolos.&lt;br /&gt;
&lt;br /&gt;
Protocolos disponiveis são:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''mi_fifo''' - protocolo orientado a texto (veja a sintaxe na documentação do módulo), comunicação realizada via arquivo FIFO, OpenSIPS le os dados apartir de um arquivo predefinido, as aplicações externas irão enviar os comanods neste, como o arquivo é na verdade um fluxo de dados não existem restrições da quantidade de dados que o OpenSIPS pode retornar (quando solicitando alguma informação)&lt;br /&gt;
&lt;br /&gt;
* '''mi_datagram''' - protocolo orientado a texto similar ao fifo (veja a sintaxe na documentação do módulo), comunicação feita via SOCKET UNIX , além de pacotes UDP, o OpenSIPS fica aguardando pelos comandos na porta UDP ou no arquivo de socket, a informação transportada é limitada ao tamanho do datagrama (65K)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''mi_xmlrpc''' - protocolo XMLRPC (XML sobre HTTP). Como TCP é utilizado, não existe limite referente a quantidade de dados transferidos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Todos os protocolos permitem multiaplicação (vários clientes ao mesmo tempo) conectarem na mesma interface MI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemplos==&lt;br /&gt;
&lt;br /&gt;
Um exemplo simples de interação com o OpenSIPS via interface MI é quando usamos o utilitário '''opensipsctl''' , ele utiliza FIFO ou XMLRPC para enviar os comandos via MI para o OpenSIPS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O '''opensipsctl'' permite você rodar um comando através dos arquivos FIFO:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    opensipsctl fifo _mi_cmd_&lt;br /&gt;
    opensipsctl fifo ps&lt;br /&gt;
    opensipsctl fifo debug 4&lt;br /&gt;
&lt;br /&gt;
Ou ele internamente de forma transparente utiliza comandos da MI provendo funcionalidades diferentes ou mais complexas.&lt;br /&gt;
&lt;br /&gt;
Um programa simples em Python para executar um comando via MI no OpenSIPS através de XMLRPC:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
import xmlrpclib&lt;br /&gt;
opensips = xmlrpclib.ServerProxy('http://127.0.0.1:8080/RPC2')&lt;br /&gt;
print opensips.ps();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[OpenSIPS_1.9_Manual|Voltar]]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=MI_Interface&amp;diff=1491</id>
		<title>MI Interface</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=MI_Interface&amp;diff=1491"/>
		<updated>2014-04-24T17:52:16Z</updated>

		<summary type="html">&lt;p&gt;Mike: /* Exemplos */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
A interface de gerenciamento ( '''Management Interface''' [ ou '''MI''' ] ) é uma interface do OpenSIPS que permite aplicações externas a executarem comandos predefinidos dentro do OpenSIPS.&lt;br /&gt;
&lt;br /&gt;
==Visao Geral==&lt;br /&gt;
&lt;br /&gt;
Estes comandos normalmente permitem aplicações externa a:&lt;br /&gt;
# inserir dados no OpenSIPS ( como alteração de nivel de debug, registrar um contato, etc.. )&lt;br /&gt;
# requisitar dados do OpenSIPS ( verificar usuários registrados, verificar chamadas em andamento, coletar estatisticas , etc..)&lt;br /&gt;
# ativar uma ação interna no OpenSIPS (recarregar dados, enviar mensagem, etc..)&lt;br /&gt;
&lt;br /&gt;
Os comandos para o '''MI''' são providos pelo core do OpenSIPS [[ LINK DO CORE AQUI ]], e também por módulos ( verifica os comandos de cada módulo em [[ LINK PARA DOCUMENTACAO DOS MODULOS ]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Protocols==&lt;br /&gt;
&lt;br /&gt;
Vários protocolos estão disponiveis para a conexão (de um aplicativo externo) ao '''MI''' do OpenSIPS, como a interface em si é provida pelo core do OpenSIPS cada protocolo é provido por um módulo separado, você pode ativar multiplas interfaces e utilizar ao mesmo tempo os diferentes protocolos.&lt;br /&gt;
&lt;br /&gt;
Protocolos disponiveis são:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''mi_fifo''' - protocolo orientado a texto (veja a sintaxe na documentação do módulo), comunicação realizada via arquivo FIFO, OpenSIPS le os dados apartir de um arquivo predefinido, as aplicações externas irão enviar os comanods neste, como o arquivo é na verdade um fluxo de dados não existem restrições da quantidade de dados que o OpenSIPS pode retornar (quando solicitando alguma informação)&lt;br /&gt;
&lt;br /&gt;
* '''mi_datagram''' - protocolo orientado a texto similar ao fifo (veja a sintaxe na documentação do módulo), comunicação feita via SOCKET UNIX , além de pacotes UDP, o OpenSIPS fica aguardando pelos comandos na porta UDP ou no arquivo de socket, a informação transportada é limitada ao tamanho do datagrama (65K)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''mi_xmlrpc''' - protocolo XMLRPC (XML sobre HTTP). Como TCP é utilizado, não existe limite referente a quantidade de dados transferidos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Todos os protocolos permitem multiaplicação (vários clientes ao mesmo tempo) conectarem na mesma interface MI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemplos==&lt;br /&gt;
&lt;br /&gt;
Um exemplo simples de interação com o OpenSIPS via interface MI é quando usamos o utilitário '''opensipsctl''' , ele utiliza FIFO ou XMLRPC para enviar os comandos via MI para o OpenSIPS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O '''opensipsctl'' permite você rodar um comando através dos arquivos FIFO:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    opensipsctl fifo _mi_cmd_&lt;br /&gt;
    opensipsctl fifo ps&lt;br /&gt;
    opensipsctl fifo debug 4&lt;br /&gt;
&lt;br /&gt;
Ou ele internamente de forma transparente utiliza comandos da MI provendo funcionalidades diferentes ou mais complexas.&lt;br /&gt;
&lt;br /&gt;
Um programa simples em Python para executar um comando via MI no OpenSIPS através de XMLRPC:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
import xmlrpclib&lt;br /&gt;
opensips = xmlrpclib.ServerProxy('http://127.0.0.1:8080/RPC2')&lt;br /&gt;
print opensips.ps();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[OpenSIPS_1.9_Manual|Voltar]]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=MI_Interface&amp;diff=1490</id>
		<title>MI Interface</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=MI_Interface&amp;diff=1490"/>
		<updated>2014-04-24T17:52:05Z</updated>

		<summary type="html">&lt;p&gt;Mike: Criou página com ' A interface de gerenciamento ( '''Management Interface''' [ ou '''MI''' ] ) é uma interface do OpenSIPS que permite aplicações externas a executarem comandos predefinidos ...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
A interface de gerenciamento ( '''Management Interface''' [ ou '''MI''' ] ) é uma interface do OpenSIPS que permite aplicações externas a executarem comandos predefinidos dentro do OpenSIPS.&lt;br /&gt;
&lt;br /&gt;
==Visao Geral==&lt;br /&gt;
&lt;br /&gt;
Estes comandos normalmente permitem aplicações externa a:&lt;br /&gt;
# inserir dados no OpenSIPS ( como alteração de nivel de debug, registrar um contato, etc.. )&lt;br /&gt;
# requisitar dados do OpenSIPS ( verificar usuários registrados, verificar chamadas em andamento, coletar estatisticas , etc..)&lt;br /&gt;
# ativar uma ação interna no OpenSIPS (recarregar dados, enviar mensagem, etc..)&lt;br /&gt;
&lt;br /&gt;
Os comandos para o '''MI''' são providos pelo core do OpenSIPS [[ LINK DO CORE AQUI ]], e também por módulos ( verifica os comandos de cada módulo em [[ LINK PARA DOCUMENTACAO DOS MODULOS ]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Protocols==&lt;br /&gt;
&lt;br /&gt;
Vários protocolos estão disponiveis para a conexão (de um aplicativo externo) ao '''MI''' do OpenSIPS, como a interface em si é provida pelo core do OpenSIPS cada protocolo é provido por um módulo separado, você pode ativar multiplas interfaces e utilizar ao mesmo tempo os diferentes protocolos.&lt;br /&gt;
&lt;br /&gt;
Protocolos disponiveis são:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''mi_fifo''' - protocolo orientado a texto (veja a sintaxe na documentação do módulo), comunicação realizada via arquivo FIFO, OpenSIPS le os dados apartir de um arquivo predefinido, as aplicações externas irão enviar os comanods neste, como o arquivo é na verdade um fluxo de dados não existem restrições da quantidade de dados que o OpenSIPS pode retornar (quando solicitando alguma informação)&lt;br /&gt;
&lt;br /&gt;
* '''mi_datagram''' - protocolo orientado a texto similar ao fifo (veja a sintaxe na documentação do módulo), comunicação feita via SOCKET UNIX , além de pacotes UDP, o OpenSIPS fica aguardando pelos comandos na porta UDP ou no arquivo de socket, a informação transportada é limitada ao tamanho do datagrama (65K)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''mi_xmlrpc''' - protocolo XMLRPC (XML sobre HTTP). Como TCP é utilizado, não existe limite referente a quantidade de dados transferidos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Todos os protocolos permitem multiaplicação (vários clientes ao mesmo tempo) conectarem na mesma interface MI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemplos==&lt;br /&gt;
&lt;br /&gt;
Um exemplo simples de interação com o OpenSIPS via interface MI é quando usamos o utilitário '''opensipsctl''' , ele utiliza FIFO ou XMLRPC para enviar os comandos via MI para o OpenSIPS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
O '''opensipsctl'' permite você rodar um comando através dos arquivos FIFO:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    opensipsctl fifo _mi_cmd_&lt;br /&gt;
    opensipsctl fifo ps&lt;br /&gt;
    opensipsctl fifo debug 4&lt;br /&gt;
&lt;br /&gt;
Ou ele internamente de forma transparente utiliza comandos da MI provendo funcionalidades diferentes ou mais complexas.&lt;br /&gt;
&lt;br /&gt;
Um programa simples em Python para executar um comando via MI no OpenSIPS através de XMLRPC:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
import xmlrpclib&lt;br /&gt;
opensips = xmlrpclib.ServerProxy('http://127.0.0.1:8080/RPC2')&lt;br /&gt;
print opensips.ps();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[OpenSIPS_1.9_Manual|Voltar]]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=OpenSIPS_1.9_Manual&amp;diff=1489</id>
		<title>OpenSIPS 1.9 Manual</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=OpenSIPS_1.9_Manual&amp;diff=1489"/>
		<updated>2014-04-24T17:35:32Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalação== &lt;br /&gt;
===[[Baixando o OpenSIPS]]===&lt;br /&gt;
===[[Compilando e instalando o OpenSIPS]]===&lt;br /&gt;
=== [[Banco de Dados]]===&lt;br /&gt;
===[[Banco de dados SCHEMA]]===&lt;br /&gt;
== Configurando== &lt;br /&gt;
===[[Arquivos RC]]===&lt;br /&gt;
=== [[Arquivos de configuração]]===&lt;br /&gt;
===[[Gerando os arquivos de configuração]]===&lt;br /&gt;
== OpenSIPS scripting==&lt;br /&gt;
===[[Formato do script]]===&lt;br /&gt;
===[[Parâmetros globais]]===&lt;br /&gt;
===[[Tipos de rotas]]===&lt;br /&gt;
===[[Operador script]]===&lt;br /&gt;
===[[Statements]]===&lt;br /&gt;
===[[Funções Core]]===&lt;br /&gt;
===[[Variáveis Core]]===&lt;br /&gt;
===[[Scripting Flags]]===&lt;br /&gt;
===[[Transformações]]===&lt;br /&gt;
===[[Documentação dos módulos]]===&lt;br /&gt;
===[[Indices de funções]]===&lt;br /&gt;
== Interface OpenSIPS==&lt;br /&gt;
===[[MI Interface]]===&lt;br /&gt;
===[[Core MI comandos]]===&lt;br /&gt;
===[[Evento de interface]]===&lt;br /&gt;
===[[Eventos Core]]===&lt;br /&gt;
===[[Estatísticas de interface]]===&lt;br /&gt;
===[[Estatísticas Core]]===&lt;br /&gt;
==Problemas conhecidos==&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Transforma%C3%A7%C3%B5es&amp;diff=1488</id>
		<title>Transformações</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Transforma%C3%A7%C3%B5es&amp;diff=1488"/>
		<updated>2014-04-23T18:23:15Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Transformação''' é basicamente a função que é aplicada a uma variável (variavel de script, pseudo-variavel, AVPS, strings staticas), para pegar um valor especial, o valor da variável horiginal não é alterado.&lt;br /&gt;
&lt;br /&gt;
Exemplo utilizando diferentes tipos de variáveis em no '''script OpenSIPS'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# verificando se o usuário no cabeçalho From é igual ao usuário no cabeçalho To &lt;br /&gt;
&lt;br /&gt;
if($fU==$tU) {&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# checagem de usuário baseado em r-uri &lt;br /&gt;
&lt;br /&gt;
switch($ruri.user) {&lt;br /&gt;
   case &amp;quot;1234&amp;quot;:&lt;br /&gt;
      ...&lt;br /&gt;
   break;&lt;br /&gt;
   case &amp;quot;5678&amp;quot;:&lt;br /&gt;
      ...&lt;br /&gt;
   break;&lt;br /&gt;
   default:&lt;br /&gt;
     ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# definindo um valor inteiro para um AVP &lt;br /&gt;
$avp(i:11) = 1;&lt;br /&gt;
&lt;br /&gt;
# definindo um valor de texto (string) para um AVP&lt;br /&gt;
$avp(i:22) = &amp;quot;opensips&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# Definir o valor de $ruri para um avp&lt;br /&gt;
$avp(i:33) = $ruri;&lt;br /&gt;
&lt;br /&gt;
# concatenando &amp;quot;sip:&amp;quot; + usuário no From + &amp;quot;@&amp;quot; + dominio no To na variável x&lt;br /&gt;
$var(x) = &amp;quot;sip:&amp;quot; + $fU +&amp;quot;@&amp;quot; + $td;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As transformações possuem o intuito de facilitar o acesso a diferentes atributos de variáveis, como o tamanho da string (strlen) , partes do valor, substring ou valores diferentes de variaveis (encoded em hexa, valor md5, escapar valores para operações em banco).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A transformação é representada entre ''''{'''' e ''''}'''' e segue o nome da variável. Quando utilizando transformação, o nome da variável e transformações '''devem''' estar dentro de parentesis ''''('''' e '''')'''' .&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# o tamanho do From URI ( $fu é uma pseudo-variável para From URI)&lt;br /&gt;
&lt;br /&gt;
$(fu{s.len})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Muitas transformações podem ser aplicadas ao mesmo tempo na mesma variável.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# O tamanho do cabeçalho 'Test' (escapado) .&lt;br /&gt;
&lt;br /&gt;
$(hdr(Test){s.escape.common}{s.len})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A transformação pode ser utilizada em qualquer lugar, sendo considerada parte das variáveis no script --- no xlog, avpops ou outros módulos, funções e parametros, a direita de expressões de atribuição ou em comparações.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
Para aprender que variável pode ser utilizada com transformações veja [[http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core| Variáveis Core]]&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Transformação de string==&lt;br /&gt;
O nome destas trasnformações iniciam com 's.' , são utilizadas para aplicar operações de string nas variáveis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Transformações disponiveis nesta classe:&lt;br /&gt;
&lt;br /&gt;
==={s.len}===&lt;br /&gt;
&lt;br /&gt;
Retorna o tamanho do valor de uma variável&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(x) = &amp;quot;abc&amp;quot;;&lt;br /&gt;
if($(var(x){s.len}) == 3)&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={s.int}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor inteiro de uma string númerica.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(x) = &amp;quot;1234&amp;quot;;&lt;br /&gt;
if($(var(x){s.int})==1234) {&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={s.md5}===&lt;br /&gt;
&lt;br /&gt;
Retorna o md5 do valor da variável&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xlog(&amp;quot;MD4 over From username: $(fU{s.md5})&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={s.substr,offset,length}===&lt;br /&gt;
&lt;br /&gt;
Retornar o pedaço (substring) iniciando no valor de offset até o valor de length . Se offset é negativo, então a contagem começa no fim, onde -1 é o último caracter. Em caso de valor positivo, 0 é o primeiro valor, o tamanho (length) deve ser positivo, em caso de 0, a substring retornará até o fim do valor, offset e length podem ser variáveis também.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(x) = &amp;quot;abcd&amp;quot;;&lt;br /&gt;
$(var(x){s.substr,1,0}) = &amp;quot;bcd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={s.select,index,separator}===&lt;br /&gt;
&lt;br /&gt;
Retorna um campo do valor da variável. O campo é selecionado baseado no spearador (separator) e indice (index). O separador deve ser um caractere usado para identificar os campos. Indice (index) deve ser um valor inteiro ou uma variavel. Se o index for negativo  a contagem de campos começa do fim do valor, -1 é o último campo, se o index é positivo, 0 é o primeiro campo.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(x) = &amp;quot;12,34,56&amp;quot;;&lt;br /&gt;
$(var(x){s.select,1,,}) =&amp;gt; &amp;quot;34&amp;quot; ;&lt;br /&gt;
&lt;br /&gt;
$var(x) = &amp;quot;12,34,56&amp;quot;;&lt;br /&gt;
$(var(x){s.select,-2,,}) =&amp;gt; &amp;quot;34&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={s.encode.hexa}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor da variável em hexa.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.decode.hexa}===&lt;br /&gt;
&lt;br /&gt;
Decodifica o valor hexa da variável.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.escape.common}===&lt;br /&gt;
&lt;br /&gt;
Retorna a string scapada do valor da variável. Caracteres escapados são ', &amp;quot;, e 0 , este recurso é util quando necessário realizar consultas em banco de dados ( deve se atentar quando utilizando caracteres que não fazem parte do LATIN )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.unescape.common}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor sem escape de uma variável, o inverso da transformação acima.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.escape.user}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor escapado da variavel, alterando para '%hexa' os caracteres nao permitidos na area  SIP URI seguindos as recomendações da RFC.&lt;br /&gt;
&lt;br /&gt;
==={s.unescape.user}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor sem escape da variável, alterando de '%hexa' para caracter, o inverso da transformação acima.&lt;br /&gt;
&lt;br /&gt;
==={s.escape.param}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor escapado da variável, alterando para '%hexa' o caractere que não é permitido na area param da SIP URI seguindo as recomendações da RFC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.unescape.param}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor sem escape da variavel alterando de '%hexa' para caractere, inverso da transformação acima.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.tolower}===&lt;br /&gt;
&lt;br /&gt;
Retorna a string em lower case (caixa baixa)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.toupper}===&lt;br /&gt;
&lt;br /&gt;
Retorna a string em upper case (caixa alta)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==URI Transformations==&lt;br /&gt;
&lt;br /&gt;
O nome da transformação inicia-se com 'uri.'. O valor da variável é considerado ser parte da SIP URI. Esta transformação retorna partes da SIP URI (veja struct sip_uri). Se a parte estiver faltando o valor retornando será uma string vazia.&lt;br /&gt;
&lt;br /&gt;
Transformações disponiveis nesta classe:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.user}===&lt;br /&gt;
Retorna o usuário no schema URI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.host}===&lt;br /&gt;
&lt;br /&gt;
(mesmo que '''{uri.domain}''')&lt;br /&gt;
&lt;br /&gt;
Retorna a parte do dominio no schema URI.&lt;br /&gt;
&lt;br /&gt;
==={uri.passwd}===&lt;br /&gt;
&lt;br /&gt;
Retorna a parte da senha no schema URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.port}===&lt;br /&gt;
&lt;br /&gt;
Retorna a parte da porta no schema URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.params}===&lt;br /&gt;
&lt;br /&gt;
Retorna todos os parametros da URI em uma única string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.param,name}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro da URI com nome de &amp;quot;name&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.headers}===&lt;br /&gt;
&lt;br /&gt;
Retorna os cabeçalhos URI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.transport}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro transport da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.ttl}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro TTL da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.uparam}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro user da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.maddr}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro maddr da URI.&lt;br /&gt;
&lt;br /&gt;
==={uri.method}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro metodo da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.lr}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro lr da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.r2}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro r2 da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==VIA Transformations==&lt;br /&gt;
&lt;br /&gt;
Estas são as tranformações para o cabeçalho Via e todas iniciam com @@via@@. O valor da variável é considerado estar no cabeçalho SIP Via. Esta transformação retornará partes do cabeçalho vai ( veja struct via_body ). Se parte requisitada estiver faltando então o valor de retorna será uma variável vazia. A transformação irá falhar (com erro no script) se a variável que contem o cabeçalho Via estiver vazia. A menos que especificado abaixo, o resultado da transformação será uma string (não um inteiro).&lt;br /&gt;
&lt;br /&gt;
Exemplos:&lt;br /&gt;
    $var(upstreamtransport) = $(hdr(Via)[1]{via.transport}{s.tolower});&lt;br /&gt;
    $var(upstreamip) = $(hdr(Via)[1]{via.param,received});&lt;br /&gt;
    $var(clientport) = $(hdr(Via)[-1]{via.param,rport});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Transformações disponíveis nesta classe:    &lt;br /&gt;
&lt;br /&gt;
==={via.name}===&lt;br /&gt;
&lt;br /&gt;
Retorna o @@protocol-name@@ ( RFC3261 BNF ), geralmente @@SIP@@.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.version}===&lt;br /&gt;
&lt;br /&gt;
Retorna o @@protocol-version@@ ( RFC3261 BNF ), geralmente @@2.0@@.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.transport}===&lt;br /&gt;
&lt;br /&gt;
Retorna o @@transport@@ ( RFC3261 BNF ), ex: @@UDP@@, @@TCP@@, @@TLS@@. Este é o protocolo de transporte utilizado para enviar a mensagem.&lt;br /&gt;
&lt;br /&gt;
==={via.host}===&lt;br /&gt;
&lt;br /&gt;
(mesmo que @@{via.domain}@@)&lt;br /&gt;
&lt;br /&gt;
Retorna o @@host@@ do @@sent-by@@ (RFC3261 BNF). Tipicamente é o IP de quem enviou a requisição, e claro, é o endereço para onde a resposta será envaida.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.port}===&lt;br /&gt;
&lt;br /&gt;
Retorna a @@port@@ to @@sent-by@@ (RFC3261). Tipicamente é a  Porta de quem enviou a requisição e o endereço para onde a resposta será enviada, o resultado da transformação é valido tanto como inteiro quanto string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.comment}===&lt;br /&gt;
&lt;br /&gt;
O comment associado com o cabeçalho via. A @@struct via_body@@ contém este capmo, mas ele não é claro que a RFC3261 permite a utilização de comentarios em cabeçalho Via ( veja o texto no topo da pagina 221 , e a BNF não explicita se permite comentário em Via). O texto da comment deve ser fechado por parenteses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.params}===&lt;br /&gt;
&lt;br /&gt;
Retorna Todos os parametros do cabeçalho Via ( @@via-param@@ da RFC3261 BNF ) como uma string única. O resultado pode ser processado através da transformação @@{param.*}@@ . Isso é basicamente tudo após o host e porta.&lt;br /&gt;
&lt;br /&gt;
==={via.param,name}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro do cabeçalho Via especificado por @@name@@. Tipicamente parametros incluem @@branch@@, @@rport@@ e @@received@@.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.branch}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro branch no cabeçalho VIA.&lt;br /&gt;
&lt;br /&gt;
==={via.received}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro received no cabeçalho Via , se existir.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.rport}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro rport no cabeçalho VIA, se existir.&lt;br /&gt;
&lt;br /&gt;
==Parameters List Transformations==&lt;br /&gt;
&lt;br /&gt;
O nome da transformação inicia por &amp;quot;param.&amp;quot; . O valor da variavel é considerado uma string como nome1=valor1; nome2=valor2;...&amp;quot; . A transformação retorna o valor de um parametro especifico ou o nome do parametro especificado no indice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Transformações disponiveis nesta classe:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={param.value,name}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro 'name'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;a=1;b=2;c=3&amp;quot;{param.value,c} = &amp;quot;3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
O valor de 'name' pode ser uma variável.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={param.exist,name}===&lt;br /&gt;
&lt;br /&gt;
Retorna 1 se o parametro @@name@@ existir (com ou sem valor), caso contrário retorna 0. O valor retornado é tanto string quanto inteiro. @@name@@ pode ser uma variável. Esta função pode ser utilizada para testar se um parametro possue ou não valores.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;a=0;b=2;ob;c=3&amp;quot;{param.exist,ob};         # returns 1&lt;br /&gt;
&amp;quot;a=0;b=2;ob;c=3&amp;quot;{param.exist,a};          # returns 1&lt;br /&gt;
&amp;quot;a=0;b=2;ob;c=3&amp;quot;{param.exist,foo};        # returns 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={param.valueat,index}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro na posição fornecida por 'index' (0-based index)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;a=1;b=2;c=3&amp;quot;{param.valueat,1} = &amp;quot;2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'index' pode ser uma variável&lt;br /&gt;
&lt;br /&gt;
==={param.name,index}===&lt;br /&gt;
&lt;br /&gt;
Retorna o nome do parametro na posição 'index'.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;a=1;b=2;c=3&amp;quot;{param.name,1} = &amp;quot;b&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={param.count}===&lt;br /&gt;
&lt;br /&gt;
Retorna o número de parametros na lista.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;a=1;b=2;c=3&amp;quot;{param.count} = 3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Name-address Transformations==&lt;br /&gt;
&lt;br /&gt;
A nome da transformação inica com 'nameaddr.' . O valor da variável é considerado ser uma string como '[display_name] uri'. A transformação retorna o valor especificado no campo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Transformações disponiveis para esta classe:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={nameaddr.name}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor de display name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 '&amp;quot;test&amp;quot; &amp;lt;sip:test@opensips.org&amp;gt;' {nameaddr.name} = &amp;quot;test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={nameaddr.uri}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor da URI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 '&amp;quot;test&amp;quot; &amp;lt;sip:test@opensips.org&amp;gt;' {nameaddr.uri} = sip:test@opensips.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={nameaddr.len}===&lt;br /&gt;
&lt;br /&gt;
Retorna o tamanho da name-addr &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={nameaddr.param,param_name}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro com o nome 'param_name'.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
 '&amp;quot;test&amp;quot; &amp;lt;sip:test@opensips.org&amp;gt;;tag=dat43h' {nameaddr.param,tag} = dat43h&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={nameaddr.params}===&lt;br /&gt;
&lt;br /&gt;
Retorna os parametros e seus valores correspondentes.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 '&amp;quot;test&amp;quot; &amp;lt;sip:test@opensips.org&amp;gt;;tag=dat43h;private=yes' {nameaddr.params} = &amp;quot;tag=dat43h;private=yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==IP Transformations==&lt;br /&gt;
&lt;br /&gt;
O nome da transformação inicia com 'ip.' &lt;br /&gt;
&lt;br /&gt;
Transformações disponiveis para esta classe:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={ip.pton}===&lt;br /&gt;
&lt;br /&gt;
Retorna a representação binária do IP&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;192.168.2.134&amp;quot; {ip.pton} returns a 4 byte binary representation of the IP provided&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={ip.ntop}===&lt;br /&gt;
&lt;br /&gt;
Retorna a representação de um binário de IP&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;192.168.2.134&amp;quot;{ip.pton}{ip.ntop} = &amp;quot;192.168.2.134&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={ip.isip}===&lt;br /&gt;
&lt;br /&gt;
Retorna 1 ou 0, se a string provida for um ip válido ou não.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;192.168.2.134&amp;quot; {ip.isip} = 1&lt;br /&gt;
 &amp;quot;192.168.2.134.1&amp;quot; {ip.isip} = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={ip.family}===&lt;br /&gt;
&lt;br /&gt;
Retorna INET ou INET6 se a representação binária provida for um IPv4 ou IPv6.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;192.168.2.134&amp;quot; {ip.pton}{ip.family} = &amp;quot;INET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={ip.resolve}===&lt;br /&gt;
&lt;br /&gt;
Retorna o IP de um host.dominio informado. a transformação não tem efeito se um IP for forncido.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;opensips.org&amp;quot; {ip.resolve} = &amp;quot;78.46.64.50&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CSV Transformations==&lt;br /&gt;
&lt;br /&gt;
O nome da transformação inicia com &amp;quot;csv.&amp;quot; . O valor da variável é considerado ser uma string como &amp;quot;campo1,campo2,....&amp;quot;. A transformação retorna o numero de entradas no CSV informado, ou o campo de uma posição especifica do CSV.&lt;br /&gt;
&lt;br /&gt;
Tranformações disponiveis nesta classe:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={csv.count}===&lt;br /&gt;
Retorna o número de entradas no CSV provido.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
 &amp;quot;a,b,c&amp;quot; {csv.count} = 3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={csv.value}===&lt;br /&gt;
Retorna a entrada na posição especifica. Index inicia em 0&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;a,b,c&amp;quot; {csv.value,2} = c&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==SDP Transformations==&lt;br /&gt;
&lt;br /&gt;
O nome da transformação inica com &amp;quot;sdp.&amp;quot;. O valor da variaável é considerado ser um body SDP válido. A transformação retorna uma linha especifica no body SDP.&lt;br /&gt;
&lt;br /&gt;
Transformações disponiveis para esta classe:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={sdp.line}==&lt;br /&gt;
&lt;br /&gt;
Retorna a linha especifica do body SDP. A transformação também aceita um segundo parametro, este especificado é o número da linha do primeiro parametro para pegar do body SDP. Index inicia em 0. Se o segundo parametro estiver faltando ele assume 0.&lt;br /&gt;
&lt;br /&gt;
Exemplo&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;))&lt;br /&gt;
   {&lt;br /&gt;
      $var(aline) = $(rb{sdp.line,a,1});&lt;br /&gt;
      xlog(&amp;quot;The second a line in the SDP body is $var(aline)\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;))&lt;br /&gt;
   {&lt;br /&gt;
      $var(mline) = $(rb{sdp.line,m});&lt;br /&gt;
      xlog(&amp;quot;The first m line in the SDP body is $var(mline)\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Regular Expression Transformations==&lt;br /&gt;
&lt;br /&gt;
O nome da trasnformação inicia-se com &amp;quot;re.&amp;quot; . O valor de entrada pode ser qualquer string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={re.subst,reg_exp}===&lt;br /&gt;
&lt;br /&gt;
O parametro reg_exp pode ser tanto uma string quanto uma variável.&lt;br /&gt;
&lt;br /&gt;
O formato da reg_exp é:&lt;br /&gt;
&lt;br /&gt;
    /posix_match_expression/replacement_expression/flags&lt;br /&gt;
&lt;br /&gt;
As flags podem ser:&lt;br /&gt;
    i - match ignore case&lt;br /&gt;
    s - match within multi-lines strings&lt;br /&gt;
    g - replace all matches&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(reg_input)=&amp;quot;abc&amp;quot;;&lt;br /&gt;
$var(reg) = &amp;quot;/a/A/g&amp;quot;;&lt;br /&gt;
xlog(&amp;quot;Applying reg exp $var(reg) to $var(reg_input) : $(var(reg_input){re.subst,$var(reg)})\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
xlog(&amp;quot;Applying reg /b/B/g to $var(reg_input) : $(var(reg_input){re.subst,/b/B/g})\n&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemplos==&lt;br /&gt;
&lt;br /&gt;
Em uma variável, muitas trasnformações podem ser aplicadas, começando da esquerda para a direita.&lt;br /&gt;
&lt;br /&gt;
* O tamanho do valor da variavel do parametro na posição 1 (lembre-se que 0 é a primeira posição, 1 é a segunda)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(x) = &amp;quot;a=1;b=22;c=333&amp;quot;;&lt;br /&gt;
$(var(x){param.value,$(var(x){param.name,1})}{s.len}) = 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Testa se é des-registro ou não&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if(is_method(&amp;quot;REGISTER&amp;quot;) &amp;amp;&amp;amp; is_present_hf(&amp;quot;Expires&amp;quot;) &amp;amp;&amp;amp; $(hdr(Expires){s.int})==0)&lt;br /&gt;
    xlog(&amp;quot;This is an un-registrationn&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[OpenSIPS_1.9_Manual|Voltar]]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Transforma%C3%A7%C3%B5es&amp;diff=1487</id>
		<title>Transformações</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Transforma%C3%A7%C3%B5es&amp;diff=1487"/>
		<updated>2014-04-23T18:22:07Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Transformação''' é basicamente a função que é aplicada a uma variável (variavel de script, pseudo-variavel, AVPS, strings staticas), para pegar um valor especial, o valor da variável horiginal não é alterado.&lt;br /&gt;
&lt;br /&gt;
Exemplo utilizando diferentes tipos de variáveis em no '''script OpenSIPS'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# verificando se o usuário no cabeçalho From é igual ao usuário no cabeçalho To &lt;br /&gt;
&lt;br /&gt;
if($fU==$tU) {&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# checagem de usuário baseado em r-uri &lt;br /&gt;
&lt;br /&gt;
switch($ruri.user) {&lt;br /&gt;
   case &amp;quot;1234&amp;quot;:&lt;br /&gt;
      ...&lt;br /&gt;
   break;&lt;br /&gt;
   case &amp;quot;5678&amp;quot;:&lt;br /&gt;
      ...&lt;br /&gt;
   break;&lt;br /&gt;
   default:&lt;br /&gt;
     ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# definindo um valor inteiro para um AVP &lt;br /&gt;
$avp(i:11) = 1;&lt;br /&gt;
&lt;br /&gt;
# definindo um valor de texto (string) para um AVP&lt;br /&gt;
$avp(i:22) = &amp;quot;opensips&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# Definir o valor de $ruri para um avp&lt;br /&gt;
$avp(i:33) = $ruri;&lt;br /&gt;
&lt;br /&gt;
# concatenando &amp;quot;sip:&amp;quot; + usuário no From + &amp;quot;@&amp;quot; + dominio no To na variável x&lt;br /&gt;
$var(x) = &amp;quot;sip:&amp;quot; + $fU +&amp;quot;@&amp;quot; + $td;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As transformações possuem o intuito de facilitar o acesso a diferentes atributos de variáveis, como o tamanho da string (strlen) , partes do valor, substring ou valores diferentes de variaveis (encoded em hexa, valor md5, escapar valores para operações em banco).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A transformação é representada entre ''''{'''' e ''''}'''' e segue o nome da variável. Quando utilizando transformação, o nome da variável e transformações '''devem''' estar dentro de parentesis ''''('''' e '''')'''' .&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# o tamanho do From URI ( $fu é uma pseudo-variável para From URI)&lt;br /&gt;
&lt;br /&gt;
$(fu{s.len})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Muitas transformações podem ser aplicadas ao mesmo tempo na mesma variável.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# O tamanho do cabeçalho 'Test' (escapado) .&lt;br /&gt;
&lt;br /&gt;
$(hdr(Test){s.escape.common}{s.len})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A transformação pode ser utilizada em qualquer lugar, sendo considerada parte das variáveis no script --- no xlog, avpops ou outros módulos, funções e parametros, a direita de expressões de atribuição ou em comparações.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
Para aprender que variável pode ser utilizada com transformações veja [[http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core| Variáveis Core]]&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Transformação de string==&lt;br /&gt;
O nome destas trasnformações iniciam com 's.' , são utilizadas para aplicar operações de string nas variáveis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Transformações disponiveis nesta classe:&lt;br /&gt;
&lt;br /&gt;
==={s.len}===&lt;br /&gt;
&lt;br /&gt;
Retorna o tamanho do valor de uma variável&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(x) = &amp;quot;abc&amp;quot;;&lt;br /&gt;
if($(var(x){s.len}) == 3)&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={s.int}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor inteiro de uma string númerica.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(x) = &amp;quot;1234&amp;quot;;&lt;br /&gt;
if($(var(x){s.int})==1234) {&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={s.md5}===&lt;br /&gt;
&lt;br /&gt;
Retorna o md5 do valor da variável&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xlog(&amp;quot;MD4 over From username: $(fU{s.md5})&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={s.substr,offset,length}===&lt;br /&gt;
&lt;br /&gt;
Retornar o pedaço (substring) iniciando no valor de offset até o valor de length . Se offset é negativo, então a contagem começa no fim, onde -1 é o último caracter. Em caso de valor positivo, 0 é o primeiro valor, o tamanho (length) deve ser positivo, em caso de 0, a substring retornará até o fim do valor, offset e length podem ser variáveis também.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(x) = &amp;quot;abcd&amp;quot;;&lt;br /&gt;
$(var(x){s.substr,1,0}) = &amp;quot;bcd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={s.select,index,separator}===&lt;br /&gt;
&lt;br /&gt;
Retorna um campo do valor da variável. O campo é selecionado baseado no spearador (separator) e indice (index). O separador deve ser um caractere usado para identificar os campos. Indice (index) deve ser um valor inteiro ou uma variavel. Se o index for negativo  a contagem de campos começa do fim do valor, -1 é o último campo, se o index é positivo, 0 é o primeiro campo.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(x) = &amp;quot;12,34,56&amp;quot;;&lt;br /&gt;
$(var(x){s.select,1,,}) =&amp;gt; &amp;quot;34&amp;quot; ;&lt;br /&gt;
&lt;br /&gt;
$var(x) = &amp;quot;12,34,56&amp;quot;;&lt;br /&gt;
$(var(x){s.select,-2,,}) =&amp;gt; &amp;quot;34&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={s.encode.hexa}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor da variável em hexa.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.decode.hexa}===&lt;br /&gt;
&lt;br /&gt;
Decodifica o valor hexa da variável.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.escape.common}===&lt;br /&gt;
&lt;br /&gt;
Retorna a string scapada do valor da variável. Caracteres escapados são ', &amp;quot;, e 0 , este recurso é util quando necessário realizar consultas em banco de dados ( deve se atentar quando utilizando caracteres que não fazem parte do LATIN )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.unescape.common}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor sem escape de uma variável, o inverso da transformação acima.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.escape.user}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor escapado da variavel, alterando para '%hexa' os caracteres nao permitidos na area  SIP URI seguindos as recomendações da RFC.&lt;br /&gt;
&lt;br /&gt;
==={s.unescape.user}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor sem escape da variável, alterando de '%hexa' para caracter, o inverso da transformação acima.&lt;br /&gt;
&lt;br /&gt;
==={s.escape.param}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor escapado da variável, alterando para '%hexa' o caractere que não é permitido na area param da SIP URI seguindo as recomendações da RFC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.unescape.param}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor sem escape da variavel alterando de '%hexa' para caractere, inverso da transformação acima.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.tolower}===&lt;br /&gt;
&lt;br /&gt;
Retorna a string em lower case (caixa baixa)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.toupper}===&lt;br /&gt;
&lt;br /&gt;
Retorna a string em upper case (caixa alta)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==URI Transformations==&lt;br /&gt;
&lt;br /&gt;
O nome da transformação inicia-se com 'uri.'. O valor da variável é considerado ser parte da SIP URI. Esta transformação retorna partes da SIP URI (veja struct sip_uri). Se a parte estiver faltando o valor retornando será uma string vazia.&lt;br /&gt;
&lt;br /&gt;
Transformações disponiveis nesta classe:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.user}===&lt;br /&gt;
Retorna o usuário no schema URI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.host}===&lt;br /&gt;
&lt;br /&gt;
(mesmo que '''{uri.domain}''')&lt;br /&gt;
&lt;br /&gt;
Retorna a parte do dominio no schema URI.&lt;br /&gt;
&lt;br /&gt;
==={uri.passwd}===&lt;br /&gt;
&lt;br /&gt;
Retorna a parte da senha no schema URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.port}===&lt;br /&gt;
&lt;br /&gt;
Retorna a parte da porta no schema URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.params}===&lt;br /&gt;
&lt;br /&gt;
Retorna todos os parametros da URI em uma única string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.param,name}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro da URI com nome de &amp;quot;name&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.headers}===&lt;br /&gt;
&lt;br /&gt;
Retorna os cabeçalhos URI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.transport}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro transport da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.ttl}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro TTL da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.uparam}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro user da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.maddr}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro maddr da URI.&lt;br /&gt;
&lt;br /&gt;
==={uri.method}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro metodo da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.lr}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro lr da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.r2}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro r2 da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==VIA Transformations==&lt;br /&gt;
&lt;br /&gt;
Estas são as tranformações para o cabeçalho Via e todas iniciam com @@via@@. O valor da variável é considerado estar no cabeçalho SIP Via. Esta transformação retornará partes do cabeçalho vai ( veja struct via_body ). Se parte requisitada estiver faltando então o valor de retorna será uma variável vazia. A transformação irá falhar (com erro no script) se a variável que contem o cabeçalho Via estiver vazia. A menos que especificado abaixo, o resultado da transformação será uma string (não um inteiro).&lt;br /&gt;
&lt;br /&gt;
Exemplos:&lt;br /&gt;
    $var(upstreamtransport) = $(hdr(Via)[1]{via.transport}{s.tolower});&lt;br /&gt;
    $var(upstreamip) = $(hdr(Via)[1]{via.param,received});&lt;br /&gt;
    $var(clientport) = $(hdr(Via)[-1]{via.param,rport});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Transformações disponíveis nesta classe:    &lt;br /&gt;
&lt;br /&gt;
==={via.name}===&lt;br /&gt;
&lt;br /&gt;
Retorna o @@protocol-name@@ ( RFC3261 BNF ), geralmente @@SIP@@.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.version}===&lt;br /&gt;
&lt;br /&gt;
Retorna o @@protocol-version@@ ( RFC3261 BNF ), geralmente @@2.0@@.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.transport}===&lt;br /&gt;
&lt;br /&gt;
Retorna o @@transport@@ ( RFC3261 BNF ), ex: @@UDP@@, @@TCP@@, @@TLS@@. Este é o protocolo de transporte utilizado para enviar a mensagem.&lt;br /&gt;
&lt;br /&gt;
==={via.host}===&lt;br /&gt;
&lt;br /&gt;
(mesmo que @@{via.domain}@@)&lt;br /&gt;
&lt;br /&gt;
Retorna o @@host@@ do @@sent-by@@ (RFC3261 BNF). Tipicamente é o IP de quem enviou a requisição, e claro, é o endereço para onde a resposta será envaida.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.port}===&lt;br /&gt;
&lt;br /&gt;
Retorna a @@port@@ to @@sent-by@@ (RFC3261). Tipicamente é a  Porta de quem enviou a requisição e o endereço para onde a resposta será enviada, o resultado da transformação é valido tanto como inteiro quanto string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.comment}===&lt;br /&gt;
&lt;br /&gt;
O comment associado com o cabeçalho via. A @@struct via_body@@ contém este capmo, mas ele não é claro que a RFC3261 permite a utilização de comentarios em cabeçalho Via ( veja o texto no topo da pagina 221 , e a BNF não explicita se permite comentário em Via). O texto da comment deve ser fechado por parenteses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.params}===&lt;br /&gt;
&lt;br /&gt;
Retorna Todos os parametros do cabeçalho Via ( @@via-param@@ da RFC3261 BNF ) como uma string única. O resultado pode ser processado através da transformação @@{param.*}@@ . Isso é basicamente tudo após o host e porta.&lt;br /&gt;
&lt;br /&gt;
==={via.param,name}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro do cabeçalho Via especificado por @@name@@. Tipicamente parametros incluem @@branch@@, @@rport@@ e @@received@@.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.branch}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro branch no cabeçalho VIA.&lt;br /&gt;
&lt;br /&gt;
==={via.received}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro received no cabeçalho Via , se existir.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.rport}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro rport no cabeçalho VIA, se existir.&lt;br /&gt;
&lt;br /&gt;
==Parameters List Transformations==&lt;br /&gt;
&lt;br /&gt;
O nome da transformação inicia por &amp;quot;param.&amp;quot; . O valor da variavel é considerado uma string como nome1=valor1; nome2=valor2;...&amp;quot; . A transformação retorna o valor de um parametro especifico ou o nome do parametro especificado no indice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Transformações disponiveis nesta classe:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={param.value,name}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro 'name'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;a=1;b=2;c=3&amp;quot;{param.value,c} = &amp;quot;3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
O valor de 'name' pode ser uma variável.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={param.exist,name}===&lt;br /&gt;
&lt;br /&gt;
Retorna 1 se o parametro @@name@@ existir (com ou sem valor), caso contrário retorna 0. O valor retornado é tanto string quanto inteiro. @@name@@ pode ser uma variável. Esta função pode ser utilizada para testar se um parametro possue ou não valores.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;a=0;b=2;ob;c=3&amp;quot;{param.exist,ob};         # returns 1&lt;br /&gt;
&amp;quot;a=0;b=2;ob;c=3&amp;quot;{param.exist,a};          # returns 1&lt;br /&gt;
&amp;quot;a=0;b=2;ob;c=3&amp;quot;{param.exist,foo};        # returns 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={param.valueat,index}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro na posição fornecida por 'index' (0-based index)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;a=1;b=2;c=3&amp;quot;{param.valueat,1} = &amp;quot;2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'index' pode ser uma variável&lt;br /&gt;
&lt;br /&gt;
==={param.name,index}===&lt;br /&gt;
&lt;br /&gt;
Retorna o nome do parametro na posição 'index'.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;a=1;b=2;c=3&amp;quot;{param.name,1} = &amp;quot;b&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={param.count}===&lt;br /&gt;
&lt;br /&gt;
Retorna o número de parametros na lista.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;a=1;b=2;c=3&amp;quot;{param.count} = 3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Name-address Transformations==&lt;br /&gt;
&lt;br /&gt;
A nome da transformação inica com 'nameaddr.' . O valor da variável é considerado ser uma string como '[display_name] uri'. A transformação retorna o valor especificado no campo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Transformações disponiveis para esta classe:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={nameaddr.name}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor de display name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 '&amp;quot;test&amp;quot; &amp;lt;sip:test@opensips.org&amp;gt;' {nameaddr.name} = &amp;quot;test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={nameaddr.uri}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor da URI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 '&amp;quot;test&amp;quot; &amp;lt;sip:test@opensips.org&amp;gt;' {nameaddr.uri} = sip:test@opensips.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={nameaddr.len}===&lt;br /&gt;
&lt;br /&gt;
Retorna o tamanho da name-addr &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={nameaddr.param,param_name}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro com o nome 'param_name'.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
 '&amp;quot;test&amp;quot; &amp;lt;sip:test@opensips.org&amp;gt;;tag=dat43h' {nameaddr.param,tag} = dat43h&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={nameaddr.params}===&lt;br /&gt;
&lt;br /&gt;
Retorna os parametros e seus valores correspondentes.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 '&amp;quot;test&amp;quot; &amp;lt;sip:test@opensips.org&amp;gt;;tag=dat43h;private=yes' {nameaddr.params} = &amp;quot;tag=dat43h;private=yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==IP Transformations==&lt;br /&gt;
&lt;br /&gt;
O nome da transformação inicia com 'ip.' &lt;br /&gt;
&lt;br /&gt;
Transformações disponiveis para esta classe:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={ip.pton}===&lt;br /&gt;
&lt;br /&gt;
Retorna a representação binária do IP&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;192.168.2.134&amp;quot; {ip.pton} returns a 4 byte binary representation of the IP provided&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={ip.ntop}===&lt;br /&gt;
&lt;br /&gt;
Retorna a representação de um binário de IP&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;192.168.2.134&amp;quot;{ip.pton}{ip.ntop} = &amp;quot;192.168.2.134&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={ip.isip}===&lt;br /&gt;
&lt;br /&gt;
Retorna 1 ou 0, se a string provida for um ip válido ou não.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;192.168.2.134&amp;quot; {ip.isip} = 1&lt;br /&gt;
 &amp;quot;192.168.2.134.1&amp;quot; {ip.isip} = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={ip.family}===&lt;br /&gt;
&lt;br /&gt;
Retorna INET ou INET6 se a representação binária provida for um IPv4 ou IPv6.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;192.168.2.134&amp;quot; {ip.pton}{ip.family} = &amp;quot;INET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={ip.resolve}===&lt;br /&gt;
&lt;br /&gt;
Retorna o IP de um host.dominio informado. a transformação não tem efeito se um IP for forncido.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;opensips.org&amp;quot; {ip.resolve} = &amp;quot;78.46.64.50&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CSV Transformations==&lt;br /&gt;
&lt;br /&gt;
O nome da transformação inicia com &amp;quot;csv.&amp;quot; . O valor da variável é considerado ser uma string como &amp;quot;campo1,campo2,....&amp;quot;. A transformação retorna o numero de entradas no CSV informado, ou o campo de uma posição especifica do CSV.&lt;br /&gt;
&lt;br /&gt;
Tranformações disponiveis nesta classe:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={csv.count}===&lt;br /&gt;
Retorna o número de entradas no CSV provido.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
 &amp;quot;a,b,c&amp;quot; {csv.count} = 3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={csv.value}===&lt;br /&gt;
Retorna a entrada na posição especifica. Index inicia em 0&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;a,b,c&amp;quot; {csv.value,2} = c&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==SDP Transformations==&lt;br /&gt;
&lt;br /&gt;
O nome da transformação inica com &amp;quot;sdp.&amp;quot;. O valor da variaável é considerado ser um body SDP válido. A transformação retorna uma linha especifica no body SDP.&lt;br /&gt;
&lt;br /&gt;
Transformações disponiveis para esta classe:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={sdp.line}==&lt;br /&gt;
&lt;br /&gt;
Retorna a linha especifica do body SDP. A transformação também aceita um segundo parametro, este especificado é o número da linha do primeiro parametro para pegar do body SDP. Index inicia em 0. Se o segundo parametro estiver faltando ele assume 0.&lt;br /&gt;
&lt;br /&gt;
Exemplo&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;))&lt;br /&gt;
   {&lt;br /&gt;
      $var(aline) = $(rb{sdp.line,a,1});&lt;br /&gt;
      xlog(&amp;quot;The second a line in the SDP body is $var(aline)\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;))&lt;br /&gt;
   {&lt;br /&gt;
      $var(mline) = $(rb{sdp.line,m});&lt;br /&gt;
      xlog(&amp;quot;The first m line in the SDP body is $var(mline)\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Regular Expression Transformations==&lt;br /&gt;
&lt;br /&gt;
O nome da trasnformação inicia-se com &amp;quot;re.&amp;quot; . O valor de entrada pode ser qualquer string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={re.subst,reg_exp}===&lt;br /&gt;
&lt;br /&gt;
O parametro reg_exp pode ser tanto uma string quanto uma variável.&lt;br /&gt;
&lt;br /&gt;
O formato da reg_exp é:&lt;br /&gt;
&lt;br /&gt;
    /posix_match_expression/replacement_expression/flags&lt;br /&gt;
&lt;br /&gt;
As flags podem ser:&lt;br /&gt;
    i - match ignore case&lt;br /&gt;
    s - match within multi-lines strings&lt;br /&gt;
    g - replace all matches&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(reg_input)=&amp;quot;abc&amp;quot;;&lt;br /&gt;
$var(reg) = &amp;quot;/a/A/g&amp;quot;;&lt;br /&gt;
xlog(&amp;quot;Applying reg exp $var(reg) to $var(reg_input) : $(var(reg_input){re.subst,$var(reg)})\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
xlog(&amp;quot;Applying reg /b/B/g to $var(reg_input) : $(var(reg_input){re.subst,/b/B/g})\n&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemplos==&lt;br /&gt;
&lt;br /&gt;
Em uma variável, muitas trasnformações podem ser aplicadas, começando da esquerda para a direita.&lt;br /&gt;
&lt;br /&gt;
* O tamanho do valor da variavel do parametro na posição 1 (lembre-se que 0 é a primeira posição, 1 é a segunda)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(x) = &amp;quot;a=1;b=22;c=333&amp;quot;;&lt;br /&gt;
$(var(x){param.value,$(var(x){param.name,1})}{s.len}) = 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Testa se é des-registro ou não&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if(is_method(&amp;quot;REGISTER&amp;quot;) &amp;amp;&amp;amp; is_present_hf(&amp;quot;Expires&amp;quot;) &amp;amp;&amp;amp; $(hdr(Expires){s.int})==0)&lt;br /&gt;
    xlog(&amp;quot;This is an un-registrationn&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Opensips_1.9_Manual|Voltar]]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Transforma%C3%A7%C3%B5es&amp;diff=1486</id>
		<title>Transformações</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Transforma%C3%A7%C3%B5es&amp;diff=1486"/>
		<updated>2014-04-23T18:08:32Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Transformação''' é basicamente a função que é aplicada a uma variável (variavel de script, pseudo-variavel, AVPS, strings staticas), para pegar um valor especial, o valor da variável horiginal não é alterado.&lt;br /&gt;
&lt;br /&gt;
Exemplo utilizando diferentes tipos de variáveis em no '''script OpenSIPS'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# verificando se o usuário no cabeçalho From é igual ao usuário no cabeçalho To &lt;br /&gt;
&lt;br /&gt;
if($fU==$tU) {&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# checagem de usuário baseado em r-uri &lt;br /&gt;
&lt;br /&gt;
switch($ruri.user) {&lt;br /&gt;
   case &amp;quot;1234&amp;quot;:&lt;br /&gt;
      ...&lt;br /&gt;
   break;&lt;br /&gt;
   case &amp;quot;5678&amp;quot;:&lt;br /&gt;
      ...&lt;br /&gt;
   break;&lt;br /&gt;
   default:&lt;br /&gt;
     ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# definindo um valor inteiro para um AVP &lt;br /&gt;
$avp(i:11) = 1;&lt;br /&gt;
&lt;br /&gt;
# definindo um valor de texto (string) para um AVP&lt;br /&gt;
$avp(i:22) = &amp;quot;opensips&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# Definir o valor de $ruri para um avp&lt;br /&gt;
$avp(i:33) = $ruri;&lt;br /&gt;
&lt;br /&gt;
# concatenando &amp;quot;sip:&amp;quot; + usuário no From + &amp;quot;@&amp;quot; + dominio no To na variável x&lt;br /&gt;
$var(x) = &amp;quot;sip:&amp;quot; + $fU +&amp;quot;@&amp;quot; + $td;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As transformações possuem o intuito de facilitar o acesso a diferentes atributos de variáveis, como o tamanho da string (strlen) , partes do valor, substring ou valores diferentes de variaveis (encoded em hexa, valor md5, escapar valores para operações em banco).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A transformação é representada entre ''''{'''' e ''''}'''' e segue o nome da variável. Quando utilizando transformação, o nome da variável e transformações '''devem''' estar dentro de parentesis ''''('''' e '''')'''' .&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# o tamanho do From URI ( $fu é uma pseudo-variável para From URI)&lt;br /&gt;
&lt;br /&gt;
$(fu{s.len})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Muitas transformações podem ser aplicadas ao mesmo tempo na mesma variável.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# O tamanho do cabeçalho 'Test' (escapado) .&lt;br /&gt;
&lt;br /&gt;
$(hdr(Test){s.escape.common}{s.len})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A transformação pode ser utilizada em qualquer lugar, sendo considerada parte das variáveis no script --- no xlog, avpops ou outros módulos, funções e parametros, a direita de expressões de atribuição ou em comparações.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
Para aprender que variável pode ser utilizada com transformações veja [[http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core| Variáveis Core]]&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Transformação de string==&lt;br /&gt;
O nome destas trasnformações iniciam com 's.' , são utilizadas para aplicar operações de string nas variáveis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Transformações disponiveis nesta classe:&lt;br /&gt;
&lt;br /&gt;
==={s.len}===&lt;br /&gt;
&lt;br /&gt;
Retorna o tamanho do valor de uma variável&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(x) = &amp;quot;abc&amp;quot;;&lt;br /&gt;
if($(var(x){s.len}) == 3)&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={s.int}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor inteiro de uma string númerica.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(x) = &amp;quot;1234&amp;quot;;&lt;br /&gt;
if($(var(x){s.int})==1234) {&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={s.md5}===&lt;br /&gt;
&lt;br /&gt;
Retorna o md5 do valor da variável&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xlog(&amp;quot;MD4 over From username: $(fU{s.md5})&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={s.substr,offset,length}===&lt;br /&gt;
&lt;br /&gt;
Retornar o pedaço (substring) iniciando no valor de offset até o valor de length . Se offset é negativo, então a contagem começa no fim, onde -1 é o último caracter. Em caso de valor positivo, 0 é o primeiro valor, o tamanho (length) deve ser positivo, em caso de 0, a substring retornará até o fim do valor, offset e length podem ser variáveis também.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(x) = &amp;quot;abcd&amp;quot;;&lt;br /&gt;
$(var(x){s.substr,1,0}) = &amp;quot;bcd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={s.select,index,separator}===&lt;br /&gt;
&lt;br /&gt;
Retorna um campo do valor da variável. O campo é selecionado baseado no spearador (separator) e indice (index). O separador deve ser um caractere usado para identificar os campos. Indice (index) deve ser um valor inteiro ou uma variavel. Se o index for negativo  a contagem de campos começa do fim do valor, -1 é o último campo, se o index é positivo, 0 é o primeiro campo.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(x) = &amp;quot;12,34,56&amp;quot;;&lt;br /&gt;
$(var(x){s.select,1,,}) =&amp;gt; &amp;quot;34&amp;quot; ;&lt;br /&gt;
&lt;br /&gt;
$var(x) = &amp;quot;12,34,56&amp;quot;;&lt;br /&gt;
$(var(x){s.select,-2,,}) =&amp;gt; &amp;quot;34&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={s.encode.hexa}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor da variável em hexa.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.decode.hexa}===&lt;br /&gt;
&lt;br /&gt;
Decodifica o valor hexa da variável.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.escape.common}===&lt;br /&gt;
&lt;br /&gt;
Retorna a string scapada do valor da variável. Caracteres escapados são ', &amp;quot;, e 0 , este recurso é util quando necessário realizar consultas em banco de dados ( deve se atentar quando utilizando caracteres que não fazem parte do LATIN )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.unescape.common}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor sem escape de uma variável, o inverso da transformação acima.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.escape.user}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor escapado da variavel, alterando para '%hexa' os caracteres nao permitidos na area  SIP URI seguindos as recomendações da RFC.&lt;br /&gt;
&lt;br /&gt;
==={s.unescape.user}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor sem escape da variável, alterando de '%hexa' para caracter, o inverso da transformação acima.&lt;br /&gt;
&lt;br /&gt;
==={s.escape.param}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor escapado da variável, alterando para '%hexa' o caractere que não é permitido na area param da SIP URI seguindo as recomendações da RFC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.unescape.param}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor sem escape da variavel alterando de '%hexa' para caractere, inverso da transformação acima.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.tolower}===&lt;br /&gt;
&lt;br /&gt;
Retorna a string em lower case (caixa baixa)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.toupper}===&lt;br /&gt;
&lt;br /&gt;
Retorna a string em upper case (caixa alta)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==URI Transformations==&lt;br /&gt;
&lt;br /&gt;
O nome da transformação inicia-se com 'uri.'. O valor da variável é considerado ser parte da SIP URI. Esta transformação retorna partes da SIP URI (veja struct sip_uri). Se a parte estiver faltando o valor retornando será uma string vazia.&lt;br /&gt;
&lt;br /&gt;
Transformações disponiveis nesta classe:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.user}===&lt;br /&gt;
Retorna o usuário no schema URI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.host}===&lt;br /&gt;
&lt;br /&gt;
(mesmo que '''{uri.domain}''')&lt;br /&gt;
&lt;br /&gt;
Retorna a parte do dominio no schema URI.&lt;br /&gt;
&lt;br /&gt;
==={uri.passwd}===&lt;br /&gt;
&lt;br /&gt;
Retorna a parte da senha no schema URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.port}===&lt;br /&gt;
&lt;br /&gt;
Retorna a parte da porta no schema URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.params}===&lt;br /&gt;
&lt;br /&gt;
Retorna todos os parametros da URI em uma única string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.param,name}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro da URI com nome de &amp;quot;name&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.headers}===&lt;br /&gt;
&lt;br /&gt;
Retorna os cabeçalhos URI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.transport}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro transport da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.ttl}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro TTL da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.uparam}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro user da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.maddr}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro maddr da URI.&lt;br /&gt;
&lt;br /&gt;
==={uri.method}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro metodo da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.lr}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro lr da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.r2}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro r2 da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==VIA Transformations==&lt;br /&gt;
&lt;br /&gt;
Estas são as tranformações para o cabeçalho Via e todas iniciam com @@via@@. O valor da variável é considerado estar no cabeçalho SIP Via. Esta transformação retornará partes do cabeçalho vai ( veja struct via_body ). Se parte requisitada estiver faltando então o valor de retorna será uma variável vazia. A transformação irá falhar (com erro no script) se a variável que contem o cabeçalho Via estiver vazia. A menos que especificado abaixo, o resultado da transformação será uma string (não um inteiro).&lt;br /&gt;
&lt;br /&gt;
Exemplos:&lt;br /&gt;
    $var(upstreamtransport) = $(hdr(Via)[1]{via.transport}{s.tolower});&lt;br /&gt;
    $var(upstreamip) = $(hdr(Via)[1]{via.param,received});&lt;br /&gt;
    $var(clientport) = $(hdr(Via)[-1]{via.param,rport});&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Transformações disponíveis nesta classe:    &lt;br /&gt;
&lt;br /&gt;
==={via.name}===&lt;br /&gt;
&lt;br /&gt;
Retorna o @@protocol-name@@ ( RFC3261 BNF ), geralmente @@SIP@@.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.version}===&lt;br /&gt;
&lt;br /&gt;
Retorna o @@protocol-version@@ ( RFC3261 BNF ), geralmente @@2.0@@.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.transport}===&lt;br /&gt;
&lt;br /&gt;
Retorna o @@transport@@ ( RFC3261 BNF ), ex: @@UDP@@, @@TCP@@, @@TLS@@. Este é o protocolo de transporte utilizado para enviar a mensagem.&lt;br /&gt;
&lt;br /&gt;
==={via.host}===&lt;br /&gt;
&lt;br /&gt;
(mesmo que @@{via.domain}@@)&lt;br /&gt;
&lt;br /&gt;
Retorna o @@host@@ do @@sent-by@@ (RFC3261 BNF). Tipicamente é o IP de quem enviou a requisição, e claro, é o endereço para onde a resposta será envaida.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.port}===&lt;br /&gt;
&lt;br /&gt;
Retorna a @@port@@ to @@sent-by@@ (RFC3261). Tipicamente é a  Porta de quem enviou a requisição e o endereço para onde a resposta será enviada, o resultado da transformação é valido tanto como inteiro quanto string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.comment}===&lt;br /&gt;
&lt;br /&gt;
O comment associado com o cabeçalho via. A @@struct via_body@@ contém este capmo, mas ele não é claro que a RFC3261 permite a utilização de comentarios em cabeçalho Via ( veja o texto no topo da pagina 221 , e a BNF não explicita se permite comentário em Via). O texto da comment deve ser fechado por parenteses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.params}===&lt;br /&gt;
&lt;br /&gt;
Retorna Todos os parametros do cabeçalho Via ( @@via-param@@ da RFC3261 BNF ) como uma string única. O resultado pode ser processado através da transformação @@{param.*}@@ . Isso é basicamente tudo após o host e porta.&lt;br /&gt;
&lt;br /&gt;
==={via.param,name}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro do cabeçalho Via especificado por @@name@@. Tipicamente parametros incluem @@branch@@, @@rport@@ e @@received@@.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.branch}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro branch no cabeçalho VIA.&lt;br /&gt;
&lt;br /&gt;
==={via.received}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro received no cabeçalho Via , se existir.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={via.rport}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro rport no cabeçalho VIA, se existir.&lt;br /&gt;
&lt;br /&gt;
==Parameters List Transformations==&lt;br /&gt;
&lt;br /&gt;
O nome da transformação inicia por &amp;quot;param.&amp;quot; . O valor da variavel é considerado uma string como nome1=valor1; nome2=valor2;...&amp;quot; . A transformação retorna o valor de um parametro especifico ou o nome do parametro especificado no indice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Transformações disponiveis nesta classe:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={param.value,name}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro 'name'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;a=1;b=2;c=3&amp;quot;{param.value,c} = &amp;quot;3&amp;quot;&lt;br /&gt;
&lt;br /&gt;
O valor de 'name' pode ser uma variável.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={param.exist,name}===&lt;br /&gt;
&lt;br /&gt;
Retorna 1 se o parametro @@name@@ existir (com ou sem valor), caso contrário retorna 0. O valor retornado é tanto string quanto inteiro. @@name@@ pode ser uma variável. Esta função pode ser utilizada para testar se um parametro possue ou não valores.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;a=0;b=2;ob;c=3&amp;quot;{param.exist,ob};         # returns 1&lt;br /&gt;
&amp;quot;a=0;b=2;ob;c=3&amp;quot;{param.exist,a};          # returns 1&lt;br /&gt;
&amp;quot;a=0;b=2;ob;c=3&amp;quot;{param.exist,foo};        # returns 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={param.valueat,index}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro na posição fornecida por 'index' (0-based index)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;a=1;b=2;c=3&amp;quot;{param.valueat,1} = &amp;quot;2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'index' pode ser uma variável&lt;br /&gt;
&lt;br /&gt;
==={param.name,index}===&lt;br /&gt;
&lt;br /&gt;
Retorna o nome do parametro na posição 'index'.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;a=1;b=2;c=3&amp;quot;{param.name,1} = &amp;quot;b&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={param.count}===&lt;br /&gt;
&lt;br /&gt;
Retorna o número de parametros na lista.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;a=1;b=2;c=3&amp;quot;{param.count} = 3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Name-address Transformations==&lt;br /&gt;
&lt;br /&gt;
A nome da transformação inica com 'nameaddr.' . O valor da variável é considerado ser uma string como '[display_name] uri'. A transformação retorna o valor especificado no campo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Transformações disponiveis para esta classe:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={nameaddr.name}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor de display name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 '&amp;quot;test&amp;quot; &amp;lt;sip:test@opensips.org&amp;gt;' {nameaddr.name} = &amp;quot;test&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={nameaddr.uri}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor da URI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 '&amp;quot;test&amp;quot; &amp;lt;sip:test@opensips.org&amp;gt;' {nameaddr.uri} = sip:test@opensips.org&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={nameaddr.len}===&lt;br /&gt;
&lt;br /&gt;
Retorna o tamanho da name-addr &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={nameaddr.param,param_name}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro com o nome 'param_name'.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
 '&amp;quot;test&amp;quot; &amp;lt;sip:test@opensips.org&amp;gt;;tag=dat43h' {nameaddr.param,tag} = dat43h&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={nameaddr.params}===&lt;br /&gt;
&lt;br /&gt;
Retorna os parametros e seus valores correspondentes.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 '&amp;quot;test&amp;quot; &amp;lt;sip:test@opensips.org&amp;gt;;tag=dat43h;private=yes' {nameaddr.params} = &amp;quot;tag=dat43h;private=yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==IP Transformations==&lt;br /&gt;
&lt;br /&gt;
O nome da transformação inicia com 'ip.' &lt;br /&gt;
&lt;br /&gt;
Transformações disponiveis para esta classe:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={ip.pton}===&lt;br /&gt;
&lt;br /&gt;
Retorna a representação binária do IP&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;192.168.2.134&amp;quot; {ip.pton} returns a 4 byte binary representation of the IP provided&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={ip.ntop}===&lt;br /&gt;
&lt;br /&gt;
Retorna a representação de um binário de IP&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;192.168.2.134&amp;quot;{ip.pton}{ip.ntop} = &amp;quot;192.168.2.134&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={ip.isip}===&lt;br /&gt;
&lt;br /&gt;
Retorna 1 ou 0, se a string provida for um ip válido ou não.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;192.168.2.134&amp;quot; {ip.isip} = 1&lt;br /&gt;
 &amp;quot;192.168.2.134.1&amp;quot; {ip.isip} = 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={ip.family}===&lt;br /&gt;
&lt;br /&gt;
Retorna INET ou INET6 se a representação binária provida for um IPv4 ou IPv6.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;192.168.2.134&amp;quot; {ip.pton}{ip.family} = &amp;quot;INET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={ip.resolve}===&lt;br /&gt;
&lt;br /&gt;
Retorna o IP de um host.dominio informado. a transformação não tem efeito se um IP for forncido.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;opensips.org&amp;quot; {ip.resolve} = &amp;quot;78.46.64.50&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==CSV Transformations==&lt;br /&gt;
&lt;br /&gt;
O nome da transformação inicia com &amp;quot;csv.&amp;quot; . O valor da variável é considerado ser uma string como &amp;quot;campo1,campo2,....&amp;quot;. A transformação retorna o numero de entradas no CSV informado, ou o campo de uma posição especifica do CSV.&lt;br /&gt;
&lt;br /&gt;
Tranformações disponiveis nesta classe:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={csv.count}===&lt;br /&gt;
Returns the number of entries in the provided CSV.&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;a,b,c&amp;quot; {csv.count} = 3&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{csv.value}&lt;br /&gt;
Returns the entry at the specified positions. Indexing starts from 0.&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;a,b,c&amp;quot; {csv.value,2} = c&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!SDP Transformations&lt;br /&gt;
&lt;br /&gt;
The name of the transformation starts with &amp;quot;sdp.&amp;quot;. The value of the variable is considered to be a valid SDP body. The transformation returns a specific line in the SDP body.&lt;br /&gt;
&lt;br /&gt;
Available transformations in this class:&lt;br /&gt;
&lt;br /&gt;
!!!!{sdp.line}&lt;br /&gt;
Returns the specified line in the SDP body. The transformations also accepts a second parameter, that specifies the line number of the first parameter's type to get from the SDP body. Indexing starts from 0. If the second parameter is missing, it is assumed to be 0. &lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;))&lt;br /&gt;
   {&lt;br /&gt;
      $var(aline) = $(rb{sdp.line,a,1});&lt;br /&gt;
      xlog(&amp;quot;The second a line in the SDP body is $var(aline)\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;))&lt;br /&gt;
   {&lt;br /&gt;
      $var(mline) = $(rb{sdp.line,m});&lt;br /&gt;
      xlog(&amp;quot;The first m line in the SDP body is $var(mline)\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!Regular Expression Transformations&lt;br /&gt;
&lt;br /&gt;
The name of the transformation starts with &amp;quot;re.&amp;quot;. The input can be any string.&lt;br /&gt;
&lt;br /&gt;
!!!!{re.subst,reg_exp}&lt;br /&gt;
&lt;br /&gt;
The reg_exp parameter can either be a plain string or a variable.&lt;br /&gt;
The format of the reg_exp is :&lt;br /&gt;
    /posix_match_expression/replacement_expression/flags&lt;br /&gt;
&lt;br /&gt;
The flags can be&lt;br /&gt;
    i - match ignore case&lt;br /&gt;
    s - match within multi-lines strings&lt;br /&gt;
    g - replace all matches&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
$var(reg_input)=&amp;quot;abc&amp;quot;;&lt;br /&gt;
$var(reg) = &amp;quot;/a/A/g&amp;quot;;&lt;br /&gt;
xlog(&amp;quot;Applying reg exp $var(reg) to $var(reg_input) : $(var(reg_input){re.subst,$var(reg)})\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
xlog(&amp;quot;Applying reg /b/B/g to $var(reg_input) : $(var(reg_input){re.subst,/b/B/g})\n&amp;quot;);&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!Examples&lt;br /&gt;
&lt;br /&gt;
Within a variable, many transformation can be applied, being executed from left to right.&lt;br /&gt;
&lt;br /&gt;
* The length of the value of parameter at postion 1 (remember 0 is first position, 1 is second position)&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
$var(x) = &amp;quot;a=1;b=22;c=333&amp;quot;;&lt;br /&gt;
$(var(x){param.value,$(var(x){param.name,1})}{s.len}) = 2&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
* Test if whether is un-registration or not&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
if(is_method(&amp;quot;REGISTER&amp;quot;) &amp;amp;&amp;amp; is_present_hf(&amp;quot;Expires&amp;quot;) &amp;amp;&amp;amp; $(hdr(Expires){s.int})==0)&lt;br /&gt;
    xlog(&amp;quot;This is an un-registrationn&amp;quot;);&lt;br /&gt;
@]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Transforma%C3%A7%C3%B5es&amp;diff=1485</id>
		<title>Transformações</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Transforma%C3%A7%C3%B5es&amp;diff=1485"/>
		<updated>2014-04-23T17:15:10Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Transformação''' é basicamente a função que é aplicada a uma variável (variavel de script, pseudo-variavel, AVPS, strings staticas), para pegar um valor especial, o valor da variável horiginal não é alterado.&lt;br /&gt;
&lt;br /&gt;
Exemplo utilizando diferentes tipos de variáveis em no '''script OpenSIPS'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# verificando se o usuário no cabeçalho From é igual ao usuário no cabeçalho To &lt;br /&gt;
&lt;br /&gt;
if($fU==$tU) {&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# checagem de usuário baseado em r-uri &lt;br /&gt;
&lt;br /&gt;
switch($ruri.user) {&lt;br /&gt;
   case &amp;quot;1234&amp;quot;:&lt;br /&gt;
      ...&lt;br /&gt;
   break;&lt;br /&gt;
   case &amp;quot;5678&amp;quot;:&lt;br /&gt;
      ...&lt;br /&gt;
   break;&lt;br /&gt;
   default:&lt;br /&gt;
     ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# definindo um valor inteiro para um AVP &lt;br /&gt;
$avp(i:11) = 1;&lt;br /&gt;
&lt;br /&gt;
# definindo um valor de texto (string) para um AVP&lt;br /&gt;
$avp(i:22) = &amp;quot;opensips&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# Definir o valor de $ruri para um avp&lt;br /&gt;
$avp(i:33) = $ruri;&lt;br /&gt;
&lt;br /&gt;
# concatenando &amp;quot;sip:&amp;quot; + usuário no From + &amp;quot;@&amp;quot; + dominio no To na variável x&lt;br /&gt;
$var(x) = &amp;quot;sip:&amp;quot; + $fU +&amp;quot;@&amp;quot; + $td;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As transformações possuem o intuito de facilitar o acesso a diferentes atributos de variáveis, como o tamanho da string (strlen) , partes do valor, substring ou valores diferentes de variaveis (encoded em hexa, valor md5, escapar valores para operações em banco).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A transformação é representada entre ''''{'''' e ''''}'''' e segue o nome da variável. Quando utilizando transformação, o nome da variável e transformações '''devem''' estar dentro de parentesis ''''('''' e '''')'''' .&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# o tamanho do From URI ( $fu é uma pseudo-variável para From URI)&lt;br /&gt;
&lt;br /&gt;
$(fu{s.len})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Muitas transformações podem ser aplicadas ao mesmo tempo na mesma variável.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# O tamanho do cabeçalho 'Test' (escapado) .&lt;br /&gt;
&lt;br /&gt;
$(hdr(Test){s.escape.common}{s.len})&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A transformação pode ser utilizada em qualquer lugar, sendo considerada parte das variáveis no script --- no xlog, avpops ou outros módulos, funções e parametros, a direita de expressões de atribuição ou em comparações.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&lt;br /&gt;
Para aprender que variável pode ser utilizada com transformações veja [[http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core| Variáveis Core]]&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Transformação de string==&lt;br /&gt;
O nome destas trasnformações iniciam com 's.' , são utilizadas para aplicar operações de string nas variáveis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Transformações disponiveis nesta classe:&lt;br /&gt;
&lt;br /&gt;
==={s.len}===&lt;br /&gt;
&lt;br /&gt;
Retorna o tamanho do valor de uma variável&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(x) = &amp;quot;abc&amp;quot;;&lt;br /&gt;
if($(var(x){s.len}) == 3)&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={s.int}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor inteiro de uma string númerica.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(x) = &amp;quot;1234&amp;quot;;&lt;br /&gt;
if($(var(x){s.int})==1234) {&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={s.md5}===&lt;br /&gt;
&lt;br /&gt;
Retorna o md5 do valor da variável&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xlog(&amp;quot;MD4 over From username: $(fU{s.md5})&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={s.substr,offset,length}===&lt;br /&gt;
&lt;br /&gt;
Retornar o pedaço (substring) iniciando no valor de offset até o valor de length . Se offset é negativo, então a contagem começa no fim, onde -1 é o último caracter. Em caso de valor positivo, 0 é o primeiro valor, o tamanho (length) deve ser positivo, em caso de 0, a substring retornará até o fim do valor, offset e length podem ser variáveis também.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(x) = &amp;quot;abcd&amp;quot;;&lt;br /&gt;
$(var(x){s.substr,1,0}) = &amp;quot;bcd&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={s.select,index,separator}===&lt;br /&gt;
&lt;br /&gt;
Retorna um campo do valor da variável. O campo é selecionado baseado no spearador (separator) e indice (index). O separador deve ser um caractere usado para identificar os campos. Indice (index) deve ser um valor inteiro ou uma variavel. Se o index for negativo  a contagem de campos começa do fim do valor, -1 é o último campo, se o index é positivo, 0 é o primeiro campo.&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(x) = &amp;quot;12,34,56&amp;quot;;&lt;br /&gt;
$(var(x){s.select,1,,}) =&amp;gt; &amp;quot;34&amp;quot; ;&lt;br /&gt;
&lt;br /&gt;
$var(x) = &amp;quot;12,34,56&amp;quot;;&lt;br /&gt;
$(var(x){s.select,-2,,}) =&amp;gt; &amp;quot;34&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={s.encode.hexa}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor da variável em hexa.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.decode.hexa}===&lt;br /&gt;
&lt;br /&gt;
Decodifica o valor hexa da variável.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.escape.common}===&lt;br /&gt;
&lt;br /&gt;
Retorna a string scapada do valor da variável. Caracteres escapados são ', &amp;quot;, e 0 , este recurso é util quando necessário realizar consultas em banco de dados ( deve se atentar quando utilizando caracteres que não fazem parte do LATIN )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.unescape.common}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor sem escape de uma variável, o inverso da transformação acima.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.escape.user}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor escapado da variavel, alterando para '%hexa' os caracteres nao permitidos na area  SIP URI seguindos as recomendações da RFC.&lt;br /&gt;
&lt;br /&gt;
==={s.unescape.user}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor sem escape da variável, alterando de '%hexa' para caracter, o inverso da transformação acima.&lt;br /&gt;
&lt;br /&gt;
==={s.escape.param}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor escapado da variável, alterando para '%hexa' o caractere que não é permitido na area param da SIP URI seguindo as recomendações da RFC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.unescape.param}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor sem escape da variavel alterando de '%hexa' para caractere, inverso da transformação acima.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.tolower}===&lt;br /&gt;
&lt;br /&gt;
Retorna a string em lower case (caixa baixa)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={s.toupper}===&lt;br /&gt;
&lt;br /&gt;
Retorna a string em upper case (caixa alta)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==URI Transformations==&lt;br /&gt;
&lt;br /&gt;
O nome da transformação inicia-se com 'uri.'. O valor da variável é considerado ser parte da SIP URI. Esta transformação retorna partes da SIP URI (veja struct sip_uri). Se a parte estiver faltando o valor retornando será uma string vazia.&lt;br /&gt;
&lt;br /&gt;
Transformações disponiveis nesta classe:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.user}===&lt;br /&gt;
Retorna o usuário no schema URI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.host}===&lt;br /&gt;
&lt;br /&gt;
(mesmo que '''{uri.domain}''')&lt;br /&gt;
&lt;br /&gt;
Retorna a parte do dominio no schema URI.&lt;br /&gt;
&lt;br /&gt;
==={uri.passwd}===&lt;br /&gt;
&lt;br /&gt;
Retorna a parte da senha no schema URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.port}===&lt;br /&gt;
&lt;br /&gt;
Retorna a parte da porta no schema URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.params}===&lt;br /&gt;
&lt;br /&gt;
Retorna todos os parametros da URI em uma única string.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.param,name}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro da URI com nome de &amp;quot;name&amp;quot; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.headers}===&lt;br /&gt;
&lt;br /&gt;
Retorna os cabeçalhos URI&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.transport}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro transport da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.ttl}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro TTL da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.uparam}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro user da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==={uri.maddr}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro maddr da URI.&lt;br /&gt;
&lt;br /&gt;
==={uri.method}===&lt;br /&gt;
&lt;br /&gt;
Retorna o valor do parametro metodo da URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!{uri.lr}&lt;br /&gt;
&lt;br /&gt;
Returns the value of lr URI parameter.&lt;br /&gt;
&lt;br /&gt;
!!!!{uri.r2}&lt;br /&gt;
&lt;br /&gt;
Returns the value of r2 URI parameter.&lt;br /&gt;
&lt;br /&gt;
!!!VIA Transformations&lt;br /&gt;
&lt;br /&gt;
These transformations parse Via headers and all starts with @@via.@@. The value of the variable is considered to be a SIP Via header. This transformation returns parts of the via header (see struct via_body). If the requested part is missing, the returned value is an empty string. Transformation will fail (with script error) if variable holding the Via header is empty. Unless otherwise specified in descriptions below, the result of transform is a string (not an integer).&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
    $var(upstreamtransport) = $(hdr(Via)[1]{via.transport}{s.tolower});&lt;br /&gt;
    $var(upstreamip) = $(hdr(Via)[1]{via.param,received});&lt;br /&gt;
    $var(clientport) = $(hdr(Via)[-1]{via.param,rport});&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
Available transformations in this class:&lt;br /&gt;
&lt;br /&gt;
!!!!{via.name}&lt;br /&gt;
&lt;br /&gt;
Returns the @@protocol-name@@ (of RFC3261 BNF), generally @@SIP@@.&lt;br /&gt;
&lt;br /&gt;
!!!!{via.version}&lt;br /&gt;
&lt;br /&gt;
Returns the @@protocol-version@@ (of RFC3261 BNF), generally @@2.0@@.&lt;br /&gt;
&lt;br /&gt;
!!!!{via.transport}&lt;br /&gt;
&lt;br /&gt;
Returns the @@transport@@ (of RFC3261 BNF), e.g., @@UDP@@, @@TCP@@, @@TLS@@. This is the transport protocol used to send the request message.&lt;br /&gt;
&lt;br /&gt;
!!!!{via.host}&lt;br /&gt;
&lt;br /&gt;
(same as @@{via.domain}@@)&lt;br /&gt;
&lt;br /&gt;
Returns the @@host@@ portion of the @@sent-by@@ (of RFC3261 BNF). Typically this is the IP address of the sender of the request message, and is the address to which the response will be sent.&lt;br /&gt;
&lt;br /&gt;
!!!!{via.port}&lt;br /&gt;
&lt;br /&gt;
Returns the @@port@@ portion of the @@sent-by@@ (of RFC3261 BNF). Typically this is the IP port of the sender of the request message, and is the address to which the response will be sent. Result of transform is valid as both integer and string.&lt;br /&gt;
&lt;br /&gt;
!!!!{via.comment}&lt;br /&gt;
&lt;br /&gt;
The comment associated with the via header. The @@struct via_body@@ contains this field, but it isn't clear that RFC3261 allows Via headers to have comments (see text at top of page 221, and the BNF doesn't explicit allow comment within Via). The comment is the text enclosed within parens.&lt;br /&gt;
&lt;br /&gt;
!!!!{via.params}&lt;br /&gt;
&lt;br /&gt;
Returns all the Via headers parameters (@@via-param@@ of RFC3261 BNF) as single string. Result can be processed using the @@{param.*}@@ transforms. This is essentially everything after the host and port.&lt;br /&gt;
&lt;br /&gt;
!!!!{via.param,name}&lt;br /&gt;
&lt;br /&gt;
Returns the value of Via header parameter with name @@name@@. Typical parameters include @@branch@@, @@rport@@ and @@received@@.&lt;br /&gt;
&lt;br /&gt;
!!!!{via.branch}&lt;br /&gt;
&lt;br /&gt;
Returns the value of the branch parameter in the VIA header.&lt;br /&gt;
&lt;br /&gt;
!!!!{via.received}&lt;br /&gt;
&lt;br /&gt;
Returns the value of the received parameter in the VIA header, if any.&lt;br /&gt;
&lt;br /&gt;
!!!!{via.rport}&lt;br /&gt;
&lt;br /&gt;
Returns the value of the rport parameter in the VIA header, if any.&lt;br /&gt;
&lt;br /&gt;
!!!Parameters List Transformations&lt;br /&gt;
&lt;br /&gt;
The name of the transformation starts with &amp;quot;param.&amp;quot;. The value of the variable is considered to be a string like name1=value1;name2=value2;...&amp;quot;. The transformations returns the value for a specific parameter, or the name of a parameter at a specific index.&lt;br /&gt;
&lt;br /&gt;
Available transformations in this class:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!{param.value,name}&lt;br /&gt;
&lt;br /&gt;
Returns the value of parameter 'name'&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;a=1;b=2;c=3&amp;quot;{param.value,c} = &amp;quot;3&amp;quot;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
'name' can be a variable&lt;br /&gt;
&lt;br /&gt;
!!!!{param.exist,name}&lt;br /&gt;
&lt;br /&gt;
Returns 1 if the parameter @@name@@ exists (with or without value), else 0. Returned value is both string and integer. @@name@@ can be variable. This can be used to test existence of parameters that do not have values.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;a=0;b=2;ob;c=3&amp;quot;{param.exist,ob};         # returns 1&lt;br /&gt;
&amp;quot;a=0;b=2;ob;c=3&amp;quot;{param.exist,a};          # returns 1&lt;br /&gt;
&amp;quot;a=0;b=2;ob;c=3&amp;quot;{param.exist,foo};        # returns 0&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{param.valueat,index}&lt;br /&gt;
&lt;br /&gt;
Returns the value of parameter at position give by 'index' (0-based index)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;a=1;b=2;c=3&amp;quot;{param.valueat,1} = &amp;quot;2&amp;quot;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
'index' can be a variable&lt;br /&gt;
&lt;br /&gt;
!!!!{param.name,index}&lt;br /&gt;
&lt;br /&gt;
Returns the name of parameter at position 'index'.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;a=1;b=2;c=3&amp;quot;{param.name,1} = &amp;quot;b&amp;quot;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!{param.count}&lt;br /&gt;
&lt;br /&gt;
Returns the number of parameters in the list.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;a=1;b=2;c=3&amp;quot;{param.count} = 3&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!Name-address Transformations&lt;br /&gt;
&lt;br /&gt;
The name of the transformation starts with 'nameaddr.'. The value of the variable is considered to be a string like '[display_name] uri'. The transformations returns the value for a specific field.&lt;br /&gt;
&lt;br /&gt;
Available transformations in this class:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!{nameaddr.name}&lt;br /&gt;
&lt;br /&gt;
Returns the value of display name&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
'&amp;quot;test&amp;quot; &amp;lt;sip:test@opensips.org&amp;gt;' {nameaddr.name} = &amp;quot;test&amp;quot;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{nameaddr.uri}&lt;br /&gt;
&lt;br /&gt;
Returns the value of URI&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
'&amp;quot;test&amp;quot; &amp;lt;sip:test@opensips.org&amp;gt;' {nameaddr.uri} = sip:test@opensips.org&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{nameaddr.len}&lt;br /&gt;
&lt;br /&gt;
Returns the length of the entire name-addr part from the value.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!{nameaddr.param,param_name}&lt;br /&gt;
&lt;br /&gt;
Returns the value of the parameter with name param_name.&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
'&amp;quot;test&amp;quot; &amp;lt;sip:test@opensips.org&amp;gt;;tag=dat43h' {nameaddr.param,tag} = dat43h&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{nameaddr.params}&lt;br /&gt;
&lt;br /&gt;
Returns all the parameters and their corresponding values.&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
'&amp;quot;test&amp;quot; &amp;lt;sip:test@opensips.org&amp;gt;;tag=dat43h;private=yes' {nameaddr.params} = &amp;quot;tag=dat43h;private=yes&amp;quot;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!IP Transformations&lt;br /&gt;
&lt;br /&gt;
The name of the transformation starts with 'ip.'. Available transformations in this class:&lt;br /&gt;
&lt;br /&gt;
!!!!{ip.pton}&lt;br /&gt;
&lt;br /&gt;
Returns a binary representation of a string represented IP.&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;192.168.2.134&amp;quot; {ip.pton} returns a 4 byte binary representation of the IP provided&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{ip.ntop}&lt;br /&gt;
&lt;br /&gt;
Returns a string representation of the binary IP provided&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;192.168.2.134&amp;quot;{ip.pton}{ip.ntop} = &amp;quot;192.168.2.134&amp;quot;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{ip.isip}&lt;br /&gt;
&lt;br /&gt;
Returns 1 or 0, if the string provided is a valid IP or not.&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;192.168.2.134&amp;quot; {ip.isip} = 1&lt;br /&gt;
&amp;quot;192.168.2.134.1&amp;quot; {ip.isip} = 0&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{ip.family}&lt;br /&gt;
Returns INET or INET6 if the binary IP representation provided is IPv4 or IPv6.&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;192.168.2.134&amp;quot; {ip.pton}{ip.family} = &amp;quot;INET&amp;quot;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{ip.resolve}&lt;br /&gt;
Returns the resolved IP address coresponding to the string domain provided. Transformation has no effect if a string IP is provided.&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;opensips.org&amp;quot; {ip.resolve} = &amp;quot;78.46.64.50&amp;quot;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!CSV Transformations&lt;br /&gt;
&lt;br /&gt;
The name of the transformation starts with &amp;quot;csv.&amp;quot;. The value of the variable is considered to be a string like &amp;quot;field1,field2,...&amp;quot;. The transformations return the number of entries in the provided CSV, or the field at a specified position in the CSV.&lt;br /&gt;
&lt;br /&gt;
Available transformations in this class:&lt;br /&gt;
&lt;br /&gt;
!!!!{csv.count}&lt;br /&gt;
Returns the number of entries in the provided CSV.&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;a,b,c&amp;quot; {csv.count} = 3&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{csv.value}&lt;br /&gt;
Returns the entry at the specified positions. Indexing starts from 0.&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;a,b,c&amp;quot; {csv.value,2} = c&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!SDP Transformations&lt;br /&gt;
&lt;br /&gt;
The name of the transformation starts with &amp;quot;sdp.&amp;quot;. The value of the variable is considered to be a valid SDP body. The transformation returns a specific line in the SDP body.&lt;br /&gt;
&lt;br /&gt;
Available transformations in this class:&lt;br /&gt;
&lt;br /&gt;
!!!!{sdp.line}&lt;br /&gt;
Returns the specified line in the SDP body. The transformations also accepts a second parameter, that specifies the line number of the first parameter's type to get from the SDP body. Indexing starts from 0. If the second parameter is missing, it is assumed to be 0. &lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;))&lt;br /&gt;
   {&lt;br /&gt;
      $var(aline) = $(rb{sdp.line,a,1});&lt;br /&gt;
      xlog(&amp;quot;The second a line in the SDP body is $var(aline)\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;))&lt;br /&gt;
   {&lt;br /&gt;
      $var(mline) = $(rb{sdp.line,m});&lt;br /&gt;
      xlog(&amp;quot;The first m line in the SDP body is $var(mline)\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!Regular Expression Transformations&lt;br /&gt;
&lt;br /&gt;
The name of the transformation starts with &amp;quot;re.&amp;quot;. The input can be any string.&lt;br /&gt;
&lt;br /&gt;
!!!!{re.subst,reg_exp}&lt;br /&gt;
&lt;br /&gt;
The reg_exp parameter can either be a plain string or a variable.&lt;br /&gt;
The format of the reg_exp is :&lt;br /&gt;
    /posix_match_expression/replacement_expression/flags&lt;br /&gt;
&lt;br /&gt;
The flags can be&lt;br /&gt;
    i - match ignore case&lt;br /&gt;
    s - match within multi-lines strings&lt;br /&gt;
    g - replace all matches&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
$var(reg_input)=&amp;quot;abc&amp;quot;;&lt;br /&gt;
$var(reg) = &amp;quot;/a/A/g&amp;quot;;&lt;br /&gt;
xlog(&amp;quot;Applying reg exp $var(reg) to $var(reg_input) : $(var(reg_input){re.subst,$var(reg)})\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
xlog(&amp;quot;Applying reg /b/B/g to $var(reg_input) : $(var(reg_input){re.subst,/b/B/g})\n&amp;quot;);&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!Examples&lt;br /&gt;
&lt;br /&gt;
Within a variable, many transformation can be applied, being executed from left to right.&lt;br /&gt;
&lt;br /&gt;
* The length of the value of parameter at postion 1 (remember 0 is first position, 1 is second position)&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
$var(x) = &amp;quot;a=1;b=22;c=333&amp;quot;;&lt;br /&gt;
$(var(x){param.value,$(var(x){param.name,1})}{s.len}) = 2&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
* Test if whether is un-registration or not&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
if(is_method(&amp;quot;REGISTER&amp;quot;) &amp;amp;&amp;amp; is_present_hf(&amp;quot;Expires&amp;quot;) &amp;amp;&amp;amp; $(hdr(Expires){s.int})==0)&lt;br /&gt;
    xlog(&amp;quot;This is an un-registrationn&amp;quot;);&lt;br /&gt;
@]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Transforma%C3%A7%C3%B5es&amp;diff=1484</id>
		<title>Transformações</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Transforma%C3%A7%C3%B5es&amp;diff=1484"/>
		<updated>2014-04-23T16:29:46Z</updated>

		<summary type="html">&lt;p&gt;Mike: Criou página com ''''Transformação''' é basicamente a função que é aplicada a uma variável (variavel de script, pseudo-variavel, AVPS, strings staticas), para pegar um valor especial, o ...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Transformação''' é basicamente a função que é aplicada a uma variável (variavel de script, pseudo-variavel, AVPS, strings staticas), para pegar um valor especial, o valor da variável horiginal não é alterado.&lt;br /&gt;
&lt;br /&gt;
Exemplo utilizando diferentes tipos de variáveis em no '''script OpenSIPS'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# verificando se o usuário no cabeçalho From é igual ao usuário no cabeçalho To &lt;br /&gt;
&lt;br /&gt;
if($fU==$tU) {&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# checagem de usuário baseado em r-uri &lt;br /&gt;
&lt;br /&gt;
switch($ruri.user) {&lt;br /&gt;
   case &amp;quot;1234&amp;quot;:&lt;br /&gt;
      ...&lt;br /&gt;
   break;&lt;br /&gt;
   case &amp;quot;5678&amp;quot;:&lt;br /&gt;
      ...&lt;br /&gt;
   break;&lt;br /&gt;
   default:&lt;br /&gt;
     ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# definindo um valor inteiro para um AVP &lt;br /&gt;
$avp(i:11) = 1;&lt;br /&gt;
&lt;br /&gt;
#assing string value to an AVP&lt;br /&gt;
$avp(i:22) = &amp;quot;opensips&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# write ruri in an AVP&lt;br /&gt;
$avp(i:33) = $ruri;&lt;br /&gt;
&lt;br /&gt;
# concat &amp;quot;sip:&amp;quot; + From username + &amp;quot;@&amp;quot; + To domain in a script variable x&lt;br /&gt;
$var(x) = &amp;quot;sip:&amp;quot; + $fU +&amp;quot;@&amp;quot; + $td;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The transformations are intended to facilitate access to different attributes of variables (like strlen of value, parts of value, substrings) or complete different value of variables (encoded in hexa, md5 value, escape/unescape value for DB operations...).&lt;br /&gt;
&lt;br /&gt;
A transformation is represented in between ''''{'''' and ''''}'''' and follows the name of a variable. When using transformations, the variable name and transformations '''must''' be enclosed in between ''''('''' and '''')''''.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
# the length of From URI ($fu is pseudo-variable for From URI)&lt;br /&gt;
&lt;br /&gt;
$(fu{s.len})&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
Many transformations can be applied in the same time to a variable.&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
# the length of escaped 'Test' header body&lt;br /&gt;
&lt;br /&gt;
$(hdr(Test){s.escape.common}{s.len})&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
The transformations can be used anywhere, being considered parts of script variables support -- in xlog, avpops or other modules' functions and parameters, in right side assignment expressions or in comparisons.&lt;br /&gt;
&lt;br /&gt;
%red%IMPORTANT%%: To learn what variables can be used with transformations see [[Documentation.Script-CoreVar-1-9|Scripting variables list]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!String Transformations&lt;br /&gt;
The name of these transformation starts with 's.'. They are intended to apply string operations to variables.&lt;br /&gt;
&lt;br /&gt;
Available transformations in this class:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!{s.len}&lt;br /&gt;
&lt;br /&gt;
Return strlen of variable value&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
$var(x) = &amp;quot;abc&amp;quot;;&lt;br /&gt;
if($(var(x){s.len}) == 3)&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{s.int}&lt;br /&gt;
&lt;br /&gt;
Return integer value of a string-represented number&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
$var(x) = &amp;quot;1234&amp;quot;;&lt;br /&gt;
if($(var(x){s.int})==1234) {&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{s.md5}&lt;br /&gt;
&lt;br /&gt;
Return md5 over variable value&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
xlog(&amp;quot;MD4 over From username: $(fU{s.md5})&amp;quot;);&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{s.substr,offset,length}&lt;br /&gt;
&lt;br /&gt;
Return substring starting at offset having size of 'length'. If offset is negative, then it is counted from the end of the value, -1 being the last char. In case of positive value, 0 is first char. Length must be positive, in case of 0, substring to the end of variable value is returned. offset and length can be a varibale as well.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
$var(x) = &amp;quot;abcd&amp;quot;;&lt;br /&gt;
$(var(x){s.substr,1,0}) = &amp;quot;bcd&amp;quot;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{s.select,index,separator}&lt;br /&gt;
&lt;br /&gt;
Return a field from the value of a variable. The field is selected based on separator and index. The separator must be a character used to identify the fields. Index must be a integer value or a variable. If index is negative, the count of fields starts from end of value, -1 being last field. If index is positive, 0 is the first field.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
$var(x) = &amp;quot;12,34,56&amp;quot;;&lt;br /&gt;
$(var(x){s.select,1,,}) =&amp;gt; &amp;quot;34&amp;quot; ;&lt;br /&gt;
&lt;br /&gt;
$var(x) = &amp;quot;12,34,56&amp;quot;;&lt;br /&gt;
$(var(x){s.select,-2,,}) =&amp;gt; &amp;quot;34&amp;quot;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{s.encode.hexa}&lt;br /&gt;
&lt;br /&gt;
Return encoding in hexa of variable's value&lt;br /&gt;
&lt;br /&gt;
!!!!{s.decode.hexa}&lt;br /&gt;
&lt;br /&gt;
Return decoding from hexa of variable's value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!{s.escape.common}&lt;br /&gt;
&lt;br /&gt;
Return escaped string of variable's value. Characters escaped are ', &amp;quot;,  and 0. Useful when doing DB queries (care should be taken for non Latin character set).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!{s.unescape.common}&lt;br /&gt;
&lt;br /&gt;
Return unescaped string of variable's value. Reverse of above transformation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!{s.escape.user}&lt;br /&gt;
&lt;br /&gt;
Return escaped string of variable's value, changing to '%hexa' the characters that are not allowed in user part of SIP URI following RFC requirements.&lt;br /&gt;
&lt;br /&gt;
!!!!{s.unescape.user}&lt;br /&gt;
&lt;br /&gt;
Return unescaped string of variable's value, changing '%hexa' to character code. Reverse of above transformation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!{s.escape.param}&lt;br /&gt;
&lt;br /&gt;
Return escaped string of variable's value, changing to '%hexa' the characters that are not allowed in the param part of SIP URI following RFC requirements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!{s.unescape.param}&lt;br /&gt;
&lt;br /&gt;
Return unescaped string of variable's value, changing '%hexa' to character code. Reverse of above transformation.&lt;br /&gt;
&lt;br /&gt;
!!!!{s.tolower}&lt;br /&gt;
&lt;br /&gt;
Return string with lower case ASCII letters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!{s.toupper}&lt;br /&gt;
&lt;br /&gt;
Return string with upper case ASCII letters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!URI Transformations&lt;br /&gt;
&lt;br /&gt;
The name of transformation starts with 'uri.'. The value of the variable is considered to be a SIP URI. This transformation returns parts of SIP URI (see struct sip_uri). If that part is missing, the returned value is an empty string.&lt;br /&gt;
&lt;br /&gt;
Available transformations in this class:&lt;br /&gt;
&lt;br /&gt;
!!!!{uri.user}&lt;br /&gt;
&lt;br /&gt;
Returns the user part of the URI schema.&lt;br /&gt;
&lt;br /&gt;
!!!!{uri.host}&lt;br /&gt;
&lt;br /&gt;
(same as '''{uri.domain}''')&lt;br /&gt;
&lt;br /&gt;
Returns the domain part of the URI schema.&lt;br /&gt;
&lt;br /&gt;
!!!!{uri.passwd}&lt;br /&gt;
&lt;br /&gt;
Returns the password part of the URI schema.&lt;br /&gt;
&lt;br /&gt;
!!!!{uri.port}&lt;br /&gt;
&lt;br /&gt;
Returns the port of the URI schema.&lt;br /&gt;
&lt;br /&gt;
!!!!{uri.params}&lt;br /&gt;
&lt;br /&gt;
Returns all the URI parameters into a single string.&lt;br /&gt;
&lt;br /&gt;
!!!!{uri.param,name}&lt;br /&gt;
&lt;br /&gt;
Returns the value of URI parameter with name &amp;quot;name&amp;quot;&lt;br /&gt;
&lt;br /&gt;
!!!!{uri.headers}&lt;br /&gt;
&lt;br /&gt;
Returns URI headers.&lt;br /&gt;
&lt;br /&gt;
!!!!{uri.transport}&lt;br /&gt;
&lt;br /&gt;
Returns the value of transport URI parameter.&lt;br /&gt;
&lt;br /&gt;
!!!!{uri.ttl}&lt;br /&gt;
&lt;br /&gt;
Returns the value of ttl URI parameter.&lt;br /&gt;
&lt;br /&gt;
!!!!{uri.uparam}&lt;br /&gt;
&lt;br /&gt;
Returns the value of user URI parameter&lt;br /&gt;
&lt;br /&gt;
!!!!{uri.maddr}&lt;br /&gt;
&lt;br /&gt;
Returns the value of maddr URI parameter.&lt;br /&gt;
&lt;br /&gt;
!!!!{uri.method}&lt;br /&gt;
&lt;br /&gt;
Returns the value of method URI parameter.&lt;br /&gt;
&lt;br /&gt;
!!!!{uri.lr}&lt;br /&gt;
&lt;br /&gt;
Returns the value of lr URI parameter.&lt;br /&gt;
&lt;br /&gt;
!!!!{uri.r2}&lt;br /&gt;
&lt;br /&gt;
Returns the value of r2 URI parameter.&lt;br /&gt;
&lt;br /&gt;
!!!VIA Transformations&lt;br /&gt;
&lt;br /&gt;
These transformations parse Via headers and all starts with @@via.@@. The value of the variable is considered to be a SIP Via header. This transformation returns parts of the via header (see struct via_body). If the requested part is missing, the returned value is an empty string. Transformation will fail (with script error) if variable holding the Via header is empty. Unless otherwise specified in descriptions below, the result of transform is a string (not an integer).&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
    $var(upstreamtransport) = $(hdr(Via)[1]{via.transport}{s.tolower});&lt;br /&gt;
    $var(upstreamip) = $(hdr(Via)[1]{via.param,received});&lt;br /&gt;
    $var(clientport) = $(hdr(Via)[-1]{via.param,rport});&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
Available transformations in this class:&lt;br /&gt;
&lt;br /&gt;
!!!!{via.name}&lt;br /&gt;
&lt;br /&gt;
Returns the @@protocol-name@@ (of RFC3261 BNF), generally @@SIP@@.&lt;br /&gt;
&lt;br /&gt;
!!!!{via.version}&lt;br /&gt;
&lt;br /&gt;
Returns the @@protocol-version@@ (of RFC3261 BNF), generally @@2.0@@.&lt;br /&gt;
&lt;br /&gt;
!!!!{via.transport}&lt;br /&gt;
&lt;br /&gt;
Returns the @@transport@@ (of RFC3261 BNF), e.g., @@UDP@@, @@TCP@@, @@TLS@@. This is the transport protocol used to send the request message.&lt;br /&gt;
&lt;br /&gt;
!!!!{via.host}&lt;br /&gt;
&lt;br /&gt;
(same as @@{via.domain}@@)&lt;br /&gt;
&lt;br /&gt;
Returns the @@host@@ portion of the @@sent-by@@ (of RFC3261 BNF). Typically this is the IP address of the sender of the request message, and is the address to which the response will be sent.&lt;br /&gt;
&lt;br /&gt;
!!!!{via.port}&lt;br /&gt;
&lt;br /&gt;
Returns the @@port@@ portion of the @@sent-by@@ (of RFC3261 BNF). Typically this is the IP port of the sender of the request message, and is the address to which the response will be sent. Result of transform is valid as both integer and string.&lt;br /&gt;
&lt;br /&gt;
!!!!{via.comment}&lt;br /&gt;
&lt;br /&gt;
The comment associated with the via header. The @@struct via_body@@ contains this field, but it isn't clear that RFC3261 allows Via headers to have comments (see text at top of page 221, and the BNF doesn't explicit allow comment within Via). The comment is the text enclosed within parens.&lt;br /&gt;
&lt;br /&gt;
!!!!{via.params}&lt;br /&gt;
&lt;br /&gt;
Returns all the Via headers parameters (@@via-param@@ of RFC3261 BNF) as single string. Result can be processed using the @@{param.*}@@ transforms. This is essentially everything after the host and port.&lt;br /&gt;
&lt;br /&gt;
!!!!{via.param,name}&lt;br /&gt;
&lt;br /&gt;
Returns the value of Via header parameter with name @@name@@. Typical parameters include @@branch@@, @@rport@@ and @@received@@.&lt;br /&gt;
&lt;br /&gt;
!!!!{via.branch}&lt;br /&gt;
&lt;br /&gt;
Returns the value of the branch parameter in the VIA header.&lt;br /&gt;
&lt;br /&gt;
!!!!{via.received}&lt;br /&gt;
&lt;br /&gt;
Returns the value of the received parameter in the VIA header, if any.&lt;br /&gt;
&lt;br /&gt;
!!!!{via.rport}&lt;br /&gt;
&lt;br /&gt;
Returns the value of the rport parameter in the VIA header, if any.&lt;br /&gt;
&lt;br /&gt;
!!!Parameters List Transformations&lt;br /&gt;
&lt;br /&gt;
The name of the transformation starts with &amp;quot;param.&amp;quot;. The value of the variable is considered to be a string like name1=value1;name2=value2;...&amp;quot;. The transformations returns the value for a specific parameter, or the name of a parameter at a specific index.&lt;br /&gt;
&lt;br /&gt;
Available transformations in this class:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!{param.value,name}&lt;br /&gt;
&lt;br /&gt;
Returns the value of parameter 'name'&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;a=1;b=2;c=3&amp;quot;{param.value,c} = &amp;quot;3&amp;quot;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
'name' can be a variable&lt;br /&gt;
&lt;br /&gt;
!!!!{param.exist,name}&lt;br /&gt;
&lt;br /&gt;
Returns 1 if the parameter @@name@@ exists (with or without value), else 0. Returned value is both string and integer. @@name@@ can be variable. This can be used to test existence of parameters that do not have values.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;a=0;b=2;ob;c=3&amp;quot;{param.exist,ob};         # returns 1&lt;br /&gt;
&amp;quot;a=0;b=2;ob;c=3&amp;quot;{param.exist,a};          # returns 1&lt;br /&gt;
&amp;quot;a=0;b=2;ob;c=3&amp;quot;{param.exist,foo};        # returns 0&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{param.valueat,index}&lt;br /&gt;
&lt;br /&gt;
Returns the value of parameter at position give by 'index' (0-based index)&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;a=1;b=2;c=3&amp;quot;{param.valueat,1} = &amp;quot;2&amp;quot;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
'index' can be a variable&lt;br /&gt;
&lt;br /&gt;
!!!!{param.name,index}&lt;br /&gt;
&lt;br /&gt;
Returns the name of parameter at position 'index'.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;a=1;b=2;c=3&amp;quot;{param.name,1} = &amp;quot;b&amp;quot;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!{param.count}&lt;br /&gt;
&lt;br /&gt;
Returns the number of parameters in the list.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;a=1;b=2;c=3&amp;quot;{param.count} = 3&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!Name-address Transformations&lt;br /&gt;
&lt;br /&gt;
The name of the transformation starts with 'nameaddr.'. The value of the variable is considered to be a string like '[display_name] uri'. The transformations returns the value for a specific field.&lt;br /&gt;
&lt;br /&gt;
Available transformations in this class:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!{nameaddr.name}&lt;br /&gt;
&lt;br /&gt;
Returns the value of display name&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
'&amp;quot;test&amp;quot; &amp;lt;sip:test@opensips.org&amp;gt;' {nameaddr.name} = &amp;quot;test&amp;quot;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{nameaddr.uri}&lt;br /&gt;
&lt;br /&gt;
Returns the value of URI&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
'&amp;quot;test&amp;quot; &amp;lt;sip:test@opensips.org&amp;gt;' {nameaddr.uri} = sip:test@opensips.org&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{nameaddr.len}&lt;br /&gt;
&lt;br /&gt;
Returns the length of the entire name-addr part from the value.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!{nameaddr.param,param_name}&lt;br /&gt;
&lt;br /&gt;
Returns the value of the parameter with name param_name.&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
'&amp;quot;test&amp;quot; &amp;lt;sip:test@opensips.org&amp;gt;;tag=dat43h' {nameaddr.param,tag} = dat43h&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{nameaddr.params}&lt;br /&gt;
&lt;br /&gt;
Returns all the parameters and their corresponding values.&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
'&amp;quot;test&amp;quot; &amp;lt;sip:test@opensips.org&amp;gt;;tag=dat43h;private=yes' {nameaddr.params} = &amp;quot;tag=dat43h;private=yes&amp;quot;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!IP Transformations&lt;br /&gt;
&lt;br /&gt;
The name of the transformation starts with 'ip.'. Available transformations in this class:&lt;br /&gt;
&lt;br /&gt;
!!!!{ip.pton}&lt;br /&gt;
&lt;br /&gt;
Returns a binary representation of a string represented IP.&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;192.168.2.134&amp;quot; {ip.pton} returns a 4 byte binary representation of the IP provided&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{ip.ntop}&lt;br /&gt;
&lt;br /&gt;
Returns a string representation of the binary IP provided&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;192.168.2.134&amp;quot;{ip.pton}{ip.ntop} = &amp;quot;192.168.2.134&amp;quot;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{ip.isip}&lt;br /&gt;
&lt;br /&gt;
Returns 1 or 0, if the string provided is a valid IP or not.&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;192.168.2.134&amp;quot; {ip.isip} = 1&lt;br /&gt;
&amp;quot;192.168.2.134.1&amp;quot; {ip.isip} = 0&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{ip.family}&lt;br /&gt;
Returns INET or INET6 if the binary IP representation provided is IPv4 or IPv6.&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;192.168.2.134&amp;quot; {ip.pton}{ip.family} = &amp;quot;INET&amp;quot;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{ip.resolve}&lt;br /&gt;
Returns the resolved IP address coresponding to the string domain provided. Transformation has no effect if a string IP is provided.&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;opensips.org&amp;quot; {ip.resolve} = &amp;quot;78.46.64.50&amp;quot;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!CSV Transformations&lt;br /&gt;
&lt;br /&gt;
The name of the transformation starts with &amp;quot;csv.&amp;quot;. The value of the variable is considered to be a string like &amp;quot;field1,field2,...&amp;quot;. The transformations return the number of entries in the provided CSV, or the field at a specified position in the CSV.&lt;br /&gt;
&lt;br /&gt;
Available transformations in this class:&lt;br /&gt;
&lt;br /&gt;
!!!!{csv.count}&lt;br /&gt;
Returns the number of entries in the provided CSV.&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;a,b,c&amp;quot; {csv.count} = 3&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!{csv.value}&lt;br /&gt;
Returns the entry at the specified positions. Indexing starts from 0.&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
&amp;quot;a,b,c&amp;quot; {csv.value,2} = c&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!SDP Transformations&lt;br /&gt;
&lt;br /&gt;
The name of the transformation starts with &amp;quot;sdp.&amp;quot;. The value of the variable is considered to be a valid SDP body. The transformation returns a specific line in the SDP body.&lt;br /&gt;
&lt;br /&gt;
Available transformations in this class:&lt;br /&gt;
&lt;br /&gt;
!!!!{sdp.line}&lt;br /&gt;
Returns the specified line in the SDP body. The transformations also accepts a second parameter, that specifies the line number of the first parameter's type to get from the SDP body. Indexing starts from 0. If the second parameter is missing, it is assumed to be 0. &lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;))&lt;br /&gt;
   {&lt;br /&gt;
      $var(aline) = $(rb{sdp.line,a,1});&lt;br /&gt;
      xlog(&amp;quot;The second a line in the SDP body is $var(aline)\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
if (is_method(&amp;quot;INVITE&amp;quot;))&lt;br /&gt;
   {&lt;br /&gt;
      $var(mline) = $(rb{sdp.line,m});&lt;br /&gt;
      xlog(&amp;quot;The first m line in the SDP body is $var(mline)\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!Regular Expression Transformations&lt;br /&gt;
&lt;br /&gt;
The name of the transformation starts with &amp;quot;re.&amp;quot;. The input can be any string.&lt;br /&gt;
&lt;br /&gt;
!!!!{re.subst,reg_exp}&lt;br /&gt;
&lt;br /&gt;
The reg_exp parameter can either be a plain string or a variable.&lt;br /&gt;
The format of the reg_exp is :&lt;br /&gt;
    /posix_match_expression/replacement_expression/flags&lt;br /&gt;
&lt;br /&gt;
The flags can be&lt;br /&gt;
    i - match ignore case&lt;br /&gt;
    s - match within multi-lines strings&lt;br /&gt;
    g - replace all matches&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
$var(reg_input)=&amp;quot;abc&amp;quot;;&lt;br /&gt;
$var(reg) = &amp;quot;/a/A/g&amp;quot;;&lt;br /&gt;
xlog(&amp;quot;Applying reg exp $var(reg) to $var(reg_input) : $(var(reg_input){re.subst,$var(reg)})\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
xlog(&amp;quot;Applying reg /b/B/g to $var(reg_input) : $(var(reg_input){re.subst,/b/B/g})\n&amp;quot;);&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!Examples&lt;br /&gt;
&lt;br /&gt;
Within a variable, many transformation can be applied, being executed from left to right.&lt;br /&gt;
&lt;br /&gt;
* The length of the value of parameter at postion 1 (remember 0 is first position, 1 is second position)&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
$var(x) = &amp;quot;a=1;b=22;c=333&amp;quot;;&lt;br /&gt;
$(var(x){param.value,$(var(x){param.name,1})}{s.len}) = 2&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
* Test if whether is un-registration or not&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
if(is_method(&amp;quot;REGISTER&amp;quot;) &amp;amp;&amp;amp; is_present_hf(&amp;quot;Expires&amp;quot;) &amp;amp;&amp;amp; $(hdr(Expires){s.int})==0)&lt;br /&gt;
    xlog(&amp;quot;This is an un-registrationn&amp;quot;);&lt;br /&gt;
@]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Scripting_Flags&amp;diff=1483</id>
		<title>Scripting Flags</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Scripting_Flags&amp;diff=1483"/>
		<updated>2013-10-20T22:58:19Z</updated>

		<summary type="html">&lt;p&gt;Mike: /* =Manipulação de flag de NAT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Tipos de flags==&lt;br /&gt;
&lt;br /&gt;
* '''message flags''' (ou flags de transação) estas flags são persistentes a transação, elas são visiveis em todas as rotas que façam parte da mesma transação&lt;br /&gt;
* '''branch flags'''  são salvas também na transação mas por branch, tambem são salvas na usrloc (por contato), uma nova variedade de funções foram adicionadas para manipular estas flags apartir do script, então estas flags são persistentes a registro e branch&lt;br /&gt;
* '''script flags'''  estas flags não são relacionadas a mensagem, elas são presistentes apenas ao script e você pode usa-las apenas para o script, quando você sai da rota principal estas flags são perdidas, estas flags são uteis e oferecem uma opção para descongestionar as flags de mensagens, muitas flags não tem necessidade de serem salvas e refletem apenas alguns status do script&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Funções correspondentes==&lt;br /&gt;
&lt;br /&gt;
Apartir do OpenSIPS 1.9 flgas podem receber valores alphanumericos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Flags de Mensagem/Transação===&lt;br /&gt;
&lt;br /&gt;
* setflag(flag_idx)&lt;br /&gt;
* resetflag(flag_idx)&lt;br /&gt;
* isflagset(flag_idx)&lt;br /&gt;
&lt;br /&gt;
''Exemplos: setflag(accounting), resetflag(DO_NAT) ou setflag(19)''&lt;br /&gt;
&lt;br /&gt;
===Branch flags===&lt;br /&gt;
&lt;br /&gt;
* setbflag/setbranchflag(branch_idx,flag_idx)&lt;br /&gt;
* resetbflag/resetbranchflag(branch_idx,flag_idx)&lt;br /&gt;
* isbflagset/isbranchflagset(branch_idx,flag_idx)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ou em formato reduzido, para a branch default (branch 0)&lt;br /&gt;
&lt;br /&gt;
* setbflag(flag_idx)&lt;br /&gt;
* resetbflag(flag_idx)&lt;br /&gt;
* isbflagset(flag_idx)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Script flags===&lt;br /&gt;
&lt;br /&gt;
* setsflag/setscriptflag(flag_idx)&lt;br /&gt;
* resetsflag/resetscriptflag(flag_idx)&lt;br /&gt;
* issflagset/isscriptflagset(flag_idx)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Flags and Pseudo Variables==&lt;br /&gt;
&lt;br /&gt;
===Message/transaction flags===&lt;br /&gt;
&lt;br /&gt;
$mf - Apenas Leitura; retorna uma lista de flags&lt;br /&gt;
&lt;br /&gt;
===Branch flags===&lt;br /&gt;
&lt;br /&gt;
$bf - Apenas Leitura; Retorna uma lista de flags (para a branch)&lt;br /&gt;
&lt;br /&gt;
===Script flags===&lt;br /&gt;
&lt;br /&gt;
$sf - Apenas leitura; Retorna uma lista de flags (para o script )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Flags and routes==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Message/transaction flags===&lt;br /&gt;
&lt;br /&gt;
Estas flags irão se mostrar em todas as rotas onde mensagens relacionadas a requisição inicial sejam processadas, então estas estarão visiveis e alteraveis em rotas onbranch, failure e onreply , as proximas branch routes irão herdar estas alterações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!! Branch flags&lt;br /&gt;
&lt;br /&gt;
Estas flags irão se mostrar em todas as rotas onde mensagens relacionadas a requisição inicial da branch sejam processada, então na branch route você poderá ver diferentes opções de variaveis (devido a serem diferentes branchs), em rotas onreply você verá a branch flag correspondente a branch que o reply pertence, na failure route a flag corresponde ao branch que o reply pertence é que será visivel.&lt;br /&gt;
&lt;br /&gt;
Na request route você pode ter várias branches (como resultado de um lookup(), query enum, append_branch(), etc) , a branch default é 0 (correpnodendo a RURI), na reply route haverá apenas uma branch, a branch 0, em branch route a branch default é a branch que esta sendo processada (tendo o index 0), em failure_route inicialmente existe apenas uma branch (index 0) correspondendo a branch que falhou.&lt;br /&gt;
&lt;br /&gt;
===Script flags===&lt;br /&gt;
&lt;br /&gt;
Estas flags são disponiveis apenas dentro do script e são reiniciadas em cada execução de rota de top level (rotas internamente ativadas pelo 'OpenSIPS'), Elas serão persistentes a main route, onreply_route, branch_route, failure_route, veja que elas erdarão os valores de rotas chamadas por outras rotas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemplo==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Manipulação de flag de NAT===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 ..........&lt;br /&gt;
 # 3 - the nat flag&lt;br /&gt;
 modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;nat_bflag&amp;quot;, &amp;quot;NAT_BFLAG&amp;quot;)&lt;br /&gt;
 ..........&lt;br /&gt;
 &lt;br /&gt;
 route {&lt;br /&gt;
   ..........&lt;br /&gt;
   if (nat detected)&lt;br /&gt;
      setbflag(NAT_BFLAG); # set branch flag 3 for the branch 0&lt;br /&gt;
&lt;br /&gt;
   ..........&lt;br /&gt;
   if (is_method(&amp;quot;REGISTER&amp;quot;)) {&lt;br /&gt;
      # the branch flags (including 3) will be saved into location&lt;br /&gt;
      save(&amp;quot;location&amp;quot;);&lt;br /&gt;
      exit;&lt;br /&gt;
   } else {&lt;br /&gt;
      # lookup will load the branch flag from location&lt;br /&gt;
      if (!lookup(&amp;quot;location&amp;quot;)) {&lt;br /&gt;
         sl_send_reply(&amp;quot;404&amp;quot;,&amp;quot;Not Found&amp;quot;);&lt;br /&gt;
         exit;&lt;br /&gt;
      }&lt;br /&gt;
      t_on_branch(&amp;quot;1&amp;quot;)&lt;br /&gt;
      t_relay();&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 branch_route[1] {&lt;br /&gt;
   xlog(&amp;quot;-------branch=$T_branch_idx, branch flags=$bF\n&amp;quot;);&lt;br /&gt;
   if (isbflagset(NAT_BFLAG)) {&lt;br /&gt;
      #current branch is marked as natted&lt;br /&gt;
      .........&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se nao houver forking paralelo você pode ficar livre de aplicar a branch_route e adicionar uma t_on_branch()&lt;br /&gt;
&lt;br /&gt;
   ........&lt;br /&gt;
   if (isbflagset(NAT_BFLAG)) {&lt;br /&gt;
      #current branch is marked as natted&lt;br /&gt;
      .........&lt;br /&gt;
   }&lt;br /&gt;
   ......... &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[OpenSIPS_1.9_Manual|Voltar]]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Scripting_Flags&amp;diff=1482</id>
		<title>Scripting Flags</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Scripting_Flags&amp;diff=1482"/>
		<updated>2013-10-20T22:58:05Z</updated>

		<summary type="html">&lt;p&gt;Mike: Criou página com '==Tipos de flags==  * '''message flags''' (ou flags de transação) estas flags são persistentes a transação, elas são visiveis em todas as rotas que façam parte da mesma...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Tipos de flags==&lt;br /&gt;
&lt;br /&gt;
* '''message flags''' (ou flags de transação) estas flags são persistentes a transação, elas são visiveis em todas as rotas que façam parte da mesma transação&lt;br /&gt;
* '''branch flags'''  são salvas também na transação mas por branch, tambem são salvas na usrloc (por contato), uma nova variedade de funções foram adicionadas para manipular estas flags apartir do script, então estas flags são persistentes a registro e branch&lt;br /&gt;
* '''script flags'''  estas flags não são relacionadas a mensagem, elas são presistentes apenas ao script e você pode usa-las apenas para o script, quando você sai da rota principal estas flags são perdidas, estas flags são uteis e oferecem uma opção para descongestionar as flags de mensagens, muitas flags não tem necessidade de serem salvas e refletem apenas alguns status do script&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Funções correspondentes==&lt;br /&gt;
&lt;br /&gt;
Apartir do OpenSIPS 1.9 flgas podem receber valores alphanumericos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Flags de Mensagem/Transação===&lt;br /&gt;
&lt;br /&gt;
* setflag(flag_idx)&lt;br /&gt;
* resetflag(flag_idx)&lt;br /&gt;
* isflagset(flag_idx)&lt;br /&gt;
&lt;br /&gt;
''Exemplos: setflag(accounting), resetflag(DO_NAT) ou setflag(19)''&lt;br /&gt;
&lt;br /&gt;
===Branch flags===&lt;br /&gt;
&lt;br /&gt;
* setbflag/setbranchflag(branch_idx,flag_idx)&lt;br /&gt;
* resetbflag/resetbranchflag(branch_idx,flag_idx)&lt;br /&gt;
* isbflagset/isbranchflagset(branch_idx,flag_idx)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ou em formato reduzido, para a branch default (branch 0)&lt;br /&gt;
&lt;br /&gt;
* setbflag(flag_idx)&lt;br /&gt;
* resetbflag(flag_idx)&lt;br /&gt;
* isbflagset(flag_idx)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Script flags===&lt;br /&gt;
&lt;br /&gt;
* setsflag/setscriptflag(flag_idx)&lt;br /&gt;
* resetsflag/resetscriptflag(flag_idx)&lt;br /&gt;
* issflagset/isscriptflagset(flag_idx)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Flags and Pseudo Variables==&lt;br /&gt;
&lt;br /&gt;
===Message/transaction flags===&lt;br /&gt;
&lt;br /&gt;
$mf - Apenas Leitura; retorna uma lista de flags&lt;br /&gt;
&lt;br /&gt;
===Branch flags===&lt;br /&gt;
&lt;br /&gt;
$bf - Apenas Leitura; Retorna uma lista de flags (para a branch)&lt;br /&gt;
&lt;br /&gt;
===Script flags===&lt;br /&gt;
&lt;br /&gt;
$sf - Apenas leitura; Retorna uma lista de flags (para o script )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Flags and routes==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Message/transaction flags===&lt;br /&gt;
&lt;br /&gt;
Estas flags irão se mostrar em todas as rotas onde mensagens relacionadas a requisição inicial sejam processadas, então estas estarão visiveis e alteraveis em rotas onbranch, failure e onreply , as proximas branch routes irão herdar estas alterações.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!! Branch flags&lt;br /&gt;
&lt;br /&gt;
Estas flags irão se mostrar em todas as rotas onde mensagens relacionadas a requisição inicial da branch sejam processada, então na branch route você poderá ver diferentes opções de variaveis (devido a serem diferentes branchs), em rotas onreply você verá a branch flag correspondente a branch que o reply pertence, na failure route a flag corresponde ao branch que o reply pertence é que será visivel.&lt;br /&gt;
&lt;br /&gt;
Na request route você pode ter várias branches (como resultado de um lookup(), query enum, append_branch(), etc) , a branch default é 0 (correpnodendo a RURI), na reply route haverá apenas uma branch, a branch 0, em branch route a branch default é a branch que esta sendo processada (tendo o index 0), em failure_route inicialmente existe apenas uma branch (index 0) correspondendo a branch que falhou.&lt;br /&gt;
&lt;br /&gt;
===Script flags===&lt;br /&gt;
&lt;br /&gt;
Estas flags são disponiveis apenas dentro do script e são reiniciadas em cada execução de rota de top level (rotas internamente ativadas pelo 'OpenSIPS'), Elas serão persistentes a main route, onreply_route, branch_route, failure_route, veja que elas erdarão os valores de rotas chamadas por outras rotas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exemplo==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Manipulação de flag de NAT==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 ..........&lt;br /&gt;
 # 3 - the nat flag&lt;br /&gt;
 modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;nat_bflag&amp;quot;, &amp;quot;NAT_BFLAG&amp;quot;)&lt;br /&gt;
 ..........&lt;br /&gt;
 &lt;br /&gt;
 route {&lt;br /&gt;
   ..........&lt;br /&gt;
   if (nat detected)&lt;br /&gt;
      setbflag(NAT_BFLAG); # set branch flag 3 for the branch 0&lt;br /&gt;
&lt;br /&gt;
   ..........&lt;br /&gt;
   if (is_method(&amp;quot;REGISTER&amp;quot;)) {&lt;br /&gt;
      # the branch flags (including 3) will be saved into location&lt;br /&gt;
      save(&amp;quot;location&amp;quot;);&lt;br /&gt;
      exit;&lt;br /&gt;
   } else {&lt;br /&gt;
      # lookup will load the branch flag from location&lt;br /&gt;
      if (!lookup(&amp;quot;location&amp;quot;)) {&lt;br /&gt;
         sl_send_reply(&amp;quot;404&amp;quot;,&amp;quot;Not Found&amp;quot;);&lt;br /&gt;
         exit;&lt;br /&gt;
      }&lt;br /&gt;
      t_on_branch(&amp;quot;1&amp;quot;)&lt;br /&gt;
      t_relay();&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 branch_route[1] {&lt;br /&gt;
   xlog(&amp;quot;-------branch=$T_branch_idx, branch flags=$bF\n&amp;quot;);&lt;br /&gt;
   if (isbflagset(NAT_BFLAG)) {&lt;br /&gt;
      #current branch is marked as natted&lt;br /&gt;
      .........&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se nao houver forking paralelo você pode ficar livre de aplicar a branch_route e adicionar uma t_on_branch()&lt;br /&gt;
&lt;br /&gt;
   ........&lt;br /&gt;
   if (isbflagset(NAT_BFLAG)) {&lt;br /&gt;
      #current branch is marked as natted&lt;br /&gt;
      .........&lt;br /&gt;
   }&lt;br /&gt;
   ......... &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[OpenSIPS_1.9_Manual|Voltar]]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core&amp;diff=1481</id>
		<title>Variáveis Core</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core&amp;diff=1481"/>
		<updated>2013-10-20T22:33:22Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
O '''OpenSIPS''' prove varios tipos de variaveis para serem usados no script de roteamento, as diferenças entre os tipos de variaveis são:&lt;br /&gt;
* 1. A visibilidade da variavel&lt;br /&gt;
* 2. Onde a variavel é relacionada (onde a mesma reside)&lt;br /&gt;
* 3. Status read-write da variavel ( algumas variaveis são apenas de leitura)&lt;br /&gt;
* 4. Como multiplos valores (da mesma variavel) são manipulados.&lt;br /&gt;
&lt;br /&gt;
As variáveis do '''OpenSIPS''' podem facilmente ser identificadas no script apartir de seus nomes (ou nota'ões) iniciando com o simbolo  '''$''' &lt;br /&gt;
&lt;br /&gt;
Sintaxe:&lt;br /&gt;
&lt;br /&gt;
A sintaxe completa de uma pseudo-variavel é:&lt;br /&gt;
 &lt;br /&gt;
 $(&amp;lt;context&amp;gt;'''name'''(subname)[index]{transformation})&lt;br /&gt;
&lt;br /&gt;
Os campos context, subname, index e transformation são opcionais&lt;br /&gt;
&lt;br /&gt;
Os campos significam:&lt;br /&gt;
* '''name''' - o nome(tipo) da pseudo variavel.&lt;br /&gt;
Ex: pvar, avp, ru, DLG_status etc...&lt;br /&gt;
&lt;br /&gt;
* '''subname''' - o identificador de um certo tipo de variável.&lt;br /&gt;
Ex: hdr(From), avp(nome)&lt;br /&gt;
&lt;br /&gt;
* '''index''' - uma pv pode armazenar mais de um valor, isso pode ser referenciado a uma lista de valores, você pode acessar um certo valor de uma lista se você especificar o index, você também pode especificar indexe's negativos , -1 significa o ultimo inserido e -2 significa o valor anterior ao ultimo (penultimo).&lt;br /&gt;
&lt;br /&gt;
* '''transformation''' - uma série de processos que podem ser aplicados em pseudo-variaveis, você pode encontrar a lista completa em [[Transformações]] , as transformações podem ser cascateadas usango a saída de uma tranformação como entrada de outra.&lt;br /&gt;
&lt;br /&gt;
* '''context''' - o contexto onde a pseudo-variavel será verificada, atualmente existem dois contextos, reply e request, o contexto de reply pode ser usado na rota de falha para verificar o valor da pseudovariavel neste contexto , o contexto de request (requisição) pode ser usado quando em um contexto de reply é desejado a verificação do valor no contexto correspondente ao request.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo de uso:&lt;br /&gt;
&lt;br /&gt;
* Apenas '''name''': $ru&lt;br /&gt;
* '''Name''' e '''subname''': $hdr(Contact)&lt;br /&gt;
* '''Name''' e '''index''': $(ct[0])&lt;br /&gt;
* '''Name''', '''subname''' e '''index''': $(avp(i:10)[2])&lt;br /&gt;
* '''Context'''&lt;br /&gt;
** $(&amp;lt;request&amp;gt;ru) de uma rota reply irá receber a Request-URI da requisição&lt;br /&gt;
** $(&amp;lt;reply&amp;gt;hdr(contact)) , contexto pode ser utilizado em uma rota de falha para acessar as informações do reply.&lt;br /&gt;
&lt;br /&gt;
==Tipos de variáveis==&lt;br /&gt;
&lt;br /&gt;
===script variables===&lt;br /&gt;
* Como o nome diz, estas variáveis são estritamente utilizadas em rotas de script, estas variáveis são visiveis apenas nos blocos de roteamento, não existem mensagem ou transações relacionas, mas são processos relacionados (variaveis de script são dependentes de rotas executadas pelo mesmo processo do '''OpenSIPS''').&lt;br /&gt;
&lt;br /&gt;
Variáveis de scripts são de leitura e escrita e podem ter valores inteiros ou strings, uma variável de script pode ter apenas um valor, uma nova atribuição (ou escrita) irá sobrescrever os valores existentes.&lt;br /&gt;
&lt;br /&gt;
===AVP - Atribute Value Pair===&lt;br /&gt;
* As avp's são variaveis dinamicas que podem ser criadas, as avp's são linkadas para uma mensagem singular ou uma transação ( se processamento stateful está em uso), uma mensagem ou transação irá inicialmente (quando recebida ou criada) ter uma lista vazia de avp's atreladas, durante o processo de roteamento o script diretamente ou via função poderá criar novos AVP's que automaticamente serão atrelados a mensagem/transação, as avp's serão visiveis em todas as rotas onde qualquer mensagem (reply ou request) da transação seja processada, branch_route, filure_route, onreply_route ( para onreply_route voce deve ter ativado o parametro ''onreply_avp_mode'').&lt;br /&gt;
&lt;br /&gt;
AVP's são variáveis de leitura e escrita e uma AVP existente pode ser deletada (removida), uma AVP pode conter multiplos valores, uma nova atribuição (operação de escrita) irá adicionar o novo valor para a AVP, os valores são mantidos no formado ''ultimo adicionado é o primeiro a ser utilizado'' .&lt;br /&gt;
&lt;br /&gt;
===pseudo variables===&lt;br /&gt;
* pseudo-variáveis (ou PV's) provem acesso a informação das mensagens SIP processadas (cabeçalhos, RURI, informações de trnasporte, etc..) ou de informações do '''OpenSIPS''' (valores de timers, números de processo (PID), códigos de retorno de função).&lt;br /&gt;
&lt;br /&gt;
Dependendo da informação provida a PV fica presa (relacionada) a um amensagem ou a nada (global), a maior parte das PV's são apenas de leitura, apenas algumas suportam operações de escrita, uma PV pode retornar varios ou apenas um valor dependendo da informação referenciadas (se pode ter valores multiplos ou nao)&lt;br /&gt;
&lt;br /&gt;
PV padrões são apenas de leitura e retornam apenas um valor (se não foi documentado de forma diferente)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[escape sequences]]&lt;br /&gt;
&lt;br /&gt;
* Sequencias de escape são utilizadas para formatar strings, estas não são variaveis mas podem ser formatadas.&lt;br /&gt;
&lt;br /&gt;
==Definições==&lt;br /&gt;
&lt;br /&gt;
===Script Variables===&lt;br /&gt;
&lt;br /&gt;
'''Nominação: **$var(name)**&lt;br /&gt;
&lt;br /&gt;
'''Dicas''':&lt;br /&gt;
&lt;br /&gt;
* Se você quer utilizar uma variavel em uma rota é melhor inicializar ou restar a mesma), de outra forma você poderá ter problemas com valores de rotas anteriores que forão executadas por um mesmo processo.&lt;br /&gt;
* Variáveis de script são mais rápidas que AVP's sendo processadas diretamente no endereço de memória.&lt;br /&gt;
* O valor de uma variável de script persiste para o processo do '''OpenSIPS'''&lt;br /&gt;
* Um variável pode ter apenas um valor&lt;br /&gt;
&lt;br /&gt;
# a script value can have only one value.&lt;br /&gt;
&lt;br /&gt;
Exemplos de uso&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(a) = 2;  # sets the value of variable 'a' to integer '2'&lt;br /&gt;
$var(a) = &amp;quot;2&amp;quot;;  # sets the value of variable 'a' to string '2'&lt;br /&gt;
$var(a) = 3 + (7&amp;amp;(~2)); # arithmetic and bitwise operation&lt;br /&gt;
$var(a) = &amp;quot;sip:&amp;quot; + $au + &amp;quot;@&amp;quot; + $fd; # compose a value from authentication username and From URI domain&lt;br /&gt;
&lt;br /&gt;
# using a script variable for tests&lt;br /&gt;
if( [ $var(a) &amp;amp; 4 ] ) {&lt;br /&gt;
  xlog(&amp;quot;var a has third bit set\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Definir uma variável para NULL corresponde a iniciar a a mesma com valor '0', variáveis de script não possuem valor NULL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===AVP variables===&lt;br /&gt;
&lt;br /&gt;
'''Nominação''': **$avp(name)** ou **$(avp(name)[N])**&lt;br /&gt;
&lt;br /&gt;
Quando utilizado o index 'N' você pode forçar a AVP para retornar um certo valor (valor na posição N), se nenhum index é informado o primeiro valor será o retornado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Dicas''':&lt;br /&gt;
* Para ativar AVP's em onreply_route utilize '''modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)'''&lt;br /&gt;
* Se multiplos valores forem utilizados em uma mesma AVP os valores são indexados em ordem reversa (primeiro inserido é o ultimo da lista)&lt;br /&gt;
* AVP's são parte do contexto de transação, desta forma estarão visiveis em todo local que a transação esteja presente.&lt;br /&gt;
* O valor de uma AVP pode ser deletado&lt;br /&gt;
&lt;br /&gt;
Exemplo de uso:&lt;br /&gt;
&lt;br /&gt;
Exemplo persistente a transação:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# enable avps in onreply route&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&lt;br /&gt;
...&lt;br /&gt;
route{&lt;br /&gt;
...&lt;br /&gt;
$avp(tmp) = $Ts ; # store the current time (at request processing)&lt;br /&gt;
...&lt;br /&gt;
t_onreply(&amp;quot;1&amp;quot;);&lt;br /&gt;
t_relay();&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
onreply_route[1] {&lt;br /&gt;
	if (t_check_status(&amp;quot;200&amp;quot;)) {&lt;br /&gt;
		# calculate the setup time&lt;br /&gt;
		$var(setup_time) = $Ts - $avp(tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemplo com multiplos valores&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$avp(17) = &amp;quot;one&amp;quot;;&lt;br /&gt;
# we have a single value&lt;br /&gt;
$avp(17) = &amp;quot;two&amp;quot;;&lt;br /&gt;
# we have two values (&amp;quot;two&amp;quot;,&amp;quot;one&amp;quot;)&lt;br /&gt;
$avp(17) = &amp;quot;three&amp;quot;;&lt;br /&gt;
# we have three values (&amp;quot;three&amp;quot;,&amp;quot;two&amp;quot;,&amp;quot;one&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
xlog(&amp;quot;accessing values with no index: $avp(17)\n&amp;quot;);&lt;br /&gt;
# this will print the first value, which is the last added value -&amp;gt; &amp;quot;three&amp;quot;&lt;br /&gt;
&lt;br /&gt;
xlog(&amp;quot;accessing values with no index: $(avp(17)[2])\n&amp;quot;);&lt;br /&gt;
# this will print the index 2 value (third one), -&amp;gt; &amp;quot;one&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# remove the last value of the avp; if there is only one value, the AVP itself will be destroyed&lt;br /&gt;
$avp(17) = NULL;&lt;br /&gt;
&lt;br /&gt;
# delete all values and destroy the AVP&lt;br /&gt;
avp_delete(&amp;quot;$avp(17)/g&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# delete the value located at a certain index &lt;br /&gt;
$(avp(17)[1]) = NULL;&lt;br /&gt;
&lt;br /&gt;
#overwrite the value at a certain index&lt;br /&gt;
$(avp(17)[0]) = &amp;quot;zero&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O módulo '''AVPOPS''' prove uma série de funções para operar as AVP's (como checagem de valores, extração em diferentes locais, deleção etc..)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Pseudo Variables===&lt;br /&gt;
&lt;br /&gt;
'''Nominação''': $name&lt;br /&gt;
&lt;br /&gt;
'''Dicas''':&lt;br /&gt;
* as PV podem ser utilizadas como parametros para diferentes funções e serão substituidas com o valor antes da execução da função&lt;br /&gt;
* A maior part edas PV's são disponibilizadas pelo core do '''OpenSIPS''' porém existem vários módulos que exportas PV's (para tornar algumas informações especificas do módulo disponivel), verifique as documentações dos módulos para saber mais.&lt;br /&gt;
&lt;br /&gt;
Váriaveis pré-definidas pelo core listadas em ordem alfabética.&lt;br /&gt;
&lt;br /&gt;
====URI in SIP Request's P-Asserted-Identity header====&lt;br /&gt;
&lt;br /&gt;
'''$ai''' - referencia a URI no cabeçalho P-Asserted-Identity  (veja  RFC 3325 para mais detalhes)&lt;br /&gt;
&lt;br /&gt;
====Authentication Digest URI====&lt;br /&gt;
&lt;br /&gt;
'''$adu''' - URI do cabeçalho Authorization ou Proxy-Authorization, esta URI é utilizada quando calculando a resposta do resposta do HTTP Digest (autenticação).&lt;br /&gt;
&lt;br /&gt;
====Authentication realm====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''$ar''' - referencia (dominio ou ip) no cabeçalho de  Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
====Auth username user====&lt;br /&gt;
&lt;br /&gt;
'''$au''' - parte referente ao nome do usuário no cabeçalho de Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
====Auth username domain====&lt;br /&gt;
&lt;br /&gt;
'''$ad''' - parte referente ao dominio do usuário no cabeçalho de Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth nonce====&lt;br /&gt;
&lt;br /&gt;
'''$an''' - Hash  do cebçalho Authorization ou Proxy-Authorization &lt;br /&gt;
Nota: na documentação fala nounce, não achei tradução para isso (ex de valor: nonce: 526442e200000000b8d49749e4bdd108e58cd246de209a50)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth response====&lt;br /&gt;
&lt;br /&gt;
'''$auth.resp''' - A resposta da autenticação para um cabeçalho Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth nonce====&lt;br /&gt;
&lt;br /&gt;
'''$auth.nonce''' - the nonce string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth opaque====&lt;br /&gt;
&lt;br /&gt;
'''$auth.opaque''' - the opaque string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth algorithm====&lt;br /&gt;
&lt;br /&gt;
'''$auth.alg''' - A string referente ao algoritimos utilizado para Authorization ou Proxy-Authorization.&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
===Auth QOP===&lt;br /&gt;
&lt;br /&gt;
'''$auth.qop''' - O valor do parametro qop (quality of protection) do caebaçalho Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth nonce count (nc)====&lt;br /&gt;
&lt;br /&gt;
'''$auth.nc''' - the value of nonce count parameter from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth whole username====&lt;br /&gt;
&lt;br /&gt;
'''$aU''' - Nome do usuário no cabeçalho Authorization or Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
====Acc username====&lt;br /&gt;
&lt;br /&gt;
'''$Au''' - usuário para proposito de accounting , é uma pseudo variavel seletiva (dependente do modulo acc) , se existir ela retorna seu valor ou retorna o valor do campo From em todo caso&lt;br /&gt;
&lt;br /&gt;
====Argument options====&lt;br /&gt;
&lt;br /&gt;
'''$argv''' - Permite acesso a argumentos de linha de comando especificados com o parametro '''-o'''&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
   # for option '-o foo=0'&lt;br /&gt;
   xlog(&amp;quot;foo is $argv(foo) \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Branch flags====&lt;br /&gt;
&lt;br /&gt;
'''$bf''' - Exibe a lista de branch flags definidas para a requisição atual&lt;br /&gt;
&lt;br /&gt;
!!!!Branch flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Branch====&lt;br /&gt;
&lt;br /&gt;
'''$branch''' - Esta variavel é utilizada para criação de novas branches (pernas) escrevendo as mesmas no valor da SIP URI&lt;br /&gt;
Exemplos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   # creates a new branch&lt;br /&gt;
   $branch = &amp;quot;sip:new@doamin.org&amp;quot;;&lt;br /&gt;
   # print its URI&lt;br /&gt;
   xlog(&amp;quot;last added branch has URI $(branch(uri)[-1]) \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Branch fields====&lt;br /&gt;
&lt;br /&gt;
'''$branch()''' - Esta variavel permite acesso de leitura e escrita para todos os campos/atributos de uma branch existente (previamente criada com append_branch()), os campos da branche são:&lt;br /&gt;
&lt;br /&gt;
* uri - a RURI da branch (string)&lt;br /&gt;
* duri - a URI e destino da branch (proxy the saida da branch) (sting)&lt;br /&gt;
* q - o valor '''q''' da branch (inteiro)&lt;br /&gt;
* path - a string PATH desta branch (string)&lt;br /&gt;
* flags - as flags para esta branch (inteiro)&lt;br /&gt;
* socket - o scoket local para ser utilizado para fazer o relay desta branch (string)&lt;br /&gt;
&lt;br /&gt;
A variavel aceita também index '''$(branch(uri)[1])''' para acessar uma branch especifica (multiplas branches podem ser especificadas autalmente), o index inicia em 0 (primeira branch), se o index for negativo ele é considerado o valor n do fim ( index -1 é ultima branch)&lt;br /&gt;
&lt;br /&gt;
Para todas as branches é utilizado o index '''*''' - $(branch(uri)[*]).&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   # creates the first branch&lt;br /&gt;
   append_branch();&lt;br /&gt;
   # creates the second branch&lt;br /&gt;
   force_send_socket(udp:192.168.1.10:5060);&lt;br /&gt;
   $du = &amp;quot;sip:192.168.2.10&amp;quot;;&lt;br /&gt;
   append_branch(&amp;quot;sip:foo@bar.com&amp;quot;,&amp;quot;0.5&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   # display branches&lt;br /&gt;
   xlog(&amp;quot;----- branch 0: $(branch(uri)[0]) , $(branch(q)[0]), $(branch(duri)[0]), $(branch(path)[0]), $(branch(flags)[0]), $(branch(socket)[0]) \n&amp;quot;);&lt;br /&gt;
   xlog(&amp;quot;----- branch 1: $(branch(uri)[1]) , $(branch(q)[1]), $(branch(duri)[1]), $(branch(path)[1]), $(branch(flags)[1]), $(branch(socket)[1]) \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   # do some changes over the branches&lt;br /&gt;
   $branch(uri) = &amp;quot;sip:user@domain.ro&amp;quot;;   # set URI for the first branch&lt;br /&gt;
   $(branch(q)[0]) = 1000;  # set to 1.00 for the first branch&lt;br /&gt;
   $(branch(socket)[1]) = NULL;  # reset the socket of the second branch&lt;br /&gt;
   $branch(duri) = NULL;  # reset the destination URI or the first branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta é uma variavel de leitura e escrita (você pode definir valores apartir do script de roteamento)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Call-Id====&lt;br /&gt;
&lt;br /&gt;
'''$ci''' - Referencia para o valor do cabeçalho call-id&lt;br /&gt;
&lt;br /&gt;
====Content-Length====&lt;br /&gt;
&lt;br /&gt;
'''$cl''' - Referencia para o valor do cabeçalho content-length&lt;br /&gt;
&lt;br /&gt;
====CSeq number====&lt;br /&gt;
&lt;br /&gt;
'''$cs''' - Referencia ao valor do cabeçalho cseq &lt;br /&gt;
&lt;br /&gt;
====Contact instance====&lt;br /&gt;
&lt;br /&gt;
'''$ct''' - referencia a 'contact instance/body' do cabeçalho contact, uma contact instance é o display_name + URI + contact_params, como um cabeçalho de contato pode conter multiplos valores e uma mensagem pode conter vários cabeçalhos, um index é adicionado a $ct neste caso:&lt;br /&gt;
&lt;br /&gt;
* $ct -first  primeiro 'contact instance' da mensagem&lt;br /&gt;
* $(ct[n]) - 'contact instance' na posição n do inicio da mensagem, iniciando com index 0&lt;br /&gt;
* $(ct[-n]) - 'contact instance' na posição n apartir do fim da mensagem (iniciando em -1 (ultimo contato)&lt;br /&gt;
&lt;br /&gt;
=====Fields of a contact instance=====&lt;br /&gt;
&lt;br /&gt;
A contact instance possue também campos que podem ser acessados&lt;br /&gt;
&lt;br /&gt;
'''$ct.fields()''' - referencia os campos da 'contact instance' (veja abaixo)&lt;br /&gt;
&lt;br /&gt;
Campos suportados são:&lt;br /&gt;
&lt;br /&gt;
* name - display name&lt;br /&gt;
* uri - contact uri&lt;br /&gt;
* q  - parametro q (valor apenas)&lt;br /&gt;
* expires - parametro expires (valor apenas) &lt;br /&gt;
* methods - parametro metodo (valor apenas)&lt;br /&gt;
* received - parametro received (valor appenas)&lt;br /&gt;
* params - Todos os parametros (incluindo nomes)&lt;br /&gt;
&lt;br /&gt;
Exemplos:&lt;br /&gt;
* $ct.fields(uri) - URI da primeira 'contact instance'&lt;br /&gt;
* $(ct.fields(name)[1]) - O display nae da segunda 'contact instance'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Content-Type====&lt;br /&gt;
&lt;br /&gt;
'''$cT''' - Referencia ao cabeçalho content-type&lt;br /&gt;
&lt;br /&gt;
====Domain of destination URI====&lt;br /&gt;
&lt;br /&gt;
'''$dd''' - Referencia do dominio da destination uri&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
====Diversion header URI====&lt;br /&gt;
&lt;br /&gt;
'''$di''' - Referencia ao Diversion header URI&lt;br /&gt;
&lt;br /&gt;
====Diversion &amp;quot;privacy&amp;quot; parameter====&lt;br /&gt;
&lt;br /&gt;
'''$dip''' - Referencia ao parametro 'privacy' do  Diversion header&lt;br /&gt;
&lt;br /&gt;
====Diversion &amp;quot;reason&amp;quot; parameter====&lt;br /&gt;
&lt;br /&gt;
'''$dir''' - Referencia ao parametro 'reason' do  Diversion header &lt;br /&gt;
&lt;br /&gt;
====Port of destination URI====&lt;br /&gt;
&lt;br /&gt;
'''$dp''' - Referencia a porta da destination URI&lt;br /&gt;
&lt;br /&gt;
Váriavel de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Transport protocol of destination URI====&lt;br /&gt;
&lt;br /&gt;
'''$dP''' - referencia ao protocolo de transporte da destination uri&lt;br /&gt;
&lt;br /&gt;
====Destination set====&lt;br /&gt;
&lt;br /&gt;
'''$ds''' - referencia para a destination set&lt;br /&gt;
&lt;br /&gt;
====Destination URI====&lt;br /&gt;
&lt;br /&gt;
'''$du''' - referencia a destination uri (outbound proxy que deve ser utilizado para enviar a requisição), se a loose_route() retornar TRUE a destination uri é definida de acordo com o primeiro Route header&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Error class====&lt;br /&gt;
&lt;br /&gt;
'''$err.class''' - Classe de erro ( atualmente '1' )&lt;br /&gt;
&lt;br /&gt;
====Error level====&lt;br /&gt;
&lt;br /&gt;
'''$err.level''' - Severidade da mensagem &lt;br /&gt;
&lt;br /&gt;
====Error info====&lt;br /&gt;
&lt;br /&gt;
'''$err.info''' - Texto descrevendo o erro&lt;br /&gt;
&lt;br /&gt;
====Error reply code====&lt;br /&gt;
&lt;br /&gt;
'''$err.rcode''' - Reply code recomendado para o erro&lt;br /&gt;
&lt;br /&gt;
====Error reply reason====&lt;br /&gt;
&lt;br /&gt;
'''$err.rreason''' - Reply reason (frase) recomendada para o erro&lt;br /&gt;
&lt;br /&gt;
====From URI domain====&lt;br /&gt;
&lt;br /&gt;
'''$fd''' - Referencia do dominio da URI do cabeçalho 'From'&lt;br /&gt;
&lt;br /&gt;
====From display name====&lt;br /&gt;
&lt;br /&gt;
'''$fn''' - Referencia ao display name do cabeçalho 'From'&lt;br /&gt;
&lt;br /&gt;
====Forced socket====&lt;br /&gt;
&lt;br /&gt;
'''$fs''' - Referencia ao socket (forçado) para envio de mensagens (quando existe) , o formato é proto:ip:port&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====From tag====&lt;br /&gt;
&lt;br /&gt;
'''$ft''' - Referencia ao parametro tag do cabeçalho 'From'&lt;br /&gt;
&lt;br /&gt;
====From URI====&lt;br /&gt;
&lt;br /&gt;
'''$fu''' - referencia a URI do cabeçalho 'From'&lt;br /&gt;
&lt;br /&gt;
====From URI username====&lt;br /&gt;
&lt;br /&gt;
'''$fU''' - referencia ao username da URI do cabeçalho 'From'&lt;br /&gt;
&lt;br /&gt;
====SIP message buffer====&lt;br /&gt;
&lt;br /&gt;
'''$mb''' - Referencia para o SIP message buffer&lt;br /&gt;
&lt;br /&gt;
====Message Flags====&lt;br /&gt;
&lt;br /&gt;
'''$mf''' - Exibe uma lista com as flags utilizadas na mensagem ou transação para a requisição atual.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====SIP message ID====&lt;br /&gt;
&lt;br /&gt;
'''$mi''' - Referencia ao ID da mensagem SIP&lt;br /&gt;
&lt;br /&gt;
====SIP message length====&lt;br /&gt;
&lt;br /&gt;
'''$ml''' - Referenia ao tamanho da mensagem SIP&lt;br /&gt;
&lt;br /&gt;
====Domain in SIP Request's original URI====&lt;br /&gt;
&lt;br /&gt;
'''$od''' - Referencia do dominio na R-URI original&lt;br /&gt;
&lt;br /&gt;
====Port of SIP request's original URI====&lt;br /&gt;
&lt;br /&gt;
'''$op''' - Referencia a porta da R-URI original&lt;br /&gt;
&lt;br /&gt;
====Transport protocol of SIP request original URI====&lt;br /&gt;
&lt;br /&gt;
'''$oP''' - Referencia do protocolo de transporte da R-URI original&lt;br /&gt;
&lt;br /&gt;
====SIP Request's original URI====&lt;br /&gt;
&lt;br /&gt;
'''$ou''' - Referencia a URI da requisição original&lt;br /&gt;
&lt;br /&gt;
====Username in SIP Request's original URI====&lt;br /&gt;
&lt;br /&gt;
'''$oU''' - Referenciao ao username na requisição original&lt;br /&gt;
&lt;br /&gt;
====Route parameter====&lt;br /&gt;
&lt;br /&gt;
'''$param(idx)''' - Recupera o parametro da rota , o index pode ser um inteiro ou uma pseudo-variavel (index inicia em 1)&lt;br /&gt;
&lt;br /&gt;
Exemplo&lt;br /&gt;
&lt;br /&gt;
   route {&lt;br /&gt;
      ...&lt;br /&gt;
      $var(debug) = &amp;quot;DBUG:&amp;quot;&lt;br /&gt;
      route(PRINT_VAR, $var(debug), &amp;quot;param value&amp;quot;);&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   route[PRINT_VAR] {&lt;br /&gt;
      $var(index) = 2;&lt;br /&gt;
      xlog(&amp;quot;$param(1): The parameter value is &amp;lt;$param($var(index))&amp;gt;\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
====Domain in SIP Request's P-Preferred-Identity header URI====&lt;br /&gt;
&lt;br /&gt;
'''$pd''' - Referencia ao dominio na URI do cabeçalho P-Preferred-Identity  (veja RFC 3325)&lt;br /&gt;
&lt;br /&gt;
====Display Name in SIP Request's P-Preferred-Identity header====&lt;br /&gt;
&lt;br /&gt;
'''$pn''' - Referencia ao display name no cabeçalho P-Preferred-Identity  (veja RFC 3325)&lt;br /&gt;
&lt;br /&gt;
====Process id====&lt;br /&gt;
&lt;br /&gt;
'''$pp''' - Referenciao ao processo id (pid) &lt;br /&gt;
&lt;br /&gt;
====Protocol of received message====&lt;br /&gt;
'''$pr''' ou '''$proto''' - protocolo da mensagem recebida (UDP, TCP, TLS, SCTP)&lt;br /&gt;
&lt;br /&gt;
====User in SIP Request's P-Preferred-Identity header URI====&lt;br /&gt;
&lt;br /&gt;
'''$pU''' - referencia ao usuário da URI no cabeçalho  P-Preferred-Identity (veja RFC 3325)&lt;br /&gt;
&lt;br /&gt;
====URI in SIP Request's P-Preferred-Identity header====&lt;br /&gt;
&lt;br /&gt;
'''$pu''' - Referencia a URI no cabeçalho P-Preferred-Identity (veja RFC 3325)&lt;br /&gt;
&lt;br /&gt;
====Domain in SIP Request's URI====&lt;br /&gt;
&lt;br /&gt;
'''$rd''' - Referencia ao dominio da URI&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
====Body of request/reply====&lt;br /&gt;
&lt;br /&gt;
'''$rb''' - Referencia ao corpo da mensagem recebida&lt;br /&gt;
&lt;br /&gt;
====Returned code====&lt;br /&gt;
&lt;br /&gt;
'''$rc''' - Referencia do código de retorno da ultima função executada&lt;br /&gt;
&lt;br /&gt;
'''$retcode''' - mesma coisa que **$rc**&lt;br /&gt;
&lt;br /&gt;
====Remote-Party-ID header URI====&lt;br /&gt;
&lt;br /&gt;
'''$re''' - referencia a URI do cabeçalho Remote-Party-ID &lt;br /&gt;
&lt;br /&gt;
====SIP request's method====&lt;br /&gt;
&lt;br /&gt;
'''$rm''' - Referencia ao método da mensagem atual&lt;br /&gt;
&lt;br /&gt;
====SIP request's port====&lt;br /&gt;
&lt;br /&gt;
'''$rp''' - Referencia a porta da R-URI&lt;br /&gt;
&lt;br /&gt;
Esta é uma váriavel de leitura e escrita.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Transport protocol of SIP request URI====&lt;br /&gt;
&lt;br /&gt;
'''$rP''' - Referencia ao protocolo de transporte da R-URI&lt;br /&gt;
&lt;br /&gt;
====SIP reply's reason====&lt;br /&gt;
&lt;br /&gt;
'''$rr''' - Referencia a '''reply's reason'''&lt;br /&gt;
&lt;br /&gt;
====SIP reply's status====&lt;br /&gt;
&lt;br /&gt;
'''$rs''' - Referencia ao status do reply&lt;br /&gt;
&lt;br /&gt;
====Refer-to URI====&lt;br /&gt;
&lt;br /&gt;
'''$rt''' - Referencia a URI do cabeçalho refer-to&lt;br /&gt;
&lt;br /&gt;
====SIP Request's URI====&lt;br /&gt;
&lt;br /&gt;
'''$ru''' - Referencia a request URI&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Username in SIP Request's URI====&lt;br /&gt;
&lt;br /&gt;
'''$rU''' - Referencia ao username da URI da requisição&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
====Q value of the SIP Request's URI====&lt;br /&gt;
&lt;br /&gt;
'''$ru_q''' - Referencia ao valor 'q' da R-URI&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
====Received IP address====&lt;br /&gt;
&lt;br /&gt;
'''$Ri''' - Referencia do IP da interface onde o pacote foi recebido&lt;br /&gt;
&lt;br /&gt;
====Received port====&lt;br /&gt;
&lt;br /&gt;
'''$Rp''' - Referencia da porta onde o pacote foi recebido&lt;br /&gt;
&lt;br /&gt;
====Script flags====&lt;br /&gt;
&lt;br /&gt;
'''$sf''' - Exibe uma lista com as flgs de script da requisição atual&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IP source address====&lt;br /&gt;
&lt;br /&gt;
'''$si''' - IP de origem da mensagem recebida&lt;br /&gt;
&lt;br /&gt;
====Source port====&lt;br /&gt;
&lt;br /&gt;
'''$sp''' - Porta de origem da mensagme recebida&lt;br /&gt;
&lt;br /&gt;
====To URI Domain====&lt;br /&gt;
&lt;br /&gt;
'''$td''' - Referencia ao dominio da URI no cabeçalho 'To'&lt;br /&gt;
&lt;br /&gt;
====To display name====&lt;br /&gt;
&lt;br /&gt;
'''$tn''' - Referencia ao display name no cabeçalho 'To'&lt;br /&gt;
&lt;br /&gt;
====To tag====&lt;br /&gt;
&lt;br /&gt;
'''$tt''' - Referencia ao parametro tag do cabeçalho 'To'&lt;br /&gt;
&lt;br /&gt;
====To URI====&lt;br /&gt;
&lt;br /&gt;
'''$tu''' - Referencia a URI do cabeçalho 'To'&lt;br /&gt;
&lt;br /&gt;
====To URI Username====&lt;br /&gt;
&lt;br /&gt;
'''$tU''' - Referencia ao username da URI do cabeçalho 'To'&lt;br /&gt;
&lt;br /&gt;
====Formatted date and time====&lt;br /&gt;
&lt;br /&gt;
'''$time(format)''' - Retorna a string formatda de acordo com o comando date do UNIX (veja '''man date''')&lt;br /&gt;
&lt;br /&gt;
====Branch index====&lt;br /&gt;
&lt;br /&gt;
'''$T_branch_idx''' - O index (iniciando com 1 para a primeira branche) da branch para qual é executada uma branch_route[], se utilizado fora da branch_route[] o valor será 0, esta variável é exportado pelo módulo TM.&lt;br /&gt;
&lt;br /&gt;
====Time Variables====&lt;br /&gt;
&lt;br /&gt;
=====String formatted time=====&lt;br /&gt;
&lt;br /&gt;
'''$Tf''' - Referencia a string formatda para hora (HH:MM:SS)&lt;br /&gt;
&lt;br /&gt;
=====Current unix time stamp in seconds=====&lt;br /&gt;
&lt;br /&gt;
'''$Ts''' - Referencia ao unix timestamp em segundos &lt;br /&gt;
&lt;br /&gt;
=====Current microseconds of the current second=====&lt;br /&gt;
&lt;br /&gt;
'''$Tsm''' - Referencia para os microsegundos do segundo atual&lt;br /&gt;
&lt;br /&gt;
=====Startup unix time stamp=====&lt;br /&gt;
&lt;br /&gt;
'''$TS''' - Referencia ao 'startup unix time stamp'&lt;br /&gt;
&lt;br /&gt;
====User agent header====&lt;br /&gt;
&lt;br /&gt;
'''$ua''' - Referencia ao campo user agent do cabeçalho&lt;br /&gt;
&lt;br /&gt;
===SIP Headers===&lt;br /&gt;
&lt;br /&gt;
'''$(hdr(name)[N])''' - Representa o conteúdo do cabeçalho N identificado por 'name', se [N] for omitido então o conteúdo do primeiro cabeçalho será exibido, o primeiro cabeçalho é pego quando N=0, para o segundo N=1 e assim por diante, para imprimir o último cabeçalo  daquele tipo é possível utilizar o index [-1], nenhum outro valor negativo é suportado, não é permitido espaço em branco antes ou depois de [, {, }, ], quando N='*' , todos os cabeçalhos serão exibidos.&lt;br /&gt;
&lt;br /&gt;
O módulo deve identificar a maior parte dos cabeçalhos  compactos (o  '''OpenSIPS''' reconhece todos atualmente), se não a forma compacta do cabeçalho necessita ser especificada explicitamente, é recomendado usar identificadores especiais para os cabeçalhos (ex: %ua para user agent), se eles estiverem disponiveis pois são mais rapidos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''$(hdrcnt(name))''' -- Retorna o numero de cabeçalhos deste tipo existentes, o tipo é defnido por 'name', utiliza as mesmas regras de especificação de nome de cabeçalho como '''$hdr(name)''', muitos cabeçalhos (ex: Via, Path, Record-Route) podem aparecer mais de uma vez na mensagem, esta variavel então retorna o numero referente a quantidad ede vezes que o cabeçalho em questão está presente.&lt;br /&gt;
&lt;br /&gt;
Veja que alguns cabeçalhos (ex: Path) pode ter valores com virgulas e aparecerem como uma unica linha, esta variavel conta a quantidade de linhas, e não a quantidade de valores&lt;br /&gt;
&lt;br /&gt;
Para o fragmento de mensagem abaixo, '''$hdrcnt(Path)''' terá o valor 2 e '''$(hdr(Path)[0]''' terá o valor '''&amp;lt;a.com&amp;gt;''' ;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Path: &amp;lt;a.com&amp;gt;&lt;br /&gt;
    Path: &amp;lt;b.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para o fragmento de mensagem abaixo , '''$hdrcnt(Path)''' terá o valor 1, e '''$(hdr(Path)[0]''' terá o valor '''&amp;lt;a.com&amp;gt;,&amp;lt;b.com&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
    Path: &amp;lt;a.com&amp;gt;,&amp;lt;b.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Veja que os dois exemplos representam a mesma coisa mas as variaveis possuem valores diferentes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Escape Sequences==&lt;br /&gt;
&lt;br /&gt;
Estas sequencias são exportadas e normalmente utilizadas pelo módulo xlog para exibir mensagens em várias cores (foreground ou background) usando sequencias de scape.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Foreground and background colors===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$C(xy) - Referencia uma sequencia de scape. 'x' repreenta a core de foreground (cor da fonte) e 'y' representa a cord de background (cor do fundo).&lt;br /&gt;
&lt;br /&gt;
Cores devem ser:&lt;br /&gt;
&lt;br /&gt;
* x : Cor padrão do terminal&lt;br /&gt;
* s : Preto&lt;br /&gt;
* r : Vermelho&lt;br /&gt;
* g : Verde&lt;br /&gt;
* y : Amarelo&lt;br /&gt;
* b : Azul&lt;br /&gt;
* p : Roxo&lt;br /&gt;
* c : Ciano &lt;br /&gt;
* w : Branco&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Examplos:&lt;br /&gt;
&lt;br /&gt;
Alguns exemplos de uso&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
route {&lt;br /&gt;
...&lt;br /&gt;
    $avp(uuid)=&amp;quot;caller_id&amp;quot;;&lt;br /&gt;
    $avp(tmp)= $avp(uuid) + &amp;quot;: &amp;quot; + $fu;&lt;br /&gt;
    xdbg(&amp;quot;$(C(bg))avp(tmp)$(C(xx)) [$avp(tmp)] $(C(br))cseq$(C(xx))=[$hdr(cseq)]\n&amp;quot;);&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[OpenSIPS_1.9_Manual|Voltar]]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core&amp;diff=1480</id>
		<title>Variáveis Core</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core&amp;diff=1480"/>
		<updated>2013-10-20T22:16:08Z</updated>

		<summary type="html">&lt;p&gt;Mike: /* String formatted time */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
O '''OpenSIPS''' prove varios tipos de variaveis para serem usados no script de roteamento, as diferenças entre os tipos de variaveis são:&lt;br /&gt;
* 1. A visibilidade da variavel&lt;br /&gt;
* 2. Onde a variavel é relacionada (onde a mesma reside)&lt;br /&gt;
* 3. Status read-write da variavel ( algumas variaveis são apenas de leitura)&lt;br /&gt;
* 4. Como multiplos valores (da mesma variavel) são manipulados.&lt;br /&gt;
&lt;br /&gt;
As variáveis do '''OpenSIPS''' podem facilmente ser identificadas no script apartir de seus nomes (ou nota'ões) iniciando com o simbolo  '''$''' &lt;br /&gt;
&lt;br /&gt;
Sintaxe:&lt;br /&gt;
&lt;br /&gt;
A sintaxe completa de uma pseudo-variavel é:&lt;br /&gt;
 &lt;br /&gt;
 $(&amp;lt;context&amp;gt;'''name'''(subname)[index]{transformation})&lt;br /&gt;
&lt;br /&gt;
Os campos context, subname, index e transformation são opcionais&lt;br /&gt;
&lt;br /&gt;
Os campos significam:&lt;br /&gt;
* '''name''' - o nome(tipo) da pseudo variavel.&lt;br /&gt;
Ex: pvar, avp, ru, DLG_status etc...&lt;br /&gt;
&lt;br /&gt;
* '''subname''' - o identificador de um certo tipo de variável.&lt;br /&gt;
Ex: hdr(From), avp(nome)&lt;br /&gt;
&lt;br /&gt;
* '''index''' - uma pv pode armazenar mais de um valor, isso pode ser referenciado a uma lista de valores, você pode acessar um certo valor de uma lista se você especificar o index, você também pode especificar indexe's negativos , -1 significa o ultimo inserido e -2 significa o valor anterior ao ultimo (penultimo).&lt;br /&gt;
&lt;br /&gt;
* '''transformation''' - uma série de processos que podem ser aplicados em pseudo-variaveis, você pode encontrar a lista completa em [[Transformações]] , as transformações podem ser cascateadas usango a saída de uma tranformação como entrada de outra.&lt;br /&gt;
&lt;br /&gt;
* '''context''' - o contexto onde a pseudo-variavel será verificada, atualmente existem dois contextos, reply e request, o contexto de reply pode ser usado na rota de falha para verificar o valor da pseudovariavel neste contexto , o contexto de request (requisição) pode ser usado quando em um contexto de reply é desejado a verificação do valor no contexto correspondente ao request.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo de uso:&lt;br /&gt;
&lt;br /&gt;
* Apenas '''name''': $ru&lt;br /&gt;
* '''Name''' e '''subname''': $hdr(Contact)&lt;br /&gt;
* '''Name''' e '''index''': $(ct[0])&lt;br /&gt;
* '''Name''', '''subname''' e '''index''': $(avp(i:10)[2])&lt;br /&gt;
* '''Context'''&lt;br /&gt;
** $(&amp;lt;request&amp;gt;ru) de uma rota reply irá receber a Request-URI da requisição&lt;br /&gt;
** $(&amp;lt;reply&amp;gt;hdr(contact)) , contexto pode ser utilizado em uma rota de falha para acessar as informações do reply.&lt;br /&gt;
&lt;br /&gt;
==Tipos de variáveis==&lt;br /&gt;
&lt;br /&gt;
===script variables===&lt;br /&gt;
* Como o nome diz, estas variáveis são estritamente utilizadas em rotas de script, estas variáveis são visiveis apenas nos blocos de roteamento, não existem mensagem ou transações relacionas, mas são processos relacionados (variaveis de script são dependentes de rotas executadas pelo mesmo processo do '''OpenSIPS''').&lt;br /&gt;
&lt;br /&gt;
Variáveis de scripts são de leitura e escrita e podem ter valores inteiros ou strings, uma variável de script pode ter apenas um valor, uma nova atribuição (ou escrita) irá sobrescrever os valores existentes.&lt;br /&gt;
&lt;br /&gt;
===AVP - Atribute Value Pair===&lt;br /&gt;
* As avp's são variaveis dinamicas que podem ser criadas, as avp's são linkadas para uma mensagem singular ou uma transação ( se processamento stateful está em uso), uma mensagem ou transação irá inicialmente (quando recebida ou criada) ter uma lista vazia de avp's atreladas, durante o processo de roteamento o script diretamente ou via função poderá criar novos AVP's que automaticamente serão atrelados a mensagem/transação, as avp's serão visiveis em todas as rotas onde qualquer mensagem (reply ou request) da transação seja processada, branch_route, filure_route, onreply_route ( para onreply_route voce deve ter ativado o parametro ''onreply_avp_mode'').&lt;br /&gt;
&lt;br /&gt;
AVP's são variáveis de leitura e escrita e uma AVP existente pode ser deletada (removida), uma AVP pode conter multiplos valores, uma nova atribuição (operação de escrita) irá adicionar o novo valor para a AVP, os valores são mantidos no formado ''ultimo adicionado é o primeiro a ser utilizado'' .&lt;br /&gt;
&lt;br /&gt;
===pseudo variables===&lt;br /&gt;
* pseudo-variáveis (ou PV's) provem acesso a informação das mensagens SIP processadas (cabeçalhos, RURI, informações de trnasporte, etc..) ou de informações do '''OpenSIPS''' (valores de timers, números de processo (PID), códigos de retorno de função).&lt;br /&gt;
&lt;br /&gt;
Dependendo da informação provida a PV fica presa (relacionada) a um amensagem ou a nada (global), a maior parte das PV's são apenas de leitura, apenas algumas suportam operações de escrita, uma PV pode retornar varios ou apenas um valor dependendo da informação referenciadas (se pode ter valores multiplos ou nao)&lt;br /&gt;
&lt;br /&gt;
PV padrões são apenas de leitura e retornam apenas um valor (se não foi documentado de forma diferente)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[escape sequences]]&lt;br /&gt;
&lt;br /&gt;
* Sequencias de escape são utilizadas para formatar strings, estas não são variaveis mas podem ser formatadas.&lt;br /&gt;
&lt;br /&gt;
==Definições==&lt;br /&gt;
&lt;br /&gt;
===Script Variables===&lt;br /&gt;
&lt;br /&gt;
'''Nominação: **$var(name)**&lt;br /&gt;
&lt;br /&gt;
'''Dicas''':&lt;br /&gt;
&lt;br /&gt;
* Se você quer utilizar uma variavel em uma rota é melhor inicializar ou restar a mesma), de outra forma você poderá ter problemas com valores de rotas anteriores que forão executadas por um mesmo processo.&lt;br /&gt;
* Variáveis de script são mais rápidas que AVP's sendo processadas diretamente no endereço de memória.&lt;br /&gt;
* O valor de uma variável de script persiste para o processo do '''OpenSIPS'''&lt;br /&gt;
* Um variável pode ter apenas um valor&lt;br /&gt;
&lt;br /&gt;
# a script value can have only one value.&lt;br /&gt;
&lt;br /&gt;
Exemplos de uso&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(a) = 2;  # sets the value of variable 'a' to integer '2'&lt;br /&gt;
$var(a) = &amp;quot;2&amp;quot;;  # sets the value of variable 'a' to string '2'&lt;br /&gt;
$var(a) = 3 + (7&amp;amp;(~2)); # arithmetic and bitwise operation&lt;br /&gt;
$var(a) = &amp;quot;sip:&amp;quot; + $au + &amp;quot;@&amp;quot; + $fd; # compose a value from authentication username and From URI domain&lt;br /&gt;
&lt;br /&gt;
# using a script variable for tests&lt;br /&gt;
if( [ $var(a) &amp;amp; 4 ] ) {&lt;br /&gt;
  xlog(&amp;quot;var a has third bit set\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Definir uma variável para NULL corresponde a iniciar a a mesma com valor '0', variáveis de script não possuem valor NULL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===AVP variables===&lt;br /&gt;
&lt;br /&gt;
'''Nominação''': **$avp(name)** ou **$(avp(name)[N])**&lt;br /&gt;
&lt;br /&gt;
Quando utilizado o index 'N' você pode forçar a AVP para retornar um certo valor (valor na posição N), se nenhum index é informado o primeiro valor será o retornado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Dicas''':&lt;br /&gt;
* Para ativar AVP's em onreply_route utilize '''modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)'''&lt;br /&gt;
* Se multiplos valores forem utilizados em uma mesma AVP os valores são indexados em ordem reversa (primeiro inserido é o ultimo da lista)&lt;br /&gt;
* AVP's são parte do contexto de transação, desta forma estarão visiveis em todo local que a transação esteja presente.&lt;br /&gt;
* O valor de uma AVP pode ser deletado&lt;br /&gt;
&lt;br /&gt;
Exemplo de uso:&lt;br /&gt;
&lt;br /&gt;
Exemplo persistente a transação:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# enable avps in onreply route&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&lt;br /&gt;
...&lt;br /&gt;
route{&lt;br /&gt;
...&lt;br /&gt;
$avp(tmp) = $Ts ; # store the current time (at request processing)&lt;br /&gt;
...&lt;br /&gt;
t_onreply(&amp;quot;1&amp;quot;);&lt;br /&gt;
t_relay();&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
onreply_route[1] {&lt;br /&gt;
	if (t_check_status(&amp;quot;200&amp;quot;)) {&lt;br /&gt;
		# calculate the setup time&lt;br /&gt;
		$var(setup_time) = $Ts - $avp(tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemplo com multiplos valores&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$avp(17) = &amp;quot;one&amp;quot;;&lt;br /&gt;
# we have a single value&lt;br /&gt;
$avp(17) = &amp;quot;two&amp;quot;;&lt;br /&gt;
# we have two values (&amp;quot;two&amp;quot;,&amp;quot;one&amp;quot;)&lt;br /&gt;
$avp(17) = &amp;quot;three&amp;quot;;&lt;br /&gt;
# we have three values (&amp;quot;three&amp;quot;,&amp;quot;two&amp;quot;,&amp;quot;one&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
xlog(&amp;quot;accessing values with no index: $avp(17)\n&amp;quot;);&lt;br /&gt;
# this will print the first value, which is the last added value -&amp;gt; &amp;quot;three&amp;quot;&lt;br /&gt;
&lt;br /&gt;
xlog(&amp;quot;accessing values with no index: $(avp(17)[2])\n&amp;quot;);&lt;br /&gt;
# this will print the index 2 value (third one), -&amp;gt; &amp;quot;one&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# remove the last value of the avp; if there is only one value, the AVP itself will be destroyed&lt;br /&gt;
$avp(17) = NULL;&lt;br /&gt;
&lt;br /&gt;
# delete all values and destroy the AVP&lt;br /&gt;
avp_delete(&amp;quot;$avp(17)/g&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# delete the value located at a certain index &lt;br /&gt;
$(avp(17)[1]) = NULL;&lt;br /&gt;
&lt;br /&gt;
#overwrite the value at a certain index&lt;br /&gt;
$(avp(17)[0]) = &amp;quot;zero&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O módulo '''AVPOPS''' prove uma série de funções para operar as AVP's (como checagem de valores, extração em diferentes locais, deleção etc..)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Pseudo Variables===&lt;br /&gt;
&lt;br /&gt;
'''Nominação''': $name&lt;br /&gt;
&lt;br /&gt;
'''Dicas''':&lt;br /&gt;
* as PV podem ser utilizadas como parametros para diferentes funções e serão substituidas com o valor antes da execução da função&lt;br /&gt;
* A maior part edas PV's são disponibilizadas pelo core do '''OpenSIPS''' porém existem vários módulos que exportas PV's (para tornar algumas informações especificas do módulo disponivel), verifique as documentações dos módulos para saber mais.&lt;br /&gt;
&lt;br /&gt;
Váriaveis pré-definidas pelo core listadas em ordem alfabética.&lt;br /&gt;
&lt;br /&gt;
====URI in SIP Request's P-Asserted-Identity header====&lt;br /&gt;
&lt;br /&gt;
'''$ai''' - referencia a URI no cabeçalho P-Asserted-Identity  (veja  RFC 3325 para mais detalhes)&lt;br /&gt;
&lt;br /&gt;
====Authentication Digest URI====&lt;br /&gt;
&lt;br /&gt;
'''$adu''' - URI do cabeçalho Authorization ou Proxy-Authorization, esta URI é utilizada quando calculando a resposta do resposta do HTTP Digest (autenticação).&lt;br /&gt;
&lt;br /&gt;
====Authentication realm====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''$ar''' - referencia (dominio ou ip) no cabeçalho de  Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
====Auth username user====&lt;br /&gt;
&lt;br /&gt;
'''$au''' - parte referente ao nome do usuário no cabeçalho de Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
====Auth username domain====&lt;br /&gt;
&lt;br /&gt;
'''$ad''' - parte referente ao dominio do usuário no cabeçalho de Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth nonce====&lt;br /&gt;
&lt;br /&gt;
'''$an''' - Hash  do cebçalho Authorization ou Proxy-Authorization &lt;br /&gt;
Nota: na documentação fala nounce, não achei tradução para isso (ex de valor: nonce: 526442e200000000b8d49749e4bdd108e58cd246de209a50)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth response====&lt;br /&gt;
&lt;br /&gt;
'''$auth.resp''' - A resposta da autenticação para um cabeçalho Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth nonce====&lt;br /&gt;
&lt;br /&gt;
'''$auth.nonce''' - the nonce string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth opaque====&lt;br /&gt;
&lt;br /&gt;
'''$auth.opaque''' - the opaque string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth algorithm====&lt;br /&gt;
&lt;br /&gt;
'''$auth.alg''' - A string referente ao algoritimos utilizado para Authorization ou Proxy-Authorization.&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
===Auth QOP===&lt;br /&gt;
&lt;br /&gt;
'''$auth.qop''' - O valor do parametro qop (quality of protection) do caebaçalho Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth nonce count (nc)====&lt;br /&gt;
&lt;br /&gt;
'''$auth.nc''' - the value of nonce count parameter from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth whole username====&lt;br /&gt;
&lt;br /&gt;
'''$aU''' - Nome do usuário no cabeçalho Authorization or Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
====Acc username====&lt;br /&gt;
&lt;br /&gt;
'''$Au''' - usuário para proposito de accounting , é uma pseudo variavel seletiva (dependente do modulo acc) , se existir ela retorna seu valor ou retorna o valor do campo From em todo caso&lt;br /&gt;
&lt;br /&gt;
====Argument options====&lt;br /&gt;
&lt;br /&gt;
'''$argv''' - Permite acesso a argumentos de linha de comando especificados com o parametro '''-o'''&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
   # for option '-o foo=0'&lt;br /&gt;
   xlog(&amp;quot;foo is $argv(foo) \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Branch flags====&lt;br /&gt;
&lt;br /&gt;
'''$bf''' - Exibe a lista de branch flags definidas para a requisição atual&lt;br /&gt;
&lt;br /&gt;
!!!!Branch flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Branch====&lt;br /&gt;
&lt;br /&gt;
'''$branch''' - Esta variavel é utilizada para criação de novas branches (pernas) escrevendo as mesmas no valor da SIP URI&lt;br /&gt;
Exemplos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   # creates a new branch&lt;br /&gt;
   $branch = &amp;quot;sip:new@doamin.org&amp;quot;;&lt;br /&gt;
   # print its URI&lt;br /&gt;
   xlog(&amp;quot;last added branch has URI $(branch(uri)[-1]) \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Branch fields====&lt;br /&gt;
&lt;br /&gt;
'''$branch()''' - Esta variavel permite acesso de leitura e escrita para todos os campos/atributos de uma branch existente (previamente criada com append_branch()), os campos da branche são:&lt;br /&gt;
&lt;br /&gt;
* uri - a RURI da branch (string)&lt;br /&gt;
* duri - a URI e destino da branch (proxy the saida da branch) (sting)&lt;br /&gt;
* q - o valor '''q''' da branch (inteiro)&lt;br /&gt;
* path - a string PATH desta branch (string)&lt;br /&gt;
* flags - as flags para esta branch (inteiro)&lt;br /&gt;
* socket - o scoket local para ser utilizado para fazer o relay desta branch (string)&lt;br /&gt;
&lt;br /&gt;
A variavel aceita também index '''$(branch(uri)[1])''' para acessar uma branch especifica (multiplas branches podem ser especificadas autalmente), o index inicia em 0 (primeira branch), se o index for negativo ele é considerado o valor n do fim ( index -1 é ultima branch)&lt;br /&gt;
&lt;br /&gt;
Para todas as branches é utilizado o index '''*''' - $(branch(uri)[*]).&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   # creates the first branch&lt;br /&gt;
   append_branch();&lt;br /&gt;
   # creates the second branch&lt;br /&gt;
   force_send_socket(udp:192.168.1.10:5060);&lt;br /&gt;
   $du = &amp;quot;sip:192.168.2.10&amp;quot;;&lt;br /&gt;
   append_branch(&amp;quot;sip:foo@bar.com&amp;quot;,&amp;quot;0.5&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   # display branches&lt;br /&gt;
   xlog(&amp;quot;----- branch 0: $(branch(uri)[0]) , $(branch(q)[0]), $(branch(duri)[0]), $(branch(path)[0]), $(branch(flags)[0]), $(branch(socket)[0]) \n&amp;quot;);&lt;br /&gt;
   xlog(&amp;quot;----- branch 1: $(branch(uri)[1]) , $(branch(q)[1]), $(branch(duri)[1]), $(branch(path)[1]), $(branch(flags)[1]), $(branch(socket)[1]) \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   # do some changes over the branches&lt;br /&gt;
   $branch(uri) = &amp;quot;sip:user@domain.ro&amp;quot;;   # set URI for the first branch&lt;br /&gt;
   $(branch(q)[0]) = 1000;  # set to 1.00 for the first branch&lt;br /&gt;
   $(branch(socket)[1]) = NULL;  # reset the socket of the second branch&lt;br /&gt;
   $branch(duri) = NULL;  # reset the destination URI or the first branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta é uma variavel de leitura e escrita (você pode definir valores apartir do script de roteamento)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Call-Id====&lt;br /&gt;
&lt;br /&gt;
'''$ci''' - Referencia para o valor do cabeçalho call-id&lt;br /&gt;
&lt;br /&gt;
====Content-Length====&lt;br /&gt;
&lt;br /&gt;
'''$cl''' - Referencia para o valor do cabeçalho content-length&lt;br /&gt;
&lt;br /&gt;
====CSeq number====&lt;br /&gt;
&lt;br /&gt;
'''$cs''' - Referencia ao valor do cabeçalho cseq &lt;br /&gt;
&lt;br /&gt;
====Contact instance====&lt;br /&gt;
&lt;br /&gt;
'''$ct''' - referencia a 'contact instance/body' do cabeçalho contact, uma contact instance é o display_name + URI + contact_params, como um cabeçalho de contato pode conter multiplos valores e uma mensagem pode conter vários cabeçalhos, um index é adicionado a $ct neste caso:&lt;br /&gt;
&lt;br /&gt;
* $ct -first  primeiro 'contact instance' da mensagem&lt;br /&gt;
* $(ct[n]) - 'contact instance' na posição n do inicio da mensagem, iniciando com index 0&lt;br /&gt;
* $(ct[-n]) - 'contact instance' na posição n apartir do fim da mensagem (iniciando em -1 (ultimo contato)&lt;br /&gt;
&lt;br /&gt;
=====Fields of a contact instance=====&lt;br /&gt;
&lt;br /&gt;
A contact instance possue também campos que podem ser acessados&lt;br /&gt;
&lt;br /&gt;
'''$ct.fields()''' - referencia os campos da 'contact instance' (veja abaixo)&lt;br /&gt;
&lt;br /&gt;
Campos suportados são:&lt;br /&gt;
&lt;br /&gt;
* name - display name&lt;br /&gt;
* uri - contact uri&lt;br /&gt;
* q  - parametro q (valor apenas)&lt;br /&gt;
* expires - parametro expires (valor apenas) &lt;br /&gt;
* methods - parametro metodo (valor apenas)&lt;br /&gt;
* received - parametro received (valor appenas)&lt;br /&gt;
* params - Todos os parametros (incluindo nomes)&lt;br /&gt;
&lt;br /&gt;
Exemplos:&lt;br /&gt;
* $ct.fields(uri) - URI da primeira 'contact instance'&lt;br /&gt;
* $(ct.fields(name)[1]) - O display nae da segunda 'contact instance'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Content-Type====&lt;br /&gt;
&lt;br /&gt;
'''$cT''' - Referencia ao cabeçalho content-type&lt;br /&gt;
&lt;br /&gt;
====Domain of destination URI====&lt;br /&gt;
&lt;br /&gt;
'''$dd''' - Referencia do dominio da destination uri&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
====Diversion header URI====&lt;br /&gt;
&lt;br /&gt;
'''$di''' - Referencia ao Diversion header URI&lt;br /&gt;
&lt;br /&gt;
====Diversion &amp;quot;privacy&amp;quot; parameter====&lt;br /&gt;
&lt;br /&gt;
'''$dip''' - Referencia ao parametro 'privacy' do  Diversion header&lt;br /&gt;
&lt;br /&gt;
====Diversion &amp;quot;reason&amp;quot; parameter====&lt;br /&gt;
&lt;br /&gt;
'''$dir''' - Referencia ao parametro 'reason' do  Diversion header &lt;br /&gt;
&lt;br /&gt;
====Port of destination URI====&lt;br /&gt;
&lt;br /&gt;
'''$dp''' - Referencia a porta da destination URI&lt;br /&gt;
&lt;br /&gt;
Váriavel de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Transport protocol of destination URI====&lt;br /&gt;
&lt;br /&gt;
'''$dP''' - referencia ao protocolo de transporte da destination uri&lt;br /&gt;
&lt;br /&gt;
====Destination set====&lt;br /&gt;
&lt;br /&gt;
'''$ds''' - referencia para a destination set&lt;br /&gt;
&lt;br /&gt;
====Destination URI====&lt;br /&gt;
&lt;br /&gt;
'''$du''' - referencia a destination uri (outbound proxy que deve ser utilizado para enviar a requisição), se a loose_route() retornar TRUE a destination uri é definida de acordo com o primeiro Route header&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Error class====&lt;br /&gt;
&lt;br /&gt;
'''$err.class''' - Classe de erro ( atualmente '1' )&lt;br /&gt;
&lt;br /&gt;
====Error level====&lt;br /&gt;
&lt;br /&gt;
'''$err.level''' - Severidade da mensagem &lt;br /&gt;
&lt;br /&gt;
====Error info====&lt;br /&gt;
&lt;br /&gt;
'''$err.info''' - Texto descrevendo o erro&lt;br /&gt;
&lt;br /&gt;
====Error reply code====&lt;br /&gt;
&lt;br /&gt;
'''$err.rcode''' - Reply code recomendado para o erro&lt;br /&gt;
&lt;br /&gt;
====Error reply reason====&lt;br /&gt;
&lt;br /&gt;
'''$err.rreason''' - Reply reason (frase) recomendada para o erro&lt;br /&gt;
&lt;br /&gt;
====From URI domain====&lt;br /&gt;
&lt;br /&gt;
'''$fd''' - Referencia do dominio da URI do cabeçalho 'From'&lt;br /&gt;
&lt;br /&gt;
====From display name====&lt;br /&gt;
&lt;br /&gt;
'''$fn''' - Referencia ao display name do cabeçalho 'From'&lt;br /&gt;
&lt;br /&gt;
====Forced socket====&lt;br /&gt;
&lt;br /&gt;
'''$fs''' - Referencia ao socket (forçado) para envio de mensagens (quando existe) , o formato é proto:ip:port&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====From tag====&lt;br /&gt;
&lt;br /&gt;
'''$ft''' - Referencia ao parametro tag do cabeçalho 'From'&lt;br /&gt;
&lt;br /&gt;
====From URI====&lt;br /&gt;
&lt;br /&gt;
'''$fu''' - referencia a URI do cabeçalho 'From'&lt;br /&gt;
&lt;br /&gt;
====From URI username====&lt;br /&gt;
&lt;br /&gt;
'''$fU''' - referencia ao username da URI do cabeçalho 'From'&lt;br /&gt;
&lt;br /&gt;
====SIP message buffer====&lt;br /&gt;
&lt;br /&gt;
'''$mb''' - Referencia para o SIP message buffer&lt;br /&gt;
&lt;br /&gt;
====Message Flags====&lt;br /&gt;
&lt;br /&gt;
'''$mf''' - Exibe uma lista com as flags utilizadas na mensagem ou transação para a requisição atual.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====SIP message ID====&lt;br /&gt;
&lt;br /&gt;
'''$mi''' - Referencia ao ID da mensagem SIP&lt;br /&gt;
&lt;br /&gt;
====SIP message length====&lt;br /&gt;
&lt;br /&gt;
'''$ml''' - Referenia ao tamanho da mensagem SIP&lt;br /&gt;
&lt;br /&gt;
====Domain in SIP Request's original URI====&lt;br /&gt;
&lt;br /&gt;
'''$od''' - Referencia do dominio na R-URI original&lt;br /&gt;
&lt;br /&gt;
====Port of SIP request's original URI====&lt;br /&gt;
&lt;br /&gt;
'''$op''' - Referencia a porta da R-URI original&lt;br /&gt;
&lt;br /&gt;
====Transport protocol of SIP request original URI====&lt;br /&gt;
&lt;br /&gt;
'''$oP''' - Referencia do protocolo de transporte da R-URI original&lt;br /&gt;
&lt;br /&gt;
====SIP Request's original URI====&lt;br /&gt;
&lt;br /&gt;
'''$ou''' - Referencia a URI da requisição original&lt;br /&gt;
&lt;br /&gt;
====Username in SIP Request's original URI====&lt;br /&gt;
&lt;br /&gt;
'''$oU''' - Referenciao ao username na requisição original&lt;br /&gt;
&lt;br /&gt;
====Route parameter====&lt;br /&gt;
&lt;br /&gt;
'''$param(idx)''' - Recupera o parametro da rota , o index pode ser um inteiro ou uma pseudo-variavel (index inicia em 1)&lt;br /&gt;
&lt;br /&gt;
Exemplo&lt;br /&gt;
&lt;br /&gt;
   route {&lt;br /&gt;
      ...&lt;br /&gt;
      $var(debug) = &amp;quot;DBUG:&amp;quot;&lt;br /&gt;
      route(PRINT_VAR, $var(debug), &amp;quot;param value&amp;quot;);&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   route[PRINT_VAR] {&lt;br /&gt;
      $var(index) = 2;&lt;br /&gt;
      xlog(&amp;quot;$param(1): The parameter value is &amp;lt;$param($var(index))&amp;gt;\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
====Domain in SIP Request's P-Preferred-Identity header URI====&lt;br /&gt;
&lt;br /&gt;
'''$pd''' - Referencia ao dominio na URI do cabeçalho P-Preferred-Identity  (veja RFC 3325)&lt;br /&gt;
&lt;br /&gt;
====Display Name in SIP Request's P-Preferred-Identity header====&lt;br /&gt;
&lt;br /&gt;
'''$pn''' - Referencia ao display name no cabeçalho P-Preferred-Identity  (veja RFC 3325)&lt;br /&gt;
&lt;br /&gt;
====Process id====&lt;br /&gt;
&lt;br /&gt;
'''$pp''' - Referenciao ao processo id (pid) &lt;br /&gt;
&lt;br /&gt;
====Protocol of received message====&lt;br /&gt;
'''$pr''' ou '''$proto''' - protocolo da mensagem recebida (UDP, TCP, TLS, SCTP)&lt;br /&gt;
&lt;br /&gt;
====User in SIP Request's P-Preferred-Identity header URI====&lt;br /&gt;
&lt;br /&gt;
'''$pU''' - referencia ao usuário da URI no cabeçalho  P-Preferred-Identity (veja RFC 3325)&lt;br /&gt;
&lt;br /&gt;
====URI in SIP Request's P-Preferred-Identity header====&lt;br /&gt;
&lt;br /&gt;
'''$pu''' - Referencia a URI no cabeçalho P-Preferred-Identity (veja RFC 3325)&lt;br /&gt;
&lt;br /&gt;
====Domain in SIP Request's URI====&lt;br /&gt;
&lt;br /&gt;
'''$rd''' - Referencia ao dominio da URI&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
====Body of request/reply====&lt;br /&gt;
&lt;br /&gt;
'''$rb''' - Referencia ao corpo da mensagem recebida&lt;br /&gt;
&lt;br /&gt;
====Returned code====&lt;br /&gt;
&lt;br /&gt;
'''$rc''' - Referencia do código de retorno da ultima função executada&lt;br /&gt;
&lt;br /&gt;
'''$retcode''' - mesma coisa que **$rc**&lt;br /&gt;
&lt;br /&gt;
====Remote-Party-ID header URI====&lt;br /&gt;
&lt;br /&gt;
'''$re''' - referencia a URI do cabeçalho Remote-Party-ID &lt;br /&gt;
&lt;br /&gt;
====SIP request's method====&lt;br /&gt;
&lt;br /&gt;
'''$rm''' - Referencia ao método da mensagem atual&lt;br /&gt;
&lt;br /&gt;
====SIP request's port====&lt;br /&gt;
&lt;br /&gt;
'''$rp''' - Referencia a porta da R-URI&lt;br /&gt;
&lt;br /&gt;
Esta é uma váriavel de leitura e escrita.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Transport protocol of SIP request URI====&lt;br /&gt;
&lt;br /&gt;
'''$rP''' - Referencia ao protocolo de transporte da R-URI&lt;br /&gt;
&lt;br /&gt;
====SIP reply's reason====&lt;br /&gt;
&lt;br /&gt;
'''$rr''' - Referencia a '''reply's reason'''&lt;br /&gt;
&lt;br /&gt;
====SIP reply's status====&lt;br /&gt;
&lt;br /&gt;
'''$rs''' - Referencia ao status do reply&lt;br /&gt;
&lt;br /&gt;
====Refer-to URI====&lt;br /&gt;
&lt;br /&gt;
'''$rt''' - Referencia a URI do cabeçalho refer-to&lt;br /&gt;
&lt;br /&gt;
====SIP Request's URI====&lt;br /&gt;
&lt;br /&gt;
'''$ru''' - Referencia a request URI&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Username in SIP Request's URI====&lt;br /&gt;
&lt;br /&gt;
'''$rU''' - Referencia ao username da URI da requisição&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
====Q value of the SIP Request's URI====&lt;br /&gt;
&lt;br /&gt;
'''$ru_q''' - Referencia ao valor 'q' da R-URI&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
====Received IP address====&lt;br /&gt;
&lt;br /&gt;
'''$Ri''' - Referencia do IP da interface onde o pacote foi recebido&lt;br /&gt;
&lt;br /&gt;
====Received port====&lt;br /&gt;
&lt;br /&gt;
'''$Rp''' - Referencia da porta onde o pacote foi recebido&lt;br /&gt;
&lt;br /&gt;
====Script flags====&lt;br /&gt;
&lt;br /&gt;
'''$sf''' - Exibe uma lista com as flgs de script da requisição atual&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IP source address====&lt;br /&gt;
&lt;br /&gt;
'''$si''' - IP de origem da mensagem recebida&lt;br /&gt;
&lt;br /&gt;
====Source port====&lt;br /&gt;
&lt;br /&gt;
'''$sp''' - Porta de origem da mensagme recebida&lt;br /&gt;
&lt;br /&gt;
====To URI Domain====&lt;br /&gt;
&lt;br /&gt;
'''$td''' - Referencia ao dominio da URI no cabeçalho 'To'&lt;br /&gt;
&lt;br /&gt;
====To display name====&lt;br /&gt;
&lt;br /&gt;
'''$tn''' - Referencia ao display name no cabeçalho 'To'&lt;br /&gt;
&lt;br /&gt;
====To tag====&lt;br /&gt;
&lt;br /&gt;
'''$tt''' - Referencia ao parametro tag do cabeçalho 'To'&lt;br /&gt;
&lt;br /&gt;
====To URI====&lt;br /&gt;
&lt;br /&gt;
'''$tu''' - Referencia a URI do cabeçalho 'To'&lt;br /&gt;
&lt;br /&gt;
====To URI Username====&lt;br /&gt;
&lt;br /&gt;
'''$tU''' - Referencia ao username da URI do cabeçalho 'To'&lt;br /&gt;
&lt;br /&gt;
====Formatted date and time====&lt;br /&gt;
&lt;br /&gt;
'''$time(format)''' - Retorna a string formatda de acordo com o comando date do UNIX (veja '''man date''')&lt;br /&gt;
&lt;br /&gt;
====Branch index====&lt;br /&gt;
&lt;br /&gt;
'''$T_branch_idx''' - O index (iniciando com 1 para a primeira branche) da branch para qual é executada uma branch_route[], se utilizado fora da branch_route[] o valor será 0, esta variável é exportado pelo módulo TM.&lt;br /&gt;
&lt;br /&gt;
====Time Variables====&lt;br /&gt;
&lt;br /&gt;
=====String formatted time=====&lt;br /&gt;
&lt;br /&gt;
'''$Tf''' - Referencia a string formatda para hora (HH:MM:SS)&lt;br /&gt;
&lt;br /&gt;
=====Current unix time stamp in seconds=====&lt;br /&gt;
&lt;br /&gt;
'''$Ts''' - Referencia ao unix timestamp em segundos &lt;br /&gt;
&lt;br /&gt;
=====Current microseconds of the current second=====&lt;br /&gt;
&lt;br /&gt;
'''$Tsm''' - Referencia para os microsegundos do segundo atual&lt;br /&gt;
&lt;br /&gt;
=====Startup unix time stamp=====&lt;br /&gt;
&lt;br /&gt;
'''$TS''' - Referencia ao 'startup unix time stamp'&lt;br /&gt;
&lt;br /&gt;
====User agent header====&lt;br /&gt;
&lt;br /&gt;
'''$ua''' - Referencia ao campo user agent do cabeçalho&lt;br /&gt;
&lt;br /&gt;
===SIP Headers===&lt;br /&gt;
&lt;br /&gt;
'''$(hdr(name)[N])''' - represents the body of the N-th header identified by 'name'. If [N] is omitted then the body of the first header is printed. The first header is got when N=0, for the second N=1, a.s.o. To print the last header of that type, use -1, no other negative values are supported now. No white spaces are allowed inside the specifier (before }, before or after {, [, ] symbols). When N='*', all headers of that type are printed.&lt;br /&gt;
&lt;br /&gt;
The module should identify most of compact header names (the ones recognized by '''OpenSIPS''' which should be all at this moment), if not, the compact form has to be specified explicitly. It is recommended to use dedicated specifiers for headers (e.g., %ua for user agent header), if they are available -- they are faster.&lt;br /&gt;
&lt;br /&gt;
'''$(hdrcnt(name))''' -- returns number of headers of type given by 'name'. Uses same rules for specifying header names as '''$hdr(name)''' above. Many headers (e.g., Via, Path, Record-Route) may appear more than once in the message. This variable returns the number of headers of a given type. &lt;br /&gt;
&lt;br /&gt;
Note that some headers (e.g., Path) may be joined together with commas and appear as a single header line. This variable counts the number of header lines, not header values. &lt;br /&gt;
&lt;br /&gt;
For message fragment below, '''$hdrcnt(Path)''' will have value 2 and '''$(hdr(Path)[0])''' will have value '''&amp;lt;a.com&amp;gt;''':&lt;br /&gt;
[@&lt;br /&gt;
    Path: &amp;lt;a.com&amp;gt;&lt;br /&gt;
    Path: &amp;lt;b.com&amp;gt;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
For message fragment below, '''$hdrcnt(Path)''' will have value 1 and '''$(hdr(Path)[0])''' will have value '''&amp;lt;a.com&amp;gt;,&amp;lt;b.com&amp;gt;''':&lt;br /&gt;
[@&lt;br /&gt;
    Path: &amp;lt;a.com&amp;gt;,&amp;lt;b.com&amp;gt;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
Note that both examples above are semantically equivalent but the variables take on different values.&lt;br /&gt;
&lt;br /&gt;
[[#varavps]]&lt;br /&gt;
&lt;br /&gt;
!!!Escape Sequences&lt;br /&gt;
&lt;br /&gt;
These sequences are exported, and mainly used, by xlog module to print messages in many colors (foreground and background) using escape sequences. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Foreground and background colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$C(xy) - reference to an escape sequence. ¿x¿ represents the foreground color and ¿y¿ represents the background color.&lt;br /&gt;
&lt;br /&gt;
Colors could be:&lt;br /&gt;
&lt;br /&gt;
* x : default color of the terminal&lt;br /&gt;
* s : Black&lt;br /&gt;
* r : Red&lt;br /&gt;
* g : Green&lt;br /&gt;
* y : Yellow&lt;br /&gt;
* b : Blue&lt;br /&gt;
* p : Purple&lt;br /&gt;
* c : Cyan&lt;br /&gt;
* w : White &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Examples&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A few examples of usage.&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
...&lt;br /&gt;
route {&lt;br /&gt;
...&lt;br /&gt;
    $avp(uuid)=&amp;quot;caller_id&amp;quot;;&lt;br /&gt;
    $avp(tmp)= $avp(uuid) + &amp;quot;: &amp;quot; + $fu;&lt;br /&gt;
    xdbg(&amp;quot;$(C(bg))avp(tmp)$(C(xx)) [$avp(tmp)] $(C(br))cseq$(C(xx))=[$hdr(cseq)]\n&amp;quot;);&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
@]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core&amp;diff=1479</id>
		<title>Variáveis Core</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core&amp;diff=1479"/>
		<updated>2013-10-20T22:15:30Z</updated>

		<summary type="html">&lt;p&gt;Mike: /* =Transport protocol of SIP request URI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
O '''OpenSIPS''' prove varios tipos de variaveis para serem usados no script de roteamento, as diferenças entre os tipos de variaveis são:&lt;br /&gt;
* 1. A visibilidade da variavel&lt;br /&gt;
* 2. Onde a variavel é relacionada (onde a mesma reside)&lt;br /&gt;
* 3. Status read-write da variavel ( algumas variaveis são apenas de leitura)&lt;br /&gt;
* 4. Como multiplos valores (da mesma variavel) são manipulados.&lt;br /&gt;
&lt;br /&gt;
As variáveis do '''OpenSIPS''' podem facilmente ser identificadas no script apartir de seus nomes (ou nota'ões) iniciando com o simbolo  '''$''' &lt;br /&gt;
&lt;br /&gt;
Sintaxe:&lt;br /&gt;
&lt;br /&gt;
A sintaxe completa de uma pseudo-variavel é:&lt;br /&gt;
 &lt;br /&gt;
 $(&amp;lt;context&amp;gt;'''name'''(subname)[index]{transformation})&lt;br /&gt;
&lt;br /&gt;
Os campos context, subname, index e transformation são opcionais&lt;br /&gt;
&lt;br /&gt;
Os campos significam:&lt;br /&gt;
* '''name''' - o nome(tipo) da pseudo variavel.&lt;br /&gt;
Ex: pvar, avp, ru, DLG_status etc...&lt;br /&gt;
&lt;br /&gt;
* '''subname''' - o identificador de um certo tipo de variável.&lt;br /&gt;
Ex: hdr(From), avp(nome)&lt;br /&gt;
&lt;br /&gt;
* '''index''' - uma pv pode armazenar mais de um valor, isso pode ser referenciado a uma lista de valores, você pode acessar um certo valor de uma lista se você especificar o index, você também pode especificar indexe's negativos , -1 significa o ultimo inserido e -2 significa o valor anterior ao ultimo (penultimo).&lt;br /&gt;
&lt;br /&gt;
* '''transformation''' - uma série de processos que podem ser aplicados em pseudo-variaveis, você pode encontrar a lista completa em [[Transformações]] , as transformações podem ser cascateadas usango a saída de uma tranformação como entrada de outra.&lt;br /&gt;
&lt;br /&gt;
* '''context''' - o contexto onde a pseudo-variavel será verificada, atualmente existem dois contextos, reply e request, o contexto de reply pode ser usado na rota de falha para verificar o valor da pseudovariavel neste contexto , o contexto de request (requisição) pode ser usado quando em um contexto de reply é desejado a verificação do valor no contexto correspondente ao request.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo de uso:&lt;br /&gt;
&lt;br /&gt;
* Apenas '''name''': $ru&lt;br /&gt;
* '''Name''' e '''subname''': $hdr(Contact)&lt;br /&gt;
* '''Name''' e '''index''': $(ct[0])&lt;br /&gt;
* '''Name''', '''subname''' e '''index''': $(avp(i:10)[2])&lt;br /&gt;
* '''Context'''&lt;br /&gt;
** $(&amp;lt;request&amp;gt;ru) de uma rota reply irá receber a Request-URI da requisição&lt;br /&gt;
** $(&amp;lt;reply&amp;gt;hdr(contact)) , contexto pode ser utilizado em uma rota de falha para acessar as informações do reply.&lt;br /&gt;
&lt;br /&gt;
==Tipos de variáveis==&lt;br /&gt;
&lt;br /&gt;
===script variables===&lt;br /&gt;
* Como o nome diz, estas variáveis são estritamente utilizadas em rotas de script, estas variáveis são visiveis apenas nos blocos de roteamento, não existem mensagem ou transações relacionas, mas são processos relacionados (variaveis de script são dependentes de rotas executadas pelo mesmo processo do '''OpenSIPS''').&lt;br /&gt;
&lt;br /&gt;
Variáveis de scripts são de leitura e escrita e podem ter valores inteiros ou strings, uma variável de script pode ter apenas um valor, uma nova atribuição (ou escrita) irá sobrescrever os valores existentes.&lt;br /&gt;
&lt;br /&gt;
===AVP - Atribute Value Pair===&lt;br /&gt;
* As avp's são variaveis dinamicas que podem ser criadas, as avp's são linkadas para uma mensagem singular ou uma transação ( se processamento stateful está em uso), uma mensagem ou transação irá inicialmente (quando recebida ou criada) ter uma lista vazia de avp's atreladas, durante o processo de roteamento o script diretamente ou via função poderá criar novos AVP's que automaticamente serão atrelados a mensagem/transação, as avp's serão visiveis em todas as rotas onde qualquer mensagem (reply ou request) da transação seja processada, branch_route, filure_route, onreply_route ( para onreply_route voce deve ter ativado o parametro ''onreply_avp_mode'').&lt;br /&gt;
&lt;br /&gt;
AVP's são variáveis de leitura e escrita e uma AVP existente pode ser deletada (removida), uma AVP pode conter multiplos valores, uma nova atribuição (operação de escrita) irá adicionar o novo valor para a AVP, os valores são mantidos no formado ''ultimo adicionado é o primeiro a ser utilizado'' .&lt;br /&gt;
&lt;br /&gt;
===pseudo variables===&lt;br /&gt;
* pseudo-variáveis (ou PV's) provem acesso a informação das mensagens SIP processadas (cabeçalhos, RURI, informações de trnasporte, etc..) ou de informações do '''OpenSIPS''' (valores de timers, números de processo (PID), códigos de retorno de função).&lt;br /&gt;
&lt;br /&gt;
Dependendo da informação provida a PV fica presa (relacionada) a um amensagem ou a nada (global), a maior parte das PV's são apenas de leitura, apenas algumas suportam operações de escrita, uma PV pode retornar varios ou apenas um valor dependendo da informação referenciadas (se pode ter valores multiplos ou nao)&lt;br /&gt;
&lt;br /&gt;
PV padrões são apenas de leitura e retornam apenas um valor (se não foi documentado de forma diferente)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[escape sequences]]&lt;br /&gt;
&lt;br /&gt;
* Sequencias de escape são utilizadas para formatar strings, estas não são variaveis mas podem ser formatadas.&lt;br /&gt;
&lt;br /&gt;
==Definições==&lt;br /&gt;
&lt;br /&gt;
===Script Variables===&lt;br /&gt;
&lt;br /&gt;
'''Nominação: **$var(name)**&lt;br /&gt;
&lt;br /&gt;
'''Dicas''':&lt;br /&gt;
&lt;br /&gt;
* Se você quer utilizar uma variavel em uma rota é melhor inicializar ou restar a mesma), de outra forma você poderá ter problemas com valores de rotas anteriores que forão executadas por um mesmo processo.&lt;br /&gt;
* Variáveis de script são mais rápidas que AVP's sendo processadas diretamente no endereço de memória.&lt;br /&gt;
* O valor de uma variável de script persiste para o processo do '''OpenSIPS'''&lt;br /&gt;
* Um variável pode ter apenas um valor&lt;br /&gt;
&lt;br /&gt;
# a script value can have only one value.&lt;br /&gt;
&lt;br /&gt;
Exemplos de uso&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(a) = 2;  # sets the value of variable 'a' to integer '2'&lt;br /&gt;
$var(a) = &amp;quot;2&amp;quot;;  # sets the value of variable 'a' to string '2'&lt;br /&gt;
$var(a) = 3 + (7&amp;amp;(~2)); # arithmetic and bitwise operation&lt;br /&gt;
$var(a) = &amp;quot;sip:&amp;quot; + $au + &amp;quot;@&amp;quot; + $fd; # compose a value from authentication username and From URI domain&lt;br /&gt;
&lt;br /&gt;
# using a script variable for tests&lt;br /&gt;
if( [ $var(a) &amp;amp; 4 ] ) {&lt;br /&gt;
  xlog(&amp;quot;var a has third bit set\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Definir uma variável para NULL corresponde a iniciar a a mesma com valor '0', variáveis de script não possuem valor NULL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===AVP variables===&lt;br /&gt;
&lt;br /&gt;
'''Nominação''': **$avp(name)** ou **$(avp(name)[N])**&lt;br /&gt;
&lt;br /&gt;
Quando utilizado o index 'N' você pode forçar a AVP para retornar um certo valor (valor na posição N), se nenhum index é informado o primeiro valor será o retornado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Dicas''':&lt;br /&gt;
* Para ativar AVP's em onreply_route utilize '''modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)'''&lt;br /&gt;
* Se multiplos valores forem utilizados em uma mesma AVP os valores são indexados em ordem reversa (primeiro inserido é o ultimo da lista)&lt;br /&gt;
* AVP's são parte do contexto de transação, desta forma estarão visiveis em todo local que a transação esteja presente.&lt;br /&gt;
* O valor de uma AVP pode ser deletado&lt;br /&gt;
&lt;br /&gt;
Exemplo de uso:&lt;br /&gt;
&lt;br /&gt;
Exemplo persistente a transação:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# enable avps in onreply route&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&lt;br /&gt;
...&lt;br /&gt;
route{&lt;br /&gt;
...&lt;br /&gt;
$avp(tmp) = $Ts ; # store the current time (at request processing)&lt;br /&gt;
...&lt;br /&gt;
t_onreply(&amp;quot;1&amp;quot;);&lt;br /&gt;
t_relay();&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
onreply_route[1] {&lt;br /&gt;
	if (t_check_status(&amp;quot;200&amp;quot;)) {&lt;br /&gt;
		# calculate the setup time&lt;br /&gt;
		$var(setup_time) = $Ts - $avp(tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemplo com multiplos valores&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$avp(17) = &amp;quot;one&amp;quot;;&lt;br /&gt;
# we have a single value&lt;br /&gt;
$avp(17) = &amp;quot;two&amp;quot;;&lt;br /&gt;
# we have two values (&amp;quot;two&amp;quot;,&amp;quot;one&amp;quot;)&lt;br /&gt;
$avp(17) = &amp;quot;three&amp;quot;;&lt;br /&gt;
# we have three values (&amp;quot;three&amp;quot;,&amp;quot;two&amp;quot;,&amp;quot;one&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
xlog(&amp;quot;accessing values with no index: $avp(17)\n&amp;quot;);&lt;br /&gt;
# this will print the first value, which is the last added value -&amp;gt; &amp;quot;three&amp;quot;&lt;br /&gt;
&lt;br /&gt;
xlog(&amp;quot;accessing values with no index: $(avp(17)[2])\n&amp;quot;);&lt;br /&gt;
# this will print the index 2 value (third one), -&amp;gt; &amp;quot;one&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# remove the last value of the avp; if there is only one value, the AVP itself will be destroyed&lt;br /&gt;
$avp(17) = NULL;&lt;br /&gt;
&lt;br /&gt;
# delete all values and destroy the AVP&lt;br /&gt;
avp_delete(&amp;quot;$avp(17)/g&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# delete the value located at a certain index &lt;br /&gt;
$(avp(17)[1]) = NULL;&lt;br /&gt;
&lt;br /&gt;
#overwrite the value at a certain index&lt;br /&gt;
$(avp(17)[0]) = &amp;quot;zero&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O módulo '''AVPOPS''' prove uma série de funções para operar as AVP's (como checagem de valores, extração em diferentes locais, deleção etc..)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Pseudo Variables===&lt;br /&gt;
&lt;br /&gt;
'''Nominação''': $name&lt;br /&gt;
&lt;br /&gt;
'''Dicas''':&lt;br /&gt;
* as PV podem ser utilizadas como parametros para diferentes funções e serão substituidas com o valor antes da execução da função&lt;br /&gt;
* A maior part edas PV's são disponibilizadas pelo core do '''OpenSIPS''' porém existem vários módulos que exportas PV's (para tornar algumas informações especificas do módulo disponivel), verifique as documentações dos módulos para saber mais.&lt;br /&gt;
&lt;br /&gt;
Váriaveis pré-definidas pelo core listadas em ordem alfabética.&lt;br /&gt;
&lt;br /&gt;
====URI in SIP Request's P-Asserted-Identity header====&lt;br /&gt;
&lt;br /&gt;
'''$ai''' - referencia a URI no cabeçalho P-Asserted-Identity  (veja  RFC 3325 para mais detalhes)&lt;br /&gt;
&lt;br /&gt;
====Authentication Digest URI====&lt;br /&gt;
&lt;br /&gt;
'''$adu''' - URI do cabeçalho Authorization ou Proxy-Authorization, esta URI é utilizada quando calculando a resposta do resposta do HTTP Digest (autenticação).&lt;br /&gt;
&lt;br /&gt;
====Authentication realm====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''$ar''' - referencia (dominio ou ip) no cabeçalho de  Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
====Auth username user====&lt;br /&gt;
&lt;br /&gt;
'''$au''' - parte referente ao nome do usuário no cabeçalho de Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
====Auth username domain====&lt;br /&gt;
&lt;br /&gt;
'''$ad''' - parte referente ao dominio do usuário no cabeçalho de Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth nonce====&lt;br /&gt;
&lt;br /&gt;
'''$an''' - Hash  do cebçalho Authorization ou Proxy-Authorization &lt;br /&gt;
Nota: na documentação fala nounce, não achei tradução para isso (ex de valor: nonce: 526442e200000000b8d49749e4bdd108e58cd246de209a50)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth response====&lt;br /&gt;
&lt;br /&gt;
'''$auth.resp''' - A resposta da autenticação para um cabeçalho Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth nonce====&lt;br /&gt;
&lt;br /&gt;
'''$auth.nonce''' - the nonce string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth opaque====&lt;br /&gt;
&lt;br /&gt;
'''$auth.opaque''' - the opaque string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth algorithm====&lt;br /&gt;
&lt;br /&gt;
'''$auth.alg''' - A string referente ao algoritimos utilizado para Authorization ou Proxy-Authorization.&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
===Auth QOP===&lt;br /&gt;
&lt;br /&gt;
'''$auth.qop''' - O valor do parametro qop (quality of protection) do caebaçalho Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth nonce count (nc)====&lt;br /&gt;
&lt;br /&gt;
'''$auth.nc''' - the value of nonce count parameter from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth whole username====&lt;br /&gt;
&lt;br /&gt;
'''$aU''' - Nome do usuário no cabeçalho Authorization or Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
====Acc username====&lt;br /&gt;
&lt;br /&gt;
'''$Au''' - usuário para proposito de accounting , é uma pseudo variavel seletiva (dependente do modulo acc) , se existir ela retorna seu valor ou retorna o valor do campo From em todo caso&lt;br /&gt;
&lt;br /&gt;
====Argument options====&lt;br /&gt;
&lt;br /&gt;
'''$argv''' - Permite acesso a argumentos de linha de comando especificados com o parametro '''-o'''&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
   # for option '-o foo=0'&lt;br /&gt;
   xlog(&amp;quot;foo is $argv(foo) \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Branch flags====&lt;br /&gt;
&lt;br /&gt;
'''$bf''' - Exibe a lista de branch flags definidas para a requisição atual&lt;br /&gt;
&lt;br /&gt;
!!!!Branch flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Branch====&lt;br /&gt;
&lt;br /&gt;
'''$branch''' - Esta variavel é utilizada para criação de novas branches (pernas) escrevendo as mesmas no valor da SIP URI&lt;br /&gt;
Exemplos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   # creates a new branch&lt;br /&gt;
   $branch = &amp;quot;sip:new@doamin.org&amp;quot;;&lt;br /&gt;
   # print its URI&lt;br /&gt;
   xlog(&amp;quot;last added branch has URI $(branch(uri)[-1]) \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Branch fields====&lt;br /&gt;
&lt;br /&gt;
'''$branch()''' - Esta variavel permite acesso de leitura e escrita para todos os campos/atributos de uma branch existente (previamente criada com append_branch()), os campos da branche são:&lt;br /&gt;
&lt;br /&gt;
* uri - a RURI da branch (string)&lt;br /&gt;
* duri - a URI e destino da branch (proxy the saida da branch) (sting)&lt;br /&gt;
* q - o valor '''q''' da branch (inteiro)&lt;br /&gt;
* path - a string PATH desta branch (string)&lt;br /&gt;
* flags - as flags para esta branch (inteiro)&lt;br /&gt;
* socket - o scoket local para ser utilizado para fazer o relay desta branch (string)&lt;br /&gt;
&lt;br /&gt;
A variavel aceita também index '''$(branch(uri)[1])''' para acessar uma branch especifica (multiplas branches podem ser especificadas autalmente), o index inicia em 0 (primeira branch), se o index for negativo ele é considerado o valor n do fim ( index -1 é ultima branch)&lt;br /&gt;
&lt;br /&gt;
Para todas as branches é utilizado o index '''*''' - $(branch(uri)[*]).&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   # creates the first branch&lt;br /&gt;
   append_branch();&lt;br /&gt;
   # creates the second branch&lt;br /&gt;
   force_send_socket(udp:192.168.1.10:5060);&lt;br /&gt;
   $du = &amp;quot;sip:192.168.2.10&amp;quot;;&lt;br /&gt;
   append_branch(&amp;quot;sip:foo@bar.com&amp;quot;,&amp;quot;0.5&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   # display branches&lt;br /&gt;
   xlog(&amp;quot;----- branch 0: $(branch(uri)[0]) , $(branch(q)[0]), $(branch(duri)[0]), $(branch(path)[0]), $(branch(flags)[0]), $(branch(socket)[0]) \n&amp;quot;);&lt;br /&gt;
   xlog(&amp;quot;----- branch 1: $(branch(uri)[1]) , $(branch(q)[1]), $(branch(duri)[1]), $(branch(path)[1]), $(branch(flags)[1]), $(branch(socket)[1]) \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   # do some changes over the branches&lt;br /&gt;
   $branch(uri) = &amp;quot;sip:user@domain.ro&amp;quot;;   # set URI for the first branch&lt;br /&gt;
   $(branch(q)[0]) = 1000;  # set to 1.00 for the first branch&lt;br /&gt;
   $(branch(socket)[1]) = NULL;  # reset the socket of the second branch&lt;br /&gt;
   $branch(duri) = NULL;  # reset the destination URI or the first branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta é uma variavel de leitura e escrita (você pode definir valores apartir do script de roteamento)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Call-Id====&lt;br /&gt;
&lt;br /&gt;
'''$ci''' - Referencia para o valor do cabeçalho call-id&lt;br /&gt;
&lt;br /&gt;
====Content-Length====&lt;br /&gt;
&lt;br /&gt;
'''$cl''' - Referencia para o valor do cabeçalho content-length&lt;br /&gt;
&lt;br /&gt;
====CSeq number====&lt;br /&gt;
&lt;br /&gt;
'''$cs''' - Referencia ao valor do cabeçalho cseq &lt;br /&gt;
&lt;br /&gt;
====Contact instance====&lt;br /&gt;
&lt;br /&gt;
'''$ct''' - referencia a 'contact instance/body' do cabeçalho contact, uma contact instance é o display_name + URI + contact_params, como um cabeçalho de contato pode conter multiplos valores e uma mensagem pode conter vários cabeçalhos, um index é adicionado a $ct neste caso:&lt;br /&gt;
&lt;br /&gt;
* $ct -first  primeiro 'contact instance' da mensagem&lt;br /&gt;
* $(ct[n]) - 'contact instance' na posição n do inicio da mensagem, iniciando com index 0&lt;br /&gt;
* $(ct[-n]) - 'contact instance' na posição n apartir do fim da mensagem (iniciando em -1 (ultimo contato)&lt;br /&gt;
&lt;br /&gt;
=====Fields of a contact instance=====&lt;br /&gt;
&lt;br /&gt;
A contact instance possue também campos que podem ser acessados&lt;br /&gt;
&lt;br /&gt;
'''$ct.fields()''' - referencia os campos da 'contact instance' (veja abaixo)&lt;br /&gt;
&lt;br /&gt;
Campos suportados são:&lt;br /&gt;
&lt;br /&gt;
* name - display name&lt;br /&gt;
* uri - contact uri&lt;br /&gt;
* q  - parametro q (valor apenas)&lt;br /&gt;
* expires - parametro expires (valor apenas) &lt;br /&gt;
* methods - parametro metodo (valor apenas)&lt;br /&gt;
* received - parametro received (valor appenas)&lt;br /&gt;
* params - Todos os parametros (incluindo nomes)&lt;br /&gt;
&lt;br /&gt;
Exemplos:&lt;br /&gt;
* $ct.fields(uri) - URI da primeira 'contact instance'&lt;br /&gt;
* $(ct.fields(name)[1]) - O display nae da segunda 'contact instance'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Content-Type====&lt;br /&gt;
&lt;br /&gt;
'''$cT''' - Referencia ao cabeçalho content-type&lt;br /&gt;
&lt;br /&gt;
====Domain of destination URI====&lt;br /&gt;
&lt;br /&gt;
'''$dd''' - Referencia do dominio da destination uri&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
====Diversion header URI====&lt;br /&gt;
&lt;br /&gt;
'''$di''' - Referencia ao Diversion header URI&lt;br /&gt;
&lt;br /&gt;
====Diversion &amp;quot;privacy&amp;quot; parameter====&lt;br /&gt;
&lt;br /&gt;
'''$dip''' - Referencia ao parametro 'privacy' do  Diversion header&lt;br /&gt;
&lt;br /&gt;
====Diversion &amp;quot;reason&amp;quot; parameter====&lt;br /&gt;
&lt;br /&gt;
'''$dir''' - Referencia ao parametro 'reason' do  Diversion header &lt;br /&gt;
&lt;br /&gt;
====Port of destination URI====&lt;br /&gt;
&lt;br /&gt;
'''$dp''' - Referencia a porta da destination URI&lt;br /&gt;
&lt;br /&gt;
Váriavel de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Transport protocol of destination URI====&lt;br /&gt;
&lt;br /&gt;
'''$dP''' - referencia ao protocolo de transporte da destination uri&lt;br /&gt;
&lt;br /&gt;
====Destination set====&lt;br /&gt;
&lt;br /&gt;
'''$ds''' - referencia para a destination set&lt;br /&gt;
&lt;br /&gt;
====Destination URI====&lt;br /&gt;
&lt;br /&gt;
'''$du''' - referencia a destination uri (outbound proxy que deve ser utilizado para enviar a requisição), se a loose_route() retornar TRUE a destination uri é definida de acordo com o primeiro Route header&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Error class====&lt;br /&gt;
&lt;br /&gt;
'''$err.class''' - Classe de erro ( atualmente '1' )&lt;br /&gt;
&lt;br /&gt;
====Error level====&lt;br /&gt;
&lt;br /&gt;
'''$err.level''' - Severidade da mensagem &lt;br /&gt;
&lt;br /&gt;
====Error info====&lt;br /&gt;
&lt;br /&gt;
'''$err.info''' - Texto descrevendo o erro&lt;br /&gt;
&lt;br /&gt;
====Error reply code====&lt;br /&gt;
&lt;br /&gt;
'''$err.rcode''' - Reply code recomendado para o erro&lt;br /&gt;
&lt;br /&gt;
====Error reply reason====&lt;br /&gt;
&lt;br /&gt;
'''$err.rreason''' - Reply reason (frase) recomendada para o erro&lt;br /&gt;
&lt;br /&gt;
====From URI domain====&lt;br /&gt;
&lt;br /&gt;
'''$fd''' - Referencia do dominio da URI do cabeçalho 'From'&lt;br /&gt;
&lt;br /&gt;
====From display name====&lt;br /&gt;
&lt;br /&gt;
'''$fn''' - Referencia ao display name do cabeçalho 'From'&lt;br /&gt;
&lt;br /&gt;
====Forced socket====&lt;br /&gt;
&lt;br /&gt;
'''$fs''' - Referencia ao socket (forçado) para envio de mensagens (quando existe) , o formato é proto:ip:port&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====From tag====&lt;br /&gt;
&lt;br /&gt;
'''$ft''' - Referencia ao parametro tag do cabeçalho 'From'&lt;br /&gt;
&lt;br /&gt;
====From URI====&lt;br /&gt;
&lt;br /&gt;
'''$fu''' - referencia a URI do cabeçalho 'From'&lt;br /&gt;
&lt;br /&gt;
====From URI username====&lt;br /&gt;
&lt;br /&gt;
'''$fU''' - referencia ao username da URI do cabeçalho 'From'&lt;br /&gt;
&lt;br /&gt;
====SIP message buffer====&lt;br /&gt;
&lt;br /&gt;
'''$mb''' - Referencia para o SIP message buffer&lt;br /&gt;
&lt;br /&gt;
====Message Flags====&lt;br /&gt;
&lt;br /&gt;
'''$mf''' - Exibe uma lista com as flags utilizadas na mensagem ou transação para a requisição atual.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====SIP message ID====&lt;br /&gt;
&lt;br /&gt;
'''$mi''' - Referencia ao ID da mensagem SIP&lt;br /&gt;
&lt;br /&gt;
====SIP message length====&lt;br /&gt;
&lt;br /&gt;
'''$ml''' - Referenia ao tamanho da mensagem SIP&lt;br /&gt;
&lt;br /&gt;
====Domain in SIP Request's original URI====&lt;br /&gt;
&lt;br /&gt;
'''$od''' - Referencia do dominio na R-URI original&lt;br /&gt;
&lt;br /&gt;
====Port of SIP request's original URI====&lt;br /&gt;
&lt;br /&gt;
'''$op''' - Referencia a porta da R-URI original&lt;br /&gt;
&lt;br /&gt;
====Transport protocol of SIP request original URI====&lt;br /&gt;
&lt;br /&gt;
'''$oP''' - Referencia do protocolo de transporte da R-URI original&lt;br /&gt;
&lt;br /&gt;
====SIP Request's original URI====&lt;br /&gt;
&lt;br /&gt;
'''$ou''' - Referencia a URI da requisição original&lt;br /&gt;
&lt;br /&gt;
====Username in SIP Request's original URI====&lt;br /&gt;
&lt;br /&gt;
'''$oU''' - Referenciao ao username na requisição original&lt;br /&gt;
&lt;br /&gt;
====Route parameter====&lt;br /&gt;
&lt;br /&gt;
'''$param(idx)''' - Recupera o parametro da rota , o index pode ser um inteiro ou uma pseudo-variavel (index inicia em 1)&lt;br /&gt;
&lt;br /&gt;
Exemplo&lt;br /&gt;
&lt;br /&gt;
   route {&lt;br /&gt;
      ...&lt;br /&gt;
      $var(debug) = &amp;quot;DBUG:&amp;quot;&lt;br /&gt;
      route(PRINT_VAR, $var(debug), &amp;quot;param value&amp;quot;);&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   route[PRINT_VAR] {&lt;br /&gt;
      $var(index) = 2;&lt;br /&gt;
      xlog(&amp;quot;$param(1): The parameter value is &amp;lt;$param($var(index))&amp;gt;\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
====Domain in SIP Request's P-Preferred-Identity header URI====&lt;br /&gt;
&lt;br /&gt;
'''$pd''' - Referencia ao dominio na URI do cabeçalho P-Preferred-Identity  (veja RFC 3325)&lt;br /&gt;
&lt;br /&gt;
====Display Name in SIP Request's P-Preferred-Identity header====&lt;br /&gt;
&lt;br /&gt;
'''$pn''' - Referencia ao display name no cabeçalho P-Preferred-Identity  (veja RFC 3325)&lt;br /&gt;
&lt;br /&gt;
====Process id====&lt;br /&gt;
&lt;br /&gt;
'''$pp''' - Referenciao ao processo id (pid) &lt;br /&gt;
&lt;br /&gt;
====Protocol of received message====&lt;br /&gt;
'''$pr''' ou '''$proto''' - protocolo da mensagem recebida (UDP, TCP, TLS, SCTP)&lt;br /&gt;
&lt;br /&gt;
====User in SIP Request's P-Preferred-Identity header URI====&lt;br /&gt;
&lt;br /&gt;
'''$pU''' - referencia ao usuário da URI no cabeçalho  P-Preferred-Identity (veja RFC 3325)&lt;br /&gt;
&lt;br /&gt;
====URI in SIP Request's P-Preferred-Identity header====&lt;br /&gt;
&lt;br /&gt;
'''$pu''' - Referencia a URI no cabeçalho P-Preferred-Identity (veja RFC 3325)&lt;br /&gt;
&lt;br /&gt;
====Domain in SIP Request's URI====&lt;br /&gt;
&lt;br /&gt;
'''$rd''' - Referencia ao dominio da URI&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
====Body of request/reply====&lt;br /&gt;
&lt;br /&gt;
'''$rb''' - Referencia ao corpo da mensagem recebida&lt;br /&gt;
&lt;br /&gt;
====Returned code====&lt;br /&gt;
&lt;br /&gt;
'''$rc''' - Referencia do código de retorno da ultima função executada&lt;br /&gt;
&lt;br /&gt;
'''$retcode''' - mesma coisa que **$rc**&lt;br /&gt;
&lt;br /&gt;
====Remote-Party-ID header URI====&lt;br /&gt;
&lt;br /&gt;
'''$re''' - referencia a URI do cabeçalho Remote-Party-ID &lt;br /&gt;
&lt;br /&gt;
====SIP request's method====&lt;br /&gt;
&lt;br /&gt;
'''$rm''' - Referencia ao método da mensagem atual&lt;br /&gt;
&lt;br /&gt;
====SIP request's port====&lt;br /&gt;
&lt;br /&gt;
'''$rp''' - Referencia a porta da R-URI&lt;br /&gt;
&lt;br /&gt;
Esta é uma váriavel de leitura e escrita.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Transport protocol of SIP request URI====&lt;br /&gt;
&lt;br /&gt;
'''$rP''' - Referencia ao protocolo de transporte da R-URI&lt;br /&gt;
&lt;br /&gt;
====SIP reply's reason====&lt;br /&gt;
&lt;br /&gt;
'''$rr''' - Referencia a '''reply's reason'''&lt;br /&gt;
&lt;br /&gt;
====SIP reply's status====&lt;br /&gt;
&lt;br /&gt;
'''$rs''' - Referencia ao status do reply&lt;br /&gt;
&lt;br /&gt;
====Refer-to URI====&lt;br /&gt;
&lt;br /&gt;
'''$rt''' - Referencia a URI do cabeçalho refer-to&lt;br /&gt;
&lt;br /&gt;
====SIP Request's URI====&lt;br /&gt;
&lt;br /&gt;
'''$ru''' - Referencia a request URI&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Username in SIP Request's URI====&lt;br /&gt;
&lt;br /&gt;
'''$rU''' - Referencia ao username da URI da requisição&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
====Q value of the SIP Request's URI====&lt;br /&gt;
&lt;br /&gt;
'''$ru_q''' - Referencia ao valor 'q' da R-URI&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
====Received IP address====&lt;br /&gt;
&lt;br /&gt;
'''$Ri''' - Referencia do IP da interface onde o pacote foi recebido&lt;br /&gt;
&lt;br /&gt;
====Received port====&lt;br /&gt;
&lt;br /&gt;
'''$Rp''' - Referencia da porta onde o pacote foi recebido&lt;br /&gt;
&lt;br /&gt;
====Script flags====&lt;br /&gt;
&lt;br /&gt;
'''$sf''' - Exibe uma lista com as flgs de script da requisição atual&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IP source address====&lt;br /&gt;
&lt;br /&gt;
'''$si''' - IP de origem da mensagem recebida&lt;br /&gt;
&lt;br /&gt;
====Source port====&lt;br /&gt;
&lt;br /&gt;
'''$sp''' - Porta de origem da mensagme recebida&lt;br /&gt;
&lt;br /&gt;
====To URI Domain====&lt;br /&gt;
&lt;br /&gt;
'''$td''' - Referencia ao dominio da URI no cabeçalho 'To'&lt;br /&gt;
&lt;br /&gt;
====To display name====&lt;br /&gt;
&lt;br /&gt;
'''$tn''' - Referencia ao display name no cabeçalho 'To'&lt;br /&gt;
&lt;br /&gt;
====To tag====&lt;br /&gt;
&lt;br /&gt;
'''$tt''' - Referencia ao parametro tag do cabeçalho 'To'&lt;br /&gt;
&lt;br /&gt;
====To URI====&lt;br /&gt;
&lt;br /&gt;
'''$tu''' - Referencia a URI do cabeçalho 'To'&lt;br /&gt;
&lt;br /&gt;
====To URI Username====&lt;br /&gt;
&lt;br /&gt;
'''$tU''' - Referencia ao username da URI do cabeçalho 'To'&lt;br /&gt;
&lt;br /&gt;
====Formatted date and time====&lt;br /&gt;
&lt;br /&gt;
'''$time(format)''' - Retorna a string formatda de acordo com o comando date do UNIX (veja '''man date''')&lt;br /&gt;
&lt;br /&gt;
====Branch index====&lt;br /&gt;
&lt;br /&gt;
'''$T_branch_idx''' - O index (iniciando com 1 para a primeira branche) da branch para qual é executada uma branch_route[], se utilizado fora da branch_route[] o valor será 0, esta variável é exportado pelo módulo TM.&lt;br /&gt;
&lt;br /&gt;
=====String formatted time=====&lt;br /&gt;
&lt;br /&gt;
'''$Tf''' - Referencia a string formatda para hora (HH:MM:SS)&lt;br /&gt;
&lt;br /&gt;
=====Current unix time stamp in seconds=====&lt;br /&gt;
&lt;br /&gt;
'''$Ts''' - Referencia ao unix timestamp em segundos &lt;br /&gt;
&lt;br /&gt;
=====Current microseconds of the current second=====&lt;br /&gt;
&lt;br /&gt;
'''$Tsm''' - Referencia para os microsegundos do segundo atual&lt;br /&gt;
&lt;br /&gt;
=====Startup unix time stamp=====&lt;br /&gt;
&lt;br /&gt;
'''$TS''' - Referencia ao 'startup unix time stamp'&lt;br /&gt;
&lt;br /&gt;
====User agent header====&lt;br /&gt;
&lt;br /&gt;
'''$ua''' - Referencia ao campo user agent do cabeçalho&lt;br /&gt;
&lt;br /&gt;
===SIP Headers===&lt;br /&gt;
&lt;br /&gt;
'''$(hdr(name)[N])''' - represents the body of the N-th header identified by 'name'. If [N] is omitted then the body of the first header is printed. The first header is got when N=0, for the second N=1, a.s.o. To print the last header of that type, use -1, no other negative values are supported now. No white spaces are allowed inside the specifier (before }, before or after {, [, ] symbols). When N='*', all headers of that type are printed.&lt;br /&gt;
&lt;br /&gt;
The module should identify most of compact header names (the ones recognized by '''OpenSIPS''' which should be all at this moment), if not, the compact form has to be specified explicitly. It is recommended to use dedicated specifiers for headers (e.g., %ua for user agent header), if they are available -- they are faster.&lt;br /&gt;
&lt;br /&gt;
'''$(hdrcnt(name))''' -- returns number of headers of type given by 'name'. Uses same rules for specifying header names as '''$hdr(name)''' above. Many headers (e.g., Via, Path, Record-Route) may appear more than once in the message. This variable returns the number of headers of a given type. &lt;br /&gt;
&lt;br /&gt;
Note that some headers (e.g., Path) may be joined together with commas and appear as a single header line. This variable counts the number of header lines, not header values. &lt;br /&gt;
&lt;br /&gt;
For message fragment below, '''$hdrcnt(Path)''' will have value 2 and '''$(hdr(Path)[0])''' will have value '''&amp;lt;a.com&amp;gt;''':&lt;br /&gt;
[@&lt;br /&gt;
    Path: &amp;lt;a.com&amp;gt;&lt;br /&gt;
    Path: &amp;lt;b.com&amp;gt;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
For message fragment below, '''$hdrcnt(Path)''' will have value 1 and '''$(hdr(Path)[0])''' will have value '''&amp;lt;a.com&amp;gt;,&amp;lt;b.com&amp;gt;''':&lt;br /&gt;
[@&lt;br /&gt;
    Path: &amp;lt;a.com&amp;gt;,&amp;lt;b.com&amp;gt;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
Note that both examples above are semantically equivalent but the variables take on different values.&lt;br /&gt;
&lt;br /&gt;
[[#varavps]]&lt;br /&gt;
&lt;br /&gt;
!!!Escape Sequences&lt;br /&gt;
&lt;br /&gt;
These sequences are exported, and mainly used, by xlog module to print messages in many colors (foreground and background) using escape sequences. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Foreground and background colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$C(xy) - reference to an escape sequence. ¿x¿ represents the foreground color and ¿y¿ represents the background color.&lt;br /&gt;
&lt;br /&gt;
Colors could be:&lt;br /&gt;
&lt;br /&gt;
* x : default color of the terminal&lt;br /&gt;
* s : Black&lt;br /&gt;
* r : Red&lt;br /&gt;
* g : Green&lt;br /&gt;
* y : Yellow&lt;br /&gt;
* b : Blue&lt;br /&gt;
* p : Purple&lt;br /&gt;
* c : Cyan&lt;br /&gt;
* w : White &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Examples&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A few examples of usage.&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
...&lt;br /&gt;
route {&lt;br /&gt;
...&lt;br /&gt;
    $avp(uuid)=&amp;quot;caller_id&amp;quot;;&lt;br /&gt;
    $avp(tmp)= $avp(uuid) + &amp;quot;: &amp;quot; + $fu;&lt;br /&gt;
    xdbg(&amp;quot;$(C(bg))avp(tmp)$(C(xx)) [$avp(tmp)] $(C(br))cseq$(C(xx))=[$hdr(cseq)]\n&amp;quot;);&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
@]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core&amp;diff=1478</id>
		<title>Variáveis Core</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core&amp;diff=1478"/>
		<updated>2013-10-20T22:14:47Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
O '''OpenSIPS''' prove varios tipos de variaveis para serem usados no script de roteamento, as diferenças entre os tipos de variaveis são:&lt;br /&gt;
* 1. A visibilidade da variavel&lt;br /&gt;
* 2. Onde a variavel é relacionada (onde a mesma reside)&lt;br /&gt;
* 3. Status read-write da variavel ( algumas variaveis são apenas de leitura)&lt;br /&gt;
* 4. Como multiplos valores (da mesma variavel) são manipulados.&lt;br /&gt;
&lt;br /&gt;
As variáveis do '''OpenSIPS''' podem facilmente ser identificadas no script apartir de seus nomes (ou nota'ões) iniciando com o simbolo  '''$''' &lt;br /&gt;
&lt;br /&gt;
Sintaxe:&lt;br /&gt;
&lt;br /&gt;
A sintaxe completa de uma pseudo-variavel é:&lt;br /&gt;
 &lt;br /&gt;
 $(&amp;lt;context&amp;gt;'''name'''(subname)[index]{transformation})&lt;br /&gt;
&lt;br /&gt;
Os campos context, subname, index e transformation são opcionais&lt;br /&gt;
&lt;br /&gt;
Os campos significam:&lt;br /&gt;
* '''name''' - o nome(tipo) da pseudo variavel.&lt;br /&gt;
Ex: pvar, avp, ru, DLG_status etc...&lt;br /&gt;
&lt;br /&gt;
* '''subname''' - o identificador de um certo tipo de variável.&lt;br /&gt;
Ex: hdr(From), avp(nome)&lt;br /&gt;
&lt;br /&gt;
* '''index''' - uma pv pode armazenar mais de um valor, isso pode ser referenciado a uma lista de valores, você pode acessar um certo valor de uma lista se você especificar o index, você também pode especificar indexe's negativos , -1 significa o ultimo inserido e -2 significa o valor anterior ao ultimo (penultimo).&lt;br /&gt;
&lt;br /&gt;
* '''transformation''' - uma série de processos que podem ser aplicados em pseudo-variaveis, você pode encontrar a lista completa em [[Transformações]] , as transformações podem ser cascateadas usango a saída de uma tranformação como entrada de outra.&lt;br /&gt;
&lt;br /&gt;
* '''context''' - o contexto onde a pseudo-variavel será verificada, atualmente existem dois contextos, reply e request, o contexto de reply pode ser usado na rota de falha para verificar o valor da pseudovariavel neste contexto , o contexto de request (requisição) pode ser usado quando em um contexto de reply é desejado a verificação do valor no contexto correspondente ao request.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo de uso:&lt;br /&gt;
&lt;br /&gt;
* Apenas '''name''': $ru&lt;br /&gt;
* '''Name''' e '''subname''': $hdr(Contact)&lt;br /&gt;
* '''Name''' e '''index''': $(ct[0])&lt;br /&gt;
* '''Name''', '''subname''' e '''index''': $(avp(i:10)[2])&lt;br /&gt;
* '''Context'''&lt;br /&gt;
** $(&amp;lt;request&amp;gt;ru) de uma rota reply irá receber a Request-URI da requisição&lt;br /&gt;
** $(&amp;lt;reply&amp;gt;hdr(contact)) , contexto pode ser utilizado em uma rota de falha para acessar as informações do reply.&lt;br /&gt;
&lt;br /&gt;
==Tipos de variáveis==&lt;br /&gt;
&lt;br /&gt;
===script variables===&lt;br /&gt;
* Como o nome diz, estas variáveis são estritamente utilizadas em rotas de script, estas variáveis são visiveis apenas nos blocos de roteamento, não existem mensagem ou transações relacionas, mas são processos relacionados (variaveis de script são dependentes de rotas executadas pelo mesmo processo do '''OpenSIPS''').&lt;br /&gt;
&lt;br /&gt;
Variáveis de scripts são de leitura e escrita e podem ter valores inteiros ou strings, uma variável de script pode ter apenas um valor, uma nova atribuição (ou escrita) irá sobrescrever os valores existentes.&lt;br /&gt;
&lt;br /&gt;
===AVP - Atribute Value Pair===&lt;br /&gt;
* As avp's são variaveis dinamicas que podem ser criadas, as avp's são linkadas para uma mensagem singular ou uma transação ( se processamento stateful está em uso), uma mensagem ou transação irá inicialmente (quando recebida ou criada) ter uma lista vazia de avp's atreladas, durante o processo de roteamento o script diretamente ou via função poderá criar novos AVP's que automaticamente serão atrelados a mensagem/transação, as avp's serão visiveis em todas as rotas onde qualquer mensagem (reply ou request) da transação seja processada, branch_route, filure_route, onreply_route ( para onreply_route voce deve ter ativado o parametro ''onreply_avp_mode'').&lt;br /&gt;
&lt;br /&gt;
AVP's são variáveis de leitura e escrita e uma AVP existente pode ser deletada (removida), uma AVP pode conter multiplos valores, uma nova atribuição (operação de escrita) irá adicionar o novo valor para a AVP, os valores são mantidos no formado ''ultimo adicionado é o primeiro a ser utilizado'' .&lt;br /&gt;
&lt;br /&gt;
===pseudo variables===&lt;br /&gt;
* pseudo-variáveis (ou PV's) provem acesso a informação das mensagens SIP processadas (cabeçalhos, RURI, informações de trnasporte, etc..) ou de informações do '''OpenSIPS''' (valores de timers, números de processo (PID), códigos de retorno de função).&lt;br /&gt;
&lt;br /&gt;
Dependendo da informação provida a PV fica presa (relacionada) a um amensagem ou a nada (global), a maior parte das PV's são apenas de leitura, apenas algumas suportam operações de escrita, uma PV pode retornar varios ou apenas um valor dependendo da informação referenciadas (se pode ter valores multiplos ou nao)&lt;br /&gt;
&lt;br /&gt;
PV padrões são apenas de leitura e retornam apenas um valor (se não foi documentado de forma diferente)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[escape sequences]]&lt;br /&gt;
&lt;br /&gt;
* Sequencias de escape são utilizadas para formatar strings, estas não são variaveis mas podem ser formatadas.&lt;br /&gt;
&lt;br /&gt;
==Definições==&lt;br /&gt;
&lt;br /&gt;
===Script Variables===&lt;br /&gt;
&lt;br /&gt;
'''Nominação: **$var(name)**&lt;br /&gt;
&lt;br /&gt;
'''Dicas''':&lt;br /&gt;
&lt;br /&gt;
* Se você quer utilizar uma variavel em uma rota é melhor inicializar ou restar a mesma), de outra forma você poderá ter problemas com valores de rotas anteriores que forão executadas por um mesmo processo.&lt;br /&gt;
* Variáveis de script são mais rápidas que AVP's sendo processadas diretamente no endereço de memória.&lt;br /&gt;
* O valor de uma variável de script persiste para o processo do '''OpenSIPS'''&lt;br /&gt;
* Um variável pode ter apenas um valor&lt;br /&gt;
&lt;br /&gt;
# a script value can have only one value.&lt;br /&gt;
&lt;br /&gt;
Exemplos de uso&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(a) = 2;  # sets the value of variable 'a' to integer '2'&lt;br /&gt;
$var(a) = &amp;quot;2&amp;quot;;  # sets the value of variable 'a' to string '2'&lt;br /&gt;
$var(a) = 3 + (7&amp;amp;(~2)); # arithmetic and bitwise operation&lt;br /&gt;
$var(a) = &amp;quot;sip:&amp;quot; + $au + &amp;quot;@&amp;quot; + $fd; # compose a value from authentication username and From URI domain&lt;br /&gt;
&lt;br /&gt;
# using a script variable for tests&lt;br /&gt;
if( [ $var(a) &amp;amp; 4 ] ) {&lt;br /&gt;
  xlog(&amp;quot;var a has third bit set\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Definir uma variável para NULL corresponde a iniciar a a mesma com valor '0', variáveis de script não possuem valor NULL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===AVP variables===&lt;br /&gt;
&lt;br /&gt;
'''Nominação''': **$avp(name)** ou **$(avp(name)[N])**&lt;br /&gt;
&lt;br /&gt;
Quando utilizado o index 'N' você pode forçar a AVP para retornar um certo valor (valor na posição N), se nenhum index é informado o primeiro valor será o retornado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Dicas''':&lt;br /&gt;
* Para ativar AVP's em onreply_route utilize '''modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)'''&lt;br /&gt;
* Se multiplos valores forem utilizados em uma mesma AVP os valores são indexados em ordem reversa (primeiro inserido é o ultimo da lista)&lt;br /&gt;
* AVP's são parte do contexto de transação, desta forma estarão visiveis em todo local que a transação esteja presente.&lt;br /&gt;
* O valor de uma AVP pode ser deletado&lt;br /&gt;
&lt;br /&gt;
Exemplo de uso:&lt;br /&gt;
&lt;br /&gt;
Exemplo persistente a transação:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# enable avps in onreply route&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&lt;br /&gt;
...&lt;br /&gt;
route{&lt;br /&gt;
...&lt;br /&gt;
$avp(tmp) = $Ts ; # store the current time (at request processing)&lt;br /&gt;
...&lt;br /&gt;
t_onreply(&amp;quot;1&amp;quot;);&lt;br /&gt;
t_relay();&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
onreply_route[1] {&lt;br /&gt;
	if (t_check_status(&amp;quot;200&amp;quot;)) {&lt;br /&gt;
		# calculate the setup time&lt;br /&gt;
		$var(setup_time) = $Ts - $avp(tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemplo com multiplos valores&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$avp(17) = &amp;quot;one&amp;quot;;&lt;br /&gt;
# we have a single value&lt;br /&gt;
$avp(17) = &amp;quot;two&amp;quot;;&lt;br /&gt;
# we have two values (&amp;quot;two&amp;quot;,&amp;quot;one&amp;quot;)&lt;br /&gt;
$avp(17) = &amp;quot;three&amp;quot;;&lt;br /&gt;
# we have three values (&amp;quot;three&amp;quot;,&amp;quot;two&amp;quot;,&amp;quot;one&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
xlog(&amp;quot;accessing values with no index: $avp(17)\n&amp;quot;);&lt;br /&gt;
# this will print the first value, which is the last added value -&amp;gt; &amp;quot;three&amp;quot;&lt;br /&gt;
&lt;br /&gt;
xlog(&amp;quot;accessing values with no index: $(avp(17)[2])\n&amp;quot;);&lt;br /&gt;
# this will print the index 2 value (third one), -&amp;gt; &amp;quot;one&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# remove the last value of the avp; if there is only one value, the AVP itself will be destroyed&lt;br /&gt;
$avp(17) = NULL;&lt;br /&gt;
&lt;br /&gt;
# delete all values and destroy the AVP&lt;br /&gt;
avp_delete(&amp;quot;$avp(17)/g&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# delete the value located at a certain index &lt;br /&gt;
$(avp(17)[1]) = NULL;&lt;br /&gt;
&lt;br /&gt;
#overwrite the value at a certain index&lt;br /&gt;
$(avp(17)[0]) = &amp;quot;zero&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O módulo '''AVPOPS''' prove uma série de funções para operar as AVP's (como checagem de valores, extração em diferentes locais, deleção etc..)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Pseudo Variables===&lt;br /&gt;
&lt;br /&gt;
'''Nominação''': $name&lt;br /&gt;
&lt;br /&gt;
'''Dicas''':&lt;br /&gt;
* as PV podem ser utilizadas como parametros para diferentes funções e serão substituidas com o valor antes da execução da função&lt;br /&gt;
* A maior part edas PV's são disponibilizadas pelo core do '''OpenSIPS''' porém existem vários módulos que exportas PV's (para tornar algumas informações especificas do módulo disponivel), verifique as documentações dos módulos para saber mais.&lt;br /&gt;
&lt;br /&gt;
Váriaveis pré-definidas pelo core listadas em ordem alfabética.&lt;br /&gt;
&lt;br /&gt;
====URI in SIP Request's P-Asserted-Identity header====&lt;br /&gt;
&lt;br /&gt;
'''$ai''' - referencia a URI no cabeçalho P-Asserted-Identity  (veja  RFC 3325 para mais detalhes)&lt;br /&gt;
&lt;br /&gt;
====Authentication Digest URI====&lt;br /&gt;
&lt;br /&gt;
'''$adu''' - URI do cabeçalho Authorization ou Proxy-Authorization, esta URI é utilizada quando calculando a resposta do resposta do HTTP Digest (autenticação).&lt;br /&gt;
&lt;br /&gt;
====Authentication realm====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''$ar''' - referencia (dominio ou ip) no cabeçalho de  Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
====Auth username user====&lt;br /&gt;
&lt;br /&gt;
'''$au''' - parte referente ao nome do usuário no cabeçalho de Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
====Auth username domain====&lt;br /&gt;
&lt;br /&gt;
'''$ad''' - parte referente ao dominio do usuário no cabeçalho de Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth nonce====&lt;br /&gt;
&lt;br /&gt;
'''$an''' - Hash  do cebçalho Authorization ou Proxy-Authorization &lt;br /&gt;
Nota: na documentação fala nounce, não achei tradução para isso (ex de valor: nonce: 526442e200000000b8d49749e4bdd108e58cd246de209a50)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth response====&lt;br /&gt;
&lt;br /&gt;
'''$auth.resp''' - A resposta da autenticação para um cabeçalho Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth nonce====&lt;br /&gt;
&lt;br /&gt;
'''$auth.nonce''' - the nonce string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth opaque====&lt;br /&gt;
&lt;br /&gt;
'''$auth.opaque''' - the opaque string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth algorithm====&lt;br /&gt;
&lt;br /&gt;
'''$auth.alg''' - A string referente ao algoritimos utilizado para Authorization ou Proxy-Authorization.&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
===Auth QOP===&lt;br /&gt;
&lt;br /&gt;
'''$auth.qop''' - O valor do parametro qop (quality of protection) do caebaçalho Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth nonce count (nc)====&lt;br /&gt;
&lt;br /&gt;
'''$auth.nc''' - the value of nonce count parameter from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth whole username====&lt;br /&gt;
&lt;br /&gt;
'''$aU''' - Nome do usuário no cabeçalho Authorization or Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
====Acc username====&lt;br /&gt;
&lt;br /&gt;
'''$Au''' - usuário para proposito de accounting , é uma pseudo variavel seletiva (dependente do modulo acc) , se existir ela retorna seu valor ou retorna o valor do campo From em todo caso&lt;br /&gt;
&lt;br /&gt;
====Argument options====&lt;br /&gt;
&lt;br /&gt;
'''$argv''' - Permite acesso a argumentos de linha de comando especificados com o parametro '''-o'''&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
   # for option '-o foo=0'&lt;br /&gt;
   xlog(&amp;quot;foo is $argv(foo) \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Branch flags====&lt;br /&gt;
&lt;br /&gt;
'''$bf''' - Exibe a lista de branch flags definidas para a requisição atual&lt;br /&gt;
&lt;br /&gt;
!!!!Branch flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Branch====&lt;br /&gt;
&lt;br /&gt;
'''$branch''' - Esta variavel é utilizada para criação de novas branches (pernas) escrevendo as mesmas no valor da SIP URI&lt;br /&gt;
Exemplos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   # creates a new branch&lt;br /&gt;
   $branch = &amp;quot;sip:new@doamin.org&amp;quot;;&lt;br /&gt;
   # print its URI&lt;br /&gt;
   xlog(&amp;quot;last added branch has URI $(branch(uri)[-1]) \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Branch fields====&lt;br /&gt;
&lt;br /&gt;
'''$branch()''' - Esta variavel permite acesso de leitura e escrita para todos os campos/atributos de uma branch existente (previamente criada com append_branch()), os campos da branche são:&lt;br /&gt;
&lt;br /&gt;
* uri - a RURI da branch (string)&lt;br /&gt;
* duri - a URI e destino da branch (proxy the saida da branch) (sting)&lt;br /&gt;
* q - o valor '''q''' da branch (inteiro)&lt;br /&gt;
* path - a string PATH desta branch (string)&lt;br /&gt;
* flags - as flags para esta branch (inteiro)&lt;br /&gt;
* socket - o scoket local para ser utilizado para fazer o relay desta branch (string)&lt;br /&gt;
&lt;br /&gt;
A variavel aceita também index '''$(branch(uri)[1])''' para acessar uma branch especifica (multiplas branches podem ser especificadas autalmente), o index inicia em 0 (primeira branch), se o index for negativo ele é considerado o valor n do fim ( index -1 é ultima branch)&lt;br /&gt;
&lt;br /&gt;
Para todas as branches é utilizado o index '''*''' - $(branch(uri)[*]).&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   # creates the first branch&lt;br /&gt;
   append_branch();&lt;br /&gt;
   # creates the second branch&lt;br /&gt;
   force_send_socket(udp:192.168.1.10:5060);&lt;br /&gt;
   $du = &amp;quot;sip:192.168.2.10&amp;quot;;&lt;br /&gt;
   append_branch(&amp;quot;sip:foo@bar.com&amp;quot;,&amp;quot;0.5&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   # display branches&lt;br /&gt;
   xlog(&amp;quot;----- branch 0: $(branch(uri)[0]) , $(branch(q)[0]), $(branch(duri)[0]), $(branch(path)[0]), $(branch(flags)[0]), $(branch(socket)[0]) \n&amp;quot;);&lt;br /&gt;
   xlog(&amp;quot;----- branch 1: $(branch(uri)[1]) , $(branch(q)[1]), $(branch(duri)[1]), $(branch(path)[1]), $(branch(flags)[1]), $(branch(socket)[1]) \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   # do some changes over the branches&lt;br /&gt;
   $branch(uri) = &amp;quot;sip:user@domain.ro&amp;quot;;   # set URI for the first branch&lt;br /&gt;
   $(branch(q)[0]) = 1000;  # set to 1.00 for the first branch&lt;br /&gt;
   $(branch(socket)[1]) = NULL;  # reset the socket of the second branch&lt;br /&gt;
   $branch(duri) = NULL;  # reset the destination URI or the first branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta é uma variavel de leitura e escrita (você pode definir valores apartir do script de roteamento)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Call-Id====&lt;br /&gt;
&lt;br /&gt;
'''$ci''' - Referencia para o valor do cabeçalho call-id&lt;br /&gt;
&lt;br /&gt;
====Content-Length====&lt;br /&gt;
&lt;br /&gt;
'''$cl''' - Referencia para o valor do cabeçalho content-length&lt;br /&gt;
&lt;br /&gt;
====CSeq number====&lt;br /&gt;
&lt;br /&gt;
'''$cs''' - Referencia ao valor do cabeçalho cseq &lt;br /&gt;
&lt;br /&gt;
====Contact instance====&lt;br /&gt;
&lt;br /&gt;
'''$ct''' - referencia a 'contact instance/body' do cabeçalho contact, uma contact instance é o display_name + URI + contact_params, como um cabeçalho de contato pode conter multiplos valores e uma mensagem pode conter vários cabeçalhos, um index é adicionado a $ct neste caso:&lt;br /&gt;
&lt;br /&gt;
* $ct -first  primeiro 'contact instance' da mensagem&lt;br /&gt;
* $(ct[n]) - 'contact instance' na posição n do inicio da mensagem, iniciando com index 0&lt;br /&gt;
* $(ct[-n]) - 'contact instance' na posição n apartir do fim da mensagem (iniciando em -1 (ultimo contato)&lt;br /&gt;
&lt;br /&gt;
=====Fields of a contact instance=====&lt;br /&gt;
&lt;br /&gt;
A contact instance possue também campos que podem ser acessados&lt;br /&gt;
&lt;br /&gt;
'''$ct.fields()''' - referencia os campos da 'contact instance' (veja abaixo)&lt;br /&gt;
&lt;br /&gt;
Campos suportados são:&lt;br /&gt;
&lt;br /&gt;
* name - display name&lt;br /&gt;
* uri - contact uri&lt;br /&gt;
* q  - parametro q (valor apenas)&lt;br /&gt;
* expires - parametro expires (valor apenas) &lt;br /&gt;
* methods - parametro metodo (valor apenas)&lt;br /&gt;
* received - parametro received (valor appenas)&lt;br /&gt;
* params - Todos os parametros (incluindo nomes)&lt;br /&gt;
&lt;br /&gt;
Exemplos:&lt;br /&gt;
* $ct.fields(uri) - URI da primeira 'contact instance'&lt;br /&gt;
* $(ct.fields(name)[1]) - O display nae da segunda 'contact instance'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Content-Type====&lt;br /&gt;
&lt;br /&gt;
'''$cT''' - Referencia ao cabeçalho content-type&lt;br /&gt;
&lt;br /&gt;
====Domain of destination URI====&lt;br /&gt;
&lt;br /&gt;
'''$dd''' - Referencia do dominio da destination uri&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
====Diversion header URI====&lt;br /&gt;
&lt;br /&gt;
'''$di''' - Referencia ao Diversion header URI&lt;br /&gt;
&lt;br /&gt;
====Diversion &amp;quot;privacy&amp;quot; parameter====&lt;br /&gt;
&lt;br /&gt;
'''$dip''' - Referencia ao parametro 'privacy' do  Diversion header&lt;br /&gt;
&lt;br /&gt;
====Diversion &amp;quot;reason&amp;quot; parameter====&lt;br /&gt;
&lt;br /&gt;
'''$dir''' - Referencia ao parametro 'reason' do  Diversion header &lt;br /&gt;
&lt;br /&gt;
====Port of destination URI====&lt;br /&gt;
&lt;br /&gt;
'''$dp''' - Referencia a porta da destination URI&lt;br /&gt;
&lt;br /&gt;
Váriavel de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Transport protocol of destination URI====&lt;br /&gt;
&lt;br /&gt;
'''$dP''' - referencia ao protocolo de transporte da destination uri&lt;br /&gt;
&lt;br /&gt;
====Destination set====&lt;br /&gt;
&lt;br /&gt;
'''$ds''' - referencia para a destination set&lt;br /&gt;
&lt;br /&gt;
====Destination URI====&lt;br /&gt;
&lt;br /&gt;
'''$du''' - referencia a destination uri (outbound proxy que deve ser utilizado para enviar a requisição), se a loose_route() retornar TRUE a destination uri é definida de acordo com o primeiro Route header&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Error class====&lt;br /&gt;
&lt;br /&gt;
'''$err.class''' - Classe de erro ( atualmente '1' )&lt;br /&gt;
&lt;br /&gt;
====Error level====&lt;br /&gt;
&lt;br /&gt;
'''$err.level''' - Severidade da mensagem &lt;br /&gt;
&lt;br /&gt;
====Error info====&lt;br /&gt;
&lt;br /&gt;
'''$err.info''' - Texto descrevendo o erro&lt;br /&gt;
&lt;br /&gt;
====Error reply code====&lt;br /&gt;
&lt;br /&gt;
'''$err.rcode''' - Reply code recomendado para o erro&lt;br /&gt;
&lt;br /&gt;
====Error reply reason====&lt;br /&gt;
&lt;br /&gt;
'''$err.rreason''' - Reply reason (frase) recomendada para o erro&lt;br /&gt;
&lt;br /&gt;
====From URI domain====&lt;br /&gt;
&lt;br /&gt;
'''$fd''' - Referencia do dominio da URI do cabeçalho 'From'&lt;br /&gt;
&lt;br /&gt;
====From display name====&lt;br /&gt;
&lt;br /&gt;
'''$fn''' - Referencia ao display name do cabeçalho 'From'&lt;br /&gt;
&lt;br /&gt;
====Forced socket====&lt;br /&gt;
&lt;br /&gt;
'''$fs''' - Referencia ao socket (forçado) para envio de mensagens (quando existe) , o formato é proto:ip:port&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====From tag====&lt;br /&gt;
&lt;br /&gt;
'''$ft''' - Referencia ao parametro tag do cabeçalho 'From'&lt;br /&gt;
&lt;br /&gt;
====From URI====&lt;br /&gt;
&lt;br /&gt;
'''$fu''' - referencia a URI do cabeçalho 'From'&lt;br /&gt;
&lt;br /&gt;
====From URI username====&lt;br /&gt;
&lt;br /&gt;
'''$fU''' - referencia ao username da URI do cabeçalho 'From'&lt;br /&gt;
&lt;br /&gt;
====SIP message buffer====&lt;br /&gt;
&lt;br /&gt;
'''$mb''' - Referencia para o SIP message buffer&lt;br /&gt;
&lt;br /&gt;
====Message Flags====&lt;br /&gt;
&lt;br /&gt;
'''$mf''' - Exibe uma lista com as flags utilizadas na mensagem ou transação para a requisição atual.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====SIP message ID====&lt;br /&gt;
&lt;br /&gt;
'''$mi''' - Referencia ao ID da mensagem SIP&lt;br /&gt;
&lt;br /&gt;
====SIP message length====&lt;br /&gt;
&lt;br /&gt;
'''$ml''' - Referenia ao tamanho da mensagem SIP&lt;br /&gt;
&lt;br /&gt;
====Domain in SIP Request's original URI====&lt;br /&gt;
&lt;br /&gt;
'''$od''' - Referencia do dominio na R-URI original&lt;br /&gt;
&lt;br /&gt;
====Port of SIP request's original URI====&lt;br /&gt;
&lt;br /&gt;
'''$op''' - Referencia a porta da R-URI original&lt;br /&gt;
&lt;br /&gt;
====Transport protocol of SIP request original URI====&lt;br /&gt;
&lt;br /&gt;
'''$oP''' - Referencia do protocolo de transporte da R-URI original&lt;br /&gt;
&lt;br /&gt;
====SIP Request's original URI====&lt;br /&gt;
&lt;br /&gt;
'''$ou''' - Referencia a URI da requisição original&lt;br /&gt;
&lt;br /&gt;
====Username in SIP Request's original URI====&lt;br /&gt;
&lt;br /&gt;
'''$oU''' - Referenciao ao username na requisição original&lt;br /&gt;
&lt;br /&gt;
====Route parameter====&lt;br /&gt;
&lt;br /&gt;
'''$param(idx)''' - Recupera o parametro da rota , o index pode ser um inteiro ou uma pseudo-variavel (index inicia em 1)&lt;br /&gt;
&lt;br /&gt;
Exemplo&lt;br /&gt;
&lt;br /&gt;
   route {&lt;br /&gt;
      ...&lt;br /&gt;
      $var(debug) = &amp;quot;DBUG:&amp;quot;&lt;br /&gt;
      route(PRINT_VAR, $var(debug), &amp;quot;param value&amp;quot;);&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   route[PRINT_VAR] {&lt;br /&gt;
      $var(index) = 2;&lt;br /&gt;
      xlog(&amp;quot;$param(1): The parameter value is &amp;lt;$param($var(index))&amp;gt;\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
====Domain in SIP Request's P-Preferred-Identity header URI====&lt;br /&gt;
&lt;br /&gt;
'''$pd''' - Referencia ao dominio na URI do cabeçalho P-Preferred-Identity  (veja RFC 3325)&lt;br /&gt;
&lt;br /&gt;
====Display Name in SIP Request's P-Preferred-Identity header====&lt;br /&gt;
&lt;br /&gt;
'''$pn''' - Referencia ao display name no cabeçalho P-Preferred-Identity  (veja RFC 3325)&lt;br /&gt;
&lt;br /&gt;
====Process id====&lt;br /&gt;
&lt;br /&gt;
'''$pp''' - Referenciao ao processo id (pid) &lt;br /&gt;
&lt;br /&gt;
====Protocol of received message====&lt;br /&gt;
'''$pr''' ou '''$proto''' - protocolo da mensagem recebida (UDP, TCP, TLS, SCTP)&lt;br /&gt;
&lt;br /&gt;
====User in SIP Request's P-Preferred-Identity header URI====&lt;br /&gt;
&lt;br /&gt;
'''$pU''' - referencia ao usuário da URI no cabeçalho  P-Preferred-Identity (veja RFC 3325)&lt;br /&gt;
&lt;br /&gt;
====URI in SIP Request's P-Preferred-Identity header====&lt;br /&gt;
&lt;br /&gt;
'''$pu''' - Referencia a URI no cabeçalho P-Preferred-Identity (veja RFC 3325)&lt;br /&gt;
&lt;br /&gt;
====Domain in SIP Request's URI====&lt;br /&gt;
&lt;br /&gt;
'''$rd''' - Referencia ao dominio da URI&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
====Body of request/reply====&lt;br /&gt;
&lt;br /&gt;
'''$rb''' - Referencia ao corpo da mensagem recebida&lt;br /&gt;
&lt;br /&gt;
====Returned code====&lt;br /&gt;
&lt;br /&gt;
'''$rc''' - Referencia do código de retorno da ultima função executada&lt;br /&gt;
&lt;br /&gt;
'''$retcode''' - mesma coisa que **$rc**&lt;br /&gt;
&lt;br /&gt;
====Remote-Party-ID header URI====&lt;br /&gt;
&lt;br /&gt;
'''$re''' - referencia a URI do cabeçalho Remote-Party-ID &lt;br /&gt;
&lt;br /&gt;
====SIP request's method====&lt;br /&gt;
&lt;br /&gt;
'''$rm''' - Referencia ao método da mensagem atual&lt;br /&gt;
&lt;br /&gt;
====SIP request's port====&lt;br /&gt;
&lt;br /&gt;
'''$rp''' - Referencia a porta da R-URI&lt;br /&gt;
&lt;br /&gt;
Esta é uma váriavel de leitura e escrita.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Transport protocol of SIP request URI===&lt;br /&gt;
&lt;br /&gt;
'''$rP''' - Referencia ao protocolo de transporte da R-URI&lt;br /&gt;
&lt;br /&gt;
====SIP reply's reason====&lt;br /&gt;
&lt;br /&gt;
'''$rr''' - Referencia a '''reply's reason'''&lt;br /&gt;
&lt;br /&gt;
====SIP reply's status====&lt;br /&gt;
&lt;br /&gt;
'''$rs''' - Referencia ao status do reply&lt;br /&gt;
&lt;br /&gt;
====Refer-to URI====&lt;br /&gt;
&lt;br /&gt;
'''$rt''' - Referencia a URI do cabeçalho refer-to&lt;br /&gt;
&lt;br /&gt;
====SIP Request's URI====&lt;br /&gt;
&lt;br /&gt;
'''$ru''' - Referencia a request URI&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Username in SIP Request's URI====&lt;br /&gt;
&lt;br /&gt;
'''$rU''' - Referencia ao username da URI da requisição&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
====Q value of the SIP Request's URI====&lt;br /&gt;
&lt;br /&gt;
'''$ru_q''' - Referencia ao valor 'q' da R-URI&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
====Received IP address====&lt;br /&gt;
&lt;br /&gt;
'''$Ri''' - Referencia do IP da interface onde o pacote foi recebido&lt;br /&gt;
&lt;br /&gt;
====Received port====&lt;br /&gt;
&lt;br /&gt;
'''$Rp''' - Referencia da porta onde o pacote foi recebido&lt;br /&gt;
&lt;br /&gt;
====Script flags====&lt;br /&gt;
&lt;br /&gt;
'''$sf''' - Exibe uma lista com as flgs de script da requisição atual&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====IP source address====&lt;br /&gt;
&lt;br /&gt;
'''$si''' - IP de origem da mensagem recebida&lt;br /&gt;
&lt;br /&gt;
====Source port====&lt;br /&gt;
&lt;br /&gt;
'''$sp''' - Porta de origem da mensagme recebida&lt;br /&gt;
&lt;br /&gt;
====To URI Domain====&lt;br /&gt;
&lt;br /&gt;
'''$td''' - Referencia ao dominio da URI no cabeçalho 'To'&lt;br /&gt;
&lt;br /&gt;
====To display name====&lt;br /&gt;
&lt;br /&gt;
'''$tn''' - Referencia ao display name no cabeçalho 'To'&lt;br /&gt;
&lt;br /&gt;
====To tag====&lt;br /&gt;
&lt;br /&gt;
'''$tt''' - Referencia ao parametro tag do cabeçalho 'To'&lt;br /&gt;
&lt;br /&gt;
====To URI====&lt;br /&gt;
&lt;br /&gt;
'''$tu''' - Referencia a URI do cabeçalho 'To'&lt;br /&gt;
&lt;br /&gt;
====To URI Username====&lt;br /&gt;
&lt;br /&gt;
'''$tU''' - Referencia ao username da URI do cabeçalho 'To'&lt;br /&gt;
&lt;br /&gt;
====Formatted date and time====&lt;br /&gt;
&lt;br /&gt;
'''$time(format)''' - Retorna a string formatda de acordo com o comando date do UNIX (veja '''man date''')&lt;br /&gt;
&lt;br /&gt;
====Branch index====&lt;br /&gt;
&lt;br /&gt;
'''$T_branch_idx''' - O index (iniciando com 1 para a primeira branche) da branch para qual é executada uma branch_route[], se utilizado fora da branch_route[] o valor será 0, esta variável é exportado pelo módulo TM.&lt;br /&gt;
&lt;br /&gt;
=====String formatted time=====&lt;br /&gt;
&lt;br /&gt;
'''$Tf''' - Referencia a string formatda para hora (HH:MM:SS)&lt;br /&gt;
&lt;br /&gt;
=====Current unix time stamp in seconds=====&lt;br /&gt;
&lt;br /&gt;
'''$Ts''' - Referencia ao unix timestamp em segundos &lt;br /&gt;
&lt;br /&gt;
=====Current microseconds of the current second=====&lt;br /&gt;
&lt;br /&gt;
'''$Tsm''' - Referencia para os microsegundos do segundo atual&lt;br /&gt;
&lt;br /&gt;
=====Startup unix time stamp=====&lt;br /&gt;
&lt;br /&gt;
'''$TS''' - Referencia ao 'startup unix time stamp'&lt;br /&gt;
&lt;br /&gt;
====User agent header====&lt;br /&gt;
&lt;br /&gt;
'''$ua''' - Referencia ao campo user agent do cabeçalho&lt;br /&gt;
&lt;br /&gt;
===SIP Headers===&lt;br /&gt;
&lt;br /&gt;
'''$(hdr(name)[N])''' - represents the body of the N-th header identified by 'name'. If [N] is omitted then the body of the first header is printed. The first header is got when N=0, for the second N=1, a.s.o. To print the last header of that type, use -1, no other negative values are supported now. No white spaces are allowed inside the specifier (before }, before or after {, [, ] symbols). When N='*', all headers of that type are printed.&lt;br /&gt;
&lt;br /&gt;
The module should identify most of compact header names (the ones recognized by '''OpenSIPS''' which should be all at this moment), if not, the compact form has to be specified explicitly. It is recommended to use dedicated specifiers for headers (e.g., %ua for user agent header), if they are available -- they are faster.&lt;br /&gt;
&lt;br /&gt;
'''$(hdrcnt(name))''' -- returns number of headers of type given by 'name'. Uses same rules for specifying header names as '''$hdr(name)''' above. Many headers (e.g., Via, Path, Record-Route) may appear more than once in the message. This variable returns the number of headers of a given type. &lt;br /&gt;
&lt;br /&gt;
Note that some headers (e.g., Path) may be joined together with commas and appear as a single header line. This variable counts the number of header lines, not header values. &lt;br /&gt;
&lt;br /&gt;
For message fragment below, '''$hdrcnt(Path)''' will have value 2 and '''$(hdr(Path)[0])''' will have value '''&amp;lt;a.com&amp;gt;''':&lt;br /&gt;
[@&lt;br /&gt;
    Path: &amp;lt;a.com&amp;gt;&lt;br /&gt;
    Path: &amp;lt;b.com&amp;gt;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
For message fragment below, '''$hdrcnt(Path)''' will have value 1 and '''$(hdr(Path)[0])''' will have value '''&amp;lt;a.com&amp;gt;,&amp;lt;b.com&amp;gt;''':&lt;br /&gt;
[@&lt;br /&gt;
    Path: &amp;lt;a.com&amp;gt;,&amp;lt;b.com&amp;gt;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
Note that both examples above are semantically equivalent but the variables take on different values.&lt;br /&gt;
&lt;br /&gt;
[[#varavps]]&lt;br /&gt;
&lt;br /&gt;
!!!Escape Sequences&lt;br /&gt;
&lt;br /&gt;
These sequences are exported, and mainly used, by xlog module to print messages in many colors (foreground and background) using escape sequences. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Foreground and background colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$C(xy) - reference to an escape sequence. ¿x¿ represents the foreground color and ¿y¿ represents the background color.&lt;br /&gt;
&lt;br /&gt;
Colors could be:&lt;br /&gt;
&lt;br /&gt;
* x : default color of the terminal&lt;br /&gt;
* s : Black&lt;br /&gt;
* r : Red&lt;br /&gt;
* g : Green&lt;br /&gt;
* y : Yellow&lt;br /&gt;
* b : Blue&lt;br /&gt;
* p : Purple&lt;br /&gt;
* c : Cyan&lt;br /&gt;
* w : White &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Examples&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A few examples of usage.&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
...&lt;br /&gt;
route {&lt;br /&gt;
...&lt;br /&gt;
    $avp(uuid)=&amp;quot;caller_id&amp;quot;;&lt;br /&gt;
    $avp(tmp)= $avp(uuid) + &amp;quot;: &amp;quot; + $fu;&lt;br /&gt;
    xdbg(&amp;quot;$(C(bg))avp(tmp)$(C(xx)) [$avp(tmp)] $(C(br))cseq$(C(xx))=[$hdr(cseq)]\n&amp;quot;);&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
@]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core&amp;diff=1477</id>
		<title>Variáveis Core</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core&amp;diff=1477"/>
		<updated>2013-10-20T21:43:59Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
O '''OpenSIPS''' prove varios tipos de variaveis para serem usados no script de roteamento, as diferenças entre os tipos de variaveis são:&lt;br /&gt;
* 1. A visibilidade da variavel&lt;br /&gt;
* 2. Onde a variavel é relacionada (onde a mesma reside)&lt;br /&gt;
* 3. Status read-write da variavel ( algumas variaveis são apenas de leitura)&lt;br /&gt;
* 4. Como multiplos valores (da mesma variavel) são manipulados.&lt;br /&gt;
&lt;br /&gt;
As variáveis do '''OpenSIPS''' podem facilmente ser identificadas no script apartir de seus nomes (ou nota'ões) iniciando com o simbolo  '''$''' &lt;br /&gt;
&lt;br /&gt;
Sintaxe:&lt;br /&gt;
&lt;br /&gt;
A sintaxe completa de uma pseudo-variavel é:&lt;br /&gt;
 &lt;br /&gt;
 $(&amp;lt;context&amp;gt;'''name'''(subname)[index]{transformation})&lt;br /&gt;
&lt;br /&gt;
Os campos context, subname, index e transformation são opcionais&lt;br /&gt;
&lt;br /&gt;
Os campos significam:&lt;br /&gt;
* '''name''' - o nome(tipo) da pseudo variavel.&lt;br /&gt;
Ex: pvar, avp, ru, DLG_status etc...&lt;br /&gt;
&lt;br /&gt;
* '''subname''' - o identificador de um certo tipo de variável.&lt;br /&gt;
Ex: hdr(From), avp(nome)&lt;br /&gt;
&lt;br /&gt;
* '''index''' - uma pv pode armazenar mais de um valor, isso pode ser referenciado a uma lista de valores, você pode acessar um certo valor de uma lista se você especificar o index, você também pode especificar indexe's negativos , -1 significa o ultimo inserido e -2 significa o valor anterior ao ultimo (penultimo).&lt;br /&gt;
&lt;br /&gt;
* '''transformation''' - uma série de processos que podem ser aplicados em pseudo-variaveis, você pode encontrar a lista completa em [[Transformações]] , as transformações podem ser cascateadas usango a saída de uma tranformação como entrada de outra.&lt;br /&gt;
&lt;br /&gt;
* '''context''' - o contexto onde a pseudo-variavel será verificada, atualmente existem dois contextos, reply e request, o contexto de reply pode ser usado na rota de falha para verificar o valor da pseudovariavel neste contexto , o contexto de request (requisição) pode ser usado quando em um contexto de reply é desejado a verificação do valor no contexto correspondente ao request.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo de uso:&lt;br /&gt;
&lt;br /&gt;
* Apenas '''name''': $ru&lt;br /&gt;
* '''Name''' e '''subname''': $hdr(Contact)&lt;br /&gt;
* '''Name''' e '''index''': $(ct[0])&lt;br /&gt;
* '''Name''', '''subname''' e '''index''': $(avp(i:10)[2])&lt;br /&gt;
* '''Context'''&lt;br /&gt;
** $(&amp;lt;request&amp;gt;ru) de uma rota reply irá receber a Request-URI da requisição&lt;br /&gt;
** $(&amp;lt;reply&amp;gt;hdr(contact)) , contexto pode ser utilizado em uma rota de falha para acessar as informações do reply.&lt;br /&gt;
&lt;br /&gt;
==Tipos de variáveis==&lt;br /&gt;
&lt;br /&gt;
===script variables===&lt;br /&gt;
* Como o nome diz, estas variáveis são estritamente utilizadas em rotas de script, estas variáveis são visiveis apenas nos blocos de roteamento, não existem mensagem ou transações relacionas, mas são processos relacionados (variaveis de script são dependentes de rotas executadas pelo mesmo processo do '''OpenSIPS''').&lt;br /&gt;
&lt;br /&gt;
Variáveis de scripts são de leitura e escrita e podem ter valores inteiros ou strings, uma variável de script pode ter apenas um valor, uma nova atribuição (ou escrita) irá sobrescrever os valores existentes.&lt;br /&gt;
&lt;br /&gt;
===AVP - Atribute Value Pair===&lt;br /&gt;
* As avp's são variaveis dinamicas que podem ser criadas, as avp's são linkadas para uma mensagem singular ou uma transação ( se processamento stateful está em uso), uma mensagem ou transação irá inicialmente (quando recebida ou criada) ter uma lista vazia de avp's atreladas, durante o processo de roteamento o script diretamente ou via função poderá criar novos AVP's que automaticamente serão atrelados a mensagem/transação, as avp's serão visiveis em todas as rotas onde qualquer mensagem (reply ou request) da transação seja processada, branch_route, filure_route, onreply_route ( para onreply_route voce deve ter ativado o parametro ''onreply_avp_mode'').&lt;br /&gt;
&lt;br /&gt;
AVP's são variáveis de leitura e escrita e uma AVP existente pode ser deletada (removida), uma AVP pode conter multiplos valores, uma nova atribuição (operação de escrita) irá adicionar o novo valor para a AVP, os valores são mantidos no formado ''ultimo adicionado é o primeiro a ser utilizado'' .&lt;br /&gt;
&lt;br /&gt;
===pseudo variables===&lt;br /&gt;
* pseudo-variáveis (ou PV's) provem acesso a informação das mensagens SIP processadas (cabeçalhos, RURI, informações de trnasporte, etc..) ou de informações do '''OpenSIPS''' (valores de timers, números de processo (PID), códigos de retorno de função).&lt;br /&gt;
&lt;br /&gt;
Dependendo da informação provida a PV fica presa (relacionada) a um amensagem ou a nada (global), a maior parte das PV's são apenas de leitura, apenas algumas suportam operações de escrita, uma PV pode retornar varios ou apenas um valor dependendo da informação referenciadas (se pode ter valores multiplos ou nao)&lt;br /&gt;
&lt;br /&gt;
PV padrões são apenas de leitura e retornam apenas um valor (se não foi documentado de forma diferente)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[escape sequences]]&lt;br /&gt;
&lt;br /&gt;
* Sequencias de escape são utilizadas para formatar strings, estas não são variaveis mas podem ser formatadas.&lt;br /&gt;
&lt;br /&gt;
==Definições==&lt;br /&gt;
&lt;br /&gt;
===Script Variables===&lt;br /&gt;
&lt;br /&gt;
'''Nominação: **$var(name)**&lt;br /&gt;
&lt;br /&gt;
'''Dicas''':&lt;br /&gt;
&lt;br /&gt;
* Se você quer utilizar uma variavel em uma rota é melhor inicializar ou restar a mesma), de outra forma você poderá ter problemas com valores de rotas anteriores que forão executadas por um mesmo processo.&lt;br /&gt;
* Variáveis de script são mais rápidas que AVP's sendo processadas diretamente no endereço de memória.&lt;br /&gt;
* O valor de uma variável de script persiste para o processo do '''OpenSIPS'''&lt;br /&gt;
* Um variável pode ter apenas um valor&lt;br /&gt;
&lt;br /&gt;
# a script value can have only one value.&lt;br /&gt;
&lt;br /&gt;
Exemplos de uso&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(a) = 2;  # sets the value of variable 'a' to integer '2'&lt;br /&gt;
$var(a) = &amp;quot;2&amp;quot;;  # sets the value of variable 'a' to string '2'&lt;br /&gt;
$var(a) = 3 + (7&amp;amp;(~2)); # arithmetic and bitwise operation&lt;br /&gt;
$var(a) = &amp;quot;sip:&amp;quot; + $au + &amp;quot;@&amp;quot; + $fd; # compose a value from authentication username and From URI domain&lt;br /&gt;
&lt;br /&gt;
# using a script variable for tests&lt;br /&gt;
if( [ $var(a) &amp;amp; 4 ] ) {&lt;br /&gt;
  xlog(&amp;quot;var a has third bit set\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Definir uma variável para NULL corresponde a iniciar a a mesma com valor '0', variáveis de script não possuem valor NULL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===AVP variables===&lt;br /&gt;
&lt;br /&gt;
'''Nominação''': **$avp(name)** ou **$(avp(name)[N])**&lt;br /&gt;
&lt;br /&gt;
Quando utilizado o index 'N' você pode forçar a AVP para retornar um certo valor (valor na posição N), se nenhum index é informado o primeiro valor será o retornado.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Dicas''':&lt;br /&gt;
* Para ativar AVP's em onreply_route utilize '''modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)'''&lt;br /&gt;
* Se multiplos valores forem utilizados em uma mesma AVP os valores são indexados em ordem reversa (primeiro inserido é o ultimo da lista)&lt;br /&gt;
* AVP's são parte do contexto de transação, desta forma estarão visiveis em todo local que a transação esteja presente.&lt;br /&gt;
* O valor de uma AVP pode ser deletado&lt;br /&gt;
&lt;br /&gt;
Exemplo de uso:&lt;br /&gt;
&lt;br /&gt;
Exemplo persistente a transação:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# enable avps in onreply route&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&lt;br /&gt;
...&lt;br /&gt;
route{&lt;br /&gt;
...&lt;br /&gt;
$avp(tmp) = $Ts ; # store the current time (at request processing)&lt;br /&gt;
...&lt;br /&gt;
t_onreply(&amp;quot;1&amp;quot;);&lt;br /&gt;
t_relay();&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
onreply_route[1] {&lt;br /&gt;
	if (t_check_status(&amp;quot;200&amp;quot;)) {&lt;br /&gt;
		# calculate the setup time&lt;br /&gt;
		$var(setup_time) = $Ts - $avp(tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemplo com multiplos valores&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$avp(17) = &amp;quot;one&amp;quot;;&lt;br /&gt;
# we have a single value&lt;br /&gt;
$avp(17) = &amp;quot;two&amp;quot;;&lt;br /&gt;
# we have two values (&amp;quot;two&amp;quot;,&amp;quot;one&amp;quot;)&lt;br /&gt;
$avp(17) = &amp;quot;three&amp;quot;;&lt;br /&gt;
# we have three values (&amp;quot;three&amp;quot;,&amp;quot;two&amp;quot;,&amp;quot;one&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
xlog(&amp;quot;accessing values with no index: $avp(17)\n&amp;quot;);&lt;br /&gt;
# this will print the first value, which is the last added value -&amp;gt; &amp;quot;three&amp;quot;&lt;br /&gt;
&lt;br /&gt;
xlog(&amp;quot;accessing values with no index: $(avp(17)[2])\n&amp;quot;);&lt;br /&gt;
# this will print the index 2 value (third one), -&amp;gt; &amp;quot;one&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# remove the last value of the avp; if there is only one value, the AVP itself will be destroyed&lt;br /&gt;
$avp(17) = NULL;&lt;br /&gt;
&lt;br /&gt;
# delete all values and destroy the AVP&lt;br /&gt;
avp_delete(&amp;quot;$avp(17)/g&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# delete the value located at a certain index &lt;br /&gt;
$(avp(17)[1]) = NULL;&lt;br /&gt;
&lt;br /&gt;
#overwrite the value at a certain index&lt;br /&gt;
$(avp(17)[0]) = &amp;quot;zero&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O módulo '''AVPOPS''' prove uma série de funções para operar as AVP's (como checagem de valores, extração em diferentes locais, deleção etc..)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Pseudo Variables===&lt;br /&gt;
&lt;br /&gt;
'''Nominação''': $name&lt;br /&gt;
&lt;br /&gt;
'''Dicas''':&lt;br /&gt;
* as PV podem ser utilizadas como parametros para diferentes funções e serão substituidas com o valor antes da execução da função&lt;br /&gt;
* A maior part edas PV's são disponibilizadas pelo core do '''OpenSIPS''' porém existem vários módulos que exportas PV's (para tornar algumas informações especificas do módulo disponivel), verifique as documentações dos módulos para saber mais.&lt;br /&gt;
&lt;br /&gt;
Váriaveis pré-definidas pelo core listadas em ordem alfabética.&lt;br /&gt;
&lt;br /&gt;
====URI in SIP Request's P-Asserted-Identity header====&lt;br /&gt;
&lt;br /&gt;
'''$ai''' - referencia a URI no cabeçalho P-Asserted-Identity  (veja  RFC 3325 para mais detalhes)&lt;br /&gt;
&lt;br /&gt;
====Authentication Digest URI====&lt;br /&gt;
&lt;br /&gt;
'''$adu''' - URI do cabeçalho Authorization ou Proxy-Authorization, esta URI é utilizada quando calculando a resposta do resposta do HTTP Digest (autenticação).&lt;br /&gt;
&lt;br /&gt;
====Authentication realm====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''$ar''' - referencia (dominio ou ip) no cabeçalho de  Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
====Auth username user====&lt;br /&gt;
&lt;br /&gt;
'''$au''' - parte referente ao nome do usuário no cabeçalho de Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
====Auth username domain====&lt;br /&gt;
&lt;br /&gt;
'''$ad''' - parte referente ao dominio do usuário no cabeçalho de Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth nonce====&lt;br /&gt;
&lt;br /&gt;
'''$an''' - Hash  do cebçalho Authorization ou Proxy-Authorization &lt;br /&gt;
Nota: na documentação fala nounce, não achei tradução para isso (ex de valor: nonce: 526442e200000000b8d49749e4bdd108e58cd246de209a50)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth response====&lt;br /&gt;
&lt;br /&gt;
'''$auth.resp''' - A resposta da autenticação para um cabeçalho Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth nonce====&lt;br /&gt;
&lt;br /&gt;
'''$auth.nonce''' - the nonce string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth opaque====&lt;br /&gt;
&lt;br /&gt;
'''$auth.opaque''' - the opaque string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth algorithm====&lt;br /&gt;
&lt;br /&gt;
'''$auth.alg''' - A string referente ao algoritimos utilizado para Authorization ou Proxy-Authorization.&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
===Auth QOP===&lt;br /&gt;
&lt;br /&gt;
'''$auth.qop''' - O valor do parametro qop (quality of protection) do caebaçalho Authorization ou Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth nonce count (nc)====&lt;br /&gt;
&lt;br /&gt;
'''$auth.nc''' - the value of nonce count parameter from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Auth whole username====&lt;br /&gt;
&lt;br /&gt;
'''$aU''' - Nome do usuário no cabeçalho Authorization or Proxy-Authorization&lt;br /&gt;
&lt;br /&gt;
====Acc username====&lt;br /&gt;
&lt;br /&gt;
'''$Au''' - usuário para proposito de accounting , é uma pseudo variavel seletiva (dependente do modulo acc) , se existir ela retorna seu valor ou retorna o valor do campo From em todo caso&lt;br /&gt;
&lt;br /&gt;
====Argument options====&lt;br /&gt;
&lt;br /&gt;
'''$argv''' - Permite acesso a argumentos de linha de comando especificados com o parametro '''-o'''&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&lt;br /&gt;
   # for option '-o foo=0'&lt;br /&gt;
   xlog(&amp;quot;foo is $argv(foo) \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Branch flags====&lt;br /&gt;
&lt;br /&gt;
'''$bf''' - Exibe a lista de branch flags definidas para a requisição atual&lt;br /&gt;
&lt;br /&gt;
!!!!Branch flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Branch====&lt;br /&gt;
&lt;br /&gt;
'''$branch''' - Esta variavel é utilizada para criação de novas branches (pernas) escrevendo as mesmas no valor da SIP URI&lt;br /&gt;
Exemplos&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   # creates a new branch&lt;br /&gt;
   $branch = &amp;quot;sip:new@doamin.org&amp;quot;;&lt;br /&gt;
   # print its URI&lt;br /&gt;
   xlog(&amp;quot;last added branch has URI $(branch(uri)[-1]) \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Branch fields====&lt;br /&gt;
&lt;br /&gt;
'''$branch()''' - Esta variavel permite acesso de leitura e escrita para todos os campos/atributos de uma branch existente (previamente criada com append_branch()), os campos da branche são:&lt;br /&gt;
&lt;br /&gt;
* uri - a RURI da branch (string)&lt;br /&gt;
* duri - a URI e destino da branch (proxy the saida da branch) (sting)&lt;br /&gt;
* q - o valor '''q''' da branch (inteiro)&lt;br /&gt;
* path - a string PATH desta branch (string)&lt;br /&gt;
* flags - as flags para esta branch (inteiro)&lt;br /&gt;
* socket - o scoket local para ser utilizado para fazer o relay desta branch (string)&lt;br /&gt;
&lt;br /&gt;
A variavel aceita também index '''$(branch(uri)[1])''' para acessar uma branch especifica (multiplas branches podem ser especificadas autalmente), o index inicia em 0 (primeira branch), se o index for negativo ele é considerado o valor n do fim ( index -1 é ultima branch)&lt;br /&gt;
&lt;br /&gt;
Para todas as branches é utilizado o index '''*''' - $(branch(uri)[*]).&lt;br /&gt;
&lt;br /&gt;
Exemplo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   # creates the first branch&lt;br /&gt;
   append_branch();&lt;br /&gt;
   # creates the second branch&lt;br /&gt;
   force_send_socket(udp:192.168.1.10:5060);&lt;br /&gt;
   $du = &amp;quot;sip:192.168.2.10&amp;quot;;&lt;br /&gt;
   append_branch(&amp;quot;sip:foo@bar.com&amp;quot;,&amp;quot;0.5&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   # display branches&lt;br /&gt;
   xlog(&amp;quot;----- branch 0: $(branch(uri)[0]) , $(branch(q)[0]), $(branch(duri)[0]), $(branch(path)[0]), $(branch(flags)[0]), $(branch(socket)[0]) \n&amp;quot;);&lt;br /&gt;
   xlog(&amp;quot;----- branch 1: $(branch(uri)[1]) , $(branch(q)[1]), $(branch(duri)[1]), $(branch(path)[1]), $(branch(flags)[1]), $(branch(socket)[1]) \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   # do some changes over the branches&lt;br /&gt;
   $branch(uri) = &amp;quot;sip:user@domain.ro&amp;quot;;   # set URI for the first branch&lt;br /&gt;
   $(branch(q)[0]) = 1000;  # set to 1.00 for the first branch&lt;br /&gt;
   $(branch(socket)[1]) = NULL;  # reset the socket of the second branch&lt;br /&gt;
   $branch(duri) = NULL;  # reset the destination URI or the first branch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta é uma variavel de leitura e escrita (você pode definir valores apartir do script de roteamento)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Call-Id====&lt;br /&gt;
&lt;br /&gt;
'''$ci''' - Referencia para o valor do cabeçalho call-id&lt;br /&gt;
&lt;br /&gt;
====Content-Length====&lt;br /&gt;
&lt;br /&gt;
'''$cl''' - Referencia para o valor do cabeçalho content-length&lt;br /&gt;
&lt;br /&gt;
====CSeq number====&lt;br /&gt;
&lt;br /&gt;
'''$cs''' - Referencia ao valor do cabeçalho cseq &lt;br /&gt;
&lt;br /&gt;
====Contact instance====&lt;br /&gt;
&lt;br /&gt;
'''$ct''' - referencia a 'contact instance/body' do cabeçalho contact, uma contact instance é o display_name + URI + contact_params, como um cabeçalho de contato pode conter multiplos valores e uma mensagem pode conter vários cabeçalhos, um index é adicionado a $ct neste caso:&lt;br /&gt;
&lt;br /&gt;
* $ct -first  primeiro 'contact instance' da mensagem&lt;br /&gt;
* $(ct[n]) - 'contact instance' na posição n do inicio da mensagem, iniciando com index 0&lt;br /&gt;
* $(ct[-n]) - 'contact instance' na posição n apartir do fim da mensagem (iniciando em -1 (ultimo contato)&lt;br /&gt;
&lt;br /&gt;
=====Fields of a contact instance=====&lt;br /&gt;
&lt;br /&gt;
A contact instance possue também campos que podem ser acessados&lt;br /&gt;
&lt;br /&gt;
'''$ct.fields()''' - referencia os campos da 'contact instance' (veja abaixo)&lt;br /&gt;
&lt;br /&gt;
Campos suportados são:&lt;br /&gt;
&lt;br /&gt;
* name - display name&lt;br /&gt;
* uri - contact uri&lt;br /&gt;
* q  - parametro q (valor apenas)&lt;br /&gt;
* expires - parametro expires (valor apenas) &lt;br /&gt;
* methods - parametro metodo (valor apenas)&lt;br /&gt;
* received - parametro received (valor appenas)&lt;br /&gt;
* params - Todos os parametros (incluindo nomes)&lt;br /&gt;
&lt;br /&gt;
Exemplos:&lt;br /&gt;
* $ct.fields(uri) - URI da primeira 'contact instance'&lt;br /&gt;
* $(ct.fields(name)[1]) - O display nae da segunda 'contact instance'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Content-Type====&lt;br /&gt;
&lt;br /&gt;
'''$cT''' - Referencia ao cabeçalho content-type&lt;br /&gt;
&lt;br /&gt;
====Domain of destination URI====&lt;br /&gt;
&lt;br /&gt;
'''$dd''' - Referencia do dominio da destination uri&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
====Diversion header URI====&lt;br /&gt;
&lt;br /&gt;
'''$di''' - Referencia ao Diversion header URI&lt;br /&gt;
&lt;br /&gt;
====Diversion &amp;quot;privacy&amp;quot; parameter====&lt;br /&gt;
&lt;br /&gt;
'''$dip''' - Referencia ao parametro 'privacy' do  Diversion header&lt;br /&gt;
&lt;br /&gt;
====Diversion &amp;quot;reason&amp;quot; parameter====&lt;br /&gt;
&lt;br /&gt;
'''$dir''' - Referencia ao parametro 'reason' do  Diversion header &lt;br /&gt;
&lt;br /&gt;
====Port of destination URI====&lt;br /&gt;
&lt;br /&gt;
'''$dp''' - Referencia a porta da destination URI&lt;br /&gt;
&lt;br /&gt;
Váriavel de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Transport protocol of destination URI====&lt;br /&gt;
&lt;br /&gt;
'''$dP''' - referencia ao protocolo de transporte da destination uri&lt;br /&gt;
&lt;br /&gt;
====Destination set====&lt;br /&gt;
&lt;br /&gt;
'''$ds''' - referencia para a destination set&lt;br /&gt;
&lt;br /&gt;
====Destination URI====&lt;br /&gt;
&lt;br /&gt;
'''$du''' - referencia a destination uri (outbound proxy que deve ser utilizado para enviar a requisição), se a loose_route() retornar TRUE a destination uri é definida de acordo com o primeiro Route header&lt;br /&gt;
&lt;br /&gt;
Esta é uma variável de leitura e escrita&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Error class&lt;br /&gt;
&lt;br /&gt;
'''$err.class''' - the class of error (now is '1' for parsing errors)&lt;br /&gt;
&lt;br /&gt;
!!!!Error level&lt;br /&gt;
&lt;br /&gt;
'''$err.level''' - severity level for the error&lt;br /&gt;
&lt;br /&gt;
!!!!Error info&lt;br /&gt;
&lt;br /&gt;
'''$err.info''' - text describing the error&lt;br /&gt;
&lt;br /&gt;
!!!!Error reply code&lt;br /&gt;
&lt;br /&gt;
'''$err.rcode''' - recommended reply code&lt;br /&gt;
&lt;br /&gt;
!!!!Error reply reason&lt;br /&gt;
&lt;br /&gt;
'''$err.rreason''' - recommended reply reason phrase&lt;br /&gt;
&lt;br /&gt;
!!!!From URI domain&lt;br /&gt;
&lt;br /&gt;
'''$fd''' - reference to domain in URI of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!From display name&lt;br /&gt;
&lt;br /&gt;
'''$fn''' - reference to display name of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!Forced socket&lt;br /&gt;
&lt;br /&gt;
'''$fs''' - reference to the forced socket for message sending (if any) in the form proto:ip:port&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!From tag&lt;br /&gt;
&lt;br /&gt;
'''$ft''' - reference to tag parameter of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!From URI&lt;br /&gt;
&lt;br /&gt;
'''$fu''' - reference to URI of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!From URI username&lt;br /&gt;
&lt;br /&gt;
'''$fU''' - reference to username in URI of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!SIP message buffer&lt;br /&gt;
&lt;br /&gt;
'''$mb''' - reference to SIP message buffer&lt;br /&gt;
&lt;br /&gt;
!!!!Message Flags&lt;br /&gt;
&lt;br /&gt;
'''$mf''' - displays a list with the message/transaction flags set for the current SIP request&lt;br /&gt;
&lt;br /&gt;
!!!!Message Flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
'''$mF''' -reference to message/transaction flags set for current SIP request in hexa&lt;br /&gt;
&lt;br /&gt;
!!!!SIP message ID&lt;br /&gt;
&lt;br /&gt;
'''$mi''' - reference to SIP message id&lt;br /&gt;
&lt;br /&gt;
!!!!SIP message length&lt;br /&gt;
&lt;br /&gt;
'''$ml''' - reference to SIP message length&lt;br /&gt;
&lt;br /&gt;
!!!!Domain in SIP Request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$od''' - reference to domain in request's original R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!Port of SIP request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$op''' - reference to port of original R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!Transport protocol of SIP request original URI&lt;br /&gt;
&lt;br /&gt;
'''$oP''' - reference to transport protocol of original R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!SIP Request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$ou''' - reference to request's original URI&lt;br /&gt;
&lt;br /&gt;
!!!!Username in SIP Request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$oU''' - reference to username in request's original URI&lt;br /&gt;
&lt;br /&gt;
!!!!Route parameter&lt;br /&gt;
'''$param(idx)''' - retrieves the parameters of the route. The index can be an integer, or a pseudo-variable (index starts at 1).\\&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
   route {&lt;br /&gt;
      ...&lt;br /&gt;
      $var(debug) = &amp;quot;DBUG:&amp;quot;&lt;br /&gt;
      route(PRINT_VAR, $var(debug), &amp;quot;param value&amp;quot;);&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   route[PRINT_VAR] {&lt;br /&gt;
      $var(index) = 2;&lt;br /&gt;
      xlog(&amp;quot;$param(1): The parameter value is &amp;lt;$param($var(index))&amp;gt;\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!Domain in SIP Request's P-Preferred-Identity header URI&lt;br /&gt;
&lt;br /&gt;
'''$pd''' - reference to domain in request's P-Preferred-Identity header URI (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Display Name in SIP Request's P-Preferred-Identity header&lt;br /&gt;
&lt;br /&gt;
'''$pn''' - reference to Display Name in request's P-Preferred-Identity header (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Process id&lt;br /&gt;
&lt;br /&gt;
'''$pp''' - reference to process id (pid)&lt;br /&gt;
&lt;br /&gt;
!!!!Protocol of received message&lt;br /&gt;
'''$pr''' or '''$proto''' - protocol of received message (UDP, TCP, TLS, SCTP)&lt;br /&gt;
&lt;br /&gt;
!!!!User in SIP Request's P-Preferred-Identity header URI&lt;br /&gt;
&lt;br /&gt;
'''$pU''' - reference to user in request's P-Preferred-Identity header URI (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!URI in SIP Request's P-Preferred-Identity header&lt;br /&gt;
&lt;br /&gt;
'''$pu''' - reference to URI in request's P-Preferred-Identity header (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Domain in SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$rd''' - reference to domain in request's URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Body of request/reply&lt;br /&gt;
&lt;br /&gt;
'''$rb''' - reference to message body&lt;br /&gt;
&lt;br /&gt;
!!!!Returned code&lt;br /&gt;
&lt;br /&gt;
'''$rc''' - reference to returned code by last invoked function&lt;br /&gt;
&lt;br /&gt;
'''$retcode''' - same as **$rc**&lt;br /&gt;
&lt;br /&gt;
!!!!Remote-Party-ID header URI&lt;br /&gt;
&lt;br /&gt;
'''$re''' - reference to Remote-Party-ID header URI&lt;br /&gt;
&lt;br /&gt;
!!!!SIP request's method&lt;br /&gt;
&lt;br /&gt;
'''$rm''' - reference to request's method&lt;br /&gt;
&lt;br /&gt;
!!!!SIP request's port&lt;br /&gt;
&lt;br /&gt;
'''$rp''' - reference to port of R-URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Transport protocol of SIP request URI&lt;br /&gt;
&lt;br /&gt;
'''$rP''' - reference to transport protocol of R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!SIP reply's reason&lt;br /&gt;
&lt;br /&gt;
'''$rr''' - reference to reply's reason&lt;br /&gt;
&lt;br /&gt;
!!!!SIP reply's status&lt;br /&gt;
&lt;br /&gt;
'''$rs''' - reference to reply's status&lt;br /&gt;
&lt;br /&gt;
!!!!Refer-to URI&lt;br /&gt;
&lt;br /&gt;
'''$rt''' - reference to URI of refer-to header&lt;br /&gt;
&lt;br /&gt;
!!!!SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$ru''' - reference to request's URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Username in SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$rU''' - reference to username in request's URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Q value of the SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$ru_q''' - reference to q value of the R-URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Received IP address&lt;br /&gt;
&lt;br /&gt;
'''$Ri''' - reference to IP address of the interface where the request has been received&lt;br /&gt;
&lt;br /&gt;
!!!!Received port&lt;br /&gt;
&lt;br /&gt;
'''$Rp''' - reference to the port where the message was received&lt;br /&gt;
&lt;br /&gt;
!!!!Script flags&lt;br /&gt;
&lt;br /&gt;
'''$sf''' - displays a list with the script flags set for the current SIP request&lt;br /&gt;
&lt;br /&gt;
!!!!Script flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
'''$sF''' - reference to script flags - hexa output&lt;br /&gt;
&lt;br /&gt;
!!!!IP source address&lt;br /&gt;
&lt;br /&gt;
'''$si''' - reference to IP source address of the message&lt;br /&gt;
&lt;br /&gt;
!!!!Source port&lt;br /&gt;
&lt;br /&gt;
'''$sp''' - reference to the source port of the message&lt;br /&gt;
&lt;br /&gt;
!!!!To URI Domain&lt;br /&gt;
&lt;br /&gt;
'''$td''' - reference to domain in URI of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To display name&lt;br /&gt;
&lt;br /&gt;
'''$tn''' - reference to display name of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To tag&lt;br /&gt;
&lt;br /&gt;
'''$tt''' - reference to tag parameter of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To URI&lt;br /&gt;
&lt;br /&gt;
'''$tu''' - reference to URI of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To URI Username&lt;br /&gt;
&lt;br /&gt;
'''$tU''' - reference to username in URI of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!Formatted date and time&lt;br /&gt;
&lt;br /&gt;
'''$time(format)''' - returns the string formatted time according to UNIX date (see: '''man date''').&lt;br /&gt;
&lt;br /&gt;
!!!!Branch index&lt;br /&gt;
&lt;br /&gt;
'''$T_branch_idx''' - the index (starting with 1 for the first branch) of the branch for which is executed the branch_route[]. If used outside of branch_route[] block, the value is '0'. This is exported by TM module.&lt;br /&gt;
&lt;br /&gt;
!!!!String formatted time&lt;br /&gt;
&lt;br /&gt;
'''$Tf''' - reference string formatted time&lt;br /&gt;
&lt;br /&gt;
!!!!Current unix time stamp in seconds&lt;br /&gt;
&lt;br /&gt;
'''$Ts''' - reference to current unix time stamp in seconds&lt;br /&gt;
&lt;br /&gt;
!!!!Current microseconds of the current second&lt;br /&gt;
&lt;br /&gt;
'''$Tsm''' - reference to current microseconds of the current second&lt;br /&gt;
&lt;br /&gt;
!!!!Startup unix time stamp&lt;br /&gt;
&lt;br /&gt;
'''$TS''' - reference to startup unix time stamp&lt;br /&gt;
&lt;br /&gt;
!!!!User agent header&lt;br /&gt;
&lt;br /&gt;
'''$ua''' - reference to user agent header field&lt;br /&gt;
&lt;br /&gt;
!!!!SIP Headers&lt;br /&gt;
&lt;br /&gt;
'''$(hdr(name)[N])''' - represents the body of the N-th header identified by 'name'. If [N] is omitted then the body of the first header is printed. The first header is got when N=0, for the second N=1, a.s.o. To print the last header of that type, use -1, no other negative values are supported now. No white spaces are allowed inside the specifier (before }, before or after {, [, ] symbols). When N='*', all headers of that type are printed.&lt;br /&gt;
&lt;br /&gt;
The module should identify most of compact header names (the ones recognized by '''OpenSIPS''' which should be all at this moment), if not, the compact form has to be specified explicitly. It is recommended to use dedicated specifiers for headers (e.g., %ua for user agent header), if they are available -- they are faster.&lt;br /&gt;
&lt;br /&gt;
'''$(hdrcnt(name))''' -- returns number of headers of type given by 'name'. Uses same rules for specifying header names as '''$hdr(name)''' above. Many headers (e.g., Via, Path, Record-Route) may appear more than once in the message. This variable returns the number of headers of a given type. &lt;br /&gt;
&lt;br /&gt;
Note that some headers (e.g., Path) may be joined together with commas and appear as a single header line. This variable counts the number of header lines, not header values. &lt;br /&gt;
&lt;br /&gt;
For message fragment below, '''$hdrcnt(Path)''' will have value 2 and '''$(hdr(Path)[0])''' will have value '''&amp;lt;a.com&amp;gt;''':&lt;br /&gt;
[@&lt;br /&gt;
    Path: &amp;lt;a.com&amp;gt;&lt;br /&gt;
    Path: &amp;lt;b.com&amp;gt;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
For message fragment below, '''$hdrcnt(Path)''' will have value 1 and '''$(hdr(Path)[0])''' will have value '''&amp;lt;a.com&amp;gt;,&amp;lt;b.com&amp;gt;''':&lt;br /&gt;
[@&lt;br /&gt;
    Path: &amp;lt;a.com&amp;gt;,&amp;lt;b.com&amp;gt;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
Note that both examples above are semantically equivalent but the variables take on different values.&lt;br /&gt;
&lt;br /&gt;
[[#varavps]]&lt;br /&gt;
&lt;br /&gt;
!!!Escape Sequences&lt;br /&gt;
&lt;br /&gt;
These sequences are exported, and mainly used, by xlog module to print messages in many colors (foreground and background) using escape sequences. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Foreground and background colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$C(xy) - reference to an escape sequence. ¿x¿ represents the foreground color and ¿y¿ represents the background color.&lt;br /&gt;
&lt;br /&gt;
Colors could be:&lt;br /&gt;
&lt;br /&gt;
* x : default color of the terminal&lt;br /&gt;
* s : Black&lt;br /&gt;
* r : Red&lt;br /&gt;
* g : Green&lt;br /&gt;
* y : Yellow&lt;br /&gt;
* b : Blue&lt;br /&gt;
* p : Purple&lt;br /&gt;
* c : Cyan&lt;br /&gt;
* w : White &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Examples&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A few examples of usage.&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
...&lt;br /&gt;
route {&lt;br /&gt;
...&lt;br /&gt;
    $avp(uuid)=&amp;quot;caller_id&amp;quot;;&lt;br /&gt;
    $avp(tmp)= $avp(uuid) + &amp;quot;: &amp;quot; + $fu;&lt;br /&gt;
    xdbg(&amp;quot;$(C(bg))avp(tmp)$(C(xx)) [$avp(tmp)] $(C(br))cseq$(C(xx))=[$hdr(cseq)]\n&amp;quot;);&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
@]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core&amp;diff=1476</id>
		<title>Variáveis Core</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core&amp;diff=1476"/>
		<updated>2013-10-20T20:51:15Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
O '''OpenSIPS''' prove varios tipos de variaveis para serem usados no script de roteamento, as diferenças entre os tipos de variaveis são:&lt;br /&gt;
* 1. A visibilidade da variavel&lt;br /&gt;
* 2. Onde a variavel é relacionada (onde a mesma reside)&lt;br /&gt;
* 3. Status read-write da variavel ( algumas variaveis são apenas de leitura)&lt;br /&gt;
* 4. Como multiplos valores (da mesma variavel) são manipulados.&lt;br /&gt;
&lt;br /&gt;
As variáveis do '''OpenSIPS''' podem facilmente ser identificadas no script apartir de seus nomes (ou nota'ões) iniciando com o simbolo  '''$''' &lt;br /&gt;
&lt;br /&gt;
Sintaxe:&lt;br /&gt;
&lt;br /&gt;
A sintaxe completa de uma pseudo-variavel é:&lt;br /&gt;
 &lt;br /&gt;
 $(&amp;lt;context&amp;gt;'''name'''(subname)[index]{transformation})&lt;br /&gt;
&lt;br /&gt;
Os campos context, subname, index e transformation são opcionais&lt;br /&gt;
&lt;br /&gt;
Os campos significam:&lt;br /&gt;
* '''name''' - o nome(tipo) da pseudo variavel.&lt;br /&gt;
Ex: pvar, avp, ru, DLG_status etc...&lt;br /&gt;
&lt;br /&gt;
* '''subname''' - o identificador de um certo tipo de variável.&lt;br /&gt;
Ex: hdr(From), avp(nome)&lt;br /&gt;
&lt;br /&gt;
* '''index''' - uma pv pode armazenar mais de um valor, isso pode ser referenciado a uma lista de valores, você pode acessar um certo valor de uma lista se você especificar o index, você também pode especificar indexe's negativos , -1 significa o ultimo inserido e -2 significa o valor anterior ao ultimo (penultimo).&lt;br /&gt;
&lt;br /&gt;
* '''transformation''' - uma série de processos que podem ser aplicados em pseudo-variaveis, você pode encontrar a lista completa em [[Transformações]] , as transformações podem ser cascateadas usango a saída de uma tranformação como entrada de outra.&lt;br /&gt;
&lt;br /&gt;
* '''context''' - o contexto onde a pseudo-variavel será verificada, atualmente existem dois contextos, reply e request, o contexto de reply pode ser usado na rota de falha para verificar o valor da pseudovariavel neste contexto , o contexto de request (requisição) pode ser usado quando em um contexto de reply é desejado a verificação do valor no contexto correspondente ao request.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo de uso:&lt;br /&gt;
&lt;br /&gt;
* Apenas '''name''': $ru&lt;br /&gt;
* '''Name''' e '''subname''': $hdr(Contact)&lt;br /&gt;
* '''Name''' e '''index''': $(ct[0])&lt;br /&gt;
* '''Name''', '''subname''' e '''index''': $(avp(i:10)[2])&lt;br /&gt;
* '''Context'''&lt;br /&gt;
** $(&amp;lt;request&amp;gt;ru) de uma rota reply irá receber a Request-URI da requisição&lt;br /&gt;
** $(&amp;lt;reply&amp;gt;hdr(contact)) , contexto pode ser utilizado em uma rota de falha para acessar as informações do reply.&lt;br /&gt;
&lt;br /&gt;
==Tipos de variáveis==&lt;br /&gt;
&lt;br /&gt;
===script variables==&lt;br /&gt;
* Como o nome diz, estas variáveis são estritamente utilizadas em rotas de script, estas variáveis são visiveis apenas nos blocos de roteamento, não existem mensagem ou transações relacionas, mas são processos relacionados (variaveis de script são dependentes de rotas executadas pelo mesmo processo do '''OpenSIPS''').&lt;br /&gt;
&lt;br /&gt;
Variáveis de scripts são de leitura e escrita e podem ter valores inteiros ou strings, uma variável de script pode ter apenas um valor, uma nova atribuição (ou escrita) irá sobrescrever os valores existentes.&lt;br /&gt;
&lt;br /&gt;
===AVP - Atribute Value Pair===&lt;br /&gt;
* As avp's são variaveis dinamicas que podem ser criadas, as avp's são linkadas para uma mensagem singular ou uma transação ( se processamento stateful está em uso), uma mensagem ou transação irá inicialmente (quando recebida ou criada) ter uma lista vazia de avp's atreladas, durante o processo de roteamento o script diretamente ou via função poderá criar novos AVP's que automaticamente serão atrelados a mensagem/transação, as avp's serão visiveis em todas as rotas onde qualquer mensagem (reply ou request) da transação seja processada, branch_route, filure_route, onreply_route ( para onreply_route voce deve ter ativado o parametro ''onreply_avp_mode'').&lt;br /&gt;
&lt;br /&gt;
AVP's são variáveis de leitura e escrita e uma AVP existente pode ser deletada (removida), uma AVP pode conter multiplos valores, uma nova atribuição (operação de escrita) irá adicionar o novo valor para a AVP, os valores são mantidos no formado ''ultimo adicionado é o primeiro a ser utilizado'' .&lt;br /&gt;
&lt;br /&gt;
==pseudo variables==&lt;br /&gt;
* pseudo-variáveis (ou PV's) provem acesso a informação das mensagens SIP processadas (cabeçalhos, RURI, informações de trnasporte, etc..) ou de informações do '''OpenSIPS''' (valores de timers, números de processo (PID), códigos de retorno de função).&lt;br /&gt;
&lt;br /&gt;
Dependendo da informação provida a PV fica presa (relacionada) a um amensagem ou a nada (global), a maior parte das PV's são apenas de leitura, apenas algumas suportam operações de escrita, uma PV pode retornar varios ou apenas um valor dependendo da informação referenciadas (se pode ter valores multiplos ou nao)&lt;br /&gt;
&lt;br /&gt;
PV padrões são apenas de leitura e retornam apenas um valor (se não foi documentado de forma diferente)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[escape sequences]]&lt;br /&gt;
&lt;br /&gt;
* Sequencias de escape são utilizadas para formatar strings, estas não são variaveis mas podem ser formatadas.&lt;br /&gt;
&lt;br /&gt;
==Definições==&lt;br /&gt;
&lt;br /&gt;
===Script Variables===&lt;br /&gt;
&lt;br /&gt;
'''Nominação: **$var(name)**&lt;br /&gt;
&lt;br /&gt;
'''Dicas''':&lt;br /&gt;
&lt;br /&gt;
* Se você quer utilizar uma variavel em uma rota é melhor inicializar ou restar a mesma), de outra forma você poderá ter problemas com valores de rotas anteriores que forão executadas por um mesmo processo.&lt;br /&gt;
* Variáveis de script são mais rápidas que AVP's sendo processadas diretamente no endereço de memória.&lt;br /&gt;
* O valor de uma variável de script persiste para o processo do '''OpenSIPS'''&lt;br /&gt;
* Um variável pode ter apenas um valor&lt;br /&gt;
&lt;br /&gt;
# a script value can have only one value.&lt;br /&gt;
&lt;br /&gt;
Exemplos de uso&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var(a) = 2;  # sets the value of variable 'a' to integer '2'&lt;br /&gt;
$var(a) = &amp;quot;2&amp;quot;;  # sets the value of variable 'a' to string '2'&lt;br /&gt;
$var(a) = 3 + (7&amp;amp;(~2)); # arithmetic and bitwise operation&lt;br /&gt;
$var(a) = &amp;quot;sip:&amp;quot; + $au + &amp;quot;@&amp;quot; + $fd; # compose a value from authentication username and From URI domain&lt;br /&gt;
&lt;br /&gt;
# using a script variable for tests&lt;br /&gt;
if( [ $var(a) &amp;amp; 4 ] ) {&lt;br /&gt;
  xlog(&amp;quot;var a has third bit set\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Definir uma variável para NULL corresponde a iniciar a a mesma com valor '0', variáveis de script não possuem valor NULL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===AVP variables===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Naming''': **$avp(name)** or **$(avp(name)[N])**&lt;br /&gt;
&lt;br /&gt;
When using the index &amp;quot;N&amp;quot; you can force the AVP to return a certain value (the N-th value). If no index is given, the first value will be returned.&lt;br /&gt;
&lt;br /&gt;
'''Hints''':&lt;br /&gt;
# to enable AVPs in onreply_route, use &amp;quot;modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&amp;quot;&lt;br /&gt;
# if multiple values are used for a single AVP, the values are index in revert order than added&lt;br /&gt;
# AVPs are part of the transaction context, so they will be visible everywhere where the transaction is present.&lt;br /&gt;
# the value of an AVP can be deleted&lt;br /&gt;
&lt;br /&gt;
Example of usage:&lt;br /&gt;
# Transaction persistence example&lt;br /&gt;
[@&lt;br /&gt;
# enable avps in onreply route&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&lt;br /&gt;
...&lt;br /&gt;
route{&lt;br /&gt;
...&lt;br /&gt;
$avp(tmp) = $Ts ; # store the current time (at request processing)&lt;br /&gt;
...&lt;br /&gt;
t_onreply(&amp;quot;1&amp;quot;);&lt;br /&gt;
t_relay();&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
onreply_route[1] {&lt;br /&gt;
	if (t_check_status(&amp;quot;200&amp;quot;)) {&lt;br /&gt;
		# calculate the setup time&lt;br /&gt;
		$var(setup_time) = $Ts - $avp(tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
# Multilple values example&lt;br /&gt;
[@&lt;br /&gt;
$avp(17) = &amp;quot;one&amp;quot;;&lt;br /&gt;
# we have a single value&lt;br /&gt;
$avp(17) = &amp;quot;two&amp;quot;;&lt;br /&gt;
# we have two values (&amp;quot;two&amp;quot;,&amp;quot;one&amp;quot;)&lt;br /&gt;
$avp(17) = &amp;quot;three&amp;quot;;&lt;br /&gt;
# we have three values (&amp;quot;three&amp;quot;,&amp;quot;two&amp;quot;,&amp;quot;one&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
xlog(&amp;quot;accessing values with no index: $avp(17)\n&amp;quot;);&lt;br /&gt;
# this will print the first value, which is the last added value -&amp;gt; &amp;quot;three&amp;quot;&lt;br /&gt;
&lt;br /&gt;
xlog(&amp;quot;accessing values with no index: $(avp(17)[2])\n&amp;quot;);&lt;br /&gt;
# this will print the index 2 value (third one), -&amp;gt; &amp;quot;one&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# remove the last value of the avp; if there is only one value, the AVP itself will be destroyed&lt;br /&gt;
$avp(17) = NULL;&lt;br /&gt;
&lt;br /&gt;
# delete all values and destroy the AVP&lt;br /&gt;
avp_delete(&amp;quot;$avp(17)/g&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# delete the value located at a certain index &lt;br /&gt;
$(avp(17)[1]) = NULL;&lt;br /&gt;
&lt;br /&gt;
#overwrite the value at a certain index&lt;br /&gt;
$(avp(17)[0]) = &amp;quot;zero&amp;quot;;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
The '''AVPOPS''' module provides a lot of useful functions to operate AVPs (like checking values, pushing values into different other locations, deleting AVPs, etc).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#varpv]]&lt;br /&gt;
!!!Pseudo Variables&lt;br /&gt;
&lt;br /&gt;
'''Naming''': $name&lt;br /&gt;
&lt;br /&gt;
'''Hints''':&lt;br /&gt;
# the PV tokens can be given as parameters to different script functions and they will be replaced with a value before the execution of the function.&lt;br /&gt;
# most of PVs are made available by '''OpenSIPS''' core, but there are also module exporting PV (to make available info specific to that module) - check the modules documentation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Predefined (provided by core) PVs are listed in alphabetical order.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!URI in SIP Request's P-Asserted-Identity header&lt;br /&gt;
&lt;br /&gt;
'''$ai''' - reference to URI in request's P-Asserted-Identity header (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Authentication Digest URI&lt;br /&gt;
&lt;br /&gt;
'''$adu''' - URI from Authorization or Proxy-Authorization header. This URI is used when calculating the HTTP Digest Response.&lt;br /&gt;
&lt;br /&gt;
!!!!Authentication realm&lt;br /&gt;
&lt;br /&gt;
'''$ar''' - realm from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
!!!!Auth username user&lt;br /&gt;
&lt;br /&gt;
'''$au''' - user part of username from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth username domain&lt;br /&gt;
&lt;br /&gt;
'''$ad''' - domain part of username from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth nonce&lt;br /&gt;
&lt;br /&gt;
'''$an''' - the nonce from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth response &lt;br /&gt;
&lt;br /&gt;
'''$auth.resp''' - the authentication response from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth nonce &lt;br /&gt;
&lt;br /&gt;
'''$auth.nonce''' - the nonce string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth opaque&lt;br /&gt;
&lt;br /&gt;
'''$auth.opaque''' - the opaque string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth algorithm&lt;br /&gt;
&lt;br /&gt;
'''$auth.alg''' - the algorithm string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
!!!!Auth QOP&lt;br /&gt;
&lt;br /&gt;
'''$auth.qop''' - the value of qop parameter from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth nonce count (nc)&lt;br /&gt;
&lt;br /&gt;
'''$auth.nc''' - the value of nonce count parameter from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth whole username&lt;br /&gt;
&lt;br /&gt;
'''$aU''' - whole username from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
!!!!Acc username&lt;br /&gt;
&lt;br /&gt;
'''$Au''' - username for accounting purposes. It's a selective pseudo variable (inherited from acc module). It returns $au if exits or From username otherwise.&lt;br /&gt;
&lt;br /&gt;
!!!!Argument options&lt;br /&gt;
&lt;br /&gt;
'''$argv''' - provides access to command line arguments specified with '-o' option.&lt;br /&gt;
Examples:&lt;br /&gt;
[@&lt;br /&gt;
   # for option '-o foo=0'&lt;br /&gt;
   xlog(&amp;quot;foo is $argv(foo) \n&amp;quot;);&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!Branch flags&lt;br /&gt;
&lt;br /&gt;
'''$bf''' - displays a list with the branch flags set for the current SIP request&lt;br /&gt;
&lt;br /&gt;
!!!!Branch flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
'''$bF''' - reference to branch flags - hexa output&lt;br /&gt;
&lt;br /&gt;
!!!!Branch&lt;br /&gt;
&lt;br /&gt;
'''$branch''' - this variable is used for creating new branches by writing into it the value of a SIP URI.&lt;br /&gt;
Examples:&lt;br /&gt;
[@&lt;br /&gt;
   # creates a new branch&lt;br /&gt;
   $branch = &amp;quot;sip:new@doamin.org&amp;quot;;&lt;br /&gt;
   # print its URI&lt;br /&gt;
   xlog(&amp;quot;last added branch has URI $(branch(uri)[-1]) \n&amp;quot;);&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!Branch fields&lt;br /&gt;
&lt;br /&gt;
'''$branch()''' - this variable provides read/write access to all fields/attributes of an already existing branch (priorly created with append_branch() ). The fields of the branch are:&lt;br /&gt;
* uri - the RURI of the branch  (string value)&lt;br /&gt;
* duri - destination URI of the branch (outbound proxy of the branch)  (string value)&lt;br /&gt;
* q - q value of the branch (int value)&lt;br /&gt;
* path - the PATH string for this branch (string value)&lt;br /&gt;
* flags - the branch flags of this branch (int value)&lt;br /&gt;
* socket - the local socket to be used for relaying this branch (string value)&lt;br /&gt;
The variable accepts also index '''$(branch(uri)[1])''' for accessing a specific branch (multiple branches can be defined at a moment). The index starts from 0 (first branch). If the index is negative, it is considered the n-th branch from the end ( index -1 means the last branch).\\&lt;br /&gt;
To get all branches, use the * index - $(branch(uri)[*]).\\&lt;br /&gt;
Examples:&lt;br /&gt;
[@&lt;br /&gt;
   # creates the first branch&lt;br /&gt;
   append_branch();&lt;br /&gt;
   # creates the second branch&lt;br /&gt;
   force_send_socket(udp:192.168.1.10:5060);&lt;br /&gt;
   $du = &amp;quot;sip:192.168.2.10&amp;quot;;&lt;br /&gt;
   append_branch(&amp;quot;sip:foo@bar.com&amp;quot;,&amp;quot;0.5&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   # display branches&lt;br /&gt;
   xlog(&amp;quot;----- branch 0: $(branch(uri)[0]) , $(branch(q)[0]), $(branch(duri)[0]), $(branch(path)[0]), $(branch(flags)[0]), $(branch(socket)[0]) \n&amp;quot;);&lt;br /&gt;
   xlog(&amp;quot;----- branch 1: $(branch(uri)[1]) , $(branch(q)[1]), $(branch(duri)[1]), $(branch(path)[1]), $(branch(flags)[1]), $(branch(socket)[1]) \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   # do some changes over the branches&lt;br /&gt;
   $branch(uri) = &amp;quot;sip:user@domain.ro&amp;quot;;   # set URI for the first branch&lt;br /&gt;
   $(branch(q)[0]) = 1000;  # set to 1.00 for the first branch&lt;br /&gt;
   $(branch(socket)[1]) = NULL;  # reset the socket of the second branch&lt;br /&gt;
   $branch(duri) = NULL;  # reset the destination URI or the first branch&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it from routing logic)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Call-Id&lt;br /&gt;
&lt;br /&gt;
'''$ci''' - reference to body of call-id header&lt;br /&gt;
&lt;br /&gt;
!!!!Content-Length&lt;br /&gt;
&lt;br /&gt;
'''$cl''' - reference to body of content-length header&lt;br /&gt;
&lt;br /&gt;
!!!!CSeq number&lt;br /&gt;
&lt;br /&gt;
'''$cs''' - reference to cseq number from cseq header&lt;br /&gt;
&lt;br /&gt;
!!!!Contact instance&lt;br /&gt;
&lt;br /&gt;
'''$ct''' - reference to contact instance/body from the contact header. A contact instance is  display_name + URI + contact_params. As a Contact header may contain multiple Contact instances and a message may contain multiple Contact headers, an index was added to the $ct variable:&lt;br /&gt;
* $ct -first contact instance from message&lt;br /&gt;
* $(ct[n]) - the n-th contact instance form the beginning of message, starting with index 0&lt;br /&gt;
* $(ct[-n]) - the n-th contact instance form the end of the message, starting with index -1 (the last contact instance)&lt;br /&gt;
&lt;br /&gt;
!!!!Fields of a contact instance&lt;br /&gt;
&lt;br /&gt;
'''$ct.fields()''' - reference to the fields of a contact instance/body (see above). Supported fields are:&lt;br /&gt;
* name - display name&lt;br /&gt;
* uri - contact uri&lt;br /&gt;
* q  - q param (value only)&lt;br /&gt;
* expires - expires param (value only) &lt;br /&gt;
* methods - methods param (value only)&lt;br /&gt;
* received - received param (value only)&lt;br /&gt;
* params - all params (including names)&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
* $ct.fields(uri) - the URI of the first contact instance&lt;br /&gt;
* $(ct.fields(name)[1]) - the display name of the second contact instance&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Content-Type&lt;br /&gt;
&lt;br /&gt;
'''$cT''' - reference to body of content-type header&lt;br /&gt;
&lt;br /&gt;
!!!!Domain of destination URI&lt;br /&gt;
&lt;br /&gt;
'''$dd''' - reference to domain of destination uri&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it from routing logic)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Diversion header URI&lt;br /&gt;
&lt;br /&gt;
'''$di''' - reference to Diversion header URI&lt;br /&gt;
&lt;br /&gt;
!!!!Diversion &amp;quot;privacy&amp;quot; parameter&lt;br /&gt;
&lt;br /&gt;
'''$dip''' - reference to Diversion header &amp;quot;privacy&amp;quot; parameter value&lt;br /&gt;
&lt;br /&gt;
!!!!Diversion &amp;quot;reason&amp;quot; parameter&lt;br /&gt;
&lt;br /&gt;
'''$dir''' - reference to Diversion header &amp;quot;reason&amp;quot; parameter value&lt;br /&gt;
&lt;br /&gt;
!!!!Port of destination URI&lt;br /&gt;
&lt;br /&gt;
'''$dp''' - reference to port of destination uri&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it from routing logic)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Transport protocol of destination URI&lt;br /&gt;
&lt;br /&gt;
'''$dP''' - reference to transport protocol of destination uri&lt;br /&gt;
&lt;br /&gt;
!!!!Destination set&lt;br /&gt;
&lt;br /&gt;
'''$ds''' - reference to destination set&lt;br /&gt;
&lt;br /&gt;
!!!!Destination URI&lt;br /&gt;
&lt;br /&gt;
'''$du''' - reference to destination uri (outbound proxy to be used for sending the request)&lt;br /&gt;
If loose_route() returns TRUE a destination uri is set according to the first Route header.&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it from routing logic)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Error class&lt;br /&gt;
&lt;br /&gt;
'''$err.class''' - the class of error (now is '1' for parsing errors)&lt;br /&gt;
&lt;br /&gt;
!!!!Error level&lt;br /&gt;
&lt;br /&gt;
'''$err.level''' - severity level for the error&lt;br /&gt;
&lt;br /&gt;
!!!!Error info&lt;br /&gt;
&lt;br /&gt;
'''$err.info''' - text describing the error&lt;br /&gt;
&lt;br /&gt;
!!!!Error reply code&lt;br /&gt;
&lt;br /&gt;
'''$err.rcode''' - recommended reply code&lt;br /&gt;
&lt;br /&gt;
!!!!Error reply reason&lt;br /&gt;
&lt;br /&gt;
'''$err.rreason''' - recommended reply reason phrase&lt;br /&gt;
&lt;br /&gt;
!!!!From URI domain&lt;br /&gt;
&lt;br /&gt;
'''$fd''' - reference to domain in URI of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!From display name&lt;br /&gt;
&lt;br /&gt;
'''$fn''' - reference to display name of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!Forced socket&lt;br /&gt;
&lt;br /&gt;
'''$fs''' - reference to the forced socket for message sending (if any) in the form proto:ip:port&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!From tag&lt;br /&gt;
&lt;br /&gt;
'''$ft''' - reference to tag parameter of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!From URI&lt;br /&gt;
&lt;br /&gt;
'''$fu''' - reference to URI of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!From URI username&lt;br /&gt;
&lt;br /&gt;
'''$fU''' - reference to username in URI of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!SIP message buffer&lt;br /&gt;
&lt;br /&gt;
'''$mb''' - reference to SIP message buffer&lt;br /&gt;
&lt;br /&gt;
!!!!Message Flags&lt;br /&gt;
&lt;br /&gt;
'''$mf''' - displays a list with the message/transaction flags set for the current SIP request&lt;br /&gt;
&lt;br /&gt;
!!!!Message Flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
'''$mF''' -reference to message/transaction flags set for current SIP request in hexa&lt;br /&gt;
&lt;br /&gt;
!!!!SIP message ID&lt;br /&gt;
&lt;br /&gt;
'''$mi''' - reference to SIP message id&lt;br /&gt;
&lt;br /&gt;
!!!!SIP message length&lt;br /&gt;
&lt;br /&gt;
'''$ml''' - reference to SIP message length&lt;br /&gt;
&lt;br /&gt;
!!!!Domain in SIP Request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$od''' - reference to domain in request's original R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!Port of SIP request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$op''' - reference to port of original R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!Transport protocol of SIP request original URI&lt;br /&gt;
&lt;br /&gt;
'''$oP''' - reference to transport protocol of original R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!SIP Request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$ou''' - reference to request's original URI&lt;br /&gt;
&lt;br /&gt;
!!!!Username in SIP Request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$oU''' - reference to username in request's original URI&lt;br /&gt;
&lt;br /&gt;
!!!!Route parameter&lt;br /&gt;
'''$param(idx)''' - retrieves the parameters of the route. The index can be an integer, or a pseudo-variable (index starts at 1).\\&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
   route {&lt;br /&gt;
      ...&lt;br /&gt;
      $var(debug) = &amp;quot;DBUG:&amp;quot;&lt;br /&gt;
      route(PRINT_VAR, $var(debug), &amp;quot;param value&amp;quot;);&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   route[PRINT_VAR] {&lt;br /&gt;
      $var(index) = 2;&lt;br /&gt;
      xlog(&amp;quot;$param(1): The parameter value is &amp;lt;$param($var(index))&amp;gt;\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!Domain in SIP Request's P-Preferred-Identity header URI&lt;br /&gt;
&lt;br /&gt;
'''$pd''' - reference to domain in request's P-Preferred-Identity header URI (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Display Name in SIP Request's P-Preferred-Identity header&lt;br /&gt;
&lt;br /&gt;
'''$pn''' - reference to Display Name in request's P-Preferred-Identity header (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Process id&lt;br /&gt;
&lt;br /&gt;
'''$pp''' - reference to process id (pid)&lt;br /&gt;
&lt;br /&gt;
!!!!Protocol of received message&lt;br /&gt;
'''$pr''' or '''$proto''' - protocol of received message (UDP, TCP, TLS, SCTP)&lt;br /&gt;
&lt;br /&gt;
!!!!User in SIP Request's P-Preferred-Identity header URI&lt;br /&gt;
&lt;br /&gt;
'''$pU''' - reference to user in request's P-Preferred-Identity header URI (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!URI in SIP Request's P-Preferred-Identity header&lt;br /&gt;
&lt;br /&gt;
'''$pu''' - reference to URI in request's P-Preferred-Identity header (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Domain in SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$rd''' - reference to domain in request's URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Body of request/reply&lt;br /&gt;
&lt;br /&gt;
'''$rb''' - reference to message body&lt;br /&gt;
&lt;br /&gt;
!!!!Returned code&lt;br /&gt;
&lt;br /&gt;
'''$rc''' - reference to returned code by last invoked function&lt;br /&gt;
&lt;br /&gt;
'''$retcode''' - same as **$rc**&lt;br /&gt;
&lt;br /&gt;
!!!!Remote-Party-ID header URI&lt;br /&gt;
&lt;br /&gt;
'''$re''' - reference to Remote-Party-ID header URI&lt;br /&gt;
&lt;br /&gt;
!!!!SIP request's method&lt;br /&gt;
&lt;br /&gt;
'''$rm''' - reference to request's method&lt;br /&gt;
&lt;br /&gt;
!!!!SIP request's port&lt;br /&gt;
&lt;br /&gt;
'''$rp''' - reference to port of R-URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Transport protocol of SIP request URI&lt;br /&gt;
&lt;br /&gt;
'''$rP''' - reference to transport protocol of R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!SIP reply's reason&lt;br /&gt;
&lt;br /&gt;
'''$rr''' - reference to reply's reason&lt;br /&gt;
&lt;br /&gt;
!!!!SIP reply's status&lt;br /&gt;
&lt;br /&gt;
'''$rs''' - reference to reply's status&lt;br /&gt;
&lt;br /&gt;
!!!!Refer-to URI&lt;br /&gt;
&lt;br /&gt;
'''$rt''' - reference to URI of refer-to header&lt;br /&gt;
&lt;br /&gt;
!!!!SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$ru''' - reference to request's URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Username in SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$rU''' - reference to username in request's URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Q value of the SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$ru_q''' - reference to q value of the R-URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Received IP address&lt;br /&gt;
&lt;br /&gt;
'''$Ri''' - reference to IP address of the interface where the request has been received&lt;br /&gt;
&lt;br /&gt;
!!!!Received port&lt;br /&gt;
&lt;br /&gt;
'''$Rp''' - reference to the port where the message was received&lt;br /&gt;
&lt;br /&gt;
!!!!Script flags&lt;br /&gt;
&lt;br /&gt;
'''$sf''' - displays a list with the script flags set for the current SIP request&lt;br /&gt;
&lt;br /&gt;
!!!!Script flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
'''$sF''' - reference to script flags - hexa output&lt;br /&gt;
&lt;br /&gt;
!!!!IP source address&lt;br /&gt;
&lt;br /&gt;
'''$si''' - reference to IP source address of the message&lt;br /&gt;
&lt;br /&gt;
!!!!Source port&lt;br /&gt;
&lt;br /&gt;
'''$sp''' - reference to the source port of the message&lt;br /&gt;
&lt;br /&gt;
!!!!To URI Domain&lt;br /&gt;
&lt;br /&gt;
'''$td''' - reference to domain in URI of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To display name&lt;br /&gt;
&lt;br /&gt;
'''$tn''' - reference to display name of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To tag&lt;br /&gt;
&lt;br /&gt;
'''$tt''' - reference to tag parameter of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To URI&lt;br /&gt;
&lt;br /&gt;
'''$tu''' - reference to URI of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To URI Username&lt;br /&gt;
&lt;br /&gt;
'''$tU''' - reference to username in URI of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!Formatted date and time&lt;br /&gt;
&lt;br /&gt;
'''$time(format)''' - returns the string formatted time according to UNIX date (see: '''man date''').&lt;br /&gt;
&lt;br /&gt;
!!!!Branch index&lt;br /&gt;
&lt;br /&gt;
'''$T_branch_idx''' - the index (starting with 1 for the first branch) of the branch for which is executed the branch_route[]. If used outside of branch_route[] block, the value is '0'. This is exported by TM module.&lt;br /&gt;
&lt;br /&gt;
!!!!String formatted time&lt;br /&gt;
&lt;br /&gt;
'''$Tf''' - reference string formatted time&lt;br /&gt;
&lt;br /&gt;
!!!!Current unix time stamp in seconds&lt;br /&gt;
&lt;br /&gt;
'''$Ts''' - reference to current unix time stamp in seconds&lt;br /&gt;
&lt;br /&gt;
!!!!Current microseconds of the current second&lt;br /&gt;
&lt;br /&gt;
'''$Tsm''' - reference to current microseconds of the current second&lt;br /&gt;
&lt;br /&gt;
!!!!Startup unix time stamp&lt;br /&gt;
&lt;br /&gt;
'''$TS''' - reference to startup unix time stamp&lt;br /&gt;
&lt;br /&gt;
!!!!User agent header&lt;br /&gt;
&lt;br /&gt;
'''$ua''' - reference to user agent header field&lt;br /&gt;
&lt;br /&gt;
!!!!SIP Headers&lt;br /&gt;
&lt;br /&gt;
'''$(hdr(name)[N])''' - represents the body of the N-th header identified by 'name'. If [N] is omitted then the body of the first header is printed. The first header is got when N=0, for the second N=1, a.s.o. To print the last header of that type, use -1, no other negative values are supported now. No white spaces are allowed inside the specifier (before }, before or after {, [, ] symbols). When N='*', all headers of that type are printed.&lt;br /&gt;
&lt;br /&gt;
The module should identify most of compact header names (the ones recognized by '''OpenSIPS''' which should be all at this moment), if not, the compact form has to be specified explicitly. It is recommended to use dedicated specifiers for headers (e.g., %ua for user agent header), if they are available -- they are faster.&lt;br /&gt;
&lt;br /&gt;
'''$(hdrcnt(name))''' -- returns number of headers of type given by 'name'. Uses same rules for specifying header names as '''$hdr(name)''' above. Many headers (e.g., Via, Path, Record-Route) may appear more than once in the message. This variable returns the number of headers of a given type. &lt;br /&gt;
&lt;br /&gt;
Note that some headers (e.g., Path) may be joined together with commas and appear as a single header line. This variable counts the number of header lines, not header values. &lt;br /&gt;
&lt;br /&gt;
For message fragment below, '''$hdrcnt(Path)''' will have value 2 and '''$(hdr(Path)[0])''' will have value '''&amp;lt;a.com&amp;gt;''':&lt;br /&gt;
[@&lt;br /&gt;
    Path: &amp;lt;a.com&amp;gt;&lt;br /&gt;
    Path: &amp;lt;b.com&amp;gt;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
For message fragment below, '''$hdrcnt(Path)''' will have value 1 and '''$(hdr(Path)[0])''' will have value '''&amp;lt;a.com&amp;gt;,&amp;lt;b.com&amp;gt;''':&lt;br /&gt;
[@&lt;br /&gt;
    Path: &amp;lt;a.com&amp;gt;,&amp;lt;b.com&amp;gt;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
Note that both examples above are semantically equivalent but the variables take on different values.&lt;br /&gt;
&lt;br /&gt;
[[#varavps]]&lt;br /&gt;
&lt;br /&gt;
!!!Escape Sequences&lt;br /&gt;
&lt;br /&gt;
These sequences are exported, and mainly used, by xlog module to print messages in many colors (foreground and background) using escape sequences. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Foreground and background colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$C(xy) - reference to an escape sequence. ¿x¿ represents the foreground color and ¿y¿ represents the background color.&lt;br /&gt;
&lt;br /&gt;
Colors could be:&lt;br /&gt;
&lt;br /&gt;
* x : default color of the terminal&lt;br /&gt;
* s : Black&lt;br /&gt;
* r : Red&lt;br /&gt;
* g : Green&lt;br /&gt;
* y : Yellow&lt;br /&gt;
* b : Blue&lt;br /&gt;
* p : Purple&lt;br /&gt;
* c : Cyan&lt;br /&gt;
* w : White &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Examples&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A few examples of usage.&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
...&lt;br /&gt;
route {&lt;br /&gt;
...&lt;br /&gt;
    $avp(uuid)=&amp;quot;caller_id&amp;quot;;&lt;br /&gt;
    $avp(tmp)= $avp(uuid) + &amp;quot;: &amp;quot; + $fu;&lt;br /&gt;
    xdbg(&amp;quot;$(C(bg))avp(tmp)$(C(xx)) [$avp(tmp)] $(C(br))cseq$(C(xx))=[$hdr(cseq)]\n&amp;quot;);&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
@]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core&amp;diff=1475</id>
		<title>Variáveis Core</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core&amp;diff=1475"/>
		<updated>2013-10-20T20:26:51Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
O '''OpenSIPS''' prove varios tipos de variaveis para serem usados no script de roteamento, as diferenças entre os tipos de variaveis são:&lt;br /&gt;
* 1. A visibilidade da variavel&lt;br /&gt;
* 2. Onde a variavel é relacionada (onde a mesma reside)&lt;br /&gt;
* 3. Status read-write da variavel ( algumas variaveis são apenas de leitura)&lt;br /&gt;
* 4. Como multiplos valores (da mesma variavel) são manipulados.&lt;br /&gt;
&lt;br /&gt;
As variáveis do '''OpenSIPS''' podem facilmente ser identificadas no script apartir de seus nomes (ou nota'ões) iniciando com o simbolo  '''$''' &lt;br /&gt;
&lt;br /&gt;
Sintaxe:&lt;br /&gt;
&lt;br /&gt;
A sintaxe completa de uma pseudo-variavel é:&lt;br /&gt;
 &lt;br /&gt;
 $(&amp;lt;context&amp;gt;'''name'''(subname)[index]{transformation})&lt;br /&gt;
&lt;br /&gt;
Os campos context, subname, index e transformation são opcionais&lt;br /&gt;
&lt;br /&gt;
Os campos significam:&lt;br /&gt;
* '''name''' - o nome(tipo) da pseudo variavel.&lt;br /&gt;
Ex: pvar, avp, ru, DLG_status etc...&lt;br /&gt;
&lt;br /&gt;
* '''subname''' - o identificador de um certo tipo de variável.&lt;br /&gt;
Ex: hdr(From), avp(nome)&lt;br /&gt;
&lt;br /&gt;
* '''index''' - uma pv pode armazenar mais de um valor, isso pode ser referenciado a uma lista de valores, você pode acessar um certo valor de uma lista se você especificar o index, você também pode especificar indexe's negativos , -1 significa o ultimo inserido e -2 significa o valor anterior ao ultimo (penultimo).&lt;br /&gt;
&lt;br /&gt;
* '''transformation''' - uma série de processos que podem ser aplicados em pseudo-variaveis, você pode encontrar a lista completa em [[Transformações]] , as transformações podem ser cascateadas usango a saída de uma tranformação como entrada de outra.&lt;br /&gt;
&lt;br /&gt;
* '''context''' - o contexto onde a pseudo-variavel será verificada, atualmente existem dois contextos, reply e request, o contexto de reply pode ser usado na rota de falha para verificar o valor da pseudovariavel neste contexto , o contexto de request (requisição) pode ser usado quando em um contexto de reply é desejado a verificação do valor no contexto correspondente ao request.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Exemplo de uso:&lt;br /&gt;
* Only '''name''': %green%$ru &lt;br /&gt;
* '''Name''' and '''subname'': %green%$hdr(Contact)%%&lt;br /&gt;
* '''Name''' and '''index''': %green%$(ct[0])%%&lt;br /&gt;
* '''Name''', '''subname''' and '''index''': %green%$(avp(i:10)[2])&lt;br /&gt;
* '''Context''' &lt;br /&gt;
** %green%$(&amp;lt;request&amp;gt;ru)%% from a reply route will get the Request-URI from the request&lt;br /&gt;
** %green%$(&amp;lt;reply&amp;gt;hdr(Contact))%% context can be used from failure route to access information from the reply &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Types of variables:&lt;br /&gt;
&lt;br /&gt;
* [[#varscript | '''script variables''']] - as the name says, these variables are strictly bound to the script routes. The variables are visible only in the routing blocks - they are not message or transaction related, but they are process related (script variables will be inherited by script routes executed by the same '''OpenSIPS''' process).\\&lt;br /&gt;
Script variables are read write and they can have integer or string values. A script variable can have only a single value. A new assignment (or write operation) will overwrite the existing value.&lt;br /&gt;
&lt;br /&gt;
* [[#varavps | '''AVP - Attribute Value Pair''']] - the AVPs are dynamic variables (as name) that can be created - the AVPS are linked to a singular message or transaction (if stateful processing is used). A message or a transaction will initially (when received or created) have an empty list of AVPS attached to it. During the routing script, the script directly or functions called from script may create new AVPS that will automatically attached to the message/transaction. The AVPS will be visible in all routes where any message (reply or request) of the transaction will be processed - branch_route , failure_route, onreply_route (for this last route you need to enable the TM parameter ''onreply_avp_mode'').\\&lt;br /&gt;
AVPs are read write and an existing AVP can be even deleted (removed). An AVP may contain multiple values - a new assignment (or write operation) will add a new value to the AVP; the values are kept in &amp;quot;last added first to be used&amp;quot; order (stack).&lt;br /&gt;
&lt;br /&gt;
* [[#varpv | '''pseudo variables''']] - pseudo-variables (or PV) provide access to information from the processed SIP message (headers, RURI, transport level info, a.s.o) or from '''OpenSIPS''' inners (time values, process PID, return code of a function). Depending of what info they provide, the PVs are either bound to the message, either to nothing  (global). Most of the PVs are read-only and only several allow write operations. A PV may return several values or only one, depending of the referred info (if can have multiple values or not).\\&lt;br /&gt;
Standard PV is read-only and returns a single value (if not otherwise documented).&lt;br /&gt;
&lt;br /&gt;
* [[#varesc | '''escape sequences''']] - escape sequences used to format the strings; they are actually not variables, but rather formatters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#varscript]]&lt;br /&gt;
!!!Script variables&lt;br /&gt;
&lt;br /&gt;
'''Naming''': **$var(name)** &lt;br /&gt;
&lt;br /&gt;
'''Hints''':&lt;br /&gt;
# if you want to start using a script variable in a route, better initialize it with same value (or reset it), otherwise you may inherit a value from a previous route that was executed by the same process.&lt;br /&gt;
# script variables are faster the AVPs, being referenced directly to memory location.&lt;br /&gt;
# the value of script variables persists over a '''OpenSIPS''' process.&lt;br /&gt;
# a script value can have only one value.&lt;br /&gt;
&lt;br /&gt;
Example of usage:&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
$var(a) = 2;  # sets the value of variable 'a' to integer '2'&lt;br /&gt;
$var(a) = &amp;quot;2&amp;quot;;  # sets the value of variable 'a' to string '2'&lt;br /&gt;
$var(a) = 3 + (7&amp;amp;(~2)); # arithmetic and bitwise operation&lt;br /&gt;
$var(a) = &amp;quot;sip:&amp;quot; + $au + &amp;quot;@&amp;quot; + $fd; # compose a value from authentication username and From URI domain&lt;br /&gt;
&lt;br /&gt;
# using a script variable for tests&lt;br /&gt;
if( [ $var(a) &amp;amp; 4 ] ) {&lt;br /&gt;
  xlog(&amp;quot;var a has third bit set\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
Setting a variable to NULL is actually initializing the value to integer '0'. Script variables don't have NULL value.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#varavps]]&lt;br /&gt;
!!!AVP variables&lt;br /&gt;
&lt;br /&gt;
'''Naming''': **$avp(name)** or **$(avp(name)[N])**&lt;br /&gt;
&lt;br /&gt;
When using the index &amp;quot;N&amp;quot; you can force the AVP to return a certain value (the N-th value). If no index is given, the first value will be returned.&lt;br /&gt;
&lt;br /&gt;
'''Hints''':&lt;br /&gt;
# to enable AVPs in onreply_route, use &amp;quot;modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&amp;quot;&lt;br /&gt;
# if multiple values are used for a single AVP, the values are index in revert order than added&lt;br /&gt;
# AVPs are part of the transaction context, so they will be visible everywhere where the transaction is present.&lt;br /&gt;
# the value of an AVP can be deleted&lt;br /&gt;
&lt;br /&gt;
Example of usage:&lt;br /&gt;
# Transaction persistence example&lt;br /&gt;
[@&lt;br /&gt;
# enable avps in onreply route&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&lt;br /&gt;
...&lt;br /&gt;
route{&lt;br /&gt;
...&lt;br /&gt;
$avp(tmp) = $Ts ; # store the current time (at request processing)&lt;br /&gt;
...&lt;br /&gt;
t_onreply(&amp;quot;1&amp;quot;);&lt;br /&gt;
t_relay();&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
onreply_route[1] {&lt;br /&gt;
	if (t_check_status(&amp;quot;200&amp;quot;)) {&lt;br /&gt;
		# calculate the setup time&lt;br /&gt;
		$var(setup_time) = $Ts - $avp(tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
# Multilple values example&lt;br /&gt;
[@&lt;br /&gt;
$avp(17) = &amp;quot;one&amp;quot;;&lt;br /&gt;
# we have a single value&lt;br /&gt;
$avp(17) = &amp;quot;two&amp;quot;;&lt;br /&gt;
# we have two values (&amp;quot;two&amp;quot;,&amp;quot;one&amp;quot;)&lt;br /&gt;
$avp(17) = &amp;quot;three&amp;quot;;&lt;br /&gt;
# we have three values (&amp;quot;three&amp;quot;,&amp;quot;two&amp;quot;,&amp;quot;one&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
xlog(&amp;quot;accessing values with no index: $avp(17)\n&amp;quot;);&lt;br /&gt;
# this will print the first value, which is the last added value -&amp;gt; &amp;quot;three&amp;quot;&lt;br /&gt;
&lt;br /&gt;
xlog(&amp;quot;accessing values with no index: $(avp(17)[2])\n&amp;quot;);&lt;br /&gt;
# this will print the index 2 value (third one), -&amp;gt; &amp;quot;one&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# remove the last value of the avp; if there is only one value, the AVP itself will be destroyed&lt;br /&gt;
$avp(17) = NULL;&lt;br /&gt;
&lt;br /&gt;
# delete all values and destroy the AVP&lt;br /&gt;
avp_delete(&amp;quot;$avp(17)/g&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# delete the value located at a certain index &lt;br /&gt;
$(avp(17)[1]) = NULL;&lt;br /&gt;
&lt;br /&gt;
#overwrite the value at a certain index&lt;br /&gt;
$(avp(17)[0]) = &amp;quot;zero&amp;quot;;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
The '''AVPOPS''' module provides a lot of useful functions to operate AVPs (like checking values, pushing values into different other locations, deleting AVPs, etc).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#varpv]]&lt;br /&gt;
!!!Pseudo Variables&lt;br /&gt;
&lt;br /&gt;
'''Naming''': $name&lt;br /&gt;
&lt;br /&gt;
'''Hints''':&lt;br /&gt;
# the PV tokens can be given as parameters to different script functions and they will be replaced with a value before the execution of the function.&lt;br /&gt;
# most of PVs are made available by '''OpenSIPS''' core, but there are also module exporting PV (to make available info specific to that module) - check the modules documentation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Predefined (provided by core) PVs are listed in alphabetical order.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!URI in SIP Request's P-Asserted-Identity header&lt;br /&gt;
&lt;br /&gt;
'''$ai''' - reference to URI in request's P-Asserted-Identity header (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Authentication Digest URI&lt;br /&gt;
&lt;br /&gt;
'''$adu''' - URI from Authorization or Proxy-Authorization header. This URI is used when calculating the HTTP Digest Response.&lt;br /&gt;
&lt;br /&gt;
!!!!Authentication realm&lt;br /&gt;
&lt;br /&gt;
'''$ar''' - realm from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
!!!!Auth username user&lt;br /&gt;
&lt;br /&gt;
'''$au''' - user part of username from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth username domain&lt;br /&gt;
&lt;br /&gt;
'''$ad''' - domain part of username from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth nonce&lt;br /&gt;
&lt;br /&gt;
'''$an''' - the nonce from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth response &lt;br /&gt;
&lt;br /&gt;
'''$auth.resp''' - the authentication response from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth nonce &lt;br /&gt;
&lt;br /&gt;
'''$auth.nonce''' - the nonce string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth opaque&lt;br /&gt;
&lt;br /&gt;
'''$auth.opaque''' - the opaque string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth algorithm&lt;br /&gt;
&lt;br /&gt;
'''$auth.alg''' - the algorithm string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
!!!!Auth QOP&lt;br /&gt;
&lt;br /&gt;
'''$auth.qop''' - the value of qop parameter from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth nonce count (nc)&lt;br /&gt;
&lt;br /&gt;
'''$auth.nc''' - the value of nonce count parameter from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth whole username&lt;br /&gt;
&lt;br /&gt;
'''$aU''' - whole username from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
!!!!Acc username&lt;br /&gt;
&lt;br /&gt;
'''$Au''' - username for accounting purposes. It's a selective pseudo variable (inherited from acc module). It returns $au if exits or From username otherwise.&lt;br /&gt;
&lt;br /&gt;
!!!!Argument options&lt;br /&gt;
&lt;br /&gt;
'''$argv''' - provides access to command line arguments specified with '-o' option.&lt;br /&gt;
Examples:&lt;br /&gt;
[@&lt;br /&gt;
   # for option '-o foo=0'&lt;br /&gt;
   xlog(&amp;quot;foo is $argv(foo) \n&amp;quot;);&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!Branch flags&lt;br /&gt;
&lt;br /&gt;
'''$bf''' - displays a list with the branch flags set for the current SIP request&lt;br /&gt;
&lt;br /&gt;
!!!!Branch flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
'''$bF''' - reference to branch flags - hexa output&lt;br /&gt;
&lt;br /&gt;
!!!!Branch&lt;br /&gt;
&lt;br /&gt;
'''$branch''' - this variable is used for creating new branches by writing into it the value of a SIP URI.&lt;br /&gt;
Examples:&lt;br /&gt;
[@&lt;br /&gt;
   # creates a new branch&lt;br /&gt;
   $branch = &amp;quot;sip:new@doamin.org&amp;quot;;&lt;br /&gt;
   # print its URI&lt;br /&gt;
   xlog(&amp;quot;last added branch has URI $(branch(uri)[-1]) \n&amp;quot;);&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!Branch fields&lt;br /&gt;
&lt;br /&gt;
'''$branch()''' - this variable provides read/write access to all fields/attributes of an already existing branch (priorly created with append_branch() ). The fields of the branch are:&lt;br /&gt;
* uri - the RURI of the branch  (string value)&lt;br /&gt;
* duri - destination URI of the branch (outbound proxy of the branch)  (string value)&lt;br /&gt;
* q - q value of the branch (int value)&lt;br /&gt;
* path - the PATH string for this branch (string value)&lt;br /&gt;
* flags - the branch flags of this branch (int value)&lt;br /&gt;
* socket - the local socket to be used for relaying this branch (string value)&lt;br /&gt;
The variable accepts also index '''$(branch(uri)[1])''' for accessing a specific branch (multiple branches can be defined at a moment). The index starts from 0 (first branch). If the index is negative, it is considered the n-th branch from the end ( index -1 means the last branch).\\&lt;br /&gt;
To get all branches, use the * index - $(branch(uri)[*]).\\&lt;br /&gt;
Examples:&lt;br /&gt;
[@&lt;br /&gt;
   # creates the first branch&lt;br /&gt;
   append_branch();&lt;br /&gt;
   # creates the second branch&lt;br /&gt;
   force_send_socket(udp:192.168.1.10:5060);&lt;br /&gt;
   $du = &amp;quot;sip:192.168.2.10&amp;quot;;&lt;br /&gt;
   append_branch(&amp;quot;sip:foo@bar.com&amp;quot;,&amp;quot;0.5&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   # display branches&lt;br /&gt;
   xlog(&amp;quot;----- branch 0: $(branch(uri)[0]) , $(branch(q)[0]), $(branch(duri)[0]), $(branch(path)[0]), $(branch(flags)[0]), $(branch(socket)[0]) \n&amp;quot;);&lt;br /&gt;
   xlog(&amp;quot;----- branch 1: $(branch(uri)[1]) , $(branch(q)[1]), $(branch(duri)[1]), $(branch(path)[1]), $(branch(flags)[1]), $(branch(socket)[1]) \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   # do some changes over the branches&lt;br /&gt;
   $branch(uri) = &amp;quot;sip:user@domain.ro&amp;quot;;   # set URI for the first branch&lt;br /&gt;
   $(branch(q)[0]) = 1000;  # set to 1.00 for the first branch&lt;br /&gt;
   $(branch(socket)[1]) = NULL;  # reset the socket of the second branch&lt;br /&gt;
   $branch(duri) = NULL;  # reset the destination URI or the first branch&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it from routing logic)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Call-Id&lt;br /&gt;
&lt;br /&gt;
'''$ci''' - reference to body of call-id header&lt;br /&gt;
&lt;br /&gt;
!!!!Content-Length&lt;br /&gt;
&lt;br /&gt;
'''$cl''' - reference to body of content-length header&lt;br /&gt;
&lt;br /&gt;
!!!!CSeq number&lt;br /&gt;
&lt;br /&gt;
'''$cs''' - reference to cseq number from cseq header&lt;br /&gt;
&lt;br /&gt;
!!!!Contact instance&lt;br /&gt;
&lt;br /&gt;
'''$ct''' - reference to contact instance/body from the contact header. A contact instance is  display_name + URI + contact_params. As a Contact header may contain multiple Contact instances and a message may contain multiple Contact headers, an index was added to the $ct variable:&lt;br /&gt;
* $ct -first contact instance from message&lt;br /&gt;
* $(ct[n]) - the n-th contact instance form the beginning of message, starting with index 0&lt;br /&gt;
* $(ct[-n]) - the n-th contact instance form the end of the message, starting with index -1 (the last contact instance)&lt;br /&gt;
&lt;br /&gt;
!!!!Fields of a contact instance&lt;br /&gt;
&lt;br /&gt;
'''$ct.fields()''' - reference to the fields of a contact instance/body (see above). Supported fields are:&lt;br /&gt;
* name - display name&lt;br /&gt;
* uri - contact uri&lt;br /&gt;
* q  - q param (value only)&lt;br /&gt;
* expires - expires param (value only) &lt;br /&gt;
* methods - methods param (value only)&lt;br /&gt;
* received - received param (value only)&lt;br /&gt;
* params - all params (including names)&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
* $ct.fields(uri) - the URI of the first contact instance&lt;br /&gt;
* $(ct.fields(name)[1]) - the display name of the second contact instance&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Content-Type&lt;br /&gt;
&lt;br /&gt;
'''$cT''' - reference to body of content-type header&lt;br /&gt;
&lt;br /&gt;
!!!!Domain of destination URI&lt;br /&gt;
&lt;br /&gt;
'''$dd''' - reference to domain of destination uri&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it from routing logic)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Diversion header URI&lt;br /&gt;
&lt;br /&gt;
'''$di''' - reference to Diversion header URI&lt;br /&gt;
&lt;br /&gt;
!!!!Diversion &amp;quot;privacy&amp;quot; parameter&lt;br /&gt;
&lt;br /&gt;
'''$dip''' - reference to Diversion header &amp;quot;privacy&amp;quot; parameter value&lt;br /&gt;
&lt;br /&gt;
!!!!Diversion &amp;quot;reason&amp;quot; parameter&lt;br /&gt;
&lt;br /&gt;
'''$dir''' - reference to Diversion header &amp;quot;reason&amp;quot; parameter value&lt;br /&gt;
&lt;br /&gt;
!!!!Port of destination URI&lt;br /&gt;
&lt;br /&gt;
'''$dp''' - reference to port of destination uri&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it from routing logic)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Transport protocol of destination URI&lt;br /&gt;
&lt;br /&gt;
'''$dP''' - reference to transport protocol of destination uri&lt;br /&gt;
&lt;br /&gt;
!!!!Destination set&lt;br /&gt;
&lt;br /&gt;
'''$ds''' - reference to destination set&lt;br /&gt;
&lt;br /&gt;
!!!!Destination URI&lt;br /&gt;
&lt;br /&gt;
'''$du''' - reference to destination uri (outbound proxy to be used for sending the request)&lt;br /&gt;
If loose_route() returns TRUE a destination uri is set according to the first Route header.&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it from routing logic)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Error class&lt;br /&gt;
&lt;br /&gt;
'''$err.class''' - the class of error (now is '1' for parsing errors)&lt;br /&gt;
&lt;br /&gt;
!!!!Error level&lt;br /&gt;
&lt;br /&gt;
'''$err.level''' - severity level for the error&lt;br /&gt;
&lt;br /&gt;
!!!!Error info&lt;br /&gt;
&lt;br /&gt;
'''$err.info''' - text describing the error&lt;br /&gt;
&lt;br /&gt;
!!!!Error reply code&lt;br /&gt;
&lt;br /&gt;
'''$err.rcode''' - recommended reply code&lt;br /&gt;
&lt;br /&gt;
!!!!Error reply reason&lt;br /&gt;
&lt;br /&gt;
'''$err.rreason''' - recommended reply reason phrase&lt;br /&gt;
&lt;br /&gt;
!!!!From URI domain&lt;br /&gt;
&lt;br /&gt;
'''$fd''' - reference to domain in URI of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!From display name&lt;br /&gt;
&lt;br /&gt;
'''$fn''' - reference to display name of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!Forced socket&lt;br /&gt;
&lt;br /&gt;
'''$fs''' - reference to the forced socket for message sending (if any) in the form proto:ip:port&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!From tag&lt;br /&gt;
&lt;br /&gt;
'''$ft''' - reference to tag parameter of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!From URI&lt;br /&gt;
&lt;br /&gt;
'''$fu''' - reference to URI of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!From URI username&lt;br /&gt;
&lt;br /&gt;
'''$fU''' - reference to username in URI of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!SIP message buffer&lt;br /&gt;
&lt;br /&gt;
'''$mb''' - reference to SIP message buffer&lt;br /&gt;
&lt;br /&gt;
!!!!Message Flags&lt;br /&gt;
&lt;br /&gt;
'''$mf''' - displays a list with the message/transaction flags set for the current SIP request&lt;br /&gt;
&lt;br /&gt;
!!!!Message Flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
'''$mF''' -reference to message/transaction flags set for current SIP request in hexa&lt;br /&gt;
&lt;br /&gt;
!!!!SIP message ID&lt;br /&gt;
&lt;br /&gt;
'''$mi''' - reference to SIP message id&lt;br /&gt;
&lt;br /&gt;
!!!!SIP message length&lt;br /&gt;
&lt;br /&gt;
'''$ml''' - reference to SIP message length&lt;br /&gt;
&lt;br /&gt;
!!!!Domain in SIP Request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$od''' - reference to domain in request's original R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!Port of SIP request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$op''' - reference to port of original R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!Transport protocol of SIP request original URI&lt;br /&gt;
&lt;br /&gt;
'''$oP''' - reference to transport protocol of original R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!SIP Request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$ou''' - reference to request's original URI&lt;br /&gt;
&lt;br /&gt;
!!!!Username in SIP Request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$oU''' - reference to username in request's original URI&lt;br /&gt;
&lt;br /&gt;
!!!!Route parameter&lt;br /&gt;
'''$param(idx)''' - retrieves the parameters of the route. The index can be an integer, or a pseudo-variable (index starts at 1).\\&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
   route {&lt;br /&gt;
      ...&lt;br /&gt;
      $var(debug) = &amp;quot;DBUG:&amp;quot;&lt;br /&gt;
      route(PRINT_VAR, $var(debug), &amp;quot;param value&amp;quot;);&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   route[PRINT_VAR] {&lt;br /&gt;
      $var(index) = 2;&lt;br /&gt;
      xlog(&amp;quot;$param(1): The parameter value is &amp;lt;$param($var(index))&amp;gt;\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!Domain in SIP Request's P-Preferred-Identity header URI&lt;br /&gt;
&lt;br /&gt;
'''$pd''' - reference to domain in request's P-Preferred-Identity header URI (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Display Name in SIP Request's P-Preferred-Identity header&lt;br /&gt;
&lt;br /&gt;
'''$pn''' - reference to Display Name in request's P-Preferred-Identity header (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Process id&lt;br /&gt;
&lt;br /&gt;
'''$pp''' - reference to process id (pid)&lt;br /&gt;
&lt;br /&gt;
!!!!Protocol of received message&lt;br /&gt;
'''$pr''' or '''$proto''' - protocol of received message (UDP, TCP, TLS, SCTP)&lt;br /&gt;
&lt;br /&gt;
!!!!User in SIP Request's P-Preferred-Identity header URI&lt;br /&gt;
&lt;br /&gt;
'''$pU''' - reference to user in request's P-Preferred-Identity header URI (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!URI in SIP Request's P-Preferred-Identity header&lt;br /&gt;
&lt;br /&gt;
'''$pu''' - reference to URI in request's P-Preferred-Identity header (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Domain in SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$rd''' - reference to domain in request's URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Body of request/reply&lt;br /&gt;
&lt;br /&gt;
'''$rb''' - reference to message body&lt;br /&gt;
&lt;br /&gt;
!!!!Returned code&lt;br /&gt;
&lt;br /&gt;
'''$rc''' - reference to returned code by last invoked function&lt;br /&gt;
&lt;br /&gt;
'''$retcode''' - same as **$rc**&lt;br /&gt;
&lt;br /&gt;
!!!!Remote-Party-ID header URI&lt;br /&gt;
&lt;br /&gt;
'''$re''' - reference to Remote-Party-ID header URI&lt;br /&gt;
&lt;br /&gt;
!!!!SIP request's method&lt;br /&gt;
&lt;br /&gt;
'''$rm''' - reference to request's method&lt;br /&gt;
&lt;br /&gt;
!!!!SIP request's port&lt;br /&gt;
&lt;br /&gt;
'''$rp''' - reference to port of R-URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Transport protocol of SIP request URI&lt;br /&gt;
&lt;br /&gt;
'''$rP''' - reference to transport protocol of R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!SIP reply's reason&lt;br /&gt;
&lt;br /&gt;
'''$rr''' - reference to reply's reason&lt;br /&gt;
&lt;br /&gt;
!!!!SIP reply's status&lt;br /&gt;
&lt;br /&gt;
'''$rs''' - reference to reply's status&lt;br /&gt;
&lt;br /&gt;
!!!!Refer-to URI&lt;br /&gt;
&lt;br /&gt;
'''$rt''' - reference to URI of refer-to header&lt;br /&gt;
&lt;br /&gt;
!!!!SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$ru''' - reference to request's URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Username in SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$rU''' - reference to username in request's URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Q value of the SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$ru_q''' - reference to q value of the R-URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Received IP address&lt;br /&gt;
&lt;br /&gt;
'''$Ri''' - reference to IP address of the interface where the request has been received&lt;br /&gt;
&lt;br /&gt;
!!!!Received port&lt;br /&gt;
&lt;br /&gt;
'''$Rp''' - reference to the port where the message was received&lt;br /&gt;
&lt;br /&gt;
!!!!Script flags&lt;br /&gt;
&lt;br /&gt;
'''$sf''' - displays a list with the script flags set for the current SIP request&lt;br /&gt;
&lt;br /&gt;
!!!!Script flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
'''$sF''' - reference to script flags - hexa output&lt;br /&gt;
&lt;br /&gt;
!!!!IP source address&lt;br /&gt;
&lt;br /&gt;
'''$si''' - reference to IP source address of the message&lt;br /&gt;
&lt;br /&gt;
!!!!Source port&lt;br /&gt;
&lt;br /&gt;
'''$sp''' - reference to the source port of the message&lt;br /&gt;
&lt;br /&gt;
!!!!To URI Domain&lt;br /&gt;
&lt;br /&gt;
'''$td''' - reference to domain in URI of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To display name&lt;br /&gt;
&lt;br /&gt;
'''$tn''' - reference to display name of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To tag&lt;br /&gt;
&lt;br /&gt;
'''$tt''' - reference to tag parameter of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To URI&lt;br /&gt;
&lt;br /&gt;
'''$tu''' - reference to URI of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To URI Username&lt;br /&gt;
&lt;br /&gt;
'''$tU''' - reference to username in URI of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!Formatted date and time&lt;br /&gt;
&lt;br /&gt;
'''$time(format)''' - returns the string formatted time according to UNIX date (see: '''man date''').&lt;br /&gt;
&lt;br /&gt;
!!!!Branch index&lt;br /&gt;
&lt;br /&gt;
'''$T_branch_idx''' - the index (starting with 1 for the first branch) of the branch for which is executed the branch_route[]. If used outside of branch_route[] block, the value is '0'. This is exported by TM module.&lt;br /&gt;
&lt;br /&gt;
!!!!String formatted time&lt;br /&gt;
&lt;br /&gt;
'''$Tf''' - reference string formatted time&lt;br /&gt;
&lt;br /&gt;
!!!!Current unix time stamp in seconds&lt;br /&gt;
&lt;br /&gt;
'''$Ts''' - reference to current unix time stamp in seconds&lt;br /&gt;
&lt;br /&gt;
!!!!Current microseconds of the current second&lt;br /&gt;
&lt;br /&gt;
'''$Tsm''' - reference to current microseconds of the current second&lt;br /&gt;
&lt;br /&gt;
!!!!Startup unix time stamp&lt;br /&gt;
&lt;br /&gt;
'''$TS''' - reference to startup unix time stamp&lt;br /&gt;
&lt;br /&gt;
!!!!User agent header&lt;br /&gt;
&lt;br /&gt;
'''$ua''' - reference to user agent header field&lt;br /&gt;
&lt;br /&gt;
!!!!SIP Headers&lt;br /&gt;
&lt;br /&gt;
'''$(hdr(name)[N])''' - represents the body of the N-th header identified by 'name'. If [N] is omitted then the body of the first header is printed. The first header is got when N=0, for the second N=1, a.s.o. To print the last header of that type, use -1, no other negative values are supported now. No white spaces are allowed inside the specifier (before }, before or after {, [, ] symbols). When N='*', all headers of that type are printed.&lt;br /&gt;
&lt;br /&gt;
The module should identify most of compact header names (the ones recognized by '''OpenSIPS''' which should be all at this moment), if not, the compact form has to be specified explicitly. It is recommended to use dedicated specifiers for headers (e.g., %ua for user agent header), if they are available -- they are faster.&lt;br /&gt;
&lt;br /&gt;
'''$(hdrcnt(name))''' -- returns number of headers of type given by 'name'. Uses same rules for specifying header names as '''$hdr(name)''' above. Many headers (e.g., Via, Path, Record-Route) may appear more than once in the message. This variable returns the number of headers of a given type. &lt;br /&gt;
&lt;br /&gt;
Note that some headers (e.g., Path) may be joined together with commas and appear as a single header line. This variable counts the number of header lines, not header values. &lt;br /&gt;
&lt;br /&gt;
For message fragment below, '''$hdrcnt(Path)''' will have value 2 and '''$(hdr(Path)[0])''' will have value '''&amp;lt;a.com&amp;gt;''':&lt;br /&gt;
[@&lt;br /&gt;
    Path: &amp;lt;a.com&amp;gt;&lt;br /&gt;
    Path: &amp;lt;b.com&amp;gt;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
For message fragment below, '''$hdrcnt(Path)''' will have value 1 and '''$(hdr(Path)[0])''' will have value '''&amp;lt;a.com&amp;gt;,&amp;lt;b.com&amp;gt;''':&lt;br /&gt;
[@&lt;br /&gt;
    Path: &amp;lt;a.com&amp;gt;,&amp;lt;b.com&amp;gt;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
Note that both examples above are semantically equivalent but the variables take on different values.&lt;br /&gt;
&lt;br /&gt;
[[#varavps]]&lt;br /&gt;
&lt;br /&gt;
!!!Escape Sequences&lt;br /&gt;
&lt;br /&gt;
These sequences are exported, and mainly used, by xlog module to print messages in many colors (foreground and background) using escape sequences. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Foreground and background colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$C(xy) - reference to an escape sequence. ¿x¿ represents the foreground color and ¿y¿ represents the background color.&lt;br /&gt;
&lt;br /&gt;
Colors could be:&lt;br /&gt;
&lt;br /&gt;
* x : default color of the terminal&lt;br /&gt;
* s : Black&lt;br /&gt;
* r : Red&lt;br /&gt;
* g : Green&lt;br /&gt;
* y : Yellow&lt;br /&gt;
* b : Blue&lt;br /&gt;
* p : Purple&lt;br /&gt;
* c : Cyan&lt;br /&gt;
* w : White &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Examples&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A few examples of usage.&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
...&lt;br /&gt;
route {&lt;br /&gt;
...&lt;br /&gt;
    $avp(uuid)=&amp;quot;caller_id&amp;quot;;&lt;br /&gt;
    $avp(tmp)= $avp(uuid) + &amp;quot;: &amp;quot; + $fu;&lt;br /&gt;
    xdbg(&amp;quot;$(C(bg))avp(tmp)$(C(xx)) [$avp(tmp)] $(C(br))cseq$(C(xx))=[$hdr(cseq)]\n&amp;quot;);&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
@]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core&amp;diff=1474</id>
		<title>Variáveis Core</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core&amp;diff=1474"/>
		<updated>2013-10-20T20:17:13Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
O '''OpenSIPS''' prove varios tipos de variaveis para serem usados no script de roteamento, as diferenças entre os tipos de variaveis são:&lt;br /&gt;
* 1. A visibilidade da variavel&lt;br /&gt;
* 2. Onde a variavel é relacionada (onde a mesma reside)&lt;br /&gt;
* 3. Status read-write da variavel ( algumas variaveis são apenas de leitura)&lt;br /&gt;
* 4. Como multiplos valores (da mesma variavel) são manipulados.&lt;br /&gt;
&lt;br /&gt;
As variáveis do '''OpenSIPS''' podem facilmente ser identificadas no script apartir de seus nomes (ou nota'ões) iniciando com o simbolo  '''$''' &lt;br /&gt;
&lt;br /&gt;
Sintaxe:&lt;br /&gt;
&lt;br /&gt;
A sintaxe completa de uma pseudo-variavel é:&lt;br /&gt;
 &lt;br /&gt;
 $(&amp;lt;context&amp;gt;'''name'''(subname)[index]{transformation})&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
The fields written in green are optional.&lt;br /&gt;
The fields meaning is:&lt;br /&gt;
* '''name'''(compulsory) - the pseudo-variable name(type).\\&lt;br /&gt;
Ex: pvar, avp, ru, DLG_status, etc.&lt;br /&gt;
* '''subname''' - the identifier of a certain pv from the given type.\\&lt;br /&gt;
Ex: hdr(From), avp(name).&lt;br /&gt;
* '''index''' - a pv can store more than one value - it can refer to a list of values. You can access a certain value from the list if you specify its index. You can also specify indexes with negative values, -1 means the last inserted, -2 the value before the previous inserted one.&lt;br /&gt;
* '''transformation''' - a series of processing actions can be applied on pseudo-variable. You can find the whole list of possible transformations [[Documentation.Script-Tran-1-9| here]]. The transformations can be cascaded, using the output of one transformation as the input of another.     &lt;br /&gt;
* '''context''' - the context in which the pseudo0variable will be evaluated. Now there are 2 pv contexts: reply and request. The reply context can be used in the failure route to request for the pseudo-variable to be evaluated in the context of the reply message. The request context can be used if in a reply route is desired for the pv to be evaluated in the context of the corresponding request.&lt;br /&gt;
&lt;br /&gt;
Usage examples:&lt;br /&gt;
* Only '''name''': %green%$ru &lt;br /&gt;
* '''Name''' and '''subname'': %green%$hdr(Contact)%%&lt;br /&gt;
* '''Name''' and '''index''': %green%$(ct[0])%%&lt;br /&gt;
* '''Name''', '''subname''' and '''index''': %green%$(avp(i:10)[2])&lt;br /&gt;
* '''Context''' &lt;br /&gt;
** %green%$(&amp;lt;request&amp;gt;ru)%% from a reply route will get the Request-URI from the request&lt;br /&gt;
** %green%$(&amp;lt;reply&amp;gt;hdr(Contact))%% context can be used from failure route to access information from the reply &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Types of variables:&lt;br /&gt;
&lt;br /&gt;
* [[#varscript | '''script variables''']] - as the name says, these variables are strictly bound to the script routes. The variables are visible only in the routing blocks - they are not message or transaction related, but they are process related (script variables will be inherited by script routes executed by the same '''OpenSIPS''' process).\\&lt;br /&gt;
Script variables are read write and they can have integer or string values. A script variable can have only a single value. A new assignment (or write operation) will overwrite the existing value.&lt;br /&gt;
&lt;br /&gt;
* [[#varavps | '''AVP - Attribute Value Pair''']] - the AVPs are dynamic variables (as name) that can be created - the AVPS are linked to a singular message or transaction (if stateful processing is used). A message or a transaction will initially (when received or created) have an empty list of AVPS attached to it. During the routing script, the script directly or functions called from script may create new AVPS that will automatically attached to the message/transaction. The AVPS will be visible in all routes where any message (reply or request) of the transaction will be processed - branch_route , failure_route, onreply_route (for this last route you need to enable the TM parameter ''onreply_avp_mode'').\\&lt;br /&gt;
AVPs are read write and an existing AVP can be even deleted (removed). An AVP may contain multiple values - a new assignment (or write operation) will add a new value to the AVP; the values are kept in &amp;quot;last added first to be used&amp;quot; order (stack).&lt;br /&gt;
&lt;br /&gt;
* [[#varpv | '''pseudo variables''']] - pseudo-variables (or PV) provide access to information from the processed SIP message (headers, RURI, transport level info, a.s.o) or from '''OpenSIPS''' inners (time values, process PID, return code of a function). Depending of what info they provide, the PVs are either bound to the message, either to nothing  (global). Most of the PVs are read-only and only several allow write operations. A PV may return several values or only one, depending of the referred info (if can have multiple values or not).\\&lt;br /&gt;
Standard PV is read-only and returns a single value (if not otherwise documented).&lt;br /&gt;
&lt;br /&gt;
* [[#varesc | '''escape sequences''']] - escape sequences used to format the strings; they are actually not variables, but rather formatters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#varscript]]&lt;br /&gt;
!!!Script variables&lt;br /&gt;
&lt;br /&gt;
'''Naming''': **$var(name)** &lt;br /&gt;
&lt;br /&gt;
'''Hints''':&lt;br /&gt;
# if you want to start using a script variable in a route, better initialize it with same value (or reset it), otherwise you may inherit a value from a previous route that was executed by the same process.&lt;br /&gt;
# script variables are faster the AVPs, being referenced directly to memory location.&lt;br /&gt;
# the value of script variables persists over a '''OpenSIPS''' process.&lt;br /&gt;
# a script value can have only one value.&lt;br /&gt;
&lt;br /&gt;
Example of usage:&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
$var(a) = 2;  # sets the value of variable 'a' to integer '2'&lt;br /&gt;
$var(a) = &amp;quot;2&amp;quot;;  # sets the value of variable 'a' to string '2'&lt;br /&gt;
$var(a) = 3 + (7&amp;amp;(~2)); # arithmetic and bitwise operation&lt;br /&gt;
$var(a) = &amp;quot;sip:&amp;quot; + $au + &amp;quot;@&amp;quot; + $fd; # compose a value from authentication username and From URI domain&lt;br /&gt;
&lt;br /&gt;
# using a script variable for tests&lt;br /&gt;
if( [ $var(a) &amp;amp; 4 ] ) {&lt;br /&gt;
  xlog(&amp;quot;var a has third bit set\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
Setting a variable to NULL is actually initializing the value to integer '0'. Script variables don't have NULL value.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#varavps]]&lt;br /&gt;
!!!AVP variables&lt;br /&gt;
&lt;br /&gt;
'''Naming''': **$avp(name)** or **$(avp(name)[N])**&lt;br /&gt;
&lt;br /&gt;
When using the index &amp;quot;N&amp;quot; you can force the AVP to return a certain value (the N-th value). If no index is given, the first value will be returned.&lt;br /&gt;
&lt;br /&gt;
'''Hints''':&lt;br /&gt;
# to enable AVPs in onreply_route, use &amp;quot;modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&amp;quot;&lt;br /&gt;
# if multiple values are used for a single AVP, the values are index in revert order than added&lt;br /&gt;
# AVPs are part of the transaction context, so they will be visible everywhere where the transaction is present.&lt;br /&gt;
# the value of an AVP can be deleted&lt;br /&gt;
&lt;br /&gt;
Example of usage:&lt;br /&gt;
# Transaction persistence example&lt;br /&gt;
[@&lt;br /&gt;
# enable avps in onreply route&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&lt;br /&gt;
...&lt;br /&gt;
route{&lt;br /&gt;
...&lt;br /&gt;
$avp(tmp) = $Ts ; # store the current time (at request processing)&lt;br /&gt;
...&lt;br /&gt;
t_onreply(&amp;quot;1&amp;quot;);&lt;br /&gt;
t_relay();&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
onreply_route[1] {&lt;br /&gt;
	if (t_check_status(&amp;quot;200&amp;quot;)) {&lt;br /&gt;
		# calculate the setup time&lt;br /&gt;
		$var(setup_time) = $Ts - $avp(tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
# Multilple values example&lt;br /&gt;
[@&lt;br /&gt;
$avp(17) = &amp;quot;one&amp;quot;;&lt;br /&gt;
# we have a single value&lt;br /&gt;
$avp(17) = &amp;quot;two&amp;quot;;&lt;br /&gt;
# we have two values (&amp;quot;two&amp;quot;,&amp;quot;one&amp;quot;)&lt;br /&gt;
$avp(17) = &amp;quot;three&amp;quot;;&lt;br /&gt;
# we have three values (&amp;quot;three&amp;quot;,&amp;quot;two&amp;quot;,&amp;quot;one&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
xlog(&amp;quot;accessing values with no index: $avp(17)\n&amp;quot;);&lt;br /&gt;
# this will print the first value, which is the last added value -&amp;gt; &amp;quot;three&amp;quot;&lt;br /&gt;
&lt;br /&gt;
xlog(&amp;quot;accessing values with no index: $(avp(17)[2])\n&amp;quot;);&lt;br /&gt;
# this will print the index 2 value (third one), -&amp;gt; &amp;quot;one&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# remove the last value of the avp; if there is only one value, the AVP itself will be destroyed&lt;br /&gt;
$avp(17) = NULL;&lt;br /&gt;
&lt;br /&gt;
# delete all values and destroy the AVP&lt;br /&gt;
avp_delete(&amp;quot;$avp(17)/g&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# delete the value located at a certain index &lt;br /&gt;
$(avp(17)[1]) = NULL;&lt;br /&gt;
&lt;br /&gt;
#overwrite the value at a certain index&lt;br /&gt;
$(avp(17)[0]) = &amp;quot;zero&amp;quot;;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
The '''AVPOPS''' module provides a lot of useful functions to operate AVPs (like checking values, pushing values into different other locations, deleting AVPs, etc).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#varpv]]&lt;br /&gt;
!!!Pseudo Variables&lt;br /&gt;
&lt;br /&gt;
'''Naming''': $name&lt;br /&gt;
&lt;br /&gt;
'''Hints''':&lt;br /&gt;
# the PV tokens can be given as parameters to different script functions and they will be replaced with a value before the execution of the function.&lt;br /&gt;
# most of PVs are made available by '''OpenSIPS''' core, but there are also module exporting PV (to make available info specific to that module) - check the modules documentation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Predefined (provided by core) PVs are listed in alphabetical order.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!URI in SIP Request's P-Asserted-Identity header&lt;br /&gt;
&lt;br /&gt;
'''$ai''' - reference to URI in request's P-Asserted-Identity header (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Authentication Digest URI&lt;br /&gt;
&lt;br /&gt;
'''$adu''' - URI from Authorization or Proxy-Authorization header. This URI is used when calculating the HTTP Digest Response.&lt;br /&gt;
&lt;br /&gt;
!!!!Authentication realm&lt;br /&gt;
&lt;br /&gt;
'''$ar''' - realm from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
!!!!Auth username user&lt;br /&gt;
&lt;br /&gt;
'''$au''' - user part of username from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth username domain&lt;br /&gt;
&lt;br /&gt;
'''$ad''' - domain part of username from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth nonce&lt;br /&gt;
&lt;br /&gt;
'''$an''' - the nonce from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth response &lt;br /&gt;
&lt;br /&gt;
'''$auth.resp''' - the authentication response from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth nonce &lt;br /&gt;
&lt;br /&gt;
'''$auth.nonce''' - the nonce string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth opaque&lt;br /&gt;
&lt;br /&gt;
'''$auth.opaque''' - the opaque string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth algorithm&lt;br /&gt;
&lt;br /&gt;
'''$auth.alg''' - the algorithm string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
!!!!Auth QOP&lt;br /&gt;
&lt;br /&gt;
'''$auth.qop''' - the value of qop parameter from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth nonce count (nc)&lt;br /&gt;
&lt;br /&gt;
'''$auth.nc''' - the value of nonce count parameter from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth whole username&lt;br /&gt;
&lt;br /&gt;
'''$aU''' - whole username from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
!!!!Acc username&lt;br /&gt;
&lt;br /&gt;
'''$Au''' - username for accounting purposes. It's a selective pseudo variable (inherited from acc module). It returns $au if exits or From username otherwise.&lt;br /&gt;
&lt;br /&gt;
!!!!Argument options&lt;br /&gt;
&lt;br /&gt;
'''$argv''' - provides access to command line arguments specified with '-o' option.&lt;br /&gt;
Examples:&lt;br /&gt;
[@&lt;br /&gt;
   # for option '-o foo=0'&lt;br /&gt;
   xlog(&amp;quot;foo is $argv(foo) \n&amp;quot;);&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!Branch flags&lt;br /&gt;
&lt;br /&gt;
'''$bf''' - displays a list with the branch flags set for the current SIP request&lt;br /&gt;
&lt;br /&gt;
!!!!Branch flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
'''$bF''' - reference to branch flags - hexa output&lt;br /&gt;
&lt;br /&gt;
!!!!Branch&lt;br /&gt;
&lt;br /&gt;
'''$branch''' - this variable is used for creating new branches by writing into it the value of a SIP URI.&lt;br /&gt;
Examples:&lt;br /&gt;
[@&lt;br /&gt;
   # creates a new branch&lt;br /&gt;
   $branch = &amp;quot;sip:new@doamin.org&amp;quot;;&lt;br /&gt;
   # print its URI&lt;br /&gt;
   xlog(&amp;quot;last added branch has URI $(branch(uri)[-1]) \n&amp;quot;);&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!Branch fields&lt;br /&gt;
&lt;br /&gt;
'''$branch()''' - this variable provides read/write access to all fields/attributes of an already existing branch (priorly created with append_branch() ). The fields of the branch are:&lt;br /&gt;
* uri - the RURI of the branch  (string value)&lt;br /&gt;
* duri - destination URI of the branch (outbound proxy of the branch)  (string value)&lt;br /&gt;
* q - q value of the branch (int value)&lt;br /&gt;
* path - the PATH string for this branch (string value)&lt;br /&gt;
* flags - the branch flags of this branch (int value)&lt;br /&gt;
* socket - the local socket to be used for relaying this branch (string value)&lt;br /&gt;
The variable accepts also index '''$(branch(uri)[1])''' for accessing a specific branch (multiple branches can be defined at a moment). The index starts from 0 (first branch). If the index is negative, it is considered the n-th branch from the end ( index -1 means the last branch).\\&lt;br /&gt;
To get all branches, use the * index - $(branch(uri)[*]).\\&lt;br /&gt;
Examples:&lt;br /&gt;
[@&lt;br /&gt;
   # creates the first branch&lt;br /&gt;
   append_branch();&lt;br /&gt;
   # creates the second branch&lt;br /&gt;
   force_send_socket(udp:192.168.1.10:5060);&lt;br /&gt;
   $du = &amp;quot;sip:192.168.2.10&amp;quot;;&lt;br /&gt;
   append_branch(&amp;quot;sip:foo@bar.com&amp;quot;,&amp;quot;0.5&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   # display branches&lt;br /&gt;
   xlog(&amp;quot;----- branch 0: $(branch(uri)[0]) , $(branch(q)[0]), $(branch(duri)[0]), $(branch(path)[0]), $(branch(flags)[0]), $(branch(socket)[0]) \n&amp;quot;);&lt;br /&gt;
   xlog(&amp;quot;----- branch 1: $(branch(uri)[1]) , $(branch(q)[1]), $(branch(duri)[1]), $(branch(path)[1]), $(branch(flags)[1]), $(branch(socket)[1]) \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   # do some changes over the branches&lt;br /&gt;
   $branch(uri) = &amp;quot;sip:user@domain.ro&amp;quot;;   # set URI for the first branch&lt;br /&gt;
   $(branch(q)[0]) = 1000;  # set to 1.00 for the first branch&lt;br /&gt;
   $(branch(socket)[1]) = NULL;  # reset the socket of the second branch&lt;br /&gt;
   $branch(duri) = NULL;  # reset the destination URI or the first branch&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it from routing logic)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Call-Id&lt;br /&gt;
&lt;br /&gt;
'''$ci''' - reference to body of call-id header&lt;br /&gt;
&lt;br /&gt;
!!!!Content-Length&lt;br /&gt;
&lt;br /&gt;
'''$cl''' - reference to body of content-length header&lt;br /&gt;
&lt;br /&gt;
!!!!CSeq number&lt;br /&gt;
&lt;br /&gt;
'''$cs''' - reference to cseq number from cseq header&lt;br /&gt;
&lt;br /&gt;
!!!!Contact instance&lt;br /&gt;
&lt;br /&gt;
'''$ct''' - reference to contact instance/body from the contact header. A contact instance is  display_name + URI + contact_params. As a Contact header may contain multiple Contact instances and a message may contain multiple Contact headers, an index was added to the $ct variable:&lt;br /&gt;
* $ct -first contact instance from message&lt;br /&gt;
* $(ct[n]) - the n-th contact instance form the beginning of message, starting with index 0&lt;br /&gt;
* $(ct[-n]) - the n-th contact instance form the end of the message, starting with index -1 (the last contact instance)&lt;br /&gt;
&lt;br /&gt;
!!!!Fields of a contact instance&lt;br /&gt;
&lt;br /&gt;
'''$ct.fields()''' - reference to the fields of a contact instance/body (see above). Supported fields are:&lt;br /&gt;
* name - display name&lt;br /&gt;
* uri - contact uri&lt;br /&gt;
* q  - q param (value only)&lt;br /&gt;
* expires - expires param (value only) &lt;br /&gt;
* methods - methods param (value only)&lt;br /&gt;
* received - received param (value only)&lt;br /&gt;
* params - all params (including names)&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
* $ct.fields(uri) - the URI of the first contact instance&lt;br /&gt;
* $(ct.fields(name)[1]) - the display name of the second contact instance&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Content-Type&lt;br /&gt;
&lt;br /&gt;
'''$cT''' - reference to body of content-type header&lt;br /&gt;
&lt;br /&gt;
!!!!Domain of destination URI&lt;br /&gt;
&lt;br /&gt;
'''$dd''' - reference to domain of destination uri&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it from routing logic)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Diversion header URI&lt;br /&gt;
&lt;br /&gt;
'''$di''' - reference to Diversion header URI&lt;br /&gt;
&lt;br /&gt;
!!!!Diversion &amp;quot;privacy&amp;quot; parameter&lt;br /&gt;
&lt;br /&gt;
'''$dip''' - reference to Diversion header &amp;quot;privacy&amp;quot; parameter value&lt;br /&gt;
&lt;br /&gt;
!!!!Diversion &amp;quot;reason&amp;quot; parameter&lt;br /&gt;
&lt;br /&gt;
'''$dir''' - reference to Diversion header &amp;quot;reason&amp;quot; parameter value&lt;br /&gt;
&lt;br /&gt;
!!!!Port of destination URI&lt;br /&gt;
&lt;br /&gt;
'''$dp''' - reference to port of destination uri&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it from routing logic)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Transport protocol of destination URI&lt;br /&gt;
&lt;br /&gt;
'''$dP''' - reference to transport protocol of destination uri&lt;br /&gt;
&lt;br /&gt;
!!!!Destination set&lt;br /&gt;
&lt;br /&gt;
'''$ds''' - reference to destination set&lt;br /&gt;
&lt;br /&gt;
!!!!Destination URI&lt;br /&gt;
&lt;br /&gt;
'''$du''' - reference to destination uri (outbound proxy to be used for sending the request)&lt;br /&gt;
If loose_route() returns TRUE a destination uri is set according to the first Route header.&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it from routing logic)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Error class&lt;br /&gt;
&lt;br /&gt;
'''$err.class''' - the class of error (now is '1' for parsing errors)&lt;br /&gt;
&lt;br /&gt;
!!!!Error level&lt;br /&gt;
&lt;br /&gt;
'''$err.level''' - severity level for the error&lt;br /&gt;
&lt;br /&gt;
!!!!Error info&lt;br /&gt;
&lt;br /&gt;
'''$err.info''' - text describing the error&lt;br /&gt;
&lt;br /&gt;
!!!!Error reply code&lt;br /&gt;
&lt;br /&gt;
'''$err.rcode''' - recommended reply code&lt;br /&gt;
&lt;br /&gt;
!!!!Error reply reason&lt;br /&gt;
&lt;br /&gt;
'''$err.rreason''' - recommended reply reason phrase&lt;br /&gt;
&lt;br /&gt;
!!!!From URI domain&lt;br /&gt;
&lt;br /&gt;
'''$fd''' - reference to domain in URI of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!From display name&lt;br /&gt;
&lt;br /&gt;
'''$fn''' - reference to display name of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!Forced socket&lt;br /&gt;
&lt;br /&gt;
'''$fs''' - reference to the forced socket for message sending (if any) in the form proto:ip:port&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!From tag&lt;br /&gt;
&lt;br /&gt;
'''$ft''' - reference to tag parameter of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!From URI&lt;br /&gt;
&lt;br /&gt;
'''$fu''' - reference to URI of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!From URI username&lt;br /&gt;
&lt;br /&gt;
'''$fU''' - reference to username in URI of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!SIP message buffer&lt;br /&gt;
&lt;br /&gt;
'''$mb''' - reference to SIP message buffer&lt;br /&gt;
&lt;br /&gt;
!!!!Message Flags&lt;br /&gt;
&lt;br /&gt;
'''$mf''' - displays a list with the message/transaction flags set for the current SIP request&lt;br /&gt;
&lt;br /&gt;
!!!!Message Flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
'''$mF''' -reference to message/transaction flags set for current SIP request in hexa&lt;br /&gt;
&lt;br /&gt;
!!!!SIP message ID&lt;br /&gt;
&lt;br /&gt;
'''$mi''' - reference to SIP message id&lt;br /&gt;
&lt;br /&gt;
!!!!SIP message length&lt;br /&gt;
&lt;br /&gt;
'''$ml''' - reference to SIP message length&lt;br /&gt;
&lt;br /&gt;
!!!!Domain in SIP Request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$od''' - reference to domain in request's original R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!Port of SIP request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$op''' - reference to port of original R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!Transport protocol of SIP request original URI&lt;br /&gt;
&lt;br /&gt;
'''$oP''' - reference to transport protocol of original R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!SIP Request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$ou''' - reference to request's original URI&lt;br /&gt;
&lt;br /&gt;
!!!!Username in SIP Request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$oU''' - reference to username in request's original URI&lt;br /&gt;
&lt;br /&gt;
!!!!Route parameter&lt;br /&gt;
'''$param(idx)''' - retrieves the parameters of the route. The index can be an integer, or a pseudo-variable (index starts at 1).\\&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
   route {&lt;br /&gt;
      ...&lt;br /&gt;
      $var(debug) = &amp;quot;DBUG:&amp;quot;&lt;br /&gt;
      route(PRINT_VAR, $var(debug), &amp;quot;param value&amp;quot;);&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   route[PRINT_VAR] {&lt;br /&gt;
      $var(index) = 2;&lt;br /&gt;
      xlog(&amp;quot;$param(1): The parameter value is &amp;lt;$param($var(index))&amp;gt;\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!Domain in SIP Request's P-Preferred-Identity header URI&lt;br /&gt;
&lt;br /&gt;
'''$pd''' - reference to domain in request's P-Preferred-Identity header URI (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Display Name in SIP Request's P-Preferred-Identity header&lt;br /&gt;
&lt;br /&gt;
'''$pn''' - reference to Display Name in request's P-Preferred-Identity header (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Process id&lt;br /&gt;
&lt;br /&gt;
'''$pp''' - reference to process id (pid)&lt;br /&gt;
&lt;br /&gt;
!!!!Protocol of received message&lt;br /&gt;
'''$pr''' or '''$proto''' - protocol of received message (UDP, TCP, TLS, SCTP)&lt;br /&gt;
&lt;br /&gt;
!!!!User in SIP Request's P-Preferred-Identity header URI&lt;br /&gt;
&lt;br /&gt;
'''$pU''' - reference to user in request's P-Preferred-Identity header URI (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!URI in SIP Request's P-Preferred-Identity header&lt;br /&gt;
&lt;br /&gt;
'''$pu''' - reference to URI in request's P-Preferred-Identity header (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Domain in SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$rd''' - reference to domain in request's URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Body of request/reply&lt;br /&gt;
&lt;br /&gt;
'''$rb''' - reference to message body&lt;br /&gt;
&lt;br /&gt;
!!!!Returned code&lt;br /&gt;
&lt;br /&gt;
'''$rc''' - reference to returned code by last invoked function&lt;br /&gt;
&lt;br /&gt;
'''$retcode''' - same as **$rc**&lt;br /&gt;
&lt;br /&gt;
!!!!Remote-Party-ID header URI&lt;br /&gt;
&lt;br /&gt;
'''$re''' - reference to Remote-Party-ID header URI&lt;br /&gt;
&lt;br /&gt;
!!!!SIP request's method&lt;br /&gt;
&lt;br /&gt;
'''$rm''' - reference to request's method&lt;br /&gt;
&lt;br /&gt;
!!!!SIP request's port&lt;br /&gt;
&lt;br /&gt;
'''$rp''' - reference to port of R-URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Transport protocol of SIP request URI&lt;br /&gt;
&lt;br /&gt;
'''$rP''' - reference to transport protocol of R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!SIP reply's reason&lt;br /&gt;
&lt;br /&gt;
'''$rr''' - reference to reply's reason&lt;br /&gt;
&lt;br /&gt;
!!!!SIP reply's status&lt;br /&gt;
&lt;br /&gt;
'''$rs''' - reference to reply's status&lt;br /&gt;
&lt;br /&gt;
!!!!Refer-to URI&lt;br /&gt;
&lt;br /&gt;
'''$rt''' - reference to URI of refer-to header&lt;br /&gt;
&lt;br /&gt;
!!!!SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$ru''' - reference to request's URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Username in SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$rU''' - reference to username in request's URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Q value of the SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$ru_q''' - reference to q value of the R-URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Received IP address&lt;br /&gt;
&lt;br /&gt;
'''$Ri''' - reference to IP address of the interface where the request has been received&lt;br /&gt;
&lt;br /&gt;
!!!!Received port&lt;br /&gt;
&lt;br /&gt;
'''$Rp''' - reference to the port where the message was received&lt;br /&gt;
&lt;br /&gt;
!!!!Script flags&lt;br /&gt;
&lt;br /&gt;
'''$sf''' - displays a list with the script flags set for the current SIP request&lt;br /&gt;
&lt;br /&gt;
!!!!Script flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
'''$sF''' - reference to script flags - hexa output&lt;br /&gt;
&lt;br /&gt;
!!!!IP source address&lt;br /&gt;
&lt;br /&gt;
'''$si''' - reference to IP source address of the message&lt;br /&gt;
&lt;br /&gt;
!!!!Source port&lt;br /&gt;
&lt;br /&gt;
'''$sp''' - reference to the source port of the message&lt;br /&gt;
&lt;br /&gt;
!!!!To URI Domain&lt;br /&gt;
&lt;br /&gt;
'''$td''' - reference to domain in URI of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To display name&lt;br /&gt;
&lt;br /&gt;
'''$tn''' - reference to display name of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To tag&lt;br /&gt;
&lt;br /&gt;
'''$tt''' - reference to tag parameter of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To URI&lt;br /&gt;
&lt;br /&gt;
'''$tu''' - reference to URI of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To URI Username&lt;br /&gt;
&lt;br /&gt;
'''$tU''' - reference to username in URI of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!Formatted date and time&lt;br /&gt;
&lt;br /&gt;
'''$time(format)''' - returns the string formatted time according to UNIX date (see: '''man date''').&lt;br /&gt;
&lt;br /&gt;
!!!!Branch index&lt;br /&gt;
&lt;br /&gt;
'''$T_branch_idx''' - the index (starting with 1 for the first branch) of the branch for which is executed the branch_route[]. If used outside of branch_route[] block, the value is '0'. This is exported by TM module.&lt;br /&gt;
&lt;br /&gt;
!!!!String formatted time&lt;br /&gt;
&lt;br /&gt;
'''$Tf''' - reference string formatted time&lt;br /&gt;
&lt;br /&gt;
!!!!Current unix time stamp in seconds&lt;br /&gt;
&lt;br /&gt;
'''$Ts''' - reference to current unix time stamp in seconds&lt;br /&gt;
&lt;br /&gt;
!!!!Current microseconds of the current second&lt;br /&gt;
&lt;br /&gt;
'''$Tsm''' - reference to current microseconds of the current second&lt;br /&gt;
&lt;br /&gt;
!!!!Startup unix time stamp&lt;br /&gt;
&lt;br /&gt;
'''$TS''' - reference to startup unix time stamp&lt;br /&gt;
&lt;br /&gt;
!!!!User agent header&lt;br /&gt;
&lt;br /&gt;
'''$ua''' - reference to user agent header field&lt;br /&gt;
&lt;br /&gt;
!!!!SIP Headers&lt;br /&gt;
&lt;br /&gt;
'''$(hdr(name)[N])''' - represents the body of the N-th header identified by 'name'. If [N] is omitted then the body of the first header is printed. The first header is got when N=0, for the second N=1, a.s.o. To print the last header of that type, use -1, no other negative values are supported now. No white spaces are allowed inside the specifier (before }, before or after {, [, ] symbols). When N='*', all headers of that type are printed.&lt;br /&gt;
&lt;br /&gt;
The module should identify most of compact header names (the ones recognized by '''OpenSIPS''' which should be all at this moment), if not, the compact form has to be specified explicitly. It is recommended to use dedicated specifiers for headers (e.g., %ua for user agent header), if they are available -- they are faster.&lt;br /&gt;
&lt;br /&gt;
'''$(hdrcnt(name))''' -- returns number of headers of type given by 'name'. Uses same rules for specifying header names as '''$hdr(name)''' above. Many headers (e.g., Via, Path, Record-Route) may appear more than once in the message. This variable returns the number of headers of a given type. &lt;br /&gt;
&lt;br /&gt;
Note that some headers (e.g., Path) may be joined together with commas and appear as a single header line. This variable counts the number of header lines, not header values. &lt;br /&gt;
&lt;br /&gt;
For message fragment below, '''$hdrcnt(Path)''' will have value 2 and '''$(hdr(Path)[0])''' will have value '''&amp;lt;a.com&amp;gt;''':&lt;br /&gt;
[@&lt;br /&gt;
    Path: &amp;lt;a.com&amp;gt;&lt;br /&gt;
    Path: &amp;lt;b.com&amp;gt;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
For message fragment below, '''$hdrcnt(Path)''' will have value 1 and '''$(hdr(Path)[0])''' will have value '''&amp;lt;a.com&amp;gt;,&amp;lt;b.com&amp;gt;''':&lt;br /&gt;
[@&lt;br /&gt;
    Path: &amp;lt;a.com&amp;gt;,&amp;lt;b.com&amp;gt;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
Note that both examples above are semantically equivalent but the variables take on different values.&lt;br /&gt;
&lt;br /&gt;
[[#varavps]]&lt;br /&gt;
&lt;br /&gt;
!!!Escape Sequences&lt;br /&gt;
&lt;br /&gt;
These sequences are exported, and mainly used, by xlog module to print messages in many colors (foreground and background) using escape sequences. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Foreground and background colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$C(xy) - reference to an escape sequence. ¿x¿ represents the foreground color and ¿y¿ represents the background color.&lt;br /&gt;
&lt;br /&gt;
Colors could be:&lt;br /&gt;
&lt;br /&gt;
* x : default color of the terminal&lt;br /&gt;
* s : Black&lt;br /&gt;
* r : Red&lt;br /&gt;
* g : Green&lt;br /&gt;
* y : Yellow&lt;br /&gt;
* b : Blue&lt;br /&gt;
* p : Purple&lt;br /&gt;
* c : Cyan&lt;br /&gt;
* w : White &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Examples&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A few examples of usage.&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
...&lt;br /&gt;
route {&lt;br /&gt;
...&lt;br /&gt;
    $avp(uuid)=&amp;quot;caller_id&amp;quot;;&lt;br /&gt;
    $avp(tmp)= $avp(uuid) + &amp;quot;: &amp;quot; + $fu;&lt;br /&gt;
    xdbg(&amp;quot;$(C(bg))avp(tmp)$(C(xx)) [$avp(tmp)] $(C(br))cseq$(C(xx))=[$hdr(cseq)]\n&amp;quot;);&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
@]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core&amp;diff=1473</id>
		<title>Variáveis Core</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core&amp;diff=1473"/>
		<updated>2013-10-20T20:16:50Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
O '''OpenSIPS''' prove varios tipos de variaveis para serem usados no script de roteamento, as diferenças entre os tipos de variaveis são:&lt;br /&gt;
* 1. A visibilidade da variavel&lt;br /&gt;
* 2. Onde a variavel é relacionada (onde a mesma reside)&lt;br /&gt;
* 3. Status read-write da variavel ( algumas variaveis são apenas de leitura)&lt;br /&gt;
* 4. Como multiplos valores (da mesma variavel) são manipulados.&lt;br /&gt;
&lt;br /&gt;
As variáveis do '''OpenSIPS''' podem facilmente ser identificadas no script apartir de seus nomes (ou nota'ões) iniciando com o simbolo  '''$''' &lt;br /&gt;
&lt;br /&gt;
Sintaxe:&lt;br /&gt;
&lt;br /&gt;
A sintaxe completa de uma pseudo-variavel é:&lt;br /&gt;
 &lt;br /&gt;
 $('&amp;lt;context&amp;gt;'''name'''(subname)[index]{transformation}')&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
The fields written in green are optional.&lt;br /&gt;
The fields meaning is:&lt;br /&gt;
* '''name'''(compulsory) - the pseudo-variable name(type).\\&lt;br /&gt;
Ex: pvar, avp, ru, DLG_status, etc.&lt;br /&gt;
* '''subname''' - the identifier of a certain pv from the given type.\\&lt;br /&gt;
Ex: hdr(From), avp(name).&lt;br /&gt;
* '''index''' - a pv can store more than one value - it can refer to a list of values. You can access a certain value from the list if you specify its index. You can also specify indexes with negative values, -1 means the last inserted, -2 the value before the previous inserted one.&lt;br /&gt;
* '''transformation''' - a series of processing actions can be applied on pseudo-variable. You can find the whole list of possible transformations [[Documentation.Script-Tran-1-9| here]]. The transformations can be cascaded, using the output of one transformation as the input of another.     &lt;br /&gt;
* '''context''' - the context in which the pseudo0variable will be evaluated. Now there are 2 pv contexts: reply and request. The reply context can be used in the failure route to request for the pseudo-variable to be evaluated in the context of the reply message. The request context can be used if in a reply route is desired for the pv to be evaluated in the context of the corresponding request.&lt;br /&gt;
&lt;br /&gt;
Usage examples:&lt;br /&gt;
* Only '''name''': %green%$ru &lt;br /&gt;
* '''Name''' and '''subname'': %green%$hdr(Contact)%%&lt;br /&gt;
* '''Name''' and '''index''': %green%$(ct[0])%%&lt;br /&gt;
* '''Name''', '''subname''' and '''index''': %green%$(avp(i:10)[2])&lt;br /&gt;
* '''Context''' &lt;br /&gt;
** %green%$(&amp;lt;request&amp;gt;ru)%% from a reply route will get the Request-URI from the request&lt;br /&gt;
** %green%$(&amp;lt;reply&amp;gt;hdr(Contact))%% context can be used from failure route to access information from the reply &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Types of variables:&lt;br /&gt;
&lt;br /&gt;
* [[#varscript | '''script variables''']] - as the name says, these variables are strictly bound to the script routes. The variables are visible only in the routing blocks - they are not message or transaction related, but they are process related (script variables will be inherited by script routes executed by the same '''OpenSIPS''' process).\\&lt;br /&gt;
Script variables are read write and they can have integer or string values. A script variable can have only a single value. A new assignment (or write operation) will overwrite the existing value.&lt;br /&gt;
&lt;br /&gt;
* [[#varavps | '''AVP - Attribute Value Pair''']] - the AVPs are dynamic variables (as name) that can be created - the AVPS are linked to a singular message or transaction (if stateful processing is used). A message or a transaction will initially (when received or created) have an empty list of AVPS attached to it. During the routing script, the script directly or functions called from script may create new AVPS that will automatically attached to the message/transaction. The AVPS will be visible in all routes where any message (reply or request) of the transaction will be processed - branch_route , failure_route, onreply_route (for this last route you need to enable the TM parameter ''onreply_avp_mode'').\\&lt;br /&gt;
AVPs are read write and an existing AVP can be even deleted (removed). An AVP may contain multiple values - a new assignment (or write operation) will add a new value to the AVP; the values are kept in &amp;quot;last added first to be used&amp;quot; order (stack).&lt;br /&gt;
&lt;br /&gt;
* [[#varpv | '''pseudo variables''']] - pseudo-variables (or PV) provide access to information from the processed SIP message (headers, RURI, transport level info, a.s.o) or from '''OpenSIPS''' inners (time values, process PID, return code of a function). Depending of what info they provide, the PVs are either bound to the message, either to nothing  (global). Most of the PVs are read-only and only several allow write operations. A PV may return several values or only one, depending of the referred info (if can have multiple values or not).\\&lt;br /&gt;
Standard PV is read-only and returns a single value (if not otherwise documented).&lt;br /&gt;
&lt;br /&gt;
* [[#varesc | '''escape sequences''']] - escape sequences used to format the strings; they are actually not variables, but rather formatters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#varscript]]&lt;br /&gt;
!!!Script variables&lt;br /&gt;
&lt;br /&gt;
'''Naming''': **$var(name)** &lt;br /&gt;
&lt;br /&gt;
'''Hints''':&lt;br /&gt;
# if you want to start using a script variable in a route, better initialize it with same value (or reset it), otherwise you may inherit a value from a previous route that was executed by the same process.&lt;br /&gt;
# script variables are faster the AVPs, being referenced directly to memory location.&lt;br /&gt;
# the value of script variables persists over a '''OpenSIPS''' process.&lt;br /&gt;
# a script value can have only one value.&lt;br /&gt;
&lt;br /&gt;
Example of usage:&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
$var(a) = 2;  # sets the value of variable 'a' to integer '2'&lt;br /&gt;
$var(a) = &amp;quot;2&amp;quot;;  # sets the value of variable 'a' to string '2'&lt;br /&gt;
$var(a) = 3 + (7&amp;amp;(~2)); # arithmetic and bitwise operation&lt;br /&gt;
$var(a) = &amp;quot;sip:&amp;quot; + $au + &amp;quot;@&amp;quot; + $fd; # compose a value from authentication username and From URI domain&lt;br /&gt;
&lt;br /&gt;
# using a script variable for tests&lt;br /&gt;
if( [ $var(a) &amp;amp; 4 ] ) {&lt;br /&gt;
  xlog(&amp;quot;var a has third bit set\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
Setting a variable to NULL is actually initializing the value to integer '0'. Script variables don't have NULL value.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#varavps]]&lt;br /&gt;
!!!AVP variables&lt;br /&gt;
&lt;br /&gt;
'''Naming''': **$avp(name)** or **$(avp(name)[N])**&lt;br /&gt;
&lt;br /&gt;
When using the index &amp;quot;N&amp;quot; you can force the AVP to return a certain value (the N-th value). If no index is given, the first value will be returned.&lt;br /&gt;
&lt;br /&gt;
'''Hints''':&lt;br /&gt;
# to enable AVPs in onreply_route, use &amp;quot;modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&amp;quot;&lt;br /&gt;
# if multiple values are used for a single AVP, the values are index in revert order than added&lt;br /&gt;
# AVPs are part of the transaction context, so they will be visible everywhere where the transaction is present.&lt;br /&gt;
# the value of an AVP can be deleted&lt;br /&gt;
&lt;br /&gt;
Example of usage:&lt;br /&gt;
# Transaction persistence example&lt;br /&gt;
[@&lt;br /&gt;
# enable avps in onreply route&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&lt;br /&gt;
...&lt;br /&gt;
route{&lt;br /&gt;
...&lt;br /&gt;
$avp(tmp) = $Ts ; # store the current time (at request processing)&lt;br /&gt;
...&lt;br /&gt;
t_onreply(&amp;quot;1&amp;quot;);&lt;br /&gt;
t_relay();&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
onreply_route[1] {&lt;br /&gt;
	if (t_check_status(&amp;quot;200&amp;quot;)) {&lt;br /&gt;
		# calculate the setup time&lt;br /&gt;
		$var(setup_time) = $Ts - $avp(tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
# Multilple values example&lt;br /&gt;
[@&lt;br /&gt;
$avp(17) = &amp;quot;one&amp;quot;;&lt;br /&gt;
# we have a single value&lt;br /&gt;
$avp(17) = &amp;quot;two&amp;quot;;&lt;br /&gt;
# we have two values (&amp;quot;two&amp;quot;,&amp;quot;one&amp;quot;)&lt;br /&gt;
$avp(17) = &amp;quot;three&amp;quot;;&lt;br /&gt;
# we have three values (&amp;quot;three&amp;quot;,&amp;quot;two&amp;quot;,&amp;quot;one&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
xlog(&amp;quot;accessing values with no index: $avp(17)\n&amp;quot;);&lt;br /&gt;
# this will print the first value, which is the last added value -&amp;gt; &amp;quot;three&amp;quot;&lt;br /&gt;
&lt;br /&gt;
xlog(&amp;quot;accessing values with no index: $(avp(17)[2])\n&amp;quot;);&lt;br /&gt;
# this will print the index 2 value (third one), -&amp;gt; &amp;quot;one&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# remove the last value of the avp; if there is only one value, the AVP itself will be destroyed&lt;br /&gt;
$avp(17) = NULL;&lt;br /&gt;
&lt;br /&gt;
# delete all values and destroy the AVP&lt;br /&gt;
avp_delete(&amp;quot;$avp(17)/g&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# delete the value located at a certain index &lt;br /&gt;
$(avp(17)[1]) = NULL;&lt;br /&gt;
&lt;br /&gt;
#overwrite the value at a certain index&lt;br /&gt;
$(avp(17)[0]) = &amp;quot;zero&amp;quot;;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
The '''AVPOPS''' module provides a lot of useful functions to operate AVPs (like checking values, pushing values into different other locations, deleting AVPs, etc).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#varpv]]&lt;br /&gt;
!!!Pseudo Variables&lt;br /&gt;
&lt;br /&gt;
'''Naming''': $name&lt;br /&gt;
&lt;br /&gt;
'''Hints''':&lt;br /&gt;
# the PV tokens can be given as parameters to different script functions and they will be replaced with a value before the execution of the function.&lt;br /&gt;
# most of PVs are made available by '''OpenSIPS''' core, but there are also module exporting PV (to make available info specific to that module) - check the modules documentation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Predefined (provided by core) PVs are listed in alphabetical order.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!URI in SIP Request's P-Asserted-Identity header&lt;br /&gt;
&lt;br /&gt;
'''$ai''' - reference to URI in request's P-Asserted-Identity header (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Authentication Digest URI&lt;br /&gt;
&lt;br /&gt;
'''$adu''' - URI from Authorization or Proxy-Authorization header. This URI is used when calculating the HTTP Digest Response.&lt;br /&gt;
&lt;br /&gt;
!!!!Authentication realm&lt;br /&gt;
&lt;br /&gt;
'''$ar''' - realm from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
!!!!Auth username user&lt;br /&gt;
&lt;br /&gt;
'''$au''' - user part of username from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth username domain&lt;br /&gt;
&lt;br /&gt;
'''$ad''' - domain part of username from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth nonce&lt;br /&gt;
&lt;br /&gt;
'''$an''' - the nonce from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth response &lt;br /&gt;
&lt;br /&gt;
'''$auth.resp''' - the authentication response from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth nonce &lt;br /&gt;
&lt;br /&gt;
'''$auth.nonce''' - the nonce string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth opaque&lt;br /&gt;
&lt;br /&gt;
'''$auth.opaque''' - the opaque string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth algorithm&lt;br /&gt;
&lt;br /&gt;
'''$auth.alg''' - the algorithm string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
!!!!Auth QOP&lt;br /&gt;
&lt;br /&gt;
'''$auth.qop''' - the value of qop parameter from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth nonce count (nc)&lt;br /&gt;
&lt;br /&gt;
'''$auth.nc''' - the value of nonce count parameter from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth whole username&lt;br /&gt;
&lt;br /&gt;
'''$aU''' - whole username from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
!!!!Acc username&lt;br /&gt;
&lt;br /&gt;
'''$Au''' - username for accounting purposes. It's a selective pseudo variable (inherited from acc module). It returns $au if exits or From username otherwise.&lt;br /&gt;
&lt;br /&gt;
!!!!Argument options&lt;br /&gt;
&lt;br /&gt;
'''$argv''' - provides access to command line arguments specified with '-o' option.&lt;br /&gt;
Examples:&lt;br /&gt;
[@&lt;br /&gt;
   # for option '-o foo=0'&lt;br /&gt;
   xlog(&amp;quot;foo is $argv(foo) \n&amp;quot;);&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!Branch flags&lt;br /&gt;
&lt;br /&gt;
'''$bf''' - displays a list with the branch flags set for the current SIP request&lt;br /&gt;
&lt;br /&gt;
!!!!Branch flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
'''$bF''' - reference to branch flags - hexa output&lt;br /&gt;
&lt;br /&gt;
!!!!Branch&lt;br /&gt;
&lt;br /&gt;
'''$branch''' - this variable is used for creating new branches by writing into it the value of a SIP URI.&lt;br /&gt;
Examples:&lt;br /&gt;
[@&lt;br /&gt;
   # creates a new branch&lt;br /&gt;
   $branch = &amp;quot;sip:new@doamin.org&amp;quot;;&lt;br /&gt;
   # print its URI&lt;br /&gt;
   xlog(&amp;quot;last added branch has URI $(branch(uri)[-1]) \n&amp;quot;);&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!Branch fields&lt;br /&gt;
&lt;br /&gt;
'''$branch()''' - this variable provides read/write access to all fields/attributes of an already existing branch (priorly created with append_branch() ). The fields of the branch are:&lt;br /&gt;
* uri - the RURI of the branch  (string value)&lt;br /&gt;
* duri - destination URI of the branch (outbound proxy of the branch)  (string value)&lt;br /&gt;
* q - q value of the branch (int value)&lt;br /&gt;
* path - the PATH string for this branch (string value)&lt;br /&gt;
* flags - the branch flags of this branch (int value)&lt;br /&gt;
* socket - the local socket to be used for relaying this branch (string value)&lt;br /&gt;
The variable accepts also index '''$(branch(uri)[1])''' for accessing a specific branch (multiple branches can be defined at a moment). The index starts from 0 (first branch). If the index is negative, it is considered the n-th branch from the end ( index -1 means the last branch).\\&lt;br /&gt;
To get all branches, use the * index - $(branch(uri)[*]).\\&lt;br /&gt;
Examples:&lt;br /&gt;
[@&lt;br /&gt;
   # creates the first branch&lt;br /&gt;
   append_branch();&lt;br /&gt;
   # creates the second branch&lt;br /&gt;
   force_send_socket(udp:192.168.1.10:5060);&lt;br /&gt;
   $du = &amp;quot;sip:192.168.2.10&amp;quot;;&lt;br /&gt;
   append_branch(&amp;quot;sip:foo@bar.com&amp;quot;,&amp;quot;0.5&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   # display branches&lt;br /&gt;
   xlog(&amp;quot;----- branch 0: $(branch(uri)[0]) , $(branch(q)[0]), $(branch(duri)[0]), $(branch(path)[0]), $(branch(flags)[0]), $(branch(socket)[0]) \n&amp;quot;);&lt;br /&gt;
   xlog(&amp;quot;----- branch 1: $(branch(uri)[1]) , $(branch(q)[1]), $(branch(duri)[1]), $(branch(path)[1]), $(branch(flags)[1]), $(branch(socket)[1]) \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   # do some changes over the branches&lt;br /&gt;
   $branch(uri) = &amp;quot;sip:user@domain.ro&amp;quot;;   # set URI for the first branch&lt;br /&gt;
   $(branch(q)[0]) = 1000;  # set to 1.00 for the first branch&lt;br /&gt;
   $(branch(socket)[1]) = NULL;  # reset the socket of the second branch&lt;br /&gt;
   $branch(duri) = NULL;  # reset the destination URI or the first branch&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it from routing logic)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Call-Id&lt;br /&gt;
&lt;br /&gt;
'''$ci''' - reference to body of call-id header&lt;br /&gt;
&lt;br /&gt;
!!!!Content-Length&lt;br /&gt;
&lt;br /&gt;
'''$cl''' - reference to body of content-length header&lt;br /&gt;
&lt;br /&gt;
!!!!CSeq number&lt;br /&gt;
&lt;br /&gt;
'''$cs''' - reference to cseq number from cseq header&lt;br /&gt;
&lt;br /&gt;
!!!!Contact instance&lt;br /&gt;
&lt;br /&gt;
'''$ct''' - reference to contact instance/body from the contact header. A contact instance is  display_name + URI + contact_params. As a Contact header may contain multiple Contact instances and a message may contain multiple Contact headers, an index was added to the $ct variable:&lt;br /&gt;
* $ct -first contact instance from message&lt;br /&gt;
* $(ct[n]) - the n-th contact instance form the beginning of message, starting with index 0&lt;br /&gt;
* $(ct[-n]) - the n-th contact instance form the end of the message, starting with index -1 (the last contact instance)&lt;br /&gt;
&lt;br /&gt;
!!!!Fields of a contact instance&lt;br /&gt;
&lt;br /&gt;
'''$ct.fields()''' - reference to the fields of a contact instance/body (see above). Supported fields are:&lt;br /&gt;
* name - display name&lt;br /&gt;
* uri - contact uri&lt;br /&gt;
* q  - q param (value only)&lt;br /&gt;
* expires - expires param (value only) &lt;br /&gt;
* methods - methods param (value only)&lt;br /&gt;
* received - received param (value only)&lt;br /&gt;
* params - all params (including names)&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
* $ct.fields(uri) - the URI of the first contact instance&lt;br /&gt;
* $(ct.fields(name)[1]) - the display name of the second contact instance&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Content-Type&lt;br /&gt;
&lt;br /&gt;
'''$cT''' - reference to body of content-type header&lt;br /&gt;
&lt;br /&gt;
!!!!Domain of destination URI&lt;br /&gt;
&lt;br /&gt;
'''$dd''' - reference to domain of destination uri&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it from routing logic)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Diversion header URI&lt;br /&gt;
&lt;br /&gt;
'''$di''' - reference to Diversion header URI&lt;br /&gt;
&lt;br /&gt;
!!!!Diversion &amp;quot;privacy&amp;quot; parameter&lt;br /&gt;
&lt;br /&gt;
'''$dip''' - reference to Diversion header &amp;quot;privacy&amp;quot; parameter value&lt;br /&gt;
&lt;br /&gt;
!!!!Diversion &amp;quot;reason&amp;quot; parameter&lt;br /&gt;
&lt;br /&gt;
'''$dir''' - reference to Diversion header &amp;quot;reason&amp;quot; parameter value&lt;br /&gt;
&lt;br /&gt;
!!!!Port of destination URI&lt;br /&gt;
&lt;br /&gt;
'''$dp''' - reference to port of destination uri&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it from routing logic)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Transport protocol of destination URI&lt;br /&gt;
&lt;br /&gt;
'''$dP''' - reference to transport protocol of destination uri&lt;br /&gt;
&lt;br /&gt;
!!!!Destination set&lt;br /&gt;
&lt;br /&gt;
'''$ds''' - reference to destination set&lt;br /&gt;
&lt;br /&gt;
!!!!Destination URI&lt;br /&gt;
&lt;br /&gt;
'''$du''' - reference to destination uri (outbound proxy to be used for sending the request)&lt;br /&gt;
If loose_route() returns TRUE a destination uri is set according to the first Route header.&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it from routing logic)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Error class&lt;br /&gt;
&lt;br /&gt;
'''$err.class''' - the class of error (now is '1' for parsing errors)&lt;br /&gt;
&lt;br /&gt;
!!!!Error level&lt;br /&gt;
&lt;br /&gt;
'''$err.level''' - severity level for the error&lt;br /&gt;
&lt;br /&gt;
!!!!Error info&lt;br /&gt;
&lt;br /&gt;
'''$err.info''' - text describing the error&lt;br /&gt;
&lt;br /&gt;
!!!!Error reply code&lt;br /&gt;
&lt;br /&gt;
'''$err.rcode''' - recommended reply code&lt;br /&gt;
&lt;br /&gt;
!!!!Error reply reason&lt;br /&gt;
&lt;br /&gt;
'''$err.rreason''' - recommended reply reason phrase&lt;br /&gt;
&lt;br /&gt;
!!!!From URI domain&lt;br /&gt;
&lt;br /&gt;
'''$fd''' - reference to domain in URI of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!From display name&lt;br /&gt;
&lt;br /&gt;
'''$fn''' - reference to display name of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!Forced socket&lt;br /&gt;
&lt;br /&gt;
'''$fs''' - reference to the forced socket for message sending (if any) in the form proto:ip:port&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!From tag&lt;br /&gt;
&lt;br /&gt;
'''$ft''' - reference to tag parameter of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!From URI&lt;br /&gt;
&lt;br /&gt;
'''$fu''' - reference to URI of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!From URI username&lt;br /&gt;
&lt;br /&gt;
'''$fU''' - reference to username in URI of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!SIP message buffer&lt;br /&gt;
&lt;br /&gt;
'''$mb''' - reference to SIP message buffer&lt;br /&gt;
&lt;br /&gt;
!!!!Message Flags&lt;br /&gt;
&lt;br /&gt;
'''$mf''' - displays a list with the message/transaction flags set for the current SIP request&lt;br /&gt;
&lt;br /&gt;
!!!!Message Flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
'''$mF''' -reference to message/transaction flags set for current SIP request in hexa&lt;br /&gt;
&lt;br /&gt;
!!!!SIP message ID&lt;br /&gt;
&lt;br /&gt;
'''$mi''' - reference to SIP message id&lt;br /&gt;
&lt;br /&gt;
!!!!SIP message length&lt;br /&gt;
&lt;br /&gt;
'''$ml''' - reference to SIP message length&lt;br /&gt;
&lt;br /&gt;
!!!!Domain in SIP Request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$od''' - reference to domain in request's original R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!Port of SIP request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$op''' - reference to port of original R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!Transport protocol of SIP request original URI&lt;br /&gt;
&lt;br /&gt;
'''$oP''' - reference to transport protocol of original R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!SIP Request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$ou''' - reference to request's original URI&lt;br /&gt;
&lt;br /&gt;
!!!!Username in SIP Request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$oU''' - reference to username in request's original URI&lt;br /&gt;
&lt;br /&gt;
!!!!Route parameter&lt;br /&gt;
'''$param(idx)''' - retrieves the parameters of the route. The index can be an integer, or a pseudo-variable (index starts at 1).\\&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
   route {&lt;br /&gt;
      ...&lt;br /&gt;
      $var(debug) = &amp;quot;DBUG:&amp;quot;&lt;br /&gt;
      route(PRINT_VAR, $var(debug), &amp;quot;param value&amp;quot;);&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   route[PRINT_VAR] {&lt;br /&gt;
      $var(index) = 2;&lt;br /&gt;
      xlog(&amp;quot;$param(1): The parameter value is &amp;lt;$param($var(index))&amp;gt;\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!Domain in SIP Request's P-Preferred-Identity header URI&lt;br /&gt;
&lt;br /&gt;
'''$pd''' - reference to domain in request's P-Preferred-Identity header URI (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Display Name in SIP Request's P-Preferred-Identity header&lt;br /&gt;
&lt;br /&gt;
'''$pn''' - reference to Display Name in request's P-Preferred-Identity header (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Process id&lt;br /&gt;
&lt;br /&gt;
'''$pp''' - reference to process id (pid)&lt;br /&gt;
&lt;br /&gt;
!!!!Protocol of received message&lt;br /&gt;
'''$pr''' or '''$proto''' - protocol of received message (UDP, TCP, TLS, SCTP)&lt;br /&gt;
&lt;br /&gt;
!!!!User in SIP Request's P-Preferred-Identity header URI&lt;br /&gt;
&lt;br /&gt;
'''$pU''' - reference to user in request's P-Preferred-Identity header URI (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!URI in SIP Request's P-Preferred-Identity header&lt;br /&gt;
&lt;br /&gt;
'''$pu''' - reference to URI in request's P-Preferred-Identity header (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Domain in SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$rd''' - reference to domain in request's URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Body of request/reply&lt;br /&gt;
&lt;br /&gt;
'''$rb''' - reference to message body&lt;br /&gt;
&lt;br /&gt;
!!!!Returned code&lt;br /&gt;
&lt;br /&gt;
'''$rc''' - reference to returned code by last invoked function&lt;br /&gt;
&lt;br /&gt;
'''$retcode''' - same as **$rc**&lt;br /&gt;
&lt;br /&gt;
!!!!Remote-Party-ID header URI&lt;br /&gt;
&lt;br /&gt;
'''$re''' - reference to Remote-Party-ID header URI&lt;br /&gt;
&lt;br /&gt;
!!!!SIP request's method&lt;br /&gt;
&lt;br /&gt;
'''$rm''' - reference to request's method&lt;br /&gt;
&lt;br /&gt;
!!!!SIP request's port&lt;br /&gt;
&lt;br /&gt;
'''$rp''' - reference to port of R-URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Transport protocol of SIP request URI&lt;br /&gt;
&lt;br /&gt;
'''$rP''' - reference to transport protocol of R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!SIP reply's reason&lt;br /&gt;
&lt;br /&gt;
'''$rr''' - reference to reply's reason&lt;br /&gt;
&lt;br /&gt;
!!!!SIP reply's status&lt;br /&gt;
&lt;br /&gt;
'''$rs''' - reference to reply's status&lt;br /&gt;
&lt;br /&gt;
!!!!Refer-to URI&lt;br /&gt;
&lt;br /&gt;
'''$rt''' - reference to URI of refer-to header&lt;br /&gt;
&lt;br /&gt;
!!!!SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$ru''' - reference to request's URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Username in SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$rU''' - reference to username in request's URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Q value of the SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$ru_q''' - reference to q value of the R-URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Received IP address&lt;br /&gt;
&lt;br /&gt;
'''$Ri''' - reference to IP address of the interface where the request has been received&lt;br /&gt;
&lt;br /&gt;
!!!!Received port&lt;br /&gt;
&lt;br /&gt;
'''$Rp''' - reference to the port where the message was received&lt;br /&gt;
&lt;br /&gt;
!!!!Script flags&lt;br /&gt;
&lt;br /&gt;
'''$sf''' - displays a list with the script flags set for the current SIP request&lt;br /&gt;
&lt;br /&gt;
!!!!Script flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
'''$sF''' - reference to script flags - hexa output&lt;br /&gt;
&lt;br /&gt;
!!!!IP source address&lt;br /&gt;
&lt;br /&gt;
'''$si''' - reference to IP source address of the message&lt;br /&gt;
&lt;br /&gt;
!!!!Source port&lt;br /&gt;
&lt;br /&gt;
'''$sp''' - reference to the source port of the message&lt;br /&gt;
&lt;br /&gt;
!!!!To URI Domain&lt;br /&gt;
&lt;br /&gt;
'''$td''' - reference to domain in URI of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To display name&lt;br /&gt;
&lt;br /&gt;
'''$tn''' - reference to display name of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To tag&lt;br /&gt;
&lt;br /&gt;
'''$tt''' - reference to tag parameter of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To URI&lt;br /&gt;
&lt;br /&gt;
'''$tu''' - reference to URI of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To URI Username&lt;br /&gt;
&lt;br /&gt;
'''$tU''' - reference to username in URI of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!Formatted date and time&lt;br /&gt;
&lt;br /&gt;
'''$time(format)''' - returns the string formatted time according to UNIX date (see: '''man date''').&lt;br /&gt;
&lt;br /&gt;
!!!!Branch index&lt;br /&gt;
&lt;br /&gt;
'''$T_branch_idx''' - the index (starting with 1 for the first branch) of the branch for which is executed the branch_route[]. If used outside of branch_route[] block, the value is '0'. This is exported by TM module.&lt;br /&gt;
&lt;br /&gt;
!!!!String formatted time&lt;br /&gt;
&lt;br /&gt;
'''$Tf''' - reference string formatted time&lt;br /&gt;
&lt;br /&gt;
!!!!Current unix time stamp in seconds&lt;br /&gt;
&lt;br /&gt;
'''$Ts''' - reference to current unix time stamp in seconds&lt;br /&gt;
&lt;br /&gt;
!!!!Current microseconds of the current second&lt;br /&gt;
&lt;br /&gt;
'''$Tsm''' - reference to current microseconds of the current second&lt;br /&gt;
&lt;br /&gt;
!!!!Startup unix time stamp&lt;br /&gt;
&lt;br /&gt;
'''$TS''' - reference to startup unix time stamp&lt;br /&gt;
&lt;br /&gt;
!!!!User agent header&lt;br /&gt;
&lt;br /&gt;
'''$ua''' - reference to user agent header field&lt;br /&gt;
&lt;br /&gt;
!!!!SIP Headers&lt;br /&gt;
&lt;br /&gt;
'''$(hdr(name)[N])''' - represents the body of the N-th header identified by 'name'. If [N] is omitted then the body of the first header is printed. The first header is got when N=0, for the second N=1, a.s.o. To print the last header of that type, use -1, no other negative values are supported now. No white spaces are allowed inside the specifier (before }, before or after {, [, ] symbols). When N='*', all headers of that type are printed.&lt;br /&gt;
&lt;br /&gt;
The module should identify most of compact header names (the ones recognized by '''OpenSIPS''' which should be all at this moment), if not, the compact form has to be specified explicitly. It is recommended to use dedicated specifiers for headers (e.g., %ua for user agent header), if they are available -- they are faster.&lt;br /&gt;
&lt;br /&gt;
'''$(hdrcnt(name))''' -- returns number of headers of type given by 'name'. Uses same rules for specifying header names as '''$hdr(name)''' above. Many headers (e.g., Via, Path, Record-Route) may appear more than once in the message. This variable returns the number of headers of a given type. &lt;br /&gt;
&lt;br /&gt;
Note that some headers (e.g., Path) may be joined together with commas and appear as a single header line. This variable counts the number of header lines, not header values. &lt;br /&gt;
&lt;br /&gt;
For message fragment below, '''$hdrcnt(Path)''' will have value 2 and '''$(hdr(Path)[0])''' will have value '''&amp;lt;a.com&amp;gt;''':&lt;br /&gt;
[@&lt;br /&gt;
    Path: &amp;lt;a.com&amp;gt;&lt;br /&gt;
    Path: &amp;lt;b.com&amp;gt;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
For message fragment below, '''$hdrcnt(Path)''' will have value 1 and '''$(hdr(Path)[0])''' will have value '''&amp;lt;a.com&amp;gt;,&amp;lt;b.com&amp;gt;''':&lt;br /&gt;
[@&lt;br /&gt;
    Path: &amp;lt;a.com&amp;gt;,&amp;lt;b.com&amp;gt;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
Note that both examples above are semantically equivalent but the variables take on different values.&lt;br /&gt;
&lt;br /&gt;
[[#varavps]]&lt;br /&gt;
&lt;br /&gt;
!!!Escape Sequences&lt;br /&gt;
&lt;br /&gt;
These sequences are exported, and mainly used, by xlog module to print messages in many colors (foreground and background) using escape sequences. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Foreground and background colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$C(xy) - reference to an escape sequence. ¿x¿ represents the foreground color and ¿y¿ represents the background color.&lt;br /&gt;
&lt;br /&gt;
Colors could be:&lt;br /&gt;
&lt;br /&gt;
* x : default color of the terminal&lt;br /&gt;
* s : Black&lt;br /&gt;
* r : Red&lt;br /&gt;
* g : Green&lt;br /&gt;
* y : Yellow&lt;br /&gt;
* b : Blue&lt;br /&gt;
* p : Purple&lt;br /&gt;
* c : Cyan&lt;br /&gt;
* w : White &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Examples&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A few examples of usage.&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
...&lt;br /&gt;
route {&lt;br /&gt;
...&lt;br /&gt;
    $avp(uuid)=&amp;quot;caller_id&amp;quot;;&lt;br /&gt;
    $avp(tmp)= $avp(uuid) + &amp;quot;: &amp;quot; + $fu;&lt;br /&gt;
    xdbg(&amp;quot;$(C(bg))avp(tmp)$(C(xx)) [$avp(tmp)] $(C(br))cseq$(C(xx))=[$hdr(cseq)]\n&amp;quot;);&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
@]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core&amp;diff=1472</id>
		<title>Variáveis Core</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Vari%C3%A1veis_Core&amp;diff=1472"/>
		<updated>2013-10-20T20:16:09Z</updated>

		<summary type="html">&lt;p&gt;Mike: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
O '''OpenSIPS''' prove varios tipos de variaveis para serem usados no script de roteamento, as diferenças entre os tipos de variaveis são:&lt;br /&gt;
* 1. A visibilidade da variavel&lt;br /&gt;
* 2. Onde a variavel é relacionada (onde a mesma reside)&lt;br /&gt;
* 3. Status read-write da variavel ( algumas variaveis são apenas de leitura)&lt;br /&gt;
* 4. Como multiplos valores (da mesma variavel) são manipulados.&lt;br /&gt;
&lt;br /&gt;
As variáveis do '''OpenSIPS''' podem facilmente ser identificadas no script apartir de seus nomes (ou nota'ões) iniciando com o simbolo  '''$''' &lt;br /&gt;
&lt;br /&gt;
Sintaxe:&lt;br /&gt;
&lt;br /&gt;
A sintaxe completa de uma pseudo-variavel é:&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 $('&amp;lt;context&amp;gt;'''name'''(subname)[index]{transformation}'')&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
The fields written in green are optional.&lt;br /&gt;
The fields meaning is:&lt;br /&gt;
* '''name'''(compulsory) - the pseudo-variable name(type).\\&lt;br /&gt;
Ex: pvar, avp, ru, DLG_status, etc.&lt;br /&gt;
* '''subname''' - the identifier of a certain pv from the given type.\\&lt;br /&gt;
Ex: hdr(From), avp(name).&lt;br /&gt;
* '''index''' - a pv can store more than one value - it can refer to a list of values. You can access a certain value from the list if you specify its index. You can also specify indexes with negative values, -1 means the last inserted, -2 the value before the previous inserted one.&lt;br /&gt;
* '''transformation''' - a series of processing actions can be applied on pseudo-variable. You can find the whole list of possible transformations [[Documentation.Script-Tran-1-9| here]]. The transformations can be cascaded, using the output of one transformation as the input of another.     &lt;br /&gt;
* '''context''' - the context in which the pseudo0variable will be evaluated. Now there are 2 pv contexts: reply and request. The reply context can be used in the failure route to request for the pseudo-variable to be evaluated in the context of the reply message. The request context can be used if in a reply route is desired for the pv to be evaluated in the context of the corresponding request.&lt;br /&gt;
&lt;br /&gt;
Usage examples:&lt;br /&gt;
* Only '''name''': %green%$ru &lt;br /&gt;
* '''Name''' and '''subname'': %green%$hdr(Contact)%%&lt;br /&gt;
* '''Name''' and '''index''': %green%$(ct[0])%%&lt;br /&gt;
* '''Name''', '''subname''' and '''index''': %green%$(avp(i:10)[2])&lt;br /&gt;
* '''Context''' &lt;br /&gt;
** %green%$(&amp;lt;request&amp;gt;ru)%% from a reply route will get the Request-URI from the request&lt;br /&gt;
** %green%$(&amp;lt;reply&amp;gt;hdr(Contact))%% context can be used from failure route to access information from the reply &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Types of variables:&lt;br /&gt;
&lt;br /&gt;
* [[#varscript | '''script variables''']] - as the name says, these variables are strictly bound to the script routes. The variables are visible only in the routing blocks - they are not message or transaction related, but they are process related (script variables will be inherited by script routes executed by the same '''OpenSIPS''' process).\\&lt;br /&gt;
Script variables are read write and they can have integer or string values. A script variable can have only a single value. A new assignment (or write operation) will overwrite the existing value.&lt;br /&gt;
&lt;br /&gt;
* [[#varavps | '''AVP - Attribute Value Pair''']] - the AVPs are dynamic variables (as name) that can be created - the AVPS are linked to a singular message or transaction (if stateful processing is used). A message or a transaction will initially (when received or created) have an empty list of AVPS attached to it. During the routing script, the script directly or functions called from script may create new AVPS that will automatically attached to the message/transaction. The AVPS will be visible in all routes where any message (reply or request) of the transaction will be processed - branch_route , failure_route, onreply_route (for this last route you need to enable the TM parameter ''onreply_avp_mode'').\\&lt;br /&gt;
AVPs are read write and an existing AVP can be even deleted (removed). An AVP may contain multiple values - a new assignment (or write operation) will add a new value to the AVP; the values are kept in &amp;quot;last added first to be used&amp;quot; order (stack).&lt;br /&gt;
&lt;br /&gt;
* [[#varpv | '''pseudo variables''']] - pseudo-variables (or PV) provide access to information from the processed SIP message (headers, RURI, transport level info, a.s.o) or from '''OpenSIPS''' inners (time values, process PID, return code of a function). Depending of what info they provide, the PVs are either bound to the message, either to nothing  (global). Most of the PVs are read-only and only several allow write operations. A PV may return several values or only one, depending of the referred info (if can have multiple values or not).\\&lt;br /&gt;
Standard PV is read-only and returns a single value (if not otherwise documented).&lt;br /&gt;
&lt;br /&gt;
* [[#varesc | '''escape sequences''']] - escape sequences used to format the strings; they are actually not variables, but rather formatters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#varscript]]&lt;br /&gt;
!!!Script variables&lt;br /&gt;
&lt;br /&gt;
'''Naming''': **$var(name)** &lt;br /&gt;
&lt;br /&gt;
'''Hints''':&lt;br /&gt;
# if you want to start using a script variable in a route, better initialize it with same value (or reset it), otherwise you may inherit a value from a previous route that was executed by the same process.&lt;br /&gt;
# script variables are faster the AVPs, being referenced directly to memory location.&lt;br /&gt;
# the value of script variables persists over a '''OpenSIPS''' process.&lt;br /&gt;
# a script value can have only one value.&lt;br /&gt;
&lt;br /&gt;
Example of usage:&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
$var(a) = 2;  # sets the value of variable 'a' to integer '2'&lt;br /&gt;
$var(a) = &amp;quot;2&amp;quot;;  # sets the value of variable 'a' to string '2'&lt;br /&gt;
$var(a) = 3 + (7&amp;amp;(~2)); # arithmetic and bitwise operation&lt;br /&gt;
$var(a) = &amp;quot;sip:&amp;quot; + $au + &amp;quot;@&amp;quot; + $fd; # compose a value from authentication username and From URI domain&lt;br /&gt;
&lt;br /&gt;
# using a script variable for tests&lt;br /&gt;
if( [ $var(a) &amp;amp; 4 ] ) {&lt;br /&gt;
  xlog(&amp;quot;var a has third bit set\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
Setting a variable to NULL is actually initializing the value to integer '0'. Script variables don't have NULL value.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#varavps]]&lt;br /&gt;
!!!AVP variables&lt;br /&gt;
&lt;br /&gt;
'''Naming''': **$avp(name)** or **$(avp(name)[N])**&lt;br /&gt;
&lt;br /&gt;
When using the index &amp;quot;N&amp;quot; you can force the AVP to return a certain value (the N-th value). If no index is given, the first value will be returned.&lt;br /&gt;
&lt;br /&gt;
'''Hints''':&lt;br /&gt;
# to enable AVPs in onreply_route, use &amp;quot;modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&amp;quot;&lt;br /&gt;
# if multiple values are used for a single AVP, the values are index in revert order than added&lt;br /&gt;
# AVPs are part of the transaction context, so they will be visible everywhere where the transaction is present.&lt;br /&gt;
# the value of an AVP can be deleted&lt;br /&gt;
&lt;br /&gt;
Example of usage:&lt;br /&gt;
# Transaction persistence example&lt;br /&gt;
[@&lt;br /&gt;
# enable avps in onreply route&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&lt;br /&gt;
...&lt;br /&gt;
route{&lt;br /&gt;
...&lt;br /&gt;
$avp(tmp) = $Ts ; # store the current time (at request processing)&lt;br /&gt;
...&lt;br /&gt;
t_onreply(&amp;quot;1&amp;quot;);&lt;br /&gt;
t_relay();&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
onreply_route[1] {&lt;br /&gt;
	if (t_check_status(&amp;quot;200&amp;quot;)) {&lt;br /&gt;
		# calculate the setup time&lt;br /&gt;
		$var(setup_time) = $Ts - $avp(tmp);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
# Multilple values example&lt;br /&gt;
[@&lt;br /&gt;
$avp(17) = &amp;quot;one&amp;quot;;&lt;br /&gt;
# we have a single value&lt;br /&gt;
$avp(17) = &amp;quot;two&amp;quot;;&lt;br /&gt;
# we have two values (&amp;quot;two&amp;quot;,&amp;quot;one&amp;quot;)&lt;br /&gt;
$avp(17) = &amp;quot;three&amp;quot;;&lt;br /&gt;
# we have three values (&amp;quot;three&amp;quot;,&amp;quot;two&amp;quot;,&amp;quot;one&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
xlog(&amp;quot;accessing values with no index: $avp(17)\n&amp;quot;);&lt;br /&gt;
# this will print the first value, which is the last added value -&amp;gt; &amp;quot;three&amp;quot;&lt;br /&gt;
&lt;br /&gt;
xlog(&amp;quot;accessing values with no index: $(avp(17)[2])\n&amp;quot;);&lt;br /&gt;
# this will print the index 2 value (third one), -&amp;gt; &amp;quot;one&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# remove the last value of the avp; if there is only one value, the AVP itself will be destroyed&lt;br /&gt;
$avp(17) = NULL;&lt;br /&gt;
&lt;br /&gt;
# delete all values and destroy the AVP&lt;br /&gt;
avp_delete(&amp;quot;$avp(17)/g&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
# delete the value located at a certain index &lt;br /&gt;
$(avp(17)[1]) = NULL;&lt;br /&gt;
&lt;br /&gt;
#overwrite the value at a certain index&lt;br /&gt;
$(avp(17)[0]) = &amp;quot;zero&amp;quot;;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
The '''AVPOPS''' module provides a lot of useful functions to operate AVPs (like checking values, pushing values into different other locations, deleting AVPs, etc).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[#varpv]]&lt;br /&gt;
!!!Pseudo Variables&lt;br /&gt;
&lt;br /&gt;
'''Naming''': $name&lt;br /&gt;
&lt;br /&gt;
'''Hints''':&lt;br /&gt;
# the PV tokens can be given as parameters to different script functions and they will be replaced with a value before the execution of the function.&lt;br /&gt;
# most of PVs are made available by '''OpenSIPS''' core, but there are also module exporting PV (to make available info specific to that module) - check the modules documentation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Predefined (provided by core) PVs are listed in alphabetical order.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!URI in SIP Request's P-Asserted-Identity header&lt;br /&gt;
&lt;br /&gt;
'''$ai''' - reference to URI in request's P-Asserted-Identity header (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Authentication Digest URI&lt;br /&gt;
&lt;br /&gt;
'''$adu''' - URI from Authorization or Proxy-Authorization header. This URI is used when calculating the HTTP Digest Response.&lt;br /&gt;
&lt;br /&gt;
!!!!Authentication realm&lt;br /&gt;
&lt;br /&gt;
'''$ar''' - realm from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
!!!!Auth username user&lt;br /&gt;
&lt;br /&gt;
'''$au''' - user part of username from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth username domain&lt;br /&gt;
&lt;br /&gt;
'''$ad''' - domain part of username from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth nonce&lt;br /&gt;
&lt;br /&gt;
'''$an''' - the nonce from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth response &lt;br /&gt;
&lt;br /&gt;
'''$auth.resp''' - the authentication response from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth nonce &lt;br /&gt;
&lt;br /&gt;
'''$auth.nonce''' - the nonce string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth opaque&lt;br /&gt;
&lt;br /&gt;
'''$auth.opaque''' - the opaque string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth algorithm&lt;br /&gt;
&lt;br /&gt;
'''$auth.alg''' - the algorithm string from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
!!!!Auth QOP&lt;br /&gt;
&lt;br /&gt;
'''$auth.qop''' - the value of qop parameter from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth nonce count (nc)&lt;br /&gt;
&lt;br /&gt;
'''$auth.nc''' - the value of nonce count parameter from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Auth whole username&lt;br /&gt;
&lt;br /&gt;
'''$aU''' - whole username from Authorization or Proxy-Authorization header&lt;br /&gt;
&lt;br /&gt;
!!!!Acc username&lt;br /&gt;
&lt;br /&gt;
'''$Au''' - username for accounting purposes. It's a selective pseudo variable (inherited from acc module). It returns $au if exits or From username otherwise.&lt;br /&gt;
&lt;br /&gt;
!!!!Argument options&lt;br /&gt;
&lt;br /&gt;
'''$argv''' - provides access to command line arguments specified with '-o' option.&lt;br /&gt;
Examples:&lt;br /&gt;
[@&lt;br /&gt;
   # for option '-o foo=0'&lt;br /&gt;
   xlog(&amp;quot;foo is $argv(foo) \n&amp;quot;);&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!Branch flags&lt;br /&gt;
&lt;br /&gt;
'''$bf''' - displays a list with the branch flags set for the current SIP request&lt;br /&gt;
&lt;br /&gt;
!!!!Branch flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
'''$bF''' - reference to branch flags - hexa output&lt;br /&gt;
&lt;br /&gt;
!!!!Branch&lt;br /&gt;
&lt;br /&gt;
'''$branch''' - this variable is used for creating new branches by writing into it the value of a SIP URI.&lt;br /&gt;
Examples:&lt;br /&gt;
[@&lt;br /&gt;
   # creates a new branch&lt;br /&gt;
   $branch = &amp;quot;sip:new@doamin.org&amp;quot;;&lt;br /&gt;
   # print its URI&lt;br /&gt;
   xlog(&amp;quot;last added branch has URI $(branch(uri)[-1]) \n&amp;quot;);&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!Branch fields&lt;br /&gt;
&lt;br /&gt;
'''$branch()''' - this variable provides read/write access to all fields/attributes of an already existing branch (priorly created with append_branch() ). The fields of the branch are:&lt;br /&gt;
* uri - the RURI of the branch  (string value)&lt;br /&gt;
* duri - destination URI of the branch (outbound proxy of the branch)  (string value)&lt;br /&gt;
* q - q value of the branch (int value)&lt;br /&gt;
* path - the PATH string for this branch (string value)&lt;br /&gt;
* flags - the branch flags of this branch (int value)&lt;br /&gt;
* socket - the local socket to be used for relaying this branch (string value)&lt;br /&gt;
The variable accepts also index '''$(branch(uri)[1])''' for accessing a specific branch (multiple branches can be defined at a moment). The index starts from 0 (first branch). If the index is negative, it is considered the n-th branch from the end ( index -1 means the last branch).\\&lt;br /&gt;
To get all branches, use the * index - $(branch(uri)[*]).\\&lt;br /&gt;
Examples:&lt;br /&gt;
[@&lt;br /&gt;
   # creates the first branch&lt;br /&gt;
   append_branch();&lt;br /&gt;
   # creates the second branch&lt;br /&gt;
   force_send_socket(udp:192.168.1.10:5060);&lt;br /&gt;
   $du = &amp;quot;sip:192.168.2.10&amp;quot;;&lt;br /&gt;
   append_branch(&amp;quot;sip:foo@bar.com&amp;quot;,&amp;quot;0.5&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   # display branches&lt;br /&gt;
   xlog(&amp;quot;----- branch 0: $(branch(uri)[0]) , $(branch(q)[0]), $(branch(duri)[0]), $(branch(path)[0]), $(branch(flags)[0]), $(branch(socket)[0]) \n&amp;quot;);&lt;br /&gt;
   xlog(&amp;quot;----- branch 1: $(branch(uri)[1]) , $(branch(q)[1]), $(branch(duri)[1]), $(branch(path)[1]), $(branch(flags)[1]), $(branch(socket)[1]) \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
   # do some changes over the branches&lt;br /&gt;
   $branch(uri) = &amp;quot;sip:user@domain.ro&amp;quot;;   # set URI for the first branch&lt;br /&gt;
   $(branch(q)[0]) = 1000;  # set to 1.00 for the first branch&lt;br /&gt;
   $(branch(socket)[1]) = NULL;  # reset the socket of the second branch&lt;br /&gt;
   $branch(duri) = NULL;  # reset the destination URI or the first branch&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it from routing logic)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Call-Id&lt;br /&gt;
&lt;br /&gt;
'''$ci''' - reference to body of call-id header&lt;br /&gt;
&lt;br /&gt;
!!!!Content-Length&lt;br /&gt;
&lt;br /&gt;
'''$cl''' - reference to body of content-length header&lt;br /&gt;
&lt;br /&gt;
!!!!CSeq number&lt;br /&gt;
&lt;br /&gt;
'''$cs''' - reference to cseq number from cseq header&lt;br /&gt;
&lt;br /&gt;
!!!!Contact instance&lt;br /&gt;
&lt;br /&gt;
'''$ct''' - reference to contact instance/body from the contact header. A contact instance is  display_name + URI + contact_params. As a Contact header may contain multiple Contact instances and a message may contain multiple Contact headers, an index was added to the $ct variable:&lt;br /&gt;
* $ct -first contact instance from message&lt;br /&gt;
* $(ct[n]) - the n-th contact instance form the beginning of message, starting with index 0&lt;br /&gt;
* $(ct[-n]) - the n-th contact instance form the end of the message, starting with index -1 (the last contact instance)&lt;br /&gt;
&lt;br /&gt;
!!!!Fields of a contact instance&lt;br /&gt;
&lt;br /&gt;
'''$ct.fields()''' - reference to the fields of a contact instance/body (see above). Supported fields are:&lt;br /&gt;
* name - display name&lt;br /&gt;
* uri - contact uri&lt;br /&gt;
* q  - q param (value only)&lt;br /&gt;
* expires - expires param (value only) &lt;br /&gt;
* methods - methods param (value only)&lt;br /&gt;
* received - received param (value only)&lt;br /&gt;
* params - all params (including names)&lt;br /&gt;
&lt;br /&gt;
Examples:&lt;br /&gt;
* $ct.fields(uri) - the URI of the first contact instance&lt;br /&gt;
* $(ct.fields(name)[1]) - the display name of the second contact instance&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Content-Type&lt;br /&gt;
&lt;br /&gt;
'''$cT''' - reference to body of content-type header&lt;br /&gt;
&lt;br /&gt;
!!!!Domain of destination URI&lt;br /&gt;
&lt;br /&gt;
'''$dd''' - reference to domain of destination uri&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it from routing logic)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Diversion header URI&lt;br /&gt;
&lt;br /&gt;
'''$di''' - reference to Diversion header URI&lt;br /&gt;
&lt;br /&gt;
!!!!Diversion &amp;quot;privacy&amp;quot; parameter&lt;br /&gt;
&lt;br /&gt;
'''$dip''' - reference to Diversion header &amp;quot;privacy&amp;quot; parameter value&lt;br /&gt;
&lt;br /&gt;
!!!!Diversion &amp;quot;reason&amp;quot; parameter&lt;br /&gt;
&lt;br /&gt;
'''$dir''' - reference to Diversion header &amp;quot;reason&amp;quot; parameter value&lt;br /&gt;
&lt;br /&gt;
!!!!Port of destination URI&lt;br /&gt;
&lt;br /&gt;
'''$dp''' - reference to port of destination uri&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it from routing logic)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Transport protocol of destination URI&lt;br /&gt;
&lt;br /&gt;
'''$dP''' - reference to transport protocol of destination uri&lt;br /&gt;
&lt;br /&gt;
!!!!Destination set&lt;br /&gt;
&lt;br /&gt;
'''$ds''' - reference to destination set&lt;br /&gt;
&lt;br /&gt;
!!!!Destination URI&lt;br /&gt;
&lt;br /&gt;
'''$du''' - reference to destination uri (outbound proxy to be used for sending the request)&lt;br /&gt;
If loose_route() returns TRUE a destination uri is set according to the first Route header.&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it from routing logic)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Error class&lt;br /&gt;
&lt;br /&gt;
'''$err.class''' - the class of error (now is '1' for parsing errors)&lt;br /&gt;
&lt;br /&gt;
!!!!Error level&lt;br /&gt;
&lt;br /&gt;
'''$err.level''' - severity level for the error&lt;br /&gt;
&lt;br /&gt;
!!!!Error info&lt;br /&gt;
&lt;br /&gt;
'''$err.info''' - text describing the error&lt;br /&gt;
&lt;br /&gt;
!!!!Error reply code&lt;br /&gt;
&lt;br /&gt;
'''$err.rcode''' - recommended reply code&lt;br /&gt;
&lt;br /&gt;
!!!!Error reply reason&lt;br /&gt;
&lt;br /&gt;
'''$err.rreason''' - recommended reply reason phrase&lt;br /&gt;
&lt;br /&gt;
!!!!From URI domain&lt;br /&gt;
&lt;br /&gt;
'''$fd''' - reference to domain in URI of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!From display name&lt;br /&gt;
&lt;br /&gt;
'''$fn''' - reference to display name of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!Forced socket&lt;br /&gt;
&lt;br /&gt;
'''$fs''' - reference to the forced socket for message sending (if any) in the form proto:ip:port&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!From tag&lt;br /&gt;
&lt;br /&gt;
'''$ft''' - reference to tag parameter of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!From URI&lt;br /&gt;
&lt;br /&gt;
'''$fu''' - reference to URI of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!From URI username&lt;br /&gt;
&lt;br /&gt;
'''$fU''' - reference to username in URI of 'From' header&lt;br /&gt;
&lt;br /&gt;
!!!!SIP message buffer&lt;br /&gt;
&lt;br /&gt;
'''$mb''' - reference to SIP message buffer&lt;br /&gt;
&lt;br /&gt;
!!!!Message Flags&lt;br /&gt;
&lt;br /&gt;
'''$mf''' - displays a list with the message/transaction flags set for the current SIP request&lt;br /&gt;
&lt;br /&gt;
!!!!Message Flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
'''$mF''' -reference to message/transaction flags set for current SIP request in hexa&lt;br /&gt;
&lt;br /&gt;
!!!!SIP message ID&lt;br /&gt;
&lt;br /&gt;
'''$mi''' - reference to SIP message id&lt;br /&gt;
&lt;br /&gt;
!!!!SIP message length&lt;br /&gt;
&lt;br /&gt;
'''$ml''' - reference to SIP message length&lt;br /&gt;
&lt;br /&gt;
!!!!Domain in SIP Request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$od''' - reference to domain in request's original R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!Port of SIP request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$op''' - reference to port of original R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!Transport protocol of SIP request original URI&lt;br /&gt;
&lt;br /&gt;
'''$oP''' - reference to transport protocol of original R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!SIP Request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$ou''' - reference to request's original URI&lt;br /&gt;
&lt;br /&gt;
!!!!Username in SIP Request's original URI&lt;br /&gt;
&lt;br /&gt;
'''$oU''' - reference to username in request's original URI&lt;br /&gt;
&lt;br /&gt;
!!!!Route parameter&lt;br /&gt;
'''$param(idx)''' - retrieves the parameters of the route. The index can be an integer, or a pseudo-variable (index starts at 1).\\&lt;br /&gt;
Example:&lt;br /&gt;
[@&lt;br /&gt;
   route {&lt;br /&gt;
      ...&lt;br /&gt;
      $var(debug) = &amp;quot;DBUG:&amp;quot;&lt;br /&gt;
      route(PRINT_VAR, $var(debug), &amp;quot;param value&amp;quot;);&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   route[PRINT_VAR] {&lt;br /&gt;
      $var(index) = 2;&lt;br /&gt;
      xlog(&amp;quot;$param(1): The parameter value is &amp;lt;$param($var(index))&amp;gt;\n&amp;quot;);&lt;br /&gt;
   }&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
!!!!Domain in SIP Request's P-Preferred-Identity header URI&lt;br /&gt;
&lt;br /&gt;
'''$pd''' - reference to domain in request's P-Preferred-Identity header URI (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Display Name in SIP Request's P-Preferred-Identity header&lt;br /&gt;
&lt;br /&gt;
'''$pn''' - reference to Display Name in request's P-Preferred-Identity header (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Process id&lt;br /&gt;
&lt;br /&gt;
'''$pp''' - reference to process id (pid)&lt;br /&gt;
&lt;br /&gt;
!!!!Protocol of received message&lt;br /&gt;
'''$pr''' or '''$proto''' - protocol of received message (UDP, TCP, TLS, SCTP)&lt;br /&gt;
&lt;br /&gt;
!!!!User in SIP Request's P-Preferred-Identity header URI&lt;br /&gt;
&lt;br /&gt;
'''$pU''' - reference to user in request's P-Preferred-Identity header URI (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!URI in SIP Request's P-Preferred-Identity header&lt;br /&gt;
&lt;br /&gt;
'''$pu''' - reference to URI in request's P-Preferred-Identity header (see RFC 3325)&lt;br /&gt;
&lt;br /&gt;
!!!!Domain in SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$rd''' - reference to domain in request's URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Body of request/reply&lt;br /&gt;
&lt;br /&gt;
'''$rb''' - reference to message body&lt;br /&gt;
&lt;br /&gt;
!!!!Returned code&lt;br /&gt;
&lt;br /&gt;
'''$rc''' - reference to returned code by last invoked function&lt;br /&gt;
&lt;br /&gt;
'''$retcode''' - same as **$rc**&lt;br /&gt;
&lt;br /&gt;
!!!!Remote-Party-ID header URI&lt;br /&gt;
&lt;br /&gt;
'''$re''' - reference to Remote-Party-ID header URI&lt;br /&gt;
&lt;br /&gt;
!!!!SIP request's method&lt;br /&gt;
&lt;br /&gt;
'''$rm''' - reference to request's method&lt;br /&gt;
&lt;br /&gt;
!!!!SIP request's port&lt;br /&gt;
&lt;br /&gt;
'''$rp''' - reference to port of R-URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Transport protocol of SIP request URI&lt;br /&gt;
&lt;br /&gt;
'''$rP''' - reference to transport protocol of R-URI&lt;br /&gt;
&lt;br /&gt;
!!!!SIP reply's reason&lt;br /&gt;
&lt;br /&gt;
'''$rr''' - reference to reply's reason&lt;br /&gt;
&lt;br /&gt;
!!!!SIP reply's status&lt;br /&gt;
&lt;br /&gt;
'''$rs''' - reference to reply's status&lt;br /&gt;
&lt;br /&gt;
!!!!Refer-to URI&lt;br /&gt;
&lt;br /&gt;
'''$rt''' - reference to URI of refer-to header&lt;br /&gt;
&lt;br /&gt;
!!!!SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$ru''' - reference to request's URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Username in SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$rU''' - reference to username in request's URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Q value of the SIP Request's URI&lt;br /&gt;
&lt;br /&gt;
'''$ru_q''' - reference to q value of the R-URI&lt;br /&gt;
&lt;br /&gt;
%red%It is R/W variable (you can assign values to it routing script)%%&lt;br /&gt;
&lt;br /&gt;
!!!!Received IP address&lt;br /&gt;
&lt;br /&gt;
'''$Ri''' - reference to IP address of the interface where the request has been received&lt;br /&gt;
&lt;br /&gt;
!!!!Received port&lt;br /&gt;
&lt;br /&gt;
'''$Rp''' - reference to the port where the message was received&lt;br /&gt;
&lt;br /&gt;
!!!!Script flags&lt;br /&gt;
&lt;br /&gt;
'''$sf''' - displays a list with the script flags set for the current SIP request&lt;br /&gt;
&lt;br /&gt;
!!!!Script flags (hexadecimal) %red%(Removed in OpenSIPS 1.9)%%&lt;br /&gt;
&lt;br /&gt;
'''$sF''' - reference to script flags - hexa output&lt;br /&gt;
&lt;br /&gt;
!!!!IP source address&lt;br /&gt;
&lt;br /&gt;
'''$si''' - reference to IP source address of the message&lt;br /&gt;
&lt;br /&gt;
!!!!Source port&lt;br /&gt;
&lt;br /&gt;
'''$sp''' - reference to the source port of the message&lt;br /&gt;
&lt;br /&gt;
!!!!To URI Domain&lt;br /&gt;
&lt;br /&gt;
'''$td''' - reference to domain in URI of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To display name&lt;br /&gt;
&lt;br /&gt;
'''$tn''' - reference to display name of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To tag&lt;br /&gt;
&lt;br /&gt;
'''$tt''' - reference to tag parameter of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To URI&lt;br /&gt;
&lt;br /&gt;
'''$tu''' - reference to URI of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!To URI Username&lt;br /&gt;
&lt;br /&gt;
'''$tU''' - reference to username in URI of 'To' header&lt;br /&gt;
&lt;br /&gt;
!!!!Formatted date and time&lt;br /&gt;
&lt;br /&gt;
'''$time(format)''' - returns the string formatted time according to UNIX date (see: '''man date''').&lt;br /&gt;
&lt;br /&gt;
!!!!Branch index&lt;br /&gt;
&lt;br /&gt;
'''$T_branch_idx''' - the index (starting with 1 for the first branch) of the branch for which is executed the branch_route[]. If used outside of branch_route[] block, the value is '0'. This is exported by TM module.&lt;br /&gt;
&lt;br /&gt;
!!!!String formatted time&lt;br /&gt;
&lt;br /&gt;
'''$Tf''' - reference string formatted time&lt;br /&gt;
&lt;br /&gt;
!!!!Current unix time stamp in seconds&lt;br /&gt;
&lt;br /&gt;
'''$Ts''' - reference to current unix time stamp in seconds&lt;br /&gt;
&lt;br /&gt;
!!!!Current microseconds of the current second&lt;br /&gt;
&lt;br /&gt;
'''$Tsm''' - reference to current microseconds of the current second&lt;br /&gt;
&lt;br /&gt;
!!!!Startup unix time stamp&lt;br /&gt;
&lt;br /&gt;
'''$TS''' - reference to startup unix time stamp&lt;br /&gt;
&lt;br /&gt;
!!!!User agent header&lt;br /&gt;
&lt;br /&gt;
'''$ua''' - reference to user agent header field&lt;br /&gt;
&lt;br /&gt;
!!!!SIP Headers&lt;br /&gt;
&lt;br /&gt;
'''$(hdr(name)[N])''' - represents the body of the N-th header identified by 'name'. If [N] is omitted then the body of the first header is printed. The first header is got when N=0, for the second N=1, a.s.o. To print the last header of that type, use -1, no other negative values are supported now. No white spaces are allowed inside the specifier (before }, before or after {, [, ] symbols). When N='*', all headers of that type are printed.&lt;br /&gt;
&lt;br /&gt;
The module should identify most of compact header names (the ones recognized by '''OpenSIPS''' which should be all at this moment), if not, the compact form has to be specified explicitly. It is recommended to use dedicated specifiers for headers (e.g., %ua for user agent header), if they are available -- they are faster.&lt;br /&gt;
&lt;br /&gt;
'''$(hdrcnt(name))''' -- returns number of headers of type given by 'name'. Uses same rules for specifying header names as '''$hdr(name)''' above. Many headers (e.g., Via, Path, Record-Route) may appear more than once in the message. This variable returns the number of headers of a given type. &lt;br /&gt;
&lt;br /&gt;
Note that some headers (e.g., Path) may be joined together with commas and appear as a single header line. This variable counts the number of header lines, not header values. &lt;br /&gt;
&lt;br /&gt;
For message fragment below, '''$hdrcnt(Path)''' will have value 2 and '''$(hdr(Path)[0])''' will have value '''&amp;lt;a.com&amp;gt;''':&lt;br /&gt;
[@&lt;br /&gt;
    Path: &amp;lt;a.com&amp;gt;&lt;br /&gt;
    Path: &amp;lt;b.com&amp;gt;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
For message fragment below, '''$hdrcnt(Path)''' will have value 1 and '''$(hdr(Path)[0])''' will have value '''&amp;lt;a.com&amp;gt;,&amp;lt;b.com&amp;gt;''':&lt;br /&gt;
[@&lt;br /&gt;
    Path: &amp;lt;a.com&amp;gt;,&amp;lt;b.com&amp;gt;&lt;br /&gt;
@]&lt;br /&gt;
&lt;br /&gt;
Note that both examples above are semantically equivalent but the variables take on different values.&lt;br /&gt;
&lt;br /&gt;
[[#varavps]]&lt;br /&gt;
&lt;br /&gt;
!!!Escape Sequences&lt;br /&gt;
&lt;br /&gt;
These sequences are exported, and mainly used, by xlog module to print messages in many colors (foreground and background) using escape sequences. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Foreground and background colors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$C(xy) - reference to an escape sequence. ¿x¿ represents the foreground color and ¿y¿ represents the background color.&lt;br /&gt;
&lt;br /&gt;
Colors could be:&lt;br /&gt;
&lt;br /&gt;
* x : default color of the terminal&lt;br /&gt;
* s : Black&lt;br /&gt;
* r : Red&lt;br /&gt;
* g : Green&lt;br /&gt;
* y : Yellow&lt;br /&gt;
* b : Blue&lt;br /&gt;
* p : Purple&lt;br /&gt;
* c : Cyan&lt;br /&gt;
* w : White &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!!!!Examples&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A few examples of usage.&lt;br /&gt;
&lt;br /&gt;
[@&lt;br /&gt;
...&lt;br /&gt;
route {&lt;br /&gt;
...&lt;br /&gt;
    $avp(uuid)=&amp;quot;caller_id&amp;quot;;&lt;br /&gt;
    $avp(tmp)= $avp(uuid) + &amp;quot;: &amp;quot; + $fu;&lt;br /&gt;
    xdbg(&amp;quot;$(C(bg))avp(tmp)$(C(xx)) [$avp(tmp)] $(C(br))cseq$(C(xx))=[$hdr(cseq)]\n&amp;quot;);&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
@]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
</feed>