WHOIS para Windows - Código em Java - Executar via CMD

Olá rede,

No Windows temos uma gama enorme de aplicações e facilidade na instalação dos mesmos, como usuário antigo do sistema já estou acostumado e conheço muitos atalhos para resolver alguns problemas também. Porém (na minha opinião) quando experimentei uma distro Linux para trabalhar com redes tive uma visão completamente diferente na questão de executar comandos/consultas para efeturar troubleshootings do dia a dia, sem contar com as ferramentas que já vem embarcadas no sistema.

Pois bem, uma das consultas que utilizo frequentemente é o WHOIS

WHOIS é um protocolo usado para consultar os bancos de dados que armazenam as informações sobre quem são os proprietários ou registrantes de um domínio.

Ele utiliza TCP na porta 43 para solicitar os dados de acordo com certos parametros e exibir os resultados. Mas no Windows você não consegue rodar o comando pelo terminal whois -h dominio servidorwhois igual em algumas distros Linux nativamente...

Existe uma opção baixando um executável no kit de ferramentas da Sysinternals, mas em alguns bancos whois não funcionou, e para um analista é imprescindível visualizar e testar diversos detalhes até identificar o problema para resolver.

Neste caso resolvi ir atras pra entender o protocolo e me desafiei a gerar um código que faça a consulta direto pelo terminal. O whois teve sua primeira RFC de número 812 gerada em 1982, teve uma atualização em 1985 RFC 954 e atualmente está na RFC 3912 de 2004, consulte aqui.

Notei que o funcionamento é relativamente simples, um servidor WHOIS escuta na porta 43 e troca informações de texto no sentido cliente <> servidor em ASCII, ora, mas se é tão simples assim, como é o conteudo do pacote que vai e retorna?

conexão tcp cliente servidor

Ao realizar uma consulta whois 8.8.8.8 whois.radb.net temos o resultado abaixo:

conexão tcp e consulta do protocolo whois

Dentro da query vai o IP ou dominio na porta 43, chegando la o servidor le a solicitação...

E devolve o resultado em texto

Pronto, fim!

Mas e agora? Como que vou convertir isso em código e criar um executável? Aqui que entra o JAVA, mexi com ele na faculdade então vamos reviver algumas lembranças...

Optei por utilizar o Apache NetBeans, busquei em algumas páginas informações sobre como trabalhar com sockets em Java e voy a la, não só descobri muita coisa mas que existe um pacote próprio para o whois denominado de org.apache.commons.net.whois...

Ai surgiu uma dor de cabeça, perdi um bom tempo e não obtive sucesso em importar o pacote para dentro do NetBeans, vamos para outra tentativa, encontrei os pacotes java.net e java.io que possibilitaram iniciar a ideia, bom, não tenho muitas habilidades com programação, então o Google me serviu muito bem nesse momento, diversas lógicas apareceram, e ao entender cada linha identada e seu comportamento consegui escrever em 23 linhas o que precisava!

Após compilado e aquivo .jar gerado, apareceu mais um erro, voltei ao Google e consegui contornar.... o Java gerou o arquivo MANIFEST faltando informação!

C:\Users\luiz.oliveira\Documents\NetBeansProjects\appWhois\target>java -jar appWhois-1.0-SNAPSHOT.jar
no main manifest attribute, in appWhois-1.0-SNAPSHOT.jar

Pra corrigir é simples, basta abrir o arquivo .jar com o winrar por exemplo, e editar o MANIFEST, inserindo o atributo Main-Class, no meu caso ficou desta forma:

Arquivo salvo, e no teste do script funcionou, capturando os paramentos e fazendo a consulta

C:\Users\luiz.oliveira>java -jar whois.jar 8.8.8.8 whois.radb.net
route:      8.8.8.0/24
origin:     AS15169
descr:      Google
notify:     radb-contact@google.com
mnt-by:     MAINT-AS15169
changed:    radb-contact@google.com 20230208
source:     RADB

Pra ficar mais gourmet o acionamento do script, optei por gerar um arquivo .bat fazendo o trabalho de chamar o Java e encaminhar os dados para consulta, e o resultado final ficou assim:

C:\Users\luiz.oliveira>whois 8.8.8.8 whois.radb.net
route:      8.8.8.0/24
origin:     AS15169
descr:      Google
notify:     radb-contact@google.com
mnt-by:     MAINT-AS15169
changed:    radb-contact@google.com 20230208
source:     RADB
C:\Users\luiz.oliveira>whois google.com whois.radb.net
inet-rtr:       Google.com
org:            ORG-NA1296-RIPE
local-as:       As197207
ifaddr:         172.217.169.238 Masklen 0
ifaddr:         172.217.0.0 Masklen 0
admin-c:        DUMY-RIPE
tech-c:         DUMY-RIPE
mnt-by:         Jb71-mnt
created:        2021-06-10T15:02:02Z
last-modified:  2021-06-10T15:14:15Z
source:         RIPE
C:\Users\luiz.oliveira>whois As197207 whois.radb.net
aut-num:        AS197207
as-name:        MCCI-AS
org:            ORG-MCCo2-RIPE

Por enquanto o script trabalha exigindo dois argumentos que é o DOMINIO/IP/ASN/INFORMAÇÃO e o SERVIDORWHOIS, nesse caso criei uma validação do array que só prossegue se tiver as duas informações, então a conexão TCP não é iniciada.

C:\Users\luiz.oliveira>whois google.com
Você deve digitar o dominio e o servidor whois para consulta.

A ideia é aprimorar o código para que faça consultas personalizadas podendo ser apenas com um argumento e fazer uma solicitações para alguns servidores whois.

Código validado, abertura de conexão TCP, execução e finalização da comunicação.


Código da aplicação:

package com.mycompany.appwhois;

import java.net.*;

import java.io.*;


/**

 *

 * @author luiz.oliveira

 */

public class AppWhois {

        

      public static void main(String[] args) throws IOException {

        if (args.length != 2) {

            System.out.println("Erro: Você deve digitar o dominio e o servidor whois na linha de comando.");

            System.exit(1);

        }

        String dominio = args[0];

        String servidorWhois = args[1];

        Socket socket = new Socket(servidorWhois, 43);

        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        out.println(dominio);

        String linha;

        while ((linha = in.readLine()) != null) {

            System.out.println(linha);

        }

        socket.close();

    }

}


Basta compilar e gerar o arquivo .jar, após esse processo crie um arquivo .bat que chamará sua aplicação, o conteudo do arquivo ficou assim:

whois.bat:

@echo off

java -jar whois.jar %1 %2 %3


Mova o arquivo .jar e o arquivo .bat para a pasta System32 que fica dentro da pasta principal Windows, agora poderá executar a aplicação direto do CMD/Terminal com os parâmetros apresentados acima.


Até a proxima!



  1. #WHOIS #Java #Windows #Rede #ProtocoloWHOIS #Programação #Desenvolvimento #Internet #Tecnologia #Informática #codigowhois #whoisjava #whoiscmd

Integrar Google Sheets com Grafana


Olá galera!

Há algum tempo venho trabalhando e buscando soluções criativas no tocante a monitoramento, visualização de alarmes de forma prática e assertiva, e o mais interessante (pra quem gosta de livro com figurinha) a visualização de forma gráfica! O artigo que trago hoje é sobre realizar a integração do Google Sheets com o Grafana e gerar dashboard com dados coletados em planilhas privadas (utilizando o JWF) e públicas.


Iniciando a integração...

No menu Configurações, navegue até guia Plugins e pesquise por "sheets", após encontrar o item acesse o mesmo e clique no botão instalar. Se tudo ocorrer bem deverá listar como Instalado.

plugin instalado e ativo

No mesmo menu, acesse a guia Data Sources e escolha o Google Sheets.

  1. Planilhas privadas com JWF

Vamos criar agora as credenciais necessárias via Google Cloud Console para atrelar ao data source, acesse no link abaixo:

Google Cloud Console - APIs e serviços

Crie um novo projeto (ou utilize um que já tens), acesse o item Credenciais no menu lateral esquerdo e clique no botão Criar Credenciais -> Conta de Serviço.


Na proxima página, role até em baixo e clique em Criar, avance Permissões da conta de serviço clicando em continuar.

Nesta etapa crie a chave da API clicando em Criar chave escolha o tipo JSON e clique no botão para finalizar, pronto! Arquivo JWF baixado no seu computador.

Agora precisamos inserir os serviços Sheets e Drive dentro do projeto, para isso utilize os links abaixo e clique em Ativar.

Google Sheets

Google Drive

Dentro do Data Source do Sheets, escolha a opção de JWF File e importe o arquivo baixado, note que os campos que antes estavam vazios agora estão preenchidos com os dados do arquivo

Clique no botão Save & Test para validar a integração.

-- ATENÇÃO

Para que funcione a integração de planilhas privadas se faz necessário autorizar o e-mail gerado pela API na planilha.

  1. Planilhas públicas

Neste formato o procedimento é mais simples, bastando aplicar a chave gerada pela API dentro do Data Source.


Dashboard

crie uma dash nova e adicione um novo painel

Para iniciar a configuração da dash do Grafana e a coleta dos dados, precisamos entender os itens abaixo:

Spreadsheet ID: link da planilha que está entre o /d/ e /edit

Range: nome-da-pagina-planilha!G3:H30 <- o range de onde quer coletar as informações, neste caso do G3 ao H30.

Cache Time - Setando o valor 0 indicará que não é necessário cache. Para planilhas volumosas e grande número de dados, utilize um valor dentro de 5m a 30m

Use Time Filter - Essa função permite que a primeira coluna seja filtrada por tempo.

exemplo de como ficará a consulta

Vamos trabalhar com algumas funções interessantes do Grafana nesta etapa, caso não esteja efetuando tratamentos diretamente pelo Sheets.

utilizando bar chart para essa dashboard

Com a query previamente configurada, note que automaticamente os dados irão aparecer no item que selecionamos, estou aplicando cores diferentes de acordo com o valor que configurei no treshold, esse foi o resultado:

Agora vamos limitar em no máximo 5 linhas e organizar por ordem decrescente utilizando as funções Transform, selecione Sort by e Limit.

Após aplicar os respectivos valores, esse é o novo resultado:

Salve a dashboard e artigo finalizado!




#zabbix #monitoramento #integracaozabbix #sheets #grafana #googlesheets #grafanadash