sexta-feira, 8 de abril de 2022

Servidor Linux Básico - Alternativas ao CentOS

 Introdução

Após as mudanças no projeto CentOS, surgiram algumas opções como o Rocky Linux, AlmaLinux e Oracle Linux, todos são excelentes opções e tem seus defensores. O objetivo desse post é prover uma instalação básica, mostrar alguns comandos para que você se sinta mais confortável e sugerir algumas boas práticas.

Antes de continuarmos

Eu sou da época em que a ajuda e incentivo que a gente recebia era RTFM, fui criado no Slackware, então apesar de gostar de ensinar, algumas coisas permanecem, pois fazem parte da minha formação. Só para citar as principais:
Servidor não tem interface gráfica, a menos que seja uma necessidade da aplicação;
Instalações são feitas sempre partindo-se do Minimal;
Só instale o que for necessário;
Servidor é 64 bits;
Cada aplicação precisa pacotes e ajustes específicos, esse post trata do que você deve fazer em todos os seus servidores. 

Sobre as instalações

Foram utilizadas as versões 8.5 das distribuições; para o Rocky Linux e AlmaLinux, foram utilizadas as ISOs minimal:
 
No caso do Oracle Linux foi utilizada a versão Full ISO:
Porém na seleção de pacotes foi escolhida a opção Instalação Mínima

Um detalhe interessante é que enquanto o Rocky Linux e AlmaLinux utilizam o mesmo Kernel, no caso do Oracle Linux é utilizado um Kernel mais recente:
 
# cat /etc/redhat-release
AlmaLinux release 8.5 (Arctic Sphynx)
Rocky Linux release 8.5 (Green Obsidian)
 
# uname -a
Linux localhost.localdomain 4.18.0-348.20.1.el8_5.x86_64 #1 SMP Thu Mar 10 11:31:47 EST 2022 x86_64 x86_64 x86_64 GNU/Linux

# cat /etc/redhat-release
Red Hat Enterprise Linux release 8.5 (Ootpa)
 
# uname -a
Linux localhost.localdomain 5.4.17-2136.305.5.5.el8uek.x86_64 #2 SMP Tue Apr 5 14:05:37 PDT 2022 x86_64 x86_64 x86_64 GNU/Linux

Ajustes Pós Instalação

Partindo do princípio que você fez uma instalação Minimal do Linux escolhido, logou pela primeira vez como root, vamos fazer alguns ajustes.

Parar a execução do firewall:

# systemctl stop firewalld

Desabilitá-lo permanentemente:

# systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

Conferir se o mesmo está desabilitado:

# systemctl is-enabled firewalld
disabled


DICA: Você pode ver o status de todos os serviços com o comando abaixo:
# systemctl list-unit-files

Checar o estado do SELinux:

# getenforce
Enforcing

Torna-lo permissivo:

# setenforce 0

Checar o estado do SELinux:

# getenforce
Permissive


DICA: Para desabilitar definitivamente o SELinux edite o arquivo /etc/selinux/config e altere a opção "SELINUX=enforcing" para "SELINUX=disabled". Isso pode ser feito por meio do comando:
# sed -i 's/enforcing/disabled/g' /etc/selinux/config

Observação: Estou desabilitando o Firewall e o SELinux porque cada servidor tem uma finalidade específica e, exige ajustes específicos para essa finalidade, então por padrão desabilito os dois, e se houver necessidade, reabilito e faço os ajustes específicos.

O EPEL - Extra Packages for Enterprise Linux é um repositório oficial com pacotes extras e as últimas versões dos pacotes. Podemos instalá-lo através dos comandos abaixo:
# dnf config-manager --set-enabled powertools

Esse comando deu erro no Oracle Linux, porém não interferiu no restante dos procedimentos. Então se você optou pelo Oracle Linux, pode ignorar o comando acima.

# dnf install epel-release

O RAVEN é um repositório com pacotes adicionais aos do EPEL e/ou versões mais atualizadas do mesmo, dependendo do caso. Ele não funciona se o EPEL não estiver instalado, é um pré-requisito. Para instalar o raven, use o comando abaixo:
# dnf install https://pkgs.dyn.su/el8/base/x86_64/raven-release-1.0-3.el8.noarch.rpm

Feito isso atualize seu sistema:
# yum update -y

Este último comando vai atualizar todos os pacotes do seu sistema para as versões disponíveis no EPEL e RAVEN.

Dependencias Básicas

Esses são pacotes que precisamos para o dia-a-dia, independente da aplicação desse servidor. Lembre-se um Servidor Web tem necessidades diferentes de um Servidor de FTP.
# dnf install -y rsync  bind-utils mlocate mailx wget net-tools make cmake automake man net-tools

Clamav

Todo servidor tem que ter antivírus? Mas não é Linux? Eu disse que ia lhe sugerir algumas boas práticas, mas são apenas sugestões, este é o meu setup de Servidor Linux 8.
# dnf install -y clamav-server clamav-data clamav-update clamav-filesystem clamav clamav-scanner-systemd clamav-devel clamav-lib clamav-server-systemd

Precisamos comentar as linhas de exemplo:
# sed -i -e "s/^Example/#Example/" /etc/freshclam.conf
# sed -i -e "s/^Example/#Example/" /etc/clamd.d/scan.conf


E atualizar o clamav:
# freshclam

Editar o arquivo scan.conf:
# vi /etc/clamd.d/scan.conf

E descomentar a linha:
#LocalSocket /var/run/clamd.scan/clamd.sock

Habilitar o Clamav, Inicia-lo e Checar se o processo está ativo:
# systemctl  enable clamd@scan
# systemctl  start clamd@scan
# systemctl  status clamd@scan


Testar a verificação de um arquivo:
# clamdscan -c /etc/clamd.d/scan.conf /etc/hosts

Cron

Deixar um cron padrão para que qualquer um possa editá-lo:
# crontab -e

# Exemplo de uso
# 0     4       *       *       *       <usuario>       who

# Campo         Funcao
# 1o.           Minuto
# 2o.           Hora
# 3o.           Dia do mes
# 4o.           Mes
# 5o.           Dia da semana

# 6o.           Usuario com o qual o comando sera executado <opcional>
# 7o.           Programa para execucao

# Campo                 Valores
# Minuto                 0-59
# Hora                     0-23
# Dia do mes           1-31
# Mes                      1-12
# Dia da semana      0-6 (o "0" eh o domingo), 1 eh a segunda, etc.

# -----------------------------------------------------------------------------------------------
# Roda o update do antivirus todos os dias as 23:00
0 23 * * * /usr/bin/freshclam


Reiniciar o servidor:
#reboot 

Agradecimentos

aboardbr pela dica do Repo Raven ;-) 
Gui pelo insight que me levou a validar o procedimento nas três distribuições

segunda-feira, 14 de maio de 2018

Repassar IP de Acesso do Proxy Reverso para o Servidor Web - Nginx + Apache

Introdução:

Quando um cliente solicita acesso a determinado site, ele na realidade acessa o Proxy reverso, que redireciona a conexão para o Servidor Web, porém o IP da requisição que consta nos logs do Servidor Web é o do Proxy Reverso.

Em algumas situações esse cenário não é adequado, como por exemplo, quando queremos liberar acesso à determinado endereço apenas para alguns IPs, ou em casos de auditoria. Para resolver a situação precisamos realizar as configurações no Nginx e no Apache.

Configurações no Nginx

Vou me ater apenas as opções que importam para o cenário proposto:
     location / {
     proxy_pass  http://<IP_Servidor_Web>;
     .
     .
     .
     proxy_set_header        Host            $host;
     proxy_set_header        X-Real-IP       $remote_addr;
     proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

     }

 

Configurações no Apache

Para que o Apache entenda esses parâmetros ele precisa do módulo mod_remoteip.so, no caso do CentOS isso já é nativo:
# yum provides /etc/httpd/modules/mod_remoteip.so
Plugins carregados: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.unicamp.br
 * epel: mirror.globo.com
 * extras: ftp.unicamp.br
 * remi: remi.xpg.com.br
 * remi-safe: remi.xpg.com.br
 * updates: ftp.unicamp.br
httpd-2.4.6-67.el7.centos.6.x86_64 : Apache HTTP Server
Repo        : @updates
Resultado a partir de:
Nome de arquivo    : /etc/httpd/modules/mod_remoteip.so


O módulo já vai estar configurado para ser carregado automaticamente:
# grep remote * /etc/httpd/conf.modules.d/
00-base.conf:LoadModule remoteip_module modules/mod_remoteip.so


Mas precisamos realizar uma pequena alteração, acrescentando duas linhas:
# vi /etc/httpd/conf.modules.d/00-base.conf
LoadModule remoteip_module modules/mod_remoteip.so
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy <IP_Proxy/Máscara>


Precisamos também alterar o padrão de logs do Apache (%a):
# vi /etc/httpd/conf/httpd.conf
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%v %a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined


E reiniciar o Apache:
# systemctl restart httpd

Segue abaixo um exemplo do log gerado:
<Site_Solicitado> <IP_Origem> - - [14/May/2018:07:54:17 -0300] "GET ..." "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0"
 
É isso, espero que seja útil.

Referências:

Alpha Computer and Web Services
Server Fault - Apache mod_remoteip and access logs

terça-feira, 3 de abril de 2018

Instalação do SNMP Builder no Zabbix 3.4.6

Introdução

O SNMP Builder é um projeto do giapnguyen, que sofreu um fork pelo mickvav, que o atualizou para a versão 3.2. Esse projeto também já fez parte, e tenho esperanças que um dia volte a fazer, do EveryZ.

Eu resolvi testar ele no Zabbix 3.4.6, e obtive sucesso, sendo necessário apenas uma alteração à mais do que o tutorial inicial.

Como muitas pessoas perguntam sobre esse projeto, mas tem dificuldades com o inglês, eu resolvi fazer um tutorial em Português sobre o assunto.

Instalação

Por questão de organização eu sempre crio um diretório /install na máquina, e deixo todas as instalações lá. No meu caso o Zabbix está instalado no /var/www/html/zabbix/. Então faça as adaptações necessárias ao seu cenário.

# cd /install

# wget https://github.com/mickvav/snmpbuilder/archive/master.zip

# cd /var/www/html/zabbix/

# unzip /install/master.zip

# mv snmpbuilder-master/snmp_builder* .

# rm -rf snmpbuilder-master


Ajustes

O importante nesse arquivo é definir o path das MIBs:

# vi snmp_builder.php
define('MIBS_ALL_PATH', '/var/www/html/zabbix/snmp_builder/mibs:/usr/share/snmp/mibs');


No arquivo menu.inc.php, iremos criar a entrada do SNMP Builder no Zabbix:
# vi include/menu.inc.php
Na linha 220:

[
        'url' => 'snmp_builder.php',
        'label' => 'SNMP Builder'
],

Seu Código vai ficar assim:


                'popup_httpstep.php'
        ]
],
[        'url' => 'snmp_builder.php', 
        'label' => 'SNMP Builder'
],
[        'url' => 'maintenance.php',
        'label' => _('Maintenance')
],  

# vi jsLoader.php

Na linha 51:
        // snmp_builder
        '../snmp_builder/Tree.js' => '',
        '../snmp_builder/snmp_builder.js' => '',
        '../snmp_builder/DynTable.js' => '',
        // /snmp_builder


Ao acessar o menu Configuração, você vai ver o menu SNMP Builder. Ao tentar gravar o item no template surge o erro referente ao valor do campo history.
Erro ao adicionar item ao template

Para solucionar o problema, vamos editar o arquivo snmp_builder.php, essa foi a única alteração adicional que eu precisei fazer. Nesse caso eu configurei retenção de um dia (86400 segundos).

# vi snmp_builder.php
Na linha 240:

'history'               => 86400,


E agora é possível criar o item normalmente.
Item adicionado ao template

sexta-feira, 8 de dezembro de 2017

Relato 1º Zabbix Meetup do Interior - Campinas-SP

Introdução

Os Meetups de Zabbix vem ocorrendo desde 2016, todos organizados pelo Premium Partner da Zabbix SIA no Brasil, a Unirede. Porém, o Luiz Sales procurou o Hernandes Martins e Eu, com a ideia de organizarmos um Meetup 100% Comunidade.

Nós adoramo a ideia, o principal ponto é poder levar os Meetups para outras cidades que não sejam capitais, mesmo que sejam eventos menores, com poucas pessoas, esse é o espírito original dos Meetups. Quem nunca fez um churrasco ou encontrou os amigos nerds num buteco e ficou ali horas trocando ideias sobre tecnologia.

Onde ocorreu o evento

O evento ocorreu nas dependências da Faculdade Devry Metrocamp, que nos forneceu o espaço sem custo algum, nesse ponto tenho algumas pessoas a agradecer: Profa. Daniela Cartoni, Prof. Ronaldo Barbosa, Prof. Julio Magro e Prof. Luiz Turatti, todos foram essenciais para que o evento ocorresse com sucesso.

O Público

 Essa foi a primeira grata surpresa, e que confirmou, que precisamos de mais eventos como esse, organizados fora dos eixos principais. A maioria dos presentes era de iniciantes no universo do Zabbix.

É comum para quem está envolvido, como eu, se deslocar para São Paulo, e, até mais longe para participar de um evento, mas para um iniciante, o sentimento não é o mesmo. "E se eu for até São Paulo e não entender nada?", "E se for uma panelinha, e eu me sentir deslocado?", esses são sentimentos comuns, mas sendo na cidade da pessoa, ou na cidade vizinha, dá para chamar uns amigos e se sentir mais confortável.

As Palestras

As palestras foram a segunda surpresa, no fim de Abril, participei do Meetup em São Paulo, foi impressionante ver a diferença no nível das palestras, o pessoal evoluiu muito, trouxeram temas relevantes e atualizados para esse Meetup.

Abaixo farei algumas considerações sobre as palestras e disponibilizarei os links para quem quiser conferir os slides.

Utilizando Zabbix com IoT - Douglas Esteves (IoTMakers)

O Douglas Esteves abriu o evento com um tema super atual: IoT, ele compartilhou vários de seus projetos, incluindo a utilização do computador em módulo Omega2, o desenvolvimento de placas e o módulo wifi ESP8266. Slides. Vídeo.

Monitoração de Ambiente Críticos SAP com Zabbix - Carlos Eduardo Felicio de Oliveira (UOLDiveo)

A palestra do Felicio teve muita troca de ideias, muitos dos presentes trabalham ou já trabalharam com ambiente SAP, o que gerou uma troca de experiências muito interessante. Ele comentou sobre as soluções existentes para o monitoramento desse ambiente e as cifras exorbitantes envolvidas, com certeza, se você possui SAP na sua empresa, e apresentar a possibilidade de monitorá-lo com Zabbix, vai ser visto com outros olhos. Slides. Vídeo.

Implementação em massa do Zabbix Agent em ambiente UNIX - Vinícius Bastos (DXC/CPFL)

A palestra do Vinícius foi totalmente hands on, nada de slides, ele conectou na hora num ambiente GNU/Linux em Docker e demonstrou seus scripts. Ele desenvolveu uma solução de instalação/atualização de Agentes Zabbix em ambiente *nix, onde ele trabalha eles possuem muitos Unix, além dos Linux, e essa solução diminuiu de meses para dias o processo de atualização de versão dos agentes. Vídeo.

Zabbix under Docker - Luiz Sales (O2B)

O Luiz falou sobre Zabbix com Docker, fez uma introdução sobre o universo do Docker e suas vantagens, explanou sobre a utilização do Zabbix nessa tecnologia e no final fez um hands on, demonstrando um ambiente composto por Zabbix, Grafana e uma Dashboard PHP personalizada, sendo disponibilizados em 2 minutos, do enter ao endereço de acesso web disponível, incluindo as configurações no ambiente da Amazon, tornando assim a solução acessível para qualquer um com acesso à internet. Slides. Vídeo.

Kit de Desenvolvimento de Soluções de IoT com Zabbix - Guilherme L. da Silva (IoTools)

Guilherme apresentou um kit que é o verdadeiro "caixeiro viajante" da IoT, em uma maleta ele tem tudo que precisa para demonstrar a utilização de uma solução de Rede de Sensores sem Fio, que coleta dados, envia para um Zabbix local instalado em um Rapsberry Pi3, que ainda conta com o Grafana. Por fim, ele comentou sobre uma aplicação que ele desenvolveu com o kit, para estimar o nível de ocupação de uma fila. Slides. Vídeo.

Integração do Zabbix com AWS EC2 Auto-Scalling - Emmanuel Arias (O2B)

Em seguida tivemos uma apresentação internacional, já que o "Manu" é Argentino. Ele iniciou a apresentação com uma explicação sobre os ambientes de hoje, que precisam ser elásticos, em eventos como Black Friday, é preciso escalar muitas máquinas rapidamente e que são destruídas após um período curto de tempo. Monitorar esses ambientes é um desafio, após dar exemplos do que ocorre com essa máquinas que são destruídas, ele demonstrou a solução que criou com o conceito de "Slots", compartilhou alguns requests de features que estão abertos na Zabbix SIA e como essas funções facilitariam a resolução desses problemas, e, por fim demonstrou o script em python que ele utiliza na solução, o ec2bix.pi. Slides. Vídeo.

Visão de Negócio com Zabbix - Robert Silva (JLCP)

A palestra do Robert trouxe luz sobre as necessidades que enfrentamos atualmente, ambientes com cultura DevOps, CI/CD, Microserviços, exigem monitoramentos além da infra-estrutura e aplicações, ele explicou de forma clara como esse novo ambiente funciona e o que é preciso para monitorá-lo, novamente o Python apareceu. Por fim exibiu alguns exemplos de dashboards personalizadas e algumas dicas. Slides. Vídeo.

meduZa: Automação Residencial com Zabbix - André Déo (Comunidade Zabbix Brasil) e Guilherme L. da Silva (IoTools)

Guilherme e Eu dividimos esse projeto e a palestra, demonstramos a arquitetura da solução, o shield para Arduíno que ele criou, e as customizações que fizemos no Zabbix, basicamente temos um script em Python tem dupla função, coletar dados dos sensores e enviar para o Zabbix e ser executado pelo Zabbix para executar uma ação, como por exemplo, acender uma lâmpada, tudo isso utilizando o protocolo de Redes de Sensores Sem Fio radiuino. Depois fizemos uma demonstração prática do projeto. Slides. Vídeo.

Monitoramento de Facilities através do Zabbix - Gustavo Castro (SAVEIT)

A palestra do Gustavo foi inusitada, monitoramento de facilities com Zabbix, e você deve estar pensando sobre o que se trata, certo? Monitoramento de chamados de manutenção: privada entupida, máquina de café quebrada, geladeira com problemas, e afins. Utilizando o Grafana, ele criou uma série de dashboards gerenciais, depois combinando notificações do Telegram com scripts em PowerShell, desenvolveu um conjunto de notificações e envio de relatório diários que atendem as necessidades dos técnicos, dos clientes e da empresa responsável pelos técnicos. Slides. Vídeo.

UserParameter vs Zabbix Sender - André Déo (Comunidade Zabbix Brasil)

Por fim, chegamos a última palestra do dia, criei essa palestra pensando nos iniciantes, quando começamos a utilizar a ferramenta e lemos rapidamente sobre essas possibilidades, podemos pensar que são a mesma coisa, mas elas tem detalhes que devem ser observados e pensados ao adotar uma das duas estratégias. Depois de explicar esses pontos, exemplifiquei como utilizar o Zabbix Sender via script Python e revelamos uma surpresa: a implementação do Zabbix Sender para Android, projeto que também foi desenvolvido pelo Guilherme, de acordo com minhas especificações ;-) Slides. Vídeo não disponível.

Coffee Break

Como dito anteriormente, o evento foi totalmente realizado pela comunidade, mas graças a algumas ações que executamos, como por exemplo, a venda de chaveiros, temos um pequeno caixa, e com ele contratamos um belo Coffee Break.
 
Agradecimentos especiais à todos que compraram chaveiros durante o evento, e ao Hernandes, Luiz e Aécio, que além de mim, doaram algum valor, e através disso reerguermos o caixa após o evento. Comunidade é isso pessoal.

Brindes

O Luciano Alves é o CIO da Unirede, todos os anos ele participa da Zabbix Conference em Riga - Letônia, nesse ano o próprio Alexei enviou alguns brindes para a Comunidade, e o Luciano complementou com mais alguns. Além disso, a comunidade doou 2 chaveiros.

O sorteio foi realizado gerando uma sequencia de 3 números aleatórios no bash, as pessoas tinham quem encontrar essa sequencia em qualquer coisa que eles tivessem na carteira.
 
Mais fotos!
 

Agradecimentos

Agradeço a todos que participaram do evento, seja organizando, palestrando, prestigiando, divulgando, não importa, nosso MUITO OBRIGADO a todos!

Espero que esse tenha sido o primeiro de muitos Meetups organizados por membros da comunidade, se você deseja organizar um Meetup na sua cidade entre em contato, que vamos ter o maior prazer em ajudar.

segunda-feira, 10 de julho de 2017

Redes de Sensores Sem Fio com Protocolo Radiuino Emulada no Arduino

Introdução

O Radiuino pode ser definido como um protocolo de comunicação para Redes de Sensores Sem Fio, que implementa um pacote de comunicação de 52 bytes. Ele é estruturado em uma pilha de protocolos com 5 camadas: Física, MAC, Rede, Transporte e Aplicação, esta estrutura é conceitualmente equivalente à pilha TCP/IP.

Existem duas bibliotecas para serem utilizadas no Arduino, a primeira é a biblioteca Radiuino, que apresenta os Firmwares de maneira transparente, permitindo ao usuário entender todo o processo de comunicação dos protocolos em cada camada. Isso permite que o usuário construa redes de comunicação sem fio customizadas para cada situação e ambiente, além de permitir aos estudantes alterar parâmetros diversos no ambiente e acompanhar o comportamento da rede, comparando os conhecimentos teóricos, com a prática.

A segunda biblioteca é o Radiuino4App, cujo objetivo é facilitar a utilização de aplicações em redes de sensores sem fio, para os usuários que não tem interesse em entender como a rede funciona, ou precisam de um ambiente de demonstração de conceito, por exemplo, onde a uma rede básica atende a demanda. Nessa biblioteca os Firmwares apresentam apenas configurações básica, ocultando o restante das opções. Nesse cenário, é criada automaticamente uma rede estrela, onde um computador envia um pacote de 52 bytes e o nó sensor devolve um pacote de 52 bytes. É possível colocar até 255 sensores nessa rede. Permitindo aos usuários focaram na aplicação sem se aprofundarem nas questões de rede.

O que é RSSI?

A sigla RSSI significa Received Signal Strength Indicator, se traduzirmos seria algo como a indicação de força/intensidade do sinal recebido, esse valor é muito importante para quem está olhando para a rede de sensores sem fio, pois a intensidade do sinal vai interferir diretamente na perda ou não de pacotes, o que dependendo do cenário e da aplicação, pode ser um problema a curto, médio ou longo prazo. A taxa de perda de pacotes - PER (Packet Error Rate) é o primeiro parâmetro que o responsável por uma rede de sensores sem fio irá consultar.

Objetivo

O objetivo é possuir uma rede de sensor sem fio emulada, utilizando o protocolo de comunicação Radiuino.

O Conceito de Repetidor

Quando possuímos necessidades como alcançar distâncias maiores, locais sem visada direta, ou mesmo criar uma extensão da rede, e não desejamos ou não temos condições de realizar a troca de equipamentos de rádio, podemos utilizar um repetidor. A base envia o sinal ao repetidor, que recebe e processa o sinal, e, em seguida, envia os pacotes ao seu destino final.

Porque Utilizar uma Rede Emulada?

Montar e calibrar uma rede de sensores sem fio real, realizar os testes e desmontá-la, a cada nova rodada de testes pode ser uma tarefa árdua. Para muitos assuntos que estudamos em redes de comunicação de dados como, por exemplo, técnicas de roteamento, softwares de monitoramento, e etc; Não é preciso montar uma rede real, uma rede emulada atende perfeitamente a fase de desenvolvimento e testes. Uma vez validado o cenário no ambiente emulado, partimos para os testes em ambiente real.

Material Necessário

O Ambiente Emulado

Como pode ser observado na figura 01, teremos uma base que se comunica com um repetidor, que repassa os dados para o sensor de destino, o número de sensores é definido no Script Python. Em cada sensor coletaremos os dados: Temperatura, Umidade e Luminosidade. Além da RSSI de UpLink e DownLink de cada enlace.
Figura 01
A figura 02 detalha o fluxo de dados em cada etapa do processo.
Figura 02
Exemplo de Coleta dos dados no terminal
Coleta de Dados no Terminal
Exemplo de Coleta dos dados na ferramenta de Gerencia de Redes Zabbix
Mapa da Rede de Sensores sem Fio Representada no Zabbix

Arquivos Fonte

Todos os arquivos, incluindo a parte do Zabbix, estão disponíveis aqui.

Agradecimentos


Queria agradecer ao meu Orientador Prof. Dr. Omar C. Branquinho por todo o conhecimento que vem compartilhando comigo desde a nossa primeira conversa, quando eu não entendia absolutamente nada de redes de sensores sem fio.
Ao meus amigos Eng. Raphael Montali da Assumpção e Eng. Guilherme Lopes por todas as dicas, conversas e troca de idéias, e nesse post específico ao Guilherme por ter revisado o conteúdo.
Não posso esquece também do meu amigo Douglas Esteves, que me ajudou a entrar no "universo das plaquinhas", como eu sempre brinco, aprendi muita coisa com ele, as dicas dele foram essenciais no começo dessa caminhada.
E finalmente, mas não menos importante, ao meu amigo Matheus Bernardes, meu oráculo do Python, eu copio código dos projetos dele, peço ajuda, etc. E ele sempre me ajuda com a maior boa vontade!

terça-feira, 6 de junho de 2017

Personalizando o Idioma da Interface Gráfica do Zabbix

Introdução

Demonstrarei nesse post como realizar a alteração do idioma do Zabbix. Pode-se alterar apenas alguns termos ou todos os termos.

Objetivo

O objetivo desse post é ser uma Prova de Conceito, é fazer com que as pessoas pensem fora da caixa. O Zabbix é uma ferramenta fantástica, que permite coletar dados, exibi-los em forma de gráficos e mapas, reagir às métricas coletadas, seja alterando um ícone no gráfico, enviando uma notificação, executando um comando, etc.

O problema é que as pessoas pensam no Zabbix apenas para redes Ethernet e Aplicações! Há algum tempo vemos algumas iniciativas, como do Luciano Alves (Unirede) expandindo isso para uma visão de negócios, o Norberto Rozas (Syspro) que propôs a ideia de usar o Zabbix como supervisório de redes industriais, O Luiz Sales com seus monitoramentos nada convencionais, etc.

No começo do ano eu iniciei o mestrado em Engenharia Elétrica, trabalhando com Redes de Sensores Sem Fio (RSSF), e claro minha proposta foi a de utilizar o Zabbix como ferramenta para o gerenciamento dessas redes, mas conforme as ideias foram surgindo, fui lendo os artigos, conversando com meu orientador, eu fui percebendo um imenso aumento do uso de conceitos como IoT, Smart Cities, Smart Campus, etc. E com isso novos interesses foram sendo despertados.

O Zabbix pode ser usado como Interface para os usuários finais, independente da área de atuação, porém será preciso fazer algumas modificações, pois cada área possui seu conjunto de jargões, sua definição de ícones, de interface, etc. Personalizar o Zabbix para que o usuário tenha uma visão que lhe seja familiar, é essencial. O que estou propondo é utilizar o que o Zabbix tem de melhor, e adaptar o que for necessário para que o usuário se sinta motivado a utilizá-lo.

O que essa solução é

Um Hack: Tenha isso em mente, o que estou fazendo não servirá para qualquer um, em qualquer ambiente, não é suportado pela Zabbix SIA e pode nem ser interessante no seu ponto de vista.
Uma Prova de Conceito: Esse post está longe de ser a palavra final sobre o assunto, eu tinha uma necessidade, achei uma maneira de executá-la e estou compartilhando com vocês.

O que essa solução não é

Prática: A cada nova versão da ferramenta, será preciso reaplicar o hack.
Universal: Veja que essa solução é ideal para ambientes, onde um ou dois idiomas são utilizados, mas não atende uma empresa global, também não atende dezenas de segmentos ao mesmo tempo.

Entendendo como funcionam os idiomas no Zabbix

Consultando a documentação oficial descobrimos que eles utilizam o GNU/gettext e o conceito de locales, que envolve uma série de normas internacionais e vai muito além da simples tradução de textos. Por isso é muito provável que esse hack nunca seja absorvido oficialmente pela Zabbix SIA.

Entendendo os os arquivos que controlam o idioma que é exibido na Interface Gráfica

Vamos analizar o diretório com o idioma do Brasil (pt_BR):
# ls -l /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/
total 940
-rw-r--r-- 1 zabbix zabbix 309122 Mai 30 17:26 frontend.mo
-rw-r--r-- 1 zabbix zabbix 649043 Mai 30 17:20 frontend.po

Enquanto o arquivo frontend.mo é um arquivo com uma codificação especial, descrita na documentação como uma "foto". E repleto de caracteres especiais:
# head -3 /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.mo
▒gGl▒▒▒/▒▒9▒5F [|▒▒▒!▒▒▒▒▒%▒,
3>Z
cn


O arquivo frontend.po é descrito na documentação como um arquivo texto, editável e utilizado para a tradução.
# head -3 /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.po
msgid ""
msgstr ""
"Project-Id-Version: Zabbix 3.2\n"


Observe esse trecho do arquivo frontend.po:
   4592 #: include/actions.inc.php:660 include/actions.inc.php:1061
   4593 msgid "Disable host"
   4594 msgstr "Desativar host"
   4595
   4596 #: include/views/configuration.host.list.php:116
   4597 msgid "Disable host?"
   4598 msgstr "Desabilitar host?"
   4599
   4600 #: app/views/administration.proxy.list.php:154
   4601 #: include/views/configuration.hostgroups.list.php:150
   4602 msgid "Disable hosts"
   4603 msgstr "Desativar hosts"
   4604
   4605 #: include/views/configuration.hostgroups.list.php:151
   4606 msgid "Disable hosts in the selected host groups?"
   4607 msgstr "Desabilitar os hosts nos grupos selecionados?"


Ele contém as strings que desejamos alterar, o problema é que alterar esse arquivo não surte efeito algum na interface gráfica. Pois se observarmos o arquivo que é chamado na linha 4596, por exemplo:
# vi /var/www/html/zabbix/include/views/configuration.host.list.php +116
                $confirm_message = _('Disable host?');


Verificamos que ele busca como referência a frase original, e, então aplica a tradução.

Observe esse trecho "^@Desabilitar host^@D" da linha 523 do arquivo /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.mo

Veja o que acontece se eu troco a frase por outra com o mesmo número de caracteres:
"^@Desabilitar sens^@D"

E reinicio o apache:
# systemctl restart httpd
Hack 01 no arquivo frontend.mo
Agora veja o que acontece e eu troco a frase por outra com um número diferente de caracteres:
"^@Desabilitar sensor^@D"

E reinicio o apache:
# systemctl restart httpd

Hack 02 no arquivo frontend.mo
Lembra que a documentação diz que o arquivo .mo é como uma foto? É nesse sentido. A mensagem aparece correta, mas todo o resto da formatação da interface gráfica se perdeu.

Basta voltar o arquivo ao normal e reiniciar o apache, que a interface gráfica também volta ao normal.
Interface Gráfica intacta após a remoção do Hack

Conclusões Iniciais

Devemos utilizar o arquivo frontend.po para gerar um arquivo frontend.mo atualizado. Mas como?

Observando o diretório /var/www/html/zabbix/locale temos um README e três scripts:
# ls -l *.sh README
-rwxr-xr-x 1 zabbix zabbix  385 Dez 21 05:08 add_new_language.sh
-rwxr-xr-x 1 zabbix zabbix  164 Mai 30 17:29 make_mo.sh
-rw-r--r-- 1 zabbix zabbix  957 Dez 21 05:08 README
-rwxr-xr-x 1 zabbix zabbix 1434 Dez 21 05:08 update_po.sh


No arquivo README encontramos a seguinte instrução:
If you want to update po files with new strings in the sourcefile, run update_po.sh . It will gather translatable strings from all files that end with ".php"

Maravilha é exatamente o que pretendemos fazer!

Vou mover o arquivo frontend.mo para o /root:
# mv /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.mo /root

E editar o arquivo frontend.po:
# vi /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.po
Alteramos as linhas 4592 até 4607, alterando as ocorrências de "host" para "sensor" e  de "hosts" para "sensores", e executamos o script:
# sh update_po.sh
Generating translation template...
Merging new strings in po files...
.
.
.
pt_BR
............................................................................................................................................................................................................................................................................................................................................. feito.
.
.
.
pt_BR/LC_MESSAGES/frontend.po   3316 mensagens traduzidas, 5 mensagens não traduzidas.
.
.
.


Mas... Não gerou um novo arquivo .mo:
# ls -l  /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.*
-rw-r--r-- 1 zabbix zabbix 649043 Mai 31 09:59 /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.po


Sem ele, mesmo com o idioma setado para Português (pt_BR)
Idioma setado como pt_BR
A interface gráfica fica em Inglês.
Interface Gráfica em Inglês

Basta trazer o arquivo de volta e reiniciar o apache:
# mv /root/frontend.mo /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/
# systemctl restart httpd


Que a interface gráfica volta ao normal.
Intreface Gráfica em pt_BR

Teste 02: Vamos rodar o update_po.sh e ver se ele atualiza o arquivo frontend.mo

# ls -l /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.mo
-rw-r--r-- 1 zabbix zabbix 309122 Mai 31 09:53 /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.mo
 

# sh update_po.sh
 

# ls -l /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.mo
-rw-r--r-- 1 zabbix zabbix 309122 Mai 31 09:53 /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.mo


E nada :-(

Teste 03: Vamos ver o que esse script faz ;-)

E na última instrução temos:
        # setting output file to /dev/null so that unneeded messages.mo file
        # is not created
        msgfmt --use-fuzzy -c --statistics -o /dev/null $translation

Achei!!! Esse script realmente não cria os arquivos.mo. Agora eu vou alterar ele para gerar os arquivos:
        #msgfmt --use-fuzzy -c --statistics -o /dev/null $translation
        msgfmt --use-fuzzy -c --statistics -o /root/$translation/frontend.mo $translation


Eu fiz a menor alteração possível, apenas substituindo "/dev/null" por "/root/$translation/frontend.mo". Isso poderia ficar bem mais elegante, mas preferi ser didático.

Vou criar apenas o diretório pt_BR, que será utilizado pela variável "$translation", os outros idiomas vão dar erro, mas nesse momento não tem problema:
# mkdir -p /root/pt_BR/LC_MESSAGES/frontend.po/

Vou guardar o antigo frontend.mo no /root
# mv /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/frontend.mo /root/

E rodar o script de update novamente:
# sh update_po.sh
Generating translation template...
Merging new strings in po files...
.
.
.
pt_BR
............................................................................................................................................................................................................................................................................................................................................. feito.
.
.
.
bg/LC_MESSAGES/frontend.po      msgfmt: erro ao abrir o arquivo "/root/bg/LC_MESSAGES/frontend.po/frontend.mo" para gravação: Arquivo ou diretório não encontrado
2052 mensagens traduzidas, 56 traduções aproximadas (fuzzy), 1213 mensagens não traduzidas.
.
.
.
pt_BR/LC_MESSAGES/frontend.po   3316 mensagens traduzidas, 5 mensagens não traduzidas.
.
.
.


E agora vamos colocar o novo frontend.mo na interface gráfica do Zabbix:
# cp /root/pt_BR/LC_MESSAGES/frontend.po/frontend.mo /var/www/html/zabbix/locale/pt_BR/LC_MESSAGES/

Reiniciar o apache
# systemctl restart httpd

E Voilà:

Interface Gráfica com a mensagem alterada
Volte o arquivo que você salvou no /root e reinicie o apache. Pois agora vamos fazer o trabalho, de verdade, vamos ter o Zabbix em Português com a interface intacta, e mais 3 variações do Português aplicado à nichos específicos.

Primeiro vamos criar a estrutura de diretórios para os idiomas Italiano (it), Francês (fr) e Russo (ru):
# mkdir -p /root/{it,fr,ru}/LC_MESSAGES/frontend.po/

Abaixo uma pequena cola, das alterações que vamos fazer:
pt_br - Hosts / Itens - Administrador da Rede Ethernet
it - Sensores / Métricas - Administrador da Rede de Sensores
fr - Plantas / Características - Usuário da Rede de Sensores - Ramo Agrícola
ru - Pacientes / Sinais Vitais - Usuário da Rede de Sensores - Ramo Medicina

Vamos copiar o arquivo frontend.po de pt_BR para os idiomas que vamos alterar:
# cd /var/www/html/zabbix/locale

# cp pt_BR/LC_MESSAGES/frontend.po it/LC_MESSAGES/frontend.po
cp: sobrescrever “it/LC_MESSAGES/frontend.po”? y

# cp pt_BR/LC_MESSAGES/frontend.po fr/LC_MESSAGES/frontend.po
cp: sobrescrever “fr/LC_MESSAGES/frontend.po”? y

# cp pt_BR/LC_MESSAGES/frontend.po ru/LC_MESSAGES/frontend.po
cp: sobrescrever “ru/LC_MESSAGES/frontend.po”? y


Primeiro vamos trabalhar no idioma Italiano e trocar todas as ocorrências de hosts por sensores e depois de host por sensor:
# sed -i -e ':g;/^msgstr/s/hosts/sensores/g' /var/www/html/zabbix/locale/it/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/host/sensor/g' /var/www/html/zabbix/locale/it/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Hosts/Sensores/g' /var/www/html/zabbix/locale/it/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Host/Sensor/g' /var/www/html/zabbix/locale/it/LC_MESSAGES/frontend.po


Agora vamos trocar todas as ocorrências de itens por métricas e depois de item por métrica:
# sed -i -e ':g;/^msgstr/s/itens/métricas/g' /var/www/html/zabbix/locale/it/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/item/métrica/g' /var/www/html/zabbix/locale/it/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Itens/Métricas/g' /var/www/html/zabbix/locale/it/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Item/Métrica/g' /var/www/html/zabbix/locale/it/LC_MESSAGES/frontend.po


Agora vamos ao idioma Francês, vamos trocar todas as ocorrências de hosts por plantas e depois de host por planta:
# sed -i -e ':g;/^msgstr/s/hosts/plantas/g' /var/www/html/zabbix/locale/fr/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/host/planta/g' /var/www/html/zabbix/locale/fr/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Hosts/Plantas/g' /var/www/html/zabbix/locale/fr/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Host/Planta/g' /var/www/html/zabbix/locale/fr/LC_MESSAGES/frontend.po


Agora vamos trocar todas as ocorrências de itens por características e depois de item por característica:
# sed -i -e ':g;/^msgstr/s/itens/características/g' /var/www/html/zabbix/locale/fr/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/item/característica/g'  /var/www/html/zabbix/locale/fr/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Itens/Características/g' /var/www/html/zabbix/locale/fr/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Item/Característica/g' /var/www/html/zabbix/locale/fr/LC_MESSAGES/frontend.po


E finalmente vamos ao idioma Russo, vamos trocar todas as ocorrências de hosts por pacientes e depois de host por paciente:
# sed -i -e ':g;/^msgstr/s/hosts/pacientes/g' /var/www/html/zabbix/locale/ru/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/host/paciente/g' /var/www/html/zabbix/locale/ru/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Hosts/Pacientes/g' /var/www/html/zabbix/locale/ru/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Host/Paciente/g' /var/www/html/zabbix/locale/ru/LC_MESSAGES/frontend.po


Agora vamos trocar todas as ocorrências de itens por sinais vitais e depois de item por sinal vital:
# sed -i -e ':g;/^msgstr/s/itens/sinais vitais/g' /var/www/html/zabbix/locale/ru/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/item/sinal vital/g' /var/www/html/zabbix/locale/ru/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Itens/Sinais Vitais/g' /var/www/html/zabbix/locale/ru/LC_MESSAGES/frontend.po

# sed -i -e ':g;/^msgstr/s/Item/Sinal Vital/g' /var/www/html/zabbix/locale/ru/LC_MESSAGES/frontend.po


Eentão gerar os nossos arquivos frontend.mo atualizados:
# sh update_po.sh

E coloca-los na interface gráfica do Zabbix:
# cp /root/fr/LC_MESSAGES/frontend.po/frontend.mo /var/www/html/zabbix/locale/fr/LC_MESSAGES/frontend.mo
cp: sobrescrever “/var/www/html/zabbix/locale/fr/LC_MESSAGES/frontend.mo”? y

# cp /root/it/LC_MESSAGES/frontend.po/frontend.mo /var/www/html/zabbix/locale/it/LC_MESSAGES/frontend.mo
cp: sobrescrever “/var/www/html/zabbix/locale/it/LC_MESSAGES/frontend.mo”? y

# cp /root/ru/LC_MESSAGES/frontend.po/frontend.mo /var/www/html/zabbix/locale/ru/LC_MESSAGES/frontend.mo
cp: sobrescrever “/var/www/html/zabbix/locale/ru/LC_MESSAGES/frontend.mo”? y


Reiniciar o Apache
# systemctl restart httpd

E pronto:
Interface Gráfica com o Hack Aplicado

Conclusão:

Esse é apenas um pequeno exemplo de que com um pouco de criatividade e algum esforço, podemos levar o Zabbix a outros nichos e ampliar a nossa área de atuação, seja ela pessoal, acadêmica ou profissional.

segunda-feira, 9 de janeiro de 2017

Configurando um IP fixo na interface eth0 do BeagleBone Black

Introdução

Ao conectar o BBB (BeagleBone Black) no computador e instalar os drivers necessários, ele automaticamente cria uma conexão usb0 com o IP 192.168.7.2. Mas ele possui uma interface de rede, a eth0, e nem sempre estamos em um ambiente com DHCP.

O Ambiente

Estou usando a imagem Debian 8.6 2016-11-06 4GB SD LXQT

O Problema

Configurar um IP para essa interface deveria ser uma tarefa simples, bastaria editar o arquivo /etc/network/interfaces e configurar de acordo com sua necessidade:
# vi /etc/network/interfaces
auto eth0
 iface eth0 inet static
    address 10.0.1.100
    netmask 255.255.255.0
    network 10.0.1.0
    gateway 10.0.1.1
    dns-nameservers 8.8.8.8



Só que isso simplesmente não funciona! Você reinicia ele e nada.

A Solução

Depois muito pesquisar achei a solução em uma lista de discussão:
Primeiro vamos descobrir o identificador da interface
# connmanctl services
*AO Wired                ethernet_d05fb8ed4f78_cable


Depois vamos usar o comando connmanctl config para configurar as opções da interface
# connmanctl config ethernet_d05fb8ed4f78_cable --ipv4 manual 10.0.1.100 255.255.255.0 10.0.1.1 --nameservers 8.8.8.8
E agora já podemos visualizar os novos parâmetros da interface através do comando ip
# ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,DYNAMIC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether d0:5f:b8:ed:4f:78 brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.100/24 brd 10.0.1.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::d25f:b8ff:feed:4f78/64 scope link
       valid_lft forever preferred_lft forever


E pronto você já pode executar um ping www.google.com por exemplo, para validar sua conexão com a internet.

Se você quiser reverter, e usar novamente a interface eth0 como DHCP, basta executar o comando
# connmanctl config ethernet_d05fb8ed4f78_cable --ipv4 dhcp

Fonte:

Google Groups BeagleBoard