Monitore seu sistema a partir do Telegram

Neste texto, eu vou mostrar como configurar o seu primeiro bot, criar um grupo de administradores e preparar um script simples que permitirá mantê-lo atualizado sobre alguns recursos de sua máquina, mas depois que você ver a simplicidade desse procedimento, o único risco vai ser de você se empolgar e começar a receber mensagens demais no seu mensageiro, então leia, entenda e use com moderação.

A API aberta do Telegram, famoso mensageiro de código aberto, é bem conhecida e amada por desenvolvedores e curiosos. E razões para isso não faltam, depois de um pouco de trabalho manual é fácil fazer com que qualquer sistema possa enviar mensagens por este mensageiro deixando o administrador ou uma equipe inteira a par do que está acontecendo.

Dependendo do sistema a ser monitorado as possibilidades são infinitas. Em um servidor Linux o céu é o limite, mas qualquer ambiente que o permita fazer consultas a partir de uma requisição WEB fica fácil implementar um monitoramento deste tipo.

Criando o bot

Esta é a parte manual do procedimento. Você precisa usar um cliente do Telegram qualquer, seja no smartphone, pc, tablet ou o cliente web para “conversar com o “BotFather” e criar o seu robô.

Embora as explicações pareçam longas, na verdade, os procedimentos são bem simples e mesmo que seja a primeira vez que você se aventure a fazer esta tarefa, em menos de 5 minutos o bot estará criado.

  1. A partir do seu cliente do Telegram procure na lista de usuários por “BotFather”. Não se preocupe, você não terá que falar com algum estranho, este não é um usuário real é apenas um robô que interagimos através de mensagens para criação de outros robôs;
  2. Assim que o encontrar “BotFather”, envie uma mensagem para ele informando apenas a instrução “/newbot“;
  3. Você deverá ser respondido imediatamente com o pedido para informar o nome do seu novo robô. Use a imaginação e ponha o nome que quiser, mas fica a recomendação:

    No futuro você poderá esquecer quem está te mandando um monte de mensagens então, para não ter problemas consigo mesmo quando tudo estiver automatizado e você estiver recebendo 10, 100 ou 1000 mensagens por dia, é recomendável que o nome seja sugestivo como “Robo de monitoramento do site”, ou “Monitor sistema de cadastro” etc;
  4. Novamente você deve ser respondido bem rápido e qualquer que seja o nome, o BotFather vai achar ótimo. Agora ele te pedirá um “username” para o robô.

    Para escolher este username temos uma única regrinha: Obrigatoriamente ele deve terminar com o sufixo “bot”. Por exemplo “monitorbot”, “MeuRobot” etc.
  5. Feito! Seu robô está pronto para uso. O BotFather irá parabenizá-lo pela criação e dar algumas dicas rápidas mas a informação principal que você deverá anotar com todo carinho e segurança é o Token de acesso da API HTTP.

    Este token nada mais é do que uma sequencia aleatória de números e letras e que garantirá que somente você poderá usar este robô para enviar mensagens. Ele se parece com o exemplo abaixo e na mensagem do BotFather ele estará destacado em cor vermelho.

    Exemplo de Token para gerenciar o robô no Telegram: 1234567890:ABruuMhfy54dFDxcSDHGcvdfhgj345hgSDZ
Interação com o BotFather do Telegram para criação de um bot
Interação com o BotFather do Telegram para criação de um bot

Criação de um grupo para interação

Mesmo que seja apenas você quem vai ler as mensagens do robô é mais prático criarmos um grupo formado apenas por você e o robô. Isso vai poupá-lo de ficar adicionando o robô na sua lista de contatos, além de simplificar o trabalho ,caso depois você precise que outras pessoas vejam a mensagem também.

A criação do grupo é feita usando o seu cliente Telegram. Basta procurar onde está opção de “Novo Grupo”, criar o grupo com o nome que desejar e o mais importante, não esquecer adicionar você e o seu novo robô.

Obtendo o ChatID do novo grupo

Uma informação necessária que precisamos obter agora é o “ID do grupo”, ou o “ChatID”. Este é um código que identifica universalmente o seu grupo dentro do Telegram.

A forma mais rápida de conseguir isso é usando navegador WEB da nossa máquina. Observe este modelo de URL: https://api.telegram.org/botROBOTOKEN/getUpdates

Troque o “ROBOTOKEN” pelo token que recebemos do BotFather anteriormente, deixando a URL como neste exemplo (note que o “bot” foi propositalmente mantido no path quando substituí o token):

https://api.telegram.org/bot1234567890:ABruuMhfy54dFDxcSDHGcvdfhgj345hgSDZ/getUpdates

Agora copie esta URL e cole no seu navegador. Você deverá visualizar o dump de uma estrutura JSON como a do exemplo abaixo, onde a informação que nos interessa é aquele número negativo que esta dentro de “result[0].my_chat_member.chat.id”.

{
  "ok": true,
  "result": [
    {
      "update_id": 193853170,
      "my_chat_member": {
        "chat": {
          "id": -987654321,
          "title": "meu grupo",
          "type": "group",
          "all_members_are_administrators": true
        },
        "from": {
          "id": 111111111,
          "is_bot": false,
          "first_name": "Welington",
          "last_name": "Braga",
          "username": "welrbraga"
        },
        "date": 1623330829,
        "old_chat_member": {
          "user": {
            "id": 1111111111,
            "is_bot": true,
            "first_name": "Meu Bot",
            "username": "meubot"
          },
          "status": "left"
        },
        "new_chat_member": {
          "user": {
            "id": 1111111111,
            "is_bot": true,
            "first_name": "Meu bot",
            "username": "meubot"
          },
          "status": "member"
        }
      }
    }
  ]
}

Juntando o que temos

Até agora já temos as duas informações importantes que necessitamos:

  • O Token do nosso robô , que nos exemplos daqui em diante vamos usar: 1234567890:ABruuMhfy54dFDxcSDHGcvdfhgj345hgSDZ
  • O ChatID do grupo onde o robô enviará mensagens. Vamos usar o valor -987654321 como exemplo.

Nos falta agora uma ferramenta para interagir com a API via HTTP na linha de comandos.

No Linux a forma mais prática de se fazer isso por linha de comandos é usando o comando “curl”, e é ela que devemos ter instalada por hora com o comando abaixo (em distribuições baseadas em Debian, como Ubuntu, Mint etc)

sudo apt install curl

Você pode usar outra opção, inclusive montando sua ferramenta em Python, Ruby, Go, Java ou qualquer linguagem de sua preferência caso queira algo mais elaborado, mas para nossos propósitos o curl atenderá muito bem.

Fazendo o nosso robô “falar” pela primeira vez

Observe este modelo de URL: https://api.telegram.org/botROBOTOKEN/sendMessage?chat_id=CHATID&text=MINHAMENSAGEM

Nós vamos substituir o ROBOTOKEN e o CHATID pelas informações que já temos e finalmente a “MINHAMENSAGEM” por uma frase bem bonita como no exemplo abaixo:

https://api.telegram.org/bot1234567890:ABruuMhfy54dFDxcSDHGcvdfhgj345hgSDZ/sendMessage?chat_id=-987654321&text=Ola, eu sou o seu novo robo que vai dominar o mundo

Agora sim. Nós vamos colocar esta URL entre “aspas” e acessá-la via comando curl:

curl "https://api.telegram.org/bot1234567890:ABruuMhfy54dFDxcSDHGcvdfhgj345hgSDZ/sendMessage?chat_id=-987654321&text=Ola, eu sou o seu novo robo que vai dominar o mundo"

Com isso, você deverá receber um JSON como retorno do status na sua tela e a primeira mensagem do seu robô acabou de ser enviada. Você deverá vê-la publicada no seu grupo, lá no Telegram.

Isso não deve ser sido tão emocionante quanto ouvir o seu filho falar a primeira palavra, mas é igualmente útil. 😉

Criando nosso script para envio de mensagens

Agora que já conseguimos enviar nossa primeira mensagem, podemos criar uma função que possa ser invocada todas as vezes que quisermos.

Minha sugestão é o código abaixo que deve ser salvo em um arquivo com permissão de execução em qualquer diretório que faça parte do seu PATH, mas use a imaginação para alterá-la como desejar:

#!/bin/bash
# Envia mensagens via Telegram a partir do prompt de comandos do Linux
#
# Welington Braga - 2021-06 <https://blog.welrbraga.eti.br>

SendTelegram() {
  ROBOTOKEN=""  #Coloque o seu TOKEN aqui
  CHATID=""     #Coloque o CHATID do seu grupo aqui
  MENSAGEM="$1"
  curl --data-urlencode "text=${MENSAGEM}" \
     "https://api.telegram.org/bot${ROBOTOKEN}/sendMessage?chat_id=${CHATID}"
}

SendTelegram "$1"

Observe um detalhe fundamental aqui que precisei mudar do teste anterior para o script final: O parâmetro “text” que anteriormente foi passado na URL da API, desta vez está sendo passada com o auxílio do parâmetro “–data-urlencode” do curl.

Isso é necessário para que mensagens com “caracteres estranhos” possam ser corretamente codificadas e transmitidas. Sem isso você não poderia enviar mensagens com saídas de comandos que envolvam quebras de linha, e alguns símbolos especiais.

Salve este conteúdo em um arquivo com nome como “sendtelegram.sh”;

Dê permissão de execução com o comando chmod:

chmod +x sendtelegram.sh"

Mova o arquivo para um diretório que esteja no seu PATH para que ele possa ser invocado por outros usuários:

sudo mv sendtelegram.sh /usr/local/bin

O grande teste

Agora já podemos enviar mensagens pelo terminal de forma bem simples. Veja os exemplos abaixo:

sendtelegram.sh "Bom dia usuario"
sendtelegram.sh "monitorando host $HOSTNAME"
sendtelegram.sh "Uptime $(uptime)"
sendtelegram.sh "Estado do /home"
sendtelegram.sh "$(df -h /home)"
Mensagens enviadas com o script sendtelegram e recebidas no grupo do Telegram

Automatizando

Você pode usar o comando “sendtelegram.sh” a partir de qualquer lugar no seu computador, mas eu não poderia encerrar o assunto sem antes mostrar ao menos um exemplo da parte mais divertida e útil desta tarefa: Automatizar.

O meu primeiro exemplo será bem simples. Um script que toda manhã vai me enviar o uptime da máquina e o espaço disponível no meu volume de backup.

O segundo será tão simples quanto o primeiro, no entanto ele vai verificar e retornar o meu endereço IP público, que por ser dinâmico está sempre alterando, e se alguns hosts da minha rede estão online.

Monitorando o estado do sistema

Salve o snippet abaixo em um arquivo com nome monitor-diario (desta forma, sem extensão)

#!/bin/bash
#Envia mensagens diarias para o grupo no Telegram com o status da máquina
#
#Welington Braga - 2021-06 <https://blog.welrbraga.eti.br>

mensagem="Host: $HOSTNAME
Uptime: $(uptime)
Espaço no volume de backup:
$(df -h /media/veracrypt2)
"
sendtelegram.sh "$mensagem"

Uma vez que o arquivo esteja salvo, dê a ele permissão de execução e mova-o para a pasta /etc/cron.daily:

chmod +x monitor-diario
sudo mv monitor-diario /etc/cron.daily

O diretório /etc/cron.daily contém rotinas que devem ser executadas pelo cron diariamente (daí o seu nome) e em cada sistema ele tem um horário especifico de execução, por exemplo em sistemas Debian-like, isso ocorre as 6:25h, porém há três coisas importantes a saber aqui:

  1. O script não pode ter extensão
  2. O script deve ter permissão de execução
  3. O script será invocado pelo usuário root

A partir daqui todas as manhãs eu saberei se minha máquina esteve online e qual é situação do meu volume de backups – que prefiro só purgar os backups antigos quando realmente houver necessidade de espaço e não apenas para satisfazer um critério temporal.

Monitorando a rede

Este exemplo é um pouco mais trabalhoso e existem dezenas de maneiras de se chegar ao mesmo resultado, no entanto vamos seguir a ideia de que “o mais simples é o melhor”.

Salve o snippet abaixo em um arquivo com o nome monitor-rede.sh,

#!/bin/bash
#Retorna o IP público e monitora o status de alguns hosts na rede
#
#Welington Braga - 2021-06 <https://blog.welrbraga.eti.br>

HOSTS="192.168.88.1 192.168.88.30 192.168.88.31 192.168.88.32"
STATUS=$(fping $HOSTS)
PUBLICIP=$(curl -s https://ipecho.net/plain)
mensagem="IP público: $PUBLICIP
Status da rede
$STATUS 
"
sendtelegram.sh "$mensagem"

Quando o arquivo estiver salvo, dê a ele permissão de execução e o mova uma pasta acessível pelo $PATH

chmod +x monitor-rede.sh
sudo mv monitor-rede.sh /usr/local/bin

Ao contrário do exemplo anterior que a mensagem é enviada uma vez ao dia, este ai eu quero mensagens a cada de 4h em 4h. Desta forma teremos que fazer um agendamento personalizado no cron.

echo '2 */4 * * * root /usr/local/bin/monitor-rede.sh' | sudo tee /etc/cron.d/monitor-rede

Este agendamento vai invocar o nosso script monitor-rede.sh a cada 4h no segundo minuto de cada hora (0:02, 4:02, 8:02, 12:02 etc).

Poderíamos ter aberto um editor de textos e escrever aquela linha em um arquivo e depois salvá-la dentro de /etc/cron.d, mas para simplificar eu criei o arquivo dinamicamente com o comando “echo” e um redirecionamento que faz o mesmo efeito porém mais rápido.

Concluindo

Como eu disse lá no começo “o céu é o limite”. Estes scripts são bem básicos e acredito que sejam legíveis o bastante para atender a função de mostrar como usar o telegram para monitorar suas máquinas, mas não ache que para por ai.

Mas se tiver dúvidas sobre o uso tanto do script quanto do cron comenta ai embaixo.

Eu encerro este texto aqui para não ficar extenso do que já está, mas em um novo artigo a ser publicado em breve eu vou mostrar como receber mensagens do seu roteador Mikrotik.

Até lá.

Um comentário em “Monitore seu sistema a partir do Telegram”

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.