Scripting Flags

De opensipsbrasil - wiki
Ir para navegação Ir para pesquisar

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 transação
  • 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
  • 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


Funções correspondentes

Apartir do OpenSIPS 1.9 flgas podem receber valores alphanumericos.


Flags de Mensagem/Transação

  • setflag(flag_idx)
  • resetflag(flag_idx)
  • isflagset(flag_idx)

Exemplos: setflag(accounting), resetflag(DO_NAT) ou setflag(19)

Branch flags

  • setbflag/setbranchflag(branch_idx,flag_idx)
  • resetbflag/resetbranchflag(branch_idx,flag_idx)
  • isbflagset/isbranchflagset(branch_idx,flag_idx)


ou em formato reduzido, para a branch default (branch 0)

  • setbflag(flag_idx)
  • resetbflag(flag_idx)
  • isbflagset(flag_idx)


Script flags

  • setsflag/setscriptflag(flag_idx)
  • resetsflag/resetscriptflag(flag_idx)
  • issflagset/isscriptflagset(flag_idx)


Flags and Pseudo Variables

Message/transaction flags

$mf - Apenas Leitura; retorna uma lista de flags

Branch flags

$bf - Apenas Leitura; Retorna uma lista de flags (para a branch)

Script flags

$sf - Apenas leitura; Retorna uma lista de flags (para o script )


Flags and routes

Message/transaction flags

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.


!!!! Branch flags

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.

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.

Script flags

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.


Exemplo

Manipulação de flag de NAT

 ..........
 # 3 - the nat flag
 modparam("usrloc", "nat_bflag", "NAT_BFLAG")
 ..........
 
 route {
   ..........
   if (nat detected)
      setbflag(NAT_BFLAG); # set branch flag 3 for the branch 0

   ..........
   if (is_method("REGISTER")) {
      # the branch flags (including 3) will be saved into location
      save("location");
      exit;
   } else {
      # lookup will load the branch flag from location
      if (!lookup("location")) {
         sl_send_reply("404","Not Found");
         exit;
      }
      t_on_branch("1")
      t_relay();
   }
 }
 
 branch_route[1] {
   xlog("-------branch=$T_branch_idx, branch flags=$bF\n");
   if (isbflagset(NAT_BFLAG)) {
      #current branch is marked as natted
      .........
   }
 }

Se nao houver forking paralelo você pode ficar livre de aplicar a branch_route e adicionar uma t_on_branch()

  ........
  if (isbflagset(NAT_BFLAG)) {
     #current branch is marked as natted
     .........
  }
  ......... 


Voltar