checkip.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from django.core.management.base import BaseCommand, CommandError
  2. from django.contrib.auth.models import User
  3. from django.contrib.contenttypes.models import ContentType
  4. import os, re, sys, socket
  5. from adhesions.models import Adhesion
  6. from services.models import Service, ServiceType, IPResource, Route
  7. from accounts.models import Profile
  8. check_reverse = True
  9. regex = re.compile('^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+) ([a-z.0-9]+)$')
  10. class Command(BaseCommand):
  11. help = 'Comparaison des allocations IP dans Djadhere avec ip_ttnn.txt'
  12. def add_arguments(self, parser):
  13. parser.add_argument('file', help='Fichier ip_ttnn.txt')
  14. parser.add_argument('--no-reverse', action='store_false')
  15. def handle(self, *args, **options):
  16. try:
  17. f = open(options['file'])
  18. except FileNotFoundError:
  19. raise CommandError('Le fichier "%s" n’a pas été trouvé.' % options['file'])
  20. else:
  21. with f:
  22. self.check_ip(f)
  23. def check_ip(self, f):
  24. i = 0
  25. j = 0
  26. for line in f:
  27. i += 1
  28. g = regex.match(line)
  29. if not g:
  30. self.stdout.write(self.style.ERROR("Impossible de parser la ligne n°%d: '%s'" % (i, line[:-1])))
  31. continue
  32. resource = IPResource.objects.get(ip=g.group(1))
  33. route = g.group(2)
  34. if route == 'reserved':
  35. if resource.in_use:
  36. alloc = resource.allocations.get(active=True)
  37. self.stdout.write(self.style.WARNING("L’IP %s est marqué réservée dans ip_ttnn.txt mais allouée au service #%d sur Djadhere" % (resource, alloc.service.pk)))
  38. if not resource.reserved:
  39. self.stdout.write(self.style.WARNING("L’IP %s est marqué réservée dans ip_ttnn.txt mais pas dans Djadhere" % resource))
  40. continue
  41. if route == "unused":
  42. if resource.in_use:
  43. alloc = resource.allocations.get(active=True)
  44. self.stdout.write(self.style.WARNING("L’IP %s est marqué disponible dans ip_ttnn.txt mais allouée au service #%d sur Djadhere" % (resource, alloc.service.pk)))
  45. continue
  46. try:
  47. route = Route.objects.get(name=route)
  48. except Route.DoesNotExist:
  49. self.stdout.write(self.style.WARNING("L’IP %s est routée sur %s dans ip_ttnn.txt mais cette route est inconnue dans Djadhere" % (resource, route)))
  50. continue
  51. if resource.in_use:
  52. alloc = resource.allocations.get(active=True)
  53. if alloc.route != route:
  54. self.stdout.write(self.style.WARNING("L’IP %s est routée sur %s dans ip_ttnn.txt mais routée sur %s pour le service #%d sur Djadhere" % (resource, route, alloc.route, alloc.service.pk)))
  55. continue
  56. if resource.reserved:
  57. self.stdout.write(self.style.WARNING("L’IP %s est marqué réservée dans Djadhere alors que routée via %s dans ip_ttnn.txt" % (resource, route)))
  58. if check_reverse:
  59. try:
  60. reverse, _, _ = socket.gethostbyaddr(str(resource))
  61. except:
  62. reverse = '?'
  63. else:
  64. reverse = '?'
  65. self.stdout.write(self.style.WARNING("L’IP %s est disponible dans Djadhere alors que routée via %s dans ip_ttnn.txt (reverse : %s)" % (resource, route, reverse)))