subnet_chk.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #!/usr/bin/env python
  2. import sys
  3. import os
  4. import socket
  5. import netifaces
  6. import struct
  7. def get_targ(path):
  8. with open(path, 'r') as file:
  9. lst = [ l.strip() for l in reversed(file.readlines()) ]
  10. lst = [ l for l in lst if l and l[0] != '#' ]
  11. vs = []
  12. for l in lst:
  13. if ':' not in l:
  14. return l
  15. p = [ a.strip() for a in l.split(':') ]
  16. if p[0] == 'host':
  17. vs.append(p[1])
  18. return next( (v for v in vs), None)
  19. def addr_v(addr):
  20. return struct.unpack('!i', socket.inet_aton(addr))[0]
  21. if len(sys.argv) < 2:
  22. print "Usage: {} <ipaddr|hostname|->".format(sys.argv[0])
  23. sys.exit(0)
  24. targ = sys.argv[1]
  25. if targ == '-': # read 'host' file
  26. path = os.path.join(os.path.dirname(__file__), 'host')
  27. if not os.path.exists(path):
  28. sys.exit(1)
  29. targ = get_targ(path)
  30. if not targ or targ == 'localhost':
  31. sys.exit(1)
  32. try:
  33. targ = socket.gethostbyname(targ)
  34. except socket.gaierror:
  35. print >> sys.stderr, "%s: cannot convert to ip address" % (targ)
  36. sys.exit(2)
  37. targ_v = addr_v(targ)
  38. lst = [ ifnm for ifnm in netifaces.interfaces() if not ifnm.startswith('lo') ]
  39. lst = [ netifaces.ifaddresses(ifnm).get(netifaces.AF_INET) for ifnm in lst ]
  40. lst = [ ( a.get('addr'), a.get('netmask') ) for l in lst if l for a in l ]
  41. lst = [ p for p in lst if None not in p ]
  42. for (addr, mask_s) in lst:
  43. v = addr_v(addr)
  44. mask = addr_v(mask_s)
  45. if (v & mask) == (targ_v & mask):
  46. print addr
  47. sys.exit(0)
  48. sys.exit(1)