Posts Tagged ‘dica’

Tuneis SSH

Thursday, June 3rd, 2010

Eu também acho.

SSH é uma das coisas mais lindas em sistemas UNIX-like. Mas o SSH é ainda mais lindo se executado com as opções -D e -L. Imaginem o seguinte caso: você está em uma rede quase que completamente bloqueada só lhe sobra uma porta 22 pra acesso ssh remoto em um servidor que você paga em uma vps ou melhor ainda quando a sua universidade lhe fornece acesso ssh a alguma maquina gratuitamente. Agora imaginem que vocês precisam ver aquele vídeo de um fã do restart sendo trucidado por um rinoceronte endiabrado. Há solução, uma solução segura e livre de proxys afegãos suspeitos. Os tuneis ssh podem salvar sua vida.

Como? fazendo com que sua conexão seja protegida e criptografada até a maquina da qual você tenha acesso ssh e de lá você saia para web sem restrições de firewalls facistas. A magica é feita por um comando simples e nenhum tipo de acesso administrativo em qualquer uma das maquinas é necessário:

 $ ssh -D 3000 guax@freedom -N -f

O que esse comando faz é um tunel ssh do tipo dinâmico (-D) que gera um proxy SOCKS 5 na porta 3000 da sua maquina o -N diz que você não quer abrir o shell do ssh da outra maquina e o -f diz que você quer o tunel executando em background. Então no firefox ou browser que suporte.

Passos para configurar no Firefox

Agora vamos a um problema menos subversivo. Você precisa acessar a porta 80 de algum ip que está escondido em uma rede do cliente, geralmente para configurar um ATA, router e outros equipamentos com configuração web. Se você tem acesso a um firewall ou outra maquina que enxergue as duas redes basta usar o seguinte comando.

 $ ssh -L 3000:192.168.10.100:80 guax@cliente

E voila. Basta apontar seu browser para localhost:3000. Sem configurar proxy nem nada. =)

Referências

$ man ssh

Nota: Bilhetagem e CDR

Sunday, March 21st, 2010

Comecei a brincar novamente com CDR, estava esboçando um daemon para acompanhar o fluxo das ligações e percebi que o buraco é mais embaixo. Explico:

Uma ligação com transferência.

A é uma ligação vinda da PSTN e é direcionada para B que é um ramal interno. B transfere a ligação para C, outro ramal interno. A fala com B durante 2 minutos, o tempo de atendimento foi de 10 segundos sendo no total 2:10 minutos de ligação. A fala com C por outros 2 minutos e espera 10 segundos também para ser atendido (transferência cega). Temos um total de 4:20 de ligação e 4:00 de conversação.

Até ai tudo bem, só que esses 4 minutos não são o tempo pelo qual A foi bilhetado. Ele foi cobrado por 4:10 de ligação já que somente os primeiros 10 segundos de chamada o canal dele estava em estado não atendido. Essa conta fica mais maluca de ser extraída do CDR do Asterisk se considerar que num sistema de produção de médio porte temos transferências feitas pelo originador, transferências para PSTN e cadeias intermináveis de transbordo em filas e grupos de ramais.

Múltiplas tarifações na mesma ligação são possíveis em conferências por exemplo onde geralmente liga-se para o cliente e transfere para a sala de conferência. Nesse caso todos os canais devem ser tarifados e não somente uma vez o tempo da ligação.

Asterisk Trick nº 3: Usando Read para URA’s

Tuesday, March 16th, 2010

URA’s (IVR em inglês) são muito comuns em ambientes com Asterisk. E são normalmente construídas usando a aplicação WaitExten e vários contextos para controle do fluxo. A aplicação WaitExten recebe uma entrada vinda do usuário via DTMF e direciona para a extensão correspondente a essa entrada. Essa não é a melhor abordagem por não permitir uma forma fácil de validar a entrada do usuário e de manter consistência no desvio do fluxo da aplicação. Contextos são legais mas se usados sem moderação você acaba com um nível de complexidade tão grande dentro do seu Dialplan que torna a tarefa de debugar e manter o código algo homérico. Lembre-se que uma URA geralmente é um bloco de código que dificilmente será separado ou usado em partes, se sua URA for complexa o suficiente para isso você precisa de uma reavaliação mental antes de arquitetar o sistema telefônico que seus clientes e usuários terão que passar antes de serem atendidos. Afinal pessoas usam o telefone para falar com pessoas, mas esse é papo para outro post.

Veja um bom exemplo de como usar o Read para ler um digito do usuário:

exten => _XX.,1,Wait(2)
exten => _XX.,n,Read(OPCAO,bem_vindo_menu,1,,,4)
exten => _XX.,n,GotoIf($["${OPCAO}"!=""]?executa)
exten => _XX.,n,Set(OPCAO=0)
exten => _XX.,n(executa),Goto(${OPCAO},1)

A idéia aqui é poder mexer com a entrada do usuário a vontade, sem ter que ser redirecionado para algum lugar logo após alterar o EXTEN ou sem ter que ficar copiando o EXTEN após o waitexten.

Asterisk Tricks nº 2: Arquivos de Som

Monday, March 15th, 2010

Dica do guax para o Asterisk segunda edição. Como colocar aquivos de som no formato WAV que o Asterisk consegue entender e tocar.

O Asterisk só consegue tocar arquivos no Playback, Read e outras aplicações do tipo que tenham as seguintes caracteristicas:

Channels       : 1
Sample Rate    : 8000
Precision      : 16-bit
Sample Encoding: 16-bit Signed Integer PCM

Ou seja, 8khz mono 16-bit Signed Integer PCM. Para converter um audio de outro formato para esse vamos usar a aplicação sox. O comando é basicamente:

$ sox arquivo_origem.wav -r 8000 -c 1 -e signed-integer -b 16 arquivo_destino_convertido.wav

O que cada parâmetro desses faz é:

  • -r 8000 Muda a freqüência para 8khz
  • -c 1 Converte para mono (1 canal)
  • -e signed-integer Muda o encoding para PCM signed
  • -b 16 Em conjunto com o de cima faz com que o PCM seja 16 bits.

Pronto, agora esse arquivo já pode ser colocado no seu /var/lib/asterisk/sounds/ e ser tocado normalmente. :)

Asterisk Trick nº 1: GotoIf

Monday, March 15th, 2010

Dica do dia para o Asterisk. A aplicação GotoIf tem uma sintaxe que pode ser considerada pegadinha de newbie. Veja:

exten => _X.,1,GotoIf($["${VARIAVEL}"=""]?labeltrue:labelfalse)
exten => _X.,n(labeltrue),Noop(Acao a ser executada caso true)
exten => _X.,n(labelfalse),Noop(Acao a ser executada caso false)

Observe que é muito parecido com um operador ternário da maioria das linguagens de programação. Dicas:

  1. Não coloque nenhum espaço separando as condicionais, ? e : do contrário ele não lerá “labeltrue” mas “(ESPAÇO)labeltrue(ESPAÇO)”
  2. Em nenhuma hipotese coloque a variavel sem as ” (aspas duplas) caso a variável seja nula ou não definida você ganha um erro do interpretador e não será levado ao labelfalse
  3. Perceba que $[] delimita que ali está ocorrendo uma comparação ou qualquer operação que retornará 1 ou 0, true ou false.
  4. No lugar das labels “labeltrue” e “labelfalse” você pode colocar o índice da prioridade sem problema nenhum, nesse caso 2 e 3 respectivamente. Eu prefiro usar label já que ela move junto com minhas edições. E é bem mais legível.

Dica adicional: “Sempre escreva seu código como se o cara que vai dar manutenção é um maníaco homicida que sabe onde você mora” – Dicas do Visual Studio