utils.py 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. from django.urls import reverse
  2. from django.conf import settings
  3. from django.db.models import Q, F
  4. from django.utils import timezone
  5. from djadhere.utils import send_notification
  6. from services.models import IPResource
  7. import re
  8. from ipaddress import IPv4Address, AddressValueError
  9. def notify_allocation(request, new_alloc, old_alloc=None):
  10. fields = ['resource', 'service', 'route', 'start', 'end', 'notes']
  11. benevole = '%s <%s>' % (request.user.username, request.user.email)
  12. message = 'Bénévole : ' + benevole
  13. message += '\n\nAllocation :'
  14. diff = False
  15. for field in fields:
  16. new_attr = getattr(new_alloc, field)
  17. if new_attr == '' or new_attr is None:
  18. new_attr = '-'
  19. if old_alloc:
  20. old_attr = getattr(old_alloc, field)
  21. if old_attr == '' or old_attr is None:
  22. old_attr = '-'
  23. if old_alloc and old_attr != new_attr:
  24. message += '\n-%12s: %s\n+%12s: %s' % (field, old_attr, field, new_attr)
  25. diff = True
  26. else:
  27. message += '\n %12s: %s' % (field, new_attr)
  28. url = 'https' if request.is_secure() else 'http'
  29. url += '://' + request.get_host()
  30. url += reverse('admin:services_ipresource_change', args=(new_alloc.resource.pk,))
  31. message += '\n\nVoir : ' + url
  32. if old_alloc and diff:
  33. sujet = 'Modification d’une allocation'
  34. elif not old_alloc:
  35. sujet = 'Nouvelle allocation'
  36. else:
  37. sujet = None
  38. if sujet:
  39. sujet += ' ADT%d' % new_alloc.service.adhesion.pk
  40. send_notification(sujet, message, settings.ALLOCATIONS_EMAILS, cc=[benevole])
  41. def fastping_update(f):
  42. regex = re.compile('^(?P<ip>[0-9.]+)[ ]+: (?P<p1>([0-9]+.[0-9]+|-)) (?P<p2>([0-9]+.[0-9]+|-))'
  43. ' (?P<p3>([0-9]+.[0-9]+|-)) (?P<p4>([0-9]+.[0-9]+|-)) (?P<p5>([0-9]+.[0-9]+|-))$')
  44. up_count = IPResource.objects.filter(last_check__isnull=False).filter(last_time_up=F('last_check')).count()
  45. down_count = IPResource.objects.filter(last_check__isnull=False).exclude(last_time_up=F('last_check')).count()
  46. unknown_count = IPResource.objects.filter(last_check__isnull=True).count()
  47. up, down, unknown = set(), set(), set()
  48. for line in f:
  49. try:
  50. line = line.decode('utf-8')
  51. except UnicodeDecodeError:
  52. continue
  53. g = regex.match(line)
  54. if not g:
  55. continue
  56. try:
  57. ip = IPv4Address(g.group('ip'))
  58. except AddressValueError:
  59. continue
  60. p = [ g.group('p%d' % i) for i in [1, 2, 3, 4, 5] ]
  61. if all(map(lambda p: p == '-', p)):
  62. down.add(ip.compressed)
  63. else:
  64. up.add(ip.compressed)
  65. up = up - down # suppression des doublons
  66. up = IPResource.objects.filter(ip__in=up)
  67. down = IPResource.objects.filter(ip__in=down)
  68. unknown = IPResource.objects.exclude(Q(pk__in=up) | Q(pk__in=down))
  69. up.exclude(last_time_up=F('last_check')).count()
  70. down.filter(last_time_up=F('last_check')).count()
  71. now = timezone.now()
  72. up.update(last_time_up=now, last_check=now)
  73. down.update(last_check=now)
  74. upped = len(up) - up_count
  75. downed = len(down) - down_count
  76. unknowned = len(unknown) - unknown_count
  77. return "UP: %d (%+d), DOWN: %d (%+d), UNKNOWN: %d (%+d)" \
  78. % (len(up), upped, len(down), downed, len(unknown), unknowned)