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.
