import sys
class TraceRoute(object):
BADDR = "0.0.0.0" # default bind address - (all IPs)
PORT = 33434 # default port
ICMP = socket.getprotobyname('icmp')
UDP = socket.getprotobyname('udp')
desternation = ""
ttl = 0 # we inrecement this by one each time.
# sockets
reciever = None
sender = None
# finished?
finished = False
def __init__(self, desternation):
self.desternation = socket.gethostbyname(desternation)
self.reciever = socket.socket(socket.AF_INET, socket.SOCK_RAW, self.ICMP)
self.sender = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, self.UDP)
# bind to reciever so we can listen for replies
self.reciever.bind((self.BADDR, self.PORT))
def next_server(self):
""" Connects to next server 1 hop away from current server (i.e. server[ttl + 1]) """
if self.finished:
# we have nothing to do, just return
return
# first job increment the ttl on the socket
self.ttl += 1
self.sender.setsockopt(socket.SOL_IP, socket.IP_TTL, self.ttl)
self.sender.sendto("", (self.desternation, self.PORT))
current_server = self.reciever.recvfrom(512)[1][0] # get 512 bytes from the reciever
self.display(current_server)
if current_server == self.desternation:
self.finished = True
def display(self, address):
""" Gets the hostname (if we can) and displays """
try:
name = socket.gethostbyaddr(address)[0]
print "%s) %s (%s)" % (self.ttl, name, address)
except socket.error:
# we couldn't - we'll just tell them the IP address
print "%s) %s" % (self.ttl, address)
def __del__(self):
""" Be good and close our sockets """
try:
self.reciever.close()
except socket.error:
# already closed
pass
try:
self.sender.close()
except socket.error:
# already closed
pass
if __name__ == "__main__":
# lets get the address from the commandline args
if len(sys.argv) <= 1:
# nothing been specified
print "You need to give an address"
print "%s <server>" % sys.argv[0]
sys.exit() # we can't do anything.
tracert = TraceRoute(sys.argv[1])
while not tracert.finished:
tracert.next_server()
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