Transformações
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.
Exemplo utilizando diferentes tipos de variáveis em no script OpenSIPS
# verificando se o usuário no cabeçalho From é igual ao usuário no cabeçalho To if($fU==$tU) { ... } # checagem de usuário baseado em r-uri switch($ruri.user) { case "1234": ... break; case "5678": ... break; default: ... } # definindo um valor inteiro para um AVP $avp(i:11) = 1; # definindo um valor de texto (string) para um AVP $avp(i:22) = "opensips"; # Definir o valor de $ruri para um avp $avp(i:33) = $ruri; # concatenando "sip:" + usuário no From + "@" + dominio no To na variável x $var(x) = "sip:" + $fU +"@" + $td;
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).
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 ')' .
Exemplo:
# o tamanho do From URI ( $fu é uma pseudo-variável para From URI) $(fu{s.len})
Muitas transformações podem ser aplicadas ao mesmo tempo na mesma variável.
# O tamanho do cabeçalho 'Test' (escapado) . $(hdr(Test){s.escape.common}{s.len})
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.
Para aprender que variável pode ser utilizada com transformações veja [Variáveis Core]
Índice
- 1 Transformação de string
- 1.1 {s.len}
- 1.2 {s.int}
- 1.3 {s.md5}
- 1.4 {s.substr,offset,length}
- 1.5 {s.select,index,separator}
- 1.6 {s.encode.hexa}
- 1.7 {s.decode.hexa}
- 1.8 {s.escape.common}
- 1.9 {s.unescape.common}
- 1.10 {s.escape.user}
- 1.11 {s.unescape.user}
- 1.12 {s.escape.param}
- 1.13 {s.unescape.param}
- 1.14 {s.tolower}
- 1.15 {s.toupper}
- 2 URI Transformations
- 3 VIA Transformations
- 4 Parameters List Transformations
- 5 Name-address Transformations
- 6 IP Transformations
- 7 CSV Transformations
Transformação de string
O nome destas trasnformações iniciam com 's.' , são utilizadas para aplicar operações de string nas variáveis.
Transformações disponiveis nesta classe:
{s.len}
Retorna o tamanho do valor de uma variável
$var(x) = "abc"; if($(var(x){s.len}) == 3) { ... }
{s.int}
Retorna o valor inteiro de uma string númerica.
$var(x) = "1234"; if($(var(x){s.int})==1234) { ... }
{s.md5}
Retorna o md5 do valor da variável
xlog("MD4 over From username: $(fU{s.md5})");
{s.substr,offset,length}
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.
Example:
$var(x) = "abcd"; $(var(x){s.substr,1,0}) = "bcd"
{s.select,index,separator}
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.
Exemplo:
$var(x) = "12,34,56"; $(var(x){s.select,1,,}) => "34" ; $var(x) = "12,34,56"; $(var(x){s.select,-2,,}) => "34"
{s.encode.hexa}
Retorna o valor da variável em hexa.
{s.decode.hexa}
Decodifica o valor hexa da variável.
{s.escape.common}
Retorna a string scapada do valor da variável. Caracteres escapados são ', ", 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 )
{s.unescape.common}
Retorna o valor sem escape de uma variável, o inverso da transformação acima.
{s.escape.user}
Retorna o valor escapado da variavel, alterando para '%hexa' os caracteres nao permitidos na area SIP URI seguindos as recomendações da RFC.
{s.unescape.user}
Retorna o valor sem escape da variável, alterando de '%hexa' para caracter, o inverso da transformação acima.
{s.escape.param}
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.
{s.unescape.param}
Retorna o valor sem escape da variavel alterando de '%hexa' para caractere, inverso da transformação acima.
{s.tolower}
Retorna a string em lower case (caixa baixa)
{s.toupper}
Retorna a string em upper case (caixa alta)
URI Transformations
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.
Transformações disponiveis nesta classe:
{uri.user}
Retorna o usuário no schema URI
{uri.host}
(mesmo que {uri.domain})
Retorna a parte do dominio no schema URI.
{uri.passwd}
Retorna a parte da senha no schema URI.
{uri.port}
Retorna a parte da porta no schema URI.
{uri.params}
Retorna todos os parametros da URI em uma única string.
{uri.param,name}
Retorna o valor do parametro da URI com nome de "name"
{uri.headers}
Retorna os cabeçalhos URI
{uri.transport}
Retorna o valor do parametro transport da URI.
{uri.ttl}
Retorna o valor do parametro TTL da URI.
{uri.uparam}
Retorna o valor do parametro user da URI.
{uri.maddr}
Retorna o valor do parametro maddr da URI.
{uri.method}
Retorna o valor do parametro metodo da URI.
{uri.lr}
Retorna o valor do parametro lr da URI.
{uri.r2}
Retorna o valor do parametro r2 da URI.
VIA Transformations
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).
Exemplos:
$var(upstreamtransport) = $(hdr(Via)[1]{via.transport}{s.tolower}); $var(upstreamip) = $(hdr(Via)[1]{via.param,received}); $var(clientport) = $(hdr(Via)[-1]{via.param,rport});
Transformações disponíveis nesta classe:
{via.name}
Retorna o @@protocol-name@@ ( RFC3261 BNF ), geralmente @@SIP@@.
{via.version}
Retorna o @@protocol-version@@ ( RFC3261 BNF ), geralmente @@2.0@@.
{via.transport}
Retorna o @@transport@@ ( RFC3261 BNF ), ex: @@UDP@@, @@TCP@@, @@TLS@@. Este é o protocolo de transporte utilizado para enviar a mensagem.
{via.host}
(mesmo que @@{via.domain}@@)
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.
{via.port}
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.
{via.comment}
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.
{via.params}
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.
{via.param,name}
Retorna o valor do parametro do cabeçalho Via especificado por @@name@@. Tipicamente parametros incluem @@branch@@, @@rport@@ e @@received@@.
{via.branch}
Retorna o valor do parametro branch no cabeçalho VIA.
{via.received}
Retorna o valor do parametro received no cabeçalho Via , se existir.
{via.rport}
Retorna o valor do parametro rport no cabeçalho VIA, se existir.
Parameters List Transformations
O nome da transformação inicia por "param." . O valor da variavel é considerado uma string como nome1=valor1; nome2=valor2;..." . A transformação retorna o valor de um parametro especifico ou o nome do parametro especificado no indice.
Transformações disponiveis nesta classe:
{param.value,name}
Retorna o valor do parametro 'name'
Exemplo:
"a=1;b=2;c=3"{param.value,c} = "3"
O valor de 'name' pode ser uma variável.
{param.exist,name}
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.
Exemplo:
"a=0;b=2;ob;c=3"{param.exist,ob}; # returns 1 "a=0;b=2;ob;c=3"{param.exist,a}; # returns 1 "a=0;b=2;ob;c=3"{param.exist,foo}; # returns 0
{param.valueat,index}
Retorna o valor do parametro na posição fornecida por 'index' (0-based index)
"a=1;b=2;c=3"{param.valueat,1} = "2"
'index' pode ser uma variável
{param.name,index}
Retorna o nome do parametro na posição 'index'.
Exemplo:
"a=1;b=2;c=3"{param.name,1} = "b"
{param.count}
Retorna o número de parametros na lista.
Exemplo:
"a=1;b=2;c=3"{param.count} = 3
Name-address Transformations
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.
Transformações disponiveis para esta classe:
{nameaddr.name}
Retorna o valor de display name
Exemplo:
'"test" <sip:test@opensips.org>' {nameaddr.name} = "test"
{nameaddr.uri}
Retorna o valor da URI
Exemplo:
'"test" <sip:test@opensips.org>' {nameaddr.uri} = sip:test@opensips.org
{nameaddr.len}
Retorna o tamanho da name-addr
{nameaddr.param,param_name}
Retorna o valor do parametro com o nome 'param_name'.
Exemplo:
'"test" <sip:test@opensips.org>;tag=dat43h' {nameaddr.param,tag} = dat43h
{nameaddr.params}
Retorna os parametros e seus valores correspondentes.
Exemplo:
'"test" <sip:test@opensips.org>;tag=dat43h;private=yes' {nameaddr.params} = "tag=dat43h;private=yes"
IP Transformations
O nome da transformação inicia com 'ip.'
Transformações disponiveis para esta classe:
{ip.pton}
Retorna a representação binária do IP
Exemplo:
"192.168.2.134" {ip.pton} returns a 4 byte binary representation of the IP provided
{ip.ntop}
Retorna a representação de um binário de IP
Exemplo:
"192.168.2.134"{ip.pton}{ip.ntop} = "192.168.2.134"
{ip.isip}
Retorna 1 ou 0, se a string provida for um ip válido ou não.
Exemplo:
"192.168.2.134" {ip.isip} = 1 "192.168.2.134.1" {ip.isip} = 0
{ip.family}
Retorna INET ou INET6 se a representação binária provida for um IPv4 ou IPv6.
Exemplo:
"192.168.2.134" {ip.pton}{ip.family} = "INET"
{ip.resolve}
Retorna o IP de um host.dominio informado. a transformação não tem efeito se um IP for forncido.
Exemplo:
"opensips.org" {ip.resolve} = "78.46.64.50"
CSV Transformations
O nome da transformação inicia com "csv." . O valor da variável é considerado ser uma string como "campo1,campo2,....". A transformação retorna o numero de entradas no CSV informado, ou o campo de uma posição especifica do CSV.
Tranformações disponiveis nesta classe:
{csv.count}
Returns the number of entries in the provided CSV. Example: [@ "a,b,c" {csv.count} = 3 @]
!!!!{csv.value} Returns the entry at the specified positions. Indexing starts from 0. Example: [@ "a,b,c" {csv.value,2} = c @]
!!!SDP Transformations
The name of the transformation starts with "sdp.". The value of the variable is considered to be a valid SDP body. The transformation returns a specific line in the SDP body.
Available transformations in this class:
!!!!{sdp.line} 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. Example: [@ if (is_method("INVITE"))
{ $var(aline) = $(rb{sdp.line,a,1}); xlog("The second a line in the SDP body is $var(aline)\n"); }
if (is_method("INVITE"))
{ $var(mline) = $(rb{sdp.line,m}); xlog("The first m line in the SDP body is $var(mline)\n"); }
@]
!!!Regular Expression Transformations
The name of the transformation starts with "re.". The input can be any string.
!!!!{re.subst,reg_exp}
The reg_exp parameter can either be a plain string or a variable. The format of the reg_exp is :
/posix_match_expression/replacement_expression/flags
The flags can be
i - match ignore case s - match within multi-lines strings g - replace all matches
Example: [@ $var(reg_input)="abc"; $var(reg) = "/a/A/g"; xlog("Applying reg exp $var(reg) to $var(reg_input) : $(var(reg_input){re.subst,$var(reg)})\n");
... ... xlog("Applying reg /b/B/g to $var(reg_input) : $(var(reg_input){re.subst,/b/B/g})\n"); @]
!!!Examples
Within a variable, many transformation can be applied, being executed from left to right.
- The length of the value of parameter at postion 1 (remember 0 is first position, 1 is second position)
[@ $var(x) = "a=1;b=22;c=333"; $(var(x){param.value,$(var(x){param.name,1})}{s.len}) = 2 @]
- Test if whether is un-registration or not
[@ if(is_method("REGISTER") && is_present_hf("Expires") && $(hdr(Expires){s.int})==0)
xlog("This is an un-registrationn");
@]