fetchport.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from django.core.management.base import BaseCommand
  2. from services.models import Switch
  3. from djadhere.utils import from_livestatus
  4. import re
  5. class Command(BaseCommand):
  6. help = 'Récupération du dernier ping depuis check_mk'
  7. def handle(self, *args, **options):
  8. dell_iface_regex = re.compile('^Interface TenGigabitEthernet 0/(?P<id>[0-9]+)$')
  9. ubnt_iface_regex = re.compile('^Interface Slot: 0 Port: (?P<id>[0-9]+) (Gigabit|10G) - Level$')
  10. status_regex = re.compile('\w+ - \[[\w-]+\] \((?P<status>up|down|admin down)\)')
  11. for sw in Switch.objects.all():
  12. up_count, down_count, unknown_count = sw.ports.filter(up=True).count(), sw.ports.filter(up=False).count(), sw.ports.filter(up__isnull=True).count()
  13. up, down = [], []
  14. hosts = from_livestatus('hosts', query=['Filter: host_name = %s' % sw.name], columns=['services_with_info'])
  15. if len(hosts) != 1:
  16. continue
  17. host = hosts[0]
  18. for service in host.services_with_info:
  19. description, _, _, info = service
  20. g = dell_iface_regex.match(description)
  21. if not g:
  22. g = ubnt_iface_regex.match(description)
  23. if not g:
  24. continue
  25. port = int(g.group('id'))
  26. if port < sw.first_port or port > sw.last_port:
  27. continue
  28. g = status_regex.match(info)
  29. if not g:
  30. self.stdout.write(self.style.WARNING("Switch %s port %d status unknown: %s" % (sw.name, port, info)))
  31. continue
  32. status = g.group('status')
  33. if status == 'up':
  34. up.append(port)
  35. else:
  36. assert(status == 'down' or status == 'admin down')
  37. down.append(port)
  38. unknown = set(range(sw.first_port, sw.last_port + 1)) - set(up) - set(down)
  39. sw.ports.filter(port__in=up).exclude(up=True).update(up=True)
  40. sw.ports.filter(port__in=down).exclude(up=False).update(up=False)
  41. sw.ports.filter(port__in=unknown).exclude(up__isnull=True).update(up=None)
  42. upped, downed, unknowned = len(up) - up_count, len(down) - down_count, len(unknown) - unknown_count
  43. if upped or downed or unknowned:
  44. self.stdout.write("Switch %s: UP: %d (%+d), DOWN: %d (%+d), UNKNOWN: %d (%+d)" \
  45. % (sw.name, len(up), upped, len(down), downed, len(unknown), unknowned))