diff --git a/ffmap/db/routers.py b/ffmap/db/routers.py index 2614df3..268c8ca 100755 --- a/ffmap/db/routers.py +++ b/ffmap/db/routers.py @@ -157,7 +157,7 @@ mysql.execute(""" CREATE TABLE router_ipv6 ( `router` mediumint(8) UNSIGNED NOT NULL, `netif` varchar(15) COLLATE utf8_unicode_ci NOT NULL, - `ipv6` varchar(60) COLLATE utf8_unicode_ci NOT NULL + `ipv6` binary(16) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci """) @@ -190,8 +190,8 @@ mysql.execute(""" `tx_bytes` bigint(20) UNSIGNED NOT NULL, `rx` int(10) UNSIGNED NOT NULL, `tx` int(10) UNSIGNED NOT NULL, - `fe80_addr` varchar(60) COLLATE utf8_unicode_ci NOT NULL, - `ipv4_addr` varchar(20) COLLATE utf8_unicode_ci NOT NULL, + `fe80_addr` binary(16) DEFAULT NULL, + `ipv4_addr` int(10) UNSIGNED DEFAULT NULL, `mac` bigint(20) UNSIGNED DEFAULT NULL, `wlan_channel` tinyint(3) UNSIGNED DEFAULT NULL, `wlan_type` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL, diff --git a/ffmap/misc.py b/ffmap/misc.py index 37375db..3081151 100644 --- a/ffmap/misc.py +++ b/ffmap/misc.py @@ -4,6 +4,8 @@ import time import datetime from ffmap.config import CONFIG +#from socket import inet_pton, inet_ntop, AF_INET6 +from ipaddress import IPv4Address, IPv6Address def utcnow(): return datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc) @@ -50,6 +52,32 @@ def int2mactuple(data,index=None): r = int2mac(r) return data +def ipv6tobin(data): + if data: + return IPv6Address(data).packed + #return inet_pton(AF_INET6,data) + else: + return None +def bintoipv6(data): + if data: + return IPv6Address(data).compressed + #return inet_ntop(AF_INET6,data) + else: + return '' + +def ipv4toint(data): + if data: + return int(IPv4Address(data)) + #return inet_pton(AF_INET,data) + else: + return None +def inttoipv4(data): + if data: + return str(IPv4Address(data)) + #return inet_ntop(AF_INET,data) + else: + return '' + def writelog(path, content): with open(path, "a") as csv: csv.write(time.strftime('{%Y-%m-%d %H:%M:%S}') + " - " + content + "\n") diff --git a/ffmap/routertools.py b/ffmap/routertools.py index c566093..23d4161 100644 --- a/ffmap/routertools.py +++ b/ffmap/routertools.py @@ -254,7 +254,7 @@ def import_nodewatcher_xml(mysql, mac, xml, banned, netifdict, statstime): ndata = [] adata = [] for n in router_update["netifs"]: - ndata.append((router_id,n["name"],n["mtu"],n["traffic"]["rx_bytes"],n["traffic"]["tx_bytes"],n["traffic"]["rx"],n["traffic"]["tx"],n["ipv6_fe80_addr"],n["ipv4_addr"],n["mac"],n["wlan_channel"],n["wlan_type"],n["wlan_width"],n["wlan_ssid"],n["wlan_txpower"],)) + ndata.append((router_id,n["name"],n["mtu"],n["traffic"]["rx_bytes"],n["traffic"]["tx_bytes"],n["traffic"]["rx"],n["traffic"]["tx"],n["fe80_addr"],n["ipv4_addr"],n["mac"],n["wlan_channel"],n["wlan_type"],n["wlan_width"],n["wlan_ssid"],n["wlan_txpower"],)) for a in n["ipv6_addrs"]: adata.append((router_id,n["name"],a,)) @@ -797,7 +797,7 @@ def parse_nodewatcher_xml(xml,statstime): "rx": 0, "tx": 0, }, - "ipv4_addr": evalxpath(netif,"ipv4_addr/text()"), + "ipv4_addr": ipv4toint(evalxpath(netif,"ipv4_addr/text()")), "mac": mac2int(evalxpath(netif,"mac_addr/text()")), "wlan_channel": evalxpathint(netif,"wlan_channel/text()",None), "wlan_type": evalxpath(netif,"wlan_type/text()",None), @@ -806,12 +806,12 @@ def parse_nodewatcher_xml(xml,statstime): "wlan_txpower": evalxpath(netif,"wlan_tx_power/text()",None), } with suppress(IndexError): - interface["ipv6_fe80_addr"] = "" - interface["ipv6_fe80_addr"] = netif.xpath("ipv6_link_local_addr/text()")[0].lower().split("/")[0] + interface["fe80_addr"] = None + interface["fe80_addr"] = ipv6tobin(netif.xpath("ipv6_link_local_addr/text()")[0].split("/")[0]) interface["ipv6_addrs"] = [] if len(netif.xpath("ipv6_addr/text()")) > 0: for ipv6_addr in netif.xpath("ipv6_addr/text()"): - interface["ipv6_addrs"].append(ipv6_addr.lower().split("/")[0]) + interface["ipv6_addrs"].append(ipv6tobin(ipv6_addr.split("/")[0])) router_update["netifs"].append(interface) diff --git a/ffmap/web/api.py b/ffmap/web/api.py index 0715ca6..f843d27 100755 --- a/ffmap/web/api.py +++ b/ffmap/web/api.py @@ -297,14 +297,14 @@ def dnslist(): FROM router INNER JOIN router_netif ON router.id = router_netif.router INNER JOIN router_ipv6 ON router.id = router_ipv6.router AND router_netif.netif = router_ipv6.netif - WHERE LEFT(ipv6,4) = 'fd43' + WHERE LEFT(HEX(ipv6),4) = 'fd43' GROUP BY hostname, mac """,()) mysql.close() s = "" for router in router_data: - s += int2shortmac(router["mac"]) + "\t" + router["fd43"] + "\n" + s += int2shortmac(router["mac"]) + "\t" + bintoipv6(router["fd43"]) + "\n" return Response(s,mimetype='text/plain') @@ -316,14 +316,14 @@ def dnsentries(): FROM router INNER JOIN router_netif ON router.id = router_netif.router INNER JOIN router_ipv6 ON router.id = router_ipv6.router AND router_netif.netif = router_ipv6.netif - WHERE LEFT(ipv6,4) = 'fd43' + WHERE LEFT(HEX(ipv6),4) = 'fd43' GROUP BY hostname, mac """,()) mysql.close() s = "" for router in router_data: - s += int2shortmac(router["mac"]) + ".fff.community. 300 IN AAAA " + router["fd43"] + " ; " + router["hostname"] + "\n" + s += int2shortmac(router["mac"]) + ".fff.community. 300 IN AAAA " + bintoipv6(router["fd43"]) + " ; " + router["hostname"] + "\n" return Response(s,mimetype='text/plain') @@ -458,7 +458,7 @@ def get_routers_by_nickname(nickname): 'name': router['hostname'], 'oid': str(router['id']), 'mac': int2mac(router['mac']), - 'ipv6_fe80_addr': router['fe80_addr'] + 'fe80_addr': bintoipv6(router['fe80_addr']) } ) return jsonify(nodelist_data) @@ -490,7 +490,7 @@ def get_routers_by_keyxchange_id(keyxchange_id): nodelist_data['nodes'].append( { 'name': router['hostname'], - 'ipv6_fe80_addr': router['fe80_addr'], + 'ipv6_fe80_addr': bintoipv6(router['fe80_addr']), 'href': 'https://monitoring.freifunk-franken.de/routers/' + str(router['id']), 'firmware': router['firmware'], 'hardware': router['hardware'], diff --git a/ffmap/web/filters.py b/ffmap/web/filters.py index 3747764..18749e7 100644 --- a/ffmap/web/filters.py +++ b/ffmap/web/filters.py @@ -9,7 +9,7 @@ import json import datetime import re import hashlib -from ffmap.misc import int2mac, int2shortmac +from ffmap.misc import int2mac, int2shortmac, inttoipv4, bintoipv6 sys.path.insert(0, os.path.abspath(os.path.dirname(__file__) + '/' + '../..')) from ffmap.misc import * @@ -28,6 +28,14 @@ def int2macfilter(d): def int2shortmacfilter(d): return int2shortmac(d) +@filters.app_template_filter('int2ipv4') +def int2ipv4filter(d): + return inttoipv4(d) + +@filters.app_template_filter('bin2ipv6') +def bin2ipv6filter(d): + return bintoipv6(d) + @filters.app_template_filter('utc2local') def utc2local(dt): return dt.astimezone(tz.tzlocal()) diff --git a/ffmap/web/templates/router.html b/ffmap/web/templates/router.html index 3a868f6..c73b0b3 100644 --- a/ffmap/web/templates/router.html +++ b/ffmap/web/templates/router.html @@ -276,16 +276,16 @@
- {%- if netif.ipv6_fe80_addr -%} - {{ netif.ipv6_fe80_addr }} + {%- if netif.fe80_addr -%} + {{ netif.fe80_addr|bin2ipv6 }} {%- else -%} {{ netif.mac|macint2fe80 }} {%- endif -%} {%- if netif.ipv4_addr -%} -
{{ netif.ipv4_addr }} +
{{ netif.ipv4_addr|int2ipv4 }} {%- endif -%} {%- for ipv6_addr in netif.ipv6_addrs -%} -
{{ ipv6_addr }} +
{{ ipv6_addr|bin2ipv6 }} {%- endfor -%}
{%- if netif.rx is defined %} @@ -321,16 +321,16 @@
- {%- if netif.ipv6_fe80_addr -%} - {{ netif.ipv6_fe80_addr }} + {%- if netif.fe80_addr -%} + {{ netif.fe80_addr|bin2ipv6 }} {%- else -%} {{ netif.mac|macint2fe80 }} {%- endif -%} {%- if netif.ipv4_addr -%} -
{{ netif.ipv4_addr }} +
{{ netif.ipv4_addr|int2ipv4 }} {%- endif -%} {%- for ipv6_addr in netif.ipv6_addrs -%} -
{{ ipv6_addr }} +
{{ ipv6_addr|bin2ipv6 }} {%- endfor -%}
{%- if netif.rx is defined %}