12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- 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))),
- )
|