repos/ngdiscover

view ngdiscover.py @ 1:53f0df7cae5f

Add License block
author rgammans@computer-surgery.co.uk
date Wed May 12 10:31:42 2010 +0100 (2010-05-12)
parents 389368b29514
children
line source
1 #!/usr/bin/python
2 #
3 #
5 #
6 #
7 # (C) Roger Gammans <rgammans@computer-surgery.co.uk>
8 # Licensed under the GPLv2 or by arrangement.
9 #
11 from socket import *
12 import string
13 import time
15 dst_port = 64515
16 src_port = 64513
17 localhost="localhost"
18 broadcast = "255.255.255.255"
20 datastr = "000200000000000000000000000100000c07d2f20000000000000000000000000000000000000000"
21 datastr = "00000000000000000000000000010000000000000000000000000000000000000000000000000000"
23 import sys
25 debug = False
26 if len(sys.argv) > 1 and sys.argv[1] == "--debug": debug=True
29 def cstring(data,offset=0):
30 retval = ""
31 for i in data[offset:]:
32 if i != '\0':
33 retval += i
34 else: break
35 return retval
37 def ipaddress(addrblk):
38 return str(ord(addrblk[0]))+"."+ str(ord(addrblk[1]))+"."+str(ord(addrblk[2]))+"."+ str(ord(addrblk[3]))
40 def hexbytes(bytes):
41 return ":".join(map(lambda x : "%02x" % (ord(x)) , bytes))
44 def do_field(label,data,pos,formatter):
45 print label,"\t",
46 if len(label) < 8: print "\t",
47 print ": ",
48 npos = pos + ord(retdata[pos])
49 print formatter(data[pos+1:npos])
50 return npos
52 last=""
53 data=""
54 for i in datastr:
55 if last == "":
56 last =i
57 else:
58 data += chr(int(last+i,16))
59 last = ""
61 #print len(data)
63 UDPSock = socket(AF_INET,SOCK_DGRAM)
65 UDPSock.setsockopt(SOL_SOCKET,SO_BROADCAST,1)
66 UDPSock.bind(('',src_port))
67 UDPSock.sendto(data,(broadcast,dst_port))
69 print "type ^C to exit "
71 while True:
72 retdata = UDPSock.recv(255)
74 print "------------------------------------------"
75 if debug: print len(retdata),repr(retdata)
76 #
77 # These fields have been found by trial and
78 # error so they are likely to be wrong.
79 #
80 print "MAC data\t: ", hexbytes(retdata[4:10])
81 #Unknwon Data in area retdata[11:43]
82 # But it seems to be a repeat of the sent data
84 #The first field is a complete guess though
85 ver = ord(retdata[41])+256*ord(retdata[42])
86 print "Packet ver\t: ",ver
87 if ver != 1:
88 print "\t\tFirst field (Possibly version) varies - results may be unreliable"
90 pos = do_field("Model",retdata,43,cstring)
91 pos = do_field("Location",retdata,pos,cstring)
92 pos = do_field("Sys name",retdata,pos,cstring)
93 pos = do_field("Ip Address",retdata,pos,ipaddress)
94 pos = do_field("Subnet Mask",retdata,pos,ipaddress)
95 pos = do_field("Default Gw",retdata,pos,ipaddress)
96 pos = do_field("Unknown data",retdata,pos,repr)
97 pos = do_field("Firmware",retdata,pos,cstring)
99 print "------------------------------------------"