Global: Convert IPv4/IPv6 from char to numbers/binary

This is done for tables router_ipv6 and router_netif.

This is not done for table gw_netif (contains subnet masks).

This requires changes to the MySQL database!

Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
This commit is contained in:
Adrian Schmutzler 2018-08-27 16:58:00 +02:00
parent bc3460f2e0
commit c1c728f2a3
6 changed files with 59 additions and 23 deletions

View File

@ -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,

View File

@ -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")

View File

@ -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)

View File

@ -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'],

View File

@ -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())

View File

@ -276,16 +276,16 @@
</div>
<div class="row">
<div class="col-xs-5 col-sm-5">
{%- if netif.ipv6_fe80_addr -%}
{{ netif.ipv6_fe80_addr }}
{%- if netif.fe80_addr -%}
{{ netif.fe80_addr|bin2ipv6 }}
{%- else -%}
<em title="Calculated from MAC Address">{{ netif.mac|macint2fe80 }}</em>
{%- endif -%}
{%- if netif.ipv4_addr -%}
<br />{{ netif.ipv4_addr }}
<br />{{ netif.ipv4_addr|int2ipv4 }}
{%- endif -%}
{%- for ipv6_addr in netif.ipv6_addrs -%}
<br />{{ ipv6_addr }}
<br />{{ ipv6_addr|bin2ipv6 }}
{%- endfor -%}
</div>
{%- if netif.rx is defined %}
@ -321,16 +321,16 @@
</div>
<div class="row">
<div class="col-xs-5 col-sm-5">
{%- if netif.ipv6_fe80_addr -%}
{{ netif.ipv6_fe80_addr }}
{%- if netif.fe80_addr -%}
{{ netif.fe80_addr|bin2ipv6 }}
{%- else -%}
<em title="Calculated from MAC Address">{{ netif.mac|macint2fe80 }}</em>
{%- endif -%}
{%- if netif.ipv4_addr -%}
<br />{{ netif.ipv4_addr }}
<br />{{ netif.ipv4_addr|int2ipv4 }}
{%- endif -%}
{%- for ipv6_addr in netif.ipv6_addrs -%}
<br />{{ ipv6_addr }}
<br />{{ ipv6_addr|bin2ipv6 }}
{%- endfor -%}
</div>
{%- if netif.rx is defined %}