fastpinger.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. from django.db.models import Q, F
  2. from django.utils import timezone
  3. from services.models import IPResource
  4. import re
  5. from ipaddress import IPv4Address, AddressValueError
  6. def fastpinger_update(f):
  7. regex = re.compile('^(?P<ip>[0-9.]+)[ ]+: (?P<p1>([0-9]+.[0-9]+|-)) (?P<p2>([0-9]+.[0-9]+|-))'
  8. ' (?P<p3>([0-9]+.[0-9]+|-)) (?P<p4>([0-9]+.[0-9]+|-)) (?P<p5>([0-9]+.[0-9]+|-))$')
  9. up_count = IPResource.objects.filter(last_check__isnull=False).filter(last_time_up=F('last_check')).count()
  10. down_count = IPResource.objects.filter(last_check__isnull=False).exclude(last_time_up=F('last_check')).count()
  11. unknown_count = IPResource.objects.filter(last_check__isnull=True).count()
  12. up, down, unknown = set(), set(), set()
  13. for line in f:
  14. try:
  15. line = line.decode('utf-8')
  16. except UnicodeDecodeError:
  17. continue
  18. g = regex.match(line)
  19. if not g:
  20. continue
  21. try:
  22. ip = IPv4Address(g.group('ip'))
  23. except AddressValueError:
  24. continue
  25. p = [ g.group('p%d' % i) for i in [1, 2, 3, 4, 5] ]
  26. if all(map(lambda p: p == '-', p)):
  27. down.add(ip.compressed)
  28. else:
  29. up.add(ip.compressed)
  30. up = up - down # suppression des doublons
  31. up = IPResource.objects.filter(ip__in=up)
  32. down = IPResource.objects.filter(ip__in=down)
  33. unknown = IPResource.objects.exclude(Q(pk__in=up) | Q(pk__in=down))
  34. up.exclude(last_time_up=F('last_check')).count()
  35. down.filter(last_time_up=F('last_check')).count()
  36. now = timezone.now()
  37. up.update(last_time_up=now, last_check=now)
  38. down.update(last_check=now)
  39. upped = len(up) - up_count
  40. downed = len(down) - down_count
  41. unknowned = len(unknown) - unknown_count
  42. return "UP: %d (%+d), DOWN: %d (%+d), UNKNOWN: %d (%+d)" \
  43. % (len(up), upped, len(down), downed, len(unknown), unknowned)