abuse.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. from datetime import date
  2. from ipaddress import IPv4Address, IPv4Network
  3. from django.contrib.postgres.indexes import GistIndex
  4. from django.core.validators import MaxValueValidator
  5. from django.db import models
  6. import dns.resolver
  7. from netfields import CidrAddressField, NetManager
  8. class BlockedSubnet(models.Model):
  9. created = models.DateTimeField(auto_now_add=True)
  10. asn = models.PositiveBigIntegerField(validators=[MaxValueValidator(2**32 - 1)])
  11. subnet = CidrAddressField(unique=True)
  12. country = models.TextField()
  13. registry = models.TextField()
  14. allocation_date = models.DateField()
  15. objects = NetManager()
  16. class Meta:
  17. indexes = (
  18. GistIndex(fields=("subnet",), opclasses=("inet_ops",), name="subnet_idx"),
  19. )
  20. @classmethod
  21. def from_ip(cls, ip):
  22. # Fetch IP metadata provided by Team Cymru, https://www.team-cymru.com/ip-asn-mapping
  23. qname = IPv4Address(ip).reverse_pointer.replace(
  24. "in-addr.arpa", "origin.asn.cymru.com"
  25. )
  26. answer = dns.resolver.resolve(qname, "TXT")[0]
  27. parts = str(answer).strip('"').split("|")
  28. return cls(
  29. asn=int(parts[0].strip()),
  30. subnet=IPv4Network(parts[1].strip()),
  31. country=parts[2].strip(),
  32. registry=parts[3].strip(),
  33. allocation_date=date.fromisoformat(parts[4].strip()),
  34. )