-- Configuration Template for Neanderfunk / Eulenfunk - Gluon 2023.2.x
{
hostname_prefix = 'dusuk-',
site_name = 'Freifunk Düsseldorf-Unterkünfte - Domain 12 (Eulenfunk)',
site_code = 'dus-12_dusuk',
-- Must be the same of all nodes in one mesh domain
domain_names = { ['ffdus-12dusuk'] = 'DUS-Unterkünfte' },
domain_seed = '39f0ca0422c1cf9046b7b26533b12ffe73cbf2cdc27d6d60ad2fb4130de0c667',
config_mode = {
hostname = {
optional = false,
},
owner = {
obligatory = false,
},
geo_location = {
show_altitude = true,
osm = {
center = {
lat = 51.214,
lon = 6.8255,
},
zoom = 11,
tile_layer = {
type = 'XYZ',
url = 'https://tiles.ffdus.de/a.tile.openstreetmap.org/{z}/{x}/{y}.png',
attributions = '© OpenStreetMap contributors.',
},
},
},
owner = {
optional = false,
obligatory = true,
},
remote_login = {
show_password_form = true,
min_password_length = 12,
},
},
setup_mode = {
skip = true,
},
authorized_keys = {
'ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAufGE6eK/iZTeLKCduy4UEyQpkXX+Z/0SAbYCbkJhJjNpYJaAaMhPI9yPWqsSJlQ9NSMVHMWF+3fTYb8uXEMFxEAXLqgYWhc7fs45FwvP7Ki9q5vZlvrKdB0MOPkQsY1sI3AEtcFwoft0uemW9QZUJ9jxBSi82BDbSZnFykv81ds= adorfer',
'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCcyauL2INrpsB2gufsm4TD1TkpuUgF68blvbJnYr6obvPm4kVTUbhc8VFSHeMkRHtxYHkU07NfFe2E0sDmpDNJ+CPFeTFMlqOfKsjq1m5Tng9mAEwCFVJJDRl8g70UkkUUzUKgsE38+NYOwY8nthmpJEA7XiE1YcwkBodLFEhdXM5bLJ2cRlNFE2mKYbBQx3Cp1trPJDU00ioyNpAnqrwNAXCxTL4nPmCuC5iPhE7lrFyc7v5D6o0Jw/pEGfQxkOinkncwg2RUfSpShnpSzmlZ+aWKNBhabGXAOH7CQceoFShAl5Hzqvcn7NBJUuM4kzWsPQd6gKL+XBDfyqhnbsL andreas@neanderfunk',
'ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAyGzk43wy0HNJ7+qQYtesTbMMSkgTbzmFRVvvtn95Cl2LFC5R/ykcdnYiBgrHIDdDBRQohF6Q6peh9zhiI0e+x6tsw5sduVIdpLTKKn/Q3VrH4/QgF6hhhL9WNEQThim7WobNj8JybhnnZKcUdYV6ywXSkfh+Q68eoJKstdrKbtU95c2d6aHfsQCJJG39KWfHugaPmo5yNYRH033Rsf6IIKoYskSZbUcNfB03cqy+kA/2TcjpV2amPhbYXdrzwlC8C3w8Ps+1bInosaomPMdpkkDkLG9vBOh+PLkQJo+5JCNsfqK+D+QmCvSKSCl609lb8jRFWo+46K1T3KWJWmPVnQ== wisejoe@froeckel',
'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCm9rr9PM9q2W6u1L7FmZYhBBsy9QzZI6vRm5GOSkKsp+wdEMJwK6MDmndv765kOd9dtBlREddtzee2zzNAb+Lcci5GiOUGd5vIzWHB4YtIH01exn+RjtTy5SG/SxtH91YuMpC8WJNUoYa3ON+TS+jD/S+lzg9yPwFzOzonyLx81Q1ANS7gcBNUzxYOlqzr/yOdyDti7DEnqQWHf0jjYv3AACx/fdYDFyRBQMJ0oUmWUiQDb7y7PXR+MGuX1J7NKlItFs3OjePjNL4SToYKphVdhl9ZhNbWEaPKnrKZHvrqBrtqDTQD2ajh956jrj0ZzfT2bsVzEj1PMNeAhbPSgjOygMtnqN49bNflDWbwrBNyZnbtFXFxpxmVcFQ6bjWnbqy3vYur2LUNQpL0D0lffXu7zDJJWNfDqVLDjIMG1IKvCaCthrBMiaaV2RW2XgI5f3fcDjrLTjDIwLxSzMfMgNUzmbuce236/um6UmOauGYaN5qjb/VLHw2QhooY/dHkkYH+Hq4HqAokJrajRu8wxo0OOJhWqbdq7QsKWXXx7W9yrTfgGvEDMUp4jIzltVUmeF+yd3IYm9GxRrBBNybL9FGRmhLHLzSGJ99vHFUFPlkiJGRtXiaajUlJz6ZOfh6RO+H/LLmw4pDIvilvq5+EjQuH79q4RScD3TXkIDbb0ls4+w== jonathanneu@Jonathans-MBP',
'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCvMCy/RjnGc/ppzxIqvyv3WnaQ3Tj495MLw8qV4FpTkVndjIuqrY7heW4G1W4AFV97QpwCnBTOVmL6xg8kS+zPWN8/pFbIWF1tDBBocZuIYQhOzyd4KPewgu/GXPhmDTtAqdU/MC1CL9Zmd5P+YTzTTVYvvJmLx8ZNWx1KVU9BTePF1y6ekhLduvzOfGDW4rhPhjGGeEIW15sLpM/JnlLMP0nZvbmTQQH91g3qKsabxmYPH6W/s+rTja2ds+SfrNzj4VrRRNUaNFaUo/2G/m5lr/yYTgF2bDb1D7MijMs/u0Z6cdvlOXzdESII8jgVsa942KdEiskak0cRFEDLhf7Qomjamf/fGfQyrhQeH+XBDVlPbumN5LrHpO68U9kbpRpPxX/IRlsjKG6fYj5LIOQqpfWBqvlCuAFacUcp8EglQVKlB5yuSpEcwhH4vb03z+hLQndmGkzlp2yqcM/+sDpIzeQHK58MyLXXIiNJW7cUoExqmaGSrvXl1duncpBNVEgBfCYaWA9PwnTxWOf5Ywl2Zei5W9p5G8vJSSaEV+SyxrCUl2MGbAQob01KrsgSRQ5lK1Uhjzq62ewVmUWvfu+1dy/NKwTNLofd957pd4f0BpB0wRd4c5EQDtyHyKjGT27EdzoukUdlELWBCXvt7i/W0MBco/spgL+05YqDrJJNbw== stephan@neanderfunk.de',
'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDX07jn28SLFNVN9tSMGBbgbWixX+PSVrxVBHt8pkHiseGIXB2LGXRK54O7IT+kcmasZX5AKu4J0oRRgisf/S1vZgVSC45Ri7w9Q3NYvG2yYTsvP3a3NmmH0fvi26QC1I7r2od+eivMjve/DJf0q/R2uUZMad4giyGy+NFBJaFULWnDe9L8Dkqw545WtSmYzNaP95LmW72Zz+Ohrgag/Y0ixEtqlFccAiDdgszK7AWLDfxPwgvsyP4LYOS9RKRzaNw6/Snda7x1WYeTgfJ/5npvVJ0Ovlh9sPVAKnHVmGxlTdPoSN9mgYgjSawFieZ5wBlfmqoQd+BI+wKlYVFZHxE3 alex@neanderfunk',
},
-- Anders als unter 2025.1 muss hier ein 'openwrt' stehen. Wir bauen gegen
-- den Zweig openwrt-23.05, das Image traegt also distfeeds auf
-- .../releases/23.05-SNAPSHOT/. Diesen Baum gibt es seit dem Zweigende nicht
-- mehr (404, auf allen Spiegeln gleichermassen); die Image-eigenen Zeilen
-- laufen ins Leere und muessen ueberschrieben werden.
--
-- 23.05.6 ist das passende Punktrelease: unser Pin
-- (OPENWRT_COMMIT 7f61f962) liegt 23 Commits danach auf demselben Zweig,
-- also innerhalb derselben stabilen ABI-Reihe. %v hilft nicht, das ergibt
-- "23.05", und /releases/23.05/ gibt es nicht.
--
-- Signaturen passen: /etc/opkg.conf setzt "option check_signature", der
-- Zweig openwrt-23.05 installiert ueber openwrt-keyring den Schluessel
-- b5043e70f9a75cde, und genau der signiert 23.05.5 und 23.05.6.
--
-- Kernelmodule kommen nicht von hier: openwrt_core ist von Gluon
-- abgeschaltet, weil kmods gegen genau unseren Kernel gebaut sein muessen.
-- Die liefert der eigene modules-Feed unten.
opkg = {
openwrt = 'http://downloads.openwrt.org/releases/23.05.6/packages/%A',
extra = {
-- Kernelmodule und der Target-Baum: genau eine Quelle, und das ist
-- Absicht. Ein zweiter Anbieter waere kein Rueckfall, sondern eine
-- Fehlerquelle.
gluonffnef = 'http://firmware.ffnef.de/firmware/modules/gluon-%GR/%S',
-- Zweite Quelle fuer die OpenWrt-Pakete, dieselben Dateien und damit
-- dieselbe Signatur. ftp.halifax.rwth-aachen.de fuehrt den Baum
-- vollstaendig, geprueft.
owrt2base = 'http://ftp.halifax.rwth-aachen.de/openwrt/releases/23.05.6/packages/%A/base',
owrt2luci = 'http://ftp.halifax.rwth-aachen.de/openwrt/releases/23.05.6/packages/%A/luci',
owrt2packages = 'http://ftp.halifax.rwth-aachen.de/openwrt/releases/23.05.6/packages/%A/packages',
owrt2routing = 'http://ftp.halifax.rwth-aachen.de/openwrt/releases/23.05.6/packages/%A/routing',
owrt2telephony = 'http://ftp.halifax.rwth-aachen.de/openwrt/releases/23.05.6/packages/%A/telephony',
-- Gluon-, community- und unsere eigenen Pakete, aus demselben Bau wie
-- das Image und mit demselben Schluessel signiert. build.sh sammelt sie
-- aus bin/packages// ein (collect_opkg_feeds).
--
-- Vorher standen hier ffac-Feeds. Die scheitern an der
-- Signaturpruefung - repo.ffac.rocks signiert mit 58a72b56a2519719, und
-- der Schluessel liegt nirgends im Baum. Ausserdem waren die URLs tot:
-- packages-23.05 und packages-23.05.5 gibt es dort nicht.
ffnefgluon = 'http://firmware.ffnef.de/firmware/opkg-2023.2.x/gluon-%GR/%S/gluon',
ffnefgluonbase = 'http://firmware.ffnef.de/firmware/opkg-2023.2.x/gluon-%GR/%S/gluon_base',
ffnefcommunity = 'http://firmware.ffnef.de/firmware/opkg-2023.2.x/gluon-%GR/%S/community',
ffnefneanderfunk = 'http://firmware.ffnef.de/firmware/opkg-2023.2.x/gluon-%GR/%S/neanderfunk',
},
},
prefix4 = '10.0.0.0/8',
prefix6 = 'fd66:666e:6566:640c::/64',
extra_prefixes6 = {
-- for ebtables-source-filter
'2a03:2260::/32',
},
timezone = 'CET-1CEST,M3.5.0,M10.5.0/3',
ntp_servers = {
'ntp6.ffnef.de',
'ntp.ffdus.freifunk',
'0.openwrt.pool.ntp.org',
'2.openwrt.pool.ntp.org',
},
regdom = 'DE',
wifi24 = {
channel = 9,
preserve_channels = 1,
ap = {
ssid = 'Freifunk',
},
mesh = {
id = 'dusuk-mesh',
mcast_rate = 24000,
disabled = false,
},
},
wifi5 = {
channel = 48,
outdoor_chanlist = '100-140',
ap = {
ssid = 'Freifunk',
},
mesh = {
id = 'dusuk-mesh',
mcast_rate = 24000,
disabled = false,
},
},
usteer = {
network = {
enabled = true,
wireless = true,
wired = true,
update_interval = 5000,
update_timeout = 12,
},
band_steering = {
enabled = true,
min_snr = -60,
interval = 20000,
}
},
next_node = {
name = {
'nextnode',
'nn',
},
-- anycast IPs of all nodes
ip4 = '10.30.176.1',
ip6 = 'fd66:666e:6566:640c::1',
},
interfaces = {
lan = {
default_roles = { 'mesh' },
},
wan = {
default_roles = { 'uplink' },
},
single = {
default_roles = { 'uplink' },
},
},
poe_passthrough = true,
-- Options specific to routing protocols (optional)
mesh = {
vxlan = false,
filter_membership_reports = true,
-- Options specific to the batman-adv routing protocol (optional)
batman_adv = {
-- Gateway selection class (optional)
-- The default class 20 is based on the link quality (TQ) only,
-- class 1 is calculated from both the TQ and the announced bandwidth
gw_sel_class = 1,
routing_algo = 'BATMAN_IV',
},
},
mesh_vpn = {
enabled = true,
pubkey_privacy = true,
tunneldigger = {
mtu = 1364,
brokers = {'ganymed.ffnef.de:20012','kallisto.ffnef.de:20012','amalthea.ffnef.de:20012','himalia.ffnef.de:20012','elara.ffnef.de:20012','pasophae.ffnef.de:20012','sinope.ffnef.de:20012','lysithea.ffnef.de:20012'},
},
bandwidth_limit = {
enabled = false,
egress = 10000,
ingress = 30000,
},
},
autoupdater = {
enabled = 1,
branch = 'broken',
branches = {
stable = {
name = 'stable',
prefill = true,
mirrors = {
'http://firmware.12-dusuk.ffnef.de/firmware/stable/12_dusuk/sysupgrade',
'http://firmware.12-dusuk.ffdus/firmware/stable/12_dusuk/sysupgrade',
'http://firmware.ffnef.de/firmware/stable/12_dusuk/sysupgrade',
'http://[fd66:666e:6566:640c::733]/firmware/stable/12_dusuk/sysupgrade',
},
good_signatures = 3,
pubkeys = {
'bbc64c35bfc527f193e5551abd4fbef3940c44ebf75bdd829220b39913330d88', -- Jonathan
'2a61930930a240c027f6ca4197203d400b6e4a32f9e92041e5f086907796c9bc', -- adorfer
'd02f8e60fb7a5069556500694ebe512b6017b01e9950476e4cfcf10d5130c296', -- JJX
'96d644ff1ce07d6f67d9329a0eb9a1548d0d01a3519d17ec1fe9d49da3270bfc', -- plaste
'cd97b5e735cdefb1da4aede68f127c8c2f4536df6f544b568df5c801b88a9225', -- alex
'bd9e2ec7c5a1d420ff31543f27e02576b01ba5c887e726ab9388a25853b7d623', -- untrustworthy-buildbot
},
},
broken = {
name = 'broken',
mirrors = {
'http://firmware.12-dusuk.ffnef.de/firmware/broken/12_dusuk/sysupgrade',
'http://firmware.12-dusuk.ffdus/firmware/broken/12_dusuk/sysupgrade',
'http://firmware.ffnef.de/firmware/broken/12_dusuk/sysupgrade',
'http://[fd66:666e:6566:640c::733]/firmware/broken/12_dusuk/sysupgrade',
},
good_signatures = 1,
pubkeys = {
'bbc64c35bfc527f193e5551abd4fbef3940c44ebf75bdd829220b39913330d88', -- Jonathan
'2a61930930a240c027f6ca4197203d400b6e4a32f9e92041e5f086907796c9bc', -- adorfer
'd02f8e60fb7a5069556500694ebe512b6017b01e9950476e4cfcf10d5130c296', -- JJX
'96d644ff1ce07d6f67d9329a0eb9a1548d0d01a3519d17ec1fe9d49da3270bfc', -- plaste
'cd97b5e735cdefb1da4aede68f127c8c2f4536df6f544b568df5c801b88a9225', -- alex
'bd9e2ec7c5a1d420ff31543f27e02576b01ba5c887e726ab9388a25853b7d623', -- untrustworthy-buildbot
},
},
},
},
nodeplacer = {
-- only http:// is accepted here, check_site.lua matches on '^http://'
mirrors = {
'http://firmware.ffnef.de/firmware/nodeplacer',
'http://[fd66:666e:6566:640c::733]/firmware/nodeplacer',
},
good_signatures = 3,
-- pubkeys defaults to those of the configured autoupdater branch
disable = 0,
},
roguenets_filter = {
allowed_prefix4 = '10.0.0.0/8',
allowed_prefix6 = '2a03:2260::/29',
additional_prefix6 = {
'fda0:300e::/32',
},
},
dns = {
cacheentries = 1024,
servers = { 'fd66:666e:6566:640c::3','2620:fe::10', '2001:4860:4860::8844', '2001:4860:4860::8888', },
},
ssid_changer = {
enabled = true,
switch_timeframe = 2, -- only once every timeframe (in minutes) the SSID will change to OFFLINE
-- set to 1440 to change once a day
-- set to 1 minute to change every time the router gets offline
first = 10, -- the first few minutes directly after reboot within which an Offline-SSID always may be activated
prefix = 'FF_Offline_', -- use something short to leave space for the nodename (no '~' allowed!)
suffix = 'nodename', -- generate the SSID with either 'nodename', 'mac' or to use only the prefix: 'none'
tq_limit_enabled = true, -- if false, the offline SSID will only be set if there is no gateway reacheable
-- upper and lower limit to turn the offline_ssid on and off
-- in-between these two values the SSID will never be changed to prevent it from toggeling every minute.
tq_limit_max = 45, -- upper limit, above that the online SSID will be used
tq_limit_min = 35, -- lower limit, below that the offline SSID will be used
gwofflinemaxcount = 3, -- after how many gluon "has_default_gw4" check intervalls offline ssid is set.
},
wifi_blackout = {
blackoutwait = 171, -- Minuten ohne jede assoziierte Station, bevor gehandelt wird
resetwait = 281, -- Minuten Mindestabstand zwischen zwei Aktionen
stepsize = 10, -- Minuten zwischen zwei Pruefungen (Cron-Periode)
},
ap_timer = {
-- Seite "AP Timer" in den Erweiterten Einstellungen (neanderfunk-ap-timer).
-- Vorgabe des Pakets ist ebenfalls true; hier ausdruecklich, damit es
-- sichtbar ist. Mit false bleibt die Seite nur auf Knoten, deren Timer
-- schon laeuft (damit er sich dort abschalten laesst).
web = true,
},
node_whisperer = {
enabled = true,
information = {
'hostname',
'node_id',
'uptime',
'site_code',
-- 'domain' bewusst nicht: liefert auf Single-Domain-Firmware nichts,
-- der Daemon wertet das als Fehler und loggt alle 30 s
-- "Error collecting Information for id=4 name=domain code=-1".
'system_load',
'firmware_version',
-- 'batman_adv' bleibt bewusst drin, obwohl das Protokoll in Byte 0 nur
-- vpn.connected kennt: die 395 Knoten ohne VPN-Tunnel (35 % der
-- Online-Knoten) erscheinen in der App dadurch faelschlich offline.
-- Bewusst in Kauf genommen, damit die uebrigen ihre Mesh-Daten senden.
-- Reparabel nur upstream, durch ein zusaetzliches Feld im Protokoll.
'batman_adv'
}
},
neanderfunk = {
-- Zeilen im gemeinsamen Reboot-Log der neanderfunk-Pakete, 0 schaltet es
-- ab. Entspricht der eingebauten Vorgabe von neanderfunk-common.
-- Achtung: 490-neanderfunk-common uebernimmt den Wert nur auf Knoten, die
-- noch keinen eigenen haben, und kann einen von hier uebernommenen nicht
-- von einem von Hand gesetzten unterscheiden. Einmal angekommen, erreicht
-- eine spaetere Aenderung hier diese Knoten nicht mehr.
reboot_log_max = 6,
},
}