zabbix-print-report.py - Zabbix: отчет печати на МФУ
Отчеты через Zabbix API интерфейс, сгенерированые с помощью Python и Zabbix API
Исторические данные (Местоположение, Имя принтера, MAC, Количество напечатанных страниц за заданный период) забираются с СУБД подключенной к Zabbix, записываются в файл print.xslx
При запуске скрипт собирает данные за предыдущий месяц, создает в книге Excel лист с текущим годом (если еще не создан) и вносит данные в колонку за прошедший месяц по количеству отпечатанных страниц.
- openpyxl (модуль для работы с Excel таблицами)
- pyzabbix (модуль для работы с API Zabbix)
# -*- coding: utf-8 -*- from datetime import datetime import os, sys import time import calendar import datetime import openpyxl import logging sys.path.append("C:\temp") from pyzabbix import ZabbixAPI from openpyxl.styles import Border, Side, PatternFill, Font, GradientFill, Alignment from openpyxl import Workbook from python_settings import settings logging.basicConfig(level=logging.ERROR, format='%(asctime)s %(name)s %(levelname)s %(message)s', datefmt='%d-%m %H:%M:%S', filename='log_hist') logger = logging.getLogger('-') logger.setLevel(logging.INFO) thin = Side(border_style="thin", color="000000") double = Side(border_style="double", color="ff0000") border = Border(top=double, left=thin, right=thin, bottom=double) fill = PatternFill("solid", fgColor="DDDDDD") font = Font(b=True, color="000000") al = Alignment(horizontal="center", vertical="center") mydir = 'D:/temp' myfile = 'print.xlsx' pathe = os.path.join(mydir, myfile) server = '< Адрес Zabbix сервера >' zapi = ZabbixAPI(server) zapi.login("логин", "пароль") print(datetime.datetime.now()) datyear = datetime.datetime.today().strftime("%Y") datmonth = datetime.datetime.today().strftime("%m") datmoday = datetime.datetime.today().strftime("%d") time_till = time.mktime(datetime.datetime.now().timetuple()) def histry (item_id, s_date, s_month, s_year, s_time, e_date, e_month, e_year, e_time): global datt, vall, history dat = str(s_date) + "/" + str(s_month) + "/" + str(s_year) + str(s_time) time_start = time.mktime(datetime.datetime.strptime(dat, "%d/%m/%Y %H:%M").timetuple()) time_start = (str(time_start)).split('.')[0] logger.info("histry - time_start: " + str(time_start)) dat = str(e_date) + "/" + str(e_month) + "/" + str(e_year) + str(e_time) time_end = time.mktime(datetime.datetime.strptime(dat, "%d/%m/%Y %H:%M").timetuple()) time_end = (str(time_end)).split('.')[0] logger.info("histry - time_end: " + str(time_end)) history = zapi.history.get(itemids=[item_id], time_from=time_start, time_till=time_end, output='extend', limit="5000", ) if history: datt = format(datetime.datetime.fromtimestamp(int(history[0]['clock'])).strftime("%x %X")) vall = history[0]['value'] logger.info("Дата: " + datt + " Распечатано на дату: " + vall) else: datt = datetime.datetime.today().strftime("%Y") vall = '0' logger.info("Дата: " + datt + " Распечатано на дату: " + vall) #print("Дата: " + datt + " Распечатано на дату: " + vall) return datt, vall, history wb = openpyxl.load_workbook(filename = pathe) sheetsnames = wb.sheetnames sheetsnames.reverse() point = sheetsnames[0] if point != datyear: sheet = wb.create_sheet(title=datyear) sheet.cell(row=1, column=1).value = 'Подразделение' sheet.cell(row=1, column=2).value = 'Кабинет' sheet.cell(row=1, column=3).value = 'ID' sheet.cell(row=1, column=4).value = 'Модель' sheet.cell(row=1, column=5).value = 'IP' sheet.cell(row=1, column=6).value = 'MAK' sheet.cell(row=1, column=7).value = 'Январь' sheet.cell(row=1, column=8).value = 'Февраль' sheet.cell(row=1, column=9).value = 'Март' sheet.cell(row=1, column=10).value = 'Апрель' sheet.cell(row=1, column=11).value = 'Май' sheet.cell(row=1, column=12).value = 'Июнь' sheet.cell(row=1, column=13).value = 'Июль' sheet.cell(row=1, column=14).value = 'Август' sheet.cell(row=1, column=15).value = 'Сентябрь' sheet.cell(row=1, column=16).value = 'Октябрь' sheet.cell(row=1, column=17).value = 'Ноябрь' sheet.cell(row=1, column=18).value = 'Декабрь' sheet.cell(row=1, column=19).value = 'Итого за год' sheet.cell(row=1, column=20).value = 'Всего' cel = 2 y = 1 while y < 21: sheet.cell(row=1, column=y).alignment = al sheet.cell(row=1, column=y).font = font sheet.cell(row=1, column=y).fill = fill y = y + 1. while cel < 102: y = 1 sheet.cell(row=cel, column=3).value = 'Printer-0' + '{:03}'.format(cel - 1) while y < 21: sheet.cell(row=cel, column=y).alignment = al y = y + 1 cel = cel + 1 elif point == datyear and datmonth != "01": sheet = wb[datyear] elif point == datyear and datmonth == "01": datyear_december = str(int(datyear)-1) sheet = wb[datyear_december] # ID групп в заббиксе с МФУ и принтерами if pathe: hosts = zapi.host.get(groupids=[28,29,30,39,40], output=["hostid", "name"] ) # Получение данных по принтерам (id принтера, кол-во отпечатанных страниц, местоположение, модель, mac адрес, ip адрес) с db Zabbix for point in hosts: hostname = point['name'] hid = point['hostid'] item = zapi.item.get(hostids=hid, output=["itemid", "name"], filter={'name':'Отпечатано страниц всего'} ) print (item) iten = zapi.item.get(hostids=hid, output=["lastvalue", "name"], filter={'name':'Расположение'}) # вывод полных логов по каждой МФУ #iten = zapi.item.get(hostids=hid, # selectInventory=['name','location']) #print (iten) if iten: location = iten[0]['lastvalue'] iten = zapi.item.get(hostids=hid, output=["lastvalue", "name"], filter={'name':'Модель'} ) if iten: mdel = iten[0]['lastvalue'] iten = zapi.item.get(hostids=hid, output=["lastvalue", "name"], filter={'name':'MAC Address'} ) if iten: maca = str(iten[0]['lastvalue']) ips = zapi.hostinterface.get(hostids=hid, output=["ip"], filter={'name':'ip'} ) ip = ips[0]['ip'] m = j = 2 hos = sheet.cell(row=m, column=3).value logger.info("--- Месяц " + datmonth + " -------------------------------------------------------------------------------") logger.info("МФУ: " + hostname) #print ("МФУ: " + hostname) logger.info("Модель: " + mdel) print ("Модель: " + mdel) logger.info("MAC: " + maca) #print ("MAC: " + maca) logger.info("IP: " + ip) #print ("IP: " + ip) logger.info("Местоположение: " + location) #print("Местоположение: " + location) logger.info("------------------------------") # Получение данных по печати за прошлый месяц for point in item: item_id = point['itemid'] if datmonth != "01": lastm = calendar.monthrange(int(datyear),int(datmonth)-1)[1] histry (item_id, 1, str(int(datmonth)-1), datyear, " 00:00", str(lastm), str(int(datmonth)-1), datyear, " 23:30") datt1 = datt vall1 = vall if not history: vall1 = 0 histry (item_id, lastm, str(int(datmonth)-1), datyear, " 18:00", str(lastm), str(int(datmonth)-1), datyear, " 23:30") datt31 = datt vall31 = vall if not history: while not history and lastm != 1: lastm-=1 histry (item_id, lastm, str(int(datmonth)-1), datyear, " 18:00", str(lastm), str(int(datmonth)-1), datyear, " 23:30") if history: datt31 = datt vall31 = vall if lastm == 1: vall = 0 if datmonth == "01": lastm = calendar.monthrange(int(datyear)-1,12)[1] histry (item_id, 1, 12, str(int(datyear)-1), " 00:00", str(lastm), 12, str(int(datyear)-1), " 23:30") datt1 = datt vall1 = vall if not history: vall = 0 histry (item_id, lastm, 12, str(int(datyear)-1), " 18:00", str(lastm), 12, str(int(datyear)-1), " 23:30") datt31 = datt vall31 = vall if not history: while not history and lastm != 1: lastm-=1 histry (item_id, lastm, 12, str(int(datyear)-1), " 18:00", str(lastm), 12, str(int(datyear)-1), " 23:30") if history: datt31 = datt vall31 = vall if lastm == 1: vall = 0 # Сохранение полученной информации в Excel книгу while hos and j != 1: if hos == hostname: vall_r = int(vall31) - int(vall1) if (datmonth != "01"): sheet.cell(row=m, column=(int(datmonth) + 5)).value = vall_r elif (datmonth == "01"): sheet.cell(row=m, column=18).value = vall_r i = 7 vall_sum = 0 while i < 18: vall_s = sheet.cell(row=m, column=i).value if vall_s is None: vall_s = 0 vall_sum = int(vall_s) + int(vall_sum) i = i + 1 sheet.cell(row=m, column=19).value = vall_sum sheet.cell(row=m, column=20).value = vall31 if location: sheet.cell(row=m, column=2).value = location else: sheet.cell(row=m, column=2).value = 'Не определен' if mdel: sheet.cell(row=m, column=4).value = mdel else: sheet.cell(row=m, column=4).value = 'Модель не определена' HTTP = "http://" + ip sheet.cell(row=m, column=5).value = HTTP if (maca != "0" and maca != None and maca != 0): sheet.cell(row=m, column=6).value = maca j = 1 logger.info("------------------------------") logger.info("Распечатано за месяц: " + str(vall_r)) print("Распечатано за месяц: " + str(vall_r)) logger.info("Распечатано за год: " + str(vall_sum)) print("Распечатано за год: " + str(vall_sum)) m = m + 1 hos = sheet.cell(row=m, column=3).value vall = 0 datt = 0 vall_end = 0 datt_end = 0 sheet.column_dimensions['A'].width = 63 sheet.column_dimensions['C'].width = 8 sheet.column_dimensions['D'].width = 20 sheet.column_dimensions['E'].width = 18 sheet.column_dimensions['F'].width = 16 sheet.column_dimensions['S'].width = 15 wb.save(pathe)