nix/lib/config: begin treating aps as manageable switches

This commit is contained in:
Astro 2021-11-04 19:17:31 +01:00
parent 8acc37b5d5
commit 9852920ee8
6 changed files with 325 additions and 251 deletions

View File

@ -31,6 +31,14 @@ let
net == "pub" || net == "pub" ||
net == "serv" || net == "serv" ||
builtins.match "priv[[:digit:]]+" net != null; builtins.match "priv[[:digit:]]+" net != null;
whoLinksTo = target:
builtins.attrNames (
lib.filterAttrs (hostName: { ports, ... }:
hostName != target &&
ports ? ${target}
) pillar.switches
);
in in
{ {
options.salt-pillar = lib.mkOption {}; options.salt-pillar = lib.mkOption {};
@ -385,6 +393,7 @@ in
(builtins.mapAttrs (_: switch: { (builtins.mapAttrs (_: switch: {
inherit (switch) model location password; inherit (switch) model location password;
role = "switch"; role = "switch";
interfaces.mgmt.type = "phys";
links = builtins.mapAttrs (_: { ports, group ? null, ... }: { links = builtins.mapAttrs (_: { ports, group ? null, ... }: {
group = if group != null group = if group != null
then toString group then toString group
@ -397,7 +406,7 @@ in
}) switch.ports; }) switch.ports;
}) pillar.switches) }) pillar.switches)
(builtins.mapAttrs (_: ap: { (builtins.mapAttrs (hostName: ap: {
inherit (ap) model location password; inherit (ap) model location password;
role = "ap"; role = "ap";
@ -416,6 +425,35 @@ in
map ({ net, ... }: net) (builtins.attrValues ssids) map ({ net, ... }: net) (builtins.attrValues ssids)
) (builtins.attrValues ap.radios) ) (builtins.attrValues ap.radios)
); );
links =
let
wanTargets = whoLinksTo hostName;
model = self.lib.getOpenwrtModel ap.model;
getPorts = regex:
map (port: {
port = port.port;
phys = port.port;
}.${port.type}) (
builtins.filter (port:
port ? port &&
builtins.match regex port.port != null
) (builtins.attrValues model.ports)
);
in
if model ? ports
then
lib.optionalAttrs (builtins.length wanTargets > 0) {
"${builtins.head wanTargets}".ports = getPorts "wan";
} // lib.optionalAttrs (ap ? lan-access) {
"${ap.lan-access}".ports = getPorts "lan.*";
}
else
builtins.trace "No known ports for OpenWRT model ${ap.model}"
{};
wifi = ap.radios;
}) pillar.cpe) }) pillar.cpe)
(builtins.mapAttrs (name: container: (builtins.mapAttrs (name: container:

View File

@ -2,41 +2,34 @@
with lib; with lib;
let let
getLinkNets = link: getHostNets = link:
let let
hostConfig = config.site.hosts.${link}; hostConfig = config.site.hosts.${link};
sort = builtins.sort (net1: net2: sort = nets: lib.unique (
config.site.net.${net1}.vlan < config.site.net.${net2}.vlan builtins.sort (net1: net2:
config.site.net.${net1}.vlan < config.site.net.${net2}.vlan
) nets
); );
in in
if config.site.hosts ? ${link} if config.site.hosts ? ${link}
then then
sort (
if builtins.elem hostConfig.role [ "container" "server" "ap" ] builtins.attrNames hostConfig.interfaces ++
then sort (builtins.attrNames hostConfig.interfaces) getLinksNets link
)
else if hostConfig.role == "switch"
then sort (getSwitchNets link)
else if hostConfig.role == "client"
then if hostConfig.interfaces == {}
then builtins.trace "No known networks implemented for client \"${link}\"" []
else sort (builtins.attrNames hostConfig.interfaces)
else throw "getHostNets not implemented for role \"${hostConfig.role}\""
else if config.site.net ? ${link} else if config.site.net ? ${link}
then [ link ] then [ link ]
else builtins.trace "Don't know what nets to configure for link to \"${link}\"" []; else builtins.trace "Don't know what nets to configure for link to \"${link}\"" [];
# breaks the getLinkNets recursion for switches, # breaks the getHostNets recursion for switches,
# requiring any net to be used by at >1 links # requiring any net to be used by at >1 links
getSwitchNets = hostName: getLinksNets = hostName:
let let
linksNets = builtins.mapAttrs (link: _: linksNets = builtins.mapAttrs (link: _:
unique ( unique (
getSwitchNets' { "${hostName}" = true; } [ link ] getLinkNets { "${hostName}" = true; } [ link ]
) )
) config.site.hosts.${hostName}.links; ) config.site.hosts.${hostName}.links;
allNets = unique ( allNets = unique (
@ -51,9 +44,9 @@ let
nets = builtins.filter (net: nets = builtins.filter (net:
netLinkCount net > 1 netLinkCount net > 1
) allNets; ) allNets;
in nets; #builtins.trace "getSwitchNets ${hostName} = ${concatStringsSep "," nets}" nets; in nets;
getSwitchNets' = seen: links: getLinkNets = seen: links:
if links == [] if links == []
then [] then []
else else
@ -62,18 +55,17 @@ let
seen' = seen // { seen' = seen // {
"${link}" = true; "${link}" = true;
}; };
onlyUnseen = builtins.filter (link: ! seen' ? ${link});
links' = builtins.tail links; links' = builtins.tail links;
in in
if config.site.hosts ? ${link} && if config.site.hosts ? ${link}
config.site.hosts.${link}.role == "switch" then getLinkNets seen' (
then getSwitchNets' seen' ( links' ++ (
links' ++ (builtins.attrNames config.site.hosts.${link}.links) onlyUnseen (builtins.attrNames config.site.hosts.${link}.links)
)
) )
else getLinkNets link ++ else getHostNets link ++
getSwitchNets' seen' ( getLinkNets seen' (onlyUnseen links');
builtins.filter (link: ! seen' ? ${link})
links'
);
dhcpOpts = { dhcpOpts = {
start = mkOption { start = mkOption {
@ -245,6 +237,13 @@ let
Include the container system in the server's `build-container` script. Include the container system in the server's `build-container` script.
''; '';
}; };
firstboot = mkOption {
type = types.bool;
default = false;
description = ''
true if host is a newly flashed OpenWRT device with a default address
'';
};
role = mkOption { role = mkOption {
type = types.enum [ "ap" "switch" "server" "container" "client" ]; type = types.enum [ "ap" "switch" "server" "container" "client" ];
default = "client"; default = "client";
@ -385,6 +384,36 @@ let
default = {}; default = {};
type = with types; attrsOf (submodule linkOpts); type = with types; attrsOf (submodule linkOpts);
}; };
wifi = mkOption {
default = {};
type = with types; attrsOf (submodule (
{ name, ... }: {
options = {
htmode = mkOption {
type = enum [ "HT20" "HT40-" "HT40+" "VHT80" ];
};
channel = mkOption {
type = int;
};
ssids = mkOption {
type = attrsOf (submodule (
{ name, ... }: {
options = {
net = mkOption {
type = str;
};
psk = mkOption {
type = nullOr str;
default = null;
};
};
}
));
};
};
}
));
};
}; };
}; };
@ -417,15 +446,15 @@ let
}; };
nets = mkOption { nets = mkOption {
type = with types; listOf str; type = with types; listOf str;
description = "Set for clients, automatically generated for others"; description = "Automatically generated";
default = getLinkNets name; default = getHostNets name;
}; };
vlans = mkOption { vlans = mkOption {
type = with types; listOf int; type = with types; listOf int;
description = "Automatically generated, do not set"; description = "Automatically generated, do not set";
default = map (net: default = map (net:
config.site.net.${net}.vlan config.site.net.${net}.vlan
) (getLinkNets name); ) (getHostNets name);
}; };
}; };
}; };

View File

@ -16,4 +16,22 @@ rec {
dns = import ./dns.nix { inherit pkgs config; }; dns = import ./dns.nix { inherit pkgs config; };
openwrtModels = import ./openwrt-models.nix { inherit self openwrt; }; openwrtModels = import ./openwrt-models.nix { inherit self openwrt; };
getOpenwrtModel = wantedModel:
let
models =
builtins.filter ({ models, ... }:
self.lib.any ({ model, ... }:
model == wantedModel
) models
) openwrtModels;
result =
builtins.foldl' (result: { data, ... }:
self.lib.recursiveUpdate result data
) {} models;
in
if builtins.length models > 0
then result
else builtins.trace "No data found for OpenWRT model ${wantedModel}"
{};
} }

View File

@ -16,20 +16,31 @@ let
parseCommand = line: parseCommand = line:
let let
tokens = builtins.split "[[:space:]]+" line; tokens =
words = builtins.concatMap (frag:
builtins.map (word: if builtins.isString frag
let m = builtins.match "\"(.+)\"" word; then builtins.split "[[:space:]]+" frag
in if m != null else frag
then builtins.head m
else word
) ( ) (
builtins.filter (word: builtins.split "\"([^\"]*)\"" line
word != [] && word != ""
) tokens
); );
words =
builtins.filter (word:
word != [] && word != ""
) tokens;
command = builtins.head words; command = builtins.head words;
args = builtins.tail words; args = builtins.tail words;
makeLinkFromArg = port: arg:
builtins.foldl' (result: interface:
if port != []
then result // {
type = "phys";
inherit interface port;
}
else result
) {} (builtins.split "[[:space:]]+" arg);
commands = { commands = {
ucidef_add_switch.ports = builtins.foldl' (ports: arg: ucidef_add_switch.ports = builtins.foldl' (ports: arg:
let let
@ -62,6 +73,21 @@ let
} }
else builtins.trace "Unimplemented port scheme: ${arg}" ports else builtins.trace "Unimplemented port scheme: ${arg}" ports
) {} (builtins.tail args); ) {} (builtins.tail args);
ucidef_set_interface_wan.ports = {
"${builtins.head args}" = {
type = "phys";
interface = builtins.head args;
port = "wan";
};
};
ucidef_set_interface_lan.ports =
makeLinkFromArg "lan" (builtins.elemAt args 0);
ucidef_set_interfaces_lan_wan.ports =
makeLinkFromArg "lan" (builtins.elemAt args 0) //
makeLinkFromArg "wan" (builtins.elemAt args 1);
}; };
in in
if commands ? ${command} if commands ? ${command}
@ -74,7 +100,7 @@ in (
builtins.foldl' ({ state, result, models ? null, data ? {} }: line: builtins.foldl' ({ state, result, models ? null, data ? {} }: line:
if state == "start" if state == "start"
then then
if builtins.match "[[:space:]]*case \"\\$board\" in" line != null if builtins.match "[[:space:]]*case \"?\\$board\"? in" line != null
then { state = "case"; inherit result; } then { state = "case"; inherit result; }
else { inherit state result; } else { inherit state result; }

View File

@ -1,14 +1,24 @@
{ pkgs, hostName, config, hostConfig, ... }: { self, pkgs, hostName, config, hostConfig, ... }:
with pkgs;
with lib;
let let
ports = self.lib.getOpenwrtPorts hostConfig.model;
uciDeleteAll = key: ''
while uci -q delete ${key}[-1]; do :; done
'';
uciNetworkMgmt = ifname: '' uciNetworkMgmt = ifname: ''
set network.mgmt=interface set network.mgmt=interface
set network.mgmt.ifname={{ ifname }} set network.mgmt.ifname=${ifname}
set network.mgmt.proto=static set network.mgmt.proto=static
set network.mgmt.ipaddr={{ pillar['hosts-inet']['mgmt'][hostName] }} set network.mgmt.ipaddr=${config.site.net.mgmt.hosts4.${hostName}}
set network.mgmt.netmask=255.255.255.0 set network.mgmt.netmask=${self.lib.netmasks.${elemAt (
set network.mgmt.gateway={{ pillar['hosts-inet']['mgmt']['mgmt-gw'] }} builtins.split "/" config.site.net.mgmt.subnet4
set network.mgmt.ip6addr={{ pillar['hosts-inet6']['dn42']['mgmt'][hostName] }}/64 ) 2}}
set network.mgmt.ip6gw={{ pillar['hosts-inet6']['dn42']['mgmt']['mgmt-gw'] }} set network.mgmt.gateway=${config.site.net.mgmt.hosts4."mgmt-gw"}
set network.mgmt.ip6addr=${config.site.net.mgmt.hosts6.dn42.${hostName}}
set network.mgmt.ip6gw=${config.site.net.mgmt.hosts6.dn42."mgmt-gw"}
delete network.mgmt.dns delete network.mgmt.dns
add_list network.mgmt.dns={{ pillar['hosts-inet']['serv']['dnscache'] }} add_list network.mgmt.dns={{ pillar['hosts-inet']['serv']['dnscache'] }}
add_list network.mgmt.dns={{ pillar['hosts-inet6']['dn42']['serv']['dnscache'] }} add_list network.mgmt.dns={{ pillar['hosts-inet6']['dn42']['serv']['dnscache'] }}
@ -16,35 +26,37 @@ let
in '' in ''
#! ${pkgs.runtimeShell} -e #! ${pkgs.runtimeShell} -e
{%- if conf.get('firstboot') %} ${if hostConfig.firstboot
ssh-keygen -R 192.168.1.1 then ''
ssh-keygen -R 192.168.1.1
ssh root@192.168.1.1 \
"ash -e -x" <<__SSH__
'' else ''
ssh root@{{ pillar['hosts-inet']['mgmt'][hostName] }} \
"ash -e -x" <<__SSH__
''}
ssh root@192.168.1.1 \ # Set root password
"ash -e -x" <<__SSH__ echo -e '${hostConfig.password}\n${hostConfig.password}' | passwd
{%- else %}
ssh root@{{ pillar['hosts-inet']['mgmt'][hostName] }} \
"ash -e -x" <<__SSH__
{%- endif %}
# Set root password # add ssh pubkeys
echo -e '{{ conf['password'] }}\n{{ conf['password'] }}' | passwd ${concatMapStrings (sshPubKey: ''
echo "${sshPubKey}" > /etc/dropbear/authorized_keys
'') config.site.sshPubKeys}
# add ssh pubkey # System configuration
echo "{{ pillar['ssh']['pubkey'] }}" > /etc/dropbear/authorized_keys uci batch <<__UCI__
set system.@system[0].hostName=${hostName}
set dhcp.@dnsmasq[0].enabled=0
set system.@system[0].log_ip=${config.site.net.mgmt.hosts4.logging}
set system.@system[0].log_proto=udp
# System configuration delete network.globals.ula_prefix
uci batch <<__UCI__ delete network.lan
set system.@system[0].hostName={{ hostName }} delete network.wan
set dhcp.@dnsmasq[0].enabled=0 delete network.wan6
set system.@system[0].log_ip={{ pillar['hosts-inet']['mgmt']['logging'] }} delete wireless.default_radio0
set system.@system[0].log_proto=udp delete wireless.default_radio1
delete network.globals.ula_prefix
delete network.lan
delete network.wan
delete network.wan6
delete wireless.default_radio0
delete wireless.default_radio1
{%- set bridges = {} %} {%- set bridges = {} %}
{%- if conf.get('lan-access') %} {%- if conf.get('lan-access') %}
@ -369,116 +381,93 @@ set network.{{ net }}.ifname='{{ ' '.join(ports) }}'
{%- endif %} {%- endif %}
{%- set index = { 'radio': 0, 'iface': 0 } %} ${uciDeleteAll "wireless.@wifi"}
{%- for path, radio in conf['radios'].items() %}
set wireless.radio{{ index.radio }}=wifi-device
set wireless.radio{{ index.radio }}.type=mac80211
set wireless.radio{{ index.radio }}.country=DE
set wireless.radio{{ index.radio }}.channel={{ radio['channel'] }}
set wireless.radio{{ index.radio }}.path={{ path }}
set wireless.radio{{ index.radio }}.hwmode={{ radio.get('hwmode') or '11n' }}
set wireless.radio{{ index.radio }}.htmode={{ radio.get('htmode') or 'HT20' }}
set wireless.radio{{ index.radio }}.noscan=1
delete wireless.radio{{ index.radio }}.disabled
{%- for ssid, ssidconf in radio['ssids'].items() %} ${concatStrings (imap0 (index: path:
set wireless.wifi{{ index.iface }}=wifi-iface let
{%- if radio['channel'] < 15 %} radioConfig = hostConfig.wifi.${path};
{%- if conf['version'] == "nightly" %} ifPrefix = if radioConfig.channel < 15
{%- set ifprefix = 'wlan2_' %} then "wlan2"
{%- else %} else "wlan5";
{%- set ifprefix = 'wlan2-' %} in ''
{%- endif %} set wireless.radio${toString index}=wifi-device
{%- else %} set wireless.radio${toString index}=wifi-device
{%- if conf['version'] == "nightly" %} set wireless.radio${toString index}.type=mac80211
{%- set ifprefix = 'wlan5_' %} set wireless.radio${toString index}.country=DE
{%- else %} set wireless.radio${toString index}.channel=${toString radioConfig.channel}
{%- set ifprefix = 'wlan5-' %} set wireless.radio${toString index}.path=${path}
{%- endif %} set wireless.radio${toString index}.htmode=${radioConfig.htmode}
{%- endif %} set wireless.radio${toString index}.noscan=1
{%- if ssidconf.get('wpa-eap') %} delete wireless.radio${toString index}.disabled
{%- if conf['version'] == "nightly" %} ${concatMapStrings (ssid:
{%- set ifsuffix = '_eap' %} let
{%- else %} ssidConfig = radioConfig.ssids.${ssid};
{%- set ifsuffix = '-eap' %} in ''
{%- endif %} add wireless wifi
{%- else %} set wireless.@wifi-iface[-1].ifname=${ifPrefix}-${ssidConfig.net}
{%- set ifsuffix = "" %} set wireless.@wifi-iface[-1].device=radio${toString index}
{%- endif %} set wireless.@wifi-iface[-1].ssid='${ssid}'
set wireless.wifi{{ index.iface }}.ifname={{ ifprefix }}{{ ssidconf['net'] }}{{ ifsuffix }} set wireless.@wifi-iface[-1].mode=ap
set wireless.wifi{{ index.iface }}.device=radio{{ index.radio }} set wireless.@wifi-iface[-1].network=${ssidConfig.net}
set wireless.wifi{{ index.iface }}.ssid='{{ ssid }}' set wireless.@wifi-iface[-1].mcast_rate=18000
set wireless.wifi{{ index.iface }}.mode=ap ${if (ssidConfig.psk != null)
set wireless.wifi{{ index.iface }}.network={{ ssidconf['net'] }} then ''
{%- if ssidconf.get('psk') %} set wireless.@wifi-iface[-1].encryption=psk2
set wireless.wifi{{ index.iface }}.encryption=psk2 set wireless.@wifi-iface[-1].key='${ssidConfig.psk}'
set wireless.wifi{{ index.iface }}.key='{{ ssidconf['psk'] }}' ''
{%- elif ssidconf.get('wpa-eap') %} else ''
set wireless.wifi{{ index.iface }}.encryption=wpa2 set wireless.@wifi-iface[-1].encryption=none
set wireless.wifi{{ index.iface }}.server='{{ ssidconf['wpa-eap']['server'] }}' delete wireless.@wifi-iface[-1].key
set wireless.wifi{{ index.iface }}.port='{{ ssidconf['wpa-eap']['port'] }}' ''}
set wireless.wifi{{ index.iface }}.auth_secret='{{ ssidconf['wpa-eap']['secret'] }}' ''
{%- else %} ) (builtins.attrNames radioConfig.ssids)}
set wireless.wifi{{ index.iface }}.encryption=none '') (builtins.attrNames hostConfig.wifi))}
delete wireless.wifi{{ index.iface }}.key
{%- endif %}
set wireless.wifi{{ index.iface }}.mcast_rate=18000
{%- set x = index.update({ 'iface': index.iface + 1 }) %} commit
{%- endfor %} __UCI__
{%- set x = index.update({ 'radio': index.radio + 1 }) %}
{%- endfor %}
commit # Cronjob that makes sure WiFi is only visible when server with all
__UCI__ # the gateways is reachable
cat >/etc/crontabs/root <<__CRON__
* * * * * /usr/sbin/wifi-on-link.sh
__CRON__
cat >/usr/sbin/wifi-on-link.sh <<__SH__
#!/bin/sh
# Cronjob that makes sure WiFi is only visible when server with all if (ping -c 1 -W 3 {{ pillar['hosts-inet']['mgmt']['mgmt-gw'] }}) ; then
# the gateways is reachable REACHABLE=y
cat >/etc/crontabs/root <<__CRON__ else
* * * * * /usr/sbin/wifi-on-link.sh REACHABLE=n
__CRON__ fi
cat >/usr/sbin/wifi-on-link.sh <<__SH__
#!/bin/sh
if (ping -c 1 -W 3 {{ pillar['hosts-inet']['mgmt']['mgmt-gw'] }}) ; then if [ "\\\$(cat /sys/class/net/wlan2-pub/operstate)" == "up" ] ; then
REACHABLE=y UP=y
else else
REACHABLE=n UP=n
fi fi
if [ "\\\$(cat /sys/class/net/wlan2-pub/operstate)" == "up" ] ; then {%- if conf.get("error-led") %}
UP=y ERROR_LED=/sys/class/leds/{{ conf["error-led"] }}/brightness
else [ \\\$REACHABLE = y ] && echo 0 > \\\$ERROR_LED
UP=n [ \\\$REACHABLE = n ] && echo 1 > \\\$ERROR_LED
fi {%- endif %}
{%- if conf.get("error-led") %} [ \\\$REACHABLE = y ] && [ \\\$UP = n ] && wifi up
ERROR_LED=/sys/class/leds/{{ conf["error-led"] }}/brightness [ \\\$REACHABLE = n ] && [ \\\$UP = y ] && wifi down
[ \\\$REACHABLE = y ] && echo 0 > \\\$ERROR_LED
[ \\\$REACHABLE = n ] && echo 1 > \\\$ERROR_LED
{%- endif %}
[ \\\$REACHABLE = y ] && [ \\\$UP = n ] && wifi up exit 0
[ \\\$REACHABLE = n ] && [ \\\$UP = y ] && wifi down __SH__
chmod a+rx /usr/sbin/wifi-on-link.sh
/etc/init.d/cron restart
exit 0 for svc in dnsmasq uhttpd ; do
__SH__ rm /etc/rc.d/*\$svc
chmod a+rx /usr/sbin/wifi-on-link.sh /etc/init.d/\$svc stop
/etc/init.d/cron restart done
for svc in dnsmasq uhttpd ; do
rm /etc/rc.d/*\$svc
/etc/init.d/\$svc stop
done
{%- if conf.get('firstboot') %}
reboot
{%- endif %}
__SSH__
echo "Base configuration done \\o/"
echo "Later run: `dirname $0`/ap_install_collectd.sh {{ pillar['hosts-inet']['mgmt'][hostName] }}"
${lib.optionalString hostConfig.firstboot "reboot"}
__SSH__
echo "Base configuration done \\o/"
echo "Later run: `dirname $0`/ap_install_collectd.sh ${config.site.net.mgmt.hosts4.${hostName}}"
'' ''

View File

@ -14,7 +14,7 @@ cpe:
4p+9mAt3NWq5 4p+9mAt3NWq5
=QPF0 =QPF0
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-wr841n-v10 model: tl-wr841-v10
version: release version: release
location: weg location: weg
lan-access: priv6 lan-access: priv6
@ -56,7 +56,7 @@ cpe:
=Tlu+ =Tlu+
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-archer-c7-v2 model: archer-c7-v2
version: release version: release
location: C3D2 Backstage location: C3D2 Backstage
lan-access: c3d2 lan-access: c3d2
@ -263,7 +263,7 @@ cpe:
rxgsW3bwIysHRYkg90GDmW505fNiC96aEA== rxgsW3bwIysHRYkg90GDmW505fNiC96aEA==
=Noqk =Noqk
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-wr841n-v10 model: tl-wr841-v10
version: release version: release
location: Broken flash location: Broken flash
lan-access: pub lan-access: pub
@ -289,7 +289,7 @@ cpe:
rxgsW3bwIysHRYkg90GDmW505fNiC96aEA== rxgsW3bwIysHRYkg90GDmW505fNiC96aEA==
=Noqk =Noqk
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-wr841n-v10 model: tl-wr841-v10
version: release version: release
location: Turm D, 5. Etage location: Turm D, 5. Etage
lan-access: pub lan-access: pub
@ -406,7 +406,7 @@ cpe:
4p+9mAt3NWq5 4p+9mAt3NWq5
=QPF0 =QPF0
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-wr841n-v10 model: tl-wr841-v10
version: release version: release
location: Turm D, 2. Etage location: Turm D, 2. Etage
lan-access: pub lan-access: pub
@ -447,7 +447,7 @@ cpe:
4p+9mAt3NWq5 4p+9mAt3NWq5
=QPF0 =QPF0
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-wr841n-v10 model: tl-wr841-v10
version: release version: release
location: Turm D, 1. Etage location: Turm D, 1. Etage
lan-access: pub lan-access: pub
@ -544,7 +544,7 @@ cpe:
BEELWgTZJzE= BEELWgTZJzE=
=ECvx =ECvx
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-wr841n-v8 model: tl-wr841-v8
version: release version: release
location: Turm D, 4. Etage location: Turm D, 4. Etage
lan-access: pub lan-access: pub
@ -586,57 +586,31 @@ cpe:
=SB6m =SB6m
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
ap13: # ap14:
password: | # password: |
-----BEGIN PGP MESSAGE----- # -----BEGIN PGP MESSAGE-----
hQEMA2PKcvDMvlKLAQf+KrhJQfg2IAJ2SHEL8x0iAAn1ZYJ4kFVGYkmoEbN6iM4O
d2/0f8/2voMHChSTheQ5Y+Vp8op5gzOhROOShfJG1khugiEPhza+4sV0WD8Oa6Vm
FPXTr1HJdF/LZkCAVBvJOgsUC1U1PrSiSeKp3ziZyByKw6Rox6Krw6fkR2miuixs
fV0EW/H9bIVGru7Dtrgw1zq4QopxuFikMp/YWbmX0TEff6ntFCVwrGRN8Iluyaoy
aLon/Wh4DW8KQkw+s0SWxq/lIkCdvXj8TnGY3h1HNSXEfPE4hWGgwGwhLgNcNGPb
MC3IYHbmy/640GGl/tmqSnKZFuCVebMdIQ/j2iLLM9JHAe57w79qwwXIlUZ4/0I8
gaGTRjFyub+6lP9cdR6nd4FuGZanXQAEND/bwIOQtt1+jgcrgaaF3uv3gWO6Mckl
BEELWgTZJzE=
=ECvx
-----END PGP MESSAGE-----
model: dir-615-h1
version: release
location: 'Stolen? (was: Turm C 1. Etage)'
lan-access: pub
radios:
'platform/10180000.wmac':
channel: 1
htmode: HT40+
ssids:
'ZW public':
net: pub
ap14:
password: |
-----BEGIN PGP MESSAGE-----
hQEMA2PKcvDMvlKLAQf/couJwoTRzTEycGB3t2aa4NTjOxKmh/Q7ScvHbxEX1VhX # hQEMA2PKcvDMvlKLAQf/couJwoTRzTEycGB3t2aa4NTjOxKmh/Q7ScvHbxEX1VhX
sg0bW+CXQag+zy00oAbXlK/vOSP+NvOlt7vn8X50kmYTHlcZtelry4tAZeBJyw29 # sg0bW+CXQag+zy00oAbXlK/vOSP+NvOlt7vn8X50kmYTHlcZtelry4tAZeBJyw29
Vb/VvrR6F8nft1q2hpiGzAWgy8rkyncAKwCdLfsdOC/A4/QH5jis9fMnkDLbwUb+ # Vb/VvrR6F8nft1q2hpiGzAWgy8rkyncAKwCdLfsdOC/A4/QH5jis9fMnkDLbwUb+
cruIIe977BlE1jC5s09F7ZSeHUby2lMhcsxuyS+DTsBIc37Qp/Tpeq/sY7wtbrE2 # cruIIe977BlE1jC5s09F7ZSeHUby2lMhcsxuyS+DTsBIc37Qp/Tpeq/sY7wtbrE2
MbP4mZjtBOgUCCtvauONtKjt2Zg92scob8lHm4m77qh6b4rxJ3lEW+oapelHQGId # MbP4mZjtBOgUCCtvauONtKjt2Zg92scob8lHm4m77qh6b4rxJ3lEW+oapelHQGId
ULxd5KM48AqV3AVexmTXNVlU0ppIdPvjxV4WR5VQt9JJAevANNiEBSPbsQwF0QNO # ULxd5KM48AqV3AVexmTXNVlU0ppIdPvjxV4WR5VQt9JJAevANNiEBSPbsQwF0QNO
4M1Fl6WH1WTjVf0WQPMmUowiH0hyJuSx46sju9bEJJCaueJtIhCvUbOeOURwZaVe # 4M1Fl6WH1WTjVf0WQPMmUowiH0hyJuSx46sju9bEJJCaueJtIhCvUbOeOURwZaVe
ZLBzZVhVZJoO9Q== # ZLBzZVhVZJoO9Q==
=bGE5 # =bGE5
-----END PGP MESSAGE----- # -----END PGP MESSAGE-----
model: tl-wr1043nd-v1 # model: tl-wr1043nd-v1
version: release # version: release
location: Auf Halde # location: Auf Halde
lan-access: pub # lan-access: pub
radios: # radios:
'platform/qca955x_wmac': # 'platform/qca955x_wmac':
channel: 1 # channel: 1
htmode: HT40+ # htmode: HT40+
ssids: # ssids:
'ZW public': # 'ZW public':
net: pub # net: pub
ap15: ap15:
password: | password: |
@ -764,7 +738,7 @@ cpe:
ZLBzZVhVZJoO9Q== ZLBzZVhVZJoO9Q==
=bGE5 =bGE5
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-wr841n-v10 model: tl-wr841-v10
version: release version: release
location: Haus B, 2. Etage, zum Innenhof location: Haus B, 2. Etage, zum Innenhof
lan-access: priv9 lan-access: priv9
@ -805,7 +779,7 @@ cpe:
ZLBzZVhVZJoO9Q== ZLBzZVhVZJoO9Q==
=bGE5 =bGE5
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-wr841n-v10 model: tl-wr841-v10
version: release version: release
location: Turm C oberste Etage location: Turm C oberste Etage
lan-access: pub lan-access: pub
@ -1132,7 +1106,7 @@ cpe:
8jprrw== 8jprrw==
=dnNO =dnNO
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-wr841n-v10 model: tl-wr841-v10
version: release version: release
location: "Weg?" location: "Weg?"
lan-access: pub lan-access: pub
@ -1159,7 +1133,7 @@ cpe:
BEELWgTZJzE= BEELWgTZJzE=
=ECvx =ECvx
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-wr841n-v8 model: tl-wr841-v8
version: release version: release
location: Tunnel location: Tunnel
lan-access: pub lan-access: pub
@ -1185,7 +1159,7 @@ cpe:
WQ7tY7Ma5Jry WQ7tY7Ma5Jry
=Yjyd =Yjyd
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-archer-c7-v4 model: archer-c7-v4
version: nightly version: nightly
location: B1.05.07 location: B1.05.07
lan-access: priv13 lan-access: priv13
@ -1519,7 +1493,7 @@ cpe:
ZBOMWyH63lKB+g== ZBOMWyH63lKB+g==
=ugCM =ugCM
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-wr1043nd-v5 model: tl-wr1043n-v5
version: release version: release
location: B 4.08 location: B 4.08
lan-access: priv18 lan-access: priv18
@ -1604,7 +1578,7 @@ cpe:
wtRDs5gZULQ= wtRDs5gZULQ=
=eFFg =eFFg
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-archer-c7-v5 model: archer-c7-v5
version: 18.06.1 version: 18.06.1
location: B3.11.01 location: B3.11.01
lan-access: priv19 lan-access: priv19
@ -1665,7 +1639,7 @@ cpe:
GYuZOJTS2vY= GYuZOJTS2vY=
=Uy9e =Uy9e
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-archer-c7-v4 model: archer-c7-v4
version: 18.06.1 version: 18.06.1
location: ECCE-Raum location: ECCE-Raum
lan-access: pub lan-access: pub
@ -1798,7 +1772,7 @@ cpe:
wtRDs5gZULQ= wtRDs5gZULQ=
=eFFg =eFFg
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-archer-c7-v5 model: archer-c7-v5
version: 18.06.4 version: 18.06.4
location: B4.01 location: B4.01
lan-access: priv22 lan-access: priv22
@ -1860,7 +1834,7 @@ cpe:
S25QWs7T S25QWs7T
=3ci0 =3ci0
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-archer-c7-v5 model: archer-c7-v5
version: 18.06.4 version: 18.06.4
location: B3.01 location: B3.01
lan-access: priv26 lan-access: priv26
@ -1922,7 +1896,7 @@ cpe:
kpwuSSzZvXNK kpwuSSzZvXNK
=JLKE =JLKE
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-archer-c7-v5 model: archer-c7-v5
version: release version: release
location: Dresden School of Lindy Hop location: Dresden School of Lindy Hop
lan-access: priv4 lan-access: priv4
@ -2497,7 +2471,7 @@ cpe:
=Tlu+ =Tlu+
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-archer-c7-v2 model: archer-c7-v2
version: release version: release
location: antrares location: antrares
lan-access: priv17 lan-access: priv17
@ -2622,7 +2596,7 @@ cpe:
4vqWxQ== 4vqWxQ==
=XDXZ =XDXZ
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-wr841n-v10 model: tl-wr841-v10
version: release version: release
location: "B2.05.01" location: "B2.05.01"
lan-access: priv11 lan-access: priv11
@ -2663,7 +2637,7 @@ cpe:
uU8h2Z0= uU8h2Z0=
=pYTp =pYTp
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-archer-c7-v5 model: archer-c7-v5
version: release version: release
location: "B1.05.02" location: "B1.05.02"
lan-access: priv35 lan-access: priv35
@ -2725,7 +2699,7 @@ cpe:
s+n2PQ== s+n2PQ==
=Hv9n =Hv9n
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-archer-c7-v5 model: archer-c7-v5
version: 19.07.7 version: 19.07.7
location: B3.05.03 location: B3.05.03
lan-access: priv6 lan-access: priv6
@ -2787,7 +2761,7 @@ cpe:
s+n2PQ== s+n2PQ==
=Hv9n =Hv9n
-----END PGP MESSAGE----- -----END PGP MESSAGE-----
model: tl-archer-c7-v5 model: archer-c7-v5
version: 19.07.7 version: 19.07.7
location: B4.04.01 location: B4.04.01
lan-access: priv6 lan-access: priv6