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