суббота, 5 декабря 2020 г.

Мониторим обновления в ubuntu с помощью python, influxdb, grafana

Заваливаешь бывает ты такой по ssh на какой нибудь сервер и если все актуальные обновления натянуты, то тебе рисуется в приветственном сообщении такая картинка:


 


 И мне понадобилось знать когда вот приходят эти обновления, заодно чтобы рисовалось на графике - когда они поступали, когда устанавливались ну и заодно чтобы отзванивало о новых обновлениях в телеграмм...

Вообще в ubuntu информация об обновлениях в приветственное сообщение когда по ssh заваливаешь попадает из файла, который находится по пути /var/lib/update-notifier/updates-available. Вот его мы и будем использовать... 

У меня уже имеется в хозяйстве готовый стэк с influxdb в связке с grafana, которая рисует данные из него. Всё что мне необходимо - это послать http запросом данные метрик в influxdb, а об отрисовке данных и посылке их в telegram уже позаботится grafana. Для начала в influx я создаю новую базу с именем softwareupdates. Чтобы не долго заморачиваться - я написал скрипт на python:

#!/usr/bin/env python3

import time
import requests
import sys
import re
import os
import subprocess

hostname = os.uname()[1]
influxdbinitial = 'https://influxdb.host.tld/write?db=softwareupdates'


# функция для добавления в БД influxdb инфы о обновлениях
def puttoinfluxdb(totalupdates, securityupdates):
   # заправляем инфу о кол-ве общих обновлений
   data_binary = 'softwareupdates,host='+hostname+' totalupdates='+totalupdates
   try:
       response = requests.post(influxdbinitial, data=data_binary)
       print(response)
   except requests.exceptions.RequestException as e:  # This is the correct syntax
       print (e)
       sys.exit(1)
   # заправляем инфу о кол-ве обновлений на безопасность
   data_binary = 'softwareupdates,host='+hostname+' securityupdates='+securityupdates
   try:
       response = requests.post(influxdbinitial, data=data_binary)
       print(response)
   except requests.exceptions.RequestException as e:  # This is the correct syntax
       print (e)
       sys.exit(1)


def updatesnotifyget():
   #subprocess.run(["/usr/bin/apt", "update"])
   #time.sleep(3)
   f = open("/var/lib/update-notifier/updates-available", "r")
   lines = f.readlines()
   # print(lines[1])  
   totalupdates = re.sub("[^0-9^]", "", lines[1])
   securityupdates = re.sub("[^0-9^]", "", lines[2])
   puttoinfluxdb(totalupdates, securityupdates)

if __name__ == "__main__":
   updatesnotifyget()

Теперь сохраняю этот скрипт в /opt/scripts/checksoftwareupdates.py и даю права на выполнение оного с помощью chmod+x /opt/scripts/checksoftwareupdates.py. Далее пихаем скрипт в cron:

# check software updates
*/58,*/10,*/20 * * * *
/opt/scripts/checksoftwareupdates.py

# ^ буду запускать каждую 10, 20 и 58 минуту каждого часа

В графане создаю новый график, куда запихиваю данные и в итоге получаю:

Там же, в графане, делаем в этом графике алерт и в итоге в телегу при появлении каких то обновлений в системе начинает прилетать:


Комментариев нет:

Отправить комментарий