from django.core.management.base import BaseCommand import socket, csv from pytz import timezone from datetime import datetime from collections import namedtuple from itertools import groupby from services.models import IPResource def from_livestatus(get, query=[], columns=[]): query = ['GET %s' % get] if columns: query += ["Columns: " + ' '.join(columns)] query = ''.join(map(lambda s: s + '\n', query)) if columns: Line = namedtuple(get.capitalize(), columns) else: Line = None lines = [] with socket.create_connection(("nucnagios.tetaneutral.net", "8622")) as sock: sock.send(query.encode('utf-8')) sock.shutdown(socket.SHUT_WR) infile = sock.makefile(encoding='utf-8') for row in csv.reader(infile, delimiter=';'): if not Line: Line = namedtuple(get.capitalize(), row) continue lines.append(Line(*row)) return lines class Command(BaseCommand): help = 'Récupération du dernier ping depuis check_mk' def handle(self, *args, **options): paris = timezone('Europe/Paris') hosts = from_livestatus('hosts', columns=['name', 'address', 'last_check', 'last_time_up']) data = {} # quelques IP sont listées curieusement plusieurs fois, on prend la première occurence for address, group in groupby(sorted(hosts, key=lambda host: host.address), lambda host: host.address): last_check = last_time_up = 0 host = next(group) IPResource.objects.filter(ip=address).update( checkmk_label=host.name, last_check=paris.localize(datetime.fromtimestamp(int(host.last_check))), last_time_up=paris.localize(datetime.fromtimestamp(int(host.last_time_up))), )