Как стать автором
Обновить

Мониторинг SMART HDD — windows + python + zabbix

Время на прочтение3 мин
Количество просмотров11K
Скачаем и установим нижеследующие программы.

Python 3.6.4
SMART montools

Не забудьте поменять %username% на имя пользователя в системе. Полный путь можно получить при установке Python 3.6.4

Не забудьте, что запускать установку нужно от лица администратора системы.

Код принимает два параметра из командной строки — имя диска и параметр который нужно вывести. В случае запуска без параметров — происходит обнаружение дисков и на выходе получаем готовый формат который принимает zabbix-server.

Выкладываем код в любую доступную вам директорию. Главное указать этот же путь в UserParameter

from subprocess import Popen, PIPE, check_output
import re
import json
import sys
import hashlib

path = '\"C:\\Program Files\\smartmontools\\bin\\smartctl\"'  # for linux use 'sudo smartctl'
smart_params = ['Model_Family', 'Device_Model', 'Serial_Number', 'test_result', 'Firmware_Version']  # if u need more \
# add ur data to this list
codec = 'windows-1252'  # for linux use utf8


def params(disk_name, raw_data=""):
    # Pars output from smartctl
    if raw_data not in smart_params and raw_data != "":
        # Pars smartctl data from sensors (smartctl -A /dev/sd*)
        out_data = re.findall(r'{}.*- *(\d+)'.format(raw_data),
                              Popen('{} -x /dev/{}'.format(path, disk_name), shell=True, stdout=PIPE,
                                    ).communicate()[0].decode(codec))
        return out_data[0]
    elif raw_data != "" and raw_data in smart_params:
        # Pars smartctl information about disks (smartctl -i /dev/sd*)
        out_data = re.findall(r'{}. *(.*)'.format(raw_data.replace('_', ' ')),
                              Popen('{} -x /dev/{}'.format(path, disk_name), shell=True, stdout=PIPE,
                                    ).communicate()[0].decode(codec))
        return out_data[0]
    elif raw_data == "":
        # check sum of smartctl --scan
        hash_object = hashlib.sha224(check_output(path + " --scan"))
        return hash_object.hexdigest()


try:
    # if no argumens from cli works as discovery
    try:
        if sys.argv[1] and sys.argv[2]:
            print(params(sys.argv[1], sys.argv[2]))
    except IndexError:
        print(params(sys.argv[1]))

except IndexError:
    # Discovery for disks
    data = check_output(path + " --scan").decode(codec)
    disks = set(re.findall(r'/dev/(.{3})', data))
    output = []

    for disk in disks:
        smart = check_output(path + " -i /dev/{}".format(disk)).decode(codec)
        if smart:
            output.append({"{#DISKNAME}": disk, "{#SMART_ENABLED}": "1"})
        else:
            output.append({"{#DISKNAME}": disk, "{#SMART_ENABLED}": "0"})
    output = {"data": output}
    print(json.dumps(output))

На наблюдаемый хост в zabbix-agentd.conf или, если у вас открыта секция Include то в определенный в ней файл, добавить UserParameters указанные ниже

UserParameter=uHDD.discovery,C:\\Users\\%username%\\AppData\\Local\\Programs\\Python\\Python36-32\\python.exe C:\\zabbix\\lld\\hdd_discovery.py
UserParameter=uHDD[*],C:\\Users\\%username%\\AppData\\Local\\Programs\\Python\\Python36-32\\python.exe C:\\zabbix\\lld\\hdd_discovery.py $1 $2

Добавление шаблона на сервер ''Zabbix''

Выложил на git — не думаю что вся репа очень позитивна — я учусь :)

Скачиваем шаблон — импортируем на сервер и добавляем на наблюдаемый хост.
Можно добавлять свои элементы данных. Логика такова — элемент данных отправляет параметры скрипту, который в свою очередь парсит вывод smartctl, если хотите что то добавить свое, нет проблем — в коде есть комментарии, которые помогут вам это сделать.

P.S. Скрипт для ленивых. С Linux уже как год работает такой же мониторинг таких же дисков, до Windows руки только дошли.
Теги:
Хабы:
Всего голосов 5: ↑3 и ↓2+1
Комментарии9

Публикации

Истории

Работа

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань