Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| meshviewer [28.10.2019 13:13] – [Frontend] havelock | meshviewer [22.06.2025 07:32] (aktuell) – Neue Karte kevin | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ====== Meshviewer / Knotenkarte ====== | ====== Meshviewer / Knotenkarte ====== | ||
| - | Die Karte läuft momentan auf dem Server, der auch '' | + | ===== Neue Karte (seit 2024) ===== |
| + | Es gibt nun 2 Karten, eine für Pinneberg, und eine für Helgoland | ||
| + | Die Karten laufen derzeit auf gate07. | ||
| + | |||
| + | ==== Frontend ==== | ||
| + | Das frontend liegt jeweils in | ||
| + | ''/ | ||
| + | |||
| + | Der Quellcode stammt von https:// | ||
| + | Im Unterverzeichnis '' | ||
| + | Alle Einstellungen der Karte liegen in '' | ||
| + | |||
| + | ==== Backend ==== | ||
| + | Die Daten der Knoten kommen nun nicht mehr per alfred sondern per respondd. Auf den Knoten lief das tool schon immer mit, auf den Gateways musste es nachinstalliert werden. | ||
| + | Um die respondd daten in ein für den meshviewer lesbares format zu bringen wird nun das tool yanic benutzt. Quellcode zu finden unter https:// | ||
| + | yanic läuft auf gate07 als deamon im Hintergrund und liefert die daten für beide Karten. | ||
| + | |||
| + | Die yanic Konfiguration ist das aufwändigste an dem ganze. | ||
| + | <file bash / | ||
| + | # This is the config file for Yanic written in " | ||
| + | # syntax: https:// | ||
| + | # (if you need something multiple times, checkout out the [[array of table]] section) | ||
| + | |||
| + | # Send respondd request to update information | ||
| + | [respondd] | ||
| + | enable | ||
| + | # Delay startup until a multiple of the period since zero time | ||
| + | synchronize | ||
| + | # how often request per multicast | ||
| + | collect_interval = " | ||
| + | |||
| + | # If you have custom respondd fields, you can ask Yanic to also collect these. | ||
| + | # NOTE: This does not automatically include these fields in the output. | ||
| + | # The meshviewer-ffrgb output module will include them under " | ||
| + | # but other modules may simply ignore them. | ||
| + | # | ||
| + | #name = zip | ||
| + | # You can use arbitrary GJSON expressions here, see https:// | ||
| + | # We expect this expression to return a string. | ||
| + | #path = nodeinfo.location.zip | ||
| + | |||
| + | # table of a site to save stats for (not exists for global only) | ||
| + | # | ||
| + | ## list of domains on this site to save stats for (empty for global only) | ||
| + | #domains = [] | ||
| + | ## example | ||
| + | # | ||
| + | # | ||
| + | |||
| + | # interface that has an IP in your mesh network | ||
| + | [[respondd.interfaces]] | ||
| + | # name of interface on which this collector is running | ||
| + | ifname = " | ||
| + | # ip address which is used for sending | ||
| + | # (optional - without definition used a address of ifname - preferred link local) | ||
| + | #ip_address = " | ||
| + | # disable sending multicast respondd request | ||
| + | # (for receiving only respondd packages e.g. database respondd) | ||
| + | # | ||
| + | # multicast address to destination of respondd | ||
| + | # (optional - without definition used default ff05:: | ||
| + | # Very old gluon uses " | ||
| + | # gluon nodes on the same network, create a separate " | ||
| + | # | ||
| + | # define a port to listen | ||
| + | # if not set or set to 0 the kernel will use a random free port at its own | ||
| + | #port = 10001 | ||
| + | |||
| + | # A little build-in webserver, which statically serves a directory. | ||
| + | # This is useful for testing purposes or for a little standalone installation. | ||
| + | [webserver] | ||
| + | enable | ||
| + | bind = " | ||
| + | webroot = "/ | ||
| + | |||
| + | |||
| + | [nodes] | ||
| + | # Cache file | ||
| + | # a json file to cache all data collected directly from respondd | ||
| + | state_path | ||
| + | # prune data in RAM, cache-file and output json files (i.e. nodes.json) | ||
| + | # that were inactive for longer than | ||
| + | prune_after | ||
| + | # Export nodes and graph periodically | ||
| + | save_interval = " | ||
| + | # Set node to offline if not seen within this period | ||
| + | offline_after = " | ||
| + | |||
| + | no_owner = false | ||
| + | |||
| + | ## [[nodes.output.example]] | ||
| + | # Each output format has its own config block and needs to be enabled by adding: | ||
| + | #enable = true | ||
| + | # | ||
| + | # For each output format there can be set different filters | ||
| + | # | ||
| + | # | ||
| + | # WARNING: if it is not set, it will publish contact information of other persons | ||
| + | # Set to true, if you did not want the json files to contain the owner information | ||
| + | #no_owner = false | ||
| + | # | ||
| + | # List of nodeids of nodes that should be filtered out, so they won't appear in output | ||
| + | #blocklist = [" | ||
| + | # | ||
| + | # List of site_codes of nodes that should be included in the output | ||
| + | #sites = [" | ||
| + | # | ||
| + | # replace the site_code with the domain_code in this output | ||
| + | # e.g. site_code=' | ||
| + | # | ||
| + | # | ||
| + | # append on the site_code the domain_code with a ' | ||
| + | # e.g. site_code=' | ||
| + | # | ||
| + | # | ||
| + | # set has_location to true if you want to include only nodes that have geo-coordinates set | ||
| + | # (setting this to false has no sensible effect, unless you'd want to hide nodes that have coordinates) | ||
| + | # | ||
| + | |||
| + | # | ||
| + | # nodes outside this area are not shown on the map but are still listed as a node without coordinates | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | |||
| + | |||
| + | # outputs all nodes as points into nodes.geojson | ||
| + | [[nodes.output.geojson]] | ||
| + | enable | ||
| + | path = "/ | ||
| + | |||
| + | # definition for the new more compressed meshviewer.json | ||
| + | [[nodes.output.meshviewer-ffrgb]] | ||
| + | enable | ||
| + | path = "/ | ||
| + | |||
| + | # definition for nodes.json | ||
| + | [[nodes.output.meshviewer]] | ||
| + | enable = true | ||
| + | # The structure version of the output which should be generated (i.e. nodes.json) | ||
| + | # version 1 is accepted by the legacy meshviewer (which is the master branch) | ||
| + | # i.e. https:// | ||
| + | # version 2 is accepted by the new versions of meshviewer (which are in the legacy develop branch or newer) | ||
| + | # i.e. https:// | ||
| + | # https:// | ||
| + | version | ||
| + | # path where to store nodes.json | ||
| + | nodes_path = "/ | ||
| + | # path where to store graph.json | ||
| + | graph_path = "/ | ||
| + | |||
| + | no_owner = false | ||
| + | |||
| + | # | ||
| + | # WARNING: if it is not set, it will publish contact information of other persons | ||
| + | #no_owner = false | ||
| + | |||
| + | |||
| + | # definition for nodelist.json | ||
| + | [[nodes.output.nodelist]] | ||
| + | enable | ||
| + | path = "/ | ||
| + | |||
| + | # | ||
| + | # WARNING: if it is not set, it will publish contact information of other persons | ||
| + | #no_owner = false | ||
| + | |||
| + | # definition for prometheus-sd.json | ||
| + | [[nodes.output.prometheus-sd]] | ||
| + | enable | ||
| + | path = "/ | ||
| + | # ip = lates recieved ip, node_id = node id from host | ||
| + | target_address = " | ||
| + | |||
| + | # Labels of the data (optional) | ||
| + | [nodes.output.prometheus-sd.labels] | ||
| + | #labelname1 = " | ||
| + | ## some useful e.g.: | ||
| + | # | ||
| + | #service = " | ||
| + | |||
| + | # definition for raw.json | ||
| + | [[nodes.output.raw]] | ||
| + | enable | ||
| + | path = "/ | ||
| + | |||
| + | # | ||
| + | # WARNING: if it is not set, it will publish contact information of other persons | ||
| + | #no_owner = false | ||
| + | |||
| + | |||
| + | ################ | ||
| + | # PINNEBERG | ||
| + | # ############## | ||
| + | [[nodes.output.meshviewer]] | ||
| + | enable = true | ||
| + | version = 2 | ||
| + | nodes_path = "/ | ||
| + | graph_path = "/ | ||
| + | no_owner = false | ||
| + | domains = [" | ||
| + | |||
| + | [nodes.output.meshviewer.filter] | ||
| + | # Filtern nach den spezifischen Domains | ||
| + | domain_append_site = true | ||
| + | sites = [" | ||
| + | |||
| + | |||
| + | [[nodes.output.meshviewer-ffrgb]] | ||
| + | enable = true | ||
| + | no_owner = false | ||
| + | path = "/ | ||
| + | domains = [" | ||
| + | |||
| + | [nodes.output.meshviewer-ffrgb.filter] | ||
| + | # Filtern nach den spezifischen Domains | ||
| + | domain_append_site = true | ||
| + | sites = [" | ||
| + | |||
| + | |||
| + | [[nodes.output.geojson]] | ||
| + | enable = true | ||
| + | path = "/ | ||
| + | domains = [" | ||
| + | |||
| + | [nodes.output.geojson.filter] | ||
| + | # Filtern nach den spezifischen Domains | ||
| + | domain_append_site = true | ||
| + | sites = [" | ||
| + | |||
| + | |||
| + | # definition for nodelist.json | ||
| + | [[nodes.output.nodelist]] | ||
| + | enable | ||
| + | path = "/ | ||
| + | domains = [" | ||
| + | |||
| + | [nodes.output.nodelist.filter] | ||
| + | domain_append_site = true | ||
| + | sites = [" | ||
| + | |||
| + | |||
| + | [[nodes.output.raw]] | ||
| + | enable = true | ||
| + | path = "/ | ||
| + | domains = [" | ||
| + | |||
| + | [nodes.output.raw.filter] | ||
| + | # Filtern nach den spezifischen Domains | ||
| + | domain_append_site = true | ||
| + | sites = [" | ||
| + | |||
| + | |||
| + | ############### | ||
| + | # HELGOLAND | ||
| + | ############### | ||
| + | [[nodes.output.meshviewer]] | ||
| + | enable = true | ||
| + | version = 2 | ||
| + | nodes_path = "/ | ||
| + | graph_path = "/ | ||
| + | no_owner = false | ||
| + | |||
| + | [nodes.output.meshviewer.filter] | ||
| + | # Filtern nach den spezifischen Domains | ||
| + | domain_append_site = true | ||
| + | sites = [" | ||
| + | |||
| + | |||
| + | [[nodes.output.meshviewer-ffrgb]] | ||
| + | enable = true | ||
| + | no_owner = false | ||
| + | path = "/ | ||
| + | |||
| + | [nodes.output.meshviewer-ffrgb.filter] | ||
| + | # Filtern nach den spezifischen Domains | ||
| + | domain_append_site = true | ||
| + | sites = [" | ||
| + | |||
| + | |||
| + | [[nodes.output.geojson]] | ||
| + | enable = true | ||
| + | path = "/ | ||
| + | |||
| + | [nodes.output.geojson.filter] | ||
| + | # Filtern nach den spezifischen Domains | ||
| + | domain_append_site = true | ||
| + | sites = [" | ||
| + | |||
| + | |||
| + | [[nodes.output.nodelist]] | ||
| + | enable | ||
| + | path = "/ | ||
| + | |||
| + | [nodes.output.nodelist.filter] | ||
| + | domain_append_site = true | ||
| + | sites = [" | ||
| + | |||
| + | |||
| + | [[nodes.output.raw]] | ||
| + | enable = true | ||
| + | path = "/ | ||
| + | |||
| + | [nodes.output.raw.filter] | ||
| + | # Filtern nach den spezifischen Domains | ||
| + | sites = [" | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | [database] | ||
| + | # this will send delete commands to the database to prune data | ||
| + | # which is older than: | ||
| + | delete_after | ||
| + | # how often run the cleaning | ||
| + | delete_interval = " | ||
| + | |||
| + | ## [[database.connection.example]] | ||
| + | # Each database-connection has its own config block and needs to be enabled by adding: | ||
| + | #enable = true | ||
| + | |||
| + | # Save collected data to InfluxDB. | ||
| + | # There are the following measurements: | ||
| + | # node: store node specific data i.e. clients memory, airtime | ||
| + | # link: store link tq between two interfaces of two different nodes | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | [[database.connection.influxdb]] | ||
| + | enable | ||
| + | address | ||
| + | database = " | ||
| + | username = "" | ||
| + | password = "" | ||
| + | # | ||
| + | |||
| + | # Tagging of the data (optional) | ||
| + | [database.connection.influxdb.tags] | ||
| + | # Tags used by Yanic would override the tags from this config | ||
| + | # nodeid, hostname, owner, model, firmware_base, | ||
| + | #tagname1 = " | ||
| + | # some useful e.g.: | ||
| + | # | ||
| + | #site = " | ||
| + | |||
| + | # Save collected data to InfluxDB2. | ||
| + | # There are the following measurements: | ||
| + | # node: store node specific data i.e. clients memory, airtime | ||
| + | # link: store link tq between two interfaces of two different nodes with i.e. nodeid, address, hostname | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | # | ||
| + | [[database.connection.influxdb2]] | ||
| + | enable | ||
| + | address | ||
| + | token = "" | ||
| + | organization_id = "" | ||
| + | # fallback of no specific bucket for measurement is setup | ||
| + | bucket_default = " | ||
| + | |||
| + | # Specify bucket per measurement (of not set fallback bucket_default is used or panic) | ||
| + | # | ||
| + | # WARNING: | ||
| + | # yanic does NOT prune node's data (so please set up data retention in InfluxDB2 setup). | ||
| + | # | ||
| + | # We highly recommend to setup e.g. Data retention in your InfluxDB2 server per measurements. | ||
| + | # | ||
| + | # | ||
| + | [database.connection.influxdb2.buckets] | ||
| + | #link = " | ||
| + | #node = " | ||
| + | #dhcp = " | ||
| + | global = " | ||
| + | #firmware = " | ||
| + | #model = " | ||
| + | # | ||
| + | |||
| + | # Tagging of the data (optional) | ||
| + | [database.connection.influxdb2.tags] | ||
| + | # Tags used by Yanic would override the tags from this config | ||
| + | # nodeid, hostname, owner, model, firmware_base, | ||
| + | #tagname1 = " | ||
| + | # some useful e.g.: | ||
| + | # | ||
| + | #site = " | ||
| + | |||
| + | # Graphite settings | ||
| + | [[database.connection.graphite]] | ||
| + | enable | ||
| + | address | ||
| + | # Graphite is replacing every " | ||
| + | # that for the file system hierarchy it generates. it is recommended to at least | ||
| + | # move the metrics out of the root namespace (that would be the empty prefix). | ||
| + | # If you only intend to run one community and only freifunk on your graphite node | ||
| + | # then the prefix can be set to anything (including the empty string) since you | ||
| + | # probably wont care much about " | ||
| + | prefix | ||
| + | |||
| + | # respondd (yanic) | ||
| + | # forward collected respondd package to a address | ||
| + | # (e.g. to another respondd collector like a central yanic instance or hopglass) | ||
| + | [[database.connection.respondd]] | ||
| + | enable | ||
| + | # type of network to create a connection | ||
| + | type = " | ||
| + | # destination address to connect/ | ||
| + | address | ||
| + | |||
| + | # Logging | ||
| + | [[database.connection.logging]] | ||
| + | enable | ||
| + | path = "/ | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Alte Karte (2015 - 2024) ===== | ||
| + | |||
| + | Die Karte läuft momentan auf dem Server, der auch '' | ||
| Um die notwendigen Daten zu sammeln muß das Backend '' | Um die notwendigen Daten zu sammeln muß das Backend '' | ||
| auf die Programme '' | auf die Programme '' | ||
| Zeile 28: | Zeile 450: | ||
| - | ===== Backend | + | ==== Backend ==== |
| - | Das Backend heißt '' | + | Das Backend heißt '' |
| Abhängigkeiten von Programmen | Abhängigkeiten von Programmen | ||
| Zeile 94: | Zeile 516: | ||
| } | } | ||
| </ | </ | ||
| - | ===== Frontend | + | ==== Frontend ==== |
| Wir benutzen die Version 4 des Frontends mit einigen kleinen eigenen Änderungen. | Wir benutzen die Version 4 des Frontends mit einigen kleinen eigenen Änderungen. | ||
| Zeile 137: | Zeile 559: | ||
| </ | </ | ||
| - | ==== Statistik | + | === Alternativinstallation |
| + | |||
| + | Ohne den ganzen NodeJS-Plunder. | ||
| + | Es werden soweit es geht Pakete des Betriebssystems verwendet, | ||
| + | Siehe dazu auch den Helgoländer Meshviewer. | ||
| + | |||
| + | < | ||
| + | apt-get install libjs-moment libjs-d3 libjs-requirejs libjs-es6-shim | ||
| + | </ | ||
| + | |||
| + | |||
| + | === Statistik | ||
| aptitude install php-gd php-rrd | aptitude install php-gd php-rrd | ||