Tuesday, July 19, 2011

Ligação por senha no Asterisk

Umas das solicitações que já recebi de clientes era poder controlar a saida pela rota com as operadoras através de senhas, sendo definido duas senhas para cada usuário: profissional e pessoal.
Existem várias formas de se fazer isso, formas mais e menos elaboradas. Eu vou mostrar aqui uma forma bastante simples usando AstDB.
Esse tipo de funcionalidade dá apenas uma idéia do poder que Asterisk possui com seu extensions.conf. Basicamente, toda a configuração para que funcione essa funcionalidade é feita nesse arquivo.
Para quem já trabalhou com PABX proprietário, especificamente, Leucotron, essa funcionalidade é equivalente ao Sentinela, com a diferença de não custar uma pequena fortuna, como aliais e quase tudo relacionado a PABX proprietário:

Vamos ao que interessa:

Em nosso extensions.conf, vamos definir um context para que o usuário possa definir uma senha, sem precisar da intervenção do Administrador.

Ficaria assim nosso context, cada linha segue de uma explicação. A exigencia seria que o usuário discasse uma senha seguido de seu ramal :

[senha]

exten => _*55XXXXXXXX,1,NoCDR()
Para nao gerar bilhetes

exten => _*55XXXXXXXX,2,Set(senha=${DB(pass/${EXTEN:3:4})});
Associa o valor 'senha' a familia pass e chave 'ramal'

exten => _*55XXXXXXXX,3,GoToIf($["${senha}" = ""]?5:4)
Verifica se o valor da'senha' nao seja vazio,caso esteja, aplica hangup

exten => _*55XXXXXXXX,4,Hangup
Hangup


exten => _*55XXXXXXXX,5,Set(DB(pass/${EXTEN:3:4})=${EXTEN:7:11})
Associa à 'senha' o valor discado em XXXX,entre o 4ª e 7ª digitos, eliminando o codigo *55 e associa os ultimos 4 digitos ao valor ramal

exten => _*55XXXXXXXX,6,Wait(2)
Aguarda 2 segundos

exten => _*55XXXXXXXX,7,Playback(beep) ;##
Toca um bip

exten => _*55XXXXXXXX,8,Playback(beep)
Toca um bip

exten =&g t; _*55XXXXXXXX,9,Playback(beep)
Toca um bip


exten => _*55XXXXXXXX,10,Hangup
;## Hangup


OK. Com isso já podemos cadastrar as senhas que ficarão armazenadas no AstDB.

Vamos agora definir um context para usar a senha nas discagem de números externos:

O nome do context é irrelevante,pode ser o que você quiser.

exten => _*56XXXX,1,Noop

;não faz nada

exten => _*56XXXX,2,Set(CHANNEL(language)=pt_BR)
Seta o Channel com pt_BR

exten => _*56XXXX,3,Set(var=${DB(pass/${EXTEN:3})})
Associa o valor discado a uma variável que estou chamando de var.

É preciso entender a dinâmica do AstDB para poder compreender mais facilmente o que ocorre nessas linhas. AstDB trabalha com a estrutura (family/key)=value
Em nosso caso, var está sendo associado a estrutura (family/key), ou seja, ele vai representar nossa senha.


exten => _*56XXXX,4,Set(cadp=${DB_EXISTS(cadepwd/${EXTEN:3})})
; Aqui usamos um recurso do AstDB em que um valor é testado para verificar sua existencia, caso a senha digitada corresponda a um valor previamente guardado no AstDB, iremos para o próximo passo.

exten => _*56XXXX,5,GoToIf($["${cadp}" = "1"]?6:7)

DB_EXISTS retorna 1 se verdadeiro e 0 se falso. Ou seja, se verdadeiro, se a senha corresponde a um valor previamente armazenado, iremos para a prioridade 6, se não, iremos para prioridade 7.


exten => _*56XXXX,6,DISA(no-password,Tarifador)

Na prioridade 6 temos a função DISA, que aqui não fará nada a mais que disponibilizar tom de discagem para aqueles cuja a senha foi aceita.

exten => _*56XXXX,7,Playback(no-rights)
Caso a senha discada não tenha sido aceita e o usuário foi enviado a prioridade 7, ele ouvirá a mensagem "Voce não tem privilegio para acesso a rota sainte".

exten => _*56XXXX,8,Hangup


É isso ai, implementação muito simples, alguns dizem até que AstDB é gambiarra, mas funciona e para quem ainda não está habituado com MySQL, é uma boa opção.

No comments:

Post a Comment