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  | 
