quarta-feira, 31 de julho de 2013

[Luto] Evandro Nunes, CCIE Voice #39680

O post de hoje não é sobre o CCIE, nem sobre tecnologia, nem nada disso... É sobre algo muito mais importante do que isso tudo. É um post sobre a vida.

Recebi hoje uma notícia muito triste. Era sobre o falecimento do recém CCIE Voice Evandro Nunes.

O Evandro foi aprovado na prova não tem nem um mês. O seu relato foi recentemente publicado no blog da IP Expert. Ele ainda devia estar vivendo um sonho, o alívio de ter passado nesse exame e conquistado a certificação. Imagino o quanto ele batalhou para concluir esse que talvez fosse o seu último desafio.

Infelizmente não o conheci, mas recebi a notícia com um baque como se fosse meu brother de anos. Talvez o fato de estarmos todos nesse mesmo barco nos aproximam de uma forma quase familiar... Conheço pessoas que o conheceram, que inclusive falaram com ele ontem, e só me dizem coisas boas sobre esse cara. Batalhador, solidário, alegre, estava ajudando muita gente a conquistar o sonho do CCIE! Realmente uma pena termos perdido esse talento.

Deixo aqui as minhas sinceras homenagens a esse cara que realmente correu atrás dos seus objetivos, e que deve servir de inspiração para a galera que está atrás do CCIE.

Descanse em paz, Evandro.


domingo, 28 de julho de 2013

UCCX - Integração com o CUCM

Reparei que nunca fiz nenhum post sobre UCCX no Blog. Falha minha, pois é um tópico que tem muito a ser explorado! Posso cometer um engano ao dizer isso, mas na prova geralmente a integração já vem pronta. Isso não quer dizer que você não precisa saber fazer!!! Pelo contrário, como sabemos, você deve desconfiar de tudo que já vem pronto para você. Então, nesse primeiro post sobre UCCX abordarei sobre a integração com o CUCM, para então poder entrar em outros pontos como configurações de fila e scripts em posts futuros.

Quando terminamos de instalar o CCX pela primeira vez (lembrando que estamos falando aqui da versão 7.0, embora na 8.x não mude tanta coisa, apesar de virar um sistema baseado em Linux), a primeira coisa a fazer é ingressar na sua página de configuração WEB (http://x.x.x.x/appadmin). O usuário inicial é Administrator, e senha ciscocisco. Feito isso, seguiremos os passos abaixo:

1. Escolha o seu tipo de deployment. No caso da prova, utilizaremos o Single Node. Em casos de deployment com High Availability, utilizaríamos First Node e Add to Cluster.


2. Coloque as informações do seu CUCM:



3. Importe a licença:



4. Depois de validar as licenças e ativar os serviços, você deverá colocar as informações de integração entre o CUCM e o CCX. Essa integração utiliza 3 usuários:

Usuário AXL: Pode ser o mesmo que você usa para se logar no CUCM, ou crie um novo Application User no CUCM com permissão de AXL.



Usuário JTAPI: Usuário para se comunicar via CTI com o CUCM. Não é necessário criar manualmente o usuário no CUCM. Crie aqui no CCX, que automaticamente vai aparecer lá nos seus Application Users do Call Manager.


Usuário RmCm: Usuário para fazer o controle dos telefones. Não é necessário criar manualmente o usuário no CUCM. Crie aqui no CCX, que automaticamente vai aparecer lá nos seus Application Users do Call Manager. Lembre-se que quando for configurar um telefone para um agente, esse telefone deve estar associado ao usuário RmCm no CUCM, e essa associação deve ser feita manualmente.


Nessa tela também você deverá configurar o NTP Server, que pode ser o próprio CUCM.

Note que após esse passo, os novos usuários estarão listados no CUCM. Não precisa fazer nenhuma config nesses caras por enquanto, exceto a associação dos telefones no RmCm, como disse anteriormente!


5. Seguindo com o CCX, escolha a quantidade de sessões simultâneas de Historical Reports, Gravações e Outbound Dialer o sistema vai suportar (geralmente nada disso cai na prova), e o Codec (que geralmente é G711). Note que o CCX só suporta 1 Codec! Ou seja, se alguém tentar ligar para o CCX usando G729, vamos precisar de um Transcoder aqui.


6. Escolha a linguagem default do sistema:


7. E por fim o End User do CUCM que será usado para acessar a tela de administração do CCX. Tem que ser End User, infelizmente, e não Application User. Ou seja, se você tiver um CUCM integrado com o AD, esse usuário tem que estar no AD. E se por algum motivo ele for apagado, você perde acesso ao CCX.


8. Pronto, a integração foi feita e você pode fechar o Browser. A partir desse momento, utilize o usuário criado no passo 7 para acessar o sistema.


Ok, como eu disse, provavelmente na prova você não vai precisar fazer nada disso. Já vem tudo pronto! Mas é bom sempre ficar atento aos pontos críticos dessa integração, como os Applications Users e suas senhas (se algo não estiver funcionando, pode ser algum problema nesses usuários, por exemplo), o codec e tal.

Agora vamos criar as CTI Ports e CTI Route Points, que servirão para o CUCM conseguir se comunicar com o CCX. Isso também geralmente vem pronto, mas pode ser que você tenha que fazer algum troubleshooting nessa integração, ou mesmo apagar tudo e criar de novo... Portanto, é importante estar bem familiarizado com isso.

Primeiramente, vamos lembrar que qualquer uma dessas configurações devem ser feitas SEMPRE no CCX. Se tiver que mudar, apagar ou criar algo, é sempre pelo CCX. Este por sua vez fará a atualização das coisas no CUCM... Nunca mude as entidades diretamente no CUCM, ou você pode começar a ter problemas de sincronia.

Vamos lá... a primeira coisa que precisamos criar é um Call Control Group no CCX. Ao criá-lo, novas CTI Ports serão criadas automaticamente no Call Manager. Para isso, entre no CCX com o login definido no passo 7, e navegue até Subsystems >> Cisco Unified CM Telephony >> Call Control Group, e crie um novo. Dentre outras informações, aqui precisamos definir um ID para o grupo no CCX, a quantidade de portas (repare que lá em cima ele fala quantas licenças você tem), o ramal da primeira porta (as demais seguirão sequencialmente a partir desse número), e um prefixo, que vai servir para formar o nome do device no CUCM. Podemos definir outras coisas também como Device Pool (importante para configurar o Codec que será usado nas chamadas para o CCX), MRGL (importante no caso de precisarmos de Transcoder nas chamadas), Partition e Calling Search Space. Essas informações ele vai puxar tudo do CUCM através daquele usuário AXL que configuramos lá em cima.


Veja no CUCM as nossas 12 portas criadas. Se precisarmos alterar algo, como Device Pool, MRGL, faça tudo através do CCX:


Agora precisamos de criar um Trigger no CCX, que vai ser um CTI Route Point no CUCM. Esse Trigger será o ramal para onde os usuário vão ligar para chegar em uma Aplicação do CCX. Então antes de criar o Trigger, criaremos um Application, em Applications >> Application Management >> Add New. Como o foco do post não é a criação de Scripts, vamos utilizar um Script default que já vem no sistema:


Criamos uma aplicação chamada App01 que chama o Script icd.aef. Agora precisamos criar o Trigger, informando qual será o Ramal que estará associado a essa aplicação. Para isso, clicaremos em Add new trigger.

Aqui configuraremos, dentre outras coisas, o número do ramal, a língua, um nome (que será o nome do CTI Route Point), um Call Control Group (que usaremos aquele que criamos acima), Device Pool, Partition, Calling Search Space, etc.


Veja que ao criar esse Trigger, um novo CTI Route Point é criado no CUCM:


E veja também que esse CTI Route Point e os CTI Ports estão associados ao Application User jtapi_1. Tudo foi feito automaticamente:


Com isso, se um usuário ligar no 2000, o CUCM vai invocar uma das CTI Ports para chegar no CCX. Chegando no CCX, a aplicação App01 será invocada, utilizando o script icd.aef.

Essa é a integração básica entre CCX e CUCM. Se algo não estiver funcionando, a primeira coisa que podemos fazer é checar a sincronia e forçar a correção, indo em Subsystems >> Cisco Unified CM Telephony >> Data Resync.

Veja o que acontece por exemplo se eu remover os CTI Ports e CTI Route Points do usuário jtapi_1.


Ao rodar o Data Check, o CCX percebe que a associação não está feita. E ao rodar o Sync, a associação é feita novamente, corrigindo o problema:


Esse foi o meu primeiro post de CCX, bem básico. A partir de agora eu começarei a postar mais coisas, principalmente relacionadas a Scripts.

segunda-feira, 8 de julho de 2013

Translation Pattern ou Transformation Pattern? (Parte 2/2)

No post passado falei sobre Translation Pattern, que é realmente mais simples e parte do nosso dia-a-dia. Recebi até um feedback de que o assunto estava muito fácil! hahaha! A minha ideia inicial era fazer um único texto abordando Translations e Transformations Patterns, mas como estava ficando muito grande, resolvi quebrar em dois. Hoje, portanto, continuo o assunto iniciado na semana passada, e começo as minhas considerações sobre Calling Party Transformation Patterns e Called Party Transformation Patterns, que são igualmente de extrema importancia para a prova.

Transformation Patterns

Existem dois tipos de Transformation Patterns no CUCM, a Called e a Calling. A primeira serve para alterar o número de destino (DNIS) e a segunda para alterar o número de origem (ANI) da chamada. Veja que a única que teria potencial para alterar o roteamento da chamada dentro do Call Manager é a Called, pois todas as entidades do sistema analisam o DNIS para tomar essa decisão, e nunca o ANI.

Bom, no post passado eu disse que se fosse para resumir a diferença entre Translations e Transformations Patterns em uma frase, eu diria que as Transformations Patterns não alteram a decisão de roteamento no CUCM. Pois bem, como vimos anteriormente, as Translations de fato alteram essa decisão de roteamento. Mas as transformations, por sua vez, não. As Called Party Transformation Patterns são utilizadas depois que o Call Manager fez a sua escolha de encaminhamento da chamada, logo antes de ele enviar os digítos para o device de destino, seja ele um Gateway ou um Trunk (Called Party Transformation Patterns não são suportadas para IP Phones). Vejamos graficamente essa difença.

- Translations Patterns (imagem do post anterior):



- Called Party Transformation Patterns:


Repare a diferença. As translations são verificadas primeiro em uma chamada, e elas podem alterar o DNIS (Called Number) e ANI (Calling Number), para depois dar match em uma Route Pattern ou DN. Já as Called Party Transformation Patterns são usadas para alterar o DNIS depois que o Call Manager já decidiu para onde vai a chamada, e é invocada pelo próprio Device (Gateway ou Trunk) no sentido Outbound.

Então por exemplo, você ligou para o número 001123232000 a partir de um IP Phone. Os dígitos deram match em uma Route Pattern, que encaminha para um Gateway H.323 de IP 10.10.1.1. Então a decisão do CUCM já está tomada: ele vai mandar para o 10.10.1.1 e ponto final. Mas antes disso, o Gateway pode chamar uma Called Party Transformation Pattern, e alterar o DNIS para 023232000. Veja que isso não vai mudar em nada as coisas para o CUCM, ele vai continuar mandando a chamada para o 10.10.1.1, só que com o DNIS manipulado.

Ok, falamos das Called Party Transformation Patterns. Mas e as Calling Party Transformation Patterns? Bom, elas servem para alterar o número de origem (ANI), e isso também não vai alterar nada com relação ao roteamento da chamada dentro do CUCM. Os devices que podem chamar uma Calling Party Transformation Pattern são os IP Phones no sentido outbound  e os Gateways/Trunks no sentido inbound ou outbound. Lembrando que Outbound é quando o CUCM envia a chamada para algum lugar, e Inbound é quando alguém envia a chamada para o CUCM. Vejamos as figuras que representam essas situações:

- Calling Party Transformation Patterns (Gateway/Trunk Outbound)


Nessa situação, o CUCM pode modificar o número de origem antes de encaminhar a chamada para um Gateway ou Trunk. Por exemplo, o ramal de origem é o 2000, e ele ligou para o número 022225555 da PSTN. Os dígitos deram match em uma Route Pattern, que encaminha a chamada para um Gateway via H.323. Logo antes de a chamada ser encaminhada, o CUCM muda o ANI de 2000 para 23232000. Veja que o roteamento da chamada não alterou em nada, o CUCM apens mudou o Calling Number antes de encaminhar para o roteador.

Ok, poderíamos fazer isso na propria Route Pattern, certo? Ou até na Route List / Route Group. Mas fazendo no gateway é mais fácil, porque ele aplicaria a regra para TODAS as chamadas que fossem encaminhadas para aquele gateway/trunk específico. Caso seja essa a nossa vontade, é muito mais fácil do que configurar a regra rota a rota, né? No entanto, como já disse um milhão de vezes no post anterior, caso o gateway seja H.323, esse tipo de manipulação é preferível que se faça no IOS, aplicando nas dial-peers, para que continue funcionando em SRST.
Então para a prova, acho difícil você precisar usar a Calling Party Transformation Pattern como Outbound no Gateway/Trunk.

- Calling Party Transformation Patterns (Gateway/Trunk Inbound e Phone Outbound)



Aqui sim a coisa começa a ficar mais útil (e mais essencial para a prova). Nessa situação, tratamos uma chamada entrante da PSTN para um IP Phone registrado no CUCM. Veja que as regras que faremos aqui dependem do CUCM, então não funcionarão em SRST! Isso já é esperado.

Vamos lá... pela imagem podemos ver que a gente consegue manipular os dígitos do ANI em 2 lugares: No gateway, logo que o CUCM recebe a chamada, e no IP Phone, quando o CUCM envia a chamada para ele. Mas qual é a diferença? Ahá... esse é o ponto. A manipulação que ocorre no gateway, na entrada do CUCM, é o número que vai ficar marcado como ANI da chamada. Ou seja, é o que vai ficar registrado na lista de chamadas perdidas ou chamadas recebidas do telefone. Já a manipulação que ocorre no IP Phone é apenas para alterar como o ANI será apresentado ao telefone quando a chamada estiver tocando, mas não terá impacto nas listas de chamadas.

Por exemplo, uma chamada entrante do número 1122225555 da PSTN para o ramal 2000. Na manipulação do Gateway, eu posso fazer esse número de origem virar +551122225555. E na manipulação do IP Phone, eu posso fazer esse número virar 22225555. O resultado disso será o seguinte: enquanto a chamada estiver tocando no telefone, o visor vai mostrar "From: 22225555". Porém, lá na lista de chamadas perdidas/recebidas, vai estar registrado como +551122225555. Assim, o usuário consegue dar um Dial direto da lista (claro, você tem que configurar todo o call routing para suportar o formato +E.164), mas ao mesmo tempo, a chamada será apresentada de uma forma mais amigável no telefone.

Globalization e Localization

Com toda essa informação acima, junto com o post anterior, entramos em um conceito chamado Globalization e Localization, introduzida no CUCM 7, e que a Cisco pega muito pesado na prova. Globalization é isso de transformar o número em um formato global (+E.164, por exemplo +551122225555), e Localization é transformar de volta em um formato local (por exemplo 022225555). A regra é: Globalizar na entrada e Localizar na saída. Com isso, criamos um dial plan com suporte ao +E.164, e totalmente escalável.

Vamos a um exemplo, que configuraremos mais tarde. Aplicaremos de cabo a rabo essa ideia de Globalization e Localization, tanto em uma chamada entrante como em uma chamada sainte:

- Chamada entrante (PSTN --> IP Phone)


Na chamada entrante, usaremos somente o Calling Party Transformation Pattern, alterando o ANI tanto na entrada do CUCM (no Gateway) quanto na saída do CUCM (no IP Phone). A PSTN manda o ANI no formato 1122225555 (que é o caso na maioria das operadoras no Brasil), e no nosso exemplo, o Gateway não faz manipulação nenhuma. Ao chegar no CUCM, o Gateway invoca uma Calling Party Transformation Pattern e altera o ANI para +551122225555. O Call Manager, com posse do DNIS 2000 (que não sofreu nenhuma alteração), acha o DN, que está associado a um IP Phone. Quando o CUCM vai mandar a chamada para o IP Phone, ele chama uma outra Calling Party Transformation Pattern, que altera o ANI de +551122225555 para 22225555. Assim, no IP Phone vai aparecer a chamada "From: 22225555", e nas Call Lists (missed e received calls) vai ficar registrado como +551122225555.

- Chamada sainte (IP Phone --> PSTN)



Na chamada sainte, um IP Phone faz uma chamada para o número 022225555. Para Globalizarmos na entrada, contaremos com a ajuda de uma Translation Pattern, que vai transformar esse número para +551122225555. Por que precisa ser uma Translation e não uma Transformation? Porque queremos alterar isso antes de o CUCM tomar a sua decisão de roteamento. Uma vez globalizado, os dígitos darão match em uma Route Pattern genérica, do tipo \+.!, que enviará para um Gateway usando Local Route Group. A vantagem disso é que podemos ter apenas 1 única Route Pattern no sistema! Olha que beleza... E o gateway por sua vez, invocará uma Called Party Transformation Pattern para localizar os números na saída, ou seja, mudar de +551122225555 para 022225555, por exemplo. Com isso, você cria um dial plan altamente escalável e com suporte ao +E.164, que não faz parte do escopo desse post, mas vai te facilitar MUITO na configuração do AAR e do CFUR. Praticamente você vai ter essas duas features de graça.


Configuração

Agora que temos toda a base teórica, a configuração é muito fácil. Basicamente precisamos de Partitions e Calling Search Spaces. Começaremos fazendo as Calling Party Transformations Patterns (que chamarei a partir de agora de CgPTP), e depois as Called Party Transformation Patterns (a partir de agora, CdPTP).

- Calling Party Transformation Patterns (CgPTP)

Vejamos... precisaremos usar uma no Gateway, e outra no IP Phone, certo? Vamos, portanto, criar duas partitions e duas CSSs:
- CSS-GW-CgPTP {PT-GW-CgPTP}
- CSS-Phone-CgPTP {PT-Phone-CgPTP}

E agora criaremos as Transformations.
A do gateway precisa mudar de 1122225555 para +551122225555. Portanto, podemos fazer o seguinte:


 A do phone precisamos mudar de +551122225555 para 22225555. Portanto, podemos fazer o seguinte:

E aí, basta aplicarmos as CSSs no gateway:


E no phone:


Repare que em ambos eu desmarquei a opção Use Device Pool Calling Party Transformation CSS. Uma outra opção seria aplicar a CSS no Device Pool, e deixar esse campo marcado no Gateway ou no Phone. Mas cuidado, pois a regra pode acabar sendo usada por devices que você não quer. Por isso, eu sugiro marcar no device ao invés de aplicar no Device Pool.

Obs: No gateway, eu configurei a CSS-GW-CgPTP no Number Type Unknown, que é como funciona no Brasil. Na prova, a PSTN manda os dígitos marcados como Subscribe (chamadas locais), National (chamadas DDD) e International (chamadas DDI). Assim você pode (e deve) fazer a globalização sem o uso de CgPTP e CSSs, apenas prefixando os dígitos necessários para cada tipo de chamada. Por exemplo, se a PSTN manda 1122225555 e Type Subscribe, para globalizar basta prefixarmos +55. Se quiser configurar dessa forma no Brasil, é preciso fazer a marcação no gateway através de translation-profiles, por exemplo:

voice translation-rule 10
 rule 1 /^11[2-9].......$/ /&/ type any subscriber
 rule 2 /^[1-9][1-9]/ /&/ type any national
 rule 3 /^00/ /&/ type any international


voice translation-profile ISDNType
 translate calling 10


dial-peer voice 2 voip
 description *** PSTN -> CUCM ***
 translation-profile outgoing ISDNType
 destination-pattern 2...$
 session target ipv4:10.1.1.10
 incoming called-number .
 voice-class codec 1 
 voice-class h323 1
 dtmf-relay h245-alphanumeric
 no vad


- Called Party Transformation Patterns (CdPTP)

Agora vamos fazer a parte das CdPTPs, que são usadas no Gateway, no sentido Outbound. O gateway vai localizar a chamada, mudando de +551122225555 para 022225555. Para isso, também vamos criar uma Partition e uma CSS específica:

- CSS-GW-CdPTP {PT-GW-CdPTP}

Agora a CdPTP:


E aplicamos no gateway, desmarcando a opção Use Device Pool CSS:


E assim finalizo o post sobre Translations e Transformations. Um detalhe que é bom comentar é que o dialed number analyzer do CUCM não funciona com Transformation Patterns, então não use ele para os seus troubleshootings.