diff options
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 Binary files differnew file mode 100644 index 0000000..74f5977 --- /dev/null +++ b/examples/tg19/pxe/http/bg.png 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 |