====== Alfred ====== siehe: http://www.open-mesh.org/projects/alfred/wiki Produktiv wird die Version 2015.0 bzw. die gepatchte Version 2017.1 eingesetzt. Ab der Version 2015.1 gibt es anscheinend Probleme: can't bind: Cannot assign requested address Failed to open interfaces Das Verhalten tritt auf, wenn die Link-Lokale IPv6-Adresse des Bridge-Interfaces (über den Parameter ''-i'') nicht zu der MAC-Adresse paßt. Vermutlich kann als Workaround die MAC-Adresse für das betreffende Interface mit ''bridge_hw '' fixiert werden. Wenn man das nicht macht, führt das Hinzufügen von ''bat0'' zur Bridge dazu, daß die Bridge die MAC vom ''bat0''-Interface übernimmt. Details: In der Funktion ''netsock_open'' in ''netsock.c'' wird in Version 2015.0 ein bind mit ''in6addr_any'' gemacht. In den darauffolgenden Versionen geht der bind auf die Interface-Adresse, die allerdings mit ''mac_to_ipv6(&interface->hwaddr, &interface->address);'' ermittelt wurde. Insbesondere bei Bridge-Interfaces schlägt dieses aus o.a. Gründen fehl. Voraussetzungen aptitude install git cmake pkg-config ca-certificates Für Version >= 2016.5 zusätzlich: aptitude install libnl-genl-3-dev Quellen herunterladen und entpacken cd /usr/local/src aptitude install libcap-dev wget http://downloads.open-mesh.org/batman/stable/sources/alfred/alfred-2017.1.tar.gz tar xzf alfred-2017.1.tar.gz cd alfred-2017.1 ++++ Patch für alfred >= 2016.5 | diff --git a/netsock.c b/netsock.c index 86db8a6..9b137f1 100644 --- a/netsock.c +++ b/netsock.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -210,6 +211,30 @@ out: return ret; } +static int get_link_local_addr(uint32_t scope_id, struct in6_addr *addr) +{ + struct ifaddrs *ifaddr, *ifa; + + if (getifaddrs(&ifaddr) == -1) { + perror("getifaddrs"); + return -1; + } + for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { + if (ifa->ifa_addr == NULL) + continue; + if (ifa->ifa_addr->sa_family != AF_INET6) + continue; + + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) ifa->ifa_addr; + if (sin6->sin6_scope_id == scope_id) { + memcpy(addr, &sin6->sin6_addr ,sizeof(struct in6_addr)); + break; + } + } + freeifaddrs(ifaddr); + return 0; +} + static int netsock_open(struct interface *interface) { int sock; @@ -256,7 +281,10 @@ static int netsock_open(struct interface *interface) memset(&sin6, 0, sizeof(sin6)); sin6.sin6_port = htons(ALFRED_PORT); sin6.sin6_family = AF_INET6; - memcpy(&sin6.sin6_addr, &interface->address, sizeof(sin6.sin6_addr)); + if (get_link_local_addr(interface->scope_id, &sin6.sin6_addr) < 0) { + perror("cannot get link local address"); + goto err; + } sin6.sin6_scope_id = interface->scope_id; memset(&sin6_mc, 0, sizeof(sin6_mc)); ++++ Anschließend bauen. Den [[GPS]]-Daemon brauchen wir nicht git apply -v ffpi.patch make CONFIG_ALFRED_GPSD=n make install CONFIG_ALFRED_GPSD=n ===== Alfred-JSON ===== Wird nur auf dem Server benötigt wo der Meshviewer läuft, zzw. ein Alfred im Master-Modus. Schadet ansonsten aber auch nicht. Wichtig: Bei einem fehlerhaften JSON wird eine Warnung ausgegeben. Dieses Verhalten sollte noch verbessert werden, indem: * ein Schalter ''-q'' "Quiet" eingebaut wird * der Fehler genauer eingegrenzt wird, damit der betreffende Knoten ggf. markiert werden kann Tip: Falls das klonen mit Git einen CA SSL Fehler wirft, kann man den umgehen mit: git config --global http.sslVerify false aptitude install libjansson-dev zlib1g-dev git clone https://github.com/ffnord/alfred-json.git cd alfred-json mkdir build cd build cmake ../ make make install Tests: * ''alfred-json -zr 158'' ===== Übersicht über die Alfred-Datenstrukturen ===== ^ Datenblock 158 / alle 5 Minuten? ||||^ Beispiel ^ Beschreibung ^ | network | mac | | | | | | | | addresses | | | | | Liste der Adressen | | | mesh_interfaces | | | | | | | | mesh | | interfaces | wireless | | | | | | | | tunnel | | | | | | | | other | | | | | exitvpn | provider | | | mullvad | nur für Gate | | | | country | | | NL | nur für Gate | | node_id | | | | | | | | hostname | | | | | ffpi-test01 | | | hardware | model | | | | TP-Link TL-WR1043N/ND v2 | | | | nproc | | | | 1 | | | owner | contact | | | | bernd@example.com | | | location | latitude | | | | | | | | longitude | | | | | | | | altitude | | | | | Nutzung noch unklar | | system | site_code | | | | ffpi | | | | role | | | | node | | | software | fastd | enabled | | | true | | | | | version | | | v17 | | | | | port | | | 10000 | | | | autoupdater | enabled | | | true | | | | | branch | | | stable | | | | batman-adv | version | | | 2015.0 | | | | | compat | | | 15 | | | | firmware | base | | | gluon-v2016.2.4 | Betriebssystemversion | | | | release | | | 0.8.1 | Pinneberger Firmwarebezeichnung | ^ Datenblock 159 / jede Minute? |||||^ Beschreibung ^ | uptime | | | | | | | | memory | buffers | | | | | | | | cached | | | | | | | | total | | | | | | | | free | | | | | | | traffic | tx | packets | | | | | | | | dropped | | | | | | | | bytes | | | | | | | rx | packets | | | | | | | | bytes | | | | | | | forward | packets | | | | | | | | bytes | | | | | | | mgmt_tx | packets | | | | | | | | bytes | | | | | | | mgmt_rx | packets | | | | | | node_id | | | | | | | | rootfs_usage | | | | | | | | idletime | | | | | | | | gateway | | | | | | | | clients | wifi | | | | | | | | total | | | | | | | processes | total | | | | | | | | running | | | | | | | loadavg | | | | | | | | mesh_vpn | groups | backbone | peers | | established | | | peers | | | | | | Nur Gate, Anzahl fastd VPN Peers | ^ Datenblock 160 |||||^ Beschreibung ^ | batadv | | neighbours | | lastseen | | | | | | | | tq | | | | wifi | | neighbours | | noise | | | | | | | | inactive | | | | | | | | signal | | | | nodeid | | | | | | | TODO RESTORE