fetchping.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. from django.core.management.base import BaseCommand
  2. import socket, csv
  3. from pytz import timezone
  4. from datetime import datetime
  5. from collections import namedtuple
  6. from itertools import groupby
  7. from services.models import IPResource
  8. def from_livestatus(get, query=[], columns=[]):
  9. query = ['GET %s' % get]
  10. if columns:
  11. query += ["Columns: " + ' '.join(columns)]
  12. query = ''.join(map(lambda s: s + '\n', query))
  13. if columns:
  14. Line = namedtuple(get.capitalize(), columns)
  15. else:
  16. Line = None
  17. lines = []
  18. with socket.create_connection(("nucnagios.tetaneutral.net", "8622")) as sock:
  19. sock.send(query.encode('utf-8'))
  20. sock.shutdown(socket.SHUT_WR)
  21. infile = sock.makefile(encoding='utf-8')
  22. for row in csv.reader(infile, delimiter=';'):
  23. if not Line:
  24. Line = namedtuple(get.capitalize(), row)
  25. continue
  26. lines.append(Line(*row))
  27. return lines
  28. class Command(BaseCommand):
  29. help = 'Récupération du dernier ping depuis check_mk'
  30. def handle(self, *args, **options):
  31. paris = timezone('Europe/Paris')
  32. hosts = from_livestatus('hosts', columns=['name', 'address', 'last_check', 'last_time_up'])
  33. data = {}
  34. # quelques IP sont listées curieusement plusieurs fois, on prend la première occurence
  35. for address, group in groupby(sorted(hosts, key=lambda host: host.address), lambda host: host.address):
  36. last_check = last_time_up = 0
  37. host = next(group)
  38. IPResource.objects.filter(ip=address).update(
  39. checkmk_label=host.name,
  40. last_check=paris.localize(datetime.fromtimestamp(int(host.last_check))),
  41. last_time_up=paris.localize(datetime.fromtimestamp(int(host.last_time_up))),
  42. )