Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende Überarbeitung | |||
meshviewer [14.12.2023 14:23] – [Backend] 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 '' | ||
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: | ||
</ | </ | ||
- | ==== Alternativinstallation | + | === Alternativinstallation === |
Ohne den ganzen NodeJS-Plunder. | Ohne den ganzen NodeJS-Plunder. | ||
Zeile 148: | Zeile 570: | ||
- | ==== Statistik | + | === Statistik === |
aptitude install php-gd php-rrd | aptitude install php-gd php-rrd |