Alle Knoten sind nun unter luebeck.freifunk.net erreichbar


#1

Ich habe luebeck.freifunk.net an unseren srv01 beim Chaotikum
delegieren lassen. Somit können wir dort jetzt selber Subdomains
verwalten. Zum ausprobieren habe ich das Skript für die Knotennamen
genommen.

Alle Knoten sind nun unter $hostname.nodes.luebeck.freifunk.net aus
dem IPv6-Internet erreichbar.

Falls es keinen Widerspruch gibt, würde ich dann $hostname.nodes.ffhl
bald komplett abschalten (dort gibt es exakt die gleiche DNS Zone).

Wir könnten auch überlegen, ob wir luebeck.freifunk.net als Suchdomain
per DHCP verteilen wollen. Dann würde $hostname.nodes im Mesh
ausreichen.


#2

Die neue Lösung gefällt mir besser als die alte. Von mir aus kannst Du $hostname.nodes.ffhl demnächst abschalten.


#3

Super Sache, kannst du ein kleines HowTo für andere schreiben?


#4

Ich dumpe es mal hier, da ich gerade nicht viel Zeit habe.

Ein kleines Pythonscript erzeugt eine Zonefile:

#!/usr/bin/env python3

import json
import sys
import re
from ipaddress import *
from time import time

ValidHostnameRegex = "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$"
prefix = IPv6Network('2000::/3')

data = json.load(sys.stdin)

print("""$TTL 600  ; 10 minutes
@     IN SOA  srv01.luebeck.freifunk.net. info.luebeck.freifunk.net. (
          %i ; serial
          600        ; refresh (10min)
          30         ; retry (30s)
          3600       ; expire (1 hour)
          60         ; minimum (1 minute)
          )
	  NS srv01.luebeck.freifunk.net.
      """ % time())

HostnameRegex = re.compile(ValidHostnameRegex)

for i in data:
  node = data[i]
  try:
    hostname = node['hostname']
    if HostnameRegex.match(hostname) == None:
      continue

    address = None

    for a in node['network']['addresses']:
      a = IPv6Address(a)
      if a in prefix:
        address = a
        break

    if address:
      print("%s\tAAAA\t%s" % (hostname, address))
  except:
    pass

Und wird regelmäßig als Cronjob aufgerufen, etwa so:

#!/bin/sh
export LC_ALL=en_US.UTF-8
alfred-json -zr 158 | /usr/bin/python3 script.py > /var/cache/bind/nodes.ffhl.zone
/usr/sbin/rndc reload

#5

Hi :smile:

Ich habe das script noch für python 2.7 portiert, ihr müsst nur via pip das module py2-ipaddress installieren.

#!/usr/bin/env python2
 
import json
import sys
import re
from ipaddress import *
from time import time
 
ValidHostnameRegex = "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$"
prefix = IPv6Network('2000::/3')
 
data = json.load(sys.stdin)
 
print """$TTL 600  ; 10 minutes
@     IN SOA  srv01.luebeck.freifunk.net. info.luebeck.freifunk.net. (
         %i ; serial
         600        ; refresh (10min)
         30         ; retry (30s)
         3600       ; expire (1 hour)
         60         ; minimum (1 minute)
         )
     NS srv01.luebeck.freifunk.net.
     """ % time()
 
HostnameRegex = re.compile(ValidHostnameRegex)
 
for i in data:
  node = data[i]
  try:
    hostname = node['hostname']
    if HostnameRegex.match(hostname) == None:
      continue
 
    address = None
 
    for a in node['network']['addresses']:
      a = IPv6Address(a)
      if a in prefix:
        address = a
        break
 
    if address:
      print "%s\tAAAA\t%s" % (hostname, address)
  except:
    pass

Und das cronjob script:

#!/bin/sh
export LC_ALL=en_US.UTF-8
alfred-json -zr 158 | /usr/bin/python script.py > /var/cache/bind/nodes.ffhl.zone
/usr/sbin/rndc reload

Have fun :wink: