1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- from django.db.models import Q, F
- from django.utils import timezone
- from services.models import IPResource, IPResourceState, ServiceAllocation
- import re
- from ipaddress import IPv4Address, AddressValueError
- import logging
- from itertools import groupby
- logger = logging.getLogger(__name__)
- def fastpinger_update(f):
- now = timezone.now()
- regex = re.compile('^(?P<ip>[0-9.]+)[ ]+: (?P<p1>([0-9]+.[0-9]+|-)) (?P<p2>([0-9]+.[0-9]+|-))'
- ' (?P<p3>([0-9]+.[0-9]+|-)) (?P<p4>([0-9]+.[0-9]+|-)) (?P<p5>([0-9]+.[0-9]+|-))$')
- up, down, unknown = set(), set(), set()
- for line in f:
- try:
- line = line.decode('utf-8')
- except UnicodeDecodeError:
- continue
- g = regex.match(line)
- if not g:
- continue
- try:
- ip = IPv4Address(g.group('ip'))
- except AddressValueError:
- continue
- p = [ g.group('p%d' % i) for i in [1, 2, 3, 4, 5] ]
- if all(map(lambda p: p == '-', p)):
- down.add(ip.compressed)
- else:
- up.add(ip.compressed)
- up = up - down # suppression des doublons
- leaves = {
- IPResourceState.STATE_DOWN: 0,
- IPResourceState.STATE_UP: 0,
- IPResourceState.STATE_UNKNOWN: 0,
- }
- become_down = IPResource.objects.exclude(last_state__state=IPResourceState.STATE_DOWN).filter(ip__in=down)
- for ip in become_down:
- leaves[ip.last_state.state] += 1
- if ip.last_state.state == IPResourceState.STATE_UP:
- ip.last_time_up = now
- ip.last_state = IPResourceState.objects.create(ip=ip, date=now, state=IPResourceState.STATE_DOWN)
- ip.save()
- become_up = IPResource.objects.exclude(last_state__state=IPResourceState.STATE_UP).filter(ip__in=up)
- for ip in become_up:
- leaves[ip.last_state.state] += 1
- ip.last_state = IPResourceState.objects.create(ip=ip, date=now, state=IPResourceState.STATE_UP)
- ip.save()
- become_unknown = IPResource.objects.exclude(last_state__state=IPResourceState.STATE_UNKNOWN).exclude(Q(pk__in=up) | Q(pk__in=down))
- for ip in become_unknown:
- leaves[ip.last_state.state] += 1
- if ip.last_state.state == IPResourceState.STATE_UP:
- ip.last_time_up = now
- ip.last_state = IPResourceState.objects.create(ip=ip, date=now, state=IPResourceState.STATE_UNKNOWN)
- ip.save()
- down_count = IPResource.objects.filter(last_state__state=IPResourceState.STATE_DOWN).count()
- up_count = IPResource.objects.filter(last_state__state=IPResourceState.STATE_UP).count()
- unknown_count = IPResource.objects.filter(last_state__state=IPResourceState.STATE_UNKNOWN).count()
- stats = "UP: %d (-%d+%d), DOWN: %d (-%d+%d), UNKNOWN: %d (-%d+%d)" \
- % (up_count, leaves[IPResourceState.STATE_UP], len(become_up), \
- down_count, leaves[IPResourceState.STATE_DOWN], len(become_down), \
- unknown_count, leaves[IPResourceState.STATE_UNKNOWN], len(become_unknown))
- return stats
|