Vorausgesetzt, es gibt frei herunterladbare GeoIP-Datenbanken, freie Bindungen für solche Datenbanken für fast jede Programmiersprache und Bibliotheken, mit denen Punkte auf einer Weltkarte gezeichnet werden können, könnte man versuchen, eine eigene visuelle Traceroute zu implementieren. Dies ist eine großartige Idee für ein kleines Projekt.
Bearbeiten: Während diese Antwort eher für StackOverflow geeignet ist, ist hier eine sehr einfache visuelle Traceroute-App, die in Python geschrieben wurde. Während es unter Linux für mich funktioniert, funktioniert es nicht für alle, da es viele Nachteile hat:
- Es werden einige Python-Bibliotheken von Drittanbietern verwendet, die installiert werden müssen. Sie bekommen es,
Import Error
wenn Sie sie nicht haben - es bündelt nicht das Weltkartenbild, das es verwendet [ich habe ein kostenloses Bild von Wikipedia :) abgelegt]
- Es bündelt nicht die von ihm verwendete Geoip-Datenbank [ich verwende die kostenlose Datenbank von maxmind.com]
- es soll unter Linux laufen, das
mtr
installiert ist - Es verwendet fest codierte Dateinamen für temporäre Dateien
Hier ist der Code:
#!/usr/bin/env python """visual traceroute""" import subprocess import sys import time from PyQt4.QtCore import * from PyQt4.QtGui import * import pygeoip import wugeo GEOIPDB = "GeoLiteCity.dat" class MyForm(QDialog): """Main app window""" def __init__(self, parent = None): """doc""" super(MyForm, self).__init__(parent) self.setWindowTitle("Visual Route") self.image_label = QLabel(self) self.image_label.setMinimumSize(800, 600) self.image_label.setAlignment(Qt.AlignCenter) self.load_image("map.jpg") self.ip_edit = QLineEdit(self) self.tr_button = QPushButton("Traceroute", parent=self) layout = QVBoxLayout() layout.addWidget(self.image_label) layout.addWidget(self.ip_edit) layout.addWidget(self.tr_button) self.setLayout(layout) self.connect(self.tr_button, SIGNAL("clicked()"), self.traceroute) def load_image(self, file_name): """Loads an image""" image = QImage(file_name) self.image_label.setPixmap(QPixmap.fromImage(image)) self.repaint() def traceroute(self): """Do the traceroute thing""" self.tr_button.setEnabled(False) ip = self.ip_edit.text() p = subprocess.Popen(["sudo", "/usr/sbin/mtr", "-n", "-c", "1", "--raw", ip], stdout=subprocess.PIPE) output = p.communicate()[0] lines = output.split("\n") ip_lines = lines[::2][:-1] # filter odds, skip last ips = [x.split()[2] for x in ip_lines] coords = self.get_coords(ips) self.draw_dots(coords) self.tr_button.setEnabled(True) @staticmethod def get_coords(ips): """Get coords using pygeoip""" coords = [] geoip = pygeoip.GeoIP(GEOIPDB, pygeoip.MMAP_CACHE) for ip in ips: record = geoip.record_by_addr(ip) latitude = record["latitude"] longitude = record["longitude"] location = (latitude, longitude, 1, "red") coords.append(location) return coords def draw_dots(self, coords): """Draws dots on the world map Uses temporary files (ugly!)""" infile = "map.jpg" outfile = "/tmp/outmap.jpg" for coord in coords: wugeo.geo_marker([coord], infile, outfile) self.load_image(outfile) time.sleep(1) infile = outfile def main(): """Main function""" app = QApplication(sys.argv) form = MyForm() form.show() app.exec_() if __name__ == "__main__": main()