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[0-9.]+)[ ]+: (?P([0-9]+.[0-9]+|-)) (?P([0-9]+.[0-9]+|-))' ' (?P([0-9]+.[0-9]+|-)) (?P([0-9]+.[0-9]+|-)) (?P([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