aboutsummaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorOle Mathias Aa. Heggem <olemathias.aa.heggem@gmail.com>2019-11-11 22:14:22 +0100
committerOle Mathias Aa. Heggem <olemathias.aa.heggem@gmail.com>2019-11-11 22:14:22 +0100
commitef8122013956d09127c25285fde92b39c4e8af55 (patch)
tree34ce1266ae41d86e9378f481c1afb1e00be9c90c /examples
parent1f190fed23d84fa00559653e868e6be5ff6451aa (diff)
A little TG19 scripts and config
Diffstat (limited to 'examples')
-rw-r--r--examples/tg19/dhcp/config/automatic_zones_fap4.conf109
-rw-r--r--examples/tg19/dhcp/config/automatic_zones_v4.conf2311
-rw-r--r--examples/tg19/dhcp/config/automatic_zones_v6.conf1926
-rw-r--r--examples/tg19/dhcp/config/dhcpd-notify-v4.conf10
-rw-r--r--examples/tg19/dhcp/config/dhcpd-notify-v6.conf9
-rw-r--r--examples/tg19/dhcp/config/dhcpd.conf70
-rw-r--r--examples/tg19/dhcp/config/dhcpd4_pxeboot.conf9
-rw-r--r--examples/tg19/dhcp/config/dhcpd4_revzones.conf528
-rw-r--r--examples/tg19/dhcp/config/dhcpd4_voip.conf18
-rw-r--r--examples/tg19/dhcp/config/dhcpd4_wlc.conf16
-rw-r--r--examples/tg19/dhcp/config/dhcpd6.conf56
-rw-r--r--examples/tg19/dhcp/config/fap4.conf48
-rw-r--r--examples/tg19/dhcp/gondul-lol5
-rw-r--r--examples/tg19/dhcp/templates/dhcpd.conf20
-rw-r--r--examples/tg19/dhcp/templates/dhcpd6.conf17
-rw-r--r--examples/tg19/dhcp/templates/fap_dhcp4.conf14
-rwxr-xr-xexamples/tg19/dhcp/tools/make_dhcp.sh36
-rw-r--r--examples/tg19/dns_auth/cozy/pdns.conf34
-rw-r--r--examples/tg19/dns_auth/huor/pdns.conf34
-rw-r--r--examples/tg19/dns_auth/tools/config.ini20
-rw-r--r--examples/tg19/dns_auth/tools/make_dns_gondul.py81
-rw-r--r--examples/tg19/dns_auth/tools/make_dns_netbox.py20
-rwxr-xr-xexamples/tg19/dns_auth/tools/make_reverse_zones.py76
-rw-r--r--examples/tg19/dns_auth/tools/notify-all.sh3
-rw-r--r--examples/tg19/dns_auth/tools/pdns.py119
-rw-r--r--examples/tg19/gondul-public-dashboard.json2276
-rw-r--r--examples/tg19/netbox_tools/cleanup_switchestxt.py149
-rw-r--r--examples/tg19/netbox_tools/create_switch.py163
-rw-r--r--examples/tg19/netbox_tools/netbox2gondul.py133
-rw-r--r--examples/tg19/netbox_tools/switchestxt2netbox.py478
-rw-r--r--examples/tg19/pxe/README.md1
-rw-r--r--examples/tg19/pxe/http/README.md1
-rw-r--r--examples/tg19/pxe/http/bg.pngbin0 -> 189905 bytes
-rw-r--r--examples/tg19/pxe/http/boot.cfg98
-rw-r--r--examples/tg19/pxe/http/menu.ipxe85
35 files changed, 8973 insertions, 0 deletions
diff --git a/examples/tg19/dhcp/config/automatic_zones_fap4.conf b/examples/tg19/dhcp/config/automatic_zones_fap4.conf
new file mode 100644
index 0000000..31bb690
--- /dev/null
+++ b/examples/tg19/dhcp/config/automatic_zones_fap4.conf
@@ -0,0 +1,109 @@
+# mgmt.r1.ring
+subnet 88.92.2.64 netmask 255.255.255.192 {
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.2.65;
+ pool {
+ range 88.92.2.96 88.92.2.126;
+ allow members of "fap-vendor-class";
+ allow members of "fap-mac";
+ }
+}
+
+# mgmt.s1.floor
+subnet 88.92.0.0 netmask 255.255.255.192 {
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.0.1;
+ pool {
+ range 88.92.0.32 88.92.0.62;
+ allow members of "fap-vendor-class";
+ allow members of "fap-mac";
+ }
+}
+
+# mgmt.s2.floor
+subnet 88.92.0.64 netmask 255.255.255.192 {
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.0.65;
+ pool {
+ range 88.92.0.96 88.92.0.126;
+ allow members of "fap-vendor-class";
+ allow members of "fap-mac";
+ }
+}
+
+# mgmt.s3.floor
+subnet 88.92.0.128 netmask 255.255.255.192 {
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.0.129;
+ pool {
+ range 88.92.0.160 88.92.0.190;
+ allow members of "fap-vendor-class";
+ allow members of "fap-mac";
+ }
+}
+
+# mgmt.s4.floor
+subnet 88.92.0.192 netmask 255.255.255.192 {
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.0.193;
+ pool {
+ range 88.92.0.224 88.92.0.254;
+ allow members of "fap-vendor-class";
+ allow members of "fap-mac";
+ }
+}
+
+# mgmt.s5.floor
+subnet 88.92.1.0 netmask 255.255.255.192 {
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.1.1;
+ pool {
+ range 88.92.1.32 88.92.1.62;
+ allow members of "fap-vendor-class";
+ allow members of "fap-mac";
+ }
+}
+
+# mgmt.s6.floor
+subnet 88.92.1.64 netmask 255.255.255.192 {
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.1.65;
+ pool {
+ range 88.92.1.96 88.92.1.126;
+ allow members of "fap-vendor-class";
+ allow members of "fap-mac";
+ }
+}
+
+# mgmt.s7.floor
+subnet 88.92.1.128 netmask 255.255.255.192 {
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.1.129;
+ pool {
+ range 88.92.1.160 88.92.1.190;
+ allow members of "fap-vendor-class";
+ allow members of "fap-mac";
+ }
+}
+
+# mgmt.s8.floor
+subnet 88.92.1.192 netmask 255.255.255.192 {
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.1.193;
+ pool {
+ range 88.92.1.224 88.92.1.254;
+ allow members of "fap-vendor-class";
+ allow members of "fap-mac";
+ }
+}
+
+# mgmt.s9.floor
+subnet 88.92.2.0 netmask 255.255.255.192 {
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.2.1;
+ pool {
+ range 88.92.2.32 88.92.2.62;
+ allow members of "fap-vendor-class";
+ allow members of "fap-mac";
+ }
+}
diff --git a/examples/tg19/dhcp/config/automatic_zones_v4.conf b/examples/tg19/dhcp/config/automatic_zones_v4.conf
new file mode 100644
index 0000000..c144a42
--- /dev/null
+++ b/examples/tg19/dhcp/config/automatic_zones_v4.conf
@@ -0,0 +1,2311 @@
+# Autogenerated dhcpd.conf from gondul
+
+# ap-mgmt.r1.ring
+subnet 88.92.6.128 netmask 255.255.255.192 {
+ range 88.92.6.130 88.92.6.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.6.129;
+ option domain-name "ap-mgmt.r1.ring.tg19.gathering.org";
+ ddns-domainname "ap-mgmt.r1.ring.tg19.gathering.org";
+}
+
+zone ap-mgmt.r1.ring.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# ap-mgmt.s1.floor
+subnet 88.92.4.64 netmask 255.255.255.192 {
+ range 88.92.4.66 88.92.4.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.4.65;
+ option domain-name "ap-mgmt.s1.floor.tg19.gathering.org";
+ ddns-domainname "ap-mgmt.s1.floor.tg19.gathering.org";
+}
+
+zone ap-mgmt.s1.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# ap-mgmt.s2.floor
+subnet 88.92.4.128 netmask 255.255.255.192 {
+ range 88.92.4.130 88.92.4.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.4.129;
+ option domain-name "ap-mgmt.s2.floor.tg19.gathering.org";
+ ddns-domainname "ap-mgmt.s2.floor.tg19.gathering.org";
+}
+
+zone ap-mgmt.s2.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# ap-mgmt.s3.floor
+subnet 88.92.4.192 netmask 255.255.255.192 {
+ range 88.92.4.194 88.92.4.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.4.193;
+ option domain-name "ap-mgmt.s3.floor.tg19.gathering.org";
+ ddns-domainname "ap-mgmt.s3.floor.tg19.gathering.org";
+}
+
+zone ap-mgmt.s3.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# ap-mgmt.s4.floor
+subnet 88.92.5.0 netmask 255.255.255.192 {
+ range 88.92.5.2 88.92.5.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.5.1;
+ option domain-name "ap-mgmt.s4.floor.tg19.gathering.org";
+ ddns-domainname "ap-mgmt.s4.floor.tg19.gathering.org";
+}
+
+zone ap-mgmt.s4.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# ap-mgmt.s5.floor
+subnet 88.92.5.64 netmask 255.255.255.192 {
+ range 88.92.5.66 88.92.5.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.5.65;
+ option domain-name "ap-mgmt.s5.floor.tg19.gathering.org";
+ ddns-domainname "ap-mgmt.s5.floor.tg19.gathering.org";
+}
+
+zone ap-mgmt.s5.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# ap-mgmt.s6.floor
+subnet 88.92.5.128 netmask 255.255.255.192 {
+ range 88.92.5.130 88.92.5.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.5.129;
+ option domain-name "ap-mgmt.s6.floor.tg19.gathering.org";
+ ddns-domainname "ap-mgmt.s6.floor.tg19.gathering.org";
+}
+
+zone ap-mgmt.s6.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# ap-mgmt.s7.floor
+subnet 88.92.5.192 netmask 255.255.255.192 {
+ range 88.92.5.194 88.92.5.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.5.193;
+ option domain-name "ap-mgmt.s7.floor.tg19.gathering.org";
+ ddns-domainname "ap-mgmt.s7.floor.tg19.gathering.org";
+}
+
+zone ap-mgmt.s7.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# ap-mgmt.s8.floor
+subnet 88.92.6.0 netmask 255.255.255.192 {
+ range 88.92.6.2 88.92.6.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.6.1;
+ option domain-name "ap-mgmt.s8.floor.tg19.gathering.org";
+ ddns-domainname "ap-mgmt.s8.floor.tg19.gathering.org";
+}
+
+zone ap-mgmt.s8.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# ap-mgmt.s9.floor
+subnet 88.92.6.64 netmask 255.255.255.192 {
+ range 88.92.6.66 88.92.6.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.6.65;
+ option domain-name "ap-mgmt.s9.floor.tg19.gathering.org";
+ ddns-domainname "ap-mgmt.s9.floor.tg19.gathering.org";
+}
+
+zone ap-mgmt.s9.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e11-1
+subnet 88.92.82.0 netmask 255.255.255.192 {
+ range 88.92.82.2 88.92.82.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.82.1;
+ option domain-name "e11-1.tg19.gathering.org";
+ ddns-domainname "e11-1.tg19.gathering.org";
+}
+
+zone e11-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e11-2
+subnet 88.92.82.64 netmask 255.255.255.192 {
+ range 88.92.82.66 88.92.82.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.82.65;
+ option domain-name "e11-2.tg19.gathering.org";
+ ddns-domainname "e11-2.tg19.gathering.org";
+}
+
+zone e11-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e11-3
+subnet 88.92.82.128 netmask 255.255.255.192 {
+ range 88.92.82.130 88.92.82.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.82.129;
+ option domain-name "e11-3.tg19.gathering.org";
+ ddns-domainname "e11-3.tg19.gathering.org";
+}
+
+zone e11-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e11-4
+subnet 88.92.82.192 netmask 255.255.255.192 {
+ range 88.92.82.194 88.92.82.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.82.193;
+ option domain-name "e11-4.tg19.gathering.org";
+ ddns-domainname "e11-4.tg19.gathering.org";
+}
+
+zone e11-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e13-1
+subnet 88.92.83.0 netmask 255.255.255.192 {
+ range 88.92.83.2 88.92.83.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.83.1;
+ option domain-name "e13-1.tg19.gathering.org";
+ ddns-domainname "e13-1.tg19.gathering.org";
+}
+
+zone e13-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e13-2
+subnet 88.92.83.64 netmask 255.255.255.192 {
+ range 88.92.83.66 88.92.83.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.83.65;
+ option domain-name "e13-2.tg19.gathering.org";
+ ddns-domainname "e13-2.tg19.gathering.org";
+}
+
+zone e13-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e13-3
+subnet 88.92.83.128 netmask 255.255.255.192 {
+ range 88.92.83.130 88.92.83.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.83.129;
+ option domain-name "e13-3.tg19.gathering.org";
+ ddns-domainname "e13-3.tg19.gathering.org";
+}
+
+zone e13-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e13-4
+subnet 88.92.83.192 netmask 255.255.255.192 {
+ range 88.92.83.194 88.92.83.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.83.193;
+ option domain-name "e13-4.tg19.gathering.org";
+ ddns-domainname "e13-4.tg19.gathering.org";
+}
+
+zone e13-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e15-1
+subnet 88.92.84.0 netmask 255.255.255.192 {
+ range 88.92.84.2 88.92.84.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.84.1;
+ option domain-name "e15-1.tg19.gathering.org";
+ ddns-domainname "e15-1.tg19.gathering.org";
+}
+
+zone e15-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e15-2
+subnet 88.92.84.64 netmask 255.255.255.192 {
+ range 88.92.84.66 88.92.84.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.84.65;
+ option domain-name "e15-2.tg19.gathering.org";
+ ddns-domainname "e15-2.tg19.gathering.org";
+}
+
+zone e15-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e15-3
+subnet 88.92.84.128 netmask 255.255.255.192 {
+ range 88.92.84.130 88.92.84.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.84.129;
+ option domain-name "e15-3.tg19.gathering.org";
+ ddns-domainname "e15-3.tg19.gathering.org";
+}
+
+zone e15-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e15-4
+subnet 88.92.84.192 netmask 255.255.255.192 {
+ range 88.92.84.194 88.92.84.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.84.193;
+ option domain-name "e15-4.tg19.gathering.org";
+ ddns-domainname "e15-4.tg19.gathering.org";
+}
+
+zone e15-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e17-1
+subnet 88.92.85.0 netmask 255.255.255.192 {
+ range 88.92.85.2 88.92.85.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.85.1;
+ option domain-name "e17-1.tg19.gathering.org";
+ ddns-domainname "e17-1.tg19.gathering.org";
+}
+
+zone e17-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e17-2
+subnet 88.92.85.64 netmask 255.255.255.192 {
+ range 88.92.85.66 88.92.85.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.85.65;
+ option domain-name "e17-2.tg19.gathering.org";
+ ddns-domainname "e17-2.tg19.gathering.org";
+}
+
+zone e17-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e17-3
+subnet 88.92.85.128 netmask 255.255.255.192 {
+ range 88.92.85.130 88.92.85.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.85.129;
+ option domain-name "e17-3.tg19.gathering.org";
+ ddns-domainname "e17-3.tg19.gathering.org";
+}
+
+zone e17-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e17-4
+subnet 88.92.85.192 netmask 255.255.255.192 {
+ range 88.92.85.194 88.92.85.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.85.193;
+ option domain-name "e17-4.tg19.gathering.org";
+ ddns-domainname "e17-4.tg19.gathering.org";
+}
+
+zone e17-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e19-1
+subnet 88.92.86.0 netmask 255.255.255.192 {
+ range 88.92.86.2 88.92.86.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.86.1;
+ option domain-name "e19-1.tg19.gathering.org";
+ ddns-domainname "e19-1.tg19.gathering.org";
+}
+
+zone e19-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e19-2
+subnet 88.92.86.64 netmask 255.255.255.192 {
+ range 88.92.86.66 88.92.86.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.86.65;
+ option domain-name "e19-2.tg19.gathering.org";
+ ddns-domainname "e19-2.tg19.gathering.org";
+}
+
+zone e19-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e19-3
+subnet 88.92.86.128 netmask 255.255.255.192 {
+ range 88.92.86.130 88.92.86.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.86.129;
+ option domain-name "e19-3.tg19.gathering.org";
+ ddns-domainname "e19-3.tg19.gathering.org";
+}
+
+zone e19-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e19-4
+subnet 88.92.86.192 netmask 255.255.255.192 {
+ range 88.92.86.194 88.92.86.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.86.193;
+ option domain-name "e19-4.tg19.gathering.org";
+ ddns-domainname "e19-4.tg19.gathering.org";
+}
+
+zone e19-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e21-1
+subnet 88.92.87.0 netmask 255.255.255.192 {
+ range 88.92.87.2 88.92.87.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.87.1;
+ option domain-name "e21-1.tg19.gathering.org";
+ ddns-domainname "e21-1.tg19.gathering.org";
+}
+
+zone e21-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e21-2
+subnet 88.92.87.64 netmask 255.255.255.192 {
+ range 88.92.87.66 88.92.87.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.87.65;
+ option domain-name "e21-2.tg19.gathering.org";
+ ddns-domainname "e21-2.tg19.gathering.org";
+}
+
+zone e21-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e21-3
+subnet 88.92.87.128 netmask 255.255.255.192 {
+ range 88.92.87.130 88.92.87.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.87.129;
+ option domain-name "e21-3.tg19.gathering.org";
+ ddns-domainname "e21-3.tg19.gathering.org";
+}
+
+zone e21-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e21-4
+subnet 88.92.87.192 netmask 255.255.255.192 {
+ range 88.92.87.194 88.92.87.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.87.193;
+ option domain-name "e21-4.tg19.gathering.org";
+ ddns-domainname "e21-4.tg19.gathering.org";
+}
+
+zone e21-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e23-1
+subnet 88.92.88.0 netmask 255.255.255.192 {
+ range 88.92.88.2 88.92.88.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.88.1;
+ option domain-name "e23-1.tg19.gathering.org";
+ ddns-domainname "e23-1.tg19.gathering.org";
+}
+
+zone e23-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e23-2
+subnet 88.92.88.64 netmask 255.255.255.192 {
+ range 88.92.88.66 88.92.88.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.88.65;
+ option domain-name "e23-2.tg19.gathering.org";
+ ddns-domainname "e23-2.tg19.gathering.org";
+}
+
+zone e23-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e23-3
+subnet 88.92.88.128 netmask 255.255.255.192 {
+ range 88.92.88.130 88.92.88.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.88.129;
+ option domain-name "e23-3.tg19.gathering.org";
+ ddns-domainname "e23-3.tg19.gathering.org";
+}
+
+zone e23-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e23-4
+subnet 88.92.88.192 netmask 255.255.255.192 {
+ range 88.92.88.194 88.92.88.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.88.193;
+ option domain-name "e23-4.tg19.gathering.org";
+ ddns-domainname "e23-4.tg19.gathering.org";
+}
+
+zone e23-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e25-2
+subnet 88.92.89.0 netmask 255.255.255.192 {
+ range 88.92.89.2 88.92.89.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.89.1;
+ option domain-name "e25-2.tg19.gathering.org";
+ ddns-domainname "e25-2.tg19.gathering.org";
+}
+
+zone e25-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e27-2
+subnet 88.92.89.64 netmask 255.255.255.192 {
+ range 88.92.89.66 88.92.89.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.89.65;
+ option domain-name "e27-2.tg19.gathering.org";
+ ddns-domainname "e27-2.tg19.gathering.org";
+}
+
+zone e27-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e29-2
+subnet 88.92.89.128 netmask 255.255.255.192 {
+ range 88.92.89.130 88.92.89.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.89.129;
+ option domain-name "e29-2.tg19.gathering.org";
+ ddns-domainname "e29-2.tg19.gathering.org";
+}
+
+zone e29-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e31-2
+subnet 88.92.89.192 netmask 255.255.255.192 {
+ range 88.92.89.194 88.92.89.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.89.193;
+ option domain-name "e31-2.tg19.gathering.org";
+ ddns-domainname "e31-2.tg19.gathering.org";
+}
+
+zone e31-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e33-2
+subnet 88.92.90.0 netmask 255.255.255.192 {
+ range 88.92.90.2 88.92.90.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.90.1;
+ option domain-name "e33-2.tg19.gathering.org";
+ ddns-domainname "e33-2.tg19.gathering.org";
+}
+
+zone e33-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e35-2
+subnet 88.92.90.64 netmask 255.255.255.192 {
+ range 88.92.90.66 88.92.90.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.90.65;
+ option domain-name "e35-2.tg19.gathering.org";
+ ddns-domainname "e35-2.tg19.gathering.org";
+}
+
+zone e35-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e37-2
+subnet 88.92.90.128 netmask 255.255.255.192 {
+ range 88.92.90.130 88.92.90.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.90.129;
+ option domain-name "e37-2.tg19.gathering.org";
+ ddns-domainname "e37-2.tg19.gathering.org";
+}
+
+zone e37-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e39-2
+subnet 88.92.90.192 netmask 255.255.255.192 {
+ range 88.92.90.194 88.92.90.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.90.193;
+ option domain-name "e39-2.tg19.gathering.org";
+ ddns-domainname "e39-2.tg19.gathering.org";
+}
+
+zone e39-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e41-1
+subnet 88.92.91.0 netmask 255.255.255.192 {
+ range 88.92.91.2 88.92.91.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.91.1;
+ option domain-name "e41-1.tg19.gathering.org";
+ ddns-domainname "e41-1.tg19.gathering.org";
+}
+
+zone e41-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e41-2
+subnet 88.92.91.64 netmask 255.255.255.192 {
+ range 88.92.91.66 88.92.91.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.91.65;
+ option domain-name "e41-2.tg19.gathering.org";
+ ddns-domainname "e41-2.tg19.gathering.org";
+}
+
+zone e41-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e41-3
+subnet 88.92.91.128 netmask 255.255.255.192 {
+ range 88.92.91.130 88.92.91.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.91.129;
+ option domain-name "e41-3.tg19.gathering.org";
+ ddns-domainname "e41-3.tg19.gathering.org";
+}
+
+zone e41-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e41-4
+subnet 88.92.91.192 netmask 255.255.255.192 {
+ range 88.92.91.194 88.92.91.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.91.193;
+ option domain-name "e41-4.tg19.gathering.org";
+ ddns-domainname "e41-4.tg19.gathering.org";
+}
+
+zone e41-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e43-1
+subnet 88.92.92.0 netmask 255.255.255.192 {
+ range 88.92.92.2 88.92.92.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.92.1;
+ option domain-name "e43-1.tg19.gathering.org";
+ ddns-domainname "e43-1.tg19.gathering.org";
+}
+
+zone e43-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e43-2
+subnet 88.92.92.64 netmask 255.255.255.192 {
+ range 88.92.92.66 88.92.92.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.92.65;
+ option domain-name "e43-2.tg19.gathering.org";
+ ddns-domainname "e43-2.tg19.gathering.org";
+}
+
+zone e43-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e43-3
+subnet 88.92.92.128 netmask 255.255.255.192 {
+ range 88.92.92.130 88.92.92.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.92.129;
+ option domain-name "e43-3.tg19.gathering.org";
+ ddns-domainname "e43-3.tg19.gathering.org";
+}
+
+zone e43-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e43-4
+subnet 88.92.92.192 netmask 255.255.255.192 {
+ range 88.92.92.194 88.92.92.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.92.193;
+ option domain-name "e43-4.tg19.gathering.org";
+ ddns-domainname "e43-4.tg19.gathering.org";
+}
+
+zone e43-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e45-1
+subnet 88.92.93.0 netmask 255.255.255.192 {
+ range 88.92.93.2 88.92.93.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.93.1;
+ option domain-name "e45-1.tg19.gathering.org";
+ ddns-domainname "e45-1.tg19.gathering.org";
+}
+
+zone e45-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e45-2
+subnet 88.92.93.64 netmask 255.255.255.192 {
+ range 88.92.93.66 88.92.93.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.93.65;
+ option domain-name "e45-2.tg19.gathering.org";
+ ddns-domainname "e45-2.tg19.gathering.org";
+}
+
+zone e45-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e45-3
+subnet 88.92.93.128 netmask 255.255.255.192 {
+ range 88.92.93.130 88.92.93.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.93.129;
+ option domain-name "e45-3.tg19.gathering.org";
+ ddns-domainname "e45-3.tg19.gathering.org";
+}
+
+zone e45-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e45-4
+subnet 88.92.93.192 netmask 255.255.255.192 {
+ range 88.92.93.194 88.92.93.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.93.193;
+ option domain-name "e45-4.tg19.gathering.org";
+ ddns-domainname "e45-4.tg19.gathering.org";
+}
+
+zone e45-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e47-1
+subnet 88.92.94.0 netmask 255.255.255.192 {
+ range 88.92.94.2 88.92.94.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.94.1;
+ option domain-name "e47-1.tg19.gathering.org";
+ ddns-domainname "e47-1.tg19.gathering.org";
+}
+
+zone e47-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e47-2
+subnet 88.92.94.64 netmask 255.255.255.192 {
+ range 88.92.94.66 88.92.94.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.94.65;
+ option domain-name "e47-2.tg19.gathering.org";
+ ddns-domainname "e47-2.tg19.gathering.org";
+}
+
+zone e47-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e47-3
+subnet 88.92.94.128 netmask 255.255.255.192 {
+ range 88.92.94.130 88.92.94.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.94.129;
+ option domain-name "e47-3.tg19.gathering.org";
+ ddns-domainname "e47-3.tg19.gathering.org";
+}
+
+zone e47-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e47-4
+subnet 88.92.94.192 netmask 255.255.255.192 {
+ range 88.92.94.194 88.92.94.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.94.193;
+ option domain-name "e47-4.tg19.gathering.org";
+ ddns-domainname "e47-4.tg19.gathering.org";
+}
+
+zone e47-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e49-1
+subnet 88.92.95.0 netmask 255.255.255.192 {
+ range 88.92.95.2 88.92.95.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.95.1;
+ option domain-name "e49-1.tg19.gathering.org";
+ ddns-domainname "e49-1.tg19.gathering.org";
+}
+
+zone e49-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e49-2
+subnet 88.92.95.64 netmask 255.255.255.192 {
+ range 88.92.95.66 88.92.95.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.95.65;
+ option domain-name "e49-2.tg19.gathering.org";
+ ddns-domainname "e49-2.tg19.gathering.org";
+}
+
+zone e49-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e49-3
+subnet 88.92.95.128 netmask 255.255.255.192 {
+ range 88.92.95.130 88.92.95.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.95.129;
+ option domain-name "e49-3.tg19.gathering.org";
+ ddns-domainname "e49-3.tg19.gathering.org";
+}
+
+zone e49-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e49-4
+subnet 88.92.95.192 netmask 255.255.255.192 {
+ range 88.92.95.194 88.92.95.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.95.193;
+ option domain-name "e49-4.tg19.gathering.org";
+ ddns-domainname "e49-4.tg19.gathering.org";
+}
+
+zone e49-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e51-1
+subnet 88.92.96.0 netmask 255.255.255.192 {
+ range 88.92.96.2 88.92.96.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.96.1;
+ option domain-name "e51-1.tg19.gathering.org";
+ ddns-domainname "e51-1.tg19.gathering.org";
+}
+
+zone e51-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e51-2
+subnet 88.92.96.64 netmask 255.255.255.192 {
+ range 88.92.96.66 88.92.96.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.96.65;
+ option domain-name "e51-2.tg19.gathering.org";
+ ddns-domainname "e51-2.tg19.gathering.org";
+}
+
+zone e51-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e51-3
+subnet 88.92.96.128 netmask 255.255.255.192 {
+ range 88.92.96.130 88.92.96.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.96.129;
+ option domain-name "e51-3.tg19.gathering.org";
+ ddns-domainname "e51-3.tg19.gathering.org";
+}
+
+zone e51-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e51-4
+subnet 88.92.96.192 netmask 255.255.255.192 {
+ range 88.92.96.194 88.92.96.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.96.193;
+ option domain-name "e51-4.tg19.gathering.org";
+ ddns-domainname "e51-4.tg19.gathering.org";
+}
+
+zone e51-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e53-1
+subnet 88.92.97.0 netmask 255.255.255.192 {
+ range 88.92.97.2 88.92.97.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.97.1;
+ option domain-name "e53-1.tg19.gathering.org";
+ ddns-domainname "e53-1.tg19.gathering.org";
+}
+
+zone e53-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e53-2
+subnet 88.92.97.64 netmask 255.255.255.192 {
+ range 88.92.97.66 88.92.97.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.97.65;
+ option domain-name "e53-2.tg19.gathering.org";
+ ddns-domainname "e53-2.tg19.gathering.org";
+}
+
+zone e53-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e53-3
+subnet 88.92.97.128 netmask 255.255.255.192 {
+ range 88.92.97.130 88.92.97.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.97.129;
+ option domain-name "e53-3.tg19.gathering.org";
+ ddns-domainname "e53-3.tg19.gathering.org";
+}
+
+zone e53-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e53-4
+subnet 88.92.97.192 netmask 255.255.255.192 {
+ range 88.92.97.194 88.92.97.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.97.193;
+ option domain-name "e53-4.tg19.gathering.org";
+ ddns-domainname "e53-4.tg19.gathering.org";
+}
+
+zone e53-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e55-1
+subnet 88.92.98.0 netmask 255.255.255.192 {
+ range 88.92.98.2 88.92.98.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.98.1;
+ option domain-name "e55-1.tg19.gathering.org";
+ ddns-domainname "e55-1.tg19.gathering.org";
+}
+
+zone e55-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e55-2
+subnet 88.92.98.64 netmask 255.255.255.192 {
+ range 88.92.98.66 88.92.98.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.98.65;
+ option domain-name "e55-2.tg19.gathering.org";
+ ddns-domainname "e55-2.tg19.gathering.org";
+}
+
+zone e55-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e55-3
+subnet 88.92.98.128 netmask 255.255.255.192 {
+ range 88.92.98.130 88.92.98.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.98.129;
+ option domain-name "e55-3.tg19.gathering.org";
+ ddns-domainname "e55-3.tg19.gathering.org";
+}
+
+zone e55-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e55-4
+subnet 88.92.98.192 netmask 255.255.255.192 {
+ range 88.92.98.194 88.92.98.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.98.193;
+ option domain-name "e55-4.tg19.gathering.org";
+ ddns-domainname "e55-4.tg19.gathering.org";
+}
+
+zone e55-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e57-1
+subnet 88.92.99.0 netmask 255.255.255.192 {
+ range 88.92.99.2 88.92.99.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.99.1;
+ option domain-name "e57-1.tg19.gathering.org";
+ ddns-domainname "e57-1.tg19.gathering.org";
+}
+
+zone e57-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e57-2
+subnet 88.92.99.64 netmask 255.255.255.192 {
+ range 88.92.99.66 88.92.99.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.99.65;
+ option domain-name "e57-2.tg19.gathering.org";
+ ddns-domainname "e57-2.tg19.gathering.org";
+}
+
+zone e57-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e57-3
+subnet 88.92.99.128 netmask 255.255.255.192 {
+ range 88.92.99.130 88.92.99.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.99.129;
+ option domain-name "e57-3.tg19.gathering.org";
+ ddns-domainname "e57-3.tg19.gathering.org";
+}
+
+zone e57-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e57-4
+subnet 88.92.99.192 netmask 255.255.255.192 {
+ range 88.92.99.194 88.92.99.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.99.193;
+ option domain-name "e57-4.tg19.gathering.org";
+ ddns-domainname "e57-4.tg19.gathering.org";
+}
+
+zone e57-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e59-1
+subnet 88.92.100.0 netmask 255.255.255.192 {
+ range 88.92.100.2 88.92.100.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.100.1;
+ option domain-name "e59-1.tg19.gathering.org";
+ ddns-domainname "e59-1.tg19.gathering.org";
+}
+
+zone e59-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e59-2
+subnet 88.92.100.64 netmask 255.255.255.192 {
+ range 88.92.100.66 88.92.100.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.100.65;
+ option domain-name "e59-2.tg19.gathering.org";
+ ddns-domainname "e59-2.tg19.gathering.org";
+}
+
+zone e59-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e59-3
+subnet 88.92.100.128 netmask 255.255.255.192 {
+ range 88.92.100.130 88.92.100.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.100.129;
+ option domain-name "e59-3.tg19.gathering.org";
+ ddns-domainname "e59-3.tg19.gathering.org";
+}
+
+zone e59-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e59-4
+subnet 88.92.100.192 netmask 255.255.255.192 {
+ range 88.92.100.194 88.92.100.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.100.193;
+ option domain-name "e59-4.tg19.gathering.org";
+ ddns-domainname "e59-4.tg19.gathering.org";
+}
+
+zone e59-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e61-1
+subnet 88.92.101.0 netmask 255.255.255.192 {
+ range 88.92.101.2 88.92.101.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.101.1;
+ option domain-name "e61-1.tg19.gathering.org";
+ ddns-domainname "e61-1.tg19.gathering.org";
+}
+
+zone e61-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e61-2
+subnet 88.92.101.64 netmask 255.255.255.192 {
+ range 88.92.101.66 88.92.101.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.101.65;
+ option domain-name "e61-2.tg19.gathering.org";
+ ddns-domainname "e61-2.tg19.gathering.org";
+}
+
+zone e61-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e61-3
+subnet 88.92.101.128 netmask 255.255.255.192 {
+ range 88.92.101.130 88.92.101.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.101.129;
+ option domain-name "e61-3.tg19.gathering.org";
+ ddns-domainname "e61-3.tg19.gathering.org";
+}
+
+zone e61-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e61-4
+subnet 88.92.101.192 netmask 255.255.255.192 {
+ range 88.92.101.194 88.92.101.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.101.193;
+ option domain-name "e61-4.tg19.gathering.org";
+ ddns-domainname "e61-4.tg19.gathering.org";
+}
+
+zone e61-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e63-1
+subnet 88.92.102.0 netmask 255.255.255.192 {
+ range 88.92.102.2 88.92.102.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.102.1;
+ option domain-name "e63-1.tg19.gathering.org";
+ ddns-domainname "e63-1.tg19.gathering.org";
+}
+
+zone e63-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e63-2
+subnet 88.92.102.64 netmask 255.255.255.192 {
+ range 88.92.102.66 88.92.102.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.102.65;
+ option domain-name "e63-2.tg19.gathering.org";
+ ddns-domainname "e63-2.tg19.gathering.org";
+}
+
+zone e63-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e63-3
+subnet 88.92.102.128 netmask 255.255.255.192 {
+ range 88.92.102.130 88.92.102.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.102.129;
+ option domain-name "e63-3.tg19.gathering.org";
+ ddns-domainname "e63-3.tg19.gathering.org";
+}
+
+zone e63-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e63-4
+subnet 88.92.102.192 netmask 255.255.255.192 {
+ range 88.92.102.194 88.92.102.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.102.193;
+ option domain-name "e63-4.tg19.gathering.org";
+ ddns-domainname "e63-4.tg19.gathering.org";
+}
+
+zone e63-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e65-1
+subnet 88.92.103.0 netmask 255.255.255.192 {
+ range 88.92.103.2 88.92.103.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.103.1;
+ option domain-name "e65-1.tg19.gathering.org";
+ ddns-domainname "e65-1.tg19.gathering.org";
+}
+
+zone e65-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e65-2
+subnet 88.92.103.64 netmask 255.255.255.192 {
+ range 88.92.103.66 88.92.103.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.103.65;
+ option domain-name "e65-2.tg19.gathering.org";
+ ddns-domainname "e65-2.tg19.gathering.org";
+}
+
+zone e65-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e65-3
+subnet 88.92.103.128 netmask 255.255.255.192 {
+ range 88.92.103.130 88.92.103.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.103.129;
+ option domain-name "e65-3.tg19.gathering.org";
+ ddns-domainname "e65-3.tg19.gathering.org";
+}
+
+zone e65-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e65-4
+subnet 88.92.103.192 netmask 255.255.255.192 {
+ range 88.92.103.194 88.92.103.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.103.193;
+ option domain-name "e65-4.tg19.gathering.org";
+ ddns-domainname "e65-4.tg19.gathering.org";
+}
+
+zone e65-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e67-1
+subnet 88.92.104.0 netmask 255.255.255.192 {
+ range 88.92.104.2 88.92.104.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.104.1;
+ option domain-name "e67-1.tg19.gathering.org";
+ ddns-domainname "e67-1.tg19.gathering.org";
+}
+
+zone e67-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e67-2
+subnet 88.92.104.64 netmask 255.255.255.192 {
+ range 88.92.104.66 88.92.104.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.104.65;
+ option domain-name "e67-2.tg19.gathering.org";
+ ddns-domainname "e67-2.tg19.gathering.org";
+}
+
+zone e67-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e67-3
+subnet 88.92.104.128 netmask 255.255.255.192 {
+ range 88.92.104.130 88.92.104.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.104.129;
+ option domain-name "e67-3.tg19.gathering.org";
+ ddns-domainname "e67-3.tg19.gathering.org";
+}
+
+zone e67-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e67-4
+subnet 88.92.104.192 netmask 255.255.255.192 {
+ range 88.92.104.194 88.92.104.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.104.193;
+ option domain-name "e67-4.tg19.gathering.org";
+ ddns-domainname "e67-4.tg19.gathering.org";
+}
+
+zone e67-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e69-1
+subnet 88.92.105.0 netmask 255.255.255.192 {
+ range 88.92.105.2 88.92.105.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.105.1;
+ option domain-name "e69-1.tg19.gathering.org";
+ ddns-domainname "e69-1.tg19.gathering.org";
+}
+
+zone e69-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e69-2
+subnet 88.92.105.64 netmask 255.255.255.192 {
+ range 88.92.105.66 88.92.105.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.105.65;
+ option domain-name "e69-2.tg19.gathering.org";
+ ddns-domainname "e69-2.tg19.gathering.org";
+}
+
+zone e69-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e69-3
+subnet 88.92.105.128 netmask 255.255.255.192 {
+ range 88.92.105.130 88.92.105.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.105.129;
+ option domain-name "e69-3.tg19.gathering.org";
+ ddns-domainname "e69-3.tg19.gathering.org";
+}
+
+zone e69-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e69-4
+subnet 88.92.105.192 netmask 255.255.255.192 {
+ range 88.92.105.194 88.92.105.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.105.193;
+ option domain-name "e69-4.tg19.gathering.org";
+ ddns-domainname "e69-4.tg19.gathering.org";
+}
+
+zone e69-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e7-1
+subnet 88.92.80.0 netmask 255.255.255.192 {
+ range 88.92.80.2 88.92.80.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.80.1;
+ option domain-name "e7-1.tg19.gathering.org";
+ ddns-domainname "e7-1.tg19.gathering.org";
+}
+
+zone e7-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e7-2
+subnet 88.92.80.64 netmask 255.255.255.192 {
+ range 88.92.80.66 88.92.80.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.80.65;
+ option domain-name "e7-2.tg19.gathering.org";
+ ddns-domainname "e7-2.tg19.gathering.org";
+}
+
+zone e7-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e7-3
+subnet 88.92.80.128 netmask 255.255.255.192 {
+ range 88.92.80.130 88.92.80.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.80.129;
+ option domain-name "e7-3.tg19.gathering.org";
+ ddns-domainname "e7-3.tg19.gathering.org";
+}
+
+zone e7-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e7-4
+subnet 88.92.80.192 netmask 255.255.255.192 {
+ range 88.92.80.194 88.92.80.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.80.193;
+ option domain-name "e7-4.tg19.gathering.org";
+ ddns-domainname "e7-4.tg19.gathering.org";
+}
+
+zone e7-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e71-1
+subnet 88.92.106.0 netmask 255.255.255.192 {
+ range 88.92.106.2 88.92.106.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.106.1;
+ option domain-name "e71-1.tg19.gathering.org";
+ ddns-domainname "e71-1.tg19.gathering.org";
+}
+
+zone e71-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e71-2
+subnet 88.92.106.64 netmask 255.255.255.192 {
+ range 88.92.106.66 88.92.106.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.106.65;
+ option domain-name "e71-2.tg19.gathering.org";
+ ddns-domainname "e71-2.tg19.gathering.org";
+}
+
+zone e71-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e71-3
+subnet 88.92.106.128 netmask 255.255.255.192 {
+ range 88.92.106.130 88.92.106.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.106.129;
+ option domain-name "e71-3.tg19.gathering.org";
+ ddns-domainname "e71-3.tg19.gathering.org";
+}
+
+zone e71-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e71-4
+subnet 88.92.106.192 netmask 255.255.255.192 {
+ range 88.92.106.194 88.92.106.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.106.193;
+ option domain-name "e71-4.tg19.gathering.org";
+ ddns-domainname "e71-4.tg19.gathering.org";
+}
+
+zone e71-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e73-1
+subnet 88.92.107.0 netmask 255.255.255.192 {
+ range 88.92.107.2 88.92.107.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.107.1;
+ option domain-name "e73-1.tg19.gathering.org";
+ ddns-domainname "e73-1.tg19.gathering.org";
+}
+
+zone e73-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e73-2
+subnet 88.92.107.64 netmask 255.255.255.192 {
+ range 88.92.107.66 88.92.107.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.107.65;
+ option domain-name "e73-2.tg19.gathering.org";
+ ddns-domainname "e73-2.tg19.gathering.org";
+}
+
+zone e73-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e73-3
+subnet 88.92.107.128 netmask 255.255.255.192 {
+ range 88.92.107.130 88.92.107.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.107.129;
+ option domain-name "e73-3.tg19.gathering.org";
+ ddns-domainname "e73-3.tg19.gathering.org";
+}
+
+zone e73-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e73-4
+subnet 88.92.107.192 netmask 255.255.255.192 {
+ range 88.92.107.194 88.92.107.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.107.193;
+ option domain-name "e73-4.tg19.gathering.org";
+ ddns-domainname "e73-4.tg19.gathering.org";
+}
+
+zone e73-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e75-1
+subnet 88.92.108.0 netmask 255.255.255.192 {
+ range 88.92.108.2 88.92.108.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.108.1;
+ option domain-name "e75-1.tg19.gathering.org";
+ ddns-domainname "e75-1.tg19.gathering.org";
+}
+
+zone e75-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e75-2
+subnet 88.92.108.64 netmask 255.255.255.192 {
+ range 88.92.108.66 88.92.108.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.108.65;
+ option domain-name "e75-2.tg19.gathering.org";
+ ddns-domainname "e75-2.tg19.gathering.org";
+}
+
+zone e75-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e75-3
+subnet 88.92.108.128 netmask 255.255.255.192 {
+ range 88.92.108.130 88.92.108.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.108.129;
+ option domain-name "e75-3.tg19.gathering.org";
+ ddns-domainname "e75-3.tg19.gathering.org";
+}
+
+zone e75-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e75-4
+subnet 88.92.108.192 netmask 255.255.255.192 {
+ range 88.92.108.194 88.92.108.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.108.193;
+ option domain-name "e75-4.tg19.gathering.org";
+ ddns-domainname "e75-4.tg19.gathering.org";
+}
+
+zone e75-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e77-1
+subnet 88.92.109.0 netmask 255.255.255.192 {
+ range 88.92.109.2 88.92.109.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.109.1;
+ option domain-name "e77-1.tg19.gathering.org";
+ ddns-domainname "e77-1.tg19.gathering.org";
+}
+
+zone e77-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e77-3
+subnet 88.92.109.64 netmask 255.255.255.192 {
+ range 88.92.109.66 88.92.109.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.109.65;
+ option domain-name "e77-3.tg19.gathering.org";
+ ddns-domainname "e77-3.tg19.gathering.org";
+}
+
+zone e77-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e77-4
+subnet 88.92.109.128 netmask 255.255.255.192 {
+ range 88.92.109.130 88.92.109.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.109.129;
+ option domain-name "e77-4.tg19.gathering.org";
+ ddns-domainname "e77-4.tg19.gathering.org";
+}
+
+zone e77-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e79-1
+subnet 88.92.109.192 netmask 255.255.255.192 {
+ range 88.92.109.194 88.92.109.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.109.193;
+ option domain-name "e79-1.tg19.gathering.org";
+ ddns-domainname "e79-1.tg19.gathering.org";
+}
+
+zone e79-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e79-3
+subnet 88.92.110.0 netmask 255.255.255.192 {
+ range 88.92.110.2 88.92.110.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.110.1;
+ option domain-name "e79-3.tg19.gathering.org";
+ ddns-domainname "e79-3.tg19.gathering.org";
+}
+
+zone e79-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e79-4
+subnet 88.92.110.64 netmask 255.255.255.192 {
+ range 88.92.110.66 88.92.110.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.110.65;
+ option domain-name "e79-4.tg19.gathering.org";
+ ddns-domainname "e79-4.tg19.gathering.org";
+}
+
+zone e79-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e81-1
+subnet 88.92.110.128 netmask 255.255.255.192 {
+ range 88.92.110.130 88.92.110.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.110.129;
+ option domain-name "e81-1.tg19.gathering.org";
+ ddns-domainname "e81-1.tg19.gathering.org";
+}
+
+zone e81-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e81-3
+subnet 88.92.110.192 netmask 255.255.255.192 {
+ range 88.92.110.194 88.92.110.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.110.193;
+ option domain-name "e81-3.tg19.gathering.org";
+ ddns-domainname "e81-3.tg19.gathering.org";
+}
+
+zone e81-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e81-4
+subnet 88.92.111.0 netmask 255.255.255.192 {
+ range 88.92.111.2 88.92.111.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.111.1;
+ option domain-name "e81-4.tg19.gathering.org";
+ ddns-domainname "e81-4.tg19.gathering.org";
+}
+
+zone e81-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e9-1
+subnet 88.92.81.0 netmask 255.255.255.192 {
+ range 88.92.81.2 88.92.81.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.81.1;
+ option domain-name "e9-1.tg19.gathering.org";
+ ddns-domainname "e9-1.tg19.gathering.org";
+}
+
+zone e9-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e9-2
+subnet 88.92.81.64 netmask 255.255.255.192 {
+ range 88.92.81.66 88.92.81.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.81.65;
+ option domain-name "e9-2.tg19.gathering.org";
+ ddns-domainname "e9-2.tg19.gathering.org";
+}
+
+zone e9-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e9-3
+subnet 88.92.81.128 netmask 255.255.255.192 {
+ range 88.92.81.130 88.92.81.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.81.129;
+ option domain-name "e9-3.tg19.gathering.org";
+ ddns-domainname "e9-3.tg19.gathering.org";
+}
+
+zone e9-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e9-4
+subnet 88.92.81.192 netmask 255.255.255.192 {
+ range 88.92.81.194 88.92.81.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.81.193;
+ option domain-name "e9-4.tg19.gathering.org";
+ ddns-domainname "e9-4.tg19.gathering.org";
+}
+
+zone e9-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# Event-Intern
+subnet 88.92.12.192 netmask 255.255.255.192 {
+ range 88.92.12.194 88.92.12.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.12.193;
+ option domain-name "Event-Intern.tg19.gathering.org";
+ ddns-domainname "Event-Intern.tg19.gathering.org";
+}
+
+zone Event-Intern.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# noc-wifi
+subnet 185.110.150.128 netmask 255.255.255.128 {
+ range 185.110.150.130 185.110.150.254;
+ option subnet-mask 255.255.255.128;
+ option routers 185.110.150.129;
+ option domain-name "noc-wifi.tg19.gathering.org";
+ ddns-domainname "noc-wifi.tg19.gathering.org";
+}
+
+zone noc-wifi.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.auditorium
+subnet 88.92.11.128 netmask 255.255.255.192 {
+ range 88.92.11.130 88.92.11.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.11.129;
+ option domain-name "s1.auditorium.tg19.gathering.org";
+ ddns-domainname "s1.auditorium.tg19.gathering.org";
+}
+
+zone s1.auditorium.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.boh
+subnet 88.92.12.64 netmask 255.255.255.192 {
+ range 88.92.12.66 88.92.12.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.12.65;
+ option domain-name "s1.boh.tg19.gathering.org";
+ ddns-domainname "s1.boh.tg19.gathering.org";
+}
+
+zone s1.boh.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.cna
+subnet 88.92.8.192 netmask 255.255.255.192 {
+ range 88.92.8.194 88.92.8.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.8.193;
+ option domain-name "s1.cna.tg19.gathering.org";
+ ddns-domainname "s1.cna.tg19.gathering.org";
+}
+
+zone s1.cna.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.elkjop
+subnet 88.92.111.64 netmask 255.255.255.192 {
+ range 88.92.111.66 88.92.111.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.111.65;
+ option domain-name "s1.elkjop.tg19.gathering.org";
+ ddns-domainname "s1.elkjop.tg19.gathering.org";
+}
+
+zone s1.elkjop.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.event
+subnet 88.92.9.0 netmask 255.255.255.192 {
+ range 88.92.9.2 88.92.9.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.9.1;
+ option domain-name "s1.event.tg19.gathering.org";
+ ddns-domainname "s1.event.tg19.gathering.org";
+}
+
+zone s1.event.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.event-ob
+subnet 88.92.13.192 netmask 255.255.255.192 {
+ range 88.92.13.194 88.92.13.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.13.193;
+ option domain-name "s1.event-ob.tg19.gathering.org";
+ ddns-domainname "s1.event-ob.tg19.gathering.org";
+}
+
+zone s1.event-ob.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.foh
+subnet 88.92.13.0 netmask 255.255.255.192 {
+ range 88.92.13.2 88.92.13.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.13.1;
+ option domain-name "s1.foh.tg19.gathering.org";
+ ddns-domainname "s1.foh.tg19.gathering.org";
+}
+
+zone s1.foh.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.fugleberget
+subnet 88.92.10.64 netmask 255.255.255.192 {
+ range 88.92.10.66 88.92.10.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.10.65;
+ option domain-name "s1.fugleberget.tg19.gathering.org";
+ ddns-domainname "s1.fugleberget.tg19.gathering.org";
+}
+
+zone s1.fugleberget.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.infodesk
+subnet 88.92.111.128 netmask 255.255.255.192 {
+ range 88.92.111.130 88.92.111.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.111.129;
+ option domain-name "s1.infodesk.tg19.gathering.org";
+ ddns-domainname "s1.infodesk.tg19.gathering.org";
+}
+
+zone s1.infodesk.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.log
+subnet 88.92.8.64 netmask 255.255.255.192 {
+ range 88.92.8.66 88.92.8.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.8.65;
+ option domain-name "s1.log.tg19.gathering.org";
+ ddns-domainname "s1.log.tg19.gathering.org";
+}
+
+zone s1.log.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.medic
+subnet 88.92.11.64 netmask 255.255.255.192 {
+ range 88.92.11.66 88.92.11.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.11.65;
+ option domain-name "s1.medic.tg19.gathering.org";
+ ddns-domainname "s1.medic.tg19.gathering.org";
+}
+
+zone s1.medic.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.noc
+subnet 185.110.150.0 netmask 255.255.255.192 {
+ range 185.110.150.2 185.110.150.62;
+ option subnet-mask 255.255.255.192;
+ option routers 185.110.150.1;
+ option domain-name "s1.noc.tg19.gathering.org";
+ ddns-domainname "s1.noc.tg19.gathering.org";
+}
+
+zone s1.noc.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.north
+subnet 88.92.12.128 netmask 255.255.255.192 {
+ range 88.92.12.130 88.92.12.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.12.129;
+ option domain-name "s1.north.tg19.gathering.org";
+ ddns-domainname "s1.north.tg19.gathering.org";
+}
+
+zone s1.north.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.presse
+subnet 88.92.9.192 netmask 255.255.255.192 {
+ range 88.92.9.194 88.92.9.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.9.193;
+ option domain-name "s1.presse.tg19.gathering.org";
+ ddns-domainname "s1.presse.tg19.gathering.org";
+}
+
+zone s1.presse.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.resepsjon
+subnet 88.92.11.0 netmask 255.255.255.192 {
+ range 88.92.11.2 88.92.11.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.11.1;
+ option domain-name "s1.resepsjon.tg19.gathering.org";
+ ddns-domainname "s1.resepsjon.tg19.gathering.org";
+}
+
+zone s1.resepsjon.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.roof
+subnet 88.92.11.192 netmask 255.255.255.192 {
+ range 88.92.11.194 88.92.11.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.11.193;
+ option domain-name "s1.roof.tg19.gathering.org";
+ ddns-domainname "s1.roof.tg19.gathering.org";
+}
+
+zone s1.roof.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.secbua
+subnet 88.92.9.128 netmask 255.255.255.192 {
+ range 88.92.9.130 88.92.9.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.9.129;
+ option domain-name "s1.secbua.tg19.gathering.org";
+ ddns-domainname "s1.secbua.tg19.gathering.org";
+}
+
+zone s1.secbua.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.south
+subnet 88.92.10.128 netmask 255.255.255.192 {
+ range 88.92.10.130 88.92.10.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.10.129;
+ option domain-name "s1.south.tg19.gathering.org";
+ ddns-domainname "s1.south.tg19.gathering.org";
+}
+
+zone s1.south.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.sponsorgate
+subnet 88.92.10.192 netmask 255.255.255.192 {
+ range 88.92.10.194 88.92.10.254;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.10.193;
+ option domain-name "s1.sponsorgate.tg19.gathering.org";
+ ddns-domainname "s1.sponsorgate.tg19.gathering.org";
+}
+
+zone s1.sponsorgate.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.systemstonad
+subnet 88.92.9.64 netmask 255.255.255.192 {
+ range 88.92.9.66 88.92.9.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.9.65;
+ option domain-name "s1.systemstonad.tg19.gathering.org";
+ ddns-domainname "s1.systemstonad.tg19.gathering.org";
+}
+
+zone s1.systemstonad.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.videorom
+subnet 88.92.10.0 netmask 255.255.255.192 {
+ range 88.92.10.2 88.92.10.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.10.1;
+ option domain-name "s1.videorom.tg19.gathering.org";
+ ddns-domainname "s1.videorom.tg19.gathering.org";
+}
+
+zone s1.videorom.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s2.cna
+subnet 88.92.13.64 netmask 255.255.255.192 {
+ range 88.92.13.66 88.92.13.126;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.13.65;
+ option domain-name "s2.cna.tg19.gathering.org";
+ ddns-domainname "s2.cna.tg19.gathering.org";
+}
+
+zone s2.cna.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s2.log
+subnet 88.92.8.128 netmask 255.255.255.192 {
+ range 88.92.8.130 88.92.8.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.8.129;
+ option domain-name "s2.log.tg19.gathering.org";
+ ddns-domainname "s2.log.tg19.gathering.org";
+}
+
+zone s2.log.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s2.noc
+subnet 185.110.150.64 netmask 255.255.255.192 {
+ range 185.110.150.66 185.110.150.126;
+ option subnet-mask 255.255.255.192;
+ option routers 185.110.150.65;
+ option domain-name "s2.noc.tg19.gathering.org";
+ ddns-domainname "s2.noc.tg19.gathering.org";
+}
+
+zone s2.noc.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s2.roof
+subnet 88.92.12.0 netmask 255.255.255.192 {
+ range 88.92.12.2 88.92.12.62;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.12.1;
+ option domain-name "s2.roof.tg19.gathering.org";
+ ddns-domainname "s2.roof.tg19.gathering.org";
+}
+
+zone s2.roof.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s3.cna
+subnet 88.92.13.128 netmask 255.255.255.192 {
+ range 88.92.13.130 88.92.13.190;
+ option subnet-mask 255.255.255.192;
+ option routers 88.92.13.129;
+ option domain-name "s3.cna.tg19.gathering.org";
+ ddns-domainname "s3.cna.tg19.gathering.org";
+}
+
+zone s3.cna.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# stand-wifi-klienter
+subnet 88.92.32.0 netmask 255.255.224.0 {
+ range 88.92.32.2 88.92.63.254;
+ option subnet-mask 255.255.224.0;
+ option routers 88.92.32.1;
+ option domain-name "stand-wifi-klienter.tg19.gathering.org";
+ ddns-domainname "stand-wifi-klienter.tg19.gathering.org";
+}
+
+zone stand-wifi-klienter.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# stand-wifi-mgmt
+subnet 88.92.4.0 netmask 255.255.255.224 {
+ range 88.92.4.2 88.92.4.30;
+ option subnet-mask 255.255.255.224;
+ option routers 88.92.4.1;
+ option domain-name "stand-wifi-mgmt.tg19.gathering.org";
+ ddns-domainname "stand-wifi-mgmt.tg19.gathering.org";
+}
+
+zone stand-wifi-mgmt.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
diff --git a/examples/tg19/dhcp/config/automatic_zones_v6.conf b/examples/tg19/dhcp/config/automatic_zones_v6.conf
new file mode 100644
index 0000000..54a4576
--- /dev/null
+++ b/examples/tg19/dhcp/config/automatic_zones_v6.conf
@@ -0,0 +1,1926 @@
+# Autogenerated dhcpd6.conf from gondul
+
+# ap-mgmt.r1.ring
+subnet6 2a06:5841:d:aa::/64 {
+ range6 2a06:5841:d:aa::1000 2a06:5841:d:aa::9999;
+ option domain-name "ap-mgmt.r1.ring.tg19.gathering.org";
+}
+
+zone ap-mgmt.r1.ring.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# ap-mgmt.s1.floor
+subnet6 2a06:5841:d:a1::/64 {
+ range6 2a06:5841:d:a1::1000 2a06:5841:d:a1::9999;
+ option domain-name "ap-mgmt.s1.floor.tg19.gathering.org";
+}
+
+zone ap-mgmt.s1.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# ap-mgmt.s2.floor
+subnet6 2a06:5841:d:a2::/64 {
+ range6 2a06:5841:d:a2::1000 2a06:5841:d:a2::9999;
+ option domain-name "ap-mgmt.s2.floor.tg19.gathering.org";
+}
+
+zone ap-mgmt.s2.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# ap-mgmt.s3.floor
+subnet6 2a06:5841:d:a3::/64 {
+ range6 2a06:5841:d:a3::1000 2a06:5841:d:a3::9999;
+ option domain-name "ap-mgmt.s3.floor.tg19.gathering.org";
+}
+
+zone ap-mgmt.s3.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# ap-mgmt.s4.floor
+subnet6 2a06:5841:d:a4::/64 {
+ range6 2a06:5841:d:a4::1000 2a06:5841:d:a4::9999;
+ option domain-name "ap-mgmt.s4.floor.tg19.gathering.org";
+}
+
+zone ap-mgmt.s4.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# ap-mgmt.s5.floor
+subnet6 2a06:5841:d:a5::/64 {
+ range6 2a06:5841:d:a5::1000 2a06:5841:d:a5::9999;
+ option domain-name "ap-mgmt.s5.floor.tg19.gathering.org";
+}
+
+zone ap-mgmt.s5.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# ap-mgmt.s6.floor
+subnet6 2a06:5841:d:a6::/64 {
+ range6 2a06:5841:d:a6::1000 2a06:5841:d:a6::9999;
+ option domain-name "ap-mgmt.s6.floor.tg19.gathering.org";
+}
+
+zone ap-mgmt.s6.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# ap-mgmt.s7.floor
+subnet6 2a06:5841:d:a7::/64 {
+ range6 2a06:5841:d:a7::1000 2a06:5841:d:a7::9999;
+ option domain-name "ap-mgmt.s7.floor.tg19.gathering.org";
+}
+
+zone ap-mgmt.s7.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# ap-mgmt.s8.floor
+subnet6 2a06:5841:d:a8::/64 {
+ range6 2a06:5841:d:a8::1000 2a06:5841:d:a8::9999;
+ option domain-name "ap-mgmt.s8.floor.tg19.gathering.org";
+}
+
+zone ap-mgmt.s8.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# ap-mgmt.s9.floor
+subnet6 2a06:5841:d:a9::/64 {
+ range6 2a06:5841:d:a9::1000 2a06:5841:d:a9::9999;
+ option domain-name "ap-mgmt.s9.floor.tg19.gathering.org";
+}
+
+zone ap-mgmt.s9.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e11-1
+subnet6 2a06:5844:e:111::/64 {
+ range6 2a06:5844:e:111::1000 2a06:5844:e:111::9999;
+ option domain-name "e11-1.tg19.gathering.org";
+}
+
+zone e11-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e11-2
+subnet6 2a06:5844:e:112::/64 {
+ range6 2a06:5844:e:112::1000 2a06:5844:e:112::9999;
+ option domain-name "e11-2.tg19.gathering.org";
+}
+
+zone e11-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e11-3
+subnet6 2a06:5844:e:113::/64 {
+ range6 2a06:5844:e:113::1000 2a06:5844:e:113::9999;
+ option domain-name "e11-3.tg19.gathering.org";
+}
+
+zone e11-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e11-4
+subnet6 2a06:5844:e:114::/64 {
+ range6 2a06:5844:e:114::1000 2a06:5844:e:114::9999;
+ option domain-name "e11-4.tg19.gathering.org";
+}
+
+zone e11-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e13-1
+subnet6 2a06:5844:e:131::/64 {
+ range6 2a06:5844:e:131::1000 2a06:5844:e:131::9999;
+ option domain-name "e13-1.tg19.gathering.org";
+}
+
+zone e13-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e13-2
+subnet6 2a06:5844:e:132::/64 {
+ range6 2a06:5844:e:132::1000 2a06:5844:e:132::9999;
+ option domain-name "e13-2.tg19.gathering.org";
+}
+
+zone e13-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e13-3
+subnet6 2a06:5844:e:133::/64 {
+ range6 2a06:5844:e:133::1000 2a06:5844:e:133::9999;
+ option domain-name "e13-3.tg19.gathering.org";
+}
+
+zone e13-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e13-4
+subnet6 2a06:5844:e:134::/64 {
+ range6 2a06:5844:e:134::1000 2a06:5844:e:134::9999;
+ option domain-name "e13-4.tg19.gathering.org";
+}
+
+zone e13-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e15-1
+subnet6 2a06:5844:e:151::/64 {
+ range6 2a06:5844:e:151::1000 2a06:5844:e:151::9999;
+ option domain-name "e15-1.tg19.gathering.org";
+}
+
+zone e15-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e15-2
+subnet6 2a06:5844:e:152::/64 {
+ range6 2a06:5844:e:152::1000 2a06:5844:e:152::9999;
+ option domain-name "e15-2.tg19.gathering.org";
+}
+
+zone e15-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e15-3
+subnet6 2a06:5844:e:153::/64 {
+ range6 2a06:5844:e:153::1000 2a06:5844:e:153::9999;
+ option domain-name "e15-3.tg19.gathering.org";
+}
+
+zone e15-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e15-4
+subnet6 2a06:5844:e:154::/64 {
+ range6 2a06:5844:e:154::1000 2a06:5844:e:154::9999;
+ option domain-name "e15-4.tg19.gathering.org";
+}
+
+zone e15-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e17-1
+subnet6 2a06:5844:e:171::/64 {
+ range6 2a06:5844:e:171::1000 2a06:5844:e:171::9999;
+ option domain-name "e17-1.tg19.gathering.org";
+}
+
+zone e17-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e17-2
+subnet6 2a06:5844:e:172::/64 {
+ range6 2a06:5844:e:172::1000 2a06:5844:e:172::9999;
+ option domain-name "e17-2.tg19.gathering.org";
+}
+
+zone e17-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e17-3
+subnet6 2a06:5844:e:173::/64 {
+ range6 2a06:5844:e:173::1000 2a06:5844:e:173::9999;
+ option domain-name "e17-3.tg19.gathering.org";
+}
+
+zone e17-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e17-4
+subnet6 2a06:5844:e:174::/64 {
+ range6 2a06:5844:e:174::1000 2a06:5844:e:174::9999;
+ option domain-name "e17-4.tg19.gathering.org";
+}
+
+zone e17-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e19-1
+subnet6 2a06:5844:e:191::/64 {
+ range6 2a06:5844:e:191::1000 2a06:5844:e:191::9999;
+ option domain-name "e19-1.tg19.gathering.org";
+}
+
+zone e19-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e19-2
+subnet6 2a06:5844:e:192::/64 {
+ range6 2a06:5844:e:192::1000 2a06:5844:e:192::9999;
+ option domain-name "e19-2.tg19.gathering.org";
+}
+
+zone e19-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e19-3
+subnet6 2a06:5844:e:193::/64 {
+ range6 2a06:5844:e:193::1000 2a06:5844:e:193::9999;
+ option domain-name "e19-3.tg19.gathering.org";
+}
+
+zone e19-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e19-4
+subnet6 2a06:5844:e:194::/64 {
+ range6 2a06:5844:e:194::1000 2a06:5844:e:194::9999;
+ option domain-name "e19-4.tg19.gathering.org";
+}
+
+zone e19-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e21-1
+subnet6 2a06:5844:e:211::/64 {
+ range6 2a06:5844:e:211::1000 2a06:5844:e:211::9999;
+ option domain-name "e21-1.tg19.gathering.org";
+}
+
+zone e21-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e21-2
+subnet6 2a06:5844:e:212::/64 {
+ range6 2a06:5844:e:212::1000 2a06:5844:e:212::9999;
+ option domain-name "e21-2.tg19.gathering.org";
+}
+
+zone e21-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e21-3
+subnet6 2a06:5844:e:213::/64 {
+ range6 2a06:5844:e:213::1000 2a06:5844:e:213::9999;
+ option domain-name "e21-3.tg19.gathering.org";
+}
+
+zone e21-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e21-4
+subnet6 2a06:5844:e:214::/64 {
+ range6 2a06:5844:e:214::1000 2a06:5844:e:214::9999;
+ option domain-name "e21-4.tg19.gathering.org";
+}
+
+zone e21-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e23-1
+subnet6 2a06:5844:e:231::/64 {
+ range6 2a06:5844:e:231::1000 2a06:5844:e:231::9999;
+ option domain-name "e23-1.tg19.gathering.org";
+}
+
+zone e23-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e23-2
+subnet6 2a06:5844:e:232::/64 {
+ range6 2a06:5844:e:232::1000 2a06:5844:e:232::9999;
+ option domain-name "e23-2.tg19.gathering.org";
+}
+
+zone e23-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e23-3
+subnet6 2a06:5844:e:233::/64 {
+ range6 2a06:5844:e:233::1000 2a06:5844:e:233::9999;
+ option domain-name "e23-3.tg19.gathering.org";
+}
+
+zone e23-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e23-4
+subnet6 2a06:5844:e:234::/64 {
+ range6 2a06:5844:e:234::1000 2a06:5844:e:234::9999;
+ option domain-name "e23-4.tg19.gathering.org";
+}
+
+zone e23-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e25-2
+subnet6 2a06:5844:e:252::/64 {
+ range6 2a06:5844:e:252::1000 2a06:5844:e:252::9999;
+ option domain-name "e25-2.tg19.gathering.org";
+}
+
+zone e25-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e27-2
+subnet6 2a06:5844:e:272::/64 {
+ range6 2a06:5844:e:272::1000 2a06:5844:e:272::9999;
+ option domain-name "e27-2.tg19.gathering.org";
+}
+
+zone e27-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e29-2
+subnet6 2a06:5844:e:292::/64 {
+ range6 2a06:5844:e:292::1000 2a06:5844:e:292::9999;
+ option domain-name "e29-2.tg19.gathering.org";
+}
+
+zone e29-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e31-2
+subnet6 2a06:5844:e:312::/64 {
+ range6 2a06:5844:e:312::1000 2a06:5844:e:312::9999;
+ option domain-name "e31-2.tg19.gathering.org";
+}
+
+zone e31-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e33-2
+subnet6 2a06:5844:e:332::/64 {
+ range6 2a06:5844:e:332::1000 2a06:5844:e:332::9999;
+ option domain-name "e33-2.tg19.gathering.org";
+}
+
+zone e33-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e35-2
+subnet6 2a06:5844:e:352::/64 {
+ range6 2a06:5844:e:352::1000 2a06:5844:e:352::9999;
+ option domain-name "e35-2.tg19.gathering.org";
+}
+
+zone e35-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e37-2
+subnet6 2a06:5844:e:372::/64 {
+ range6 2a06:5844:e:372::1000 2a06:5844:e:372::9999;
+ option domain-name "e37-2.tg19.gathering.org";
+}
+
+zone e37-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e39-2
+subnet6 2a06:5844:e:392::/64 {
+ range6 2a06:5844:e:392::1000 2a06:5844:e:392::9999;
+ option domain-name "e39-2.tg19.gathering.org";
+}
+
+zone e39-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e41-1
+subnet6 2a06:5844:e:411::/64 {
+ range6 2a06:5844:e:411::1000 2a06:5844:e:411::9999;
+ option domain-name "e41-1.tg19.gathering.org";
+}
+
+zone e41-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e41-2
+subnet6 2a06:5844:e:412::/64 {
+ range6 2a06:5844:e:412::1000 2a06:5844:e:412::9999;
+ option domain-name "e41-2.tg19.gathering.org";
+}
+
+zone e41-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e41-3
+subnet6 2a06:5844:e:413::/64 {
+ range6 2a06:5844:e:413::1000 2a06:5844:e:413::9999;
+ option domain-name "e41-3.tg19.gathering.org";
+}
+
+zone e41-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e41-4
+subnet6 2a06:5844:e:414::/64 {
+ range6 2a06:5844:e:414::1000 2a06:5844:e:414::9999;
+ option domain-name "e41-4.tg19.gathering.org";
+}
+
+zone e41-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e43-1
+subnet6 2a06:5844:e:431::/64 {
+ range6 2a06:5844:e:431::1000 2a06:5844:e:431::9999;
+ option domain-name "e43-1.tg19.gathering.org";
+}
+
+zone e43-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e43-2
+subnet6 2a06:5844:e:432::/64 {
+ range6 2a06:5844:e:432::1000 2a06:5844:e:432::9999;
+ option domain-name "e43-2.tg19.gathering.org";
+}
+
+zone e43-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e43-3
+subnet6 2a06:5844:e:433::/64 {
+ range6 2a06:5844:e:433::1000 2a06:5844:e:433::9999;
+ option domain-name "e43-3.tg19.gathering.org";
+}
+
+zone e43-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e43-4
+subnet6 2a06:5844:e:434::/64 {
+ range6 2a06:5844:e:434::1000 2a06:5844:e:434::9999;
+ option domain-name "e43-4.tg19.gathering.org";
+}
+
+zone e43-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e45-1
+subnet6 2a06:5844:e:451::/64 {
+ range6 2a06:5844:e:451::1000 2a06:5844:e:451::9999;
+ option domain-name "e45-1.tg19.gathering.org";
+}
+
+zone e45-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e45-2
+subnet6 2a06:5844:e:452::/64 {
+ range6 2a06:5844:e:452::1000 2a06:5844:e:452::9999;
+ option domain-name "e45-2.tg19.gathering.org";
+}
+
+zone e45-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e45-3
+subnet6 2a06:5844:e:453::/64 {
+ range6 2a06:5844:e:453::1000 2a06:5844:e:453::9999;
+ option domain-name "e45-3.tg19.gathering.org";
+}
+
+zone e45-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e45-4
+subnet6 2a06:5844:e:454::/64 {
+ range6 2a06:5844:e:454::1000 2a06:5844:e:454::9999;
+ option domain-name "e45-4.tg19.gathering.org";
+}
+
+zone e45-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e47-1
+subnet6 2a06:5844:e:471::/64 {
+ range6 2a06:5844:e:471::1000 2a06:5844:e:471::9999;
+ option domain-name "e47-1.tg19.gathering.org";
+}
+
+zone e47-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e47-2
+subnet6 2a06:5844:e:472::/64 {
+ range6 2a06:5844:e:472::1000 2a06:5844:e:472::9999;
+ option domain-name "e47-2.tg19.gathering.org";
+}
+
+zone e47-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e47-3
+subnet6 2a06:5844:e:473::/64 {
+ range6 2a06:5844:e:473::1000 2a06:5844:e:473::9999;
+ option domain-name "e47-3.tg19.gathering.org";
+}
+
+zone e47-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e47-4
+subnet6 2a06:5844:e:474::/64 {
+ range6 2a06:5844:e:474::1000 2a06:5844:e:474::9999;
+ option domain-name "e47-4.tg19.gathering.org";
+}
+
+zone e47-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e49-1
+subnet6 2a06:5844:e:491::/64 {
+ range6 2a06:5844:e:491::1000 2a06:5844:e:491::9999;
+ option domain-name "e49-1.tg19.gathering.org";
+}
+
+zone e49-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e49-2
+subnet6 2a06:5844:e:492::/64 {
+ range6 2a06:5844:e:492::1000 2a06:5844:e:492::9999;
+ option domain-name "e49-2.tg19.gathering.org";
+}
+
+zone e49-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e49-3
+subnet6 2a06:5844:e:493::/64 {
+ range6 2a06:5844:e:493::1000 2a06:5844:e:493::9999;
+ option domain-name "e49-3.tg19.gathering.org";
+}
+
+zone e49-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e49-4
+subnet6 2a06:5844:e:494::/64 {
+ range6 2a06:5844:e:494::1000 2a06:5844:e:494::9999;
+ option domain-name "e49-4.tg19.gathering.org";
+}
+
+zone e49-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e51-1
+subnet6 2a06:5844:e:511::/64 {
+ range6 2a06:5844:e:511::1000 2a06:5844:e:511::9999;
+ option domain-name "e51-1.tg19.gathering.org";
+}
+
+zone e51-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e51-2
+subnet6 2a06:5844:e:512::/64 {
+ range6 2a06:5844:e:512::1000 2a06:5844:e:512::9999;
+ option domain-name "e51-2.tg19.gathering.org";
+}
+
+zone e51-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e51-3
+subnet6 2a06:5844:e:513::/64 {
+ range6 2a06:5844:e:513::1000 2a06:5844:e:513::9999;
+ option domain-name "e51-3.tg19.gathering.org";
+}
+
+zone e51-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e51-4
+subnet6 2a06:5844:e:514::/64 {
+ range6 2a06:5844:e:514::1000 2a06:5844:e:514::9999;
+ option domain-name "e51-4.tg19.gathering.org";
+}
+
+zone e51-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e53-1
+subnet6 2a06:5844:e:531::/64 {
+ range6 2a06:5844:e:531::1000 2a06:5844:e:531::9999;
+ option domain-name "e53-1.tg19.gathering.org";
+}
+
+zone e53-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e53-2
+subnet6 2a06:5844:e:532::/64 {
+ range6 2a06:5844:e:532::1000 2a06:5844:e:532::9999;
+ option domain-name "e53-2.tg19.gathering.org";
+}
+
+zone e53-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e53-3
+subnet6 2a06:5844:e:533::/64 {
+ range6 2a06:5844:e:533::1000 2a06:5844:e:533::9999;
+ option domain-name "e53-3.tg19.gathering.org";
+}
+
+zone e53-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e53-4
+subnet6 2a06:5844:e:534::/64 {
+ range6 2a06:5844:e:534::1000 2a06:5844:e:534::9999;
+ option domain-name "e53-4.tg19.gathering.org";
+}
+
+zone e53-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e55-1
+subnet6 2a06:5844:e:551::/64 {
+ range6 2a06:5844:e:551::1000 2a06:5844:e:551::9999;
+ option domain-name "e55-1.tg19.gathering.org";
+}
+
+zone e55-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e55-2
+subnet6 2a06:5844:e:552::/64 {
+ range6 2a06:5844:e:552::1000 2a06:5844:e:552::9999;
+ option domain-name "e55-2.tg19.gathering.org";
+}
+
+zone e55-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e55-3
+subnet6 2a06:5844:e:553::/64 {
+ range6 2a06:5844:e:553::1000 2a06:5844:e:553::9999;
+ option domain-name "e55-3.tg19.gathering.org";
+}
+
+zone e55-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e55-4
+subnet6 2a06:5844:e:554::/64 {
+ range6 2a06:5844:e:554::1000 2a06:5844:e:554::9999;
+ option domain-name "e55-4.tg19.gathering.org";
+}
+
+zone e55-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e57-1
+subnet6 2a06:5844:e:571::/64 {
+ range6 2a06:5844:e:571::1000 2a06:5844:e:571::9999;
+ option domain-name "e57-1.tg19.gathering.org";
+}
+
+zone e57-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e57-2
+subnet6 2a06:5844:e:572::/64 {
+ range6 2a06:5844:e:572::1000 2a06:5844:e:572::9999;
+ option domain-name "e57-2.tg19.gathering.org";
+}
+
+zone e57-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e57-3
+subnet6 2a06:5844:e:573::/64 {
+ range6 2a06:5844:e:573::1000 2a06:5844:e:573::9999;
+ option domain-name "e57-3.tg19.gathering.org";
+}
+
+zone e57-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e57-4
+subnet6 2a06:5844:e:574::/64 {
+ range6 2a06:5844:e:574::1000 2a06:5844:e:574::9999;
+ option domain-name "e57-4.tg19.gathering.org";
+}
+
+zone e57-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e59-1
+subnet6 2a06:5844:e:591::/64 {
+ range6 2a06:5844:e:591::1000 2a06:5844:e:591::9999;
+ option domain-name "e59-1.tg19.gathering.org";
+}
+
+zone e59-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e59-2
+subnet6 2a06:5844:e:592::/64 {
+ range6 2a06:5844:e:592::1000 2a06:5844:e:592::9999;
+ option domain-name "e59-2.tg19.gathering.org";
+}
+
+zone e59-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e59-3
+subnet6 2a06:5844:e:593::/64 {
+ range6 2a06:5844:e:593::1000 2a06:5844:e:593::9999;
+ option domain-name "e59-3.tg19.gathering.org";
+}
+
+zone e59-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e59-4
+subnet6 2a06:5844:e:594::/64 {
+ range6 2a06:5844:e:594::1000 2a06:5844:e:594::9999;
+ option domain-name "e59-4.tg19.gathering.org";
+}
+
+zone e59-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e61-1
+subnet6 2a06:5844:e:611::/64 {
+ range6 2a06:5844:e:611::1000 2a06:5844:e:611::9999;
+ option domain-name "e61-1.tg19.gathering.org";
+}
+
+zone e61-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e61-2
+subnet6 2a06:5844:e:612::/64 {
+ range6 2a06:5844:e:612::1000 2a06:5844:e:612::9999;
+ option domain-name "e61-2.tg19.gathering.org";
+}
+
+zone e61-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e61-3
+subnet6 2a06:5844:e:613::/64 {
+ range6 2a06:5844:e:613::1000 2a06:5844:e:613::9999;
+ option domain-name "e61-3.tg19.gathering.org";
+}
+
+zone e61-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e61-4
+subnet6 2a06:5844:e:614::/64 {
+ range6 2a06:5844:e:614::1000 2a06:5844:e:614::9999;
+ option domain-name "e61-4.tg19.gathering.org";
+}
+
+zone e61-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e63-1
+subnet6 2a06:5844:e:631::/64 {
+ range6 2a06:5844:e:631::1000 2a06:5844:e:631::9999;
+ option domain-name "e63-1.tg19.gathering.org";
+}
+
+zone e63-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e63-2
+subnet6 2a06:5844:e:632::/64 {
+ range6 2a06:5844:e:632::1000 2a06:5844:e:632::9999;
+ option domain-name "e63-2.tg19.gathering.org";
+}
+
+zone e63-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e63-3
+subnet6 2a06:5844:e:633::/64 {
+ range6 2a06:5844:e:633::1000 2a06:5844:e:633::9999;
+ option domain-name "e63-3.tg19.gathering.org";
+}
+
+zone e63-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e63-4
+subnet6 2a06:5844:e:634::/64 {
+ range6 2a06:5844:e:634::1000 2a06:5844:e:634::9999;
+ option domain-name "e63-4.tg19.gathering.org";
+}
+
+zone e63-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e65-1
+subnet6 2a06:5844:e:651::/64 {
+ range6 2a06:5844:e:651::1000 2a06:5844:e:651::9999;
+ option domain-name "e65-1.tg19.gathering.org";
+}
+
+zone e65-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e65-2
+subnet6 2a06:5844:e:652::/64 {
+ range6 2a06:5844:e:652::1000 2a06:5844:e:652::9999;
+ option domain-name "e65-2.tg19.gathering.org";
+}
+
+zone e65-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e65-3
+subnet6 2a06:5844:e:653::/64 {
+ range6 2a06:5844:e:653::1000 2a06:5844:e:653::9999;
+ option domain-name "e65-3.tg19.gathering.org";
+}
+
+zone e65-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e65-4
+subnet6 2a06:5844:e:654::/64 {
+ range6 2a06:5844:e:654::1000 2a06:5844:e:654::9999;
+ option domain-name "e65-4.tg19.gathering.org";
+}
+
+zone e65-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e67-1
+subnet6 2a06:5844:e:671::/64 {
+ range6 2a06:5844:e:671::1000 2a06:5844:e:671::9999;
+ option domain-name "e67-1.tg19.gathering.org";
+}
+
+zone e67-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e67-2
+subnet6 2a06:5844:e:672::/64 {
+ range6 2a06:5844:e:672::1000 2a06:5844:e:672::9999;
+ option domain-name "e67-2.tg19.gathering.org";
+}
+
+zone e67-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e67-3
+subnet6 2a06:5844:e:673::/64 {
+ range6 2a06:5844:e:673::1000 2a06:5844:e:673::9999;
+ option domain-name "e67-3.tg19.gathering.org";
+}
+
+zone e67-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e67-4
+subnet6 2a06:5844:e:674::/64 {
+ range6 2a06:5844:e:674::1000 2a06:5844:e:674::9999;
+ option domain-name "e67-4.tg19.gathering.org";
+}
+
+zone e67-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e69-1
+subnet6 2a06:5844:e:691::/64 {
+ range6 2a06:5844:e:691::1000 2a06:5844:e:691::9999;
+ option domain-name "e69-1.tg19.gathering.org";
+}
+
+zone e69-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e69-2
+subnet6 2a06:5844:e:692::/64 {
+ range6 2a06:5844:e:692::1000 2a06:5844:e:692::9999;
+ option domain-name "e69-2.tg19.gathering.org";
+}
+
+zone e69-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e69-3
+subnet6 2a06:5844:e:693::/64 {
+ range6 2a06:5844:e:693::1000 2a06:5844:e:693::9999;
+ option domain-name "e69-3.tg19.gathering.org";
+}
+
+zone e69-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e69-4
+subnet6 2a06:5844:e:694::/64 {
+ range6 2a06:5844:e:694::1000 2a06:5844:e:694::9999;
+ option domain-name "e69-4.tg19.gathering.org";
+}
+
+zone e69-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e7-1
+subnet6 2a06:5844:e:71::/64 {
+ range6 2a06:5844:e:71::1000 2a06:5844:e:71::9999;
+ option domain-name "e7-1.tg19.gathering.org";
+}
+
+zone e7-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e7-2
+subnet6 2a06:5844:e:72::/64 {
+ range6 2a06:5844:e:72::1000 2a06:5844:e:72::9999;
+ option domain-name "e7-2.tg19.gathering.org";
+}
+
+zone e7-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e7-3
+subnet6 2a06:5844:e:73::/64 {
+ range6 2a06:5844:e:73::1000 2a06:5844:e:73::9999;
+ option domain-name "e7-3.tg19.gathering.org";
+}
+
+zone e7-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e7-4
+subnet6 2a06:5844:e:74::/64 {
+ range6 2a06:5844:e:74::1000 2a06:5844:e:74::9999;
+ option domain-name "e7-4.tg19.gathering.org";
+}
+
+zone e7-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e71-1
+subnet6 2a06:5844:e:711::/64 {
+ range6 2a06:5844:e:711::1000 2a06:5844:e:711::9999;
+ option domain-name "e71-1.tg19.gathering.org";
+}
+
+zone e71-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e71-2
+subnet6 2a06:5844:e:712::/64 {
+ range6 2a06:5844:e:712::1000 2a06:5844:e:712::9999;
+ option domain-name "e71-2.tg19.gathering.org";
+}
+
+zone e71-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e71-3
+subnet6 2a06:5844:e:713::/64 {
+ range6 2a06:5844:e:713::1000 2a06:5844:e:713::9999;
+ option domain-name "e71-3.tg19.gathering.org";
+}
+
+zone e71-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e71-4
+subnet6 2a06:5844:e:714::/64 {
+ range6 2a06:5844:e:714::1000 2a06:5844:e:714::9999;
+ option domain-name "e71-4.tg19.gathering.org";
+}
+
+zone e71-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e73-1
+subnet6 2a06:5844:e:731::/64 {
+ range6 2a06:5844:e:731::1000 2a06:5844:e:731::9999;
+ option domain-name "e73-1.tg19.gathering.org";
+}
+
+zone e73-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e73-2
+subnet6 2a06:5844:e:732::/64 {
+ range6 2a06:5844:e:732::1000 2a06:5844:e:732::9999;
+ option domain-name "e73-2.tg19.gathering.org";
+}
+
+zone e73-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e73-3
+subnet6 2a06:5844:e:733::/64 {
+ range6 2a06:5844:e:733::1000 2a06:5844:e:733::9999;
+ option domain-name "e73-3.tg19.gathering.org";
+}
+
+zone e73-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e73-4
+subnet6 2a06:5844:e:734::/64 {
+ range6 2a06:5844:e:734::1000 2a06:5844:e:734::9999;
+ option domain-name "e73-4.tg19.gathering.org";
+}
+
+zone e73-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e75-1
+subnet6 2a06:5844:e:751::/64 {
+ range6 2a06:5844:e:751::1000 2a06:5844:e:751::9999;
+ option domain-name "e75-1.tg19.gathering.org";
+}
+
+zone e75-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e75-2
+subnet6 2a06:5844:e:752::/64 {
+ range6 2a06:5844:e:752::1000 2a06:5844:e:752::9999;
+ option domain-name "e75-2.tg19.gathering.org";
+}
+
+zone e75-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e75-3
+subnet6 2a06:5844:e:753::/64 {
+ range6 2a06:5844:e:753::1000 2a06:5844:e:753::9999;
+ option domain-name "e75-3.tg19.gathering.org";
+}
+
+zone e75-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e75-4
+subnet6 2a06:5844:e:754::/64 {
+ range6 2a06:5844:e:754::1000 2a06:5844:e:754::9999;
+ option domain-name "e75-4.tg19.gathering.org";
+}
+
+zone e75-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e77-1
+subnet6 2a06:5844:e:771::/64 {
+ range6 2a06:5844:e:771::1000 2a06:5844:e:771::9999;
+ option domain-name "e77-1.tg19.gathering.org";
+}
+
+zone e77-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e77-3
+subnet6 2a06:5844:e:773::/64 {
+ range6 2a06:5844:e:773::1000 2a06:5844:e:773::9999;
+ option domain-name "e77-3.tg19.gathering.org";
+}
+
+zone e77-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e77-4
+subnet6 2a06:5844:e:774::/64 {
+ range6 2a06:5844:e:774::1000 2a06:5844:e:774::9999;
+ option domain-name "e77-4.tg19.gathering.org";
+}
+
+zone e77-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e79-1
+subnet6 2a06:5844:e:791::/64 {
+ range6 2a06:5844:e:791::1000 2a06:5844:e:791::9999;
+ option domain-name "e79-1.tg19.gathering.org";
+}
+
+zone e79-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e79-3
+subnet6 2a06:5844:e:793::/64 {
+ range6 2a06:5844:e:793::1000 2a06:5844:e:793::9999;
+ option domain-name "e79-3.tg19.gathering.org";
+}
+
+zone e79-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e79-4
+subnet6 2a06:5844:e:794::/64 {
+ range6 2a06:5844:e:794::1000 2a06:5844:e:794::9999;
+ option domain-name "e79-4.tg19.gathering.org";
+}
+
+zone e79-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e81-1
+subnet6 2a06:5844:e:811::/64 {
+ range6 2a06:5844:e:811::1000 2a06:5844:e:811::9999;
+ option domain-name "e81-1.tg19.gathering.org";
+}
+
+zone e81-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e81-3
+subnet6 2a06:5844:e:813::/64 {
+ range6 2a06:5844:e:813::1000 2a06:5844:e:813::9999;
+ option domain-name "e81-3.tg19.gathering.org";
+}
+
+zone e81-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e81-4
+subnet6 2a06:5844:e:814::/64 {
+ range6 2a06:5844:e:814::1000 2a06:5844:e:814::9999;
+ option domain-name "e81-4.tg19.gathering.org";
+}
+
+zone e81-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e9-1
+subnet6 2a06:5844:e:91::/64 {
+ range6 2a06:5844:e:91::1000 2a06:5844:e:91::9999;
+ option domain-name "e9-1.tg19.gathering.org";
+}
+
+zone e9-1.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e9-2
+subnet6 2a06:5844:e:92::/64 {
+ range6 2a06:5844:e:92::1000 2a06:5844:e:92::9999;
+ option domain-name "e9-2.tg19.gathering.org";
+}
+
+zone e9-2.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e9-3
+subnet6 2a06:5844:e:93::/64 {
+ range6 2a06:5844:e:93::1000 2a06:5844:e:93::9999;
+ option domain-name "e9-3.tg19.gathering.org";
+}
+
+zone e9-3.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# e9-4
+subnet6 2a06:5844:e:94::/64 {
+ range6 2a06:5844:e:94::1000 2a06:5844:e:94::9999;
+ option domain-name "e9-4.tg19.gathering.org";
+}
+
+zone e9-4.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# Event-Intern
+subnet6 2a06:5841:c:12a::/64 {
+ range6 2a06:5841:c:12a::1000 2a06:5841:c:12a::9999;
+ option domain-name "Event-Intern.tg19.gathering.org";
+}
+
+zone Event-Intern.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# mgmt.r1.ring
+subnet6 2a06:5841:d:b::/64 {
+ range6 2a06:5841:d:b::1000 2a06:5841:d:b::9999;
+ option domain-name "mgmt.r1.ring.tg19.gathering.org";
+}
+
+zone mgmt.r1.ring.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# mgmt.s1.floor
+subnet6 2a06:5841:d:1::/64 {
+ range6 2a06:5841:d:1::1000 2a06:5841:d:1::9999;
+ option domain-name "mgmt.s1.floor.tg19.gathering.org";
+}
+
+zone mgmt.s1.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# mgmt.s2.floor
+subnet6 2a06:5841:d:2::/64 {
+ range6 2a06:5841:d:2::1000 2a06:5841:d:2::9999;
+ option domain-name "mgmt.s2.floor.tg19.gathering.org";
+}
+
+zone mgmt.s2.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# mgmt.s3.floor
+subnet6 2a06:5841:d:3::/64 {
+ range6 2a06:5841:d:3::1000 2a06:5841:d:3::9999;
+ option domain-name "mgmt.s3.floor.tg19.gathering.org";
+}
+
+zone mgmt.s3.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# mgmt.s4.floor
+subnet6 2a06:5841:d:4::/64 {
+ range6 2a06:5841:d:4::1000 2a06:5841:d:4::9999;
+ option domain-name "mgmt.s4.floor.tg19.gathering.org";
+}
+
+zone mgmt.s4.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# mgmt.s5.floor
+subnet6 2a06:5841:d:5::/64 {
+ range6 2a06:5841:d:5::1000 2a06:5841:d:5::9999;
+ option domain-name "mgmt.s5.floor.tg19.gathering.org";
+}
+
+zone mgmt.s5.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# mgmt.s6.floor
+subnet6 2a06:5841:d:6::/64 {
+ range6 2a06:5841:d:6::1000 2a06:5841:d:6::9999;
+ option domain-name "mgmt.s6.floor.tg19.gathering.org";
+}
+
+zone mgmt.s6.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# mgmt.s7.floor
+subnet6 2a06:5841:d:7::/64 {
+ range6 2a06:5841:d:7::1000 2a06:5841:d:7::9999;
+ option domain-name "mgmt.s7.floor.tg19.gathering.org";
+}
+
+zone mgmt.s7.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# mgmt.s8.floor
+subnet6 2a06:5841:d:8::/64 {
+ range6 2a06:5841:d:8::1000 2a06:5841:d:8::9999;
+ option domain-name "mgmt.s8.floor.tg19.gathering.org";
+}
+
+zone mgmt.s8.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# mgmt.s9.floor
+subnet6 2a06:5841:d:9::/64 {
+ range6 2a06:5841:d:9::1000 2a06:5841:d:9::9999;
+ option domain-name "mgmt.s9.floor.tg19.gathering.org";
+}
+
+zone mgmt.s9.floor.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# noc-wifi
+subnet6 2a06:5841:f:f::/64 {
+ range6 2a06:5841:f:f::1000 2a06:5841:f:f::9999;
+ option domain-name "noc-wifi.tg19.gathering.org";
+}
+
+zone noc-wifi.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.auditorium
+subnet6 2a06:5841:c:125::/64 {
+ range6 2a06:5841:c:125::1000 2a06:5841:c:125::9999;
+ option domain-name "s1.auditorium.tg19.gathering.org";
+}
+
+zone s1.auditorium.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.boh
+subnet6 2a06:5841:c:128::/64 {
+ range6 2a06:5841:c:128::1000 2a06:5841:c:128::9999;
+ option domain-name "s1.boh.tg19.gathering.org";
+}
+
+zone s1.boh.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.cna
+subnet6 2a06:5841:c:114::/64 {
+ range6 2a06:5841:c:114::1000 2a06:5841:c:114::9999;
+ option domain-name "s1.cna.tg19.gathering.org";
+}
+
+zone s1.cna.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.elkjop
+subnet6 2a06:5844:e:a1::/64 {
+ range6 2a06:5844:e:a1::1000 2a06:5844:e:a1::9999;
+ option domain-name "s1.elkjop.tg19.gathering.org";
+}
+
+zone s1.elkjop.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.event
+subnet6 2a06:5841:c:115::/64 {
+ range6 2a06:5841:c:115::1000 2a06:5841:c:115::9999;
+ option domain-name "s1.event.tg19.gathering.org";
+}
+
+zone s1.event.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.event-ob
+subnet6 2a06:5841:c:133::/64 {
+ range6 2a06:5841:c:133::1000 2a06:5841:c:133::9999;
+ option domain-name "s1.event-ob.tg19.gathering.org";
+}
+
+zone s1.event-ob.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.foh
+subnet6 2a06:5841:c:130::/64 {
+ range6 2a06:5841:c:130::1000 2a06:5841:c:130::9999;
+ option domain-name "s1.foh.tg19.gathering.org";
+}
+
+zone s1.foh.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.fugleberget
+subnet6 2a06:5841:c:120::/64 {
+ range6 2a06:5841:c:120::1000 2a06:5841:c:120::9999;
+ option domain-name "s1.fugleberget.tg19.gathering.org";
+}
+
+zone s1.fugleberget.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.infodesk
+subnet6 2a06:5844:e:a2::/64 {
+ range6 2a06:5844:e:a2::1000 2a06:5844:e:a2::9999;
+ option domain-name "s1.infodesk.tg19.gathering.org";
+}
+
+zone s1.infodesk.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.log
+subnet6 2a06:5841:c:112::/64 {
+ range6 2a06:5841:c:112::1000 2a06:5841:c:112::9999;
+ option domain-name "s1.log.tg19.gathering.org";
+}
+
+zone s1.log.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.medic
+subnet6 2a06:5841:c:124::/64 {
+ range6 2a06:5841:c:124::1000 2a06:5841:c:124::9999;
+ option domain-name "s1.medic.tg19.gathering.org";
+}
+
+zone s1.medic.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.noc
+subnet6 2a06:5841:f:c::/64 {
+ range6 2a06:5841:f:c::1000 2a06:5841:f:c::9999;
+ option domain-name "s1.noc.tg19.gathering.org";
+}
+
+zone s1.noc.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.north
+subnet6 2a06:5841:c:129::/64 {
+ range6 2a06:5841:c:129::1000 2a06:5841:c:129::9999;
+ option domain-name "s1.north.tg19.gathering.org";
+}
+
+zone s1.north.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.presse
+subnet6 2a06:5841:c:118::/64 {
+ range6 2a06:5841:c:118::1000 2a06:5841:c:118::9999;
+ option domain-name "s1.presse.tg19.gathering.org";
+}
+
+zone s1.presse.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.resepsjon
+subnet6 2a06:5841:c:123::/64 {
+ range6 2a06:5841:c:123::1000 2a06:5841:c:123::9999;
+ option domain-name "s1.resepsjon.tg19.gathering.org";
+}
+
+zone s1.resepsjon.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.roof
+subnet6 2a06:5841:c:126::/64 {
+ range6 2a06:5841:c:126::1000 2a06:5841:c:126::9999;
+ option domain-name "s1.roof.tg19.gathering.org";
+}
+
+zone s1.roof.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.secbua
+subnet6 2a06:5841:c:117::/64 {
+ range6 2a06:5841:c:117::1000 2a06:5841:c:117::9999;
+ option domain-name "s1.secbua.tg19.gathering.org";
+}
+
+zone s1.secbua.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.south
+subnet6 2a06:5841:c:121::/64 {
+ range6 2a06:5841:c:121::1000 2a06:5841:c:121::9999;
+ option domain-name "s1.south.tg19.gathering.org";
+}
+
+zone s1.south.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.sponsorgate
+subnet6 2a06:5841:c:122::/64 {
+ range6 2a06:5841:c:122::1000 2a06:5841:c:122::9999;
+ option domain-name "s1.sponsorgate.tg19.gathering.org";
+}
+
+zone s1.sponsorgate.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.systemstonad
+subnet6 2a06:5841:c:116::/64 {
+ range6 2a06:5841:c:116::1000 2a06:5841:c:116::9999;
+ option domain-name "s1.systemstonad.tg19.gathering.org";
+}
+
+zone s1.systemstonad.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s1.videorom
+subnet6 2a06:5841:c:119::/64 {
+ range6 2a06:5841:c:119::1000 2a06:5841:c:119::9999;
+ option domain-name "s1.videorom.tg19.gathering.org";
+}
+
+zone s1.videorom.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s2.cna
+subnet6 2a06:5841:c:131::/64 {
+ range6 2a06:5841:c:131::1000 2a06:5841:c:131::9999;
+ option domain-name "s2.cna.tg19.gathering.org";
+}
+
+zone s2.cna.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s2.log
+subnet6 2a06:5841:c:113::/64 {
+ range6 2a06:5841:c:113::1000 2a06:5841:c:113::9999;
+ option domain-name "s2.log.tg19.gathering.org";
+}
+
+zone s2.log.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s2.noc
+subnet6 2a06:5841:f:d::/64 {
+ range6 2a06:5841:f:d::1000 2a06:5841:f:d::9999;
+ option domain-name "s2.noc.tg19.gathering.org";
+}
+
+zone s2.noc.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s2.roof
+subnet6 2a06:5841:c:127::/64 {
+ range6 2a06:5841:c:127::1000 2a06:5841:c:127::9999;
+ option domain-name "s2.roof.tg19.gathering.org";
+}
+
+zone s2.roof.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# s3.cna
+subnet6 2a06:5841:c:132::/64 {
+ range6 2a06:5841:c:132::1000 2a06:5841:c:132::9999;
+ option domain-name "s3.cna.tg19.gathering.org";
+}
+
+zone s3.cna.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# stand-wifi-klienter
+subnet6 2a06:5844:a::/64 {
+ range6 2a06:5844:a::1000 2a06:5844:a::9999;
+ option domain-name "stand-wifi-klienter.tg19.gathering.org";
+}
+
+zone stand-wifi-klienter.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+# stand-wifi-mgmt
+subnet6 2a06:5841:d:c::/64 {
+ range6 2a06:5841:d:c::1000 2a06:5841:d:c::9999;
+ option domain-name "stand-wifi-mgmt.tg19.gathering.org";
+}
+
+zone stand-wifi-mgmt.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
diff --git a/examples/tg19/dhcp/config/dhcpd-notify-v4.conf b/examples/tg19/dhcp/config/dhcpd-notify-v4.conf
new file mode 100644
index 0000000..6f63412
--- /dev/null
+++ b/examples/tg19/dhcp/config/dhcpd-notify-v4.conf
@@ -0,0 +1,10 @@
+on commit {
+ set ClientIP = concat("--ip=", binary-to-ascii(10, 8, ".", leased-address));
+ set ClientMac = concat("--mac=", binary-to-ascii(16, 8, ":", substring(hardware, 1, 6)));
+ set ClientName = concat("--clientname=", pick-first-value(option fqdn.fqdn, option fqdn.hostname, option host-name, ""));
+ set LeaseTime = concat("--lease=", binary-to-ascii(10,32,"",encode-int(lease-time,32)));
+ set CircuitID = concat("--circuit=", pick-first-value(option agent.circuit-id, ""));
+ set GondulAPI = concat("--api=", "https://tech:<SECRET>@gondul.tg19.gathering.org/api/write/collector");
+
+ execute("/usr/local/bin/gondul-lol", ClientIP, ClientMac, ClientName, CircuitID, LeaseTime, GondulAPI);
+}
diff --git a/examples/tg19/dhcp/config/dhcpd-notify-v6.conf b/examples/tg19/dhcp/config/dhcpd-notify-v6.conf
new file mode 100644
index 0000000..4f73cc6
--- /dev/null
+++ b/examples/tg19/dhcp/config/dhcpd-notify-v6.conf
@@ -0,0 +1,9 @@
+on commit {
+ set ClientIP = concat("--ip=", pick-first-value(binary-to-ascii(16, 16, ":", substring(option dhcp6.ia-na, 16, 16)), ""));
+ set ClientName = concat("--clientname=", pick-first-value(option fqdn.hostname, option host-name, option dhcp-client-identifier, ""));
+ set ClientMac = concat("--mac=", pick-first-value(binary-to-ascii(16, 8, ":", suffix(option dhcp6.client-id,6)), ""));
+ set CircuitID = concat("--circuit=", pick-first-value(option agent.circuit-id, ""));
+ set GondulAPI = concat("--api=", "https://tech:<Removed>@gondul.tg19.gathering.org/api/write/collector");
+
+ execute("/usr/local/bin/gondul-lol", ClientIP, ClientMac, ClientName, CircuitID, GondulAPI);
+}
diff --git a/examples/tg19/dhcp/config/dhcpd.conf b/examples/tg19/dhcp/config/dhcpd.conf
new file mode 100644
index 0000000..ef32c85
--- /dev/null
+++ b/examples/tg19/dhcp/config/dhcpd.conf
@@ -0,0 +1,70 @@
+# Default lease: 20min, max: 40min
+default-lease-time 1200;
+max-lease-time 2400;
+
+# make server authorative
+authoritative;
+
+# Don't let clients set their own FQDN
+ignore client-updates;
+
+# enable DDNS
+ddns-update-style interim;
+
+# set ddns-hostname
+if exists host-name {
+ ddns-hostname = lcase(option host-name);
+} elsif exists fqdn.hostname {
+ ddns-hostname = lcase(option fqdn.hostname);
+} else {
+ ddns-hostname = binary-to-ascii(10, 8, "-", leased-address);
+}
+
+# Logging
+log-facility local5;
+
+# set 'hardware' option to a variable
+# rebuilds the complete MAC in cases where you have a leading 0
+set hostmac = concat (
+ suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,1,1))),2), ":",
+ suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,2,1))),2), ":",
+ suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,3,1))),2), ":",
+ suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,4,1))),2), ":",
+ suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,5,1))),2), ":",
+ suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,6,1))),2)
+);
+
+# Domain name (unless overriden elsewhere)
+option domain-name "tg19.gathering.org";
+option domain-name-servers 185.110.149.126, 185.110.149.62;
+option domain-search "tg19.gathering.org";
+
+# tele server zone
+subnet 185.110.149.0 netmask 255.255.255.192 {
+ option subnet-mask 255.255.255.192;
+ option routers 185.110.149.1;
+
+ option domain-name "tele.tg19.gathering.org";
+ ddns-domainname "tele.tg19.gathering.org";
+
+
+ # No DDNS
+ ddns-updates off;
+ ddns-hostname = none;
+ ddns-domainname = none;
+
+ # supershort leasetime
+ default-lease-time 300;
+ max-lease-time 600;
+
+ range 185.110.149.55 185.110.149.62;
+}
+
+include "/etc/dhcp/dhcpd_key.conf";
+include "/etc/dhcp/dhcpd-notify-v4.conf";
+include "/etc/dhcp/dhcpd4_revzones.conf";
+include "/etc/dhcp/dhcpd4_pxeboot.conf";
+include "/etc/dhcp/dhcpd4_voip.conf";
+include "/etc/dhcp/dhcpd4_wlc.conf";
+include "/etc/dhcp/automatic_zones_v4.conf";
+include "/etc/dhcp/fap4.conf";
diff --git a/examples/tg19/dhcp/config/dhcpd4_pxeboot.conf b/examples/tg19/dhcp/config/dhcpd4_pxeboot.conf
new file mode 100644
index 0000000..a83b37c
--- /dev/null
+++ b/examples/tg19/dhcp/config/dhcpd4_pxeboot.conf
@@ -0,0 +1,9 @@
+option arch code 93 = unsigned integer 16;
+
+if option arch = 00:07 {
+ filename "ipxe.efi";
+} else {
+ filename "ipxe.0";
+}
+
+next-server 185.110.149.2;
diff --git a/examples/tg19/dhcp/config/dhcpd4_revzones.conf b/examples/tg19/dhcp/config/dhcpd4_revzones.conf
new file mode 100644
index 0000000..17d872d
--- /dev/null
+++ b/examples/tg19/dhcp/config/dhcpd4_revzones.conf
@@ -0,0 +1,528 @@
+zone 0.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 1.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 2.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 3.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 4.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 5.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 6.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 7.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 8.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 9.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 10.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 11.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 12.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 13.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 14.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 15.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 16.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 17.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 18.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 19.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 20.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 21.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 22.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 23.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 24.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 25.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 26.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 27.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 28.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 29.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 30.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 31.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 32.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 33.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 34.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 35.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 36.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 37.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 38.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 39.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 40.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 41.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 42.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 43.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 44.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 45.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 46.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 47.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 48.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 49.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 50.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 51.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 52.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 53.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 54.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 55.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 56.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 57.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 58.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 59.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 60.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 61.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 62.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 63.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 64.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 65.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 66.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 67.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 68.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 69.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 70.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 71.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 72.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 73.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 74.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 75.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 76.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 77.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 78.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 79.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 80.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 81.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 82.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 83.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 84.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 85.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 86.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 87.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 88.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 89.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 90.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 91.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 92.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 93.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 94.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 95.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 96.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 97.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 98.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 99.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 100.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 101.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 102.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 103.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 104.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 105.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 106.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 107.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 108.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 109.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 110.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 111.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 112.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 113.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 114.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 115.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 116.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 117.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 118.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 119.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 120.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 121.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 122.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 123.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 124.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 125.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 126.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 127.92.88.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 148.110.185.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 149.110.185.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 150.110.185.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+zone 151.110.185.in-addr.arpa. {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
diff --git a/examples/tg19/dhcp/config/dhcpd4_voip.conf b/examples/tg19/dhcp/config/dhcpd4_voip.conf
new file mode 100644
index 0000000..daa08a7
--- /dev/null
+++ b/examples/tg19/dhcp/config/dhcpd4_voip.conf
@@ -0,0 +1,18 @@
+option space CiscoVOIP;
+option CiscoVOIP.cm-tftp-server code 150 = array of ip-address;
+
+class "cisco-voip-lan" {
+ match if substring (option vendor-class-identifier, 0, 28) = "Cisco Systems, Inc. IP Phone";
+ log( info, concat( "LOLOPHONE: " , option vendor-class-identifier ));
+ vendor-option-space CiscoVOIP;
+ option CiscoVOIP.cm-tftp-server <Removed>;
+ next-server Z;
+}
+
+class "cisco-voip-wlan" {
+ match if substring (option vendor-class-identifier, 0, 33) = "Cisco Systems Inc. Wireless Phone";
+ log( info, concat( "BANANAPHONE: " , option vendor-class-identifier ));
+ vendor-option-space CiscoVOIP;
+ option CiscoVOIP.cm-tftp-server <Removed>;
+ next-server <Removed>;
+}
diff --git a/examples/tg19/dhcp/config/dhcpd4_wlc.conf b/examples/tg19/dhcp/config/dhcpd4_wlc.conf
new file mode 100644
index 0000000..02fabf1
--- /dev/null
+++ b/examples/tg19/dhcp/config/dhcpd4_wlc.conf
@@ -0,0 +1,16 @@
+option space WLC;
+option WLC.controller-address code 43 = text;
+class "access-points" {
+ # Number of characters has to match the substring
+ # I.e if "Access Point", you have to use (0, 12)
+ match if substring (option vendor-class-identifier, 0, 12) = "Access Point";
+
+ if exists agent.circuit-id {
+ log( info, concat( "AP: ", hostmac, " - ", option vendor-class-identifier, " - ", option agent.circuit-id ));
+ } else {
+ log( info, concat( "AP: ", hostmac, " - ", option vendor-class-identifier ));
+ }
+
+ vendor-option-space WLC;
+ option WLC.controller-address "88.92.4.2";
+}
diff --git a/examples/tg19/dhcp/config/dhcpd6.conf b/examples/tg19/dhcp/config/dhcpd6.conf
new file mode 100644
index 0000000..cac67c0
--- /dev/null
+++ b/examples/tg19/dhcp/config/dhcpd6.conf
@@ -0,0 +1,56 @@
+# IPv6 address valid lifetime
+# (at the end the address is no longer usable by the client)
+# (usual IPv6 default is 30 days)
+default-lease-time 3600;
+
+# IPv6 address preferred lifetime
+# (at the end the address is deprecated, i.e., the client should use
+# other addresses for new connections)
+# (usual IPv6 default is 7 days)
+preferred-lifetime 3600;
+
+# T1, the delay before Renew
+# (default is 1/2 preferred lifetime)
+option dhcp-renewal-time 1800;
+
+# T2, the delay before Rebind (if Renews failed)
+# (default is 3/4 preferred lifetime)
+option dhcp-rebinding-time 1800;
+
+# Enable RFC 5007 support
+allow leasequery;
+
+# Set preference to 255 (maximum) in order to avoid waiting for
+# additional servers when there is only one
+option dhcp6.preference 255;
+
+# Server side command to enable rapid-commit (2 packet exchange)
+option dhcp6.rapid-commit;
+
+# The delay before information-request refresh
+# (minimum is 10 minutes, maximum one day, default is to not refresh)
+# (set to 6 hours)
+option dhcp6.info-refresh-time 21600;
+
+# Don't let clients set their own FQDN
+ignore client-updates;
+
+# disable ddns
+ddns-update-style none;
+
+# make server authorative
+authoritative;
+
+# Logging
+log-facility local6;
+
+# Options
+option dhcp6.domain-search "tg19.gathering.org";
+option dhcp6.name-servers 2a06:5841:a:104::126, 2a06:5841:a:103::62;
+
+# Tele server zone
+subnet6 2a06:5841:a:103::/64 {}
+
+include "/etc/dhcp/dhcpd_key.conf";
+include "/etc/dhcp/dhcpd-notify-v6.conf";
+include "/etc/dhcp/automatic_zones_v6.conf";
diff --git a/examples/tg19/dhcp/config/fap4.conf b/examples/tg19/dhcp/config/fap4.conf
new file mode 100644
index 0000000..45fe194
--- /dev/null
+++ b/examples/tg19/dhcp/config/fap4.conf
@@ -0,0 +1,48 @@
+# FAP DHCP-configuration
+# Define structure of option 43 ( Zero Touch Protocol options)
+option space ztp;
+option ztp.image-file-name code 0 = text;
+option ztp.config-file-name code 1 = text;
+option ztp.image-file-type code 2 = text;
+option ztp.transfer-mode code 3 = text;
+option ztp.alt-image-file-name code 4 = text;
+# define option 150 - TFTP server (used for defining HTTP server for option 43)
+option option-150 code 150 = { ip-address };
+# define option 60 - used for classifying ZTP clients ("vendor class identifier")
+option vendor-class-identifier code 60 = text;
+# only allow FAP "clients"
+class "fap-vendor-class" {
+ # Vendor-Class Option 60, length 21: "Juniper-ex2200-48t-4g"
+ # Vendor-Class Option 60, length 21: "Juniper-ex3300-48p"
+ match if substring(option vendor-class-identifier, 0, 10) = "Juniper-ex";
+ log( info, concat( "FAP: ", hostmac, " (", option host-name, ") - ", option agent.circuit-id, " - ", option vendor-class-identifier ));
+}
+class "fap-mac" {
+ # some Juniper switches won't send vendor-class-identifier
+ match if (
+ ( binary-to-ascii(16, 8, ":", substring(hardware, 1, 3)) = "44:f4:77" ) or
+ ( binary-to-ascii(16, 8, ":", substring(hardware, 1, 3)) = "f0:1c:2d" )
+ );
+ if not exists vendor-class-identifier {
+ log( info, concat( "FAP: ", hostmac, " (", option host-name, ") - ", option agent.circuit-id ));
+ }
+}
+group {
+ # No DDNS
+ ddns-updates off;
+ ddns-hostname = none;
+ ddns-domainname = none;
+ # set short leasetime, so that it times out while the switch rebooting
+ default-lease-time 120;
+ max-lease-time 120;
+ # ZTP Settings
+ vendor-option-space ztp;
+ option option-150 185.110.149.4;
+ option tftp-server-name "185.110.149.4";
+ option ztp.transfer-mode "http";
+ option ztp.config-file-name = concat("api/templates/magic.conf/a=", (option agent.circuit-id));
+ #option ztp.image-file-name "files/jinstall-ex-2200-14.1X53-D15.2-domestic-signed.tgz";
+ # Ranges from gondul
+ include "/etc/dhcp/automatic_zones_fap4.conf";
+
+}
diff --git a/examples/tg19/dhcp/gondul-lol b/examples/tg19/dhcp/gondul-lol
new file mode 100644
index 0000000..3400243
--- /dev/null
+++ b/examples/tg19/dhcp/gondul-lol
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+{
+ time /usr/local/sbin/Gondul-DHCP-Event-Collector $*
+} >>/tmp/lol.log 2>>/tmp/lol.err &
diff --git a/examples/tg19/dhcp/templates/dhcpd.conf b/examples/tg19/dhcp/templates/dhcpd.conf
new file mode 100644
index 0000000..e91d8b5
--- /dev/null
+++ b/examples/tg19/dhcp/templates/dhcpd.conf
@@ -0,0 +1,20 @@
+# Autogenerated dhcpd.conf from gondul
+
+{% for (network, n) in objects["read/networks"].networks|dictsort %}
+{% if n != None and n.subnet4 != None and n.vlan != 666 %}
+# {{network}}
+subnet {{ n.subnet4|networkId }} netmask {{ n.subnet4|netmask }} {
+ range {{ n.subnet4|getFirstDhcpIp }} {{ n.subnet4|getLastDhcpIp }};
+ option subnet-mask {{ n.subnet4|netmask }};
+ option routers {{ n.gw4 }};
+ option domain-name "{{network}}.tg19.gathering.org";
+ ddns-domainname "{{network}}.tg19.gathering.org";
+}
+
+zone {{network}}.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+{% endif %}
+{% endfor %}
diff --git a/examples/tg19/dhcp/templates/dhcpd6.conf b/examples/tg19/dhcp/templates/dhcpd6.conf
new file mode 100644
index 0000000..01bca44
--- /dev/null
+++ b/examples/tg19/dhcp/templates/dhcpd6.conf
@@ -0,0 +1,17 @@
+# Autogenerated dhcpd6.conf from gondul
+
+{% for (network, n) in objects["read/networks"].networks|dictsort %}
+{% if n != None and n.subnet6 != None %}
+# {{network}}
+subnet6 {{ n.subnet6|networkId }}/{{ n.subnet6|cidr }} {
+ range6 {{ n.subnet6|networkId }}1000 {{ n.subnet6|networkId }}9999;
+ option domain-name "{{network}}.tg19.gathering.org";
+}
+
+zone {{network}}.tg19.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+{% endif %}
+{% endfor %}
diff --git a/examples/tg19/dhcp/templates/fap_dhcp4.conf b/examples/tg19/dhcp/templates/fap_dhcp4.conf
new file mode 100644
index 0000000..548d921
--- /dev/null
+++ b/examples/tg19/dhcp/templates/fap_dhcp4.conf
@@ -0,0 +1,14 @@
+{% for (network, n) in objects["read/networks"].networks|dictsort %}{% if n != None and n.subnet4 != None and n.vlan == 666 %}
+# {{network}}
+subnet {{ n.subnet4|networkId }} netmask {{ n.subnet4|netmask }} {
+ option subnet-mask {{ n.subnet4|netmask }};
+ option routers {{ n.gw4 }};
+ pool {
+ range {{ n.subnet4|getFirstFapIP}} {{ n.subnet4|getLastDhcpIp }};
+ allow members of "fap-vendor-class";
+ allow members of "fap-mac";
+ }
+}
+
+{% endif %}
+{% endfor %} \ No newline at end of file
diff --git a/examples/tg19/dhcp/tools/make_dhcp.sh b/examples/tg19/dhcp/tools/make_dhcp.sh
new file mode 100755
index 0000000..4e33d0e
--- /dev/null
+++ b/examples/tg19/dhcp/tools/make_dhcp.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+curl --user tech:<Removed> https://gondul.tg19.gathering.org/api/templates/dhcpd.conf > /etc/dhcp/automatic_zones_v4.conf
+curl --user tech:<Removed> https://gondul.tg19.gathering.org/api/templates/dhcpd6.conf > /etc/dhcp/automatic_zones_v6.conf
+curl --user tech:<Removed> https://gondul.tg19.gathering.org/api/templates/fap_dhcp4.conf > /etc/dhcp/automatic_zones_fap4.conf
+
+/usr/sbin/dhcpd -4 -t -cf /etc/dhcp/dhcpd.conf
+if [ $? -eq 0 ]
+then
+ /usr/sbin/service isc-dhcp-server4 restart
+ if [ $? -eq 0 ]
+ then
+ echo "Restarted isc-dhcp-server4 success!"
+ else
+ echo "Failed to restart DHCPv4, panic!"
+ exit 1
+ fi
+else
+ echo "DHCPv4 failed! Not restarted"
+ exit 1
+fi
+/usr/sbin/dhcpd -6 -t -cf /etc/dhcp/dhcpd6.conf
+if [ $? -eq 0 ]
+then
+ /usr/sbin/service isc-dhcp-server6 restart
+ if [ $? -eq 0 ]
+ then
+ echo "Restarted isc-dhcp-server6 success!"
+ else
+ echo "Failed to restart DHCPv6, panic!"
+ exit 1
+ fi
+else
+ echo "DHCPv6 failed! Not restarted"
+ exit 1
+fi
diff --git a/examples/tg19/dns_auth/cozy/pdns.conf b/examples/tg19/dns_auth/cozy/pdns.conf
new file mode 100644
index 0000000..33e2a53
--- /dev/null
+++ b/examples/tg19/dns_auth/cozy/pdns.conf
@@ -0,0 +1,34 @@
+setgid=pdns
+setuid=pdns
+socket-dir=/var/run
+version-string=powerdns
+config-dir=/etc/powerdns
+include-dir=/etc/powerdns/pdns.d
+master=yes
+supermaster=yes
+enable-lua-records=yes
+
+# Listen address
+local-address=185.110.149.2,127.0.0.1
+local-ipv6=2a06:5841:a:103::2,::1
+local-port=53
+
+# Default SOA
+default-soa-name=ns1.infra.gathering.org
+default-soa-mail=tg19tech-net.gathering.org
+
+# API
+api=yes
+api-key=<SECRET>
+webserver=yes
+webserver-port=8081
+webserver-allow-from=127.0.0.1,::1
+
+# DNS UPDATE
+dnsupdate=yes
+allow-dnsupdate-from=127.0.0.1/32,::1/128
+forward-dnsupdate=no
+
+# AXFR
+disable-axfr=no
+allow-axfr-ips=127.0.0.1/32, 134.90.150.178/32, ::1/128, 2a02:20c8:1930::178/128
diff --git a/examples/tg19/dns_auth/huor/pdns.conf b/examples/tg19/dns_auth/huor/pdns.conf
new file mode 100644
index 0000000..ad1b44c
--- /dev/null
+++ b/examples/tg19/dns_auth/huor/pdns.conf
@@ -0,0 +1,34 @@
+setgid=pdns
+setuid=pdns
+socket-dir=/var/run
+version-string=powerdns
+config-dir=/etc/powerdns
+include-dir=/etc/powerdns/pdns.d
+slave=yes
+supermaster=yes
+enable-lua-records=yes
+
+# Listen address
+local-address=134.90.150.178,127.0.0.1
+local-ipv6=2A02:20C8:1930::178,::1
+local-port=53
+
+# Default SOA
+default-soa-name=ns1.infra.gathering.org
+default-soa-mail=tg19tech-net.gathering.org
+
+# API
+api=yes
+api-key=<SECRET>
+webserver=yes
+webserver-port=8081
+webserver-allow-from=127.0.0.1,::1
+
+# DNS UPDATE
+dnsupdate=no
+allow-dnsupdate-from=127.0.0.1/32,::1/128
+forward-dnsupdate=yes
+
+# AXFR
+disable-axfr=no
+allow-axfr-ips=127.0.0.1/32,185.110.149.2/32,37.191.191.134/32,::1/128,2a06:5841:a:103::2/128
diff --git a/examples/tg19/dns_auth/tools/config.ini b/examples/tg19/dns_auth/tools/config.ini
new file mode 100644
index 0000000..b32aed8
--- /dev/null
+++ b/examples/tg19/dns_auth/tools/config.ini
@@ -0,0 +1,20 @@
+[EVENT]
+name = The Gathering 2019
+short = tg19
+domain = tg19.gathering.org
+lol_domain = tg.lol
+netbox_url = https://netbox.infra.gathering.org
+netbox_api_key = <REMOVED>
+
+[DNS]
+pri_ipv4 = 88.92.18.2
+pri_ipv6 = 2a06:5841:a:103::2
+sec_ipv4 = 134.90.150.178
+sec_ipv6 = 2a02:20c8:1930::178
+
+api_url = http://localhost:8081/api/v1
+api_key = <REMOVED>
+
+[DHCP]
+pri_ipv4 = 88.92.18.2
+pri_ipv6 = 2a06:5841:a:103::2
diff --git a/examples/tg19/dns_auth/tools/make_dns_gondul.py b/examples/tg19/dns_auth/tools/make_dns_gondul.py
new file mode 100644
index 0000000..ad9fa57
--- /dev/null
+++ b/examples/tg19/dns_auth/tools/make_dns_gondul.py
@@ -0,0 +1,81 @@
+#!/usr/bin/env python
+
+import json
+import requests
+import os
+from requests.auth import HTTPBasicAuth
+from pdns import PowerDNS
+
+import configparser
+import netaddr
+
+config = configparser.ConfigParser()
+config.read('config.ini')
+
+# TODO read from config.ini
+GONDUL_URL = 'https://gondul.tg19.gathering.org'
+GONDUL_USER = 'tech'
+GONDUL_PASSWORD = '<Removed>'
+nameservers = ['ns1.infra.gathering.org.', 'ns2.infra.gathering.org.']
+
+
+pdns = PowerDNS(config['DNS']['api_url'], config['DNS']['api_key'])
+
+# Load all zones to later check if a zone already exist
+zones = []
+pdns_zones = pdns.list_zones()
+for zone in pdns_zones:
+ zones.append(zone['name'])
+
+r = requests.get('{}/api/read/networks'.format(GONDUL_URL), auth=HTTPBasicAuth(GONDUL_USER, GONDUL_PASSWORD))
+
+networks = r.json()['networks']
+
+for network in networks:
+ zone = '{}.tg19.gathering.org.'.format(network)
+ if zone not in zones:
+ pdns.create_zone(zone, nameservers)
+ pdns.create_zone_metadata(zone, 'TSIG-ALLOW-DNSUPDATE', 'dhcp_updater')
+ record = {'content': networks[network]['gw4'], 'disabled': False, 'type':'A', 'set-ptr': True}
+ rrset4 = {'name': 'gw.{}'.format(zone), 'changetype': 'replace', 'type':'A', 'records': [record], 'ttl': 900}
+ record = {'content': networks[network]['gw6'], 'disabled': False, 'type':'AAAA', 'set-ptr': True}
+ rrset6 = {'name': 'gw.{}'.format(zone), 'changetype': 'replace', 'type':'AAAA', 'records': [record], 'ttl': 900}
+ print(pdns.set_zone_records(zone, [rrset4, rrset6]))
+
+
+r = requests.get('{}/api/read/switches-management'.format(GONDUL_URL), auth=HTTPBasicAuth(GONDUL_USER, GONDUL_PASSWORD))
+
+switches = r.json()['switches']
+
+main_zone = 'tg19.gathering.org.'
+
+lol_rrsets = []
+
+for switch in switches:
+ rrsets = []
+ zone = '{}.{}'.format(switch, main_zone)
+ name = zone
+ if zone not in zones:
+ zone = main_zone
+ name = '{}.{}'.format(switch, zone)
+
+ if switches[switch]['mgmt_v4_addr'] is not None and switches[switch]['mgmt_v4_addr'] != '':
+ record = {'content': switches[switch]['mgmt_v4_addr'], 'disabled': False, 'type':'A', 'set-ptr': True}
+ rrsets.append({'name': name, 'changetype': 'replace', 'type':'A', 'records': [record], 'ttl': 900})
+ if switches[switch]['mgmt_v6_addr'] is not None and switches[switch]['mgmt_v6_addr'] != '':
+ record = {'content': switches[switch]['mgmt_v6_addr'], 'disabled': False, 'type':'AAAA', 'set-ptr': True}
+ rrsets.append({'name': name, 'changetype': 'replace', 'type':'AAAA', 'records': [record], 'ttl': 900})
+ print(pdns.set_zone_records(zone, rrsets).text)
+ print(zone, rrsets)
+
+ zone = 'tg.lol.'
+ name = '{}.{}'.format(switch, zone)
+ if switches[switch]['mgmt_v4_addr'] is not None and switches[switch]['mgmt_v4_addr'] != '':
+ record = {'content': switches[switch]['mgmt_v4_addr'], 'disabled': False, 'type':'A'}
+ lol_rrsets.append({'name': name, 'changetype': 'replace', 'type':'A', 'records': [record], 'ttl': 900})
+ if switches[switch]['mgmt_v6_addr'] is not None and switches[switch]['mgmt_v6_addr'] != '':
+ record = {'content': switches[switch]['mgmt_v6_addr'], 'disabled': False, 'type':'AAAA'}
+ lol_rrsets.append({'name': name, 'changetype': 'replace', 'type':'AAAA', 'records': [record], 'ttl': 900})
+
+print(lol_rrsets)
+print(pdns.set_zone_records('tg.lol.', lol_rrsets).text)
diff --git a/examples/tg19/dns_auth/tools/make_dns_netbox.py b/examples/tg19/dns_auth/tools/make_dns_netbox.py
new file mode 100644
index 0000000..9e99544
--- /dev/null
+++ b/examples/tg19/dns_auth/tools/make_dns_netbox.py
@@ -0,0 +1,20 @@
+import pynetbox
+from pdns import PowerDNS
+import configparser
+import netaddr
+
+config = configparser.ConfigParser()
+config.read('config.ini')
+
+nb = pynetbox.api(config['EVENT']['netbox_url'], token=config['EVENT']['netbox_api_key'])
+pdns = PowerDNS(config['DNS']['api_url'], config['DNS']['api_key'])
+
+#devices = nb.dcim.devices.all()
+#for device in devices:
+# if device.site.name == 'Floor':
+# continue
+# pdns.create_netbox_device_record(device, config['EVENT']['domain'], config['EVENT']['lol_domain'])
+
+vms = nb.virtualization.virtual_machines.all()
+for vm in vms:
+ pdns.create_netbox_device_record(vm, config['EVENT']['domain'], config['EVENT']['lol_domain'])
diff --git a/examples/tg19/dns_auth/tools/make_reverse_zones.py b/examples/tg19/dns_auth/tools/make_reverse_zones.py
new file mode 100755
index 0000000..ec05ec0
--- /dev/null
+++ b/examples/tg19/dns_auth/tools/make_reverse_zones.py
@@ -0,0 +1,76 @@
+#!/usr/bin/python3
+
+import argparse
+import ipaddress
+import re
+import json
+
+from pdns import PowerDNS
+
+def main():
+ parser = argparse.ArgumentParser(description='Make reverse zones')
+ parser.add_argument('--key', help='PowerDNS Web API key', required=True)
+ parser.add_argument('--host', help='PowerDNS Web API url. Default: http://127.0.0.1:8081/api/v1', default='http://127.0.0.1:8081/api/v1')
+ parser.add_argument('nets', nargs='*', help="Example: ./make_reverse_zones.py --key PDNSAPIKEY 2a06:5840::/29 185.110.148.0/22 88.92.0.0/17")
+ args = parser.parse_args()
+
+ nameservers = ['ns1.infra.gathering.org.', 'ns2.infra.gathering.org.']
+
+ # Connect to powerdns api
+ pdns = PowerDNS(args.host,args.key)
+
+ if len(args.nets) < 1:
+ print("Argument with block is required. Example: ./make_reverse_zones.py 2a06:5840::/29 185.110.148.0/22 88.92.0.0/17")
+ exit(1)
+
+ # Load all zones to later check if a zone already exist.
+ zones = []
+ pdns_zones = pdns.list_zones()
+ for zone in pdns_zones:
+ zones.append(zone['name'])
+
+ # Loop all nets in args
+ for net in args.nets:
+ block = ipaddress.ip_network(net)
+
+ # IPv4 - Split the network up in /24 blocks
+ if block.version == 4 and block.prefixlen <= 24:
+ blocks = list(block.subnets(new_prefix=24))
+ for bl in blocks:
+ net_id = ipaddress.ip_network(bl).network_address
+ p = re.compile('(.*)\.(.*)\.(.*)\.(.*)')
+ m = p.match(str(net_id))
+ ip4_arpa = '{}.{}.{}.in-addr.arpa.'.format(m.group(3),m.group(2),m.group(1))
+ if ip4_arpa not in zones:
+ print("Creating zone {}".format(ip4_arpa))
+ pdns.create_zone(ip4_arpa, nameservers)
+ else:
+ print(pdns.get_zone_metadata(ip4_arpa))
+ pdns.create_zone_metadata(ip4_arpa, 'TSIG-ALLOW-DNSUPDATE', 'dhcpdupdate')
+ #print("{} already exists, skipping.".format(ip4_arpa))
+
+ elif block.version == 4:
+ print("{} can't be smaller then /24 (bigger number)".format(net))
+ exit(1)
+
+ # IPv6 - Split the network up in /32 blocks
+ if block.version == 6 and block.prefixlen <= 32:
+ blocks = list(block.subnets(new_prefix=32))
+ for bl in blocks:
+ reverse = ipaddress.ip_network((bl)[0]).reverse_pointer
+ # Hardcoded to /32, will need to be modified if we need smaller nets then /32 (bigger number)
+ p = re.compile('8\.2\.1\.\/\.(0\.0\.0\.0\.0\.0\.0\.0\.0\.0\.0\.0\.0\.0\.0\.0\.0\.0\.0\.0\.0\.0\.0\.0\.)(.*ip6.arpa)$')
+ m = p.match(str(reverse))
+ ip6_arpa = '{}.'.format(m.group(2))
+ if ip6_arpa not in zones:
+ print("Creating zone {}".format(ip6_arpa))
+ pdns.create_zone(ip6_arpa, nameservers)
+ else:
+ print(pdns.get_zone_metadata(ip6_arpa))
+ pdns.create_zone_metadata(ip6_arpa, 'TSIG-ALLOW-DNSUPDATE', 'dhcpdupdate')
+ elif block.version == 6:
+ print("{} can't be smaller then /32 (bigger number)".format(net))
+ exit(1)
+
+if __name__ == "__main__":
+ main()
diff --git a/examples/tg19/dns_auth/tools/notify-all.sh b/examples/tg19/dns_auth/tools/notify-all.sh
new file mode 100644
index 0000000..6b878ac
--- /dev/null
+++ b/examples/tg19/dns_auth/tools/notify-all.sh
@@ -0,0 +1,3 @@
+for zone in $(pdnsutil list-all-zones); do
+ pdns_control notify $zone
+done
diff --git a/examples/tg19/dns_auth/tools/pdns.py b/examples/tg19/dns_auth/tools/pdns.py
new file mode 100644
index 0000000..dbe7f18
--- /dev/null
+++ b/examples/tg19/dns_auth/tools/pdns.py
@@ -0,0 +1,119 @@
+import requests
+import json
+import re
+import netaddr
+
+class PowerDNS:
+ def __init__(self, base_url, apikey, server = 'localhost'):
+ self.base_url = base_url
+ self.apikey = apikey
+ self.server = server
+
+ def _query(self, uri, method, kwargs = None):
+ headers = {
+ 'X-API-Key': self.apikey,
+ 'Accept': 'application/json'
+ }
+
+ if method == "GET":
+ request = requests.get(self.base_url+uri, headers=headers)
+ elif method == "POST":
+ request = requests.post(self.base_url+uri, headers=headers, json=kwargs)
+ elif method == "PUT":
+ request = requests.put(self.base_url+uri, headers=headers, json=kwargs)
+ elif method == "PATCH":
+ request = requests.patch(self.base_url+uri, headers=headers, json=kwargs)
+ elif method == "DELETE":
+ request = requests.delete(self.base_url+uri, headers=headers)
+
+ return request
+
+ def list_zones(self):
+ return self._query("/servers/%s/zones" % (self.server), "GET").json()
+
+ def get_zone(self, domain):
+ return self._query("/servers/%s/zones/%s" % (self.server, domain), "GET").json()
+
+ def get_zone_metadata(self, domain):
+ return self._query("/servers/%s/zones/%s/metadata" % (self.server, domain), "GET").json()
+
+ def create_zone_metadata(self, domain, kind, content):
+ return self._query("/servers/%s/zones/%s/metadata" % (self.server, domain), "POST", {
+ 'kind': kind,
+ 'metadata': [content]
+ })
+
+ def create_zone(self, domain, nameservers, kind = 'Master'):
+ return self._query("/servers/%s/zones" % (self.server), "POST", {
+ 'kind': kind,
+ 'nameservers': nameservers,
+ 'name': domain
+ })
+
+ def delete_zone(self, domain):
+ return self._query("/servers/%s/zones/%s." % (self.server, domain), "DELETE")
+
+ def set_zone_records(self, domain, rrsets):
+ """
+ changetype Must be REPLACE or DELETE.
+ With DELETE, all existing RRs matching name and type will be deleted, incl. all comments.
+ With REPLACE: when records is present, all existing RRs matching name and type will be deleted, and then new records given in records will be created.
+ If no records are left, any existing comments will be deleted as well.
+ When comments is present, all existing comments for the RRs matching name and type will be deleted, and then new comments given in comments will be created.
+ rrsets example:
+ [{
+ 'type': 'A',
+ 'name': 'mail.example.com',
+ 'changetype': 'delete'
+ },
+ {
+ 'type': 'MX',
+ 'name': 'example.com',
+ 'changetype': 'replace',
+ 'records': [{'content': '0 example.com',
+ 'disabled': False,
+ 'name': 'example.com',
+ 'ttl': 600,
+ 'type': 'MX'}],
+ }]
+ """
+ return self._query("/servers/%s/zones/%s" % (self.server, domain), "PATCH", {
+ 'rrsets': rrsets
+ })
+
+ def create_netbox_device_record(self, device, zone, lol_zone = None):
+ r = re.search('^([A-Za-z1-9]*)\.([A-Za-z1-9]*)$', device.name)
+ if r is not None:
+ device_name = r.group(1)
+ zone = "{}.{}.".format(r.group(2), zone)
+ lol_zone = "{}.{}.".format(r.group(2), lol_zone)
+ elif re.search('^([A-Za-z1-9]*) \(([A-Za-z1-9 -\/]*)\)', device.name) is not None:
+ zone = "{}.".format(zone)
+ lol_zone = "{}.".format(lol_zone)
+ device_name = re.search('^([A-Za-z1-9]*) \(([A-Za-z1-9 -\/]*)\)', device.name).group(1)
+ else:
+ zone = "{}.".format(zone)
+ lol_zone = "{}.".format(lol_zone)
+ device_name = device.name
+ fqdn = "{}.{}".format(device_name, zone)
+ lol_fqdn = "{}.{}".format(device_name, lol_zone)
+
+ if device.primary_ip4 is not None:
+ record = {'content': str(netaddr.IPNetwork(str(device.primary_ip4)).ip), 'disabled': False, 'type':'A', 'set-ptr': True}
+ rrset = {'name': fqdn, 'changetype': 'replace', 'type':'A', 'records': [record], 'ttl': 900}
+ print(self.set_zone_records(zone, [rrset]))
+ print(rrset)
+ if lol_zone is not None:
+ record = {'content': str(netaddr.IPNetwork(str(device.primary_ip4)).ip), 'disabled': False, 'type':'A'}
+ rrset = {'name': lol_fqdn, 'changetype': 'replace', 'type':'A', 'records': [record], 'ttl': 900}
+ print(self.set_zone_records(lol_zone, [rrset]).text)
+
+ if device.primary_ip6 is not None:
+ record = {'content': str(netaddr.IPNetwork(str(device.primary_ip6)).ip), 'disabled': False, 'type':'AAAA', 'set-ptr': True}
+ rrset = {'name': fqdn, 'changetype': 'replace', 'type':'AAAA', 'records': [record], 'ttl': 900}
+ print(self.set_zone_records(zone, [rrset]))
+ print(rrset)
+ if lol_zone is not None:
+ record = {'content': str(netaddr.IPNetwork(str(device.primary_ip6)).ip), 'disabled': False, 'type':'AAAA'}
+ rrset = {'name': lol_fqdn, 'changetype': 'replace', 'type':'AAAA', 'records': [record], 'ttl': 900}
+ print(self.set_zone_records(lol_zone, [rrset]))
diff --git a/examples/tg19/gondul-public-dashboard.json b/examples/tg19/gondul-public-dashboard.json
new file mode 100644
index 0000000..03c5ef9
--- /dev/null
+++ b/examples/tg19/gondul-public-dashboard.json
@@ -0,0 +1,2276 @@
+{
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": "-- Grafana --",
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "type": "dashboard"
+ }
+ ]
+ },
+ "editable": true,
+ "gnetId": null,
+ "graphTooltip": 0,
+ "id": 1,
+ "links": [],
+ "panels": [
+ {
+ "content": "<div style=\"height: 100%; margin-top: auto; margin-bottom: auto';\"><span style='text-align: center; margin-top: auto; margin-bottom: auto';><img src=\"https://stats.geekevents.org/tg16_logo.svg\" style=\"height: 100%; object-fit: contain; margin-top: auto; margin-bottom: auto';\" alt=\"TG-logo\"></span></div>",
+ "gridPos": {
+ "h": 6,
+ "w": 9,
+ "x": 0,
+ "y": 0
+ },
+ "id": 2,
+ "links": [],
+ "mode": "html",
+ "span": 4,
+ "title": "",
+ "transparent": true,
+ "type": "text"
+ },
+ {
+ "aliasColors": {
+ "IPv4": "green",
+ "IPv6": "blue"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Telegraf",
+ "fill": 2,
+ "gridPos": {
+ "h": 6,
+ "w": 9,
+ "x": 9,
+ "y": 0
+ },
+ "id": 4,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "hideZero": false,
+ "max": true,
+ "min": true,
+ "rightSide": false,
+ "show": false,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "null",
+ "paceLength": 10,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "IPv4",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "ping",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "average_response_ms"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "url",
+ "operator": "=",
+ "value": "ipv4.ccnp.no"
+ }
+ ]
+ },
+ {
+ "alias": "IPv6",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "ping",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "refId": "B",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "average_response_ms"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "url",
+ "operator": "=",
+ "value": "ipv6.ccnp.no"
+ }
+ ]
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Ping Interwebz",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "transparent": true,
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "ms",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorPostfix": false,
+ "colorPrefix": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Gondul-Influx",
+ "format": "bps",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 3,
+ "x": 18,
+ "y": 0
+ },
+ "id": 8,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "alias": "",
+ "groupBy": [
+ {
+ "params": [
+ "15s"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "hide": false,
+ "measurement": "ports",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT non_negative_derivative(mean(\"ifHCInOctets\"), 1s) *8 FROM \"ports\" WHERE (\"switch\" = 'nocgw' AND \"interface\" = 'xe-0/1/3') AND $timeFilter GROUP BY time($__interval) fill(null)",
+ "rawQuery": false,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "ifHCInOctets"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "last"
+ },
+ {
+ "params": [
+ "1s"
+ ],
+ "type": "non_negative_derivative"
+ },
+ {
+ "params": [
+ "*8"
+ ],
+ "type": "math"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "switch",
+ "operator": "=",
+ "value": "r1.tele"
+ },
+ {
+ "condition": "AND",
+ "key": "interface",
+ "operator": "=",
+ "value": "ae0"
+ }
+ ]
+ }
+ ],
+ "thresholds": "",
+ "title": "Current Download",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorPrefix": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "#508642",
+ "#0a50a1"
+ ],
+ "datasource": "Gondul-Influx",
+ "format": "bytes",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 3,
+ "x": 21,
+ "y": 0
+ },
+ "hideTimeOverride": true,
+ "id": 12,
+ "interval": "",
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "ifHCInOctets",
+ "targets": [
+ {
+ "groupBy": [],
+ "hide": false,
+ "measurement": "ports",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT mean(“value”) AS “traffic_in” FROM “interface.traffic” WHERE “host” = ‘MyHost’ AND “namecache” =~ /Traffic - 1/0/15/ AND “type” = ‘traffic_in’ AND timeFilter GROUP BY time(__interval) fill(none)",
+ "rawQuery": false,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "ifHCInOctets"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "last"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "switch",
+ "operator": "=",
+ "value": "r1.tele"
+ },
+ {
+ "condition": "AND",
+ "key": "interface",
+ "operator": "=",
+ "value": "ae0"
+ }
+ ]
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "title": "Total Download",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "rgba(237, 129, 40, 0.89)",
+ "#d44a3a"
+ ],
+ "datasource": "Gondul-Influx",
+ "format": "bps",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 3,
+ "x": 18,
+ "y": 4
+ },
+ "id": 10,
+ "interval": "",
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "",
+ "targets": [
+ {
+ "alias": "",
+ "groupBy": [
+ {
+ "params": [
+ "15s"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "hide": false,
+ "measurement": "ports",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "ifHCOutOctets"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "last"
+ },
+ {
+ "params": [
+ "1s"
+ ],
+ "type": "non_negative_derivative"
+ },
+ {
+ "params": [
+ "*8"
+ ],
+ "type": "math"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "switch",
+ "operator": "=",
+ "value": "r1.tele"
+ },
+ {
+ "condition": "AND",
+ "key": "interface",
+ "operator": "=",
+ "value": "ae0"
+ }
+ ]
+ }
+ ],
+ "thresholds": "",
+ "title": "Current Upload",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorPrefix": false,
+ "colorValue": true,
+ "colors": [
+ "#d44a3a",
+ "#508642",
+ "#0a50a1"
+ ],
+ "datasource": "Gondul-Influx",
+ "format": "bytes",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 3,
+ "x": 21,
+ "y": 4
+ },
+ "id": 14,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(31, 118, 189, 0.18)",
+ "full": false,
+ "lineColor": "rgb(31, 120, 193)",
+ "show": false
+ },
+ "tableColumn": "sum",
+ "targets": [
+ {
+ "groupBy": [],
+ "hide": false,
+ "measurement": "ports",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "SELECT mean(“value”) AS “traffic_in” FROM “interface.traffic” WHERE “host” = ‘MyHost’ AND “namecache” =~ /Traffic - 1/0/15/ AND “type” = ‘traffic_in’ AND timeFilter GROUP BY time(__interval) fill(none)",
+ "rawQuery": false,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "ifHCOutOctets"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "switch",
+ "operator": "=",
+ "value": "r1.tele"
+ },
+ {
+ "condition": "AND",
+ "key": "interface",
+ "operator": "=",
+ "value": "ae0"
+ }
+ ]
+ }
+ ],
+ "thresholds": "",
+ "title": "Total Upload",
+ "type": "singlestat",
+ "valueFontSize": "80%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "aliasColors": {
+ "Download": "green",
+ "Upload": "blue"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Gondul-Influx",
+ "fill": 2,
+ "gridPos": {
+ "h": 10,
+ "w": 18,
+ "x": 0,
+ "y": 6
+ },
+ "id": 6,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "max": true,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "null",
+ "paceLength": 10,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "Download"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "Download",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "ports",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "ifHCInOctets"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ },
+ {
+ "params": [
+ "1s"
+ ],
+ "type": "non_negative_derivative"
+ },
+ {
+ "params": [
+ 10
+ ],
+ "type": "moving_average"
+ },
+ {
+ "params": [
+ "*8"
+ ],
+ "type": "math"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "switch",
+ "operator": "=",
+ "value": "r1.tele"
+ },
+ {
+ "condition": "AND",
+ "key": "interface",
+ "operator": "=",
+ "value": "ae0"
+ }
+ ]
+ },
+ {
+ "alias": "Upload",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "ports",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "refId": "B",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "ifHCOutOctets"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ },
+ {
+ "params": [
+ "1s"
+ ],
+ "type": "non_negative_derivative"
+ },
+ {
+ "params": [
+ 10
+ ],
+ "type": "moving_average"
+ },
+ {
+ "params": [
+ "* 8"
+ ],
+ "type": "math"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "switch",
+ "operator": "=",
+ "value": "r1.tele"
+ },
+ {
+ "condition": "AND",
+ "key": "interface",
+ "operator": "=",
+ "value": "ae0"
+ }
+ ]
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Interwebz",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "transparent": true,
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "IPv4": "#56A64B",
+ "IPv6": "#C4162A"
+ },
+ "breakPoint": "50%",
+ "cacheTimeout": null,
+ "combine": {
+ "label": "Others",
+ "threshold": 0
+ },
+ "datasource": "Telegraf",
+ "decimals": 0,
+ "fontSize": "120%",
+ "format": "short",
+ "gridPos": {
+ "h": 8,
+ "w": 6,
+ "x": 18,
+ "y": 8
+ },
+ "id": 22,
+ "interval": null,
+ "legend": {
+ "header": "",
+ "percentage": true,
+ "percentageDecimals": 0,
+ "show": true,
+ "values": true
+ },
+ "legendType": "On graph",
+ "links": [],
+ "maxDataPoints": 3,
+ "nullPointMode": "connected",
+ "pieType": "donut",
+ "strokeWidth": "5",
+ "targets": [
+ {
+ "alias": "IPv4",
+ "groupBy": [],
+ "measurement": "dhcp-summary",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "v4_used"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": []
+ },
+ {
+ "alias": "IPv6",
+ "groupBy": [],
+ "measurement": "dhcp-summary",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "refId": "B",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "v6_used"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": []
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "DHCP v4 VS v6",
+ "type": "grafana-piechart-panel",
+ "valueName": "current"
+ },
+ {
+ "aliasColors": {
+ "IPv6": "semi-dark-blue"
+ },
+ "bars": false,
+ "cacheTimeout": null,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Telegraf",
+ "decimals": 0,
+ "fill": 2,
+ "gridPos": {
+ "h": 10,
+ "w": 16,
+ "x": 0,
+ "y": 16
+ },
+ "id": 16,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": false,
+ "max": true,
+ "min": true,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "null",
+ "paceLength": 10,
+ "percentage": false,
+ "pointradius": 2,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {},
+ {
+ "alias": "IPv6",
+ "yaxis": 1
+ },
+ {
+ "alias": "IPv4",
+ "yaxis": 1
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "IPv4",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "none"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "dhcp-summary",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "v4_used"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": []
+ },
+ {
+ "alias": "IPv6",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "none"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "dhcp-summary",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "refId": "B",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "v6_used"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": []
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "DHCP Leases",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "transparent": true,
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": "0",
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorPostfix": false,
+ "colorPrefix": true,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "#56A64B",
+ "#d44a3a"
+ ],
+ "datasource": "Telegraf",
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 5,
+ "x": 16,
+ "y": 16
+ },
+ "id": 18,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(86, 166, 75, 0.32)",
+ "full": true,
+ "lineColor": "#37872D",
+ "show": true
+ },
+ "tableColumn": "v4_used",
+ "targets": [
+ {
+ "alias": "IPv4",
+ "groupBy": [],
+ "measurement": "dhcp-summary",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "v4_used"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": []
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Active IPv4 Leases",
+ "type": "singlestat",
+ "valueFontSize": "200%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "datasource": "PostgreSQL",
+ "gridPos": {
+ "h": 5,
+ "w": 3,
+ "x": 21,
+ "y": 16
+ },
+ "id": 24,
+ "links": [],
+ "options": {
+ "maxValue": "6000",
+ "minValue": 0,
+ "orientation": "auto",
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true,
+ "thresholds": [
+ {
+ "color": "#56A64B",
+ "index": 0,
+ "value": null
+ },
+ {
+ "color": "red",
+ "index": 1,
+ "value": 2000
+ }
+ ],
+ "valueMappings": [],
+ "valueOptions": {
+ "decimals": null,
+ "prefix": "",
+ "stat": "max",
+ "suffix": "",
+ "unit": "none"
+ }
+ },
+ "pluginVersion": "6.1.2",
+ "targets": [
+ {
+ "format": "table",
+ "group": [],
+ "metricColumn": "none",
+ "rawQuery": true,
+ "rawSql": "select count(distinct data->>'clientmac') from metrics;",
+ "refId": "A",
+ "select": [
+ [
+ {
+ "params": [
+ "latency1_ms"
+ ],
+ "type": "column"
+ }
+ ]
+ ],
+ "table": "metrics",
+ "timeColumn": "\"time\"",
+ "timeColumnType": "timestamptz",
+ "where": [
+ {
+ "name": "$__timeFilter",
+ "params": [],
+ "type": "macro"
+ }
+ ]
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Total MAC's Seen",
+ "type": "gauge"
+ },
+ {
+ "cacheTimeout": null,
+ "colorBackground": false,
+ "colorValue": true,
+ "colors": [
+ "#299c46",
+ "#C4162A",
+ "#d44a3a"
+ ],
+ "datasource": "Telegraf",
+ "format": "none",
+ "gauge": {
+ "maxValue": 100,
+ "minValue": 0,
+ "show": false,
+ "thresholdLabels": false,
+ "thresholdMarkers": true
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 5,
+ "x": 16,
+ "y": 21
+ },
+ "id": 20,
+ "interval": null,
+ "links": [],
+ "mappingType": 1,
+ "mappingTypes": [
+ {
+ "name": "value to text",
+ "value": 1
+ },
+ {
+ "name": "range to text",
+ "value": 2
+ }
+ ],
+ "maxDataPoints": 100,
+ "nullPointMode": "connected",
+ "nullText": null,
+ "postfix": "",
+ "postfixFontSize": "50%",
+ "prefix": "",
+ "prefixFontSize": "50%",
+ "rangeMaps": [
+ {
+ "from": "null",
+ "text": "N/A",
+ "to": "null"
+ }
+ ],
+ "sparkline": {
+ "fillColor": "rgba(224, 47, 68, 0.31)",
+ "full": true,
+ "lineColor": "#C4162A",
+ "show": true
+ },
+ "tableColumn": "v4_used",
+ "targets": [
+ {
+ "alias": "IPv4",
+ "groupBy": [],
+ "measurement": "dhcp-summary",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "v6_used"
+ ],
+ "type": "field"
+ }
+ ]
+ ],
+ "tags": []
+ }
+ ],
+ "thresholds": "",
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Active IPv6 Leases",
+ "type": "singlestat",
+ "valueFontSize": "200%",
+ "valueMaps": [
+ {
+ "op": "=",
+ "text": "N/A",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "cacheTimeout": null,
+ "datasource": "PostgreSQL",
+ "gridPos": {
+ "h": 5,
+ "w": 3,
+ "x": 21,
+ "y": 21
+ },
+ "id": 25,
+ "links": [],
+ "options": {
+ "maxValue": "500",
+ "minValue": 0,
+ "orientation": "auto",
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true,
+ "thresholds": [
+ {
+ "color": "#56A64B",
+ "index": 0,
+ "value": null
+ },
+ {
+ "color": "red",
+ "index": 1,
+ "value": 80
+ }
+ ],
+ "valueMappings": [],
+ "valueOptions": {
+ "decimals": null,
+ "prefix": "",
+ "stat": "max",
+ "suffix": "",
+ "unit": "none"
+ }
+ },
+ "pluginVersion": "6.1.2",
+ "targets": [
+ {
+ "format": "table",
+ "group": [],
+ "metricColumn": "none",
+ "rawQuery": true,
+ "rawSql": "select count(distinct data->>'clientmac') from metrics WHERE time > NOW() - INTERVAL '15 minutes';",
+ "refId": "A",
+ "select": [
+ [
+ {
+ "params": [
+ "latency1_ms"
+ ],
+ "type": "column"
+ }
+ ]
+ ],
+ "table": "metrics",
+ "timeColumn": "\"time\"",
+ "timeColumnType": "timestamptz",
+ "where": [
+ {
+ "name": "$__timeFilter",
+ "params": [],
+ "type": "macro"
+ }
+ ]
+ }
+ ],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "Unique MAC's last 15m",
+ "type": "gauge"
+ },
+ {
+ "aliasColors": {
+ "Download": "green",
+ "Upload": "blue"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Gondul-Influx",
+ "fill": 2,
+ "gridPos": {
+ "h": 10,
+ "w": 16,
+ "x": 0,
+ "y": 26
+ },
+ "id": 26,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "max": true,
+ "min": false,
+ "show": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "null",
+ "paceLength": 10,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "Download"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "Download",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "ports",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "ifHCInOctets"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ },
+ {
+ "params": [
+ "1s"
+ ],
+ "type": "non_negative_derivative"
+ },
+ {
+ "params": [
+ 10
+ ],
+ "type": "moving_average"
+ },
+ {
+ "params": [
+ "*8"
+ ],
+ "type": "math"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "switch",
+ "operator": "=",
+ "value": "r1.stand"
+ },
+ {
+ "condition": "AND",
+ "key": "interface",
+ "operator": "=",
+ "value": "xe-0/0/5"
+ }
+ ]
+ },
+ {
+ "alias": "Upload",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "ports",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "refId": "B",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "ifHCOutOctets"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ },
+ {
+ "params": [
+ "1s"
+ ],
+ "type": "non_negative_derivative"
+ },
+ {
+ "params": [
+ 10
+ ],
+ "type": "moving_average"
+ },
+ {
+ "params": [
+ "* 8"
+ ],
+ "type": "math"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "switch",
+ "operator": "=",
+ "value": "r1.stand"
+ },
+ {
+ "condition": "AND",
+ "key": "interface",
+ "operator": "=",
+ "value": "xe-2/0/5"
+ }
+ ]
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "WLC Traffic",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "transparent": true,
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Download": "green",
+ "Upload": "blue"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Gondul-Influx",
+ "fill": 2,
+ "gridPos": {
+ "h": 9,
+ "w": 24,
+ "x": 0,
+ "y": 36
+ },
+ "id": 27,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "max": true,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sort": "max",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "null",
+ "paceLength": 10,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.* Upload/",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "$tag_switch Download",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "switch"
+ ],
+ "type": "tag"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "ports",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "",
+ "rawQuery": false,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "ifHCInOctets"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ },
+ {
+ "params": [
+ "1s"
+ ],
+ "type": "non_negative_derivative"
+ },
+ {
+ "params": [
+ "40"
+ ],
+ "type": "moving_average"
+ },
+ {
+ "params": [
+ "*8"
+ ],
+ "type": "math"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "interface",
+ "operator": "=",
+ "value": "ae0"
+ },
+ {
+ "condition": "AND",
+ "key": "switch",
+ "operator": "=~",
+ "value": "/^e.*/"
+ }
+ ]
+ },
+ {
+ "alias": "$tag_switch Upload",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "switch"
+ ],
+ "type": "tag"
+ },
+ {
+ "params": [
+ "null"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "ports",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "refId": "B",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "ifHCOutOctets"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ },
+ {
+ "params": [
+ "1s"
+ ],
+ "type": "non_negative_derivative"
+ },
+ {
+ "params": [
+ "40"
+ ],
+ "type": "moving_average"
+ },
+ {
+ "params": [
+ "* 8"
+ ],
+ "type": "math"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "interface",
+ "operator": "=",
+ "value": "ae0"
+ },
+ {
+ "condition": "AND",
+ "key": "switch",
+ "operator": "=~",
+ "value": "/^e.*/"
+ }
+ ]
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Top Switch",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "transparent": true,
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {
+ "Download": "green",
+ "Upload": "blue"
+ },
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "Gondul-Influx",
+ "fill": 2,
+ "gridPos": {
+ "h": 9,
+ "w": 24,
+ "x": 0,
+ "y": 45
+ },
+ "id": 28,
+ "interval": "60s",
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "hideEmpty": false,
+ "max": true,
+ "min": false,
+ "rightSide": true,
+ "show": true,
+ "sort": "current",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 2,
+ "links": [],
+ "nullPointMode": "connected",
+ "paceLength": 10,
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [
+ {
+ "alias": "/.* Upload/",
+ "stack": "B",
+ "transform": "negative-Y"
+ }
+ ],
+ "spaceLength": 10,
+ "stack": true,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "$tag_switch Download",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "switch"
+ ],
+ "type": "tag"
+ },
+ {
+ "params": [
+ "previous"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "ports",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "query": "",
+ "rawQuery": false,
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "ifHCInOctets"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ },
+ {
+ "params": [
+ "1s"
+ ],
+ "type": "non_negative_derivative"
+ },
+ {
+ "params": [
+ "20"
+ ],
+ "type": "moving_average"
+ },
+ {
+ "params": [
+ "*8"
+ ],
+ "type": "math"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "interface",
+ "operator": "=",
+ "value": "ae0"
+ },
+ {
+ "condition": "AND",
+ "key": "switch",
+ "operator": "=~",
+ "value": "/.*floor/"
+ }
+ ]
+ },
+ {
+ "alias": "$tag_switch Upload",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "switch"
+ ],
+ "type": "tag"
+ },
+ {
+ "params": [
+ "previous"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "ports",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "refId": "B",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "ifHCOutOctets"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ },
+ {
+ "params": [
+ "1s"
+ ],
+ "type": "non_negative_derivative"
+ },
+ {
+ "params": [
+ "20"
+ ],
+ "type": "moving_average"
+ },
+ {
+ "params": [
+ "* 8"
+ ],
+ "type": "math"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "interface",
+ "operator": "=",
+ "value": "ae0"
+ },
+ {
+ "condition": "AND",
+ "key": "switch",
+ "operator": "=~",
+ "value": "/.*floor/"
+ }
+ ]
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Top Distro",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "transparent": true,
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "refresh": "10s",
+ "schemaVersion": 18,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": []
+ },
+ "time": {
+ "from": "now-6h",
+ "to": "now"
+ },
+ "timepicker": {
+ "refresh_intervals": [
+ "5s",
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ],
+ "time_options": [
+ "5m",
+ "15m",
+ "1h",
+ "6h",
+ "12h",
+ "24h",
+ "2d",
+ "7d",
+ "30d"
+ ]
+ },
+ "timezone": "",
+ "title": "TG19 Public",
+ "uid": "s-FJmmgWz",
+ "version": 26
+}
diff --git a/examples/tg19/netbox_tools/cleanup_switchestxt.py b/examples/tg19/netbox_tools/cleanup_switchestxt.py
new file mode 100644
index 0000000..4091dce
--- /dev/null
+++ b/examples/tg19/netbox_tools/cleanup_switchestxt.py
@@ -0,0 +1,149 @@
+#!/usr/bin/python3
+
+import pynetbox
+import ipaddress
+import re
+from natsort import natsorted
+
+nb = pynetbox.api(
+ 'https://netbox.infra.gathering.org',
+ token='<Removed>'
+)
+
+FLOOR_SITE = 4
+CORE_DEVICE_ID = 16
+CORE_NAME = 'r1.noc'
+CORE_DISTRO_PORTS = ['xe-0/2/{}', 'xe-0/3/{}']
+
+DISTRO_DEVICE_TYPE = 7
+DISTRO_DEVICE_ROLE = 8
+DISTRO_MGMT_VLAN_ROLE = 4
+DISTRO_MGMT_VLAN_ID = 666
+DISTRO_UPLINK_AE = 'ae0'
+DISTRO_UPLINK_PORTS = ['xe-0/1/0', 'xe-1/1/0']
+DISTRO_DEVICE_PLATFORM = 3
+DISTRO_LINKNET_VLAN_ID = 888
+DISTRO_LINKNET_ROLE = 3
+
+
+EDGE_DEVICE_TYPE = 5
+EDGE_DEVICE_ROLE = 10
+EDGE_VLAN_ROLE = 2
+EDGE_LAG_NAME = 'ae0'
+EDGE_DEVICE_PLATFORM = 3
+
+LOOPBACK_POOL_V4_ID = 10
+LOOPBACK_POOL_V6_ID = 121
+
+LINKNET_POOL_V4_ID = 11
+LINKNET_POOL_V6_ID = 124
+
+with open('switches.txt') as f:
+ switchestxt = f.readlines()
+with open('patchlist.txt') as f:
+ patchlisttxt = f.readlines()
+
+nb_vlans = nb.ipam.vlans.filter(site_id = FLOOR_SITE)
+nb_prefixes = nb.ipam.prefixes.filter(site_id = FLOOR_SITE)
+nb_switches = nb.dcim.devices.filter(site_id = FLOOR_SITE)
+
+switches = {}
+distros = {}
+
+def cleanupswitchandnetwork(sw, site_id):
+ name = sw['sysname']
+ network_name = name
+
+ network = None
+ for vlan in nb_vlans:
+ if vlan.name == network_name:
+ network = vlan
+ break
+
+ prefix_v4 = None
+ prefix_v6 = None
+
+ for prefix in nb_prefixes:
+ if prefix.vlan is not None and prefix.vlan.id == network.id and prefix.family == 4:
+ prefix_v4 = prefix
+ if prefix.vlan is not None and prefix.vlan.id == network.id and prefix.family == 6:
+ prefix_v6 = prefix
+
+ if prefix_v4 and prefix_v6 is not None:
+ break
+
+ if prefix_v4 is not None:
+ print('Deleting Prefix {}'.format(sw['subnet4']))
+ prefix_v4.delete()
+
+ if prefix_v6 is not None:
+ print('Deleting Prefix {}'.format(sw['subnet6']))
+ prefix_v6.delete()
+
+ if network is None:
+ print('Deleting Network {}'.format(network_name))
+ network.delete()
+
+ switch = None
+ for device in nb_switches:
+ if device.name == name:
+ switch = device
+ break
+ if switch is not None:
+ print('Deleting Switch {}'.format(name))
+ switch.delete()
+
+ if sw['is_distro'] is False: # Edge switch that have a distro
+ distro_id = nb.dcim.devices.get(name=sw['distro_name']).id
+ mgmt_network = nb.ipam.vlans.get(name="mgmt.{}".format(sw['distro_name']))
+ ae_interface = nb.dcim.interfaces.get(device_id=switch.id, name=sw['lag_name'])
+ if ae_interface is not None:
+ print('Deleting {} for {}'.format(sw['lag_name'], name))
+ ae_interface.delete()
+ distro_ae_interface_name = 'ae{}'.format(sw['vlan_id'])
+ distro_ae_interface = nb.dcim.interfaces.get(device_id=distro_id, name=distro_ae_interface_name)
+ if distro_ae_interface is not None:
+ print('Deleting {} for {}'.format(distro_ae_interface_name,sw['distro_name']))
+ distro_ae_interface.delete()
+
+ distro_x = int(re.match('s(.*)\.floor', sw['distro_name']).group(1))
+ core_subif_name = 'ae{}.{}'.format(distro_x + 10,sw['vlan_id'])
+ core_subif_interface = nb.dcim.interfaces.get(device_id = sw['core_device_id'], name = core_subif_name)
+ if core_subif_interface is not None:
+ print('Deleting {} for core {}'.format(core_subif_name, sw['core_name']))
+ core_subif_interface.delete()
+
+for switch in switchestxt:
+ switch = switch.strip().split()
+ switches[switch[0]] = {
+ 'sysname': switch[0],
+ 'subnet4': switch[1],
+ 'subnet6': switch[2],
+ 'mgmt4': switch[3],
+ 'mgmt6': switch[4],
+ 'vlan_id': int(switch[5]),
+ 'distro_name': switch[6],
+ 'is_distro': False,
+ 'vlan_role_id': EDGE_VLAN_ROLE,
+ 'device_type_id': EDGE_DEVICE_TYPE,
+ 'device_role_id': EDGE_DEVICE_ROLE,
+ 'device_platform_id': EDGE_DEVICE_PLATFORM,
+ 'lag_name': EDGE_LAG_NAME,
+ 'core_device_id': CORE_DEVICE_ID,
+ 'core_name': CORE_NAME
+ }
+
+for patch in patchlisttxt:
+ patch = patch.strip().split()
+ uplink = []
+ for p in patch[2:]:
+ uplink.append(p)
+ switches[patch[0]].update({
+ 'uplinks': uplink
+ })
+
+print('Access started')
+for switch in natsorted(switches):
+ sw = switches[switch]
+ cleanupswitchandnetwork(sw, FLOOR_SITE)
+print('Access done')
diff --git a/examples/tg19/netbox_tools/create_switch.py b/examples/tg19/netbox_tools/create_switch.py
new file mode 100644
index 0000000..f2cf248
--- /dev/null
+++ b/examples/tg19/netbox_tools/create_switch.py
@@ -0,0 +1,163 @@
+#!/usr/bin/python3
+
+import pynetbox
+import ipaddress
+import re
+
+import pyargs
+import argparse
+
+parser = argparse.ArgumentParser()
+parser.add_argument('-name')
+parser.add_argument('-vlanid')
+parser.add_argument('-intf', nargs='+')
+
+args = parser.parse_args()
+
+nb = pynetbox.api(
+ 'https://netbox.infra.gathering.org',
+ token='<Removed>'
+)
+
+
+RING_SITE = 2
+RING_DEVICE_ID = 15
+RING_VLAN_GROUP = 1
+RING_NAME = 'r1.ring'
+RING_MGMT_v4_PREFIX = 486
+RING_MGMT_V6_PREFIX_ID = 118
+RING_MGMT_V6_PREFIX = "2a06:5841:c:"
+
+RING_PREFIX_SUPERNET_v4 = 28
+RING_PREFIX_SUPERNET_v6 = 105
+
+EDGE_DEVICE_TYPE = 5
+EDGE_DEVICE_ROLE = 11
+EDGE_VLAN_ROLE = 1
+EDGE_LAG_NAME = 'ae0'
+EDGE_MGMT_INTF_NAME = 'vlan.666'
+EDGE_DEVICE_PLATFORM = 3
+EDGE_UPLINKS = ['ge-0/0/47', 'ge-0/0/46']
+
+sysname = args.name
+
+vlanid = args.vlanid
+dist_interfaces = args.intf
+
+print('Creating VLAN {} with ID {}'.format(sysname, vlanid))
+vlan = nb.ipam.vlans.create(
+ name=sysname,
+ vid=vlanid,
+ status=1,
+ site=RING_SITE,
+ group=RING_VLAN_GROUP,
+ role=EDGE_VLAN_ROLE
+)
+
+nb.ipam.prefixes.get(RING_PREFIX_SUPERNET_v4).available_prefixes.create({
+ "prefix_length": 26,
+ "vlan": vlan.id,
+ "site": RING_SITE,
+ "role": EDGE_VLAN_ROLE,
+ "description": sysname
+ })
+v4_prefix = nb.ipam.prefixes.get(vlan_id=vlan.id, family=4, status=1)
+print('Created Prefix {}'.format(v4_prefix))
+
+nb.ipam.prefixes.create(
+ family = 6,
+ prefix = RING_MGMT_V6_PREFIX + str(vlan.vid) + "::/64",
+ vlan = vlan.id,
+ status = 1,
+ site = RING_SITE,
+ role = EDGE_VLAN_ROLE,
+ description = sysname
+)
+v6_prefix = nb.ipam.prefixes.get(vlan_id=vlan.id, family=6, status=1)
+print('Created Prefix {}'.format(v6_prefix))
+
+print('Creating Device {}'.format(sysname))
+switch = nb.dcim.devices.create(
+ name = sysname,
+ device_type = EDGE_DEVICE_TYPE,
+ device_role = EDGE_DEVICE_ROLE,
+ platform = EDGE_DEVICE_PLATFORM,
+ site = RING_SITE,
+ status = 1
+)
+
+ae_interface = nb.dcim.interfaces.get(device_id=switch.id, name=EDGE_LAG_NAME)
+mgmt_interface = nb.dcim.interfaces.get(device_id=switch.id, name=EDGE_MGMT_INTF_NAME)
+ring_ae_interface = nb.dcim.interfaces.create(
+ device = RING_DEVICE_ID,
+ name = "ae" + vlanid,
+ form_factor = 200,
+ description = sysname
+)
+
+ring_irb_interface = nb.dcim.interfaces.create(
+ device = RING_DEVICE_ID,
+ name = "irb." + vlanid,
+ form_factor = 200,
+ description = sysname
+)
+ring_ipv4 = nb.ipam.ip_addresses.create(
+ interface = ring_irb_interface.id,
+ address = v4_prefix.available_ips.list()[1]['address'],
+ status = 1,
+ description = sysname
+)
+ring_ipv6 = nb.ipam.ip_addresses.create(
+ interface = ring_irb_interface.id,
+ address = v6_prefix.available_ips.list()[1]['address'],
+ status = 1,
+ description = sysname
+)
+
+for x, uplinks in enumerate(EDGE_UPLINKS):
+ uplink = nb.dcim.interfaces.get(device_id=switch.id, name=uplinks)
+ uplink.lag = ae_interface.id
+ uplink.save()
+ intf = nb.dcim.interfaces.get(device_id=RING_DEVICE_ID, name=dist_interfaces[x-1])
+ print('Creating cable {}:{} -> {}:{}'.format(RING_NAME, intf, sysname, uplink))
+ nb.dcim.cables.create(
+ termination_a_id = intf.id,
+ termination_a_type = 'dcim.interface',
+ termination_b_id = uplink.id,
+ termination_b_type = 'dcim.interface',
+ status = True,
+ color = 'c0c0c0'
+ )
+
+for x, interfaces in enumerate(dist_interfaces):
+ interface = nb.dcim.interfaces.get(device_id=RING_DEVICE_ID, name=interfaces)
+ interface.lag = ring_ae_interface.id
+ interface.save()
+
+mgmt_interface = nb.dcim.interfaces.get(device_id=switch.id, name=EDGE_MGMT_INTF_NAME)
+
+mgmt_v4_address = nb.ipam.prefixes.get(RING_MGMT_v4_PREFIX).available_ips.list()[0]['address']
+mgmt_v6_address = nb.ipam.prefixes.get(RING_MGMT_V6_PREFIX_ID)
+ipv4 = nb.ipam.ip_addresses.create(
+ interface = mgmt_interface.id,
+ address = "{}".format(str(mgmt_v4_address)),
+ status = 1,
+ description = sysname
+)
+
+p = re.compile('(.*)\.(.*)\.(.*)\.(.*)/(.*)')
+m = p.match(mgmt_v4_address)
+ipv4_last = m.group(4)
+print(str(mgmt_v6_address))
+p = re.compile('(.*)::/(.*)')
+m = p.match(str(mgmt_v6_address))
+
+ipv6 = nb.ipam.ip_addresses.create(
+ interface = mgmt_interface.id,
+ address = "{0}::{1}/64".format(m.group(1), ipv4_last),
+ status = 1,
+ description = sysname
+)
+switch.primary_ip4 = ipv4.id
+switch.primary_ip6 = ipv6.id
+switch.save()
diff --git a/examples/tg19/netbox_tools/netbox2gondul.py b/examples/tg19/netbox_tools/netbox2gondul.py
new file mode 100644
index 0000000..f0154dd
--- /dev/null
+++ b/examples/tg19/netbox_tools/netbox2gondul.py
@@ -0,0 +1,133 @@
+#!/usr/bin/python3
+
+import ipaddress
+import requests
+import json
+from requests.auth import HTTPBasicAuth
+
+import pynetbox
+
+gondul_url = 'https://gondul.tg19.gathering.org'
+gondul_user = 'tech'
+gondul_pass = '<Removed>'
+
+nb = pynetbox.api(
+ 'https://netbox.infra.gathering.org',
+ token='<Removed>'
+)
+
+snmp_community = '<Removed>'
+
+ipam_roles = [1, 2, 5, 4, 7]
+#ipam_roles = [1]
+
+switches_roles = [11, 10, 6, 8]
+#switches_roles = [11]
+
+# Create vlans/networks
+nb_vlans = nb.ipam.vlans.all()
+for vlan in nb_vlans:
+ if vlan.role is None:
+ continue
+ if vlan.role.id not in ipam_roles:
+ continue
+ prefix_v4 = nb.ipam.prefixes.filter(vlan_id=vlan.id, family=4, status=1)
+ if len(prefix_v4) <= 0:
+ print("No v4 prefix found for vlan {}".format(vlan.name))
+ prefix_v4 = None
+ gw4 = None
+ else:
+ prefix_v4 = prefix_v4[0].prefix
+ gw4 = ipaddress.IPv4Network(prefix_v4)[1].exploded
+
+ prefix_v6 = nb.ipam.prefixes.filter(vlan_id=vlan.id, family=6, status=1)
+ if len(prefix_v6) <= 0:
+ print("No v6 prefix found for vlan {}".format(vlan.name))
+ prefix_v6 = None
+ gw6 = None
+ else:
+ prefix_v6 = prefix_v6[0].prefix
+ gw6 = ipaddress.IPv6Network(prefix_v6)[1].exploded
+
+ router = nb.ipam.ip_addresses.filter(address=gw4)
+ if len(router) <= 0:
+ print("No router found for vlan {}".format(vlan.name))
+ router = None
+ else:
+ router = router[0].interface.device.name
+
+ #tags = [vlan.role.slug]
+ data = json.dumps([{'name': vlan.name, 'subnet4': prefix_v4, 'subnet6': prefix_v6, 'gw4': gw4, 'gw6': gw6, 'router': router, 'vlan': vlan.vid}])
+ r = requests.post("{}/api/write/networks".format(gondul_url), data=data, headers={'content-type': 'application/json'}, auth=HTTPBasicAuth(gondul_user, gondul_pass))
+ print(r.status_code, r.text, data)
+
+# Create switches/devices
+nb_switches = nb.dcim.devices.all()
+for switch in nb_switches:
+ if switch.device_role is None:
+ continue
+ if switch.device_role.id not in switches_roles:
+ continue
+ lag = nb.dcim.interfaces.filter(device_id=switch.id, name='ae0')
+ if len(lag) <= 0:
+ print("No ae0 found for switch {}, not setting distro".format(switch.name))
+ distro = None
+ uplink = None
+ else:
+ uplinks = nb.dcim.interfaces.filter(lag_id=lag[0].id)
+ if uplinks is not None and uplinks[0].connected_endpoint is not None:
+ distro = uplinks[0].connected_endpoint.device.name
+ uplink = "{}.0".format(uplinks[0].connected_endpoint.name)
+ else:
+ distro = None
+ uplink = None
+
+ if switch.primary_ip4 is not None:
+ mgmt_vlan = nb.ipam.prefixes.filter(contains=switch.primary_ip4.address, status=1)
+ print(mgmt_vlan)
+ ip4 = str(switch.primary_ip4.address)
+ if len(mgmt_vlan) <= 0:
+ print("mgmt_vlan not found for switch {}".format(switch.name))
+ mgmt_vlan_name = None
+ elif mgmt_vlan[0].vlan is None:
+ print("mgmt_vlan not found for switch {}".format(switch.name))
+ mgmt_vlan_name = None
+ else:
+ mgmt_vlan_name = mgmt_vlan[0].vlan.name
+ else:
+ mgmt_vlan_name = None
+ ip4 = ''
+
+ if switch.primary_ip6 is not None:
+ ip6 = str(switch.primary_ip6)
+ else:
+ ip6 = ''
+
+ print(switch.device_role.id)
+ if switch.device_role.id != 8:
+ traffic_vlan = switch.name
+ else:
+ traffic_vlan = None
+
+ data = {'sysname': switch.name, 'community': snmp_community}
+
+ if distro is not None:
+ data.update({'distro_name': distro})
+ if uplink is not None:
+ data.update({'distro_phy_port': uplink})
+ if traffic_vlan is not None:
+ data.update({'traffic_vlan': traffic_vlan})
+ if mgmt_vlan_name is not None:
+ data.update({'mgmt_vlan': mgmt_vlan_name})
+ if ip4 is not None and ip4 != '':
+ data.update({'mgmt_v4_addr': ip4})
+ if ip6 is not None and ip6 != '':
+ data.update({'mgmt_v6_addr': ip6})
+
+ tags = [switch.device_role.slug] + switch.tags
+ data.update({'tags': tags})
+
+ data = json.dumps([data])
+ print(data)
+ r = requests.post("{}/api/write/switches".format(gondul_url), data=data, headers={'content-type': 'application/json'}, auth=HTTPBasicAuth(gondul_user, gondul_pass))
+ print(r.status_code, r.reason, data)
diff --git a/examples/tg19/netbox_tools/switchestxt2netbox.py b/examples/tg19/netbox_tools/switchestxt2netbox.py
new file mode 100644
index 0000000..db7c80c
--- /dev/null
+++ b/examples/tg19/netbox_tools/switchestxt2netbox.py
@@ -0,0 +1,478 @@
+#!/usr/bin/python3
+
+import pynetbox
+import ipaddress
+import re
+from natsort import natsorted
+
+nb = pynetbox.api(
+ 'https://netbox.infra.gathering.org',
+ token='<Removed>'
+)
+
+FLOOR_SITE = 4
+CORE_DEVICE_ID = 16
+CORE_NAME = 'r1.noc'
+CORE_DISTRO_PORTS = ['xe-0/2/{}', 'xe-0/3/{}']
+
+DISTRO_DEVICE_TYPE = 7
+DISTRO_DEVICE_ROLE = 8
+DISTRO_MGMT_VLAN_ROLE = 4
+DISTRO_MGMT_VLAN_ID = 666
+DISTRO_UPLINK_AE = 'ae0'
+DISTRO_UPLINK_PORTS = ['xe-0/1/0', 'xe-1/1/0']
+DISTRO_DEVICE_PLATFORM = 3
+DISTRO_LINKNET_VLAN_ID = 888
+DISTRO_LINKNET_ROLE = 3
+
+
+EDGE_DEVICE_TYPE = 5
+EDGE_DEVICE_ROLE = 10
+EDGE_VLAN_ROLE = 2
+EDGE_LAG_NAME = 'ae0'
+EDGE_DEVICE_PLATFORM = 3
+
+LOOPBACK_POOL_V4_ID = 10
+LOOPBACK_POOL_V6_ID = 121
+
+LINKNET_POOL_V4_ID = 11
+LINKNET_POOL_V6_ID = 124
+
+with open('switches.txt') as f:
+ switchestxt = f.readlines()
+with open('patchlist.txt') as f:
+ patchlisttxt = f.readlines()
+
+nb_vlans = nb.ipam.vlans.filter(site_id = FLOOR_SITE)
+nb_prefixes = nb.ipam.prefixes.filter(site_id = FLOOR_SITE)
+nb_switches = nb.dcim.devices.filter(site_id = FLOOR_SITE)
+
+switches = {}
+distros = {}
+
+def createswitchandnetwork(sw, site_id):
+ name = sw['sysname']
+ network_name = name
+ if sw['is_distro']:
+ network_name = 'mgmt.{}'.format(name)
+
+ network = None
+ for vlan in nb_vlans:
+ if vlan.name == network_name:
+ if vlan.vid != sw['vlan_id']:
+ print("Vlan with name {} already exist, but have wrong vlan ID {}".format(vlan.name, vlan.vid))
+ exit(1)
+ network = vlan
+ break
+
+ if network is None:
+ print('Creating Network {}'.format(network_name))
+ network = nb.ipam.vlans.create(
+ name=network_name,
+ vid=sw['vlan_id'],
+ status=1,
+ site=site_id,
+ role=sw['vlan_role_id']
+ )
+
+ prefix_v4 = None
+ prefix_v6 = None
+
+ for prefix in nb_prefixes:
+ if prefix.vlan is not None and prefix.vlan.id == network.id and prefix.family == 4:
+ prefix_v4 = prefix
+ if prefix.vlan is not None and prefix.vlan.id == network.id and prefix.family == 6:
+ prefix_v6 = prefix
+
+ if prefix_v4 and prefix_v6 is not None:
+ break
+
+ if prefix_v4 is None:
+ print('Creating Prefix {}'.format(sw['subnet4']))
+ prefix_v4 = nb.ipam.prefixes.create(
+ family = 4,
+ prefix = sw['subnet4'],
+ vlan = network.id,
+ status = 1,
+ site = site_id,
+ role = sw['vlan_role_id']
+ )
+
+ if prefix_v6 is None:
+ print('Creating Prefix {}'.format(sw['subnet6']))
+ prefix_v6 = nb.ipam.prefixes.create(
+ family = 6,
+ prefix = sw['subnet6'],
+ vlan = network.id,
+ status = 1,
+ site = FLOOR_SITE,
+ role = sw['vlan_role_id']
+ )
+
+ switch = None
+ for device in nb_switches:
+ if device.name == name:
+ switch = device
+ break
+ if switch is None:
+ print('Creating Switch {}'.format(name))
+ switch = nb.dcim.devices.create(
+ name = name,
+ device_type = sw['device_type_id'],
+ device_role = sw['device_role_id'],
+ platform = sw['device_platform_id'],
+ site = FLOOR_SITE,
+ status = 1
+ )
+
+ if sw['is_distro'] is True: # Distro
+ if nb.dcim.interfaces.get(device_id=switch.id, name='lo0') is None:
+ print('Creating lo0 for {}'.format(name))
+ lo_interface = nb.dcim.interfaces.create(
+ device = switch.id,
+ name = 'lo0',
+ form_factor = 0,
+ description = "{} loopback".format(name)
+ )
+ loopback_v4_address = nb.ipam.prefixes.get(sw['loopback_pool_v4_id']).available_ips.list()[0]['address']
+ print("{}/32".format(str(ipaddress.ip_interface(loopback_v4_address).ip)))
+ ipv4 = nb.ipam.ip_addresses.create(
+ interface = lo_interface.id,
+ address = "{}/32".format(str(ipaddress.ip_interface(loopback_v4_address).ip)),
+ status = 1,
+ description = "{} loopback".format(name),
+ role = 10
+ )
+
+ loopback_v6_address = nb.ipam.prefixes.get(sw['loopback_pool_v6_id'])
+ p = re.compile('(.*)\.(.*)\.(.*)\.(.*)/(.*)')
+ m = p.match(loopback_v4_address)
+ ipv4_last = m.group(4)
+ print(str(loopback_v6_address))
+ p = re.compile('(.*)::/(.*)')
+ m = p.match(str(loopback_v6_address))
+
+ ipv6 = nb.ipam.ip_addresses.create(
+ interface = lo_interface.id,
+ address = "{0}::{1}/128".format(m.group(1), ipv4_last),
+ status = 1,
+ description = "{} loopback".format(name),
+ role = 10
+ )
+ switch.primary_ip4 = ipv4.id
+ switch.primary_ip6 = ipv6.id
+ switch.save()
+
+ mgmt_interface_name = 'vlan.{}'.format(sw['vlan_id'])
+ if nb.dcim.interfaces.get(device_id=switch.id, name=mgmt_interface_name) is None:
+ print('Creating {} for {}'.format(mgmt_interface_name, name))
+ mgmt_interface = nb.dcim.interfaces.create(
+ device = switch.id,
+ name = mgmt_interface_name,
+ form_factor = 0,
+ description = network_name
+ )
+ ipv4 = nb.ipam.ip_addresses.create(
+ interface = mgmt_interface.id,
+ address = "{}/{}".format(str(ipaddress.ip_network(sw['subnet4'])[1]),ipaddress.ip_network(sw['subnet4']).prefixlen),
+ status = 1,
+ description = network_name
+ )
+ ipv6 = nb.ipam.ip_addresses.create(
+ interface = mgmt_interface.id,
+ address = "{}/{}".format(str(ipaddress.ip_network(sw['subnet6'])[1]),ipaddress.ip_network(sw['subnet6']).prefixlen),
+ status = 1,
+ description = network_name
+ )
+
+ ae_interface = nb.dcim.interfaces.get(device_id=switch.id, name=sw['lag_name'])
+ if ae_interface is None:
+ print('Creating {} for {}'.format(sw['lag_name'], name))
+ ae_interface = nb.dcim.interfaces.create(
+ device = switch.id,
+ name = sw['lag_name'],
+ form_factor = 200,
+ description = sw['core_name'],
+ mode = 200
+ )
+
+ distro_x = int(re.match('s(.*)\.floor', name).group(1))
+ core_ae_interface_name = 'ae{}'.format(distro_x + 10)
+ core_ae_interface = nb.dcim.interfaces.get(device_id=sw['core_device_id'], name=core_ae_interface_name)
+ if core_ae_interface is None:
+ print('Creating {} for {}'.format(core_ae_interface_name, sw['core_name']))
+ core_ae_interface = nb.dcim.interfaces.create(
+ device = sw['core_device_id'],
+ name = core_ae_interface_name,
+ form_factor = 200,
+ description = name
+ )
+
+ sw['uplinks'].sort(reverse=True)
+ for x, uplink in enumerate(sw['uplinks']):
+ uplink = uplink.format(distro_x-1)
+ port = sw['local_uplink_ports'][x-1]
+ interface = nb.dcim.interfaces.get(device_id=switch.id, name=port)
+ if interface.connected_endpoint is None:
+ interface.lag = ae_interface.id
+ interface.description = '{}:{}'.format(sw['core_name'], uplink)
+ interface.save()
+
+ core_interface = nb.dcim.interfaces.get(device_id=sw['core_device_id'], name=uplink)
+ core_interface.lag = core_ae_interface.id
+ core_interface.description = '{}:{}'.format(name,port)
+ core_interface.save()
+
+ print('Creating cable {}:{} -> {}:{}'.format(sw['core_name'], uplink, sw['sysname'], port))
+ nb.dcim.cables.create(
+ termination_a_id = core_interface.id,
+ termination_a_type = 'dcim.interface',
+ termination_b_id = interface.id,
+ termination_b_type = 'dcim.interface',
+ status = True,
+ color = 'c0c0c0'
+ )
+
+ linknet_vlan = nb.ipam.vlans.get(name='{}-{}-linknet'.format(sw['core_name'], name))
+ if linknet_vlan is None:
+ linknet_vlan = nb.ipam.vlans.create(
+ name='{}-{}-linknet'.format(sw['core_name'], name),
+ vid=sw['linknet_vlan_id'],
+ status=1,
+ site=site_id,
+ role=sw['distro_linknet_role']
+ )
+
+ print(nb.ipam.prefixes.filter(vlan_id=linknet_vlan.id, family=4, status=1))
+ linknet_v4_prefix = nb.ipam.prefixes.get(vlan_id=linknet_vlan.id, family=4, status=1)
+ if linknet_v4_prefix is None:
+ nb.ipam.prefixes.get(sw['linknet_pool_v4_id']).available_prefixes.create({
+ "prefix_length": 31,
+ "vlan": linknet_vlan.id,
+ "role": 3,
+ "description": '{} - {}'.format(sw['core_name'], name)
+ })
+ linknet_v4_prefix = nb.ipam.prefixes.get(vlan_id=linknet_vlan.id, family=4, status=1)
+
+ linknet_v6_prefix = nb.ipam.prefixes.get(vlan_id=linknet_vlan.id, family=6, status=1)
+ if linknet_v6_prefix is None:
+ nb.ipam.prefixes.get(sw['linknet_pool_v6_id']).available_prefixes.create({
+ "prefix_length": 64,
+ "vlan": linknet_vlan.id,
+ "role": 3,
+ "description": '{} - {}'.format(sw['core_name'], name)
+ })
+ linknet_v6_prefix = nb.ipam.prefixes.get(vlan_id=linknet_vlan.id, family=6, status=1)
+
+ linknet_interface_name = 'vlan.{}'.format(sw['linknet_vlan_id'])
+ if nb.dcim.interfaces.get(device_id=switch.id, name=linknet_interface_name) is None:
+ print('Creating {} for {}'.format(linknet_interface_name, name))
+ linknet_interface = nb.dcim.interfaces.create(
+ device = switch.id,
+ name = linknet_interface_name,
+ form_factor = 0,
+ description = sw['core_name']
+ )
+ ipv4 = nb.ipam.ip_addresses.create(
+ interface = linknet_interface.id,
+ address = linknet_v4_prefix.available_ips.list()[1]['address'],
+ status = 1,
+ description = '{}-{}-linknet'.format(sw['core_name'], name)
+ )
+ ipv6 = nb.ipam.ip_addresses.create(
+ interface = linknet_interface.id,
+ address = linknet_v6_prefix.available_ips.list()[1]['address'],
+ status = 1,
+ description = '{}-{}-linknet'.format(sw['core_name'], name)
+ )
+
+ core_linknet_interface_name = '{}.{}'.format(core_ae_interface_name, sw['linknet_vlan_id'])
+ if nb.dcim.interfaces.get(device_id=sw['core_device_id'], name=core_linknet_interface_name) is None:
+ print('Creating {} for {}'.format(core_linknet_interface_name, sw['core_name']))
+ core_linknet_interface = nb.dcim.interfaces.create(
+ device = sw['core_device_id'],
+ name = core_linknet_interface_name,
+ form_factor = 0,
+ description = sw['core_name']
+ )
+ ipv4 = nb.ipam.ip_addresses.create(
+ interface = core_linknet_interface.id,
+ address = linknet_v4_prefix.available_ips.list()[0]['address'],
+ status = 1,
+ description = '{}-{}-linknet'.format(sw['core_name'], name)
+ )
+ ipv6 = nb.ipam.ip_addresses.create(
+ interface = core_linknet_interface.id,
+ address = linknet_v6_prefix.available_ips.list()[0]['address'],
+ status = 1,
+ description = '{}-{}-linknet'.format(sw['core_name'], name)
+ )
+
+ if sw['is_distro'] is False: # Edge switch that have a distro
+ distro_id = nb.dcim.devices.get(name=sw['distro_name']).id
+ mgmt_network = nb.ipam.vlans.get(name="mgmt.{}".format(sw['distro_name']))
+ ae_interface = nb.dcim.interfaces.get(device_id=switch.id, name=sw['lag_name'])
+ if ae_interface is None:
+ print('Creating {} for {}'.format(sw['lag_name'], name))
+ ae_interface = nb.dcim.interfaces.create(
+ device = switch.id,
+ name = sw['lag_name'],
+ form_factor = 200,
+ description = sw['distro_name'],
+ mode = 200,
+ tagged_vlans = [network.id, mgmt_network.id]
+ )
+ distro_ae_interface_name = 'ae{}'.format(sw['vlan_id'])
+ distro_ae_interface = nb.dcim.interfaces.get(device_id=distro_id, name=distro_ae_interface_name)
+ if distro_ae_interface is None:
+ print('Creating {} for {}'.format(distro_ae_interface_name,sw['distro_name']))
+ distro_ae_interface = nb.dcim.interfaces.create(
+ device = distro_id,
+ name = distro_ae_interface_name,
+ form_factor = 200,
+ description = name,
+ mode = 200,
+ tagged_vlans = [network.id, mgmt_network.id]
+ )
+
+ for x, uplink in enumerate(sw['uplinks']):
+ port = 'ge-0/0/{}'.format(44+x)
+ interface = nb.dcim.interfaces.get(device_id=switch.id, name=port)
+ if interface.connected_endpoint is None:
+ interface.lag = ae_interface.id
+ interface.description = '{}:{}'.format(sw['distro_name'], uplink)
+ interface.save()
+
+ distro_interface = nb.dcim.interfaces.get(device_id=distro_id, name=uplink)
+ distro_interface.lag = distro_ae_interface.id
+ distro_interface.description = '{}:{}'.format(name,port)
+ distro_interface.save()
+
+ print('Creating cable {}:{} -> {}:{}'.format(sw['distro_name'], uplink, sw['sysname'], port))
+ nb.dcim.cables.create(
+ termination_a_id = distro_interface.id,
+ termination_a_type = 'dcim.interface',
+ termination_b_id = interface.id,
+ termination_b_type = 'dcim.interface',
+ status = True,
+ color = 'c0c0c0'
+ )
+
+ vlan_name = 'vlan.{}'.format(DISTRO_MGMT_VLAN_ID)
+ vlan_interface = nb.dcim.interfaces.get(device_id=switch.id, name=vlan_name)
+ if vlan_interface is None:
+ print('Creating {} for {}'.format(vlan_name, name))
+ vlan_interface = nb.dcim.interfaces.create(
+ device = switch.id,
+ name=vlan_name,
+ form_factor=0,
+ description="mgmt.{}".format(sw['distro_name'])
+ )
+ if switch.primary_ip4 is None:
+ ipv4 = nb.ipam.ip_addresses.get(interface_id=vlan_interface.id, family=4)
+ if ipv4 is None:
+ ipv4 = nb.ipam.ip_addresses.create(
+ interface=vlan_interface.id,
+ address=sw['mgmt4'],
+ status=1,
+ description="mgmt.{}".format(sw['distro_name'])
+ )
+ switch.primary_ip4 = ipv4.id
+ if switch.primary_ip6 is None:
+ ipv6 = nb.ipam.ip_addresses.get(interface_id=vlan_interface.id, family=6)
+ if ipv6 is None:
+ ipv6 = nb.ipam.ip_addresses.create(
+ interface=vlan_interface.id,
+ address=sw['mgmt6'],
+ status=1,
+ description="mgmt.{}".format(sw['distro_name'])
+ )
+ switch.primary_ip6 = ipv6.id
+ switch.save()
+
+ distro_x = int(re.match('s(.*)\.floor', sw['distro_name']).group(1))
+ core_subif_name = 'ae{}.{}'.format(distro_x + 10,sw['vlan_id'])
+ core_subif_interface = nb.dcim.interfaces.get(device_id = sw['core_device_id'], name = core_subif_name)
+ if core_subif_interface is None:
+ print('Creating {} for core {}'.format(core_subif_name, sw['core_name']))
+ core_subif_interface = nb.dcim.interfaces.create(
+ device = sw['core_device_id'],
+ name = core_subif_name,
+ form_factor = 0,
+ description = "{} - {}:{}".format(network_name, sw['distro_name'], distro_ae_interface.name)
+ )
+ nb.ipam.ip_addresses.create(
+ interface = core_subif_interface.id,
+ address = "{}/{}".format(str(ipaddress.ip_network(sw['subnet4'])[1]),ipaddress.ip_network(sw['subnet4']).prefixlen),
+ status = 1,
+ description = network_name
+ )
+ nb.ipam.ip_addresses.create(
+ interface = core_subif_interface.id,
+ address = "{}/{}".format(str(ipaddress.ip_network(sw['subnet6'])[1]),ipaddress.ip_network(sw['subnet6']).prefixlen),
+ status = 1,
+ description = network_name
+ )
+
+for switch in switchestxt:
+ switch = switch.strip().split()
+ switches[switch[0]] = {
+ 'sysname': switch[0],
+ 'subnet4': switch[1],
+ 'subnet6': switch[2],
+ 'mgmt4': switch[3],
+ 'mgmt6': switch[4],
+ 'vlan_id': int(switch[5]),
+ 'distro_name': switch[6],
+ 'is_distro': False,
+ 'vlan_role_id': EDGE_VLAN_ROLE,
+ 'device_type_id': EDGE_DEVICE_TYPE,
+ 'device_role_id': EDGE_DEVICE_ROLE,
+ 'device_platform_id': EDGE_DEVICE_PLATFORM,
+ 'lag_name': EDGE_LAG_NAME,
+ 'core_device_id': CORE_DEVICE_ID,
+ 'core_name': CORE_NAME
+ }
+ if switch[6] not in distros:
+ distros[switch[6]] = {
+ 'sysname': switch[6],
+ 'subnet4': str(ipaddress.ip_network(switch[3], strict=False)),
+ 'subnet6': str(ipaddress.ip_network(switch[4], strict=False)),
+ 'is_distro': True,
+ 'vlan_role_id': DISTRO_MGMT_VLAN_ROLE,
+ 'device_type_id': DISTRO_DEVICE_TYPE,
+ 'device_role_id': DISTRO_DEVICE_ROLE,
+ 'device_platform_id': DISTRO_DEVICE_PLATFORM,
+ 'vlan_id': DISTRO_MGMT_VLAN_ID,
+ 'lag_name': DISTRO_UPLINK_AE,
+ 'uplinks': CORE_DISTRO_PORTS,
+ 'local_uplink_ports': DISTRO_UPLINK_PORTS,
+ 'core_device_id': CORE_DEVICE_ID,
+ 'core_name': CORE_NAME,
+ 'linknet_vlan_id': DISTRO_LINKNET_VLAN_ID,
+ 'loopback_pool_v4_id': LOOPBACK_POOL_V4_ID,
+ 'loopback_pool_v6_id': LOOPBACK_POOL_V6_ID,
+ 'linknet_pool_v4_id': LINKNET_POOL_V4_ID,
+ 'linknet_pool_v6_id': LINKNET_POOL_V6_ID,
+ 'distro_linknet_role': DISTRO_LINKNET_ROLE
+ }
+
+for patch in patchlisttxt:
+ patch = patch.strip().split()
+ uplink = []
+ for p in patch[2:]:
+ uplink.append(p)
+ switches[patch[0]].update({
+ 'uplinks': uplink
+ })
+
+print('Distro started')
+for distro in natsorted(distros):
+ sw = distros[distro]
+ createswitchandnetwork(sw, FLOOR_SITE)
+print('Distro done')
+print('Access started')
+for switch in natsorted(switches):
+ sw = switches[switch]
+ createswitchandnetwork(sw, FLOOR_SITE)
+print('Access done')
diff --git a/examples/tg19/pxe/README.md b/examples/tg19/pxe/README.md
new file mode 100644
index 0000000..c03e452
--- /dev/null
+++ b/examples/tg19/pxe/README.md
@@ -0,0 +1 @@
+Built on https://github.com/antonym/netboot.xyz and ipxe.
diff --git a/examples/tg19/pxe/http/README.md b/examples/tg19/pxe/http/README.md
new file mode 100644
index 0000000..fefc164
--- /dev/null
+++ b/examples/tg19/pxe/http/README.md
@@ -0,0 +1 @@
+All other files are fetched from https://github.com/antonym/netboot.xyz
diff --git a/examples/tg19/pxe/http/bg.png b/examples/tg19/pxe/http/bg.png
new file mode 100644
index 0000000..74f5977
--- /dev/null
+++ b/examples/tg19/pxe/http/bg.png
Binary files differ
diff --git a/examples/tg19/pxe/http/boot.cfg b/examples/tg19/pxe/http/boot.cfg
new file mode 100644
index 0000000..798dda8
--- /dev/null
+++ b/examples/tg19/pxe/http/boot.cfg
@@ -0,0 +1,98 @@
+#!ipxe
+
+:global_vars
+# set site name
+set site_name The Gathering 2019
+
+# set boot domain
+set boot_domain boot.tg19.gathering.org
+
+# set location of memdisk
+set memdisk http://${boot_domain}/memdisk
+
+# signature check enabled?
+set sigs_enabled false
+
+# image signatures check enabled?
+set img_sigs_enabled false
+
+# set location of signatures for sources
+set sigs http://${boot_domain}/sigs/
+
+# set location of latest iPXE
+set ipxe_disk netboot.xyz-undionly.kpxe
+
+# set location of background image
+set bg_image http://${boot_domain}/bg.png
+
+##################
+# official mirrors
+##################
+:mirrors
+### Alpine Linux
+set alpinelinux_mirror dl-cdn.alpinelinux.org
+set alpinelinux_base_dir alpine
+
+### ArchLinux
+set archlinux_mirror mirror.rackspace.com
+set archlinux_base_dir archlinux
+
+### CentOS
+set centos_mirror mirror.centos.org
+set centos_base_dir centos
+
+### Debian
+set debian_mirror deb.debian.org
+set debian_base_dir debian
+
+### Devuan
+set devuan_mirror auto.mirror.devuan.org
+set devuan_base_dir devuan
+
+### Fedora
+set fedora_mirror mirrors.kernel.org
+set fedora_base_dir fedora
+
+### Mageia
+set mageia_mirror mirrors.kernel.org
+set mageia_base_dir mageia
+
+### OpenSUSE
+set opensuse_mirror download.opensuse.org
+set opensuse_base_dir distribution/leap
+
+### Slackware
+set slackware_mirror mirror.rackspace.com
+set slackware_base_dir slackware
+
+### Ubuntu
+set ubuntu_mirror archive.ubuntu.com
+set ubuntu_base_dir ubuntu
+
+#################################################
+# determine architectures and enable menu options
+#################################################
+:architectures
+set menu_linux 1
+set menu_bsd 1
+set menu_freedos 1
+set menu_live 1
+set menu_security 1
+set menu_utils 1
+iseq ${buildarch} i386 && goto x86_64 ||
+iseq ${buildarch} x86_64 && goto x86_64 ||
+iseq ${buildarch} arm64 && goto arm64 ||
+goto architectures_end
+:x86_64
+goto architectures_end
+:arm64
+set menu_freedos 0
+set menu_live 0
+set menu_security 0
+set menu_utils 0
+goto architectures_end
+:architectures_end
+goto end
+
+:end
+exit
diff --git a/examples/tg19/pxe/http/menu.ipxe b/examples/tg19/pxe/http/menu.ipxe
new file mode 100644
index 0000000..90aa41c
--- /dev/null
+++ b/examples/tg19/pxe/http/menu.ipxe
@@ -0,0 +1,85 @@
+#!ipxe
+
+:start
+chain --autofree boot.cfg ||
+iseq ${cls} serial && goto ignore_cls ||
+set cls:hex 1b:5b:4a # ANSI clear screen sequence - "^[[J"
+set cls ${cls:string}
+:ignore_cls
+
+isset ${arch} && goto skip_arch_detect ||
+cpuid --ext 29 && set arch x86_64 || set arch i386
+iseq ${buildarch} arm64 && set arch arm64 ||
+:skip_arch_detect
+isset ${menu} && goto ${menu} ||
+
+isset ${ip} || dhcp || echo DHCP failed
+
+:main_menu
+console --x 640 --y 480
+console --picture ${bg_image} --left 240 --right 10 --top 15 --bottom 32
+clear menu
+set space:hex 20:20
+set space ${space:string}
+iseq ${arch} x86_64 && set arch_a amd64 || set arch_a ${arch}
+menu ${site_name}
+item --gap Default:
+item local ${space} Boot from local disk
+item --gap Distributions:
+iseq ${menu_linux} 1 && item linux ${space} Linux Installs ||
+#iseq ${menu_bsd} 1 && item bsd ${space} BSD Installs ||
+#iseq ${menu_freedos} 1 && item freedos ${space} FreeDOS ||
+iseq ${menu_live} 1 && item live ${space} Live Boot ||
+iseq ${menu_security} 1 && item security ${space} Security Related ||
+item --gap Tools:
+iseq ${menu_utils} 1 && item utils ${space} Utilities ||
+iseq ${arch} x86_64 && set bits 64 || set bits 32
+item changebits ${space} Architecture: ${arch} (${bits}bit)
+item shell ${space} iPXE shell
+item netinfo ${space} Network card info
+item
+item --gap Har du problemer?
+item --gap Ta kontakt med Tech:Support
+item --gap i servicedesk.
+isset ${menu} && set timeout 0 || set timeout 5000
+choose --timeout ${timeout} --default ${menu} menu || goto local
+echo ${cls}
+goto ${menu} ||
+iseq ${sigs_enabled} true && goto verify_sigs || goto change_menu
+
+:verify_sigs
+imgverify ${menu}.ipxe ${sigs}${menu}.ipxe.sig || goto error
+goto change_menu
+
+:change_menu
+chain ${menu}.ipxe || goto error
+goto main_menu
+
+:error
+echo
+echo Error occured
+echo Press any key to return to menu ...
+prompt
+goto main_menu
+
+:local
+echo Booting from local disks ...
+exit 0
+
+:shell
+echo Type "exit" to return to menu.
+set menu main_menu
+shell
+goto main_menu
+
+:changebits
+iseq ${arch} x86_64 && set arch i386 || set arch x86_64
+goto main_menu
+
+:sig_check
+iseq ${sigs_enabled} true && set sigs_enabled false || set sigs_enabled true
+goto main_menu
+
+:img_sigs_check
+iseq ${img_sigs_enabled} true && set img_sigs_enabled false || set img_sigs_enabled true
+goto main_menu