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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