aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md29
-rw-r--r--bind/README5
-rw-r--r--bind/master/2.0.d.e.2.0.a.2.ip6.arpa.zone36
-rw-r--r--bind/master/55.169.31.in-addr.arpa.zone267
-rw-r--r--bind/master/bind.keys49
-rw-r--r--bind/master/conf-master/ap-dist0.conf7
-rw-r--r--bind/master/conf-master/ap-dist1.conf7
-rw-r--r--bind/master/conf-master/ap-dist2.conf7
-rw-r--r--bind/master/conf-master/ap-dist3.conf7
-rw-r--r--bind/master/conf-master/ap-dist4.conf7
-rw-r--r--bind/master/conf-master/care.conf7
-rw-r--r--bind/master/conf-master/chillout.conf7
-rw-r--r--bind/master/conf-master/creativia.conf7
-rw-r--r--bind/master/conf-master/crew1.conf7
-rw-r--r--bind/master/conf-master/crew2.conf7
-rw-r--r--bind/master/conf-master/crew3.conf7
-rw-r--r--bind/master/conf-master/crew4.conf7
-rw-r--r--bind/master/conf-master/crew5.conf7
-rw-r--r--bind/master/conf-master/crew6.conf7
-rw-r--r--bind/master/conf-master/defektraid.conf7
-rw-r--r--bind/master/conf-master/e1-3.conf7
-rw-r--r--bind/master/conf-master/e1-4.conf7
-rw-r--r--bind/master/conf-master/e11-1.conf7
-rw-r--r--bind/master/conf-master/e11-2.conf7
-rw-r--r--bind/master/conf-master/e11-3.conf7
-rw-r--r--bind/master/conf-master/e11-4.conf7
-rw-r--r--bind/master/conf-master/e13-1.conf7
-rw-r--r--bind/master/conf-master/e13-2.conf7
-rw-r--r--bind/master/conf-master/e13-3.conf7
-rw-r--r--bind/master/conf-master/e13-4.conf7
-rw-r--r--bind/master/conf-master/e15-1.conf7
-rw-r--r--bind/master/conf-master/e15-2.conf7
-rw-r--r--bind/master/conf-master/e15-3.conf7
-rw-r--r--bind/master/conf-master/e15-4.conf7
-rw-r--r--bind/master/conf-master/e17-1.conf7
-rw-r--r--bind/master/conf-master/e17-2.conf7
-rw-r--r--bind/master/conf-master/e17-3.conf7
-rw-r--r--bind/master/conf-master/e17-4.conf7
-rw-r--r--bind/master/conf-master/e19-1.conf7
-rw-r--r--bind/master/conf-master/e19-2.conf7
-rw-r--r--bind/master/conf-master/e19-3.conf7
-rw-r--r--bind/master/conf-master/e19-4.conf7
-rw-r--r--bind/master/conf-master/e21-1.conf7
-rw-r--r--bind/master/conf-master/e21-2.conf7
-rw-r--r--bind/master/conf-master/e21-3.conf7
-rw-r--r--bind/master/conf-master/e21-4.conf7
-rw-r--r--bind/master/conf-master/e23-1.conf7
-rw-r--r--bind/master/conf-master/e23-2.conf7
-rw-r--r--bind/master/conf-master/e23-3.conf7
-rw-r--r--bind/master/conf-master/e23-4.conf7
-rw-r--r--bind/master/conf-master/e25-1.conf7
-rw-r--r--bind/master/conf-master/e25-2.conf7
-rw-r--r--bind/master/conf-master/e25-3.conf7
-rw-r--r--bind/master/conf-master/e25-4.conf7
-rw-r--r--bind/master/conf-master/e27-1.conf7
-rw-r--r--bind/master/conf-master/e27-2.conf7
-rw-r--r--bind/master/conf-master/e29-1.conf7
-rw-r--r--bind/master/conf-master/e29-2.conf7
-rw-r--r--bind/master/conf-master/e3-3.conf7
-rw-r--r--bind/master/conf-master/e3-4.conf7
-rw-r--r--bind/master/conf-master/e31-1.conf7
-rw-r--r--bind/master/conf-master/e31-2.conf7
-rw-r--r--bind/master/conf-master/e33-1.conf7
-rw-r--r--bind/master/conf-master/e33-2.conf7
-rw-r--r--bind/master/conf-master/e35-1.conf7
-rw-r--r--bind/master/conf-master/e35-2.conf7
-rw-r--r--bind/master/conf-master/e37-1.conf7
-rw-r--r--bind/master/conf-master/e37-2.conf7
-rw-r--r--bind/master/conf-master/e39-1.conf7
-rw-r--r--bind/master/conf-master/e39-2.conf7
-rw-r--r--bind/master/conf-master/e41-1.conf7
-rw-r--r--bind/master/conf-master/e41-2.conf7
-rw-r--r--bind/master/conf-master/e43-1.conf7
-rw-r--r--bind/master/conf-master/e43-2.conf7
-rw-r--r--bind/master/conf-master/e43-3.conf7
-rw-r--r--bind/master/conf-master/e43-4.conf7
-rw-r--r--bind/master/conf-master/e45-1.conf7
-rw-r--r--bind/master/conf-master/e45-2.conf7
-rw-r--r--bind/master/conf-master/e45-3.conf7
-rw-r--r--bind/master/conf-master/e45-4.conf7
-rw-r--r--bind/master/conf-master/e47-1.conf7
-rw-r--r--bind/master/conf-master/e47-2.conf7
-rw-r--r--bind/master/conf-master/e47-3.conf7
-rw-r--r--bind/master/conf-master/e47-4.conf7
-rw-r--r--bind/master/conf-master/e49-1.conf7
-rw-r--r--bind/master/conf-master/e49-2.conf7
-rw-r--r--bind/master/conf-master/e49-3.conf7
-rw-r--r--bind/master/conf-master/e49-4.conf7
-rw-r--r--bind/master/conf-master/e5-3.conf7
-rw-r--r--bind/master/conf-master/e5-4.conf7
-rw-r--r--bind/master/conf-master/e51-1.conf7
-rw-r--r--bind/master/conf-master/e51-2.conf7
-rw-r--r--bind/master/conf-master/e51-3.conf7
-rw-r--r--bind/master/conf-master/e51-4.conf7
-rw-r--r--bind/master/conf-master/e53-1.conf7
-rw-r--r--bind/master/conf-master/e53-2.conf7
-rw-r--r--bind/master/conf-master/e53-3.conf7
-rw-r--r--bind/master/conf-master/e53-4.conf7
-rw-r--r--bind/master/conf-master/e55-1.conf7
-rw-r--r--bind/master/conf-master/e55-2.conf7
-rw-r--r--bind/master/conf-master/e55-3.conf7
-rw-r--r--bind/master/conf-master/e55-4.conf7
-rw-r--r--bind/master/conf-master/e57-1.conf7
-rw-r--r--bind/master/conf-master/e57-2.conf7
-rw-r--r--bind/master/conf-master/e57-3.conf7
-rw-r--r--bind/master/conf-master/e57-4.conf7
-rw-r--r--bind/master/conf-master/e59-1.conf7
-rw-r--r--bind/master/conf-master/e59-2.conf7
-rw-r--r--bind/master/conf-master/e59-3.conf7
-rw-r--r--bind/master/conf-master/e59-4.conf7
-rw-r--r--bind/master/conf-master/e61-1.conf7
-rw-r--r--bind/master/conf-master/e61-2.conf7
-rw-r--r--bind/master/conf-master/e61-3.conf7
-rw-r--r--bind/master/conf-master/e61-4.conf7
-rw-r--r--bind/master/conf-master/e63-1.conf7
-rw-r--r--bind/master/conf-master/e63-2.conf7
-rw-r--r--bind/master/conf-master/e63-3.conf7
-rw-r--r--bind/master/conf-master/e63-4.conf7
-rw-r--r--bind/master/conf-master/e65-1.conf7
-rw-r--r--bind/master/conf-master/e65-2.conf7
-rw-r--r--bind/master/conf-master/e65-3.conf7
-rw-r--r--bind/master/conf-master/e65-4.conf7
-rw-r--r--bind/master/conf-master/e67-1.conf7
-rw-r--r--bind/master/conf-master/e67-2.conf7
-rw-r--r--bind/master/conf-master/e67-3.conf7
-rw-r--r--bind/master/conf-master/e67-4.conf7
-rw-r--r--bind/master/conf-master/e69-1.conf7
-rw-r--r--bind/master/conf-master/e69-2.conf7
-rw-r--r--bind/master/conf-master/e69-3.conf7
-rw-r--r--bind/master/conf-master/e69-4.conf7
-rw-r--r--bind/master/conf-master/e7-3.conf7
-rw-r--r--bind/master/conf-master/e7-4.conf7
-rw-r--r--bind/master/conf-master/e71-1.conf7
-rw-r--r--bind/master/conf-master/e71-2.conf7
-rw-r--r--bind/master/conf-master/e71-3.conf7
-rw-r--r--bind/master/conf-master/e71-4.conf7
-rw-r--r--bind/master/conf-master/e73-1.conf7
-rw-r--r--bind/master/conf-master/e73-2.conf7
-rw-r--r--bind/master/conf-master/e73-3.conf7
-rw-r--r--bind/master/conf-master/e73-4.conf7
-rw-r--r--bind/master/conf-master/e75-1.conf7
-rw-r--r--bind/master/conf-master/e75-2.conf7
-rw-r--r--bind/master/conf-master/e75-3.conf7
-rw-r--r--bind/master/conf-master/e75-4.conf7
-rw-r--r--bind/master/conf-master/e77-1.conf7
-rw-r--r--bind/master/conf-master/e77-2.conf7
-rw-r--r--bind/master/conf-master/e9-3.conf7
-rw-r--r--bind/master/conf-master/e9-4.conf7
-rw-r--r--bind/master/conf-master/fugleberg1.conf7
-rw-r--r--bind/master/conf-master/fugleberg2.conf7
-rw-r--r--bind/master/conf-master/game.conf7
-rw-r--r--bind/master/conf-master/gamehq.conf7
-rw-r--r--bind/master/conf-master/lager.conf7
-rw-r--r--bind/master/conf-master/logistikk.conf7
-rw-r--r--bind/master/conf-master/marsrele.conf7
-rw-r--r--bind/master/conf-master/noc.conf7
-rw-r--r--bind/master/conf-master/presse.conf7
-rw-r--r--bind/master/conf-master/secmedic.conf7
-rw-r--r--bind/master/conf-master/sponsorvest.conf7
-rw-r--r--bind/master/conf-master/stage.conf7
-rw-r--r--bind/master/conf-master/stageboh.conf7
-rw-r--r--bind/master/conf-master/tele.conf7
-rw-r--r--bind/master/conf-master/wlan.conf7
-rw-r--r--bind/master/conf-master/ymse.conf7
-rw-r--r--bind/master/db.012
-rw-r--r--bind/master/db.12713
-rw-r--r--bind/master/db.25512
-rw-r--r--bind/master/db.empty14
-rw-r--r--bind/master/db.local14
-rw-r--r--bind/master/db.root88
-rw-r--r--bind/master/infra.tg13.gathering.org.zone110
-rw-r--r--bind/master/named.conf55
-rw-r--r--bind/master/named.conf.default-zones30
-rw-r--r--bind/master/named.conf.local8
-rw-r--r--bind/master/named.conf.options19
-rw-r--r--bind/master/named.master-include.conf159
-rw-r--r--bind/master/named.reverse4.conf1024
-rw-r--r--bind/master/rndc.key4
-rw-r--r--bind/master/steamorigin-zones61
-rw-r--r--bind/master/tg13.gathering.org.zone91
-rw-r--r--bind/master/zones.rfc191820
-rw-r--r--bind/slave/bind.keys49
-rw-r--r--bind/slave/conf-slave/ap-dist0.conf7
-rw-r--r--bind/slave/conf-slave/ap-dist1.conf7
-rw-r--r--bind/slave/conf-slave/ap-dist2.conf7
-rw-r--r--bind/slave/conf-slave/ap-dist3.conf7
-rw-r--r--bind/slave/conf-slave/ap-dist4.conf7
-rw-r--r--bind/slave/conf-slave/care.conf7
-rw-r--r--bind/slave/conf-slave/chillout.conf7
-rw-r--r--bind/slave/conf-slave/creativia.conf7
-rw-r--r--bind/slave/conf-slave/crew1.conf7
-rw-r--r--bind/slave/conf-slave/crew2.conf7
-rw-r--r--bind/slave/conf-slave/crew3.conf7
-rw-r--r--bind/slave/conf-slave/crew4.conf7
-rw-r--r--bind/slave/conf-slave/crew5.conf7
-rw-r--r--bind/slave/conf-slave/crew6.conf7
-rw-r--r--bind/slave/conf-slave/defektraid.conf7
-rw-r--r--bind/slave/conf-slave/e1-3.conf7
-rw-r--r--bind/slave/conf-slave/e1-4.conf7
-rw-r--r--bind/slave/conf-slave/e11-1.conf7
-rw-r--r--bind/slave/conf-slave/e11-2.conf7
-rw-r--r--bind/slave/conf-slave/e11-3.conf7
-rw-r--r--bind/slave/conf-slave/e11-4.conf7
-rw-r--r--bind/slave/conf-slave/e13-1.conf7
-rw-r--r--bind/slave/conf-slave/e13-2.conf7
-rw-r--r--bind/slave/conf-slave/e13-3.conf7
-rw-r--r--bind/slave/conf-slave/e13-4.conf7
-rw-r--r--bind/slave/conf-slave/e15-1.conf7
-rw-r--r--bind/slave/conf-slave/e15-2.conf7
-rw-r--r--bind/slave/conf-slave/e15-3.conf7
-rw-r--r--bind/slave/conf-slave/e15-4.conf7
-rw-r--r--bind/slave/conf-slave/e17-1.conf7
-rw-r--r--bind/slave/conf-slave/e17-2.conf7
-rw-r--r--bind/slave/conf-slave/e17-3.conf7
-rw-r--r--bind/slave/conf-slave/e17-4.conf7
-rw-r--r--bind/slave/conf-slave/e19-1.conf7
-rw-r--r--bind/slave/conf-slave/e19-2.conf7
-rw-r--r--bind/slave/conf-slave/e19-3.conf7
-rw-r--r--bind/slave/conf-slave/e19-4.conf7
-rw-r--r--bind/slave/conf-slave/e21-1.conf7
-rw-r--r--bind/slave/conf-slave/e21-2.conf7
-rw-r--r--bind/slave/conf-slave/e21-3.conf7
-rw-r--r--bind/slave/conf-slave/e21-4.conf7
-rw-r--r--bind/slave/conf-slave/e23-1.conf7
-rw-r--r--bind/slave/conf-slave/e23-2.conf7
-rw-r--r--bind/slave/conf-slave/e23-3.conf7
-rw-r--r--bind/slave/conf-slave/e23-4.conf7
-rw-r--r--bind/slave/conf-slave/e25-1.conf7
-rw-r--r--bind/slave/conf-slave/e25-2.conf7
-rw-r--r--bind/slave/conf-slave/e25-3.conf7
-rw-r--r--bind/slave/conf-slave/e25-4.conf7
-rw-r--r--bind/slave/conf-slave/e27-1.conf7
-rw-r--r--bind/slave/conf-slave/e27-2.conf7
-rw-r--r--bind/slave/conf-slave/e29-1.conf7
-rw-r--r--bind/slave/conf-slave/e29-2.conf7
-rw-r--r--bind/slave/conf-slave/e3-3.conf7
-rw-r--r--bind/slave/conf-slave/e3-4.conf7
-rw-r--r--bind/slave/conf-slave/e31-1.conf7
-rw-r--r--bind/slave/conf-slave/e31-2.conf7
-rw-r--r--bind/slave/conf-slave/e33-1.conf7
-rw-r--r--bind/slave/conf-slave/e33-2.conf7
-rw-r--r--bind/slave/conf-slave/e35-1.conf7
-rw-r--r--bind/slave/conf-slave/e35-2.conf7
-rw-r--r--bind/slave/conf-slave/e37-1.conf7
-rw-r--r--bind/slave/conf-slave/e37-2.conf7
-rw-r--r--bind/slave/conf-slave/e39-1.conf7
-rw-r--r--bind/slave/conf-slave/e39-2.conf7
-rw-r--r--bind/slave/conf-slave/e41-1.conf7
-rw-r--r--bind/slave/conf-slave/e41-2.conf7
-rw-r--r--bind/slave/conf-slave/e43-1.conf7
-rw-r--r--bind/slave/conf-slave/e43-2.conf7
-rw-r--r--bind/slave/conf-slave/e43-3.conf7
-rw-r--r--bind/slave/conf-slave/e43-4.conf7
-rw-r--r--bind/slave/conf-slave/e45-1.conf7
-rw-r--r--bind/slave/conf-slave/e45-2.conf7
-rw-r--r--bind/slave/conf-slave/e45-3.conf7
-rw-r--r--bind/slave/conf-slave/e45-4.conf7
-rw-r--r--bind/slave/conf-slave/e47-1.conf7
-rw-r--r--bind/slave/conf-slave/e47-2.conf7
-rw-r--r--bind/slave/conf-slave/e47-3.conf7
-rw-r--r--bind/slave/conf-slave/e47-4.conf7
-rw-r--r--bind/slave/conf-slave/e49-1.conf7
-rw-r--r--bind/slave/conf-slave/e49-2.conf7
-rw-r--r--bind/slave/conf-slave/e49-3.conf7
-rw-r--r--bind/slave/conf-slave/e49-4.conf7
-rw-r--r--bind/slave/conf-slave/e5-3.conf7
-rw-r--r--bind/slave/conf-slave/e5-4.conf7
-rw-r--r--bind/slave/conf-slave/e51-1.conf7
-rw-r--r--bind/slave/conf-slave/e51-2.conf7
-rw-r--r--bind/slave/conf-slave/e51-3.conf7
-rw-r--r--bind/slave/conf-slave/e51-4.conf7
-rw-r--r--bind/slave/conf-slave/e53-1.conf7
-rw-r--r--bind/slave/conf-slave/e53-2.conf7
-rw-r--r--bind/slave/conf-slave/e53-3.conf7
-rw-r--r--bind/slave/conf-slave/e53-4.conf7
-rw-r--r--bind/slave/conf-slave/e55-1.conf7
-rw-r--r--bind/slave/conf-slave/e55-2.conf7
-rw-r--r--bind/slave/conf-slave/e55-3.conf7
-rw-r--r--bind/slave/conf-slave/e55-4.conf7
-rw-r--r--bind/slave/conf-slave/e57-1.conf7
-rw-r--r--bind/slave/conf-slave/e57-2.conf7
-rw-r--r--bind/slave/conf-slave/e57-3.conf7
-rw-r--r--bind/slave/conf-slave/e57-4.conf7
-rw-r--r--bind/slave/conf-slave/e59-1.conf7
-rw-r--r--bind/slave/conf-slave/e59-2.conf7
-rw-r--r--bind/slave/conf-slave/e59-3.conf7
-rw-r--r--bind/slave/conf-slave/e59-4.conf7
-rw-r--r--bind/slave/conf-slave/e61-1.conf7
-rw-r--r--bind/slave/conf-slave/e61-2.conf7
-rw-r--r--bind/slave/conf-slave/e61-3.conf7
-rw-r--r--bind/slave/conf-slave/e61-4.conf7
-rw-r--r--bind/slave/conf-slave/e63-1.conf7
-rw-r--r--bind/slave/conf-slave/e63-2.conf7
-rw-r--r--bind/slave/conf-slave/e63-3.conf7
-rw-r--r--bind/slave/conf-slave/e63-4.conf7
-rw-r--r--bind/slave/conf-slave/e65-1.conf7
-rw-r--r--bind/slave/conf-slave/e65-2.conf7
-rw-r--r--bind/slave/conf-slave/e65-3.conf7
-rw-r--r--bind/slave/conf-slave/e65-4.conf7
-rw-r--r--bind/slave/conf-slave/e67-1.conf7
-rw-r--r--bind/slave/conf-slave/e67-2.conf7
-rw-r--r--bind/slave/conf-slave/e67-3.conf7
-rw-r--r--bind/slave/conf-slave/e67-4.conf7
-rw-r--r--bind/slave/conf-slave/e69-1.conf7
-rw-r--r--bind/slave/conf-slave/e69-2.conf7
-rw-r--r--bind/slave/conf-slave/e69-3.conf7
-rw-r--r--bind/slave/conf-slave/e69-4.conf7
-rw-r--r--bind/slave/conf-slave/e7-3.conf7
-rw-r--r--bind/slave/conf-slave/e7-4.conf7
-rw-r--r--bind/slave/conf-slave/e71-1.conf7
-rw-r--r--bind/slave/conf-slave/e71-2.conf7
-rw-r--r--bind/slave/conf-slave/e71-3.conf7
-rw-r--r--bind/slave/conf-slave/e71-4.conf7
-rw-r--r--bind/slave/conf-slave/e73-1.conf7
-rw-r--r--bind/slave/conf-slave/e73-2.conf7
-rw-r--r--bind/slave/conf-slave/e73-3.conf7
-rw-r--r--bind/slave/conf-slave/e73-4.conf7
-rw-r--r--bind/slave/conf-slave/e75-1.conf7
-rw-r--r--bind/slave/conf-slave/e75-2.conf7
-rw-r--r--bind/slave/conf-slave/e75-3.conf7
-rw-r--r--bind/slave/conf-slave/e75-4.conf7
-rw-r--r--bind/slave/conf-slave/e77-1.conf7
-rw-r--r--bind/slave/conf-slave/e77-2.conf7
-rw-r--r--bind/slave/conf-slave/e9-3.conf7
-rw-r--r--bind/slave/conf-slave/e9-4.conf7
-rw-r--r--bind/slave/conf-slave/fugleberg1.conf7
-rw-r--r--bind/slave/conf-slave/fugleberg2.conf7
-rw-r--r--bind/slave/conf-slave/game.conf7
-rw-r--r--bind/slave/conf-slave/gamehq.conf7
-rw-r--r--bind/slave/conf-slave/lager.conf7
-rw-r--r--bind/slave/conf-slave/logistikk.conf7
-rw-r--r--bind/slave/conf-slave/marsrele.conf7
-rw-r--r--bind/slave/conf-slave/noc.conf7
-rw-r--r--bind/slave/conf-slave/presse.conf7
-rw-r--r--bind/slave/conf-slave/secmedic.conf7
-rw-r--r--bind/slave/conf-slave/sponsorvest.conf7
-rw-r--r--bind/slave/conf-slave/stage.conf7
-rw-r--r--bind/slave/conf-slave/stageboh.conf7
-rw-r--r--bind/slave/conf-slave/tele.conf7
-rw-r--r--bind/slave/conf-slave/wlan.conf7
-rw-r--r--bind/slave/conf-slave/ymse.conf7
-rw-r--r--bind/slave/db.012
-rw-r--r--bind/slave/db.12713
-rw-r--r--bind/slave/db.25512
-rw-r--r--bind/slave/db.empty14
-rw-r--r--bind/slave/db.local14
-rw-r--r--bind/slave/db.root88
-rw-r--r--bind/slave/named.conf57
-rw-r--r--bind/slave/named.conf.default-zones30
-rw-r--r--bind/slave/named.conf.local8
-rw-r--r--bind/slave/named.conf.options20
-rw-r--r--bind/slave/named.slave-include.conf159
-rw-r--r--bind/slave/named.slave-reverse4.conf1024
-rw-r--r--bind/slave/rndc.key4
-rw-r--r--bind/slave/zones.rfc191820
-rwxr-xr-xclients/accesspoints.pl76
-rwxr-xr-xclients/admintool.sh19
-rwxr-xr-xclients/dhcptail.pl74
-rwxr-xr-xclients/ipv6-dns.pl133
-rwxr-xr-xclients/ipv6-stats.pl89
-rwxr-xr-xclients/portnames.pl18
-rwxr-xr-xclients/smanagrun.pl167
-rw-r--r--clients/snmp.sql24
-rwxr-xr-xclients/snmpfetch.pl281
-rwxr-xr-xclients/update-public-nms.sh12
-rw-r--r--clients/update-switch-placements.pl53
-rw-r--r--dhcp/README7
-rw-r--r--dhcp/ciscowlc.conf9
-rw-r--r--dhcp/conf.d/ap-dist0.conf14
-rw-r--r--dhcp/conf.d/ap-dist1.conf14
-rw-r--r--dhcp/conf.d/ap-dist2.conf14
-rw-r--r--dhcp/conf.d/ap-dist3.conf14
-rw-r--r--dhcp/conf.d/ap-dist4.conf14
-rw-r--r--dhcp/conf.d/care.conf14
-rw-r--r--dhcp/conf.d/chillout.conf18
-rw-r--r--dhcp/conf.d/creativia.conf14
-rw-r--r--dhcp/conf.d/crew1.conf14
-rw-r--r--dhcp/conf.d/crew2.conf14
-rw-r--r--dhcp/conf.d/crew3.conf14
-rw-r--r--dhcp/conf.d/crew4.conf14
-rw-r--r--dhcp/conf.d/crew5.conf14
-rw-r--r--dhcp/conf.d/crew6.conf14
-rw-r--r--dhcp/conf.d/defektraid.conf14
-rw-r--r--dhcp/conf.d/e1-3.conf14
-rw-r--r--dhcp/conf.d/e1-4.conf14
-rw-r--r--dhcp/conf.d/e11-1.conf14
-rw-r--r--dhcp/conf.d/e11-2.conf14
-rw-r--r--dhcp/conf.d/e11-3.conf14
-rw-r--r--dhcp/conf.d/e11-4.conf14
-rw-r--r--dhcp/conf.d/e13-1.conf14
-rw-r--r--dhcp/conf.d/e13-2.conf14
-rw-r--r--dhcp/conf.d/e13-3.conf14
-rw-r--r--dhcp/conf.d/e13-4.conf14
-rw-r--r--dhcp/conf.d/e15-1.conf14
-rw-r--r--dhcp/conf.d/e15-2.conf14
-rw-r--r--dhcp/conf.d/e15-3.conf14
-rw-r--r--dhcp/conf.d/e15-4.conf14
-rw-r--r--dhcp/conf.d/e17-1.conf14
-rw-r--r--dhcp/conf.d/e17-2.conf14
-rw-r--r--dhcp/conf.d/e17-3.conf14
-rw-r--r--dhcp/conf.d/e17-4.conf14
-rw-r--r--dhcp/conf.d/e19-1.conf14
-rw-r--r--dhcp/conf.d/e19-2.conf14
-rw-r--r--dhcp/conf.d/e19-3.conf14
-rw-r--r--dhcp/conf.d/e19-4.conf14
-rw-r--r--dhcp/conf.d/e21-1.conf14
-rw-r--r--dhcp/conf.d/e21-2.conf14
-rw-r--r--dhcp/conf.d/e21-3.conf14
-rw-r--r--dhcp/conf.d/e21-4.conf14
-rw-r--r--dhcp/conf.d/e23-1.conf14
-rw-r--r--dhcp/conf.d/e23-2.conf14
-rw-r--r--dhcp/conf.d/e23-3.conf14
-rw-r--r--dhcp/conf.d/e23-4.conf14
-rw-r--r--dhcp/conf.d/e25-1.conf14
-rw-r--r--dhcp/conf.d/e25-2.conf14
-rw-r--r--dhcp/conf.d/e25-3.conf14
-rw-r--r--dhcp/conf.d/e25-4.conf14
-rw-r--r--dhcp/conf.d/e27-1.conf14
-rw-r--r--dhcp/conf.d/e27-2.conf14
-rw-r--r--dhcp/conf.d/e29-1.conf14
-rw-r--r--dhcp/conf.d/e29-2.conf14
-rw-r--r--dhcp/conf.d/e3-3.conf14
-rw-r--r--dhcp/conf.d/e3-4.conf14
-rw-r--r--dhcp/conf.d/e31-1.conf14
-rw-r--r--dhcp/conf.d/e31-2.conf14
-rw-r--r--dhcp/conf.d/e33-1.conf14
-rw-r--r--dhcp/conf.d/e33-2.conf14
-rw-r--r--dhcp/conf.d/e35-1.conf14
-rw-r--r--dhcp/conf.d/e35-2.conf14
-rw-r--r--dhcp/conf.d/e37-1.conf14
-rw-r--r--dhcp/conf.d/e37-2.conf14
-rw-r--r--dhcp/conf.d/e39-1.conf14
-rw-r--r--dhcp/conf.d/e39-2.conf14
-rw-r--r--dhcp/conf.d/e41-1.conf14
-rw-r--r--dhcp/conf.d/e41-2.conf14
-rw-r--r--dhcp/conf.d/e43-1.conf14
-rw-r--r--dhcp/conf.d/e43-2.conf14
-rw-r--r--dhcp/conf.d/e43-3.conf14
-rw-r--r--dhcp/conf.d/e43-4.conf14
-rw-r--r--dhcp/conf.d/e45-1.conf14
-rw-r--r--dhcp/conf.d/e45-2.conf14
-rw-r--r--dhcp/conf.d/e45-3.conf14
-rw-r--r--dhcp/conf.d/e45-4.conf14
-rw-r--r--dhcp/conf.d/e47-1.conf14
-rw-r--r--dhcp/conf.d/e47-2.conf14
-rw-r--r--dhcp/conf.d/e47-3.conf14
-rw-r--r--dhcp/conf.d/e47-4.conf14
-rw-r--r--dhcp/conf.d/e49-1.conf14
-rw-r--r--dhcp/conf.d/e49-2.conf14
-rw-r--r--dhcp/conf.d/e49-3.conf14
-rw-r--r--dhcp/conf.d/e49-4.conf14
-rw-r--r--dhcp/conf.d/e5-3.conf14
-rw-r--r--dhcp/conf.d/e5-4.conf14
-rw-r--r--dhcp/conf.d/e51-1.conf14
-rw-r--r--dhcp/conf.d/e51-2.conf14
-rw-r--r--dhcp/conf.d/e51-3.conf14
-rw-r--r--dhcp/conf.d/e51-4.conf14
-rw-r--r--dhcp/conf.d/e53-1.conf14
-rw-r--r--dhcp/conf.d/e53-2.conf14
-rw-r--r--dhcp/conf.d/e53-3.conf14
-rw-r--r--dhcp/conf.d/e53-4.conf14
-rw-r--r--dhcp/conf.d/e55-1.conf14
-rw-r--r--dhcp/conf.d/e55-2.conf14
-rw-r--r--dhcp/conf.d/e55-3.conf14
-rw-r--r--dhcp/conf.d/e55-4.conf14
-rw-r--r--dhcp/conf.d/e57-1.conf14
-rw-r--r--dhcp/conf.d/e57-2.conf14
-rw-r--r--dhcp/conf.d/e57-3.conf14
-rw-r--r--dhcp/conf.d/e57-4.conf14
-rw-r--r--dhcp/conf.d/e59-1.conf14
-rw-r--r--dhcp/conf.d/e59-2.conf14
-rw-r--r--dhcp/conf.d/e59-3.conf14
-rw-r--r--dhcp/conf.d/e59-4.conf14
-rw-r--r--dhcp/conf.d/e61-1.conf14
-rw-r--r--dhcp/conf.d/e61-2.conf14
-rw-r--r--dhcp/conf.d/e61-3.conf14
-rw-r--r--dhcp/conf.d/e61-4.conf14
-rw-r--r--dhcp/conf.d/e63-1.conf14
-rw-r--r--dhcp/conf.d/e63-2.conf14
-rw-r--r--dhcp/conf.d/e63-3.conf14
-rw-r--r--dhcp/conf.d/e63-4.conf14
-rw-r--r--dhcp/conf.d/e65-1.conf14
-rw-r--r--dhcp/conf.d/e65-2.conf14
-rw-r--r--dhcp/conf.d/e65-3.conf14
-rw-r--r--dhcp/conf.d/e65-4.conf14
-rw-r--r--dhcp/conf.d/e67-1.conf14
-rw-r--r--dhcp/conf.d/e67-2.conf14
-rw-r--r--dhcp/conf.d/e67-3.conf14
-rw-r--r--dhcp/conf.d/e67-4.conf14
-rw-r--r--dhcp/conf.d/e69-1.conf14
-rw-r--r--dhcp/conf.d/e69-2.conf14
-rw-r--r--dhcp/conf.d/e69-3.conf14
-rw-r--r--dhcp/conf.d/e69-4.conf14
-rw-r--r--dhcp/conf.d/e7-3.conf14
-rw-r--r--dhcp/conf.d/e7-4.conf14
-rw-r--r--dhcp/conf.d/e71-1.conf14
-rw-r--r--dhcp/conf.d/e71-2.conf14
-rw-r--r--dhcp/conf.d/e71-3.conf14
-rw-r--r--dhcp/conf.d/e71-4.conf14
-rw-r--r--dhcp/conf.d/e73-1.conf14
-rw-r--r--dhcp/conf.d/e73-2.conf14
-rw-r--r--dhcp/conf.d/e73-3.conf14
-rw-r--r--dhcp/conf.d/e73-4.conf14
-rw-r--r--dhcp/conf.d/e75-1.conf14
-rw-r--r--dhcp/conf.d/e75-2.conf14
-rw-r--r--dhcp/conf.d/e75-3.conf14
-rw-r--r--dhcp/conf.d/e75-4.conf14
-rw-r--r--dhcp/conf.d/e77-1.conf14
-rw-r--r--dhcp/conf.d/e77-2.conf14
-rw-r--r--dhcp/conf.d/e9-3.conf14
-rw-r--r--dhcp/conf.d/e9-4.conf14
-rw-r--r--dhcp/conf.d/fugleberg1.conf14
-rw-r--r--dhcp/conf.d/fugleberg2.conf15
-rw-r--r--dhcp/conf.d/game.conf14
-rw-r--r--dhcp/conf.d/gamehq.conf14
-rw-r--r--dhcp/conf.d/lager.conf14
-rw-r--r--dhcp/conf.d/logistikk.conf14
-rw-r--r--dhcp/conf.d/marsrele.conf14
-rw-r--r--dhcp/conf.d/noc.conf34
-rw-r--r--dhcp/conf.d/presse.conf14
-rw-r--r--dhcp/conf.d/secmedic.conf14
-rw-r--r--dhcp/conf.d/sponsorvest.conf16
-rw-r--r--dhcp/conf.d/stage.conf16
-rw-r--r--dhcp/conf.d/stageboh.conf15
-rw-r--r--dhcp/conf.d/tele.conf14
-rw-r--r--dhcp/conf.d/wlan.conf14
-rw-r--r--dhcp/conf.d/ymse.conf15
-rw-r--r--dhcp/dhcpd.conf30
-rw-r--r--dhcp/generated-include.conf159
-rw-r--r--dhcp/pxe-boot.conf2
-rw-r--r--dhcp/revzones.conf128
-rwxr-xr-xdlink-ng/dlink-ng.pl1097
-rwxr-xr-xdlink-ng/make-dlink-config.pl70
-rw-r--r--include/config.local.pm100
-rw-r--r--include/config.pm25
-rw-r--r--include/nms.pm104
-rw-r--r--include/tgmanage.cfg.sh19
-rw-r--r--infra-dns.txt28
-rw-r--r--iptables-dnat-hack.txt140
-rw-r--r--mbd/access_list.pl294
-rw-r--r--mbd/derpspan.c48
-rwxr-xr-xmbd/generate-helper-list.pl15
-rw-r--r--mbd/make-mbd-nets.pl26
-rw-r--r--mbd/mbd-unicast-segfaulting.pl273
-rw-r--r--mbd/mbd-unicast.pl254
-rw-r--r--mbd/mbd.pl254
-rw-r--r--mbd/mbd.pm50
-rw-r--r--mbd/nets.pl171
-rw-r--r--mbd/packetpusher.c127
-rw-r--r--mbd/survey.pl10
-rw-r--r--netlist.txt162
-rw-r--r--patches/README13
-rw-r--r--patches/dhcpd-never-broadcast.diff88
-rw-r--r--patchlist.txt128
-rw-r--r--patchlist.txt.crew6
-rw-r--r--pingswitches.txt128
-rw-r--r--planning/planning.cpp579
-rw-r--r--pxe/chain.c32bin0 -> 20448 bytes
-rw-r--r--pxe/menu.c32bin0 -> 61312 bytes
-rw-r--r--pxe/menus/background.pngbin0 -> 300425 bytes
-rw-r--r--pxe/menus/bg.pngbin0 -> 171182 bytes
-rw-r--r--pxe/menus/common.cfg24
-rw-r--r--pxe/menus/debian.cfg35
-rw-r--r--pxe/menus/tools.cfg36
-rw-r--r--pxe/menus/ubuntu.cfg47
-rw-r--r--pxe/pxelinux.0bin0 -> 26816 bytes
-rw-r--r--pxe/pxelinux.cfg/default39
-rw-r--r--pxe/version.info2
-rw-r--r--pxe/vesamenu.c32bin0 -> 163116 bytes
-rw-r--r--sql/nms.sql2043
-rw-r--r--sql/strip.pl33
-rwxr-xr-xstream/encode/kliniskarbeidsflate/reflect-krosus.sh4
-rwxr-xr-xstream/encode/kliniskarbeidsflate/reflect.sh4
-rwxr-xr-xstream/encode/kliniskarbeidsflate/transcode-event-sd.sh7
-rwxr-xr-xstream/encode/kliniskarbeidsflate/transcode-fugle-flash.sh7
-rwxr-xr-xstream/encode/kliniskarbeidsflate/transcode-noc-fisheye-flash.sh6
-rwxr-xr-xstream/encode/kliniskarbeidsflate/transcode-south.sh9
-rwxr-xr-xstream/encode/politietno/foo-withoutreflect.sh6
-rwxr-xr-xstream/encode/politietno/foo.sh6
-rwxr-xr-xstream/encode/politietno/svineri.sh24
-rwxr-xr-xstream/encode/politietno/transcode-duplicate.sh7
-rwxr-xr-xstream/encode/politietno/transcode-duplicate2.sh10
-rwxr-xr-xstream/encode/politietno/transcode.sh6
-rwxr-xr-xstream/encode/politietno/vid.sh7
-rwxr-xr-xstream/reflect/count-retrofit.sh22
-rwxr-xr-xstream/reflect/count.sh22
-rwxr-xr-xstream/reflect/htb.sh79
-rwxr-xr-xstream/reflect/old/reflectsouth.sh5
-rwxr-xr-xstream/reflect/old/reflectsouth720p.sh6
-rwxr-xr-xstream/reflect/reflect-event-lol.sh7
-rwxr-xr-xstream/reflect/reflect-event-sd.sh5
-rwxr-xr-xstream/reflect/reflect-event.sh7
-rwxr-xr-xstream/reflect/reflect-fugle-flash.sh6
-rwxr-xr-xstream/reflect/reflect-fuglecam.sh5
-rwxr-xr-xstream/reflect/reflect-nicfisheye-flash.sh5
-rwxr-xr-xstream/reflect/reflect-noc-transcodes.sh5
-rwxr-xr-xstream/reflect/reflect-nocfisheye.sh5
-rwxr-xr-xstream/reflect/reflect-south-raw.sh5
-rwxr-xr-xstream/reflect/reflect-south-transcode.sh5
-rwxr-xr-xstream/reflect/transcode-event-flash.sh6
-rwxr-xr-xstream/reflect/transcode-fugle-flash.sh6
-rwxr-xr-xstream/reflect/transcode-nocfisheye-flash.sh6
-rwxr-xr-xstream/reflect/transcode-south-flash.sh6
-rw-r--r--stream/reflect/usage.txt3
-rwxr-xr-xstream/transcode/count.sh17
-rwxr-xr-xstream/transcode/flash.sh6
-rwxr-xr-xstream/transcode/flashtest.sh5
-rwxr-xr-xstream/transcode/ios-sd.sh7
-rwxr-xr-xstream/transcode/ios-south.sh7
-rw-r--r--stream/vlc-patches/listen_all.git.patch28
-rw-r--r--stream/vlc-patches/vlc-git-sesse.patch131
-rw-r--r--stream/vlc-patches/vlc-mark.patch136
-rw-r--r--switches.txt128
-rw-r--r--switches.txt.crew6
-rw-r--r--tools/README139
-rw-r--r--tools/TODO26
-rwxr-xr-xtools/apply-baseupdate.sh14
-rwxr-xr-xtools/create-shellconf.pl51
-rwxr-xr-xtools/dhcp6-nets.pl12
-rwxr-xr-xtools/dlink-ng2dns.pl77
-rwxr-xr-xtools/fetch-debinstall.sh17
-rwxr-xr-xtools/fetch-portlist.sh42
-rwxr-xr-xtools/generate-dnsrr.pl147
-rwxr-xr-xtools/init-sshkeys.sh14
-rwxr-xr-xtools/install-dependencies.sh53
-rwxr-xr-xtools/make-accesspoints.pl24
-rwxr-xr-xtools/make-base-requires.sh60
-rwxr-xr-xtools/make-bind-include.pl51
-rwxr-xr-xtools/make-dhcpd-include.pl18
-rwxr-xr-xtools/make-dhcpd.pl104
-rwxr-xr-xtools/make-first-zones.pl124
-rwxr-xr-xtools/make-linknet-hosts.pl34
-rwxr-xr-xtools/make-missing-conf.pl187
-rwxr-xr-xtools/make-named.pl156
-rwxr-xr-xtools/make-pxeboot.sh26
-rwxr-xr-xtools/make-reverse4-files.pl164
-rwxr-xr-xtools/make-switch-placements.pl88
-rwxr-xr-xtools/make-switches.pl33
-rwxr-xr-xtools/update-baseservice.sh29
-rwxr-xr-xtools/update-tools.sh21
-rw-r--r--web/etc/apache2/nms-public.tg13.gathering.org11
-rw-r--r--web/etc/apache2/nms.tg13.gathering.org39
-rw-r--r--web/etc/apache2/stream.tg13.gathering.org25
-rw-r--r--web/etc/apache2/tech.tg13.gathering.org12
-rw-r--r--web/etc/cron/update-public-nms3
-rw-r--r--web/nms-public.gathering.org/dhcp.html10
-rw-r--r--web/nms-public.gathering.org/dhcpkart.html10
-rw-r--r--web/nms-public.gathering.org/index.html15
-rw-r--r--web/nms-public.gathering.org/led.pl128
-rw-r--r--web/nms-public.gathering.org/led.txt256
-rw-r--r--web/nms-public.gathering.org/nettkart-dhcp.pngbin0 -> 203313 bytes
-rw-r--r--web/nms-public.gathering.org/nettkart-trafikk.html10
-rw-r--r--web/nms-public.gathering.org/nettkart-trafikk.pngbin0 -> 291454 bytes
-rw-r--r--web/nms-public.gathering.org/trafikk.html10
-rwxr-xr-xweb/nms.gathering.org/apkart.pl89
-rw-r--r--web/nms.gathering.org/bg07.pngbin0 -> 498409 bytes
-rwxr-xr-xweb/nms.gathering.org/dhcpkart.pl94
-rw-r--r--web/nms.gathering.org/index.html92
-rwxr-xr-xweb/nms.gathering.org/led.pl20
-rwxr-xr-xweb/nms.gathering.org/mbd-status.pl44
-rwxr-xr-xweb/nms.gathering.org/mygraph.pl179
-rw-r--r--web/nms.gathering.org/nettkart-continuous.html31
-rwxr-xr-xweb/nms.gathering.org/nettkart-telnet.pl47
-rwxr-xr-xweb/nms.gathering.org/nettkart-text.pl47
-rwxr-xr-xweb/nms.gathering.org/nettkart-web.pl47
-rwxr-xr-xweb/nms.gathering.org/nettkart.pl142
-rwxr-xr-xweb/nms.gathering.org/portkart.pl82
-rwxr-xr-xweb/nms.gathering.org/showswitch.pl221
-rw-r--r--web/nms.gathering.org/slide.html38
-rwxr-xr-xweb/nms.gathering.org/smanagement.pl239
-rwxr-xr-xweb/nms.gathering.org/ssendfile.pl48
-rwxr-xr-xweb/nms.gathering.org/sshow.pl257
-rwxr-xr-xweb/nms.gathering.org/stromkart.pl69
-rwxr-xr-xweb/nms.gathering.org/uplinkkart-text.pl38
-rwxr-xr-xweb/nms.gathering.org/uplinkkart.pl70
-rwxr-xr-xweb/nms.gathering.org/uplinktrafikkart.pl90
-rwxr-xr-xweb/stream.tg13.gathering.org/fix_count.pl31
-rw-r--r--web/stream.tg13.gathering.org/img/cam-map.pngbin0 -> 113375 bytes
-rw-r--r--web/stream.tg13.gathering.org/img/icon_1.pngbin0 -> 3142 bytes
-rw-r--r--web/stream.tg13.gathering.org/img/icon_2.pngbin0 -> 3336 bytes
-rw-r--r--web/stream.tg13.gathering.org/img/icon_3.pngbin0 -> 3385 bytes
-rw-r--r--web/stream.tg13.gathering.org/img/icon_camera.pngbin0 -> 3786 bytes
-rw-r--r--web/stream.tg13.gathering.org/img/icon_event.pngbin0 -> 3463 bytes
-rw-r--r--web/stream.tg13.gathering.org/img/icon_hd.pngbin0 -> 3412 bytes
-rw-r--r--web/stream.tg13.gathering.org/img/icon_sd.pngbin0 -> 3731 bytes
-rwxr-xr-xweb/stream.tg13.gathering.org/index-bak.pl67
-rw-r--r--web/stream.tg13.gathering.org/index-bak.tmpl31
-rwxr-xr-xweb/stream.tg13.gathering.org/index.pl72
-rw-r--r--web/stream.tg13.gathering.org/index.tmpl35
-rw-r--r--web/stream.tg13.gathering.org/ios/PLACEHOLDER0
-rw-r--r--web/stream.tg13.gathering.org/ios/event.m3u816
-rw-r--r--web/stream.tg13.gathering.org/ios/stream.m3u88
-rw-r--r--web/stream.tg13.gathering.org/singularity.css1960
-rw-r--r--web/stream.tg13.gathering.org/singularity.pngbin0 -> 19719 bytes
-rwxr-xr-xweb/stream.tg13.gathering.org/stream.pl87
-rwxr-xr-xweb/stream.tg13.gathering.org/streamstats-fast.pl15
-rw-r--r--web/stream.tg13.gathering.org/streamstats.cpp217
-rw-r--r--web/stream.tg13.gathering.org/streamstats.html81
-rwxr-xr-xweb/stream.tg13.gathering.org/streamstats.pl116
-rw-r--r--web/stream.tg13.gathering.org/superawesomeness.css24
-rwxr-xr-xweb/stream.tg13.gathering.org/test.pl70
-rw-r--r--web/stream.tg13.gathering.org/test.tmpl31
-rw-r--r--web/streamlib/stream.pm36
-rw-r--r--web/streamlib/stream/config.pm160
-rwxr-xr-xweb/tech.gathering.org/event-720p.mp4.pl11
-rw-r--r--web/tech.gathering.org/index.html20
-rw-r--r--web/tech.gathering.org/logo.pngbin0 -> 19719 bytes
-rw-r--r--web/tech.gathering.org/styles.css24
708 files changed, 24001 insertions, 1 deletions
diff --git a/README.md b/README.md
index 6a9c1cd..834e662 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,29 @@
-tgmanage
+tgmanage -- tools and hacks by Tech:Server
========
+
+## planning.txt? patchlist.txt? netlist.txt? bootstrap? SETUP?!
+
+See tools/README…
+
+## dlink-ng usage
+
+> Update A/AAAA/PTR for dlink switches
+dlink-ng/make-dlink-config.pl switches.txt patchlist.txt | tools/dlink-ng2dns.pl | head -n 30
+
+> Delete records for creative1 in DNS
+dlink-ng/make-dlink-config.pl switches.txt patchlist.txt | grep '^creative1 ' | tools/dlink-ng2dns.pl -d
+
+> Configure both dlink and cisco side
+dlink-ng/make-dlink-config.pl switches.txt patchlist.txt | grep 'creative[12]' | perl dlink-ng/dlink-ng.pl
+
+> Configuring dlink switches for a single dlink switch
+dlink-ng/make-dlink-config.pl switches.txt patchlist.txt | grep 'creative[1-8+] ' | dlink-ng/dlink-ng.pl -s creative3
+
+> Configuring dlink switches from cisco side only
+dlink-ng/make-dlink-config.pl switches.txt patchlist.txt | grep creative | perl dlink-ng/dlink-ng.pl -c
+
+> Configures all switches with lots of threads love <3
+dlink-ng/dlink-ng.pl switches.txt patchlist.txt
+
+> DNS for all switches pewpew
+dlink-ng/dlink-ng.pl switches.txt patchlist.txt | tools/dlink-ng2dns.pl \ No newline at end of file
diff --git a/bind/README b/bind/README
new file mode 100644
index 0000000..53299b8
--- /dev/null
+++ b/bind/README
@@ -0,0 +1,5 @@
+== BIND
+
+This directory is a copy of our install, please do not use these directly!
+It is provided to show you what the scripts are generating for you…
+
diff --git a/bind/master/2.0.d.e.2.0.a.2.ip6.arpa.zone b/bind/master/2.0.d.e.2.0.a.2.ip6.arpa.zone
new file mode 100644
index 0000000..9560c4b
--- /dev/null
+++ b/bind/master/2.0.d.e.2.0.a.2.ip6.arpa.zone
@@ -0,0 +1,36 @@
+$ORIGIN .
+$TTL 3600 ; 1 hour
+2.0.d.e.2.0.a.2.ip6.arpa IN SOA ns1.tg13.gathering.org. abuse.gathering.org. (
+ 2013736881 ; serial
+ 3600 ; refresh (1 hour)
+ 1800 ; retry (30 minutes)
+ 608400 ; expire (1 week 1 hour)
+ 3600 ; minimum (1 hour)
+ )
+ NS ns1.tg13.gathering.org.
+ NS ns2.tg13.gathering.org.
+$ORIGIN 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.f.f.f.f.2.0.d.e.2.0.a.2.ip6.arpa.
+$TTL 3600 ; 1 hour
+1 PTR telegw.infra.tg13.gathering.org.
+2 PTR nocgw.infra.tg13.gathering.org.
+3 PTR camgw.infra.tg13.gathering.org.
+4 PTR stageboh.infra.tg13.gathering.org.
+5 PTR wtfgw.infra.tg13.gathering.org.
+6 PTR logistikkgw.infra.tg13.gathering.org.
+7 PTR corengw.infra.tg13.gathering.org.
+8 PTR coresgw.infra.tg13.gathering.org.
+9 PTR crewgw.infra.tg13.gathering.org.
+$ORIGIN 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.f.f.f.f.2.0.d.e.2.0.a.2.ip6.arpa.
+0 PTR tvgw.infra.tg13.gathering.org.
+1 PTR gamegw.infra.tg13.gathering.org.
+2 PTR resepsjongw.infra.tg13.gathering.org.
+3 PTR pressegw.infra.tg13.gathering.org.
+4 PTR sponsorgw.infra.tg13.gathering.org.
+5 PTR komplettgw.infra.tg13.gathering.org.
+6 PTR eldregw.infra.tg13.gathering.org.
+7 PTR distro0.infra.tg13.gathering.org.
+8 PTR distro1.infra.tg13.gathering.org.
+9 PTR distro2.infra.tg13.gathering.org.
+$ORIGIN 2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.f.f.f.f.2.0.d.e.2.0.a.2.ip6.arpa.
+0 PTR distro3.infra.tg13.gathering.org.
+1 PTR distro4.infra.tg13.gathering.org.
diff --git a/bind/master/55.169.31.in-addr.arpa.zone b/bind/master/55.169.31.in-addr.arpa.zone
new file mode 100644
index 0000000..29dfe30
--- /dev/null
+++ b/bind/master/55.169.31.in-addr.arpa.zone
@@ -0,0 +1,267 @@
+$TTL 3600
+@ IN SOA ns1.tg13.gathering.org. abuse.gathering.org. (
+ 2013032802 ; serial
+ 3600 ; refresh
+ 1800 ; retry
+ 608400 ; expire
+ 3600 ) ; minimum and default TTL
+
+ IN NS ns1.tg13.gathering.org.
+ IN NS ns2.tg13.gathering.org.
+
+$ORIGIN 55.169.31.in-addr.arpa.
+
+1 IN PTR 31-169-55-1.tg13.kandu.no.
+2 IN PTR 31-169-55-2.tg13.kandu.no.
+3 IN PTR 31-169-55-3.tg13.kandu.no.
+4 IN PTR 31-169-55-4.tg13.kandu.no.
+5 IN PTR 31-169-55-5.tg13.kandu.no.
+6 IN PTR 31-169-55-6.tg13.kandu.no.
+7 IN PTR 31-169-55-7.tg13.kandu.no.
+8 IN PTR 31-169-55-8.tg13.kandu.no.
+9 IN PTR 31-169-55-9.tg13.kandu.no.
+10 IN PTR 31-169-55-10.tg13.kandu.no.
+11 IN PTR 31-169-55-11.tg13.kandu.no.
+12 IN PTR 31-169-55-12.tg13.kandu.no.
+13 IN PTR 31-169-55-13.tg13.kandu.no.
+14 IN PTR 31-169-55-14.tg13.kandu.no.
+15 IN PTR 31-169-55-15.tg13.kandu.no.
+16 IN PTR 31-169-55-16.tg13.kandu.no.
+17 IN PTR 31-169-55-17.tg13.kandu.no.
+18 IN PTR 31-169-55-18.tg13.kandu.no.
+19 IN PTR 31-169-55-19.tg13.kandu.no.
+20 IN PTR 31-169-55-20.tg13.kandu.no.
+21 IN PTR 31-169-55-21.tg13.kandu.no.
+22 IN PTR 31-169-55-22.tg13.kandu.no.
+23 IN PTR 31-169-55-23.tg13.kandu.no.
+24 IN PTR 31-169-55-24.tg13.kandu.no.
+25 IN PTR 31-169-55-25.tg13.kandu.no.
+26 IN PTR 31-169-55-26.tg13.kandu.no.
+27 IN PTR 31-169-55-27.tg13.kandu.no.
+28 IN PTR 31-169-55-28.tg13.kandu.no.
+29 IN PTR 31-169-55-29.tg13.kandu.no.
+30 IN PTR 31-169-55-30.tg13.kandu.no.
+31 IN PTR 31-169-55-31.tg13.kandu.no.
+32 IN PTR 31-169-55-32.tg13.kandu.no.
+33 IN PTR 31-169-55-33.tg13.kandu.no.
+34 IN PTR 31-169-55-34.tg13.kandu.no.
+35 IN PTR 31-169-55-35.tg13.kandu.no.
+36 IN PTR 31-169-55-36.tg13.kandu.no.
+37 IN PTR 31-169-55-37.tg13.kandu.no.
+38 IN PTR 31-169-55-38.tg13.kandu.no.
+39 IN PTR 31-169-55-39.tg13.kandu.no.
+40 IN PTR 31-169-55-40.tg13.kandu.no.
+41 IN PTR 31-169-55-41.tg13.kandu.no.
+42 IN PTR 31-169-55-42.tg13.kandu.no.
+43 IN PTR 31-169-55-43.tg13.kandu.no.
+44 IN PTR 31-169-55-44.tg13.kandu.no.
+45 IN PTR 31-169-55-45.tg13.kandu.no.
+46 IN PTR 31-169-55-46.tg13.kandu.no.
+47 IN PTR 31-169-55-47.tg13.kandu.no.
+48 IN PTR 31-169-55-48.tg13.kandu.no.
+49 IN PTR 31-169-55-49.tg13.kandu.no.
+50 IN PTR 31-169-55-50.tg13.kandu.no.
+51 IN PTR 31-169-55-51.tg13.kandu.no.
+52 IN PTR 31-169-55-52.tg13.kandu.no.
+53 IN PTR 31-169-55-53.tg13.kandu.no.
+54 IN PTR 31-169-55-54.tg13.kandu.no.
+55 IN PTR 31-169-55-55.tg13.kandu.no.
+56 IN PTR 31-169-55-56.tg13.kandu.no.
+57 IN PTR 31-169-55-57.tg13.kandu.no.
+58 IN PTR 31-169-55-58.tg13.kandu.no.
+59 IN PTR 31-169-55-59.tg13.kandu.no.
+60 IN PTR 31-169-55-60.tg13.kandu.no.
+61 IN PTR 31-169-55-61.tg13.kandu.no.
+62 IN PTR 31-169-55-62.tg13.kandu.no.
+63 IN PTR 31-169-55-63.tg13.kandu.no.
+64 IN PTR 31-169-55-64.tg13.kandu.no.
+65 IN PTR 31-169-55-65.tg13.kandu.no.
+66 IN PTR 31-169-55-66.tg13.kandu.no.
+67 IN PTR 31-169-55-67.tg13.kandu.no.
+68 IN PTR 31-169-55-68.tg13.kandu.no.
+69 IN PTR 31-169-55-69.tg13.kandu.no.
+70 IN PTR 31-169-55-70.tg13.kandu.no.
+71 IN PTR 31-169-55-71.tg13.kandu.no.
+72 IN PTR 31-169-55-72.tg13.kandu.no.
+73 IN PTR 31-169-55-73.tg13.kandu.no.
+74 IN PTR 31-169-55-74.tg13.kandu.no.
+75 IN PTR 31-169-55-75.tg13.kandu.no.
+76 IN PTR 31-169-55-76.tg13.kandu.no.
+77 IN PTR 31-169-55-77.tg13.kandu.no.
+78 IN PTR 31-169-55-78.tg13.kandu.no.
+79 IN PTR 31-169-55-79.tg13.kandu.no.
+80 IN PTR 31-169-55-80.tg13.kandu.no.
+81 IN PTR 31-169-55-81.tg13.kandu.no.
+82 IN PTR 31-169-55-82.tg13.kandu.no.
+83 IN PTR 31-169-55-83.tg13.kandu.no.
+84 IN PTR 31-169-55-84.tg13.kandu.no.
+85 IN PTR 31-169-55-85.tg13.kandu.no.
+86 IN PTR 31-169-55-86.tg13.kandu.no.
+87 IN PTR 31-169-55-87.tg13.kandu.no.
+88 IN PTR 31-169-55-88.tg13.kandu.no.
+89 IN PTR 31-169-55-89.tg13.kandu.no.
+90 IN PTR 31-169-55-90.tg13.kandu.no.
+91 IN PTR 31-169-55-91.tg13.kandu.no.
+92 IN PTR 31-169-55-92.tg13.kandu.no.
+93 IN PTR 31-169-55-93.tg13.kandu.no.
+94 IN PTR 31-169-55-94.tg13.kandu.no.
+95 IN PTR 31-169-55-95.tg13.kandu.no.
+96 IN PTR 31-169-55-96.tg13.kandu.no.
+97 IN PTR 31-169-55-97.tg13.kandu.no.
+98 IN PTR 31-169-55-98.tg13.kandu.no.
+99 IN PTR 31-169-55-99.tg13.kandu.no.
+100 IN PTR 31-169-55-100.tg13.kandu.no.
+101 IN PTR 31-169-55-101.tg13.kandu.no.
+102 IN PTR 31-169-55-102.tg13.kandu.no.
+103 IN PTR 31-169-55-103.tg13.kandu.no.
+104 IN PTR 31-169-55-104.tg13.kandu.no.
+105 IN PTR 31-169-55-105.tg13.kandu.no.
+106 IN PTR 31-169-55-106.tg13.kandu.no.
+107 IN PTR 31-169-55-107.tg13.kandu.no.
+108 IN PTR 31-169-55-108.tg13.kandu.no.
+109 IN PTR 31-169-55-109.tg13.kandu.no.
+110 IN PTR 31-169-55-110.tg13.kandu.no.
+111 IN PTR 31-169-55-111.tg13.kandu.no.
+112 IN PTR 31-169-55-112.tg13.kandu.no.
+113 IN PTR 31-169-55-113.tg13.kandu.no.
+114 IN PTR 31-169-55-114.tg13.kandu.no.
+115 IN PTR 31-169-55-115.tg13.kandu.no.
+116 IN PTR 31-169-55-116.tg13.kandu.no.
+117 IN PTR 31-169-55-117.tg13.kandu.no.
+118 IN PTR 31-169-55-118.tg13.kandu.no.
+119 IN PTR 31-169-55-119.tg13.kandu.no.
+120 IN PTR 31-169-55-120.tg13.kandu.no.
+121 IN PTR 31-169-55-121.tg13.kandu.no.
+122 IN PTR 31-169-55-122.tg13.kandu.no.
+123 IN PTR 31-169-55-123.tg13.kandu.no.
+124 IN PTR 31-169-55-124.tg13.kandu.no.
+125 IN PTR 31-169-55-125.tg13.kandu.no.
+126 IN PTR 31-169-55-126.tg13.kandu.no.
+127 IN PTR 31-169-55-127.tg13.kandu.no.
+128 IN PTR 31-169-55-128.tg13.kandu.no.
+129 IN PTR 31-169-55-129.tg13.kandu.no.
+130 IN PTR 31-169-55-130.tg13.kandu.no.
+131 IN PTR 31-169-55-131.tg13.kandu.no.
+132 IN PTR 31-169-55-132.tg13.kandu.no.
+133 IN PTR 31-169-55-133.tg13.kandu.no.
+134 IN PTR 31-169-55-134.tg13.kandu.no.
+135 IN PTR 31-169-55-135.tg13.kandu.no.
+136 IN PTR 31-169-55-136.tg13.kandu.no.
+137 IN PTR 31-169-55-137.tg13.kandu.no.
+138 IN PTR 31-169-55-138.tg13.kandu.no.
+139 IN PTR 31-169-55-139.tg13.kandu.no.
+140 IN PTR 31-169-55-140.tg13.kandu.no.
+141 IN PTR 31-169-55-141.tg13.kandu.no.
+142 IN PTR 31-169-55-142.tg13.kandu.no.
+143 IN PTR 31-169-55-143.tg13.kandu.no.
+144 IN PTR 31-169-55-144.tg13.kandu.no.
+145 IN PTR 31-169-55-145.tg13.kandu.no.
+146 IN PTR 31-169-55-146.tg13.kandu.no.
+147 IN PTR 31-169-55-147.tg13.kandu.no.
+148 IN PTR 31-169-55-148.tg13.kandu.no.
+149 IN PTR 31-169-55-149.tg13.kandu.no.
+150 IN PTR 31-169-55-150.tg13.kandu.no.
+151 IN PTR 31-169-55-151.tg13.kandu.no.
+152 IN PTR 31-169-55-152.tg13.kandu.no.
+153 IN PTR 31-169-55-153.tg13.kandu.no.
+154 IN PTR 31-169-55-154.tg13.kandu.no.
+155 IN PTR 31-169-55-155.tg13.kandu.no.
+156 IN PTR 31-169-55-156.tg13.kandu.no.
+157 IN PTR 31-169-55-157.tg13.kandu.no.
+158 IN PTR 31-169-55-158.tg13.kandu.no.
+159 IN PTR 31-169-55-159.tg13.kandu.no.
+160 IN PTR 31-169-55-160.tg13.kandu.no.
+161 IN PTR 31-169-55-161.tg13.kandu.no.
+162 IN PTR 31-169-55-162.tg13.kandu.no.
+163 IN PTR 31-169-55-163.tg13.kandu.no.
+164 IN PTR 31-169-55-164.tg13.kandu.no.
+165 IN PTR 31-169-55-165.tg13.kandu.no.
+166 IN PTR 31-169-55-166.tg13.kandu.no.
+167 IN PTR 31-169-55-167.tg13.kandu.no.
+168 IN PTR 31-169-55-168.tg13.kandu.no.
+169 IN PTR 31-169-55-169.tg13.kandu.no.
+170 IN PTR 31-169-55-170.tg13.kandu.no.
+171 IN PTR 31-169-55-171.tg13.kandu.no.
+172 IN PTR 31-169-55-172.tg13.kandu.no.
+173 IN PTR 31-169-55-173.tg13.kandu.no.
+174 IN PTR 31-169-55-174.tg13.kandu.no.
+175 IN PTR 31-169-55-175.tg13.kandu.no.
+176 IN PTR 31-169-55-176.tg13.kandu.no.
+177 IN PTR 31-169-55-177.tg13.kandu.no.
+178 IN PTR 31-169-55-178.tg13.kandu.no.
+179 IN PTR 31-169-55-179.tg13.kandu.no.
+180 IN PTR 31-169-55-180.tg13.kandu.no.
+181 IN PTR 31-169-55-181.tg13.kandu.no.
+182 IN PTR 31-169-55-182.tg13.kandu.no.
+183 IN PTR 31-169-55-183.tg13.kandu.no.
+184 IN PTR 31-169-55-184.tg13.kandu.no.
+185 IN PTR 31-169-55-185.tg13.kandu.no.
+186 IN PTR 31-169-55-186.tg13.kandu.no.
+187 IN PTR 31-169-55-187.tg13.kandu.no.
+188 IN PTR 31-169-55-188.tg13.kandu.no.
+189 IN PTR 31-169-55-189.tg13.kandu.no.
+190 IN PTR 31-169-55-190.tg13.kandu.no.
+191 IN PTR 31-169-55-191.tg13.kandu.no.
+192 IN PTR 31-169-55-192.tg13.kandu.no.
+193 IN PTR 31-169-55-193.tg13.kandu.no.
+194 IN PTR 31-169-55-194.tg13.kandu.no.
+195 IN PTR 31-169-55-195.tg13.kandu.no.
+196 IN PTR 31-169-55-196.tg13.kandu.no.
+197 IN PTR 31-169-55-197.tg13.kandu.no.
+198 IN PTR 31-169-55-198.tg13.kandu.no.
+199 IN PTR 31-169-55-199.tg13.kandu.no.
+200 IN PTR 31-169-55-200.tg13.kandu.no.
+201 IN PTR 31-169-55-201.tg13.kandu.no.
+202 IN PTR 31-169-55-202.tg13.kandu.no.
+203 IN PTR 31-169-55-203.tg13.kandu.no.
+204 IN PTR 31-169-55-204.tg13.kandu.no.
+205 IN PTR 31-169-55-205.tg13.kandu.no.
+206 IN PTR 31-169-55-206.tg13.kandu.no.
+207 IN PTR 31-169-55-207.tg13.kandu.no.
+208 IN PTR 31-169-55-208.tg13.kandu.no.
+209 IN PTR 31-169-55-209.tg13.kandu.no.
+210 IN PTR 31-169-55-210.tg13.kandu.no.
+211 IN PTR 31-169-55-211.tg13.kandu.no.
+212 IN PTR 31-169-55-212.tg13.kandu.no.
+213 IN PTR 31-169-55-213.tg13.kandu.no.
+214 IN PTR 31-169-55-214.tg13.kandu.no.
+215 IN PTR 31-169-55-215.tg13.kandu.no.
+216 IN PTR 31-169-55-216.tg13.kandu.no.
+217 IN PTR 31-169-55-217.tg13.kandu.no.
+218 IN PTR 31-169-55-218.tg13.kandu.no.
+219 IN PTR 31-169-55-219.tg13.kandu.no.
+220 IN PTR 31-169-55-220.tg13.kandu.no.
+221 IN PTR 31-169-55-221.tg13.kandu.no.
+222 IN PTR 31-169-55-222.tg13.kandu.no.
+223 IN PTR 31-169-55-223.tg13.kandu.no.
+224 IN PTR 31-169-55-224.tg13.kandu.no.
+225 IN PTR 31-169-55-225.tg13.kandu.no.
+226 IN PTR 31-169-55-226.tg13.kandu.no.
+227 IN PTR 31-169-55-227.tg13.kandu.no.
+228 IN PTR 31-169-55-228.tg13.kandu.no.
+229 IN PTR 31-169-55-229.tg13.kandu.no.
+230 IN PTR 31-169-55-230.tg13.kandu.no.
+231 IN PTR 31-169-55-231.tg13.kandu.no.
+232 IN PTR 31-169-55-232.tg13.kandu.no.
+233 IN PTR 31-169-55-233.tg13.kandu.no.
+234 IN PTR 31-169-55-234.tg13.kandu.no.
+235 IN PTR 31-169-55-235.tg13.kandu.no.
+236 IN PTR 31-169-55-236.tg13.kandu.no.
+237 IN PTR 31-169-55-237.tg13.kandu.no.
+238 IN PTR 31-169-55-238.tg13.kandu.no.
+239 IN PTR 31-169-55-239.tg13.kandu.no.
+240 IN PTR 31-169-55-240.tg13.kandu.no.
+241 IN PTR 31-169-55-241.tg13.kandu.no.
+242 IN PTR 31-169-55-242.tg13.kandu.no.
+243 IN PTR 31-169-55-243.tg13.kandu.no.
+244 IN PTR 31-169-55-244.tg13.kandu.no.
+245 IN PTR 31-169-55-245.tg13.kandu.no.
+246 IN PTR 31-169-55-246.tg13.kandu.no.
+247 IN PTR 31-169-55-247.tg13.kandu.no.
+248 IN PTR 31-169-55-248.tg13.kandu.no.
+249 IN PTR 31-169-55-249.tg13.kandu.no.
+250 IN PTR 31-169-55-250.tg13.kandu.no.
+251 IN PTR 31-169-55-251.tg13.kandu.no.
+252 IN PTR 31-169-55-252.tg13.kandu.no.
+253 IN PTR 31-169-55-253.tg13.kandu.no.
+254 IN PTR 31-169-55-254.tg13.kandu.no.
diff --git a/bind/master/bind.keys b/bind/master/bind.keys
new file mode 100644
index 0000000..b003c53
--- /dev/null
+++ b/bind/master/bind.keys
@@ -0,0 +1,49 @@
+/* $Id: bind.keys,v 1.5.42.2 2011-01-04 19:14:48 each Exp $ */
+# The bind.keys file is used to override built-in DNSSEC trust anchors
+# which are included as part of BIND 9. As of the current release (BIND
+# 9.7), the only trust anchor it sets is the one for the ISC DNSSEC
+# Lookaside Validation zone ("dlv.isc.org"). Trust anchors for any other
+# zones MUST be configured elsewhere; if they are configured here, they
+# will not be recognized or used by named.
+#
+# This file also contains a copy of the trust anchor for the DNS root zone
+# ("."). However, named does not use it; it is provided here for
+# informational purposes only. To switch on DNSSEC validation at the
+# root, the root key below can be copied into named.conf.
+#
+# The built-in DLV trust anchor in this file is used directly by named.
+# However, it is not activated unless specifically switched on. To use
+# the DLV key, set "dnssec-lookaside auto;" in the named.conf options.
+# Without this option being set, the key in this file is ignored.
+#
+# This file is NOT expected to be user-configured.
+#
+# These keys are current as of January 2011. If any key fails to
+# initialize correctly, it may have expired. In that event you should
+# replace this file with a current version. The latest version of
+# bind.keys can always be obtained from ISC at https://www.isc.org/bind-keys.
+
+managed-keys {
+ # ISC DLV: See https://www.isc.org/solutions/dlv for details.
+ # NOTE: This key is activated by setting "dnssec-lookaside auto;"
+ # in named.conf.
+ dlv.isc.org. initial-key 257 3 5 "BEAAAAPHMu/5onzrEE7z1egmhg/WPO0+juoZrW3euWEn4MxDCE1+lLy2
+ brhQv5rN32RKtMzX6Mj70jdzeND4XknW58dnJNPCxn8+jAGl2FZLK8t+
+ 1uq4W+nnA3qO2+DL+k6BD4mewMLbIYFwe0PG73Te9fZ2kJb56dhgMde5
+ ymX4BI/oQ+cAK50/xvJv00Frf8kw6ucMTwFlgPe+jnGxPPEmHAte/URk
+ Y62ZfkLoBAADLHQ9IrS2tryAe7mbBZVcOwIeU/Rw/mRx/vwwMCTgNboM
+ QKtUdvNXDrYJDSHZws3xiRXF1Rf+al9UmZfSav/4NWLKjHzpT59k/VSt
+ TDN0YUuWrBNh";
+
+ # ROOT KEY: See https://data.iana.org/root-anchors/root-anchors.xml
+ # for current trust anchor information.
+ # NOTE: This key is activated by setting "dnssec-validation auto;"
+ # in named.conf.
+ . initial-key 257 3 8 "AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF
+ FVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoX
+ bfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaD
+ X6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpz
+ W5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS
+ Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq
+ QxA+Uk1ihz0=";
+};
diff --git a/bind/master/conf-master/ap-dist0.conf b/bind/master/conf-master/ap-dist0.conf
new file mode 100644
index 0000000..128e996
--- /dev/null
+++ b/bind/master/conf-master/ap-dist0.conf
@@ -0,0 +1,7 @@
+zone "ap-dist0.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/ap-dist0.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/ap-dist1.conf b/bind/master/conf-master/ap-dist1.conf
new file mode 100644
index 0000000..a1720ec
--- /dev/null
+++ b/bind/master/conf-master/ap-dist1.conf
@@ -0,0 +1,7 @@
+zone "ap-dist1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/ap-dist1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/ap-dist2.conf b/bind/master/conf-master/ap-dist2.conf
new file mode 100644
index 0000000..1e5a8b7
--- /dev/null
+++ b/bind/master/conf-master/ap-dist2.conf
@@ -0,0 +1,7 @@
+zone "ap-dist2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/ap-dist2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/ap-dist3.conf b/bind/master/conf-master/ap-dist3.conf
new file mode 100644
index 0000000..9aeb118
--- /dev/null
+++ b/bind/master/conf-master/ap-dist3.conf
@@ -0,0 +1,7 @@
+zone "ap-dist3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/ap-dist3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/ap-dist4.conf b/bind/master/conf-master/ap-dist4.conf
new file mode 100644
index 0000000..d9d1dd1
--- /dev/null
+++ b/bind/master/conf-master/ap-dist4.conf
@@ -0,0 +1,7 @@
+zone "ap-dist4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/ap-dist4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/care.conf b/bind/master/conf-master/care.conf
new file mode 100644
index 0000000..0bad1bd
--- /dev/null
+++ b/bind/master/conf-master/care.conf
@@ -0,0 +1,7 @@
+zone "care.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/care.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/chillout.conf b/bind/master/conf-master/chillout.conf
new file mode 100644
index 0000000..0de90ca
--- /dev/null
+++ b/bind/master/conf-master/chillout.conf
@@ -0,0 +1,7 @@
+zone "chillout.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/chillout.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/creativia.conf b/bind/master/conf-master/creativia.conf
new file mode 100644
index 0000000..5237a84
--- /dev/null
+++ b/bind/master/conf-master/creativia.conf
@@ -0,0 +1,7 @@
+zone "creativia.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/creativia.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/crew1.conf b/bind/master/conf-master/crew1.conf
new file mode 100644
index 0000000..e257add
--- /dev/null
+++ b/bind/master/conf-master/crew1.conf
@@ -0,0 +1,7 @@
+zone "crew1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/crew1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/crew2.conf b/bind/master/conf-master/crew2.conf
new file mode 100644
index 0000000..e4cb846
--- /dev/null
+++ b/bind/master/conf-master/crew2.conf
@@ -0,0 +1,7 @@
+zone "crew2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/crew2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/crew3.conf b/bind/master/conf-master/crew3.conf
new file mode 100644
index 0000000..69df488
--- /dev/null
+++ b/bind/master/conf-master/crew3.conf
@@ -0,0 +1,7 @@
+zone "crew3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/crew3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/crew4.conf b/bind/master/conf-master/crew4.conf
new file mode 100644
index 0000000..bc139e0
--- /dev/null
+++ b/bind/master/conf-master/crew4.conf
@@ -0,0 +1,7 @@
+zone "crew4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/crew4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/crew5.conf b/bind/master/conf-master/crew5.conf
new file mode 100644
index 0000000..7a40125
--- /dev/null
+++ b/bind/master/conf-master/crew5.conf
@@ -0,0 +1,7 @@
+zone "crew5.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/crew5.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/crew6.conf b/bind/master/conf-master/crew6.conf
new file mode 100644
index 0000000..dfb9ae1
--- /dev/null
+++ b/bind/master/conf-master/crew6.conf
@@ -0,0 +1,7 @@
+zone "crew6.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/crew6.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/defektraid.conf b/bind/master/conf-master/defektraid.conf
new file mode 100644
index 0000000..df0c6f4
--- /dev/null
+++ b/bind/master/conf-master/defektraid.conf
@@ -0,0 +1,7 @@
+zone "defektraid.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/defektraid.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e1-3.conf b/bind/master/conf-master/e1-3.conf
new file mode 100644
index 0000000..1ea1345
--- /dev/null
+++ b/bind/master/conf-master/e1-3.conf
@@ -0,0 +1,7 @@
+zone "e1-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e1-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e1-4.conf b/bind/master/conf-master/e1-4.conf
new file mode 100644
index 0000000..3610d07
--- /dev/null
+++ b/bind/master/conf-master/e1-4.conf
@@ -0,0 +1,7 @@
+zone "e1-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e1-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e11-1.conf b/bind/master/conf-master/e11-1.conf
new file mode 100644
index 0000000..6e0db55
--- /dev/null
+++ b/bind/master/conf-master/e11-1.conf
@@ -0,0 +1,7 @@
+zone "e11-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e11-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e11-2.conf b/bind/master/conf-master/e11-2.conf
new file mode 100644
index 0000000..5e2f700
--- /dev/null
+++ b/bind/master/conf-master/e11-2.conf
@@ -0,0 +1,7 @@
+zone "e11-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e11-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e11-3.conf b/bind/master/conf-master/e11-3.conf
new file mode 100644
index 0000000..944cc0f
--- /dev/null
+++ b/bind/master/conf-master/e11-3.conf
@@ -0,0 +1,7 @@
+zone "e11-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e11-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e11-4.conf b/bind/master/conf-master/e11-4.conf
new file mode 100644
index 0000000..957ace1
--- /dev/null
+++ b/bind/master/conf-master/e11-4.conf
@@ -0,0 +1,7 @@
+zone "e11-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e11-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e13-1.conf b/bind/master/conf-master/e13-1.conf
new file mode 100644
index 0000000..e4058a3
--- /dev/null
+++ b/bind/master/conf-master/e13-1.conf
@@ -0,0 +1,7 @@
+zone "e13-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e13-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e13-2.conf b/bind/master/conf-master/e13-2.conf
new file mode 100644
index 0000000..5f0fb11
--- /dev/null
+++ b/bind/master/conf-master/e13-2.conf
@@ -0,0 +1,7 @@
+zone "e13-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e13-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e13-3.conf b/bind/master/conf-master/e13-3.conf
new file mode 100644
index 0000000..ead4ebb
--- /dev/null
+++ b/bind/master/conf-master/e13-3.conf
@@ -0,0 +1,7 @@
+zone "e13-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e13-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e13-4.conf b/bind/master/conf-master/e13-4.conf
new file mode 100644
index 0000000..3e11ce3
--- /dev/null
+++ b/bind/master/conf-master/e13-4.conf
@@ -0,0 +1,7 @@
+zone "e13-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e13-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e15-1.conf b/bind/master/conf-master/e15-1.conf
new file mode 100644
index 0000000..a1b2682
--- /dev/null
+++ b/bind/master/conf-master/e15-1.conf
@@ -0,0 +1,7 @@
+zone "e15-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e15-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e15-2.conf b/bind/master/conf-master/e15-2.conf
new file mode 100644
index 0000000..6bdfe02
--- /dev/null
+++ b/bind/master/conf-master/e15-2.conf
@@ -0,0 +1,7 @@
+zone "e15-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e15-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e15-3.conf b/bind/master/conf-master/e15-3.conf
new file mode 100644
index 0000000..7cbd21b
--- /dev/null
+++ b/bind/master/conf-master/e15-3.conf
@@ -0,0 +1,7 @@
+zone "e15-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e15-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e15-4.conf b/bind/master/conf-master/e15-4.conf
new file mode 100644
index 0000000..2db4e99
--- /dev/null
+++ b/bind/master/conf-master/e15-4.conf
@@ -0,0 +1,7 @@
+zone "e15-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e15-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e17-1.conf b/bind/master/conf-master/e17-1.conf
new file mode 100644
index 0000000..61a976d
--- /dev/null
+++ b/bind/master/conf-master/e17-1.conf
@@ -0,0 +1,7 @@
+zone "e17-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e17-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e17-2.conf b/bind/master/conf-master/e17-2.conf
new file mode 100644
index 0000000..68650e1
--- /dev/null
+++ b/bind/master/conf-master/e17-2.conf
@@ -0,0 +1,7 @@
+zone "e17-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e17-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e17-3.conf b/bind/master/conf-master/e17-3.conf
new file mode 100644
index 0000000..bf8f7f8
--- /dev/null
+++ b/bind/master/conf-master/e17-3.conf
@@ -0,0 +1,7 @@
+zone "e17-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e17-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e17-4.conf b/bind/master/conf-master/e17-4.conf
new file mode 100644
index 0000000..bfa94df
--- /dev/null
+++ b/bind/master/conf-master/e17-4.conf
@@ -0,0 +1,7 @@
+zone "e17-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e17-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e19-1.conf b/bind/master/conf-master/e19-1.conf
new file mode 100644
index 0000000..c0894c1
--- /dev/null
+++ b/bind/master/conf-master/e19-1.conf
@@ -0,0 +1,7 @@
+zone "e19-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e19-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e19-2.conf b/bind/master/conf-master/e19-2.conf
new file mode 100644
index 0000000..f46509b
--- /dev/null
+++ b/bind/master/conf-master/e19-2.conf
@@ -0,0 +1,7 @@
+zone "e19-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e19-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e19-3.conf b/bind/master/conf-master/e19-3.conf
new file mode 100644
index 0000000..6232f26
--- /dev/null
+++ b/bind/master/conf-master/e19-3.conf
@@ -0,0 +1,7 @@
+zone "e19-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e19-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e19-4.conf b/bind/master/conf-master/e19-4.conf
new file mode 100644
index 0000000..c8359ca
--- /dev/null
+++ b/bind/master/conf-master/e19-4.conf
@@ -0,0 +1,7 @@
+zone "e19-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e19-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e21-1.conf b/bind/master/conf-master/e21-1.conf
new file mode 100644
index 0000000..51a1162
--- /dev/null
+++ b/bind/master/conf-master/e21-1.conf
@@ -0,0 +1,7 @@
+zone "e21-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e21-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e21-2.conf b/bind/master/conf-master/e21-2.conf
new file mode 100644
index 0000000..b5003be
--- /dev/null
+++ b/bind/master/conf-master/e21-2.conf
@@ -0,0 +1,7 @@
+zone "e21-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e21-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e21-3.conf b/bind/master/conf-master/e21-3.conf
new file mode 100644
index 0000000..4b31944
--- /dev/null
+++ b/bind/master/conf-master/e21-3.conf
@@ -0,0 +1,7 @@
+zone "e21-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e21-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e21-4.conf b/bind/master/conf-master/e21-4.conf
new file mode 100644
index 0000000..e294e06
--- /dev/null
+++ b/bind/master/conf-master/e21-4.conf
@@ -0,0 +1,7 @@
+zone "e21-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e21-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e23-1.conf b/bind/master/conf-master/e23-1.conf
new file mode 100644
index 0000000..f094709
--- /dev/null
+++ b/bind/master/conf-master/e23-1.conf
@@ -0,0 +1,7 @@
+zone "e23-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e23-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e23-2.conf b/bind/master/conf-master/e23-2.conf
new file mode 100644
index 0000000..c19004f
--- /dev/null
+++ b/bind/master/conf-master/e23-2.conf
@@ -0,0 +1,7 @@
+zone "e23-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e23-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e23-3.conf b/bind/master/conf-master/e23-3.conf
new file mode 100644
index 0000000..7e8cc6f
--- /dev/null
+++ b/bind/master/conf-master/e23-3.conf
@@ -0,0 +1,7 @@
+zone "e23-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e23-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e23-4.conf b/bind/master/conf-master/e23-4.conf
new file mode 100644
index 0000000..17bc2fa
--- /dev/null
+++ b/bind/master/conf-master/e23-4.conf
@@ -0,0 +1,7 @@
+zone "e23-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e23-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e25-1.conf b/bind/master/conf-master/e25-1.conf
new file mode 100644
index 0000000..353a0bf
--- /dev/null
+++ b/bind/master/conf-master/e25-1.conf
@@ -0,0 +1,7 @@
+zone "e25-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e25-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e25-2.conf b/bind/master/conf-master/e25-2.conf
new file mode 100644
index 0000000..fe58cc1
--- /dev/null
+++ b/bind/master/conf-master/e25-2.conf
@@ -0,0 +1,7 @@
+zone "e25-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e25-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e25-3.conf b/bind/master/conf-master/e25-3.conf
new file mode 100644
index 0000000..2e641ae
--- /dev/null
+++ b/bind/master/conf-master/e25-3.conf
@@ -0,0 +1,7 @@
+zone "e25-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e25-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e25-4.conf b/bind/master/conf-master/e25-4.conf
new file mode 100644
index 0000000..72343f2
--- /dev/null
+++ b/bind/master/conf-master/e25-4.conf
@@ -0,0 +1,7 @@
+zone "e25-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e25-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e27-1.conf b/bind/master/conf-master/e27-1.conf
new file mode 100644
index 0000000..4bdae3c
--- /dev/null
+++ b/bind/master/conf-master/e27-1.conf
@@ -0,0 +1,7 @@
+zone "e27-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e27-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e27-2.conf b/bind/master/conf-master/e27-2.conf
new file mode 100644
index 0000000..b3cf265
--- /dev/null
+++ b/bind/master/conf-master/e27-2.conf
@@ -0,0 +1,7 @@
+zone "e27-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e27-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e29-1.conf b/bind/master/conf-master/e29-1.conf
new file mode 100644
index 0000000..ff50105
--- /dev/null
+++ b/bind/master/conf-master/e29-1.conf
@@ -0,0 +1,7 @@
+zone "e29-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e29-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e29-2.conf b/bind/master/conf-master/e29-2.conf
new file mode 100644
index 0000000..a0292bf
--- /dev/null
+++ b/bind/master/conf-master/e29-2.conf
@@ -0,0 +1,7 @@
+zone "e29-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e29-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e3-3.conf b/bind/master/conf-master/e3-3.conf
new file mode 100644
index 0000000..e03510a
--- /dev/null
+++ b/bind/master/conf-master/e3-3.conf
@@ -0,0 +1,7 @@
+zone "e3-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e3-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e3-4.conf b/bind/master/conf-master/e3-4.conf
new file mode 100644
index 0000000..b5d4104
--- /dev/null
+++ b/bind/master/conf-master/e3-4.conf
@@ -0,0 +1,7 @@
+zone "e3-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e3-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e31-1.conf b/bind/master/conf-master/e31-1.conf
new file mode 100644
index 0000000..9c0e873
--- /dev/null
+++ b/bind/master/conf-master/e31-1.conf
@@ -0,0 +1,7 @@
+zone "e31-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e31-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e31-2.conf b/bind/master/conf-master/e31-2.conf
new file mode 100644
index 0000000..8c32533
--- /dev/null
+++ b/bind/master/conf-master/e31-2.conf
@@ -0,0 +1,7 @@
+zone "e31-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e31-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e33-1.conf b/bind/master/conf-master/e33-1.conf
new file mode 100644
index 0000000..29e56cf
--- /dev/null
+++ b/bind/master/conf-master/e33-1.conf
@@ -0,0 +1,7 @@
+zone "e33-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e33-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e33-2.conf b/bind/master/conf-master/e33-2.conf
new file mode 100644
index 0000000..55d1c18
--- /dev/null
+++ b/bind/master/conf-master/e33-2.conf
@@ -0,0 +1,7 @@
+zone "e33-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e33-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e35-1.conf b/bind/master/conf-master/e35-1.conf
new file mode 100644
index 0000000..936f0a3
--- /dev/null
+++ b/bind/master/conf-master/e35-1.conf
@@ -0,0 +1,7 @@
+zone "e35-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e35-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e35-2.conf b/bind/master/conf-master/e35-2.conf
new file mode 100644
index 0000000..779fae5
--- /dev/null
+++ b/bind/master/conf-master/e35-2.conf
@@ -0,0 +1,7 @@
+zone "e35-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e35-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e37-1.conf b/bind/master/conf-master/e37-1.conf
new file mode 100644
index 0000000..5e1cd6f
--- /dev/null
+++ b/bind/master/conf-master/e37-1.conf
@@ -0,0 +1,7 @@
+zone "e37-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e37-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e37-2.conf b/bind/master/conf-master/e37-2.conf
new file mode 100644
index 0000000..264ee23
--- /dev/null
+++ b/bind/master/conf-master/e37-2.conf
@@ -0,0 +1,7 @@
+zone "e37-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e37-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e39-1.conf b/bind/master/conf-master/e39-1.conf
new file mode 100644
index 0000000..dbcfe63
--- /dev/null
+++ b/bind/master/conf-master/e39-1.conf
@@ -0,0 +1,7 @@
+zone "e39-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e39-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e39-2.conf b/bind/master/conf-master/e39-2.conf
new file mode 100644
index 0000000..fdb5813
--- /dev/null
+++ b/bind/master/conf-master/e39-2.conf
@@ -0,0 +1,7 @@
+zone "e39-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e39-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e41-1.conf b/bind/master/conf-master/e41-1.conf
new file mode 100644
index 0000000..1b3ce67
--- /dev/null
+++ b/bind/master/conf-master/e41-1.conf
@@ -0,0 +1,7 @@
+zone "e41-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e41-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e41-2.conf b/bind/master/conf-master/e41-2.conf
new file mode 100644
index 0000000..c93b026
--- /dev/null
+++ b/bind/master/conf-master/e41-2.conf
@@ -0,0 +1,7 @@
+zone "e41-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e41-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e43-1.conf b/bind/master/conf-master/e43-1.conf
new file mode 100644
index 0000000..141eb36
--- /dev/null
+++ b/bind/master/conf-master/e43-1.conf
@@ -0,0 +1,7 @@
+zone "e43-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e43-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e43-2.conf b/bind/master/conf-master/e43-2.conf
new file mode 100644
index 0000000..2183773
--- /dev/null
+++ b/bind/master/conf-master/e43-2.conf
@@ -0,0 +1,7 @@
+zone "e43-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e43-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e43-3.conf b/bind/master/conf-master/e43-3.conf
new file mode 100644
index 0000000..cd2e58a
--- /dev/null
+++ b/bind/master/conf-master/e43-3.conf
@@ -0,0 +1,7 @@
+zone "e43-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e43-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e43-4.conf b/bind/master/conf-master/e43-4.conf
new file mode 100644
index 0000000..3fe8285
--- /dev/null
+++ b/bind/master/conf-master/e43-4.conf
@@ -0,0 +1,7 @@
+zone "e43-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e43-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e45-1.conf b/bind/master/conf-master/e45-1.conf
new file mode 100644
index 0000000..4dfb780
--- /dev/null
+++ b/bind/master/conf-master/e45-1.conf
@@ -0,0 +1,7 @@
+zone "e45-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e45-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e45-2.conf b/bind/master/conf-master/e45-2.conf
new file mode 100644
index 0000000..ef12a1d
--- /dev/null
+++ b/bind/master/conf-master/e45-2.conf
@@ -0,0 +1,7 @@
+zone "e45-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e45-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e45-3.conf b/bind/master/conf-master/e45-3.conf
new file mode 100644
index 0000000..6816564
--- /dev/null
+++ b/bind/master/conf-master/e45-3.conf
@@ -0,0 +1,7 @@
+zone "e45-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e45-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e45-4.conf b/bind/master/conf-master/e45-4.conf
new file mode 100644
index 0000000..1c18dec
--- /dev/null
+++ b/bind/master/conf-master/e45-4.conf
@@ -0,0 +1,7 @@
+zone "e45-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e45-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e47-1.conf b/bind/master/conf-master/e47-1.conf
new file mode 100644
index 0000000..c78e9d2
--- /dev/null
+++ b/bind/master/conf-master/e47-1.conf
@@ -0,0 +1,7 @@
+zone "e47-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e47-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e47-2.conf b/bind/master/conf-master/e47-2.conf
new file mode 100644
index 0000000..bedb28b
--- /dev/null
+++ b/bind/master/conf-master/e47-2.conf
@@ -0,0 +1,7 @@
+zone "e47-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e47-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e47-3.conf b/bind/master/conf-master/e47-3.conf
new file mode 100644
index 0000000..21058f9
--- /dev/null
+++ b/bind/master/conf-master/e47-3.conf
@@ -0,0 +1,7 @@
+zone "e47-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e47-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e47-4.conf b/bind/master/conf-master/e47-4.conf
new file mode 100644
index 0000000..3ca2d0f
--- /dev/null
+++ b/bind/master/conf-master/e47-4.conf
@@ -0,0 +1,7 @@
+zone "e47-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e47-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e49-1.conf b/bind/master/conf-master/e49-1.conf
new file mode 100644
index 0000000..3ca0d10
--- /dev/null
+++ b/bind/master/conf-master/e49-1.conf
@@ -0,0 +1,7 @@
+zone "e49-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e49-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e49-2.conf b/bind/master/conf-master/e49-2.conf
new file mode 100644
index 0000000..336be6a
--- /dev/null
+++ b/bind/master/conf-master/e49-2.conf
@@ -0,0 +1,7 @@
+zone "e49-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e49-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e49-3.conf b/bind/master/conf-master/e49-3.conf
new file mode 100644
index 0000000..cb6ef54
--- /dev/null
+++ b/bind/master/conf-master/e49-3.conf
@@ -0,0 +1,7 @@
+zone "e49-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e49-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e49-4.conf b/bind/master/conf-master/e49-4.conf
new file mode 100644
index 0000000..b5383a3
--- /dev/null
+++ b/bind/master/conf-master/e49-4.conf
@@ -0,0 +1,7 @@
+zone "e49-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e49-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e5-3.conf b/bind/master/conf-master/e5-3.conf
new file mode 100644
index 0000000..5874214
--- /dev/null
+++ b/bind/master/conf-master/e5-3.conf
@@ -0,0 +1,7 @@
+zone "e5-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e5-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e5-4.conf b/bind/master/conf-master/e5-4.conf
new file mode 100644
index 0000000..98f7408
--- /dev/null
+++ b/bind/master/conf-master/e5-4.conf
@@ -0,0 +1,7 @@
+zone "e5-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e5-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e51-1.conf b/bind/master/conf-master/e51-1.conf
new file mode 100644
index 0000000..9e9a961
--- /dev/null
+++ b/bind/master/conf-master/e51-1.conf
@@ -0,0 +1,7 @@
+zone "e51-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e51-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e51-2.conf b/bind/master/conf-master/e51-2.conf
new file mode 100644
index 0000000..b0be1c1
--- /dev/null
+++ b/bind/master/conf-master/e51-2.conf
@@ -0,0 +1,7 @@
+zone "e51-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e51-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e51-3.conf b/bind/master/conf-master/e51-3.conf
new file mode 100644
index 0000000..d657bf2
--- /dev/null
+++ b/bind/master/conf-master/e51-3.conf
@@ -0,0 +1,7 @@
+zone "e51-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e51-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e51-4.conf b/bind/master/conf-master/e51-4.conf
new file mode 100644
index 0000000..40a4767
--- /dev/null
+++ b/bind/master/conf-master/e51-4.conf
@@ -0,0 +1,7 @@
+zone "e51-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e51-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e53-1.conf b/bind/master/conf-master/e53-1.conf
new file mode 100644
index 0000000..ddcd705
--- /dev/null
+++ b/bind/master/conf-master/e53-1.conf
@@ -0,0 +1,7 @@
+zone "e53-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e53-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e53-2.conf b/bind/master/conf-master/e53-2.conf
new file mode 100644
index 0000000..2144a5c
--- /dev/null
+++ b/bind/master/conf-master/e53-2.conf
@@ -0,0 +1,7 @@
+zone "e53-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e53-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e53-3.conf b/bind/master/conf-master/e53-3.conf
new file mode 100644
index 0000000..6f744f7
--- /dev/null
+++ b/bind/master/conf-master/e53-3.conf
@@ -0,0 +1,7 @@
+zone "e53-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e53-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e53-4.conf b/bind/master/conf-master/e53-4.conf
new file mode 100644
index 0000000..a61c1b6
--- /dev/null
+++ b/bind/master/conf-master/e53-4.conf
@@ -0,0 +1,7 @@
+zone "e53-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e53-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e55-1.conf b/bind/master/conf-master/e55-1.conf
new file mode 100644
index 0000000..82e2a30
--- /dev/null
+++ b/bind/master/conf-master/e55-1.conf
@@ -0,0 +1,7 @@
+zone "e55-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e55-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e55-2.conf b/bind/master/conf-master/e55-2.conf
new file mode 100644
index 0000000..d204695
--- /dev/null
+++ b/bind/master/conf-master/e55-2.conf
@@ -0,0 +1,7 @@
+zone "e55-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e55-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e55-3.conf b/bind/master/conf-master/e55-3.conf
new file mode 100644
index 0000000..fe2af74
--- /dev/null
+++ b/bind/master/conf-master/e55-3.conf
@@ -0,0 +1,7 @@
+zone "e55-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e55-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e55-4.conf b/bind/master/conf-master/e55-4.conf
new file mode 100644
index 0000000..a539533
--- /dev/null
+++ b/bind/master/conf-master/e55-4.conf
@@ -0,0 +1,7 @@
+zone "e55-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e55-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e57-1.conf b/bind/master/conf-master/e57-1.conf
new file mode 100644
index 0000000..5956229
--- /dev/null
+++ b/bind/master/conf-master/e57-1.conf
@@ -0,0 +1,7 @@
+zone "e57-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e57-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e57-2.conf b/bind/master/conf-master/e57-2.conf
new file mode 100644
index 0000000..1df48ea
--- /dev/null
+++ b/bind/master/conf-master/e57-2.conf
@@ -0,0 +1,7 @@
+zone "e57-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e57-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e57-3.conf b/bind/master/conf-master/e57-3.conf
new file mode 100644
index 0000000..2ed2c9a
--- /dev/null
+++ b/bind/master/conf-master/e57-3.conf
@@ -0,0 +1,7 @@
+zone "e57-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e57-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e57-4.conf b/bind/master/conf-master/e57-4.conf
new file mode 100644
index 0000000..906441f
--- /dev/null
+++ b/bind/master/conf-master/e57-4.conf
@@ -0,0 +1,7 @@
+zone "e57-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e57-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e59-1.conf b/bind/master/conf-master/e59-1.conf
new file mode 100644
index 0000000..16bf93a
--- /dev/null
+++ b/bind/master/conf-master/e59-1.conf
@@ -0,0 +1,7 @@
+zone "e59-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e59-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e59-2.conf b/bind/master/conf-master/e59-2.conf
new file mode 100644
index 0000000..f9930b3
--- /dev/null
+++ b/bind/master/conf-master/e59-2.conf
@@ -0,0 +1,7 @@
+zone "e59-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e59-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e59-3.conf b/bind/master/conf-master/e59-3.conf
new file mode 100644
index 0000000..ce3ac8f
--- /dev/null
+++ b/bind/master/conf-master/e59-3.conf
@@ -0,0 +1,7 @@
+zone "e59-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e59-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e59-4.conf b/bind/master/conf-master/e59-4.conf
new file mode 100644
index 0000000..0d69eea
--- /dev/null
+++ b/bind/master/conf-master/e59-4.conf
@@ -0,0 +1,7 @@
+zone "e59-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e59-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e61-1.conf b/bind/master/conf-master/e61-1.conf
new file mode 100644
index 0000000..26ff5fd
--- /dev/null
+++ b/bind/master/conf-master/e61-1.conf
@@ -0,0 +1,7 @@
+zone "e61-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e61-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e61-2.conf b/bind/master/conf-master/e61-2.conf
new file mode 100644
index 0000000..b08ebd3
--- /dev/null
+++ b/bind/master/conf-master/e61-2.conf
@@ -0,0 +1,7 @@
+zone "e61-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e61-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e61-3.conf b/bind/master/conf-master/e61-3.conf
new file mode 100644
index 0000000..02ce5d4
--- /dev/null
+++ b/bind/master/conf-master/e61-3.conf
@@ -0,0 +1,7 @@
+zone "e61-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e61-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e61-4.conf b/bind/master/conf-master/e61-4.conf
new file mode 100644
index 0000000..ed43653
--- /dev/null
+++ b/bind/master/conf-master/e61-4.conf
@@ -0,0 +1,7 @@
+zone "e61-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e61-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e63-1.conf b/bind/master/conf-master/e63-1.conf
new file mode 100644
index 0000000..ae9e505
--- /dev/null
+++ b/bind/master/conf-master/e63-1.conf
@@ -0,0 +1,7 @@
+zone "e63-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e63-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e63-2.conf b/bind/master/conf-master/e63-2.conf
new file mode 100644
index 0000000..10af791
--- /dev/null
+++ b/bind/master/conf-master/e63-2.conf
@@ -0,0 +1,7 @@
+zone "e63-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e63-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e63-3.conf b/bind/master/conf-master/e63-3.conf
new file mode 100644
index 0000000..8b16f42
--- /dev/null
+++ b/bind/master/conf-master/e63-3.conf
@@ -0,0 +1,7 @@
+zone "e63-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e63-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e63-4.conf b/bind/master/conf-master/e63-4.conf
new file mode 100644
index 0000000..108f15d
--- /dev/null
+++ b/bind/master/conf-master/e63-4.conf
@@ -0,0 +1,7 @@
+zone "e63-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e63-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e65-1.conf b/bind/master/conf-master/e65-1.conf
new file mode 100644
index 0000000..92a1a9a
--- /dev/null
+++ b/bind/master/conf-master/e65-1.conf
@@ -0,0 +1,7 @@
+zone "e65-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e65-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e65-2.conf b/bind/master/conf-master/e65-2.conf
new file mode 100644
index 0000000..80d6e43
--- /dev/null
+++ b/bind/master/conf-master/e65-2.conf
@@ -0,0 +1,7 @@
+zone "e65-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e65-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e65-3.conf b/bind/master/conf-master/e65-3.conf
new file mode 100644
index 0000000..a74b2bb
--- /dev/null
+++ b/bind/master/conf-master/e65-3.conf
@@ -0,0 +1,7 @@
+zone "e65-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e65-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e65-4.conf b/bind/master/conf-master/e65-4.conf
new file mode 100644
index 0000000..bc161d5
--- /dev/null
+++ b/bind/master/conf-master/e65-4.conf
@@ -0,0 +1,7 @@
+zone "e65-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e65-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e67-1.conf b/bind/master/conf-master/e67-1.conf
new file mode 100644
index 0000000..6aeac2d
--- /dev/null
+++ b/bind/master/conf-master/e67-1.conf
@@ -0,0 +1,7 @@
+zone "e67-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e67-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e67-2.conf b/bind/master/conf-master/e67-2.conf
new file mode 100644
index 0000000..083bf2e
--- /dev/null
+++ b/bind/master/conf-master/e67-2.conf
@@ -0,0 +1,7 @@
+zone "e67-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e67-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e67-3.conf b/bind/master/conf-master/e67-3.conf
new file mode 100644
index 0000000..47bb2b0
--- /dev/null
+++ b/bind/master/conf-master/e67-3.conf
@@ -0,0 +1,7 @@
+zone "e67-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e67-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e67-4.conf b/bind/master/conf-master/e67-4.conf
new file mode 100644
index 0000000..60f71f9
--- /dev/null
+++ b/bind/master/conf-master/e67-4.conf
@@ -0,0 +1,7 @@
+zone "e67-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e67-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e69-1.conf b/bind/master/conf-master/e69-1.conf
new file mode 100644
index 0000000..28bc567
--- /dev/null
+++ b/bind/master/conf-master/e69-1.conf
@@ -0,0 +1,7 @@
+zone "e69-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e69-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e69-2.conf b/bind/master/conf-master/e69-2.conf
new file mode 100644
index 0000000..3ab4477
--- /dev/null
+++ b/bind/master/conf-master/e69-2.conf
@@ -0,0 +1,7 @@
+zone "e69-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e69-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e69-3.conf b/bind/master/conf-master/e69-3.conf
new file mode 100644
index 0000000..c0c89c9
--- /dev/null
+++ b/bind/master/conf-master/e69-3.conf
@@ -0,0 +1,7 @@
+zone "e69-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e69-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e69-4.conf b/bind/master/conf-master/e69-4.conf
new file mode 100644
index 0000000..c93777b
--- /dev/null
+++ b/bind/master/conf-master/e69-4.conf
@@ -0,0 +1,7 @@
+zone "e69-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e69-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e7-3.conf b/bind/master/conf-master/e7-3.conf
new file mode 100644
index 0000000..fe9d33b
--- /dev/null
+++ b/bind/master/conf-master/e7-3.conf
@@ -0,0 +1,7 @@
+zone "e7-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e7-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e7-4.conf b/bind/master/conf-master/e7-4.conf
new file mode 100644
index 0000000..a203c0a
--- /dev/null
+++ b/bind/master/conf-master/e7-4.conf
@@ -0,0 +1,7 @@
+zone "e7-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e7-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e71-1.conf b/bind/master/conf-master/e71-1.conf
new file mode 100644
index 0000000..4ac985a
--- /dev/null
+++ b/bind/master/conf-master/e71-1.conf
@@ -0,0 +1,7 @@
+zone "e71-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e71-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e71-2.conf b/bind/master/conf-master/e71-2.conf
new file mode 100644
index 0000000..2ecb0c4
--- /dev/null
+++ b/bind/master/conf-master/e71-2.conf
@@ -0,0 +1,7 @@
+zone "e71-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e71-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e71-3.conf b/bind/master/conf-master/e71-3.conf
new file mode 100644
index 0000000..3dcebfb
--- /dev/null
+++ b/bind/master/conf-master/e71-3.conf
@@ -0,0 +1,7 @@
+zone "e71-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e71-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e71-4.conf b/bind/master/conf-master/e71-4.conf
new file mode 100644
index 0000000..4219538
--- /dev/null
+++ b/bind/master/conf-master/e71-4.conf
@@ -0,0 +1,7 @@
+zone "e71-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e71-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e73-1.conf b/bind/master/conf-master/e73-1.conf
new file mode 100644
index 0000000..676106a
--- /dev/null
+++ b/bind/master/conf-master/e73-1.conf
@@ -0,0 +1,7 @@
+zone "e73-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e73-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e73-2.conf b/bind/master/conf-master/e73-2.conf
new file mode 100644
index 0000000..d86e6e9
--- /dev/null
+++ b/bind/master/conf-master/e73-2.conf
@@ -0,0 +1,7 @@
+zone "e73-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e73-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e73-3.conf b/bind/master/conf-master/e73-3.conf
new file mode 100644
index 0000000..d99ff3b
--- /dev/null
+++ b/bind/master/conf-master/e73-3.conf
@@ -0,0 +1,7 @@
+zone "e73-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e73-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e73-4.conf b/bind/master/conf-master/e73-4.conf
new file mode 100644
index 0000000..ea9c11e
--- /dev/null
+++ b/bind/master/conf-master/e73-4.conf
@@ -0,0 +1,7 @@
+zone "e73-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e73-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e75-1.conf b/bind/master/conf-master/e75-1.conf
new file mode 100644
index 0000000..472d744
--- /dev/null
+++ b/bind/master/conf-master/e75-1.conf
@@ -0,0 +1,7 @@
+zone "e75-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e75-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e75-2.conf b/bind/master/conf-master/e75-2.conf
new file mode 100644
index 0000000..a672748
--- /dev/null
+++ b/bind/master/conf-master/e75-2.conf
@@ -0,0 +1,7 @@
+zone "e75-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e75-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e75-3.conf b/bind/master/conf-master/e75-3.conf
new file mode 100644
index 0000000..0d062f3
--- /dev/null
+++ b/bind/master/conf-master/e75-3.conf
@@ -0,0 +1,7 @@
+zone "e75-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e75-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e75-4.conf b/bind/master/conf-master/e75-4.conf
new file mode 100644
index 0000000..62dfdfc
--- /dev/null
+++ b/bind/master/conf-master/e75-4.conf
@@ -0,0 +1,7 @@
+zone "e75-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e75-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e77-1.conf b/bind/master/conf-master/e77-1.conf
new file mode 100644
index 0000000..5e972e9
--- /dev/null
+++ b/bind/master/conf-master/e77-1.conf
@@ -0,0 +1,7 @@
+zone "e77-1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e77-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e77-2.conf b/bind/master/conf-master/e77-2.conf
new file mode 100644
index 0000000..ffc03b2
--- /dev/null
+++ b/bind/master/conf-master/e77-2.conf
@@ -0,0 +1,7 @@
+zone "e77-2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e77-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e9-3.conf b/bind/master/conf-master/e9-3.conf
new file mode 100644
index 0000000..6b871df
--- /dev/null
+++ b/bind/master/conf-master/e9-3.conf
@@ -0,0 +1,7 @@
+zone "e9-3.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e9-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/e9-4.conf b/bind/master/conf-master/e9-4.conf
new file mode 100644
index 0000000..b220f5f
--- /dev/null
+++ b/bind/master/conf-master/e9-4.conf
@@ -0,0 +1,7 @@
+zone "e9-4.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/e9-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/fugleberg1.conf b/bind/master/conf-master/fugleberg1.conf
new file mode 100644
index 0000000..d75c4e4
--- /dev/null
+++ b/bind/master/conf-master/fugleberg1.conf
@@ -0,0 +1,7 @@
+zone "fugleberg1.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/fugleberg1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/fugleberg2.conf b/bind/master/conf-master/fugleberg2.conf
new file mode 100644
index 0000000..6b78cb8
--- /dev/null
+++ b/bind/master/conf-master/fugleberg2.conf
@@ -0,0 +1,7 @@
+zone "fugleberg2.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/fugleberg2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/game.conf b/bind/master/conf-master/game.conf
new file mode 100644
index 0000000..7a90aad
--- /dev/null
+++ b/bind/master/conf-master/game.conf
@@ -0,0 +1,7 @@
+zone "game.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/game.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/gamehq.conf b/bind/master/conf-master/gamehq.conf
new file mode 100644
index 0000000..8072e98
--- /dev/null
+++ b/bind/master/conf-master/gamehq.conf
@@ -0,0 +1,7 @@
+zone "gamehq.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/gamehq.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/lager.conf b/bind/master/conf-master/lager.conf
new file mode 100644
index 0000000..474f7e5
--- /dev/null
+++ b/bind/master/conf-master/lager.conf
@@ -0,0 +1,7 @@
+zone "lager.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/lager.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/logistikk.conf b/bind/master/conf-master/logistikk.conf
new file mode 100644
index 0000000..7211a84
--- /dev/null
+++ b/bind/master/conf-master/logistikk.conf
@@ -0,0 +1,7 @@
+zone "logistikk.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/logistikk.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/marsrele.conf b/bind/master/conf-master/marsrele.conf
new file mode 100644
index 0000000..aac0a42
--- /dev/null
+++ b/bind/master/conf-master/marsrele.conf
@@ -0,0 +1,7 @@
+zone "marsrele.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/marsrele.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/noc.conf b/bind/master/conf-master/noc.conf
new file mode 100644
index 0000000..6d49ca3
--- /dev/null
+++ b/bind/master/conf-master/noc.conf
@@ -0,0 +1,7 @@
+zone "noc.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/noc.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/presse.conf b/bind/master/conf-master/presse.conf
new file mode 100644
index 0000000..410d075
--- /dev/null
+++ b/bind/master/conf-master/presse.conf
@@ -0,0 +1,7 @@
+zone "presse.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/presse.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/secmedic.conf b/bind/master/conf-master/secmedic.conf
new file mode 100644
index 0000000..11a1d56
--- /dev/null
+++ b/bind/master/conf-master/secmedic.conf
@@ -0,0 +1,7 @@
+zone "secmedic.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/secmedic.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/sponsorvest.conf b/bind/master/conf-master/sponsorvest.conf
new file mode 100644
index 0000000..7b2262d
--- /dev/null
+++ b/bind/master/conf-master/sponsorvest.conf
@@ -0,0 +1,7 @@
+zone "sponsorvest.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/sponsorvest.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/stage.conf b/bind/master/conf-master/stage.conf
new file mode 100644
index 0000000..3bd5f84
--- /dev/null
+++ b/bind/master/conf-master/stage.conf
@@ -0,0 +1,7 @@
+zone "stage.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/stage.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/stageboh.conf b/bind/master/conf-master/stageboh.conf
new file mode 100644
index 0000000..9f871a6
--- /dev/null
+++ b/bind/master/conf-master/stageboh.conf
@@ -0,0 +1,7 @@
+zone "stageboh.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/stageboh.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/tele.conf b/bind/master/conf-master/tele.conf
new file mode 100644
index 0000000..479381e
--- /dev/null
+++ b/bind/master/conf-master/tele.conf
@@ -0,0 +1,7 @@
+zone "tele.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/tele.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/wlan.conf b/bind/master/conf-master/wlan.conf
new file mode 100644
index 0000000..4e138f8
--- /dev/null
+++ b/bind/master/conf-master/wlan.conf
@@ -0,0 +1,7 @@
+zone "wlan.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/wlan.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/conf-master/ymse.conf b/bind/master/conf-master/ymse.conf
new file mode 100644
index 0000000..3ebb5e5
--- /dev/null
+++ b/bind/master/conf-master/ymse.conf
@@ -0,0 +1,7 @@
+zone "ymse.tg13.gathering.org" {
+ type master;
+ notify yes;
+ allow-update { key DHCP_UPDATER; };
+ file "dynamic/ymse.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/master/db.0 b/bind/master/db.0
new file mode 100644
index 0000000..e3aabdb
--- /dev/null
+++ b/bind/master/db.0
@@ -0,0 +1,12 @@
+;
+; BIND reverse data file for broadcast zone
+;
+$TTL 604800
+@ IN SOA localhost. root.localhost. (
+ 1 ; Serial
+ 604800 ; Refresh
+ 86400 ; Retry
+ 2419200 ; Expire
+ 604800 ) ; Negative Cache TTL
+;
+@ IN NS localhost.
diff --git a/bind/master/db.127 b/bind/master/db.127
new file mode 100644
index 0000000..cd05bef
--- /dev/null
+++ b/bind/master/db.127
@@ -0,0 +1,13 @@
+;
+; BIND reverse data file for local loopback interface
+;
+$TTL 604800
+@ IN SOA localhost. root.localhost. (
+ 1 ; Serial
+ 604800 ; Refresh
+ 86400 ; Retry
+ 2419200 ; Expire
+ 604800 ) ; Negative Cache TTL
+;
+@ IN NS localhost.
+1.0.0 IN PTR localhost.
diff --git a/bind/master/db.255 b/bind/master/db.255
new file mode 100644
index 0000000..e3aabdb
--- /dev/null
+++ b/bind/master/db.255
@@ -0,0 +1,12 @@
+;
+; BIND reverse data file for broadcast zone
+;
+$TTL 604800
+@ IN SOA localhost. root.localhost. (
+ 1 ; Serial
+ 604800 ; Refresh
+ 86400 ; Retry
+ 2419200 ; Expire
+ 604800 ) ; Negative Cache TTL
+;
+@ IN NS localhost.
diff --git a/bind/master/db.empty b/bind/master/db.empty
new file mode 100644
index 0000000..8a12858
--- /dev/null
+++ b/bind/master/db.empty
@@ -0,0 +1,14 @@
+; BIND reverse data file for empty rfc1918 zone
+;
+; DO NOT EDIT THIS FILE - it is used for multiple zones.
+; Instead, copy it, edit named.conf, and use that copy.
+;
+$TTL 86400
+@ IN SOA localhost. root.localhost. (
+ 1 ; Serial
+ 604800 ; Refresh
+ 86400 ; Retry
+ 2419200 ; Expire
+ 86400 ) ; Negative Cache TTL
+;
+@ IN NS localhost.
diff --git a/bind/master/db.local b/bind/master/db.local
new file mode 100644
index 0000000..2f272d4
--- /dev/null
+++ b/bind/master/db.local
@@ -0,0 +1,14 @@
+;
+; BIND data file for local loopback interface
+;
+$TTL 604800
+@ IN SOA localhost. root.localhost. (
+ 2 ; Serial
+ 604800 ; Refresh
+ 86400 ; Retry
+ 2419200 ; Expire
+ 604800 ) ; Negative Cache TTL
+;
+@ IN NS localhost.
+@ IN A 127.0.0.1
+@ IN AAAA ::1
diff --git a/bind/master/db.root b/bind/master/db.root
new file mode 100644
index 0000000..6c19741
--- /dev/null
+++ b/bind/master/db.root
@@ -0,0 +1,88 @@
+; This file holds the information on root name servers needed to
+; initialize cache of Internet domain name servers
+; (e.g. reference this file in the "cache . <file>"
+; configuration file of BIND domain name servers).
+;
+; This file is made available by InterNIC
+; under anonymous FTP as
+; file /domain/named.cache
+; on server FTP.INTERNIC.NET
+; -OR- RS.INTERNIC.NET
+;
+; last update: Jan 3, 2013
+; related version of root zone: 2013010300
+;
+; formerly NS.INTERNIC.NET
+;
+. 3600000 IN NS A.ROOT-SERVERS.NET.
+A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4
+A.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:BA3E::2:30
+;
+; FORMERLY NS1.ISI.EDU
+;
+. 3600000 NS B.ROOT-SERVERS.NET.
+B.ROOT-SERVERS.NET. 3600000 A 192.228.79.201
+;
+; FORMERLY C.PSI.NET
+;
+. 3600000 NS C.ROOT-SERVERS.NET.
+C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12
+;
+; FORMERLY TERP.UMD.EDU
+;
+. 3600000 NS D.ROOT-SERVERS.NET.
+D.ROOT-SERVERS.NET. 3600000 A 199.7.91.13
+D.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2D::D
+;
+; FORMERLY NS.NASA.GOV
+;
+. 3600000 NS E.ROOT-SERVERS.NET.
+E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10
+;
+; FORMERLY NS.ISC.ORG
+;
+. 3600000 NS F.ROOT-SERVERS.NET.
+F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241
+F.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2F::F
+;
+; FORMERLY NS.NIC.DDN.MIL
+;
+. 3600000 NS G.ROOT-SERVERS.NET.
+G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4
+;
+; FORMERLY AOS.ARL.ARMY.MIL
+;
+. 3600000 NS H.ROOT-SERVERS.NET.
+H.ROOT-SERVERS.NET. 3600000 A 128.63.2.53
+H.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:1::803F:235
+;
+; FORMERLY NIC.NORDU.NET
+;
+. 3600000 NS I.ROOT-SERVERS.NET.
+I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17
+I.ROOT-SERVERS.NET. 3600000 AAAA 2001:7FE::53
+;
+; OPERATED BY VERISIGN, INC.
+;
+. 3600000 NS J.ROOT-SERVERS.NET.
+J.ROOT-SERVERS.NET. 3600000 A 192.58.128.30
+J.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:C27::2:30
+;
+; OPERATED BY RIPE NCC
+;
+. 3600000 NS K.ROOT-SERVERS.NET.
+K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129
+K.ROOT-SERVERS.NET. 3600000 AAAA 2001:7FD::1
+;
+; OPERATED BY ICANN
+;
+. 3600000 NS L.ROOT-SERVERS.NET.
+L.ROOT-SERVERS.NET. 3600000 A 199.7.83.42
+L.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:3::42
+;
+; OPERATED BY WIDE
+;
+. 3600000 NS M.ROOT-SERVERS.NET.
+M.ROOT-SERVERS.NET. 3600000 A 202.12.27.33
+M.ROOT-SERVERS.NET. 3600000 AAAA 2001:DC3::35
+; End of File
diff --git a/bind/master/infra.tg13.gathering.org.zone b/bind/master/infra.tg13.gathering.org.zone
new file mode 100644
index 0000000..5aa1a88
--- /dev/null
+++ b/bind/master/infra.tg13.gathering.org.zone
@@ -0,0 +1,110 @@
+$TTL 3600
+@ IN SOA winix.tg13.gathering.org. abuse.gathering.org. (
+ 2013033101; serial
+ 3600 ; refresh
+ 1800 ; retry
+ 608400 ; expire
+ 3600 ) ; minimum and default TTL
+
+ IN NS winix.tg13.gathering.org.
+ IN NS tress90.tg13.gathering.org.
+
+; Generated by make-all-config.sh on the bootstrapping/nms server.
+; Will not be overwritten unless it is missing ;)
+
+
+; infra-bokser
+telegw IN A 151.216.127.1
+telegw IN AAAA 2a02:ed02:FFFF::1
+nocgw IN A 151.216.127.2
+nocgw IN AAAA 2a02:ed02:FFFF::2
+camgw IN A 151.216.127.3
+camgw IN AAAA 2a02:ed02:FFFF::3
+stageboh IN A 151.216.127.4
+stageboh IN AAAA 2a02:ed02:FFFF::4
+wtfgw IN A 151.216.127.5
+wtfgw IN AAAA 2a02:ed02:FFFF::5
+logistikkgw IN A 151.216.127.6
+logistikkgw IN AAAA 2a02:ed02:FFFF::6
+corengw IN A 151.216.127.7
+corengw IN AAAA 2a02:ed02:FFFF::7
+coresgw IN A 151.216.127.8
+coresgw IN AAAA 2a02:ed02:FFFF::8
+crewgw IN A 151.216.127.9
+crewgw IN AAAA 2a02:ed02:FFFF::9
+tvgw IN A 151.216.127.10
+tvgw IN AAAA 2a02:ed02:FFFF::10
+gamegw IN A 151.216.127.11
+gamegw IN AAAA 2a02:ed02:FFFF::11
+resepsjongw IN A 151.216.127.12
+resepsjongw IN AAAA 2a02:ed02:FFFF::12
+pressegw IN A 151.216.127.13
+pressegw IN AAAA 2a02:ed02:FFFF::13
+sponsorgw IN A 151.216.127.14
+sponsorgw IN AAAA 2a02:ed02:FFFF::14
+komplettgw IN A 151.216.127.15
+komplettgw IN AAAA 2a02:ed02:FFFF::15
+eldregw IN A 151.216.127.16
+eldregw IN AAAA 2a02:ed02:FFFF::16
+distro0 IN A 151.216.127.17
+distro0 IN AAAA 2a02:ed02:FFFF::17
+distro1 IN A 151.216.127.18
+distro1 IN AAAA 2a02:ed02:FFFF::18
+distro2 IN A 151.216.127.19
+distro2 IN AAAA 2a02:ed02:FFFF::19
+distro3 IN A 151.216.127.20
+distro3 IN AAAA 2a02:ed02:FFFF::20
+distro4 IN A 151.216.127.21
+distro4 IN AAAA 2a02:ed02:FFFF::21
+vss-core IN A 151.216.123.254
+vss-core IN AAAA 2A02:ED02:123::254
+
+; linknett
+telegw-po1 IN A 185.12.59.2
+telegw-po1 IN AAAA 2a02:ed01::2
+nocgw-po1 IN A 151.216.0.3
+
+telegw-nocgw IN A 151.216.0.2
+nocgw-telegw IN A 151.216.0.3
+telegw-cam IN A 151.216.0.4
+cam-telegw IN A 151.216.0.5
+nocgw-coren IN A 151.216.0.6
+coren-nocgw IN A 151.216.0.7
+telegw-pressegw IN A 151.216.0.8
+pressegw-telegw IN A 151.216.0.9
+coren-gamegw IN A 151.216.0.10
+gamegw-coren IN A 151.216.0.11
+cores-crewgw IN A 151.216.0.12
+crewgw-cores IN A 151.216.0.13
+camgw-crewgw IN A 151.216.0.14
+crewgw-camgw IN A 151.216.0.15
+logistikkgw-wtfgw IN A 151.216.0.18
+wtfgw-logistikkgw IN A 151.216.0.19
+wtfgw-stagebohgw IN A 151.216.0.20
+stagebohgw-wtfgw IN A 151.216.0.21
+camgw-creachillgw IN A 151.216.0.22
+creachillgw-camgw IN A 151.216.0.23
+nocgw-coresgw IN A 151.216.0.24
+coresgw-nocgw IN A 151.216.0.25
+telegw-resepsjongw IN A 151.216.0.26
+resepsjongw-telegw IN A 151.216.0.27
+telegw-gamegw IN A 151.216.0.28
+gamegw-telegw IN A 151.216.0.29
+telegw-asr1k IN A 151.216.0.30
+asr1k-telegw IN A 151.216.0.31
+nocgw-sponsorgw IN A 151.216.0.32
+sponsorgw-nocgw IN A 151.216.0.33
+wtfgw-gamegw IN A 151.216.0.34
+gamegw-wtfgw IN A 151.216.0.35
+corengw-komplettgw IN A 151.216.0.36
+komplettgw-corengw IN A 151.216.0.37
+nocgw-itvmrr IN A 151.216.0.38
+itvmrr-nocgw IN A 151.216.0.39
+camgw-logistikkgw IN A 151.216.0.46
+logistikkgw-camgw IN A 151.216.0.47
+camgw-crewgw IN A 151.216.0.48
+crewgw-camgw IN A 151.216.0.49
+telegw-partygw IN A 151.216.0.54
+partygw-telegw IN A 151.216.0.55
+telegw-noshutnat IN A 151.216.0.56
+noshutnat-telegw IN A 151.216.0.57
diff --git a/bind/master/named.conf b/bind/master/named.conf
new file mode 100644
index 0000000..54adfdf
--- /dev/null
+++ b/bind/master/named.conf
@@ -0,0 +1,55 @@
+// This named.conf was generated by make-named.pl at 20130327-1708
+// The current version of make-named.pl should not overwrite this file.
+acl tg-nett { 151.216.0.0/17; 2a02:ed02::/32; 127.0.0.0/8; ::1; 31.169.55.0/24; };
+acl ns-xfr { 194.19.3.20; 151.216.125.2; 2a02:ed02:125::2; 151.216.126.2; 2a02:ed02:126::2; 151.216.124.0/24; };
+acl ripe-xfr { 194.19.3.20; 151.216.125.2; 2a02:ed02:125::2; 151.216.126.2; 2a02:ed02:126::2; 193.0.0.0/22; };
+
+options {
+ directory "/etc/bind";
+ allow-recursion { tg-nett; };
+ allow-query { any; };
+ allow-transfer { ns-xfr; };
+ recursion yes;
+ auth-nxdomain no;
+ listen-on-v6 { any; };
+};
+
+key DHCP_UPDATER {
+ algorithm HMAC-MD5.SIG-ALG.REG.INT;
+ secret <removed>;
+};
+
+zone "tg13.gathering.org" {
+ type master;
+ file "tg13.gathering.org.zone";
+ notify yes;
+ allow-transfer { ns-xfr; };
+};
+
+zone "infra.tg13.gathering.org" {
+ type master;
+ file "infra.tg13.gathering.org.zone";
+ notify yes;
+ allow-transfer { ns-xfr; };
+};
+
+zone "2.0.d.e.2.0.a.2.ip6.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ file "2.0.d.e.2.0.a.2.ip6.arpa.zone";
+ allow-transfer { ns-xfr; ripe-xfr; };
+};
+
+# ekstra /24-nett fra Blix
+zone "55.169.31.in-addr.arpa" {
+ type master;
+ file "55.169.31.in-addr.arpa.zone";
+ notify yes;
+ allow-transfer { ns-xfr; ripe-xfr; };
+};
+
+include "/etc/bind/named.conf.default-zones";
+include "/etc/bind/steamorigin-zones";
+include "named.reverse4.conf";
+include "named.master-include.conf";
diff --git a/bind/master/named.conf.default-zones b/bind/master/named.conf.default-zones
new file mode 100644
index 0000000..355338b
--- /dev/null
+++ b/bind/master/named.conf.default-zones
@@ -0,0 +1,30 @@
+// prime the server with knowledge of the root servers
+zone "." {
+ type hint;
+ file "/etc/bind/db.root";
+};
+
+// be authoritative for the localhost forward and reverse zones, and for
+// broadcast zones as per RFC 1912
+
+zone "localhost" {
+ type master;
+ file "/etc/bind/db.local";
+};
+
+zone "127.in-addr.arpa" {
+ type master;
+ file "/etc/bind/db.127";
+};
+
+zone "0.in-addr.arpa" {
+ type master;
+ file "/etc/bind/db.0";
+};
+
+zone "255.in-addr.arpa" {
+ type master;
+ file "/etc/bind/db.255";
+};
+
+
diff --git a/bind/master/named.conf.local b/bind/master/named.conf.local
new file mode 100644
index 0000000..7a57b10
--- /dev/null
+++ b/bind/master/named.conf.local
@@ -0,0 +1,8 @@
+//
+// Do any local configuration here
+//
+
+// Consider adding the 1918 zones here, if they are not used in your
+// organization
+//include "/etc/bind/zones.rfc1918";
+
diff --git a/bind/master/named.conf.options b/bind/master/named.conf.options
new file mode 100644
index 0000000..170486b
--- /dev/null
+++ b/bind/master/named.conf.options
@@ -0,0 +1,19 @@
+options {
+ directory "/var/cache/bind";
+
+ // If there is a firewall between you and nameservers you want
+ // to talk to, you may need to fix the firewall to allow multiple
+ // ports to talk. See http://www.kb.cert.org/vuls/id/800113
+
+ // If your ISP provided one or more IP addresses for stable
+ // nameservers, you probably want to use them as forwarders.
+ // Uncomment the following block, and insert the addresses replacing
+ // the all-0's placeholder.
+
+ // forwarders {
+ // 0.0.0.0;
+ // };
+
+ auth-nxdomain no; # conform to RFC1035
+ listen-on-v6 { any; };
+};
diff --git a/bind/master/named.master-include.conf b/bind/master/named.master-include.conf
new file mode 100644
index 0000000..0f7f9e7
--- /dev/null
+++ b/bind/master/named.master-include.conf
@@ -0,0 +1,159 @@
+include "/etc/bind/conf-master/ap-dist0.conf";
+include "/etc/bind/conf-master/ap-dist1.conf";
+include "/etc/bind/conf-master/ap-dist2.conf";
+include "/etc/bind/conf-master/ap-dist3.conf";
+include "/etc/bind/conf-master/ap-dist4.conf";
+include "/etc/bind/conf-master/care.conf";
+include "/etc/bind/conf-master/chillout.conf";
+include "/etc/bind/conf-master/creativia.conf";
+include "/etc/bind/conf-master/crew1.conf";
+include "/etc/bind/conf-master/crew2.conf";
+include "/etc/bind/conf-master/crew3.conf";
+include "/etc/bind/conf-master/crew4.conf";
+include "/etc/bind/conf-master/crew5.conf";
+include "/etc/bind/conf-master/crew6.conf";
+include "/etc/bind/conf-master/defektraid.conf";
+include "/etc/bind/conf-master/e1-3.conf";
+include "/etc/bind/conf-master/e1-4.conf";
+include "/etc/bind/conf-master/e11-1.conf";
+include "/etc/bind/conf-master/e11-2.conf";
+include "/etc/bind/conf-master/e11-3.conf";
+include "/etc/bind/conf-master/e11-4.conf";
+include "/etc/bind/conf-master/e13-1.conf";
+include "/etc/bind/conf-master/e13-2.conf";
+include "/etc/bind/conf-master/e13-3.conf";
+include "/etc/bind/conf-master/e13-4.conf";
+include "/etc/bind/conf-master/e15-1.conf";
+include "/etc/bind/conf-master/e15-2.conf";
+include "/etc/bind/conf-master/e15-3.conf";
+include "/etc/bind/conf-master/e15-4.conf";
+include "/etc/bind/conf-master/e17-1.conf";
+include "/etc/bind/conf-master/e17-2.conf";
+include "/etc/bind/conf-master/e17-3.conf";
+include "/etc/bind/conf-master/e17-4.conf";
+include "/etc/bind/conf-master/e19-1.conf";
+include "/etc/bind/conf-master/e19-2.conf";
+include "/etc/bind/conf-master/e19-3.conf";
+include "/etc/bind/conf-master/e19-4.conf";
+include "/etc/bind/conf-master/e21-1.conf";
+include "/etc/bind/conf-master/e21-2.conf";
+include "/etc/bind/conf-master/e21-3.conf";
+include "/etc/bind/conf-master/e21-4.conf";
+include "/etc/bind/conf-master/e23-1.conf";
+include "/etc/bind/conf-master/e23-2.conf";
+include "/etc/bind/conf-master/e23-3.conf";
+include "/etc/bind/conf-master/e23-4.conf";
+include "/etc/bind/conf-master/e25-1.conf";
+include "/etc/bind/conf-master/e25-2.conf";
+include "/etc/bind/conf-master/e25-3.conf";
+include "/etc/bind/conf-master/e25-4.conf";
+include "/etc/bind/conf-master/e27-1.conf";
+include "/etc/bind/conf-master/e27-2.conf";
+include "/etc/bind/conf-master/e29-1.conf";
+include "/etc/bind/conf-master/e29-2.conf";
+include "/etc/bind/conf-master/e3-3.conf";
+include "/etc/bind/conf-master/e3-4.conf";
+include "/etc/bind/conf-master/e31-1.conf";
+include "/etc/bind/conf-master/e31-2.conf";
+include "/etc/bind/conf-master/e33-1.conf";
+include "/etc/bind/conf-master/e33-2.conf";
+include "/etc/bind/conf-master/e35-1.conf";
+include "/etc/bind/conf-master/e35-2.conf";
+include "/etc/bind/conf-master/e37-1.conf";
+include "/etc/bind/conf-master/e37-2.conf";
+include "/etc/bind/conf-master/e39-1.conf";
+include "/etc/bind/conf-master/e39-2.conf";
+include "/etc/bind/conf-master/e41-1.conf";
+include "/etc/bind/conf-master/e41-2.conf";
+include "/etc/bind/conf-master/e43-1.conf";
+include "/etc/bind/conf-master/e43-2.conf";
+include "/etc/bind/conf-master/e43-3.conf";
+include "/etc/bind/conf-master/e43-4.conf";
+include "/etc/bind/conf-master/e45-1.conf";
+include "/etc/bind/conf-master/e45-2.conf";
+include "/etc/bind/conf-master/e45-3.conf";
+include "/etc/bind/conf-master/e45-4.conf";
+include "/etc/bind/conf-master/e47-1.conf";
+include "/etc/bind/conf-master/e47-2.conf";
+include "/etc/bind/conf-master/e47-3.conf";
+include "/etc/bind/conf-master/e47-4.conf";
+include "/etc/bind/conf-master/e49-1.conf";
+include "/etc/bind/conf-master/e49-2.conf";
+include "/etc/bind/conf-master/e49-3.conf";
+include "/etc/bind/conf-master/e49-4.conf";
+include "/etc/bind/conf-master/e5-3.conf";
+include "/etc/bind/conf-master/e5-4.conf";
+include "/etc/bind/conf-master/e51-1.conf";
+include "/etc/bind/conf-master/e51-2.conf";
+include "/etc/bind/conf-master/e51-3.conf";
+include "/etc/bind/conf-master/e51-4.conf";
+include "/etc/bind/conf-master/e53-1.conf";
+include "/etc/bind/conf-master/e53-2.conf";
+include "/etc/bind/conf-master/e53-3.conf";
+include "/etc/bind/conf-master/e53-4.conf";
+include "/etc/bind/conf-master/e55-1.conf";
+include "/etc/bind/conf-master/e55-2.conf";
+include "/etc/bind/conf-master/e55-3.conf";
+include "/etc/bind/conf-master/e55-4.conf";
+include "/etc/bind/conf-master/e57-1.conf";
+include "/etc/bind/conf-master/e57-2.conf";
+include "/etc/bind/conf-master/e57-3.conf";
+include "/etc/bind/conf-master/e57-4.conf";
+include "/etc/bind/conf-master/e59-1.conf";
+include "/etc/bind/conf-master/e59-2.conf";
+include "/etc/bind/conf-master/e59-3.conf";
+include "/etc/bind/conf-master/e59-4.conf";
+include "/etc/bind/conf-master/e61-1.conf";
+include "/etc/bind/conf-master/e61-2.conf";
+include "/etc/bind/conf-master/e61-3.conf";
+include "/etc/bind/conf-master/e61-4.conf";
+include "/etc/bind/conf-master/e63-1.conf";
+include "/etc/bind/conf-master/e63-2.conf";
+include "/etc/bind/conf-master/e63-3.conf";
+include "/etc/bind/conf-master/e63-4.conf";
+include "/etc/bind/conf-master/e65-1.conf";
+include "/etc/bind/conf-master/e65-2.conf";
+include "/etc/bind/conf-master/e65-3.conf";
+include "/etc/bind/conf-master/e65-4.conf";
+include "/etc/bind/conf-master/e67-1.conf";
+include "/etc/bind/conf-master/e67-2.conf";
+include "/etc/bind/conf-master/e67-3.conf";
+include "/etc/bind/conf-master/e67-4.conf";
+include "/etc/bind/conf-master/e69-1.conf";
+include "/etc/bind/conf-master/e69-2.conf";
+include "/etc/bind/conf-master/e69-3.conf";
+include "/etc/bind/conf-master/e69-4.conf";
+include "/etc/bind/conf-master/e7-3.conf";
+include "/etc/bind/conf-master/e7-4.conf";
+include "/etc/bind/conf-master/e71-1.conf";
+include "/etc/bind/conf-master/e71-2.conf";
+include "/etc/bind/conf-master/e71-3.conf";
+include "/etc/bind/conf-master/e71-4.conf";
+include "/etc/bind/conf-master/e73-1.conf";
+include "/etc/bind/conf-master/e73-2.conf";
+include "/etc/bind/conf-master/e73-3.conf";
+include "/etc/bind/conf-master/e73-4.conf";
+include "/etc/bind/conf-master/e75-1.conf";
+include "/etc/bind/conf-master/e75-2.conf";
+include "/etc/bind/conf-master/e75-3.conf";
+include "/etc/bind/conf-master/e75-4.conf";
+include "/etc/bind/conf-master/e77-1.conf";
+include "/etc/bind/conf-master/e77-2.conf";
+include "/etc/bind/conf-master/e9-3.conf";
+include "/etc/bind/conf-master/e9-4.conf";
+include "/etc/bind/conf-master/fugleberg1.conf";
+include "/etc/bind/conf-master/fugleberg2.conf";
+include "/etc/bind/conf-master/game.conf";
+include "/etc/bind/conf-master/gamehq.conf";
+include "/etc/bind/conf-master/lager.conf";
+include "/etc/bind/conf-master/logistikk.conf";
+include "/etc/bind/conf-master/marsrele.conf";
+include "/etc/bind/conf-master/noc.conf";
+include "/etc/bind/conf-master/presse.conf";
+include "/etc/bind/conf-master/secmedic.conf";
+include "/etc/bind/conf-master/sponsorvest.conf";
+include "/etc/bind/conf-master/stage.conf";
+include "/etc/bind/conf-master/stageboh.conf";
+include "/etc/bind/conf-master/tele.conf";
+include "/etc/bind/conf-master/wlan.conf";
+include "/etc/bind/conf-master/ymse.conf";
diff --git a/bind/master/named.reverse4.conf b/bind/master/named.reverse4.conf
new file mode 100644
index 0000000..d8669f8
--- /dev/null
+++ b/bind/master/named.reverse4.conf
@@ -0,0 +1,1024 @@
+zone "0.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/0.216.151.in-addr.arpa.zone";
+};
+
+zone "1.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/1.216.151.in-addr.arpa.zone";
+};
+
+zone "2.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/2.216.151.in-addr.arpa.zone";
+};
+
+zone "3.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/3.216.151.in-addr.arpa.zone";
+};
+
+zone "4.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/4.216.151.in-addr.arpa.zone";
+};
+
+zone "5.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/5.216.151.in-addr.arpa.zone";
+};
+
+zone "6.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/6.216.151.in-addr.arpa.zone";
+};
+
+zone "7.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/7.216.151.in-addr.arpa.zone";
+};
+
+zone "8.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/8.216.151.in-addr.arpa.zone";
+};
+
+zone "9.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/9.216.151.in-addr.arpa.zone";
+};
+
+zone "10.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/10.216.151.in-addr.arpa.zone";
+};
+
+zone "11.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/11.216.151.in-addr.arpa.zone";
+};
+
+zone "12.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/12.216.151.in-addr.arpa.zone";
+};
+
+zone "13.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/13.216.151.in-addr.arpa.zone";
+};
+
+zone "14.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/14.216.151.in-addr.arpa.zone";
+};
+
+zone "15.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/15.216.151.in-addr.arpa.zone";
+};
+
+zone "16.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/16.216.151.in-addr.arpa.zone";
+};
+
+zone "17.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/17.216.151.in-addr.arpa.zone";
+};
+
+zone "18.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/18.216.151.in-addr.arpa.zone";
+};
+
+zone "19.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/19.216.151.in-addr.arpa.zone";
+};
+
+zone "20.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/20.216.151.in-addr.arpa.zone";
+};
+
+zone "21.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/21.216.151.in-addr.arpa.zone";
+};
+
+zone "22.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/22.216.151.in-addr.arpa.zone";
+};
+
+zone "23.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/23.216.151.in-addr.arpa.zone";
+};
+
+zone "24.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/24.216.151.in-addr.arpa.zone";
+};
+
+zone "25.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/25.216.151.in-addr.arpa.zone";
+};
+
+zone "26.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/26.216.151.in-addr.arpa.zone";
+};
+
+zone "27.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/27.216.151.in-addr.arpa.zone";
+};
+
+zone "28.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/28.216.151.in-addr.arpa.zone";
+};
+
+zone "29.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/29.216.151.in-addr.arpa.zone";
+};
+
+zone "30.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/30.216.151.in-addr.arpa.zone";
+};
+
+zone "31.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/31.216.151.in-addr.arpa.zone";
+};
+
+zone "32.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/32.216.151.in-addr.arpa.zone";
+};
+
+zone "33.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/33.216.151.in-addr.arpa.zone";
+};
+
+zone "34.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/34.216.151.in-addr.arpa.zone";
+};
+
+zone "35.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/35.216.151.in-addr.arpa.zone";
+};
+
+zone "36.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/36.216.151.in-addr.arpa.zone";
+};
+
+zone "37.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/37.216.151.in-addr.arpa.zone";
+};
+
+zone "38.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/38.216.151.in-addr.arpa.zone";
+};
+
+zone "39.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/39.216.151.in-addr.arpa.zone";
+};
+
+zone "40.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/40.216.151.in-addr.arpa.zone";
+};
+
+zone "41.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/41.216.151.in-addr.arpa.zone";
+};
+
+zone "42.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/42.216.151.in-addr.arpa.zone";
+};
+
+zone "43.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/43.216.151.in-addr.arpa.zone";
+};
+
+zone "44.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/44.216.151.in-addr.arpa.zone";
+};
+
+zone "45.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/45.216.151.in-addr.arpa.zone";
+};
+
+zone "46.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/46.216.151.in-addr.arpa.zone";
+};
+
+zone "47.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/47.216.151.in-addr.arpa.zone";
+};
+
+zone "48.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/48.216.151.in-addr.arpa.zone";
+};
+
+zone "49.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/49.216.151.in-addr.arpa.zone";
+};
+
+zone "50.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/50.216.151.in-addr.arpa.zone";
+};
+
+zone "51.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/51.216.151.in-addr.arpa.zone";
+};
+
+zone "52.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/52.216.151.in-addr.arpa.zone";
+};
+
+zone "53.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/53.216.151.in-addr.arpa.zone";
+};
+
+zone "54.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/54.216.151.in-addr.arpa.zone";
+};
+
+zone "55.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/55.216.151.in-addr.arpa.zone";
+};
+
+zone "56.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/56.216.151.in-addr.arpa.zone";
+};
+
+zone "57.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/57.216.151.in-addr.arpa.zone";
+};
+
+zone "58.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/58.216.151.in-addr.arpa.zone";
+};
+
+zone "59.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/59.216.151.in-addr.arpa.zone";
+};
+
+zone "60.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/60.216.151.in-addr.arpa.zone";
+};
+
+zone "61.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/61.216.151.in-addr.arpa.zone";
+};
+
+zone "62.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/62.216.151.in-addr.arpa.zone";
+};
+
+zone "63.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/63.216.151.in-addr.arpa.zone";
+};
+
+zone "64.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/64.216.151.in-addr.arpa.zone";
+};
+
+zone "65.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/65.216.151.in-addr.arpa.zone";
+};
+
+zone "66.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/66.216.151.in-addr.arpa.zone";
+};
+
+zone "67.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/67.216.151.in-addr.arpa.zone";
+};
+
+zone "68.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/68.216.151.in-addr.arpa.zone";
+};
+
+zone "69.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/69.216.151.in-addr.arpa.zone";
+};
+
+zone "70.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/70.216.151.in-addr.arpa.zone";
+};
+
+zone "71.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/71.216.151.in-addr.arpa.zone";
+};
+
+zone "72.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/72.216.151.in-addr.arpa.zone";
+};
+
+zone "73.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/73.216.151.in-addr.arpa.zone";
+};
+
+zone "74.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/74.216.151.in-addr.arpa.zone";
+};
+
+zone "75.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/75.216.151.in-addr.arpa.zone";
+};
+
+zone "76.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/76.216.151.in-addr.arpa.zone";
+};
+
+zone "77.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/77.216.151.in-addr.arpa.zone";
+};
+
+zone "78.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/78.216.151.in-addr.arpa.zone";
+};
+
+zone "79.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/79.216.151.in-addr.arpa.zone";
+};
+
+zone "80.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/80.216.151.in-addr.arpa.zone";
+};
+
+zone "81.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/81.216.151.in-addr.arpa.zone";
+};
+
+zone "82.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/82.216.151.in-addr.arpa.zone";
+};
+
+zone "83.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/83.216.151.in-addr.arpa.zone";
+};
+
+zone "84.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/84.216.151.in-addr.arpa.zone";
+};
+
+zone "85.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/85.216.151.in-addr.arpa.zone";
+};
+
+zone "86.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/86.216.151.in-addr.arpa.zone";
+};
+
+zone "87.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/87.216.151.in-addr.arpa.zone";
+};
+
+zone "88.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/88.216.151.in-addr.arpa.zone";
+};
+
+zone "89.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/89.216.151.in-addr.arpa.zone";
+};
+
+zone "90.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/90.216.151.in-addr.arpa.zone";
+};
+
+zone "91.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/91.216.151.in-addr.arpa.zone";
+};
+
+zone "92.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/92.216.151.in-addr.arpa.zone";
+};
+
+zone "93.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/93.216.151.in-addr.arpa.zone";
+};
+
+zone "94.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/94.216.151.in-addr.arpa.zone";
+};
+
+zone "95.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/95.216.151.in-addr.arpa.zone";
+};
+
+zone "96.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/96.216.151.in-addr.arpa.zone";
+};
+
+zone "97.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/97.216.151.in-addr.arpa.zone";
+};
+
+zone "98.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/98.216.151.in-addr.arpa.zone";
+};
+
+zone "99.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/99.216.151.in-addr.arpa.zone";
+};
+
+zone "100.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/100.216.151.in-addr.arpa.zone";
+};
+
+zone "101.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/101.216.151.in-addr.arpa.zone";
+};
+
+zone "102.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/102.216.151.in-addr.arpa.zone";
+};
+
+zone "103.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/103.216.151.in-addr.arpa.zone";
+};
+
+zone "104.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/104.216.151.in-addr.arpa.zone";
+};
+
+zone "105.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/105.216.151.in-addr.arpa.zone";
+};
+
+zone "106.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/106.216.151.in-addr.arpa.zone";
+};
+
+zone "107.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/107.216.151.in-addr.arpa.zone";
+};
+
+zone "108.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/108.216.151.in-addr.arpa.zone";
+};
+
+zone "109.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/109.216.151.in-addr.arpa.zone";
+};
+
+zone "110.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/110.216.151.in-addr.arpa.zone";
+};
+
+zone "111.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/111.216.151.in-addr.arpa.zone";
+};
+
+zone "112.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/112.216.151.in-addr.arpa.zone";
+};
+
+zone "113.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/113.216.151.in-addr.arpa.zone";
+};
+
+zone "114.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/114.216.151.in-addr.arpa.zone";
+};
+
+zone "115.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/115.216.151.in-addr.arpa.zone";
+};
+
+zone "116.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/116.216.151.in-addr.arpa.zone";
+};
+
+zone "117.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/117.216.151.in-addr.arpa.zone";
+};
+
+zone "118.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/118.216.151.in-addr.arpa.zone";
+};
+
+zone "119.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/119.216.151.in-addr.arpa.zone";
+};
+
+zone "120.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/120.216.151.in-addr.arpa.zone";
+};
+
+zone "121.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/121.216.151.in-addr.arpa.zone";
+};
+
+zone "122.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/122.216.151.in-addr.arpa.zone";
+};
+
+zone "123.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/123.216.151.in-addr.arpa.zone";
+};
+
+zone "124.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/124.216.151.in-addr.arpa.zone";
+};
+
+zone "125.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/125.216.151.in-addr.arpa.zone";
+};
+
+zone "126.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/126.216.151.in-addr.arpa.zone";
+};
+
+zone "127.216.151.in-addr.arpa" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ allow-transfer { 151.216.125.2; 193.0.0.0/22; 151.216.124.0/24; 2a02:ed02:124::/64; };
+ file "reverse/127.216.151.in-addr.arpa.zone";
+};
+
diff --git a/bind/master/rndc.key b/bind/master/rndc.key
new file mode 100644
index 0000000..6ad396d
--- /dev/null
+++ b/bind/master/rndc.key
@@ -0,0 +1,4 @@
+key "rndc-key" {
+ algorithm hmac-md5;
+ secret "<removed>";
+};
diff --git a/bind/master/steamorigin-zones b/bind/master/steamorigin-zones
new file mode 100644
index 0000000..b1d61f5
--- /dev/null
+++ b/bind/master/steamorigin-zones
@@ -0,0 +1,61 @@
+
+zone "valve.vo.llnwd.net" {
+ type forward;
+ forwarders { 2001:67c:29f4::51; };
+};
+zone "steampowered.com" {
+ type forward;
+ forwarders { 2001:67c:29f4::51; };
+};
+zone "steamcommunity.com" {
+ type forward;
+ forwarders { 2001:67c:29f4::51; };
+};
+
+zone "origin.com" {
+ type forward;
+ forwarders { 2001:67c:29f4::51; };
+};
+zone "ea.com" {
+ type forward;
+ forwarders { 2001:67c:29f4::51; };
+};
+
+
+zone "www.ea.com.edgekey.net" {
+ type forward;
+ forwarders { 2001:67c:29f4::51; };
+};
+zone "e6909.g.akamaiedge.net" {
+ type forward;
+ forwarders { 2001:67c:29f4::51; };
+};
+zone "ecommerce-origin-1434850512.us-east-1.elb.amazonaws.com" {
+ type forward;
+ forwarders { 2001:67c:29f4::51; };
+};
+zone "prod-chat-orgin-1410280267.us-east-1.elb.amazonaws.com" {
+ type forward;
+ forwarders { 2001:67c:29f4::51; };
+};
+zone "prod-avatar-origin-1061716926.us-east-1.elb.amazonaws.com" {
+ type forward;
+ forwarders { 2001:67c:29f4::51; };
+};
+zone "prod-friends-origin-1309711156.us-east-1.elb.amazonaws.com" {
+ type forward;
+ forwarders { 2001:67c:29f4::51; };
+};
+zone "prod-loginregistration-origin-1419075154.us-east-1.elb.amazonaws.com" {
+ type forward;
+ forwarders { 2001:67c:29f4::51; };
+};
+zone "static.ea.com.edgesuite.net" {
+ type forward;
+ forwarders { 2001:67c:29f4::51; };
+};
+zone "a1560.g.akamai.net" {
+ type forward;
+ forwarders { 2001:67c:29f4::51; };
+};
+
diff --git a/bind/master/tg13.gathering.org.zone b/bind/master/tg13.gathering.org.zone
new file mode 100644
index 0000000..af2255d
--- /dev/null
+++ b/bind/master/tg13.gathering.org.zone
@@ -0,0 +1,91 @@
+$TTL 3600
+@ IN SOA winix.tg13.gathering.org. abuse.gathering.org. (
+ 2013032901; serial
+ 3600 ; refresh
+ 1800 ; retry
+ 608400 ; expire
+ 3600 ) ; minimum and default TTL
+
+ IN NS ns1.tg13.gathering.org.
+ IN NS ns2.tg13.gathering.org.
+
+ns1 IN A 151.216.126.2
+ns1 IN AAAA 2a02:ed02:126::2
+ns2 IN A 151.216.125.2
+ns2 IN AAAA 2a02:ed02:125::2
+winix IN A 151.216.126.2
+winix IN AAAA 2a02:ed02:126::2
+davetele IN A 151.216.126.4
+davetele IN AAAA 2a02:ed02:126::4
+tress90 IN A 151.216.125.2
+tress90 IN AAAA 2a02:ed02:125::2
+upstart IN A 151.216.125.3
+upstart IN AAAA 2a02:ed02:125::3
+
+; Generated by make-all-config.sh on the bootstrapping/nms server.
+; Will not be overwritten unless it is missing ;)
+
+krosus IN A 151.216.125.4
+krosus IN AAAA 2a02:ed02:125::4
+flexus IN A 151.216.125.5
+flexus IN AAAA 2a02:ed02:125::5
+wannabe IN A 151.216.125.6
+wannabe IN AAAA 2a02:ed02:125::6
+altinn IN A 151.216.125.7
+altinn IN AAAA 2a02:ed02:125::7
+au2sys IN A 151.216.125.8
+au2sys IN AAAA 2a02:ed02:125::8
+
+kliniskarbeidsflate IN A 151.216.125.9
+kliniskarbeidsflate IN AAAA 2a02:ed02:125::9
+; Enkoder hos EBU i OB-bussen
+politietno IN A 151.216.114.254
+politietno IN AAAA 2a02:ed02:114::254
+
+
+golf IN A 151.216.125.12
+golf IN AAAA 2a02:ed02:125::12
+tgjump IN A 151.216.125.14
+tgjump IN AAAA 2a02:ed02:125::14
+optimus IN A 151.216.125.15
+optimus IN AAAA 2a02:ed02:125::15
+mse IN A 151.216.125.16
+mse IN AAAA 2a02:ed02:125::16
+avinor1 IN A 151.216.125.21
+avinor2 IN A 151.216.125.22
+bigbrother IN A 151.216.125.17
+
+nam3 IN A 151.216.126.3
+nam3 IN AAAA 2a02:ed02:126::3
+
+stats IN CNAME tgjump.tg13.gathering.org.
+
+stillcam IN A 212.62.229.140
+stillcam IN AAAA 2001:470:1f0b:c1::1
+
+fuglecam IN A 151.216.99.254
+fuglecam IN AAAA 2a02:ed02:992:0:922b:34ff:fe5c:49d4
+
+; Printer for Content
+oi.content IN AAAA 2a02:ed02:992:0:21b:a9ff:fed5:1f18
+
+; Services
+tech IN CNAME flexus.tg13.gathering.org.
+nms IN CNAME flexus.tg13.gathering.org.
+nms-public IN CNAME flexus.tg13.gathering.org.
+stream IN CNAME krosus.tg13.gathering.org.
+smtp IN CNAME tress90.tg13.gathering.org.
+
+; wuhuWTF
+compo IN A 151.216.55.54
+compo IN AAAA 2A02:ED02:55:0:5054:FF:FEF4:FA3C
+wuhu-admin IN CNAME compo.tg13.gathering.org.
+tgpc IN A 151.216.55.61
+tgpc IN AAAA 2A02:ED02:55:0:5054:FF:FEB7:4598
+hack IN A 151.216.55.56
+
+; tng
+tng IN CNAME altinn.tg13.gathering.org.
+
+; server lek
+nav IN CNAME altinn.tg13.gathering.org.
diff --git a/bind/master/zones.rfc1918 b/bind/master/zones.rfc1918
new file mode 100644
index 0000000..03b5546
--- /dev/null
+++ b/bind/master/zones.rfc1918
@@ -0,0 +1,20 @@
+zone "10.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+
+zone "16.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "17.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "18.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "19.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "20.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "21.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "22.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "23.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "24.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "25.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "26.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "27.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "28.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "29.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "30.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "31.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+
+zone "168.192.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
diff --git a/bind/slave/bind.keys b/bind/slave/bind.keys
new file mode 100644
index 0000000..b003c53
--- /dev/null
+++ b/bind/slave/bind.keys
@@ -0,0 +1,49 @@
+/* $Id: bind.keys,v 1.5.42.2 2011-01-04 19:14:48 each Exp $ */
+# The bind.keys file is used to override built-in DNSSEC trust anchors
+# which are included as part of BIND 9. As of the current release (BIND
+# 9.7), the only trust anchor it sets is the one for the ISC DNSSEC
+# Lookaside Validation zone ("dlv.isc.org"). Trust anchors for any other
+# zones MUST be configured elsewhere; if they are configured here, they
+# will not be recognized or used by named.
+#
+# This file also contains a copy of the trust anchor for the DNS root zone
+# ("."). However, named does not use it; it is provided here for
+# informational purposes only. To switch on DNSSEC validation at the
+# root, the root key below can be copied into named.conf.
+#
+# The built-in DLV trust anchor in this file is used directly by named.
+# However, it is not activated unless specifically switched on. To use
+# the DLV key, set "dnssec-lookaside auto;" in the named.conf options.
+# Without this option being set, the key in this file is ignored.
+#
+# This file is NOT expected to be user-configured.
+#
+# These keys are current as of January 2011. If any key fails to
+# initialize correctly, it may have expired. In that event you should
+# replace this file with a current version. The latest version of
+# bind.keys can always be obtained from ISC at https://www.isc.org/bind-keys.
+
+managed-keys {
+ # ISC DLV: See https://www.isc.org/solutions/dlv for details.
+ # NOTE: This key is activated by setting "dnssec-lookaside auto;"
+ # in named.conf.
+ dlv.isc.org. initial-key 257 3 5 "BEAAAAPHMu/5onzrEE7z1egmhg/WPO0+juoZrW3euWEn4MxDCE1+lLy2
+ brhQv5rN32RKtMzX6Mj70jdzeND4XknW58dnJNPCxn8+jAGl2FZLK8t+
+ 1uq4W+nnA3qO2+DL+k6BD4mewMLbIYFwe0PG73Te9fZ2kJb56dhgMde5
+ ymX4BI/oQ+cAK50/xvJv00Frf8kw6ucMTwFlgPe+jnGxPPEmHAte/URk
+ Y62ZfkLoBAADLHQ9IrS2tryAe7mbBZVcOwIeU/Rw/mRx/vwwMCTgNboM
+ QKtUdvNXDrYJDSHZws3xiRXF1Rf+al9UmZfSav/4NWLKjHzpT59k/VSt
+ TDN0YUuWrBNh";
+
+ # ROOT KEY: See https://data.iana.org/root-anchors/root-anchors.xml
+ # for current trust anchor information.
+ # NOTE: This key is activated by setting "dnssec-validation auto;"
+ # in named.conf.
+ . initial-key 257 3 8 "AwEAAagAIKlVZrpC6Ia7gEzahOR+9W29euxhJhVVLOyQbSEW0O8gcCjF
+ FVQUTf6v58fLjwBd0YI0EzrAcQqBGCzh/RStIoO8g0NfnfL2MTJRkxoX
+ bfDaUeVPQuYEhg37NZWAJQ9VnMVDxP/VHL496M/QZxkjf5/Efucp2gaD
+ X6RS6CXpoY68LsvPVjR0ZSwzz1apAzvN9dlzEheX7ICJBBtuA6G3LQpz
+ W5hOA2hzCTMjJPJ8LbqF6dsV6DoBQzgul0sGIcGOYl7OyQdXfZ57relS
+ Qageu+ipAdTTJ25AsRTAoub8ONGcLmqrAmRLKBP1dfwhYB4N7knNnulq
+ QxA+Uk1ihz0=";
+};
diff --git a/bind/slave/conf-slave/ap-dist0.conf b/bind/slave/conf-slave/ap-dist0.conf
new file mode 100644
index 0000000..6cb150c
--- /dev/null
+++ b/bind/slave/conf-slave/ap-dist0.conf
@@ -0,0 +1,7 @@
+zone "ap-dist0.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/ap-dist0.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/ap-dist1.conf b/bind/slave/conf-slave/ap-dist1.conf
new file mode 100644
index 0000000..657aaac
--- /dev/null
+++ b/bind/slave/conf-slave/ap-dist1.conf
@@ -0,0 +1,7 @@
+zone "ap-dist1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/ap-dist1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/ap-dist2.conf b/bind/slave/conf-slave/ap-dist2.conf
new file mode 100644
index 0000000..96ac51e
--- /dev/null
+++ b/bind/slave/conf-slave/ap-dist2.conf
@@ -0,0 +1,7 @@
+zone "ap-dist2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/ap-dist2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/ap-dist3.conf b/bind/slave/conf-slave/ap-dist3.conf
new file mode 100644
index 0000000..1807f13
--- /dev/null
+++ b/bind/slave/conf-slave/ap-dist3.conf
@@ -0,0 +1,7 @@
+zone "ap-dist3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/ap-dist3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/ap-dist4.conf b/bind/slave/conf-slave/ap-dist4.conf
new file mode 100644
index 0000000..0cebd7f
--- /dev/null
+++ b/bind/slave/conf-slave/ap-dist4.conf
@@ -0,0 +1,7 @@
+zone "ap-dist4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/ap-dist4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/care.conf b/bind/slave/conf-slave/care.conf
new file mode 100644
index 0000000..c42c48c
--- /dev/null
+++ b/bind/slave/conf-slave/care.conf
@@ -0,0 +1,7 @@
+zone "care.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/care.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/chillout.conf b/bind/slave/conf-slave/chillout.conf
new file mode 100644
index 0000000..5cd6569
--- /dev/null
+++ b/bind/slave/conf-slave/chillout.conf
@@ -0,0 +1,7 @@
+zone "chillout.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/chillout.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/creativia.conf b/bind/slave/conf-slave/creativia.conf
new file mode 100644
index 0000000..668bc7d
--- /dev/null
+++ b/bind/slave/conf-slave/creativia.conf
@@ -0,0 +1,7 @@
+zone "creativia.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/creativia.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/crew1.conf b/bind/slave/conf-slave/crew1.conf
new file mode 100644
index 0000000..d30580a
--- /dev/null
+++ b/bind/slave/conf-slave/crew1.conf
@@ -0,0 +1,7 @@
+zone "crew1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/crew1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/crew2.conf b/bind/slave/conf-slave/crew2.conf
new file mode 100644
index 0000000..dc08880
--- /dev/null
+++ b/bind/slave/conf-slave/crew2.conf
@@ -0,0 +1,7 @@
+zone "crew2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/crew2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/crew3.conf b/bind/slave/conf-slave/crew3.conf
new file mode 100644
index 0000000..456a90b
--- /dev/null
+++ b/bind/slave/conf-slave/crew3.conf
@@ -0,0 +1,7 @@
+zone "crew3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/crew3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/crew4.conf b/bind/slave/conf-slave/crew4.conf
new file mode 100644
index 0000000..56ad6c0
--- /dev/null
+++ b/bind/slave/conf-slave/crew4.conf
@@ -0,0 +1,7 @@
+zone "crew4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/crew4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/crew5.conf b/bind/slave/conf-slave/crew5.conf
new file mode 100644
index 0000000..b562849
--- /dev/null
+++ b/bind/slave/conf-slave/crew5.conf
@@ -0,0 +1,7 @@
+zone "crew5.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/crew5.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/crew6.conf b/bind/slave/conf-slave/crew6.conf
new file mode 100644
index 0000000..6bf3b9f
--- /dev/null
+++ b/bind/slave/conf-slave/crew6.conf
@@ -0,0 +1,7 @@
+zone "crew6.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/crew6.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/defektraid.conf b/bind/slave/conf-slave/defektraid.conf
new file mode 100644
index 0000000..fee8190
--- /dev/null
+++ b/bind/slave/conf-slave/defektraid.conf
@@ -0,0 +1,7 @@
+zone "defektraid.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/defektraid.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e1-3.conf b/bind/slave/conf-slave/e1-3.conf
new file mode 100644
index 0000000..b32ca6c
--- /dev/null
+++ b/bind/slave/conf-slave/e1-3.conf
@@ -0,0 +1,7 @@
+zone "e1-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e1-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e1-4.conf b/bind/slave/conf-slave/e1-4.conf
new file mode 100644
index 0000000..f24e839
--- /dev/null
+++ b/bind/slave/conf-slave/e1-4.conf
@@ -0,0 +1,7 @@
+zone "e1-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e1-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e11-1.conf b/bind/slave/conf-slave/e11-1.conf
new file mode 100644
index 0000000..2a4f1a1
--- /dev/null
+++ b/bind/slave/conf-slave/e11-1.conf
@@ -0,0 +1,7 @@
+zone "e11-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e11-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e11-2.conf b/bind/slave/conf-slave/e11-2.conf
new file mode 100644
index 0000000..0872ce0
--- /dev/null
+++ b/bind/slave/conf-slave/e11-2.conf
@@ -0,0 +1,7 @@
+zone "e11-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e11-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e11-3.conf b/bind/slave/conf-slave/e11-3.conf
new file mode 100644
index 0000000..a88eff2
--- /dev/null
+++ b/bind/slave/conf-slave/e11-3.conf
@@ -0,0 +1,7 @@
+zone "e11-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e11-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e11-4.conf b/bind/slave/conf-slave/e11-4.conf
new file mode 100644
index 0000000..8ab56ee
--- /dev/null
+++ b/bind/slave/conf-slave/e11-4.conf
@@ -0,0 +1,7 @@
+zone "e11-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e11-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e13-1.conf b/bind/slave/conf-slave/e13-1.conf
new file mode 100644
index 0000000..089e887
--- /dev/null
+++ b/bind/slave/conf-slave/e13-1.conf
@@ -0,0 +1,7 @@
+zone "e13-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e13-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e13-2.conf b/bind/slave/conf-slave/e13-2.conf
new file mode 100644
index 0000000..e766fc3
--- /dev/null
+++ b/bind/slave/conf-slave/e13-2.conf
@@ -0,0 +1,7 @@
+zone "e13-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e13-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e13-3.conf b/bind/slave/conf-slave/e13-3.conf
new file mode 100644
index 0000000..e8f71e0
--- /dev/null
+++ b/bind/slave/conf-slave/e13-3.conf
@@ -0,0 +1,7 @@
+zone "e13-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e13-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e13-4.conf b/bind/slave/conf-slave/e13-4.conf
new file mode 100644
index 0000000..268659b
--- /dev/null
+++ b/bind/slave/conf-slave/e13-4.conf
@@ -0,0 +1,7 @@
+zone "e13-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e13-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e15-1.conf b/bind/slave/conf-slave/e15-1.conf
new file mode 100644
index 0000000..1259ee2
--- /dev/null
+++ b/bind/slave/conf-slave/e15-1.conf
@@ -0,0 +1,7 @@
+zone "e15-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e15-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e15-2.conf b/bind/slave/conf-slave/e15-2.conf
new file mode 100644
index 0000000..fa1762a
--- /dev/null
+++ b/bind/slave/conf-slave/e15-2.conf
@@ -0,0 +1,7 @@
+zone "e15-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e15-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e15-3.conf b/bind/slave/conf-slave/e15-3.conf
new file mode 100644
index 0000000..3c57263
--- /dev/null
+++ b/bind/slave/conf-slave/e15-3.conf
@@ -0,0 +1,7 @@
+zone "e15-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e15-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e15-4.conf b/bind/slave/conf-slave/e15-4.conf
new file mode 100644
index 0000000..f91bf19
--- /dev/null
+++ b/bind/slave/conf-slave/e15-4.conf
@@ -0,0 +1,7 @@
+zone "e15-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e15-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e17-1.conf b/bind/slave/conf-slave/e17-1.conf
new file mode 100644
index 0000000..52f7c74
--- /dev/null
+++ b/bind/slave/conf-slave/e17-1.conf
@@ -0,0 +1,7 @@
+zone "e17-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e17-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e17-2.conf b/bind/slave/conf-slave/e17-2.conf
new file mode 100644
index 0000000..c1c99e7
--- /dev/null
+++ b/bind/slave/conf-slave/e17-2.conf
@@ -0,0 +1,7 @@
+zone "e17-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e17-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e17-3.conf b/bind/slave/conf-slave/e17-3.conf
new file mode 100644
index 0000000..f80c69a
--- /dev/null
+++ b/bind/slave/conf-slave/e17-3.conf
@@ -0,0 +1,7 @@
+zone "e17-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e17-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e17-4.conf b/bind/slave/conf-slave/e17-4.conf
new file mode 100644
index 0000000..0494bce
--- /dev/null
+++ b/bind/slave/conf-slave/e17-4.conf
@@ -0,0 +1,7 @@
+zone "e17-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e17-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e19-1.conf b/bind/slave/conf-slave/e19-1.conf
new file mode 100644
index 0000000..d5ba505
--- /dev/null
+++ b/bind/slave/conf-slave/e19-1.conf
@@ -0,0 +1,7 @@
+zone "e19-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e19-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e19-2.conf b/bind/slave/conf-slave/e19-2.conf
new file mode 100644
index 0000000..515ddf8
--- /dev/null
+++ b/bind/slave/conf-slave/e19-2.conf
@@ -0,0 +1,7 @@
+zone "e19-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e19-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e19-3.conf b/bind/slave/conf-slave/e19-3.conf
new file mode 100644
index 0000000..b09d915
--- /dev/null
+++ b/bind/slave/conf-slave/e19-3.conf
@@ -0,0 +1,7 @@
+zone "e19-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e19-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e19-4.conf b/bind/slave/conf-slave/e19-4.conf
new file mode 100644
index 0000000..df1c48b
--- /dev/null
+++ b/bind/slave/conf-slave/e19-4.conf
@@ -0,0 +1,7 @@
+zone "e19-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e19-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e21-1.conf b/bind/slave/conf-slave/e21-1.conf
new file mode 100644
index 0000000..21eb664
--- /dev/null
+++ b/bind/slave/conf-slave/e21-1.conf
@@ -0,0 +1,7 @@
+zone "e21-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e21-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e21-2.conf b/bind/slave/conf-slave/e21-2.conf
new file mode 100644
index 0000000..4278ba6
--- /dev/null
+++ b/bind/slave/conf-slave/e21-2.conf
@@ -0,0 +1,7 @@
+zone "e21-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e21-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e21-3.conf b/bind/slave/conf-slave/e21-3.conf
new file mode 100644
index 0000000..85e116e
--- /dev/null
+++ b/bind/slave/conf-slave/e21-3.conf
@@ -0,0 +1,7 @@
+zone "e21-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e21-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e21-4.conf b/bind/slave/conf-slave/e21-4.conf
new file mode 100644
index 0000000..1a5c247
--- /dev/null
+++ b/bind/slave/conf-slave/e21-4.conf
@@ -0,0 +1,7 @@
+zone "e21-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e21-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e23-1.conf b/bind/slave/conf-slave/e23-1.conf
new file mode 100644
index 0000000..7a6d56c
--- /dev/null
+++ b/bind/slave/conf-slave/e23-1.conf
@@ -0,0 +1,7 @@
+zone "e23-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e23-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e23-2.conf b/bind/slave/conf-slave/e23-2.conf
new file mode 100644
index 0000000..a98f4e7
--- /dev/null
+++ b/bind/slave/conf-slave/e23-2.conf
@@ -0,0 +1,7 @@
+zone "e23-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e23-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e23-3.conf b/bind/slave/conf-slave/e23-3.conf
new file mode 100644
index 0000000..391dd08
--- /dev/null
+++ b/bind/slave/conf-slave/e23-3.conf
@@ -0,0 +1,7 @@
+zone "e23-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e23-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e23-4.conf b/bind/slave/conf-slave/e23-4.conf
new file mode 100644
index 0000000..311fa59
--- /dev/null
+++ b/bind/slave/conf-slave/e23-4.conf
@@ -0,0 +1,7 @@
+zone "e23-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e23-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e25-1.conf b/bind/slave/conf-slave/e25-1.conf
new file mode 100644
index 0000000..ff327b0
--- /dev/null
+++ b/bind/slave/conf-slave/e25-1.conf
@@ -0,0 +1,7 @@
+zone "e25-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e25-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e25-2.conf b/bind/slave/conf-slave/e25-2.conf
new file mode 100644
index 0000000..9d77158
--- /dev/null
+++ b/bind/slave/conf-slave/e25-2.conf
@@ -0,0 +1,7 @@
+zone "e25-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e25-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e25-3.conf b/bind/slave/conf-slave/e25-3.conf
new file mode 100644
index 0000000..805de20
--- /dev/null
+++ b/bind/slave/conf-slave/e25-3.conf
@@ -0,0 +1,7 @@
+zone "e25-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e25-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e25-4.conf b/bind/slave/conf-slave/e25-4.conf
new file mode 100644
index 0000000..9b2c652
--- /dev/null
+++ b/bind/slave/conf-slave/e25-4.conf
@@ -0,0 +1,7 @@
+zone "e25-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e25-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e27-1.conf b/bind/slave/conf-slave/e27-1.conf
new file mode 100644
index 0000000..72f0ea7
--- /dev/null
+++ b/bind/slave/conf-slave/e27-1.conf
@@ -0,0 +1,7 @@
+zone "e27-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e27-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e27-2.conf b/bind/slave/conf-slave/e27-2.conf
new file mode 100644
index 0000000..a798852
--- /dev/null
+++ b/bind/slave/conf-slave/e27-2.conf
@@ -0,0 +1,7 @@
+zone "e27-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e27-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e29-1.conf b/bind/slave/conf-slave/e29-1.conf
new file mode 100644
index 0000000..20eb035
--- /dev/null
+++ b/bind/slave/conf-slave/e29-1.conf
@@ -0,0 +1,7 @@
+zone "e29-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e29-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e29-2.conf b/bind/slave/conf-slave/e29-2.conf
new file mode 100644
index 0000000..d7cb7c7
--- /dev/null
+++ b/bind/slave/conf-slave/e29-2.conf
@@ -0,0 +1,7 @@
+zone "e29-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e29-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e3-3.conf b/bind/slave/conf-slave/e3-3.conf
new file mode 100644
index 0000000..960faa0
--- /dev/null
+++ b/bind/slave/conf-slave/e3-3.conf
@@ -0,0 +1,7 @@
+zone "e3-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e3-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e3-4.conf b/bind/slave/conf-slave/e3-4.conf
new file mode 100644
index 0000000..6dd6e8e
--- /dev/null
+++ b/bind/slave/conf-slave/e3-4.conf
@@ -0,0 +1,7 @@
+zone "e3-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e3-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e31-1.conf b/bind/slave/conf-slave/e31-1.conf
new file mode 100644
index 0000000..5706910
--- /dev/null
+++ b/bind/slave/conf-slave/e31-1.conf
@@ -0,0 +1,7 @@
+zone "e31-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e31-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e31-2.conf b/bind/slave/conf-slave/e31-2.conf
new file mode 100644
index 0000000..013aad3
--- /dev/null
+++ b/bind/slave/conf-slave/e31-2.conf
@@ -0,0 +1,7 @@
+zone "e31-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e31-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e33-1.conf b/bind/slave/conf-slave/e33-1.conf
new file mode 100644
index 0000000..f99f582
--- /dev/null
+++ b/bind/slave/conf-slave/e33-1.conf
@@ -0,0 +1,7 @@
+zone "e33-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e33-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e33-2.conf b/bind/slave/conf-slave/e33-2.conf
new file mode 100644
index 0000000..f0aa378
--- /dev/null
+++ b/bind/slave/conf-slave/e33-2.conf
@@ -0,0 +1,7 @@
+zone "e33-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e33-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e35-1.conf b/bind/slave/conf-slave/e35-1.conf
new file mode 100644
index 0000000..4a26cfe
--- /dev/null
+++ b/bind/slave/conf-slave/e35-1.conf
@@ -0,0 +1,7 @@
+zone "e35-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e35-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e35-2.conf b/bind/slave/conf-slave/e35-2.conf
new file mode 100644
index 0000000..b46070c
--- /dev/null
+++ b/bind/slave/conf-slave/e35-2.conf
@@ -0,0 +1,7 @@
+zone "e35-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e35-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e37-1.conf b/bind/slave/conf-slave/e37-1.conf
new file mode 100644
index 0000000..1cf7c8b
--- /dev/null
+++ b/bind/slave/conf-slave/e37-1.conf
@@ -0,0 +1,7 @@
+zone "e37-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e37-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e37-2.conf b/bind/slave/conf-slave/e37-2.conf
new file mode 100644
index 0000000..9f69ae7
--- /dev/null
+++ b/bind/slave/conf-slave/e37-2.conf
@@ -0,0 +1,7 @@
+zone "e37-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e37-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e39-1.conf b/bind/slave/conf-slave/e39-1.conf
new file mode 100644
index 0000000..c05033c
--- /dev/null
+++ b/bind/slave/conf-slave/e39-1.conf
@@ -0,0 +1,7 @@
+zone "e39-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e39-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e39-2.conf b/bind/slave/conf-slave/e39-2.conf
new file mode 100644
index 0000000..047959c
--- /dev/null
+++ b/bind/slave/conf-slave/e39-2.conf
@@ -0,0 +1,7 @@
+zone "e39-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e39-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e41-1.conf b/bind/slave/conf-slave/e41-1.conf
new file mode 100644
index 0000000..fea60b1
--- /dev/null
+++ b/bind/slave/conf-slave/e41-1.conf
@@ -0,0 +1,7 @@
+zone "e41-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e41-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e41-2.conf b/bind/slave/conf-slave/e41-2.conf
new file mode 100644
index 0000000..9da06c5
--- /dev/null
+++ b/bind/slave/conf-slave/e41-2.conf
@@ -0,0 +1,7 @@
+zone "e41-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e41-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e43-1.conf b/bind/slave/conf-slave/e43-1.conf
new file mode 100644
index 0000000..82f9ada
--- /dev/null
+++ b/bind/slave/conf-slave/e43-1.conf
@@ -0,0 +1,7 @@
+zone "e43-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e43-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e43-2.conf b/bind/slave/conf-slave/e43-2.conf
new file mode 100644
index 0000000..59aaae2
--- /dev/null
+++ b/bind/slave/conf-slave/e43-2.conf
@@ -0,0 +1,7 @@
+zone "e43-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e43-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e43-3.conf b/bind/slave/conf-slave/e43-3.conf
new file mode 100644
index 0000000..bb30b66
--- /dev/null
+++ b/bind/slave/conf-slave/e43-3.conf
@@ -0,0 +1,7 @@
+zone "e43-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e43-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e43-4.conf b/bind/slave/conf-slave/e43-4.conf
new file mode 100644
index 0000000..b46d34c
--- /dev/null
+++ b/bind/slave/conf-slave/e43-4.conf
@@ -0,0 +1,7 @@
+zone "e43-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e43-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e45-1.conf b/bind/slave/conf-slave/e45-1.conf
new file mode 100644
index 0000000..ef06167
--- /dev/null
+++ b/bind/slave/conf-slave/e45-1.conf
@@ -0,0 +1,7 @@
+zone "e45-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e45-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e45-2.conf b/bind/slave/conf-slave/e45-2.conf
new file mode 100644
index 0000000..c19e209
--- /dev/null
+++ b/bind/slave/conf-slave/e45-2.conf
@@ -0,0 +1,7 @@
+zone "e45-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e45-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e45-3.conf b/bind/slave/conf-slave/e45-3.conf
new file mode 100644
index 0000000..66378c7
--- /dev/null
+++ b/bind/slave/conf-slave/e45-3.conf
@@ -0,0 +1,7 @@
+zone "e45-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e45-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e45-4.conf b/bind/slave/conf-slave/e45-4.conf
new file mode 100644
index 0000000..92f8dfc
--- /dev/null
+++ b/bind/slave/conf-slave/e45-4.conf
@@ -0,0 +1,7 @@
+zone "e45-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e45-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e47-1.conf b/bind/slave/conf-slave/e47-1.conf
new file mode 100644
index 0000000..6562fda
--- /dev/null
+++ b/bind/slave/conf-slave/e47-1.conf
@@ -0,0 +1,7 @@
+zone "e47-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e47-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e47-2.conf b/bind/slave/conf-slave/e47-2.conf
new file mode 100644
index 0000000..080c195
--- /dev/null
+++ b/bind/slave/conf-slave/e47-2.conf
@@ -0,0 +1,7 @@
+zone "e47-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e47-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e47-3.conf b/bind/slave/conf-slave/e47-3.conf
new file mode 100644
index 0000000..a144fe0
--- /dev/null
+++ b/bind/slave/conf-slave/e47-3.conf
@@ -0,0 +1,7 @@
+zone "e47-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e47-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e47-4.conf b/bind/slave/conf-slave/e47-4.conf
new file mode 100644
index 0000000..af177fb
--- /dev/null
+++ b/bind/slave/conf-slave/e47-4.conf
@@ -0,0 +1,7 @@
+zone "e47-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e47-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e49-1.conf b/bind/slave/conf-slave/e49-1.conf
new file mode 100644
index 0000000..7ceb877
--- /dev/null
+++ b/bind/slave/conf-slave/e49-1.conf
@@ -0,0 +1,7 @@
+zone "e49-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e49-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e49-2.conf b/bind/slave/conf-slave/e49-2.conf
new file mode 100644
index 0000000..9757070
--- /dev/null
+++ b/bind/slave/conf-slave/e49-2.conf
@@ -0,0 +1,7 @@
+zone "e49-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e49-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e49-3.conf b/bind/slave/conf-slave/e49-3.conf
new file mode 100644
index 0000000..04fec88
--- /dev/null
+++ b/bind/slave/conf-slave/e49-3.conf
@@ -0,0 +1,7 @@
+zone "e49-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e49-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e49-4.conf b/bind/slave/conf-slave/e49-4.conf
new file mode 100644
index 0000000..ced68b7
--- /dev/null
+++ b/bind/slave/conf-slave/e49-4.conf
@@ -0,0 +1,7 @@
+zone "e49-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e49-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e5-3.conf b/bind/slave/conf-slave/e5-3.conf
new file mode 100644
index 0000000..22c9f01
--- /dev/null
+++ b/bind/slave/conf-slave/e5-3.conf
@@ -0,0 +1,7 @@
+zone "e5-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e5-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e5-4.conf b/bind/slave/conf-slave/e5-4.conf
new file mode 100644
index 0000000..088380c
--- /dev/null
+++ b/bind/slave/conf-slave/e5-4.conf
@@ -0,0 +1,7 @@
+zone "e5-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e5-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e51-1.conf b/bind/slave/conf-slave/e51-1.conf
new file mode 100644
index 0000000..ba6f76f
--- /dev/null
+++ b/bind/slave/conf-slave/e51-1.conf
@@ -0,0 +1,7 @@
+zone "e51-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e51-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e51-2.conf b/bind/slave/conf-slave/e51-2.conf
new file mode 100644
index 0000000..9895e5f
--- /dev/null
+++ b/bind/slave/conf-slave/e51-2.conf
@@ -0,0 +1,7 @@
+zone "e51-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e51-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e51-3.conf b/bind/slave/conf-slave/e51-3.conf
new file mode 100644
index 0000000..50c249b
--- /dev/null
+++ b/bind/slave/conf-slave/e51-3.conf
@@ -0,0 +1,7 @@
+zone "e51-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e51-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e51-4.conf b/bind/slave/conf-slave/e51-4.conf
new file mode 100644
index 0000000..2598407
--- /dev/null
+++ b/bind/slave/conf-slave/e51-4.conf
@@ -0,0 +1,7 @@
+zone "e51-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e51-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e53-1.conf b/bind/slave/conf-slave/e53-1.conf
new file mode 100644
index 0000000..2b88c48
--- /dev/null
+++ b/bind/slave/conf-slave/e53-1.conf
@@ -0,0 +1,7 @@
+zone "e53-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e53-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e53-2.conf b/bind/slave/conf-slave/e53-2.conf
new file mode 100644
index 0000000..b93f388
--- /dev/null
+++ b/bind/slave/conf-slave/e53-2.conf
@@ -0,0 +1,7 @@
+zone "e53-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e53-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e53-3.conf b/bind/slave/conf-slave/e53-3.conf
new file mode 100644
index 0000000..efb8a17
--- /dev/null
+++ b/bind/slave/conf-slave/e53-3.conf
@@ -0,0 +1,7 @@
+zone "e53-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e53-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e53-4.conf b/bind/slave/conf-slave/e53-4.conf
new file mode 100644
index 0000000..74e65fa
--- /dev/null
+++ b/bind/slave/conf-slave/e53-4.conf
@@ -0,0 +1,7 @@
+zone "e53-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e53-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e55-1.conf b/bind/slave/conf-slave/e55-1.conf
new file mode 100644
index 0000000..3d5e7f8
--- /dev/null
+++ b/bind/slave/conf-slave/e55-1.conf
@@ -0,0 +1,7 @@
+zone "e55-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e55-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e55-2.conf b/bind/slave/conf-slave/e55-2.conf
new file mode 100644
index 0000000..815138f
--- /dev/null
+++ b/bind/slave/conf-slave/e55-2.conf
@@ -0,0 +1,7 @@
+zone "e55-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e55-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e55-3.conf b/bind/slave/conf-slave/e55-3.conf
new file mode 100644
index 0000000..5da6c91
--- /dev/null
+++ b/bind/slave/conf-slave/e55-3.conf
@@ -0,0 +1,7 @@
+zone "e55-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e55-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e55-4.conf b/bind/slave/conf-slave/e55-4.conf
new file mode 100644
index 0000000..bc37351
--- /dev/null
+++ b/bind/slave/conf-slave/e55-4.conf
@@ -0,0 +1,7 @@
+zone "e55-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e55-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e57-1.conf b/bind/slave/conf-slave/e57-1.conf
new file mode 100644
index 0000000..33ef734
--- /dev/null
+++ b/bind/slave/conf-slave/e57-1.conf
@@ -0,0 +1,7 @@
+zone "e57-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e57-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e57-2.conf b/bind/slave/conf-slave/e57-2.conf
new file mode 100644
index 0000000..e175561
--- /dev/null
+++ b/bind/slave/conf-slave/e57-2.conf
@@ -0,0 +1,7 @@
+zone "e57-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e57-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e57-3.conf b/bind/slave/conf-slave/e57-3.conf
new file mode 100644
index 0000000..19f1456
--- /dev/null
+++ b/bind/slave/conf-slave/e57-3.conf
@@ -0,0 +1,7 @@
+zone "e57-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e57-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e57-4.conf b/bind/slave/conf-slave/e57-4.conf
new file mode 100644
index 0000000..7624646
--- /dev/null
+++ b/bind/slave/conf-slave/e57-4.conf
@@ -0,0 +1,7 @@
+zone "e57-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e57-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e59-1.conf b/bind/slave/conf-slave/e59-1.conf
new file mode 100644
index 0000000..970d5ca
--- /dev/null
+++ b/bind/slave/conf-slave/e59-1.conf
@@ -0,0 +1,7 @@
+zone "e59-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e59-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e59-2.conf b/bind/slave/conf-slave/e59-2.conf
new file mode 100644
index 0000000..c797ef8
--- /dev/null
+++ b/bind/slave/conf-slave/e59-2.conf
@@ -0,0 +1,7 @@
+zone "e59-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e59-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e59-3.conf b/bind/slave/conf-slave/e59-3.conf
new file mode 100644
index 0000000..36b17e5
--- /dev/null
+++ b/bind/slave/conf-slave/e59-3.conf
@@ -0,0 +1,7 @@
+zone "e59-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e59-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e59-4.conf b/bind/slave/conf-slave/e59-4.conf
new file mode 100644
index 0000000..85c005a
--- /dev/null
+++ b/bind/slave/conf-slave/e59-4.conf
@@ -0,0 +1,7 @@
+zone "e59-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e59-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e61-1.conf b/bind/slave/conf-slave/e61-1.conf
new file mode 100644
index 0000000..982baee
--- /dev/null
+++ b/bind/slave/conf-slave/e61-1.conf
@@ -0,0 +1,7 @@
+zone "e61-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e61-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e61-2.conf b/bind/slave/conf-slave/e61-2.conf
new file mode 100644
index 0000000..6d59df1
--- /dev/null
+++ b/bind/slave/conf-slave/e61-2.conf
@@ -0,0 +1,7 @@
+zone "e61-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e61-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e61-3.conf b/bind/slave/conf-slave/e61-3.conf
new file mode 100644
index 0000000..54c958a
--- /dev/null
+++ b/bind/slave/conf-slave/e61-3.conf
@@ -0,0 +1,7 @@
+zone "e61-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e61-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e61-4.conf b/bind/slave/conf-slave/e61-4.conf
new file mode 100644
index 0000000..b3d2da7
--- /dev/null
+++ b/bind/slave/conf-slave/e61-4.conf
@@ -0,0 +1,7 @@
+zone "e61-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e61-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e63-1.conf b/bind/slave/conf-slave/e63-1.conf
new file mode 100644
index 0000000..67708e9
--- /dev/null
+++ b/bind/slave/conf-slave/e63-1.conf
@@ -0,0 +1,7 @@
+zone "e63-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e63-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e63-2.conf b/bind/slave/conf-slave/e63-2.conf
new file mode 100644
index 0000000..504ec09
--- /dev/null
+++ b/bind/slave/conf-slave/e63-2.conf
@@ -0,0 +1,7 @@
+zone "e63-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e63-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e63-3.conf b/bind/slave/conf-slave/e63-3.conf
new file mode 100644
index 0000000..6610f52
--- /dev/null
+++ b/bind/slave/conf-slave/e63-3.conf
@@ -0,0 +1,7 @@
+zone "e63-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e63-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e63-4.conf b/bind/slave/conf-slave/e63-4.conf
new file mode 100644
index 0000000..4fe4dcf
--- /dev/null
+++ b/bind/slave/conf-slave/e63-4.conf
@@ -0,0 +1,7 @@
+zone "e63-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e63-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e65-1.conf b/bind/slave/conf-slave/e65-1.conf
new file mode 100644
index 0000000..8fbbfe7
--- /dev/null
+++ b/bind/slave/conf-slave/e65-1.conf
@@ -0,0 +1,7 @@
+zone "e65-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e65-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e65-2.conf b/bind/slave/conf-slave/e65-2.conf
new file mode 100644
index 0000000..574b3f5
--- /dev/null
+++ b/bind/slave/conf-slave/e65-2.conf
@@ -0,0 +1,7 @@
+zone "e65-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e65-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e65-3.conf b/bind/slave/conf-slave/e65-3.conf
new file mode 100644
index 0000000..f1b5f56
--- /dev/null
+++ b/bind/slave/conf-slave/e65-3.conf
@@ -0,0 +1,7 @@
+zone "e65-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e65-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e65-4.conf b/bind/slave/conf-slave/e65-4.conf
new file mode 100644
index 0000000..5a813aa
--- /dev/null
+++ b/bind/slave/conf-slave/e65-4.conf
@@ -0,0 +1,7 @@
+zone "e65-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e65-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e67-1.conf b/bind/slave/conf-slave/e67-1.conf
new file mode 100644
index 0000000..4a75285
--- /dev/null
+++ b/bind/slave/conf-slave/e67-1.conf
@@ -0,0 +1,7 @@
+zone "e67-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e67-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e67-2.conf b/bind/slave/conf-slave/e67-2.conf
new file mode 100644
index 0000000..281e94c
--- /dev/null
+++ b/bind/slave/conf-slave/e67-2.conf
@@ -0,0 +1,7 @@
+zone "e67-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e67-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e67-3.conf b/bind/slave/conf-slave/e67-3.conf
new file mode 100644
index 0000000..5c3cc69
--- /dev/null
+++ b/bind/slave/conf-slave/e67-3.conf
@@ -0,0 +1,7 @@
+zone "e67-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e67-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e67-4.conf b/bind/slave/conf-slave/e67-4.conf
new file mode 100644
index 0000000..89093c5
--- /dev/null
+++ b/bind/slave/conf-slave/e67-4.conf
@@ -0,0 +1,7 @@
+zone "e67-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e67-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e69-1.conf b/bind/slave/conf-slave/e69-1.conf
new file mode 100644
index 0000000..f261b89
--- /dev/null
+++ b/bind/slave/conf-slave/e69-1.conf
@@ -0,0 +1,7 @@
+zone "e69-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e69-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e69-2.conf b/bind/slave/conf-slave/e69-2.conf
new file mode 100644
index 0000000..db517c3
--- /dev/null
+++ b/bind/slave/conf-slave/e69-2.conf
@@ -0,0 +1,7 @@
+zone "e69-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e69-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e69-3.conf b/bind/slave/conf-slave/e69-3.conf
new file mode 100644
index 0000000..df212d7
--- /dev/null
+++ b/bind/slave/conf-slave/e69-3.conf
@@ -0,0 +1,7 @@
+zone "e69-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e69-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e69-4.conf b/bind/slave/conf-slave/e69-4.conf
new file mode 100644
index 0000000..4ae60fa
--- /dev/null
+++ b/bind/slave/conf-slave/e69-4.conf
@@ -0,0 +1,7 @@
+zone "e69-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e69-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e7-3.conf b/bind/slave/conf-slave/e7-3.conf
new file mode 100644
index 0000000..4693800
--- /dev/null
+++ b/bind/slave/conf-slave/e7-3.conf
@@ -0,0 +1,7 @@
+zone "e7-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e7-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e7-4.conf b/bind/slave/conf-slave/e7-4.conf
new file mode 100644
index 0000000..41455fd
--- /dev/null
+++ b/bind/slave/conf-slave/e7-4.conf
@@ -0,0 +1,7 @@
+zone "e7-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e7-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e71-1.conf b/bind/slave/conf-slave/e71-1.conf
new file mode 100644
index 0000000..71ddb54
--- /dev/null
+++ b/bind/slave/conf-slave/e71-1.conf
@@ -0,0 +1,7 @@
+zone "e71-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e71-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e71-2.conf b/bind/slave/conf-slave/e71-2.conf
new file mode 100644
index 0000000..94d8520
--- /dev/null
+++ b/bind/slave/conf-slave/e71-2.conf
@@ -0,0 +1,7 @@
+zone "e71-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e71-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e71-3.conf b/bind/slave/conf-slave/e71-3.conf
new file mode 100644
index 0000000..b3c1c59
--- /dev/null
+++ b/bind/slave/conf-slave/e71-3.conf
@@ -0,0 +1,7 @@
+zone "e71-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e71-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e71-4.conf b/bind/slave/conf-slave/e71-4.conf
new file mode 100644
index 0000000..f6bdd4f
--- /dev/null
+++ b/bind/slave/conf-slave/e71-4.conf
@@ -0,0 +1,7 @@
+zone "e71-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e71-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e73-1.conf b/bind/slave/conf-slave/e73-1.conf
new file mode 100644
index 0000000..230edcd
--- /dev/null
+++ b/bind/slave/conf-slave/e73-1.conf
@@ -0,0 +1,7 @@
+zone "e73-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e73-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e73-2.conf b/bind/slave/conf-slave/e73-2.conf
new file mode 100644
index 0000000..2fead83
--- /dev/null
+++ b/bind/slave/conf-slave/e73-2.conf
@@ -0,0 +1,7 @@
+zone "e73-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e73-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e73-3.conf b/bind/slave/conf-slave/e73-3.conf
new file mode 100644
index 0000000..f28825e
--- /dev/null
+++ b/bind/slave/conf-slave/e73-3.conf
@@ -0,0 +1,7 @@
+zone "e73-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e73-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e73-4.conf b/bind/slave/conf-slave/e73-4.conf
new file mode 100644
index 0000000..a0586d7
--- /dev/null
+++ b/bind/slave/conf-slave/e73-4.conf
@@ -0,0 +1,7 @@
+zone "e73-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e73-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e75-1.conf b/bind/slave/conf-slave/e75-1.conf
new file mode 100644
index 0000000..bcdd0fe
--- /dev/null
+++ b/bind/slave/conf-slave/e75-1.conf
@@ -0,0 +1,7 @@
+zone "e75-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e75-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e75-2.conf b/bind/slave/conf-slave/e75-2.conf
new file mode 100644
index 0000000..0631366
--- /dev/null
+++ b/bind/slave/conf-slave/e75-2.conf
@@ -0,0 +1,7 @@
+zone "e75-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e75-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e75-3.conf b/bind/slave/conf-slave/e75-3.conf
new file mode 100644
index 0000000..4ce2c1d
--- /dev/null
+++ b/bind/slave/conf-slave/e75-3.conf
@@ -0,0 +1,7 @@
+zone "e75-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e75-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e75-4.conf b/bind/slave/conf-slave/e75-4.conf
new file mode 100644
index 0000000..e361095
--- /dev/null
+++ b/bind/slave/conf-slave/e75-4.conf
@@ -0,0 +1,7 @@
+zone "e75-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e75-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e77-1.conf b/bind/slave/conf-slave/e77-1.conf
new file mode 100644
index 0000000..898f8d9
--- /dev/null
+++ b/bind/slave/conf-slave/e77-1.conf
@@ -0,0 +1,7 @@
+zone "e77-1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e77-1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e77-2.conf b/bind/slave/conf-slave/e77-2.conf
new file mode 100644
index 0000000..70d651b
--- /dev/null
+++ b/bind/slave/conf-slave/e77-2.conf
@@ -0,0 +1,7 @@
+zone "e77-2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e77-2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e9-3.conf b/bind/slave/conf-slave/e9-3.conf
new file mode 100644
index 0000000..fff493a
--- /dev/null
+++ b/bind/slave/conf-slave/e9-3.conf
@@ -0,0 +1,7 @@
+zone "e9-3.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e9-3.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/e9-4.conf b/bind/slave/conf-slave/e9-4.conf
new file mode 100644
index 0000000..42374e8
--- /dev/null
+++ b/bind/slave/conf-slave/e9-4.conf
@@ -0,0 +1,7 @@
+zone "e9-4.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/e9-4.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/fugleberg1.conf b/bind/slave/conf-slave/fugleberg1.conf
new file mode 100644
index 0000000..b5b39cf
--- /dev/null
+++ b/bind/slave/conf-slave/fugleberg1.conf
@@ -0,0 +1,7 @@
+zone "fugleberg1.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/fugleberg1.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/fugleberg2.conf b/bind/slave/conf-slave/fugleberg2.conf
new file mode 100644
index 0000000..e3ffcad
--- /dev/null
+++ b/bind/slave/conf-slave/fugleberg2.conf
@@ -0,0 +1,7 @@
+zone "fugleberg2.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/fugleberg2.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/game.conf b/bind/slave/conf-slave/game.conf
new file mode 100644
index 0000000..04fdc30
--- /dev/null
+++ b/bind/slave/conf-slave/game.conf
@@ -0,0 +1,7 @@
+zone "game.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/game.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/gamehq.conf b/bind/slave/conf-slave/gamehq.conf
new file mode 100644
index 0000000..11c35c2
--- /dev/null
+++ b/bind/slave/conf-slave/gamehq.conf
@@ -0,0 +1,7 @@
+zone "gamehq.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/gamehq.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/lager.conf b/bind/slave/conf-slave/lager.conf
new file mode 100644
index 0000000..cec1eb0
--- /dev/null
+++ b/bind/slave/conf-slave/lager.conf
@@ -0,0 +1,7 @@
+zone "lager.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/lager.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/logistikk.conf b/bind/slave/conf-slave/logistikk.conf
new file mode 100644
index 0000000..84ff89f
--- /dev/null
+++ b/bind/slave/conf-slave/logistikk.conf
@@ -0,0 +1,7 @@
+zone "logistikk.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/logistikk.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/marsrele.conf b/bind/slave/conf-slave/marsrele.conf
new file mode 100644
index 0000000..56639ea
--- /dev/null
+++ b/bind/slave/conf-slave/marsrele.conf
@@ -0,0 +1,7 @@
+zone "marsrele.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/marsrele.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/noc.conf b/bind/slave/conf-slave/noc.conf
new file mode 100644
index 0000000..955695e
--- /dev/null
+++ b/bind/slave/conf-slave/noc.conf
@@ -0,0 +1,7 @@
+zone "noc.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/noc.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/presse.conf b/bind/slave/conf-slave/presse.conf
new file mode 100644
index 0000000..81ceebe
--- /dev/null
+++ b/bind/slave/conf-slave/presse.conf
@@ -0,0 +1,7 @@
+zone "presse.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/presse.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/secmedic.conf b/bind/slave/conf-slave/secmedic.conf
new file mode 100644
index 0000000..4f32330
--- /dev/null
+++ b/bind/slave/conf-slave/secmedic.conf
@@ -0,0 +1,7 @@
+zone "secmedic.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/secmedic.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/sponsorvest.conf b/bind/slave/conf-slave/sponsorvest.conf
new file mode 100644
index 0000000..4f4a255
--- /dev/null
+++ b/bind/slave/conf-slave/sponsorvest.conf
@@ -0,0 +1,7 @@
+zone "sponsorvest.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/sponsorvest.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/stage.conf b/bind/slave/conf-slave/stage.conf
new file mode 100644
index 0000000..c459678
--- /dev/null
+++ b/bind/slave/conf-slave/stage.conf
@@ -0,0 +1,7 @@
+zone "stage.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/stage.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/stageboh.conf b/bind/slave/conf-slave/stageboh.conf
new file mode 100644
index 0000000..7081f38
--- /dev/null
+++ b/bind/slave/conf-slave/stageboh.conf
@@ -0,0 +1,7 @@
+zone "stageboh.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/stageboh.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/tele.conf b/bind/slave/conf-slave/tele.conf
new file mode 100644
index 0000000..1484d25
--- /dev/null
+++ b/bind/slave/conf-slave/tele.conf
@@ -0,0 +1,7 @@
+zone "tele.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/tele.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/wlan.conf b/bind/slave/conf-slave/wlan.conf
new file mode 100644
index 0000000..4a6b83d
--- /dev/null
+++ b/bind/slave/conf-slave/wlan.conf
@@ -0,0 +1,7 @@
+zone "wlan.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/wlan.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/conf-slave/ymse.conf b/bind/slave/conf-slave/ymse.conf
new file mode 100644
index 0000000..bf26b4c
--- /dev/null
+++ b/bind/slave/conf-slave/ymse.conf
@@ -0,0 +1,7 @@
+zone "ymse.tg13.gathering.org" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/ymse.tg13.gathering.org.zone";
+ allow-transfer { ns-xfr; };
+};
diff --git a/bind/slave/db.0 b/bind/slave/db.0
new file mode 100644
index 0000000..e3aabdb
--- /dev/null
+++ b/bind/slave/db.0
@@ -0,0 +1,12 @@
+;
+; BIND reverse data file for broadcast zone
+;
+$TTL 604800
+@ IN SOA localhost. root.localhost. (
+ 1 ; Serial
+ 604800 ; Refresh
+ 86400 ; Retry
+ 2419200 ; Expire
+ 604800 ) ; Negative Cache TTL
+;
+@ IN NS localhost.
diff --git a/bind/slave/db.127 b/bind/slave/db.127
new file mode 100644
index 0000000..cd05bef
--- /dev/null
+++ b/bind/slave/db.127
@@ -0,0 +1,13 @@
+;
+; BIND reverse data file for local loopback interface
+;
+$TTL 604800
+@ IN SOA localhost. root.localhost. (
+ 1 ; Serial
+ 604800 ; Refresh
+ 86400 ; Retry
+ 2419200 ; Expire
+ 604800 ) ; Negative Cache TTL
+;
+@ IN NS localhost.
+1.0.0 IN PTR localhost.
diff --git a/bind/slave/db.255 b/bind/slave/db.255
new file mode 100644
index 0000000..e3aabdb
--- /dev/null
+++ b/bind/slave/db.255
@@ -0,0 +1,12 @@
+;
+; BIND reverse data file for broadcast zone
+;
+$TTL 604800
+@ IN SOA localhost. root.localhost. (
+ 1 ; Serial
+ 604800 ; Refresh
+ 86400 ; Retry
+ 2419200 ; Expire
+ 604800 ) ; Negative Cache TTL
+;
+@ IN NS localhost.
diff --git a/bind/slave/db.empty b/bind/slave/db.empty
new file mode 100644
index 0000000..8a12858
--- /dev/null
+++ b/bind/slave/db.empty
@@ -0,0 +1,14 @@
+; BIND reverse data file for empty rfc1918 zone
+;
+; DO NOT EDIT THIS FILE - it is used for multiple zones.
+; Instead, copy it, edit named.conf, and use that copy.
+;
+$TTL 86400
+@ IN SOA localhost. root.localhost. (
+ 1 ; Serial
+ 604800 ; Refresh
+ 86400 ; Retry
+ 2419200 ; Expire
+ 86400 ) ; Negative Cache TTL
+;
+@ IN NS localhost.
diff --git a/bind/slave/db.local b/bind/slave/db.local
new file mode 100644
index 0000000..2f272d4
--- /dev/null
+++ b/bind/slave/db.local
@@ -0,0 +1,14 @@
+;
+; BIND data file for local loopback interface
+;
+$TTL 604800
+@ IN SOA localhost. root.localhost. (
+ 2 ; Serial
+ 604800 ; Refresh
+ 86400 ; Retry
+ 2419200 ; Expire
+ 604800 ) ; Negative Cache TTL
+;
+@ IN NS localhost.
+@ IN A 127.0.0.1
+@ IN AAAA ::1
diff --git a/bind/slave/db.root b/bind/slave/db.root
new file mode 100644
index 0000000..6c19741
--- /dev/null
+++ b/bind/slave/db.root
@@ -0,0 +1,88 @@
+; This file holds the information on root name servers needed to
+; initialize cache of Internet domain name servers
+; (e.g. reference this file in the "cache . <file>"
+; configuration file of BIND domain name servers).
+;
+; This file is made available by InterNIC
+; under anonymous FTP as
+; file /domain/named.cache
+; on server FTP.INTERNIC.NET
+; -OR- RS.INTERNIC.NET
+;
+; last update: Jan 3, 2013
+; related version of root zone: 2013010300
+;
+; formerly NS.INTERNIC.NET
+;
+. 3600000 IN NS A.ROOT-SERVERS.NET.
+A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4
+A.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:BA3E::2:30
+;
+; FORMERLY NS1.ISI.EDU
+;
+. 3600000 NS B.ROOT-SERVERS.NET.
+B.ROOT-SERVERS.NET. 3600000 A 192.228.79.201
+;
+; FORMERLY C.PSI.NET
+;
+. 3600000 NS C.ROOT-SERVERS.NET.
+C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12
+;
+; FORMERLY TERP.UMD.EDU
+;
+. 3600000 NS D.ROOT-SERVERS.NET.
+D.ROOT-SERVERS.NET. 3600000 A 199.7.91.13
+D.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2D::D
+;
+; FORMERLY NS.NASA.GOV
+;
+. 3600000 NS E.ROOT-SERVERS.NET.
+E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10
+;
+; FORMERLY NS.ISC.ORG
+;
+. 3600000 NS F.ROOT-SERVERS.NET.
+F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241
+F.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:2F::F
+;
+; FORMERLY NS.NIC.DDN.MIL
+;
+. 3600000 NS G.ROOT-SERVERS.NET.
+G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4
+;
+; FORMERLY AOS.ARL.ARMY.MIL
+;
+. 3600000 NS H.ROOT-SERVERS.NET.
+H.ROOT-SERVERS.NET. 3600000 A 128.63.2.53
+H.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:1::803F:235
+;
+; FORMERLY NIC.NORDU.NET
+;
+. 3600000 NS I.ROOT-SERVERS.NET.
+I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17
+I.ROOT-SERVERS.NET. 3600000 AAAA 2001:7FE::53
+;
+; OPERATED BY VERISIGN, INC.
+;
+. 3600000 NS J.ROOT-SERVERS.NET.
+J.ROOT-SERVERS.NET. 3600000 A 192.58.128.30
+J.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:C27::2:30
+;
+; OPERATED BY RIPE NCC
+;
+. 3600000 NS K.ROOT-SERVERS.NET.
+K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129
+K.ROOT-SERVERS.NET. 3600000 AAAA 2001:7FD::1
+;
+; OPERATED BY ICANN
+;
+. 3600000 NS L.ROOT-SERVERS.NET.
+L.ROOT-SERVERS.NET. 3600000 A 199.7.83.42
+L.ROOT-SERVERS.NET. 3600000 AAAA 2001:500:3::42
+;
+; OPERATED BY WIDE
+;
+. 3600000 NS M.ROOT-SERVERS.NET.
+M.ROOT-SERVERS.NET. 3600000 A 202.12.27.33
+M.ROOT-SERVERS.NET. 3600000 AAAA 2001:DC3::35
+; End of File
diff --git a/bind/slave/named.conf b/bind/slave/named.conf
new file mode 100644
index 0000000..c960730
--- /dev/null
+++ b/bind/slave/named.conf
@@ -0,0 +1,57 @@
+// This named.conf was generated by make-named.pl at 20130327-1708
+// The current version of make-named.pl should not overwrite this file.
+acl tg-nett { 151.216.0.0/17; 2a02:ed02::/32; 127.0.0.0/8; ::1; 31.169.55.0/24; };
+acl ns-xfr { 194.19.3.20; 151.216.125.2; 2a02:ed02:125::2; 151.216.126.2; 2a02:ed02:126::2; 151.216.124.0/24; };
+acl ripe-xfr { 194.19.3.20; 151.216.125.2; 2a02:ed02:125::2; 151.216.126.2; 2a02:ed02:126::2; 193.0.0.0/22; };
+
+options {
+ directory "/etc/bind";
+ allow-recursion { tg-nett; };
+ allow-query { any; };
+ allow-transfer { ns-xfr; };
+ recursion yes;
+ auth-nxdomain no;
+ listen-on-v6 { any; };
+};
+
+key DHCP_UPDATER {
+ algorithm HMAC-MD5.SIG-ALG.REG.INT;
+ secret <removed>;
+};
+
+masters bootstrap { 151.216.126.2; };
+
+zone "tg13.gathering.org" {
+ type slave;
+ file "slave/tg13.gathering.org";
+ notify no;
+ masters { bootstrap; };
+};
+
+zone "infra.tg13.gathering.org" {
+ type slave;
+ file "slave/infra.tg13.gathering.org";
+ notify no;
+ masters { bootstrap; };
+};
+
+zone "2.0.d.e.2.0.a.2.ip6.arpa" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/2.0.d.e.2.0.a.2.ip6.arpa:";
+ allow-transfer { ns-xfr; ripe-xfr; };
+};
+
+include "named.conf.default-zones";
+include "named.slave-reverse4.conf";
+include "named.slave-include.conf";
+
+# ekstra /24-nett fra Blix
+zone "55.169.31.in-addr.arpa" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/55.169.31.in-addr.arpa";
+ allow-transfer { ns-xfr; ripe-xfr; };
+};
diff --git a/bind/slave/named.conf.default-zones b/bind/slave/named.conf.default-zones
new file mode 100644
index 0000000..355338b
--- /dev/null
+++ b/bind/slave/named.conf.default-zones
@@ -0,0 +1,30 @@
+// prime the server with knowledge of the root servers
+zone "." {
+ type hint;
+ file "/etc/bind/db.root";
+};
+
+// be authoritative for the localhost forward and reverse zones, and for
+// broadcast zones as per RFC 1912
+
+zone "localhost" {
+ type master;
+ file "/etc/bind/db.local";
+};
+
+zone "127.in-addr.arpa" {
+ type master;
+ file "/etc/bind/db.127";
+};
+
+zone "0.in-addr.arpa" {
+ type master;
+ file "/etc/bind/db.0";
+};
+
+zone "255.in-addr.arpa" {
+ type master;
+ file "/etc/bind/db.255";
+};
+
+
diff --git a/bind/slave/named.conf.local b/bind/slave/named.conf.local
new file mode 100644
index 0000000..7a57b10
--- /dev/null
+++ b/bind/slave/named.conf.local
@@ -0,0 +1,8 @@
+//
+// Do any local configuration here
+//
+
+// Consider adding the 1918 zones here, if they are not used in your
+// organization
+//include "/etc/bind/zones.rfc1918";
+
diff --git a/bind/slave/named.conf.options b/bind/slave/named.conf.options
new file mode 100644
index 0000000..af79758
--- /dev/null
+++ b/bind/slave/named.conf.options
@@ -0,0 +1,20 @@
+options {
+ directory "/var/cache/bind";
+
+ // If there is a firewall between you and nameservers you want
+ // to talk to, you may need to fix the firewall to allow multiple
+ // ports to talk. See http://www.kb.cert.org/vuls/id/800113
+
+ // If your ISP provided one or more IP addresses for stable
+ // nameservers, you probably want to use them as forwarders.
+ // Uncomment the following block, and insert the addresses replacing
+ // the all-0's placeholder.
+
+ // forwarders {
+ // 0.0.0.0;
+ // };
+
+ auth-nxdomain no; # conform to RFC1035
+ listen-on-v6 { any; };
+};
+
diff --git a/bind/slave/named.slave-include.conf b/bind/slave/named.slave-include.conf
new file mode 100644
index 0000000..2284b6e
--- /dev/null
+++ b/bind/slave/named.slave-include.conf
@@ -0,0 +1,159 @@
+include "/etc/bind/conf-slave/ap-dist0.conf";
+include "/etc/bind/conf-slave/ap-dist1.conf";
+include "/etc/bind/conf-slave/ap-dist2.conf";
+include "/etc/bind/conf-slave/ap-dist3.conf";
+include "/etc/bind/conf-slave/ap-dist4.conf";
+include "/etc/bind/conf-slave/care.conf";
+include "/etc/bind/conf-slave/chillout.conf";
+include "/etc/bind/conf-slave/creativia.conf";
+include "/etc/bind/conf-slave/crew1.conf";
+include "/etc/bind/conf-slave/crew2.conf";
+include "/etc/bind/conf-slave/crew3.conf";
+include "/etc/bind/conf-slave/crew4.conf";
+include "/etc/bind/conf-slave/crew5.conf";
+include "/etc/bind/conf-slave/crew6.conf";
+include "/etc/bind/conf-slave/defektraid.conf";
+include "/etc/bind/conf-slave/e1-3.conf";
+include "/etc/bind/conf-slave/e1-4.conf";
+include "/etc/bind/conf-slave/e11-1.conf";
+include "/etc/bind/conf-slave/e11-2.conf";
+include "/etc/bind/conf-slave/e11-3.conf";
+include "/etc/bind/conf-slave/e11-4.conf";
+include "/etc/bind/conf-slave/e13-1.conf";
+include "/etc/bind/conf-slave/e13-2.conf";
+include "/etc/bind/conf-slave/e13-3.conf";
+include "/etc/bind/conf-slave/e13-4.conf";
+include "/etc/bind/conf-slave/e15-1.conf";
+include "/etc/bind/conf-slave/e15-2.conf";
+include "/etc/bind/conf-slave/e15-3.conf";
+include "/etc/bind/conf-slave/e15-4.conf";
+include "/etc/bind/conf-slave/e17-1.conf";
+include "/etc/bind/conf-slave/e17-2.conf";
+include "/etc/bind/conf-slave/e17-3.conf";
+include "/etc/bind/conf-slave/e17-4.conf";
+include "/etc/bind/conf-slave/e19-1.conf";
+include "/etc/bind/conf-slave/e19-2.conf";
+include "/etc/bind/conf-slave/e19-3.conf";
+include "/etc/bind/conf-slave/e19-4.conf";
+include "/etc/bind/conf-slave/e21-1.conf";
+include "/etc/bind/conf-slave/e21-2.conf";
+include "/etc/bind/conf-slave/e21-3.conf";
+include "/etc/bind/conf-slave/e21-4.conf";
+include "/etc/bind/conf-slave/e23-1.conf";
+include "/etc/bind/conf-slave/e23-2.conf";
+include "/etc/bind/conf-slave/e23-3.conf";
+include "/etc/bind/conf-slave/e23-4.conf";
+include "/etc/bind/conf-slave/e25-1.conf";
+include "/etc/bind/conf-slave/e25-2.conf";
+include "/etc/bind/conf-slave/e25-3.conf";
+include "/etc/bind/conf-slave/e25-4.conf";
+include "/etc/bind/conf-slave/e27-1.conf";
+include "/etc/bind/conf-slave/e27-2.conf";
+include "/etc/bind/conf-slave/e29-1.conf";
+include "/etc/bind/conf-slave/e29-2.conf";
+include "/etc/bind/conf-slave/e3-3.conf";
+include "/etc/bind/conf-slave/e3-4.conf";
+include "/etc/bind/conf-slave/e31-1.conf";
+include "/etc/bind/conf-slave/e31-2.conf";
+include "/etc/bind/conf-slave/e33-1.conf";
+include "/etc/bind/conf-slave/e33-2.conf";
+include "/etc/bind/conf-slave/e35-1.conf";
+include "/etc/bind/conf-slave/e35-2.conf";
+include "/etc/bind/conf-slave/e37-1.conf";
+include "/etc/bind/conf-slave/e37-2.conf";
+include "/etc/bind/conf-slave/e39-1.conf";
+include "/etc/bind/conf-slave/e39-2.conf";
+include "/etc/bind/conf-slave/e41-1.conf";
+include "/etc/bind/conf-slave/e41-2.conf";
+include "/etc/bind/conf-slave/e43-1.conf";
+include "/etc/bind/conf-slave/e43-2.conf";
+include "/etc/bind/conf-slave/e43-3.conf";
+include "/etc/bind/conf-slave/e43-4.conf";
+include "/etc/bind/conf-slave/e45-1.conf";
+include "/etc/bind/conf-slave/e45-2.conf";
+include "/etc/bind/conf-slave/e45-3.conf";
+include "/etc/bind/conf-slave/e45-4.conf";
+include "/etc/bind/conf-slave/e47-1.conf";
+include "/etc/bind/conf-slave/e47-2.conf";
+include "/etc/bind/conf-slave/e47-3.conf";
+include "/etc/bind/conf-slave/e47-4.conf";
+include "/etc/bind/conf-slave/e49-1.conf";
+include "/etc/bind/conf-slave/e49-2.conf";
+include "/etc/bind/conf-slave/e49-3.conf";
+include "/etc/bind/conf-slave/e49-4.conf";
+include "/etc/bind/conf-slave/e5-3.conf";
+include "/etc/bind/conf-slave/e5-4.conf";
+include "/etc/bind/conf-slave/e51-1.conf";
+include "/etc/bind/conf-slave/e51-2.conf";
+include "/etc/bind/conf-slave/e51-3.conf";
+include "/etc/bind/conf-slave/e51-4.conf";
+include "/etc/bind/conf-slave/e53-1.conf";
+include "/etc/bind/conf-slave/e53-2.conf";
+include "/etc/bind/conf-slave/e53-3.conf";
+include "/etc/bind/conf-slave/e53-4.conf";
+include "/etc/bind/conf-slave/e55-1.conf";
+include "/etc/bind/conf-slave/e55-2.conf";
+include "/etc/bind/conf-slave/e55-3.conf";
+include "/etc/bind/conf-slave/e55-4.conf";
+include "/etc/bind/conf-slave/e57-1.conf";
+include "/etc/bind/conf-slave/e57-2.conf";
+include "/etc/bind/conf-slave/e57-3.conf";
+include "/etc/bind/conf-slave/e57-4.conf";
+include "/etc/bind/conf-slave/e59-1.conf";
+include "/etc/bind/conf-slave/e59-2.conf";
+include "/etc/bind/conf-slave/e59-3.conf";
+include "/etc/bind/conf-slave/e59-4.conf";
+include "/etc/bind/conf-slave/e61-1.conf";
+include "/etc/bind/conf-slave/e61-2.conf";
+include "/etc/bind/conf-slave/e61-3.conf";
+include "/etc/bind/conf-slave/e61-4.conf";
+include "/etc/bind/conf-slave/e63-1.conf";
+include "/etc/bind/conf-slave/e63-2.conf";
+include "/etc/bind/conf-slave/e63-3.conf";
+include "/etc/bind/conf-slave/e63-4.conf";
+include "/etc/bind/conf-slave/e65-1.conf";
+include "/etc/bind/conf-slave/e65-2.conf";
+include "/etc/bind/conf-slave/e65-3.conf";
+include "/etc/bind/conf-slave/e65-4.conf";
+include "/etc/bind/conf-slave/e67-1.conf";
+include "/etc/bind/conf-slave/e67-2.conf";
+include "/etc/bind/conf-slave/e67-3.conf";
+include "/etc/bind/conf-slave/e67-4.conf";
+include "/etc/bind/conf-slave/e69-1.conf";
+include "/etc/bind/conf-slave/e69-2.conf";
+include "/etc/bind/conf-slave/e69-3.conf";
+include "/etc/bind/conf-slave/e69-4.conf";
+include "/etc/bind/conf-slave/e7-3.conf";
+include "/etc/bind/conf-slave/e7-4.conf";
+include "/etc/bind/conf-slave/e71-1.conf";
+include "/etc/bind/conf-slave/e71-2.conf";
+include "/etc/bind/conf-slave/e71-3.conf";
+include "/etc/bind/conf-slave/e71-4.conf";
+include "/etc/bind/conf-slave/e73-1.conf";
+include "/etc/bind/conf-slave/e73-2.conf";
+include "/etc/bind/conf-slave/e73-3.conf";
+include "/etc/bind/conf-slave/e73-4.conf";
+include "/etc/bind/conf-slave/e75-1.conf";
+include "/etc/bind/conf-slave/e75-2.conf";
+include "/etc/bind/conf-slave/e75-3.conf";
+include "/etc/bind/conf-slave/e75-4.conf";
+include "/etc/bind/conf-slave/e77-1.conf";
+include "/etc/bind/conf-slave/e77-2.conf";
+include "/etc/bind/conf-slave/e9-3.conf";
+include "/etc/bind/conf-slave/e9-4.conf";
+include "/etc/bind/conf-slave/fugleberg1.conf";
+include "/etc/bind/conf-slave/fugleberg2.conf";
+include "/etc/bind/conf-slave/game.conf";
+include "/etc/bind/conf-slave/gamehq.conf";
+include "/etc/bind/conf-slave/lager.conf";
+include "/etc/bind/conf-slave/logistikk.conf";
+include "/etc/bind/conf-slave/marsrele.conf";
+include "/etc/bind/conf-slave/noc.conf";
+include "/etc/bind/conf-slave/presse.conf";
+include "/etc/bind/conf-slave/secmedic.conf";
+include "/etc/bind/conf-slave/sponsorvest.conf";
+include "/etc/bind/conf-slave/stage.conf";
+include "/etc/bind/conf-slave/stageboh.conf";
+include "/etc/bind/conf-slave/tele.conf";
+include "/etc/bind/conf-slave/wlan.conf";
+include "/etc/bind/conf-slave/ymse.conf";
diff --git a/bind/slave/named.slave-reverse4.conf b/bind/slave/named.slave-reverse4.conf
new file mode 100644
index 0000000..263b90c
--- /dev/null
+++ b/bind/slave/named.slave-reverse4.conf
@@ -0,0 +1,1024 @@
+zone "0.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/0.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "1.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/1.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "2.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/2.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "3.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/3.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "4.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/4.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "5.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/5.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "6.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/6.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "7.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/7.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "8.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/8.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "9.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/9.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "10.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/10.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "11.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/11.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "12.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/12.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "13.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/13.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "14.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/14.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "15.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/15.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "16.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/16.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "17.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/17.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "18.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/18.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "19.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/19.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "20.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/20.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "21.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/21.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "22.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/22.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "23.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/23.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "24.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/24.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "25.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/25.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "26.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/26.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "27.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/27.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "28.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/28.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "29.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/29.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "30.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/30.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "31.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/31.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "32.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/32.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "33.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/33.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "34.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/34.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "35.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/35.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "36.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/36.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "37.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/37.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "38.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/38.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "39.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/39.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "40.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/40.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "41.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/41.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "42.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/42.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "43.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/43.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "44.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/44.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "45.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/45.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "46.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/46.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "47.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/47.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "48.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/48.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "49.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/49.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "50.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/50.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "51.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/51.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "52.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/52.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "53.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/53.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "54.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/54.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "55.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/55.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "56.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/56.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "57.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/57.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "58.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/58.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "59.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/59.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "60.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/60.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "61.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/61.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "62.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/62.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "63.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/63.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "64.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/64.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "65.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/65.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "66.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/66.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "67.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/67.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "68.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/68.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "69.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/69.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "70.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/70.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "71.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/71.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "72.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/72.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "73.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/73.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "74.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/74.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "75.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/75.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "76.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/76.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "77.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/77.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "78.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/78.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "79.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/79.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "80.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/80.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "81.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/81.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "82.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/82.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "83.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/83.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "84.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/84.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "85.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/85.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "86.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/86.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "87.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/87.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "88.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/88.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "89.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/89.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "90.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/90.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "91.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/91.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "92.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/92.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "93.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/93.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "94.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/94.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "95.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/95.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "96.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/96.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "97.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/97.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "98.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/98.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "99.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/99.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "100.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/100.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "101.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/101.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "102.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/102.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "103.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/103.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "104.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/104.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "105.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/105.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "106.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/106.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "107.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/107.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "108.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/108.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "109.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/109.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "110.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/110.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "111.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/111.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "112.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/112.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "113.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/113.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "114.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/114.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "115.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/115.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "116.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/116.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "117.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/117.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "118.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/118.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "119.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/119.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "120.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/120.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "121.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/121.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "122.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/122.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "123.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/123.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "124.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/124.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "125.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/125.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "126.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/126.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
+zone "127.216.151.in-addr.arpa" {
+ type slave;
+ notify no;
+ file "slave/127.216.151.in-addr.arpa.cache";
+ masters { bootstrap; };
+ allow-transfer { 193.0.0.0/22; };
+};
+
diff --git a/bind/slave/rndc.key b/bind/slave/rndc.key
new file mode 100644
index 0000000..6ad396d
--- /dev/null
+++ b/bind/slave/rndc.key
@@ -0,0 +1,4 @@
+key "rndc-key" {
+ algorithm hmac-md5;
+ secret "<removed>";
+};
diff --git a/bind/slave/zones.rfc1918 b/bind/slave/zones.rfc1918
new file mode 100644
index 0000000..03b5546
--- /dev/null
+++ b/bind/slave/zones.rfc1918
@@ -0,0 +1,20 @@
+zone "10.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+
+zone "16.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "17.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "18.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "19.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "20.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "21.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "22.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "23.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "24.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "25.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "26.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "27.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "28.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "29.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "30.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+zone "31.172.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
+
+zone "168.192.in-addr.arpa" { type master; file "/etc/bind/db.empty"; };
diff --git a/clients/accesspoints.pl b/clients/accesspoints.pl
new file mode 100755
index 0000000..d998252
--- /dev/null
+++ b/clients/accesspoints.pl
@@ -0,0 +1,76 @@
+#! /usr/bin/perl
+use strict;
+use warnings;
+use BER;
+use DBI;
+use POSIX;
+use Time::HiRes;
+use Net::Ping;
+require 'SNMP_Session.pm';
+
+use lib '../include';
+use nms;
+use threads;
+
+poll_loop();
+
+sub poll_loop {
+ my $dbh = nms::db_connect();
+ my $qcores = $dbh->prepare('SELECT DISTINCT coreswitches.sysname, coreswitches.switch, coreswitches.ip, coreswitches.community FROM uplinks JOIN switches AS coreswitches ON (uplinks.coreswitch = coreswitches.switch)');
+ my $qaps = $dbh->prepare("SELECT switches.sysname, switches.switch, uplinks.blade, uplinks.port FROM uplinks NATURAL JOIN switches WHERE uplinks.coreswitch = ?");
+ my $qpoll = $dbh->prepare("UPDATE ap_poll SET model=?, last_poll=now() WHERE switch = ?");
+
+ while (1) {
+ $qcores->execute();
+ my $cores = $qcores->fetchall_hashref("sysname");
+
+ foreach my $core (keys %$cores) {
+ my $ip = $cores->{$core}{'ip'};
+ my $community = $cores->{$core}{'community'};
+ printf "Polling %s (%s)\n", $core, $ip;
+ eval {
+ my $session = SNMPv2c_Session->open($ip, $community, 161) or die "Couldn't talk to switch";
+ $qaps->execute($cores->{$core}{'switch'});
+ while (my $aps = $qaps->fetchrow_hashref()) {
+ my $sysname = $aps->{'sysname'};
+ my $blade = $aps->{'blade'};
+ my $port = $aps->{'port'};
+ my $oid = BER::encode_oid(1,3,6,1,2,1,105,1,1,1,9,$blade,$port); # POWER-ETHERNET-MIB...pethPsePortType
+ my $mode = fetch_snmp($session, $oid);
+ $qpoll->execute($mode, $aps->{'switch'});
+ printf "%s (%s:%s/%s): %s\n", $sysname, $core, $blade, $port, $mode;
+ }
+ };
+ if ($@) {
+ mylog("ERROR: $@ (during poll of $ip)");
+ $dbh->rollback;
+ }
+ }
+ sleep 2;
+ }
+}
+
+# Kokt fra snmpfetch.pl, vi bør nok lage et lib
+sub fetch_snmp {
+ my ($session, $oid) = @_;
+
+ if ($session->get_request_response($oid)) {
+ my ($bindings) = $session->decode_get_response ($session->{pdu_buffer});
+ my $binding;
+ while ($bindings ne '') {
+ ($binding,$bindings) = &decode_sequence ($bindings);
+ my ($oid,$value) = &decode_by_template ($binding, "%O%@");
+ return BER::pretty_print($value);
+ }
+ }
+ die "Couldn't get info from switch";
+}
+
+sub mylog {
+ my $msg = shift;
+ my $time = POSIX::ctime(time);
+ $time =~ s/\n.*$//;
+ printf STDERR "[%s] %s\n", $time, $msg;
+}
+
+
diff --git a/clients/admintool.sh b/clients/admintool.sh
new file mode 100755
index 0000000..889dd19
--- /dev/null
+++ b/clients/admintool.sh
@@ -0,0 +1,19 @@
+while :; do
+ (
+ for i in $( cut -d" " -f1 pingswitches.txt ); do
+ ADMINADDR=$( echo $i | perl -pi -le '@x = split /\./; $x[3] += 2; $_ = join(".", @x);' )
+ ( (
+ if ping -c2 -W3 -q $ADMINADDR >/dev/null; then
+ grep $i pingswitches.txt | sed 's/^/PONGER: /'
+ else
+ grep $i pingswitches.txt | sed 's/^/PONGER IKKE: /'
+ fi
+ ) & )
+ done
+ ) > pong.new
+ while pidof ping > /dev/null; do sleep 1; done
+ mv pong.new pong
+ echo "sleeping"
+ sleep 10
+done
+
diff --git a/clients/dhcptail.pl b/clients/dhcptail.pl
new file mode 100755
index 0000000..e7898aa
--- /dev/null
+++ b/clients/dhcptail.pl
@@ -0,0 +1,74 @@
+#! /usr/bin/perl
+use DBI;
+use POSIX;
+use lib '../include';
+use nms;
+use strict;
+use warnings;
+
+BEGIN {
+ require "../include/config.pm";
+ eval {
+ require "../include/config.local.pm";
+ };
+}
+
+my $year = $nms::config::tgname;
+$year =~ s/tg/20/; # hihi
+
+my %months = (
+ Jan => 1,
+ Feb => 2,
+ Mar => 3,
+ Apr => 4,
+ May => 5,
+ Jun => 6,
+ Jul => 7,
+ Aug => 8,
+ Sep => 9,
+ Oct => 10,
+ Nov => 11,
+ Dec => 12
+);
+
+my ($dbh, $q, $cq);
+open(SYSLOG, "tail -n 9999999 -F /var/log/syslog |") or die "Unable to tail syslog: $!";
+while (<SYSLOG>) {
+ /(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+(\d+)\s+(\d+:\d+:\d+).*DHCPACK on (\d+\.\d+\.\d+\.\d+) to (\S+)/ or next;
+ my $date = $year . "-" . $months{$1} . "-" . $2 . " " . $3;
+ my $machine = $5;
+ my $owner_color;
+
+ if ($machine eq '00:15:c5:42:ce:e9') {
+ $owner_color = '#00ff00'; # Steinar
+ } elsif ($machine eq '00:1e:37:1c:d2:65') {
+ $owner_color = '#c0ffee'; # Trygve
+ } elsif ($machine eq '00:16:d3:ce:8f:a7') {
+ $owner_color = '#f00f00'; # Jon
+ } elsif ($machine eq '00:16:d4:0c:8a:1c') {
+ $owner_color = '#ff99ff'; # Jørgen
+ } elsif ($machine eq '00:18:8b:aa:2f:f8') {
+ $owner_color = '#663300'; # Kjetil
+ } elsif ($machine eq '00:15:58:29:14:e3') {
+ $owner_color = '#f1720f'; # BÃ¥rd
+ } else {
+ $owner_color = "#000000"; # Unknown
+ }
+
+ if (!defined($dbh) || !$dbh->ping) {
+ $dbh = nms::db_connect();
+ $q = $dbh->prepare("UPDATE dhcp SET last_ack=? WHERE ?::inet << network AND ( last_ack < ? OR last_ack IS NULL )")
+ or die "Couldn't prepare query";
+ $cq = $dbh->prepare("UPDATE dhcp SET owner_color=? WHERE ?::inet << network AND owner_color IS NULL")
+ or die "Couldn't prepare query";
+ }
+
+ print STDERR "$date $4\n";
+ $q->execute($date, $4, $date)
+ or die "Couldn't push $1 into database";
+ if (defined($owner_color)) {
+ $cq->execute($owner_color, $4)
+ or die "Couldn't push $1 into database";
+ }
+}
+close SYSLOG;
diff --git a/clients/ipv6-dns.pl b/clients/ipv6-dns.pl
new file mode 100755
index 0000000..d965acc
--- /dev/null
+++ b/clients/ipv6-dns.pl
@@ -0,0 +1,133 @@
+#! /usr/bin/perl
+use DBI;
+use Net::DNS;
+use Net::IP;
+use lib '../include';
+use nms;
+use strict;
+use warnings;
+
+BEGIN {
+ require "../include/config.pm";
+ eval {
+ require "../include/config.local.pm";
+ };
+}
+
+my $dbh = nms::db_connect() or die "Can't connect to database";
+my $res = Net::DNS::Resolver->new;
+
+$res->nameservers("$nms::config::pri_a.$nms::config::tgname.gathering.org");
+
+my $kname = 'DHCP_UPDATER';
+
+sub get_reverse {
+ my ($ip) = shift;
+ $ip = new Net::IP($ip) or return 0;
+ my $a = $res->query($ip->reverse_ip, 'PTR') or return 0;
+ foreach my $n ($a->answer) {
+ return $n->{'ptrdname'}; # Return first element, ignore the rest (=
+ }
+ return 0;
+}
+
+sub any_quad_a {
+ my ($host) = shift;
+ my $a = $res->query($host, 'AAAA') or return 0;
+ foreach my $n ($a->answer) {
+ return 1 if ($n->{'type'} eq 'AAAA');
+ }
+ return 0;
+}
+
+print "Running automagic IPv6 DNS updates\n";
+while (1) {
+
+ # Fetch visible IPv6 addresses from the last three minutes
+ my $q = $dbh->prepare("SELECT DISTINCT ON (ipv6.mac) ipv6.address AS v6, ipv6.mac, ipv4.address AS v4, ipv6.time - ipv6.age*'1 second'::interval FROM ipv6 LEFT JOIN ipv4 ON ipv4.mac = ipv6.mac WHERE ipv6.time > NOW()-'3 min'::interval ORDER BY ipv6.mac, ipv6.time DESC, mac")
+ or die "Can't prepare query";
+ $q->execute() or die "Can't execute query";
+
+ my $aaaas = 0;
+ my $aaaa_errors = 0;
+ my $ptrs = 0;
+ my $ptr_errors = 0;
+ my $update;
+ my $v6;
+ while (my $ref = $q->fetchrow_hashref()) {
+ my $hostname = get_reverse($ref->{'v4'});
+ if ($hostname) {
+ $v6 = $ref->{'v6'};
+ my @parts = split('\.', $hostname);
+ my $hostname = shift @parts;
+ my $domain = join('.', @parts);
+ my $v6arpa = (new Net::IP($v6))->reverse_ip;
+
+ # Don't add records for nets we don't control
+ next if not $v6arpa =~ m/$nms::config::ipv6zone/;
+
+ # Add IPv6 reverse
+ if (!get_reverse($ref->{'v6'})) {
+ $update = Net::DNS::Update->new($nms::config::ipv6zone);
+ $update->push(pre => nxrrset("$v6arpa IN PTR")); # Only update if the RR is nonexistent
+ $update->push(update => rr_add("$v6arpa IN PTR $hostname.$domain."));
+ $update->sign_tsig($kname, $nms::config::ddns_key);
+ my $reply = $res->send($update);
+ if ($reply->header->rcode eq 'NOERROR') {
+ $ptrs++;
+ } else {
+ $ptr_errors++;
+ }
+ }
+
+ # Add IPv6 forward
+ if (!any_quad_a("$hostname.$domain")) {
+ $update = Net::DNS::Update->new($domain);
+ $update->push(pre => nxrrset("$hostname.$domain. IN AAAA $v6")); # Only update if the RR is nonexistent
+ $update->push(update => rr_add("$hostname.$domain. IN AAAA $v6"));
+ $update->sign_tsig($kname, $nms::config::ddns_key);
+ my $reply = $res->send($update);
+ if ($reply->header->rcode eq 'NOERROR') {
+ $aaaas++;
+ } else {
+ $aaaa_errors++;
+ }
+ }
+ }
+ }
+ print "Added $ptrs PTR records. $ptr_errors errors occured.\n";
+ print "Added $aaaas AAAA records. $aaaa_errors errors occured.\n";
+
+
+ # Remove old PTR records, that is, for hosts we haven't seen the last four
+ # hours, but not older than four and a half hours, as it would take forever to
+ # try to delete everything. FIXME: Query the zone file and diff against the
+ # database, to avoid running as many NS-updates as tuples in the result set.
+
+ $q = $dbh->prepare("SELECT DISTINCT address AS v6 FROM ipv6 WHERE time < NOW() - '4 hours'::interval AND time > NOW() - '4 hours 30 minutes'::interval")
+ or die "Can't prepare query";
+ $q->execute() or die "Can't execute query";
+
+ my $i = 0;
+ my $errors = 0;
+ while (my $ref = $q->fetchrow_hashref()) {
+ $v6 = $ref->{'v6'};
+ if (get_reverse($v6)) {
+ my $v6arpa = (new Net::IP($v6))->reverse_ip;
+ my $update = Net::DNS::Update->new($nms::config::ipv6zone);
+ $update->push(pre => yxrrset("$v6arpa PTR")); # Only update if the RR exists
+ $update->push(update => rr_del("$v6arpa IN PTR"));
+ $update->sign_tsig($kname, $nms::config::ddns_key);
+ my $reply = $res->send($update);
+ if ($reply->header->rcode eq 'NOERROR') {
+ $i++;
+ } else {
+ $errors++;
+ }
+ }
+ }
+
+ print "Deleted $i old PTR records. $errors errors occured.\n";
+ print "Sleeping for two minutes.\n";
+ sleep(120);
+}
diff --git a/clients/ipv6-stats.pl b/clients/ipv6-stats.pl
new file mode 100755
index 0000000..59dacbd
--- /dev/null
+++ b/clients/ipv6-stats.pl
@@ -0,0 +1,89 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+use lib '../include';
+use nms qw(switch_connect switch_exec switch_disconnect);
+use Net::Telnet::Cisco;
+
+BEGIN {
+ require "../include/config.pm";
+ eval {
+ require "../include/config.local.pm";
+ };
+}
+
+#
+# Fetch list of MAC addresses and IPv6 addresses
+#
+sub query_router {
+ my ($host) = @_;
+
+ my $ios = Net::Telnet::Cisco->new(
+ Host => $host,
+ Errmode => 'return');
+ if (not defined $ios) {
+ warn "Can't connect to $host: $!, skipping";
+ return ();
+ }
+ if (not $ios->login($nms::config::ios_user, $nms::config::ios_pass)) {
+ warn "Can't login to $host. Wrong username or password?";
+ return ();
+ }
+ $ios->autopage(0);
+ $ios->cmd("terminal length 0");
+ my @v6data = $ios->cmd('show ipv6 neighbors')
+ or warn "$host wouldn't let me run show ipv6 neighbors.";
+ my @v4data = $ios->cmd('show ip arp')
+ or warn "$host wouldn't let me run show ip arp.";
+
+ # Remove useless header and footer
+# shift @v6data;
+ pop @v6data;
+# shift @v4data;
+ pop @v4data;
+
+ return { 'v6' => \@v6data, 'v4' => \@v4data };
+}
+
+while (1) {
+ print "Gathering IPv6 and IPv4 stats\n";
+ # Connect to DB
+ my $dbh = nms::db_connect();
+ $dbh->{AutoCommit} = 0;
+
+ my ($v4, $v6) = 0;
+ foreach my $router (@nms::config::distrobox_ips) {
+ my $data = query_router($router);
+ # IPv6
+ foreach my $line (@{$data->{'v6'}}) {
+ my ($address, $age, $mac, undef, undef) = split('\s+', $line);
+ if ($mac =~ /[a-f0-9]{4}\.[a-f0-9]{4}\.[a-f0-9]{4}/ && # Sanity check MAC address
+ $address !~ /^FE.*/) { # Filter out non-routable addresses
+ my $q = $dbh->prepare('INSERT INTO ipv6 (address, age, mac, time) VALUES (?, ?, ?, timeofday()::timestamp)')
+ or die "Can't prepare query: $!";
+ $q->execute($address, $age, $mac)
+ or die "Can't execute query: $!";
+ $v6++;
+ }
+ }
+ # IPv4
+ foreach my $line (@{$data->{'v4'}}) {
+ my (undef, $address, $age, $mac, undef, undef) = split('\s+', $line);
+ if ($mac =~ /[a-f0-9]{4}\.[a-f0-9]{4}\.[a-f0-9]{4}/) {# Sanity check MAC address
+ $age = 0 if $age eq '-';
+ my $q = $dbh->prepare('INSERT INTO ipv4 (address, age, mac, time) VALUES (?, ?, ?, timeofday()::timestamp)')
+ or die "Can't prepare query: $!";
+ $q->execute($address, $age, $mac)
+ or die "Can't execute query: $!";
+ $v4++;
+ }
+ }
+ }
+ print "Added $v6 IPv6 addresses and $v4 IPv4 addresses.\n";
+ $dbh->commit;
+ $dbh->disconnect;
+
+ print "Sleeping for two minutes.\n";
+ sleep 120; # Sleep for two minutes
+}
diff --git a/clients/portnames.pl b/clients/portnames.pl
new file mode 100755
index 0000000..2b29189
--- /dev/null
+++ b/clients/portnames.pl
@@ -0,0 +1,18 @@
+#! /usr/bin/perl
+
+my ($host,$switchtype,$community) = @ARGV;
+
+open SNMP, "snmpwalk -Os -c $community -v 2c $host ifDescr |"
+ or die "snmpwalk: $!";
+
+print "begin;\n";
+print "delete from portnames where switchtype='$switchtype';\n";
+
+while (<SNMP>) {
+ chomp;
+ /^ifDescr\.(\d+) = STRING: (.*)$/ or next;
+
+ print "insert into portnames (switchtype,port,description) values ('$switchtype',$1,'$2 (port $1)');\n";
+}
+
+print "end;\n";
diff --git a/clients/smanagrun.pl b/clients/smanagrun.pl
new file mode 100755
index 0000000..4d03696
--- /dev/null
+++ b/clients/smanagrun.pl
@@ -0,0 +1,167 @@
+#!/usr/bin/perl
+#
+#
+
+use warnings;
+use strict;
+use Net::Telnet;
+use DBI;
+use POSIX;
+use lib '../include';
+use nms;
+use Data::Dumper::Simple;
+
+BEGIN {
+ require "../include/config.pm";
+ eval {
+ require "../include/config.local.pm";
+ };
+}
+# Tweak and check
+my $password = '';
+my $timeout = 15;
+my $delaytime = 30;
+my $poll_frequency = 60;
+
+my $dbh = db_connect();
+$dbh->{AutoCommit} = 0;
+
+my $spoll = $dbh->prepare("
+SELECT
+ addr,
+ sysname
+FROM
+ squeue
+WHERE
+ processed = 'f' AND
+ disabled = 'f' AND
+ (locked='f' OR now() - updated > '10 minutes'::interval) AND
+ (delay IS NULL OR delay < now())
+ORDER BY
+ priority DESC,
+ added
+LIMIT 1");
+my $sgetallpoll = $dbh->prepare("
+SELECT
+ id,
+ gid,
+ addr,
+ sysname,
+ cmd
+FROM
+ squeue
+WHERE
+ sysname = ? AND
+ disabled = 'f' AND
+ processed = 'f'
+ORDER BY
+ priority DESC,
+ added");
+
+my $slock = $dbh->prepare("UPDATE squeue SET locked = 't', updated=now() WHERE sysname = ?")
+ or die "Unable to prepare slock";
+my $sunlock = $dbh->prepare("UPDATE squeue SET locked = 'f', updated=now() WHERE sysname = ?")
+ or die "Unable to prepare sunlock";
+my $sresult = $dbh->prepare("UPDATE squeue SET updated = now(), result = ?,
+ processed = 't' WHERE id = ?")
+ or die "Unable to prepare sresult";
+my $sdelay = $dbh->prepare("UPDATE squeue SET delay = now() + delaytime, updated=now(), result = ? WHERE sysname = ?")
+ or die "Unable to prepae sdelay";
+
+## Send a command to switch and return the data recvied from the switch
+#sub switch_exec($$) {
+# my ($cmd, $conn) = @_;
+#
+# # Send the command and get data from switch
+# my @data = $conn->cmd($cmd);
+# my @lines = ();
+# foreach my $line (@data) {
+# # Remove escape-7 sequence
+# $line =~ s/\x1b\x37//g;
+# push (@lines, $line);
+# }
+#
+# return @data;
+#}
+#
+#sub switch_connect($) {
+# my ($ip) = @_;
+#
+# my $conn = new Net::Telnet( Timeout => $timeout,
+# Dump_Log => '/tmp/dumplog-queue',
+# Errmode => 'return',
+# Prompt => '/DGS-3100\#/i');
+# my $ret = $conn->open( Host => $ip);
+# if (!$ret || $ret != 1) {
+# return (undef);
+# }
+# # XXX: Just send the password as text, I did not figure out how to
+# # handle authentication with only password through $conn->login().
+# #$conn->login(»·Prompt => '/password[: ]*$/i',
+# # Name => $password,
+# # Password => $password);
+# $conn->cmd($password);
+# # Get rid of banner
+# $conn->get;
+# return ($conn);
+#}
+#
+sub mylog {
+ my $msg = shift;
+ my $time = POSIX::ctime(time);
+ $time =~ s/\n.*$//;
+ printf STDERR "[%s] %s\n", $time, $msg;
+}
+
+while (1) {
+ $spoll->execute() or die "Could not execute spoll";
+ my $switch = $spoll->fetchrow_hashref();
+ if (!defined($switch)) {
+ $dbh->commit;
+ mylog("No available switches in pool, sleeping.");
+ sleep 10;
+ next;
+ }
+ $slock->execute($switch->{sysname});
+ $dbh->commit();
+
+ if ($switch->{'locked'}) {
+ mylog("WARNING: Lock timed out on $switch->{'ip'}, breaking lock");
+ }
+
+ mylog("Connecting to $switch->{sysname} on $switch->{addr}");
+ my $conn = switch_connect($switch->{addr});
+ if (!defined($conn)) {
+ mylog("Could not connect to ".$switch->{sysname}."(".$switch->{addr}.")");
+ $sdelay->execute("Could not connect to switch, delaying...", $switch->{sysname});
+ $sunlock->execute($switch->{sysname});
+ $dbh->commit();
+ next;
+ }
+ my $error;
+ $error = $sgetallpoll->execute($switch->{sysname});
+ if (!$error) {
+ print "Could not execute sgetallpoll\n".$dbh->errstr();
+ $conn->close;
+ next;
+ }
+ while (my $row = $sgetallpoll->fetchrow_hashref()) {
+ print "sysname: ".$row->{sysname}." cmd: ".$row->{cmd}."\n";
+ my @data;
+ my @commands = split(/[\r\n\000]+/, $row->{cmd});
+ for my $cmd (@commands) {
+ next unless $cmd =~ /\S/; # ignorer linjer med kun whitespace
+ push @data, "# $cmd";
+ if ($cmd =~ s/^!//) {
+ push @data, switch_exec($cmd, $conn, 1);
+ } else {
+ push @data, switch_exec($cmd, $conn);
+ }
+ }
+ my $result = join("\n", @data);
+ $sresult->execute($result, $row->{id});
+ }
+ $conn->close();
+ $sunlock->execute($switch->{sysname});
+}
+
diff --git a/clients/snmp.sql b/clients/snmp.sql
new file mode 100644
index 0000000..47b4458
--- /dev/null
+++ b/clients/snmp.sql
@@ -0,0 +1,24 @@
+create table switchtypes (
+ switchtype varchar not null primary key,
+ ports varchar not null
+);
+
+create table switches (
+ switch serial not null primary key,
+ ip inet not null,
+ sysname varchar not null,
+ switchtype varchar not null references switchtypes,
+ last_updated timestamp,
+ locked boolean not null default 'f'
+);
+
+create table poll (
+ time timestamp not null,
+ switch integer not null references switches,
+ port integer not null,
+ bytes_in bigint not null,
+ bytes_out bigint not null,
+
+ primary key ( time, switch, port )
+);
+create index poll_switch_port on poll ( switch, port );
diff --git a/clients/snmpfetch.pl b/clients/snmpfetch.pl
new file mode 100755
index 0000000..487ae11
--- /dev/null
+++ b/clients/snmpfetch.pl
@@ -0,0 +1,281 @@
+#! /usr/bin/perl
+use BER;
+use DBI;
+use POSIX;
+use Time::HiRes;
+use Net::Telnet;
+use strict;
+use warnings;
+require 'SNMP_Session.pm';
+
+use lib '../include';
+use nms;
+use threads;
+
+# normal mode: fetch switches from the database
+# instant mode: poll the switches specified on the command line
+if (defined($ARGV[0])) {
+ poll_loop(@ARGV);
+} else {
+ my $threads = 50;
+ for (1..$threads) {
+ threads->create(\&poll_loop);
+ }
+ poll_loop();
+}
+
+sub poll_loop {
+ my @switches = @_;
+ my $instant = (scalar @switches > 0);
+ my $timeout = 15;
+
+ my $dbh = nms::db_connect();
+ $dbh->{AutoCommit} = 0;
+
+ my $qualification;
+ if ($instant) {
+ $qualification = "sysname=?";
+ } else {
+ $qualification = <<"EOF";
+ (last_updated IS NULL OR now() - last_updated > poll_frequency)
+ AND (locked='f' OR now() - last_updated > '15 minutes'::interval)
+ AND ip is not null
+EOF
+ }
+
+ my $qswitch = $dbh->prepare(<<"EOF")
+SELECT
+ *,
+ DATE_TRUNC('second', now() - last_updated - poll_frequency) AS overdue
+FROM
+ switches
+ NATURAL LEFT JOIN switchtypes
+WHERE $qualification
+ORDER BY
+ priority DESC,
+ overdue DESC
+LIMIT 1
+FOR UPDATE OF switches
+EOF
+ or die "Couldn't prepare qswitch";
+ my $qlock = $dbh->prepare("UPDATE switches SET locked='t', last_updated=now() WHERE switch=?")
+ or die "Couldn't prepare qlock";
+ my $qunlock = $dbh->prepare("UPDATE switches SET locked='f', last_updated=now() WHERE switch=?")
+ or die "Couldn't prepare qunlock";
+ my $qpoll = $dbh->prepare("INSERT INTO polls (time, switch, port, bytes_in, bytes_out, errors_in, errors_out) VALUES (timeofday()::timestamp,?,?,?,?,?,?)")
+ or die "Couldn't prepare qpoll";
+ my $qtemppoll = $dbh->prepare("INSERT INTO temppoll (time, switch, temp) VALUES (timeofday()::timestamp,?::text::int,?::text::float)")
+ or die "Couldn't prepare qtemppoll";
+ my $qcpupoll = $dbh->prepare("INSERT INTO cpuloadpoll (time, switch, entity, value) VALUES (timeofday()::timestamp,?::text::int,?,?)")
+ or die "Couldn't prepare qtemppoll";
+
+ while (1) {
+ my $sysname;
+ if ($instant) {
+ $sysname = shift @ARGV;
+ exit if (!defined($sysname));
+ $qswitch->execute($sysname)
+ or die "Couldn't get switch";
+ } else {
+ # Find a switch to grab
+ $qswitch->execute()
+ or die "Couldn't get switch";
+ }
+ my $switch = $qswitch->fetchrow_hashref();
+
+ if (!defined($switch)) {
+ $dbh->commit;
+
+ if ($instant) {
+ mylog("No such switch $sysname available, quitting.");
+ exit;
+ } else {
+ mylog("No available switches in pool, sleeping.");
+ sleep 15;
+ next;
+ }
+ }
+
+ $qlock->execute($switch->{'switch'})
+ or die "Couldn't lock switch";
+ $dbh->commit;
+
+ if ($switch->{'locked'}) {
+ mylog("WARNING: Lock timed out on $switch->{'ip'}, breaking lock");
+ }
+
+ my $msg;
+ if (defined($switch->{'overdue'})) {
+ $msg = sprintf "Polling ports %s on %s (%s), %s overdue.",
+ $switch->{'ports'}, $switch->{'ip'}, $switch->{'sysname'}, $switch->{'overdue'};
+ } else {
+ $msg = sprintf "Polling ports %s on %s (%s), never polled before.",
+ $switch->{'ports'}, $switch->{'ip'}, $switch->{'sysname'};
+ }
+ mylog($msg);
+
+ my $ip = $switch->{'ip'};
+
+ if ($ip eq '127.0.0.1') {
+ mylog("Polling disabled for this switch, skipping.");
+ $qunlock->execute($switch->{'switch'})
+ or die "Couldn't unlock switch";
+ $dbh->commit;
+ next;
+ }
+
+ my $community = $switch->{'community'};
+ my $start = [Time::HiRes::gettimeofday];
+ eval {
+ my $session;
+ if ($switch->{'wide_counters'}) {
+ $session = SNMPv2c_Session->open($ip, $community, 161)
+ or die "Couldn't talk to switch";
+ } else {
+ $session = SNMP_Session->open($ip, $community, 161)
+ or die "Couldn't talk to switch";
+ }
+ my @ports = expand_ports($switch->{'ports'});
+
+ for my $port (@ports) {
+ my $in = fetch_data($session, $port, 0, $switch->{'wide_counters'});
+ die $switch->{'switch'}.":$port: failed reading in" if !defined $in;
+ my $out = fetch_data($session, $port, 1, $switch->{'wide_counters'});
+ die $switch->{'switch'}.":$port: failed reading out" if !defined $out;
+ my $ine = fetch_errors($session, $port, 0);
+ die $switch->{'switch'}. ":$port: failed reading in-errors" if !defined $ine;
+ my $oute = fetch_errors($session, $port, 1);
+ die $switch->{'switch'}. ":$port: failed reading out-errors" if !defined $oute;
+
+ $qpoll->execute($switch->{'switch'}, $port, $in, $out, $ine, $oute) || die "%s:%s: %s\n", $switch->{'switch'}, $port, $in;
+ }
+ $session->close;
+ };
+ if ($@) {
+ mylog("ERROR: $@ (during poll of $ip)");
+ $dbh->rollback;
+ }
+
+ my $elapsed = Time::HiRes::tv_interval($start);
+ $msg = sprintf "Polled $switch->{'ip'} in %5.3f seconds.", $elapsed;
+ mylog($msg);
+
+ $qunlock->execute($switch->{'switch'})
+ or warn "Couldn't unlock switch";
+ $dbh->commit;
+ }
+}
+
+sub fetch_data {
+ my ($session, $port, $out, $wide_counters) = @_;
+
+ my $oid;
+ if ($wide_counters) {
+ if ($out) {
+ $oid = BER::encode_oid(1, 3, 6, 1, 2, 1, 31, 1, 1, 1, 10, $port); # interfaces.ifTable.ifEntry.ifHCOutOctets
+ } else {
+ $oid = BER::encode_oid(1, 3, 6, 1, 2, 1, 31, 1, 1, 1, 6, $port); # interfaces.ifTable.ifEntry.ifHCInOctets
+ }
+ } else {
+ if ($out) {
+ $oid = BER::encode_oid(1, 3, 6, 1, 2, 1, 2, 2, 1, 16, $port); # interfaces.ifTable.ifEntry.ifOutOctets
+ } else {
+ $oid = BER::encode_oid(1, 3, 6, 1, 2, 1, 2, 2, 1, 10, $port); # interfaces.ifTable.ifEntry.ifInOctets
+ }
+ }
+
+ return fetch_snmp($session, $oid);
+}
+sub fetch_errors {
+ my ($session, $port, $out) = @_;
+
+ my $oid;
+ if ($out) {
+ $oid = BER::encode_oid(1, 3, 6, 1, 2, 1, 2, 2, 1, 20, $port); # interfaces.ifTable.ifEntry.ifOutErrors
+ } else {
+ $oid = BER::encode_oid(1, 3, 6, 1, 2, 1, 2, 2, 1, 14, $port); # interfaces.ifTable.ifEntry.ifInErrors
+ }
+
+ return fetch_snmp($session, $oid);
+}
+
+sub fetch_snmp {
+ my ($session, $oid) = @_;
+
+ if ($session->get_request_response($oid)) {
+ my ($bindings) = $session->decode_get_response ($session->{pdu_buffer});
+ my $binding;
+ while ($bindings ne '') {
+ ($binding,$bindings) = &decode_sequence ($bindings);
+ my ($oid,$value) = &decode_by_template ($binding, "%O%@");
+ return BER::pretty_print($value);
+ }
+ }
+ die "Couldn't get info from switch";
+}
+
+sub expand_ports {
+ my $in = shift;
+ my @ranges = split /,/, $in;
+ my @ret = ();
+
+ for my $range (@ranges) {
+ if ($range =~ /^\d+$/) {
+ push @ret, $range;
+ } elsif ($range =~ /^(\d+)-(\d+)$/) {
+ for my $i ($1..$2) {
+ push @ret, $i;
+ }
+ } else {
+ die "Couldn't understand '$range' in ports";
+ }
+ }
+
+ return (sort { $a <=> $b } @ret);
+}
+
+sub mylog {
+ my $msg = shift;
+ my $time = POSIX::ctime(time);
+ $time =~ s/\n.*$//;
+ printf STDERR "[%s] %s\n", $time, $msg;
+}
+
+#sub switch_exec {
+# my ($cmd, $conn) = @_;
+#
+# # Send the command and get data from switch
+## $conn->dump_log(*STDOUT);
+# my @data = $conn->cmd($cmd);
+# my @lines = ();
+# foreach my $line (@data) {
+# # Remove escape-7 sequence
+# $line =~ s/\x1b\x37//g;
+# push @lines, $line;
+# }
+#
+# return @lines;
+#}
+
+#sub switch_connect {
+# my ($ip) = @_;
+#
+# my $conn = new Net::Telnet( Timeout => $timeout,
+# Dump_Log => '/tmp/dumplog-tempfetch',
+# Errmode => 'return',
+# Prompt => '/es-3024|e(\-)?\d+\-\dsw>/i');
+# my $ret = $conn->open( Host => $ip);
+# if (!$ret || $ret != 1) {
+# return (0);
+# }
+# # XXX: Just send the password as text, I did not figure out how to
+# # handle authentication with only password through $conn->login().
+# #$conn->login( Prompt => '/password[: ]*$/i',
+# # Name => $password,
+# # Password => $password);
+# my @data = $conn->cmd($password);
+# # Get rid of banner
+# $conn->get;
+# return $conn;
+#}
+
diff --git a/clients/update-public-nms.sh b/clients/update-public-nms.sh
new file mode 100755
index 0000000..ed1807c
--- /dev/null
+++ b/clients/update-public-nms.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+DIR=/srv/www/nms-public.tg13.gathering.org
+
+wget -qO$DIR/nettkart-trafikk.png.new http://nms.tg13.gathering.org/nettkart.pl
+wget -qO$DIR/nettkart-dhcp.png.new http://nms.tg13.gathering.org/dhcpkart.pl
+wget -qO$DIR/led.txt.new http://nms.tg13.gathering.org/led.pl
+mv $DIR/nettkart-trafikk.png.new $DIR/nettkart-trafikk.png
+mv $DIR/nettkart-dhcp.png.new $DIR/nettkart-dhcp.png
+mv $DIR/led.txt.new $DIR/led.txt
+
+/usr/bin/perl -i -pe 'use POSIX qw(strftime); my $timestamp = strftime("%a, %d %b %Y %H:%M:%S %z", localtime(time())); s/Sist oppdatert:.*/Sist oppdatert: $timestamp/g;' /srv/www/nms-public.tg13.gathering.org/dhcp.html
+/usr/bin/perl -i -pe 'use POSIX qw(strftime); my $timestamp = strftime("%a, %d %b %Y %H:%M:%S %z", localtime(time())); s/Sist oppdatert:.*/Sist oppdatert: $timestamp/g;' /srv/www/nms-public.tg13.gathering.org/trafikk.html
diff --git a/clients/update-switch-placements.pl b/clients/update-switch-placements.pl
new file mode 100644
index 0000000..d635f87
--- /dev/null
+++ b/clients/update-switch-placements.pl
@@ -0,0 +1,53 @@
+#! /usr/bin/perl
+
+print "begin;\n";
+print "delete from placements;\n";
+
+open PATCHLIST, "../patchlist.txt"
+ or die "../patchlist.txt: $!";
+
+my $RANGE = "87.76.";
+
+my $i = 1;
+while (<PATCHLIST>) {
+ chomp;
+ my ($name, $distro, $port) = split / /;
+
+ $name =~ /e(\d+)-(\d+)/;
+ my ($e, $s) = ($1, $2);
+
+ my $x = int(168 + $e * 11);
+ my $y;
+
+ $x += 1 if ($e >= 11);
+ $x += 2 if ($e >= 15);
+ $x += 2 if ($e >= 15 && $e < 45 && $s > 2);
+ $x += 2 if ($e >= 21);
+ $x += 2 if ($e >= 27 && $e < 45 && $s > 2);
+ $x += 9 if ($e >= 29);
+ $x += 1 if ($e >= 31);
+ $x += 2 if ($e >= 35);
+ $x += 15 if ($e >= 45);
+ $x += 2 if ($e >= 51);
+ $x += 11 if ($e >= 61);
+ $x += 1 if ($e >= 67);
+ $x += 1 if ($e >= 71);
+ $x += 1 if ($e >= 75);
+ $x += 1 if ($e >= 81);
+
+ if ($s > 2) {
+ $y = 152 + 88 - 88 * ($s-3);
+ } else {
+ $y = 357 + 88 - 88 * ($s-1);
+ }
+
+ my $xx = $x + 16;
+ my $yy = $y + 88;
+
+ # Justeringer
+
+ print "insert into placements (switch, placement) values ($i, box '(($x,$y),($xx,$yy))');\n";
+ $i++;
+}
+
+print "end;\n";
diff --git a/dhcp/README b/dhcp/README
new file mode 100644
index 0000000..9675ea0
--- /dev/null
+++ b/dhcp/README
@@ -0,0 +1,7 @@
+P
+
+"Jag får ingen DHCP!" -- http://files.jocke.no/b/ingen-dhcp.jpg
+
+This directory is a copy of our install, please do not use these directly!
+It is provided to show you what the scripts are generating for you…
+
diff --git a/dhcp/ciscowlc.conf b/dhcp/ciscowlc.conf
new file mode 100644
index 0000000..2e06179
--- /dev/null
+++ b/dhcp/ciscowlc.conf
@@ -0,0 +1,9 @@
+option space CiscoAP;
+option CiscoAP.server-address code 241 = array of ip-address;
+set vendor-string = option vendor-class-identifier;
+
+class "cisco-aps" {
+ match if substring (option vendor-class-identifier, 0, 8) = "Cisco AP";
+ vendor-option-space CiscoAP;
+ option CiscoAP.server-address 151.216.125.21,151.216.125.22;
+}
diff --git a/dhcp/conf.d/ap-dist0.conf b/dhcp/conf.d/ap-dist0.conf
new file mode 100644
index 0000000..e370d08
--- /dev/null
+++ b/dhcp/conf.d/ap-dist0.conf
@@ -0,0 +1,14 @@
+zone ap-dist0.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.116.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.116.1;
+ option domain-name "ap-dist0.tg13.gathering.org";
+ ddns-domainname "ap-dist0.tg13.gathering.org";
+ range 151.216.116.5 151.216.116.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/ap-dist1.conf b/dhcp/conf.d/ap-dist1.conf
new file mode 100644
index 0000000..5294af2
--- /dev/null
+++ b/dhcp/conf.d/ap-dist1.conf
@@ -0,0 +1,14 @@
+zone ap-dist1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.116.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.116.65;
+ option domain-name "ap-dist1.tg13.gathering.org";
+ ddns-domainname "ap-dist1.tg13.gathering.org";
+ range 151.216.116.69 151.216.116.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/ap-dist2.conf b/dhcp/conf.d/ap-dist2.conf
new file mode 100644
index 0000000..0a16ca9
--- /dev/null
+++ b/dhcp/conf.d/ap-dist2.conf
@@ -0,0 +1,14 @@
+zone ap-dist2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.116.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.116.129;
+ option domain-name "ap-dist2.tg13.gathering.org";
+ ddns-domainname "ap-dist2.tg13.gathering.org";
+ range 151.216.116.133 151.216.116.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/ap-dist3.conf b/dhcp/conf.d/ap-dist3.conf
new file mode 100644
index 0000000..ec88126
--- /dev/null
+++ b/dhcp/conf.d/ap-dist3.conf
@@ -0,0 +1,14 @@
+zone ap-dist3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.116.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.116.193;
+ option domain-name "ap-dist3.tg13.gathering.org";
+ ddns-domainname "ap-dist3.tg13.gathering.org";
+ range 151.216.116.197 151.216.116.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/ap-dist4.conf b/dhcp/conf.d/ap-dist4.conf
new file mode 100644
index 0000000..8e76846
--- /dev/null
+++ b/dhcp/conf.d/ap-dist4.conf
@@ -0,0 +1,14 @@
+zone ap-dist4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.117.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.117.1;
+ option domain-name "ap-dist4.tg13.gathering.org";
+ ddns-domainname "ap-dist4.tg13.gathering.org";
+ range 151.216.117.5 151.216.117.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/care.conf b/dhcp/conf.d/care.conf
new file mode 100644
index 0000000..8f9ae38
--- /dev/null
+++ b/dhcp/conf.d/care.conf
@@ -0,0 +1,14 @@
+zone care.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.104.0 netmask 255.255.255.0 {
+ authoritative;
+ option routers 151.216.104.1;
+ option domain-name "care.tg13.gathering.org";
+ ddns-domainname "care.tg13.gathering.org";
+ range 151.216.104.5 151.216.104.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/chillout.conf b/dhcp/conf.d/chillout.conf
new file mode 100644
index 0000000..a1c8828
--- /dev/null
+++ b/dhcp/conf.d/chillout.conf
@@ -0,0 +1,18 @@
+zone chillout.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.55.0 netmask 255.255.255.0 {
+ authoritative;
+ option routers 151.216.55.1;
+ option domain-name "chillout.tg13.gathering.org";
+ ddns-domainname "chillout.tg13.gathering.org";
+ range 151.216.55.5 151.216.55.254;
+ ignore client-updates;
+}
+
+host compo { hardware ethernet 52:54:00:f4:fa:3c; fixed-address 151.216.55.54; }
+host tgpc { hardware ethernet 52:54:00:b7:45:98; fixed-address 151.216.55.61; }
+host hack { hardware ethernet 52:54:00:84:ba:b9; fixed-address 151.216.55.56; }
+
diff --git a/dhcp/conf.d/creativia.conf b/dhcp/conf.d/creativia.conf
new file mode 100644
index 0000000..d9d4bf1
--- /dev/null
+++ b/dhcp/conf.d/creativia.conf
@@ -0,0 +1,14 @@
+zone creativia.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.50.0 netmask 255.255.254.0 {
+ authoritative;
+ option routers 151.216.50.1;
+ option domain-name "creativia.tg13.gathering.org";
+ ddns-domainname "creativia.tg13.gathering.org";
+ range 151.216.50.21 151.216.51.253;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/crew1.conf b/dhcp/conf.d/crew1.conf
new file mode 100644
index 0000000..0065c70
--- /dev/null
+++ b/dhcp/conf.d/crew1.conf
@@ -0,0 +1,14 @@
+zone crew1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.46.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.46.1;
+ option domain-name "crew1.tg13.gathering.org";
+ ddns-domainname "crew1.tg13.gathering.org";
+ range 151.216.46.5 151.216.46.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/crew2.conf b/dhcp/conf.d/crew2.conf
new file mode 100644
index 0000000..86687c6
--- /dev/null
+++ b/dhcp/conf.d/crew2.conf
@@ -0,0 +1,14 @@
+zone crew2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.46.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.46.129;
+ option domain-name "crew2.tg13.gathering.org";
+ ddns-domainname "crew2.tg13.gathering.org";
+ range 151.216.46.133 151.216.46.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/crew3.conf b/dhcp/conf.d/crew3.conf
new file mode 100644
index 0000000..94472b5
--- /dev/null
+++ b/dhcp/conf.d/crew3.conf
@@ -0,0 +1,14 @@
+zone crew3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.47.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.47.1;
+ option domain-name "crew3.tg13.gathering.org";
+ ddns-domainname "crew3.tg13.gathering.org";
+ range 151.216.47.5 151.216.47.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/crew4.conf b/dhcp/conf.d/crew4.conf
new file mode 100644
index 0000000..4abbfb1
--- /dev/null
+++ b/dhcp/conf.d/crew4.conf
@@ -0,0 +1,14 @@
+zone crew4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.47.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.47.129;
+ option domain-name "crew4.tg13.gathering.org";
+ ddns-domainname "crew4.tg13.gathering.org";
+ range 151.216.47.133 151.216.47.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/crew5.conf b/dhcp/conf.d/crew5.conf
new file mode 100644
index 0000000..177340d
--- /dev/null
+++ b/dhcp/conf.d/crew5.conf
@@ -0,0 +1,14 @@
+zone crew5.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.48.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.48.1;
+ option domain-name "crew5.tg13.gathering.org";
+ ddns-domainname "crew5.tg13.gathering.org";
+ range 151.216.48.5 151.216.48.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/crew6.conf b/dhcp/conf.d/crew6.conf
new file mode 100644
index 0000000..5857c12
--- /dev/null
+++ b/dhcp/conf.d/crew6.conf
@@ -0,0 +1,14 @@
+zone crew6.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.48.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.48.129;
+ option domain-name "crew6.tg13.gathering.org";
+ ddns-domainname "crew6.tg13.gathering.org";
+ range 151.216.48.133 151.216.48.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/defektraid.conf b/dhcp/conf.d/defektraid.conf
new file mode 100644
index 0000000..6754fdb
--- /dev/null
+++ b/dhcp/conf.d/defektraid.conf
@@ -0,0 +1,14 @@
+zone defektraid.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.56.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.56.1;
+ option domain-name "defektraid.tg13.gathering.org";
+ ddns-domainname "defektraid.tg13.gathering.org";
+ range 151.216.56.5 151.216.56.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e1-3.conf b/dhcp/conf.d/e1-3.conf
new file mode 100644
index 0000000..3b4b1ee
--- /dev/null
+++ b/dhcp/conf.d/e1-3.conf
@@ -0,0 +1,14 @@
+zone e1-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.1.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.1.1;
+ option domain-name "e1-3.tg13.gathering.org";
+ ddns-domainname "e1-3.tg13.gathering.org";
+ range 151.216.1.5 151.216.1.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e1-4.conf b/dhcp/conf.d/e1-4.conf
new file mode 100644
index 0000000..58c2468
--- /dev/null
+++ b/dhcp/conf.d/e1-4.conf
@@ -0,0 +1,14 @@
+zone e1-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.1.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.1.65;
+ option domain-name "e1-4.tg13.gathering.org";
+ ddns-domainname "e1-4.tg13.gathering.org";
+ range 151.216.1.69 151.216.1.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e11-1.conf b/dhcp/conf.d/e11-1.conf
new file mode 100644
index 0000000..101b566
--- /dev/null
+++ b/dhcp/conf.d/e11-1.conf
@@ -0,0 +1,14 @@
+zone e11-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.3.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.3.129;
+ option domain-name "e11-1.tg13.gathering.org";
+ ddns-domainname "e11-1.tg13.gathering.org";
+ range 151.216.3.133 151.216.3.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e11-2.conf b/dhcp/conf.d/e11-2.conf
new file mode 100644
index 0000000..7bfaa16
--- /dev/null
+++ b/dhcp/conf.d/e11-2.conf
@@ -0,0 +1,14 @@
+zone e11-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.3.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.3.193;
+ option domain-name "e11-2.tg13.gathering.org";
+ ddns-domainname "e11-2.tg13.gathering.org";
+ range 151.216.3.197 151.216.3.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e11-3.conf b/dhcp/conf.d/e11-3.conf
new file mode 100644
index 0000000..61f2b31
--- /dev/null
+++ b/dhcp/conf.d/e11-3.conf
@@ -0,0 +1,14 @@
+zone e11-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.4.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.4.1;
+ option domain-name "e11-3.tg13.gathering.org";
+ ddns-domainname "e11-3.tg13.gathering.org";
+ range 151.216.4.5 151.216.4.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e11-4.conf b/dhcp/conf.d/e11-4.conf
new file mode 100644
index 0000000..bb36c33
--- /dev/null
+++ b/dhcp/conf.d/e11-4.conf
@@ -0,0 +1,14 @@
+zone e11-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.4.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.4.65;
+ option domain-name "e11-4.tg13.gathering.org";
+ ddns-domainname "e11-4.tg13.gathering.org";
+ range 151.216.4.69 151.216.4.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e13-1.conf b/dhcp/conf.d/e13-1.conf
new file mode 100644
index 0000000..40e2ed6
--- /dev/null
+++ b/dhcp/conf.d/e13-1.conf
@@ -0,0 +1,14 @@
+zone e13-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.4.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.4.129;
+ option domain-name "e13-1.tg13.gathering.org";
+ ddns-domainname "e13-1.tg13.gathering.org";
+ range 151.216.4.133 151.216.4.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e13-2.conf b/dhcp/conf.d/e13-2.conf
new file mode 100644
index 0000000..efbf536
--- /dev/null
+++ b/dhcp/conf.d/e13-2.conf
@@ -0,0 +1,14 @@
+zone e13-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.4.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.4.193;
+ option domain-name "e13-2.tg13.gathering.org";
+ ddns-domainname "e13-2.tg13.gathering.org";
+ range 151.216.4.197 151.216.4.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e13-3.conf b/dhcp/conf.d/e13-3.conf
new file mode 100644
index 0000000..779d607
--- /dev/null
+++ b/dhcp/conf.d/e13-3.conf
@@ -0,0 +1,14 @@
+zone e13-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.5.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.5.1;
+ option domain-name "e13-3.tg13.gathering.org";
+ ddns-domainname "e13-3.tg13.gathering.org";
+ range 151.216.5.5 151.216.5.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e13-4.conf b/dhcp/conf.d/e13-4.conf
new file mode 100644
index 0000000..432173d
--- /dev/null
+++ b/dhcp/conf.d/e13-4.conf
@@ -0,0 +1,14 @@
+zone e13-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.5.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.5.65;
+ option domain-name "e13-4.tg13.gathering.org";
+ ddns-domainname "e13-4.tg13.gathering.org";
+ range 151.216.5.69 151.216.5.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e15-1.conf b/dhcp/conf.d/e15-1.conf
new file mode 100644
index 0000000..4b377c0
--- /dev/null
+++ b/dhcp/conf.d/e15-1.conf
@@ -0,0 +1,14 @@
+zone e15-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.5.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.5.129;
+ option domain-name "e15-1.tg13.gathering.org";
+ ddns-domainname "e15-1.tg13.gathering.org";
+ range 151.216.5.133 151.216.5.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e15-2.conf b/dhcp/conf.d/e15-2.conf
new file mode 100644
index 0000000..5cfa45f
--- /dev/null
+++ b/dhcp/conf.d/e15-2.conf
@@ -0,0 +1,14 @@
+zone e15-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.5.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.5.193;
+ option domain-name "e15-2.tg13.gathering.org";
+ ddns-domainname "e15-2.tg13.gathering.org";
+ range 151.216.5.197 151.216.5.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e15-3.conf b/dhcp/conf.d/e15-3.conf
new file mode 100644
index 0000000..2463d5d
--- /dev/null
+++ b/dhcp/conf.d/e15-3.conf
@@ -0,0 +1,14 @@
+zone e15-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.6.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.6.1;
+ option domain-name "e15-3.tg13.gathering.org";
+ ddns-domainname "e15-3.tg13.gathering.org";
+ range 151.216.6.5 151.216.6.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e15-4.conf b/dhcp/conf.d/e15-4.conf
new file mode 100644
index 0000000..5a3895b
--- /dev/null
+++ b/dhcp/conf.d/e15-4.conf
@@ -0,0 +1,14 @@
+zone e15-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.6.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.6.65;
+ option domain-name "e15-4.tg13.gathering.org";
+ ddns-domainname "e15-4.tg13.gathering.org";
+ range 151.216.6.69 151.216.6.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e17-1.conf b/dhcp/conf.d/e17-1.conf
new file mode 100644
index 0000000..1ad1721
--- /dev/null
+++ b/dhcp/conf.d/e17-1.conf
@@ -0,0 +1,14 @@
+zone e17-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.6.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.6.129;
+ option domain-name "e17-1.tg13.gathering.org";
+ ddns-domainname "e17-1.tg13.gathering.org";
+ range 151.216.6.133 151.216.6.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e17-2.conf b/dhcp/conf.d/e17-2.conf
new file mode 100644
index 0000000..96e1627
--- /dev/null
+++ b/dhcp/conf.d/e17-2.conf
@@ -0,0 +1,14 @@
+zone e17-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.6.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.6.193;
+ option domain-name "e17-2.tg13.gathering.org";
+ ddns-domainname "e17-2.tg13.gathering.org";
+ range 151.216.6.197 151.216.6.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e17-3.conf b/dhcp/conf.d/e17-3.conf
new file mode 100644
index 0000000..0db96f9
--- /dev/null
+++ b/dhcp/conf.d/e17-3.conf
@@ -0,0 +1,14 @@
+zone e17-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.7.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.7.1;
+ option domain-name "e17-3.tg13.gathering.org";
+ ddns-domainname "e17-3.tg13.gathering.org";
+ range 151.216.7.5 151.216.7.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e17-4.conf b/dhcp/conf.d/e17-4.conf
new file mode 100644
index 0000000..e191771
--- /dev/null
+++ b/dhcp/conf.d/e17-4.conf
@@ -0,0 +1,14 @@
+zone e17-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.7.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.7.65;
+ option domain-name "e17-4.tg13.gathering.org";
+ ddns-domainname "e17-4.tg13.gathering.org";
+ range 151.216.7.69 151.216.7.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e19-1.conf b/dhcp/conf.d/e19-1.conf
new file mode 100644
index 0000000..0940e48
--- /dev/null
+++ b/dhcp/conf.d/e19-1.conf
@@ -0,0 +1,14 @@
+zone e19-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.7.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.7.129;
+ option domain-name "e19-1.tg13.gathering.org";
+ ddns-domainname "e19-1.tg13.gathering.org";
+ range 151.216.7.133 151.216.7.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e19-2.conf b/dhcp/conf.d/e19-2.conf
new file mode 100644
index 0000000..5210c72
--- /dev/null
+++ b/dhcp/conf.d/e19-2.conf
@@ -0,0 +1,14 @@
+zone e19-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.7.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.7.193;
+ option domain-name "e19-2.tg13.gathering.org";
+ ddns-domainname "e19-2.tg13.gathering.org";
+ range 151.216.7.197 151.216.7.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e19-3.conf b/dhcp/conf.d/e19-3.conf
new file mode 100644
index 0000000..462ecd4
--- /dev/null
+++ b/dhcp/conf.d/e19-3.conf
@@ -0,0 +1,14 @@
+zone e19-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.8.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.8.1;
+ option domain-name "e19-3.tg13.gathering.org";
+ ddns-domainname "e19-3.tg13.gathering.org";
+ range 151.216.8.5 151.216.8.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e19-4.conf b/dhcp/conf.d/e19-4.conf
new file mode 100644
index 0000000..f4962c4
--- /dev/null
+++ b/dhcp/conf.d/e19-4.conf
@@ -0,0 +1,14 @@
+zone e19-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.8.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.8.65;
+ option domain-name "e19-4.tg13.gathering.org";
+ ddns-domainname "e19-4.tg13.gathering.org";
+ range 151.216.8.69 151.216.8.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e21-1.conf b/dhcp/conf.d/e21-1.conf
new file mode 100644
index 0000000..1d62d54
--- /dev/null
+++ b/dhcp/conf.d/e21-1.conf
@@ -0,0 +1,14 @@
+zone e21-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.8.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.8.129;
+ option domain-name "e21-1.tg13.gathering.org";
+ ddns-domainname "e21-1.tg13.gathering.org";
+ range 151.216.8.133 151.216.8.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e21-2.conf b/dhcp/conf.d/e21-2.conf
new file mode 100644
index 0000000..60d80d0
--- /dev/null
+++ b/dhcp/conf.d/e21-2.conf
@@ -0,0 +1,14 @@
+zone e21-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.8.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.8.193;
+ option domain-name "e21-2.tg13.gathering.org";
+ ddns-domainname "e21-2.tg13.gathering.org";
+ range 151.216.8.197 151.216.8.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e21-3.conf b/dhcp/conf.d/e21-3.conf
new file mode 100644
index 0000000..2ef40b0
--- /dev/null
+++ b/dhcp/conf.d/e21-3.conf
@@ -0,0 +1,14 @@
+zone e21-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.9.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.9.1;
+ option domain-name "e21-3.tg13.gathering.org";
+ ddns-domainname "e21-3.tg13.gathering.org";
+ range 151.216.9.5 151.216.9.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e21-4.conf b/dhcp/conf.d/e21-4.conf
new file mode 100644
index 0000000..84b41ce
--- /dev/null
+++ b/dhcp/conf.d/e21-4.conf
@@ -0,0 +1,14 @@
+zone e21-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.9.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.9.65;
+ option domain-name "e21-4.tg13.gathering.org";
+ ddns-domainname "e21-4.tg13.gathering.org";
+ range 151.216.9.69 151.216.9.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e23-1.conf b/dhcp/conf.d/e23-1.conf
new file mode 100644
index 0000000..7ce1f65
--- /dev/null
+++ b/dhcp/conf.d/e23-1.conf
@@ -0,0 +1,14 @@
+zone e23-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.9.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.9.129;
+ option domain-name "e23-1.tg13.gathering.org";
+ ddns-domainname "e23-1.tg13.gathering.org";
+ range 151.216.9.133 151.216.9.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e23-2.conf b/dhcp/conf.d/e23-2.conf
new file mode 100644
index 0000000..458282c
--- /dev/null
+++ b/dhcp/conf.d/e23-2.conf
@@ -0,0 +1,14 @@
+zone e23-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.9.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.9.193;
+ option domain-name "e23-2.tg13.gathering.org";
+ ddns-domainname "e23-2.tg13.gathering.org";
+ range 151.216.9.197 151.216.9.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e23-3.conf b/dhcp/conf.d/e23-3.conf
new file mode 100644
index 0000000..8d0bd2e
--- /dev/null
+++ b/dhcp/conf.d/e23-3.conf
@@ -0,0 +1,14 @@
+zone e23-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.10.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.10.1;
+ option domain-name "e23-3.tg13.gathering.org";
+ ddns-domainname "e23-3.tg13.gathering.org";
+ range 151.216.10.5 151.216.10.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e23-4.conf b/dhcp/conf.d/e23-4.conf
new file mode 100644
index 0000000..6f85540
--- /dev/null
+++ b/dhcp/conf.d/e23-4.conf
@@ -0,0 +1,14 @@
+zone e23-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.10.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.10.65;
+ option domain-name "e23-4.tg13.gathering.org";
+ ddns-domainname "e23-4.tg13.gathering.org";
+ range 151.216.10.69 151.216.10.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e25-1.conf b/dhcp/conf.d/e25-1.conf
new file mode 100644
index 0000000..ea2f617
--- /dev/null
+++ b/dhcp/conf.d/e25-1.conf
@@ -0,0 +1,14 @@
+zone e25-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.10.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.10.129;
+ option domain-name "e25-1.tg13.gathering.org";
+ ddns-domainname "e25-1.tg13.gathering.org";
+ range 151.216.10.133 151.216.10.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e25-2.conf b/dhcp/conf.d/e25-2.conf
new file mode 100644
index 0000000..05a8e35
--- /dev/null
+++ b/dhcp/conf.d/e25-2.conf
@@ -0,0 +1,14 @@
+zone e25-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.10.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.10.193;
+ option domain-name "e25-2.tg13.gathering.org";
+ ddns-domainname "e25-2.tg13.gathering.org";
+ range 151.216.10.197 151.216.10.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e25-3.conf b/dhcp/conf.d/e25-3.conf
new file mode 100644
index 0000000..5e134e2
--- /dev/null
+++ b/dhcp/conf.d/e25-3.conf
@@ -0,0 +1,14 @@
+zone e25-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.11.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.11.1;
+ option domain-name "e25-3.tg13.gathering.org";
+ ddns-domainname "e25-3.tg13.gathering.org";
+ range 151.216.11.5 151.216.11.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e25-4.conf b/dhcp/conf.d/e25-4.conf
new file mode 100644
index 0000000..2b7ea20
--- /dev/null
+++ b/dhcp/conf.d/e25-4.conf
@@ -0,0 +1,14 @@
+zone e25-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.11.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.11.65;
+ option domain-name "e25-4.tg13.gathering.org";
+ ddns-domainname "e25-4.tg13.gathering.org";
+ range 151.216.11.69 151.216.11.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e27-1.conf b/dhcp/conf.d/e27-1.conf
new file mode 100644
index 0000000..d08ae0b
--- /dev/null
+++ b/dhcp/conf.d/e27-1.conf
@@ -0,0 +1,14 @@
+zone e27-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.11.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.11.129;
+ option domain-name "e27-1.tg13.gathering.org";
+ ddns-domainname "e27-1.tg13.gathering.org";
+ range 151.216.11.133 151.216.11.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e27-2.conf b/dhcp/conf.d/e27-2.conf
new file mode 100644
index 0000000..71e41bc
--- /dev/null
+++ b/dhcp/conf.d/e27-2.conf
@@ -0,0 +1,14 @@
+zone e27-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.11.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.11.193;
+ option domain-name "e27-2.tg13.gathering.org";
+ ddns-domainname "e27-2.tg13.gathering.org";
+ range 151.216.11.197 151.216.11.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e29-1.conf b/dhcp/conf.d/e29-1.conf
new file mode 100644
index 0000000..19c69aa
--- /dev/null
+++ b/dhcp/conf.d/e29-1.conf
@@ -0,0 +1,14 @@
+zone e29-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.12.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.12.1;
+ option domain-name "e29-1.tg13.gathering.org";
+ ddns-domainname "e29-1.tg13.gathering.org";
+ range 151.216.12.5 151.216.12.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e29-2.conf b/dhcp/conf.d/e29-2.conf
new file mode 100644
index 0000000..838f6d1
--- /dev/null
+++ b/dhcp/conf.d/e29-2.conf
@@ -0,0 +1,14 @@
+zone e29-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.12.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.12.65;
+ option domain-name "e29-2.tg13.gathering.org";
+ ddns-domainname "e29-2.tg13.gathering.org";
+ range 151.216.12.69 151.216.12.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e3-3.conf b/dhcp/conf.d/e3-3.conf
new file mode 100644
index 0000000..68d65f0
--- /dev/null
+++ b/dhcp/conf.d/e3-3.conf
@@ -0,0 +1,14 @@
+zone e3-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.1.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.1.129;
+ option domain-name "e3-3.tg13.gathering.org";
+ ddns-domainname "e3-3.tg13.gathering.org";
+ range 151.216.1.133 151.216.1.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e3-4.conf b/dhcp/conf.d/e3-4.conf
new file mode 100644
index 0000000..cbb0fb5
--- /dev/null
+++ b/dhcp/conf.d/e3-4.conf
@@ -0,0 +1,14 @@
+zone e3-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.1.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.1.193;
+ option domain-name "e3-4.tg13.gathering.org";
+ ddns-domainname "e3-4.tg13.gathering.org";
+ range 151.216.1.197 151.216.1.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e31-1.conf b/dhcp/conf.d/e31-1.conf
new file mode 100644
index 0000000..aa78d55
--- /dev/null
+++ b/dhcp/conf.d/e31-1.conf
@@ -0,0 +1,14 @@
+zone e31-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.12.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.12.129;
+ option domain-name "e31-1.tg13.gathering.org";
+ ddns-domainname "e31-1.tg13.gathering.org";
+ range 151.216.12.133 151.216.12.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e31-2.conf b/dhcp/conf.d/e31-2.conf
new file mode 100644
index 0000000..ee8533e
--- /dev/null
+++ b/dhcp/conf.d/e31-2.conf
@@ -0,0 +1,14 @@
+zone e31-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.12.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.12.193;
+ option domain-name "e31-2.tg13.gathering.org";
+ ddns-domainname "e31-2.tg13.gathering.org";
+ range 151.216.12.197 151.216.12.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e33-1.conf b/dhcp/conf.d/e33-1.conf
new file mode 100644
index 0000000..b0807ee
--- /dev/null
+++ b/dhcp/conf.d/e33-1.conf
@@ -0,0 +1,14 @@
+zone e33-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.13.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.13.1;
+ option domain-name "e33-1.tg13.gathering.org";
+ ddns-domainname "e33-1.tg13.gathering.org";
+ range 151.216.13.5 151.216.13.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e33-2.conf b/dhcp/conf.d/e33-2.conf
new file mode 100644
index 0000000..d3ca1ce
--- /dev/null
+++ b/dhcp/conf.d/e33-2.conf
@@ -0,0 +1,14 @@
+zone e33-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.13.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.13.65;
+ option domain-name "e33-2.tg13.gathering.org";
+ ddns-domainname "e33-2.tg13.gathering.org";
+ range 151.216.13.69 151.216.13.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e35-1.conf b/dhcp/conf.d/e35-1.conf
new file mode 100644
index 0000000..b66a9fe
--- /dev/null
+++ b/dhcp/conf.d/e35-1.conf
@@ -0,0 +1,14 @@
+zone e35-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.13.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.13.129;
+ option domain-name "e35-1.tg13.gathering.org";
+ ddns-domainname "e35-1.tg13.gathering.org";
+ range 151.216.13.133 151.216.13.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e35-2.conf b/dhcp/conf.d/e35-2.conf
new file mode 100644
index 0000000..c890146
--- /dev/null
+++ b/dhcp/conf.d/e35-2.conf
@@ -0,0 +1,14 @@
+zone e35-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.13.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.13.193;
+ option domain-name "e35-2.tg13.gathering.org";
+ ddns-domainname "e35-2.tg13.gathering.org";
+ range 151.216.13.197 151.216.13.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e37-1.conf b/dhcp/conf.d/e37-1.conf
new file mode 100644
index 0000000..b4b19ed
--- /dev/null
+++ b/dhcp/conf.d/e37-1.conf
@@ -0,0 +1,14 @@
+zone e37-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.14.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.14.1;
+ option domain-name "e37-1.tg13.gathering.org";
+ ddns-domainname "e37-1.tg13.gathering.org";
+ range 151.216.14.5 151.216.14.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e37-2.conf b/dhcp/conf.d/e37-2.conf
new file mode 100644
index 0000000..6186b64
--- /dev/null
+++ b/dhcp/conf.d/e37-2.conf
@@ -0,0 +1,14 @@
+zone e37-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.14.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.14.65;
+ option domain-name "e37-2.tg13.gathering.org";
+ ddns-domainname "e37-2.tg13.gathering.org";
+ range 151.216.14.69 151.216.14.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e39-1.conf b/dhcp/conf.d/e39-1.conf
new file mode 100644
index 0000000..64f3f8a
--- /dev/null
+++ b/dhcp/conf.d/e39-1.conf
@@ -0,0 +1,14 @@
+zone e39-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.14.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.14.129;
+ option domain-name "e39-1.tg13.gathering.org";
+ ddns-domainname "e39-1.tg13.gathering.org";
+ range 151.216.14.133 151.216.14.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e39-2.conf b/dhcp/conf.d/e39-2.conf
new file mode 100644
index 0000000..f170fa5
--- /dev/null
+++ b/dhcp/conf.d/e39-2.conf
@@ -0,0 +1,14 @@
+zone e39-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.14.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.14.193;
+ option domain-name "e39-2.tg13.gathering.org";
+ ddns-domainname "e39-2.tg13.gathering.org";
+ range 151.216.14.197 151.216.14.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e41-1.conf b/dhcp/conf.d/e41-1.conf
new file mode 100644
index 0000000..60047a5
--- /dev/null
+++ b/dhcp/conf.d/e41-1.conf
@@ -0,0 +1,14 @@
+zone e41-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.15.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.15.1;
+ option domain-name "e41-1.tg13.gathering.org";
+ ddns-domainname "e41-1.tg13.gathering.org";
+ range 151.216.15.5 151.216.15.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e41-2.conf b/dhcp/conf.d/e41-2.conf
new file mode 100644
index 0000000..8bf803d
--- /dev/null
+++ b/dhcp/conf.d/e41-2.conf
@@ -0,0 +1,14 @@
+zone e41-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.15.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.15.65;
+ option domain-name "e41-2.tg13.gathering.org";
+ ddns-domainname "e41-2.tg13.gathering.org";
+ range 151.216.15.69 151.216.15.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e43-1.conf b/dhcp/conf.d/e43-1.conf
new file mode 100644
index 0000000..0859e67
--- /dev/null
+++ b/dhcp/conf.d/e43-1.conf
@@ -0,0 +1,14 @@
+zone e43-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.15.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.15.129;
+ option domain-name "e43-1.tg13.gathering.org";
+ ddns-domainname "e43-1.tg13.gathering.org";
+ range 151.216.15.133 151.216.15.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e43-2.conf b/dhcp/conf.d/e43-2.conf
new file mode 100644
index 0000000..f5632c4
--- /dev/null
+++ b/dhcp/conf.d/e43-2.conf
@@ -0,0 +1,14 @@
+zone e43-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.15.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.15.193;
+ option domain-name "e43-2.tg13.gathering.org";
+ ddns-domainname "e43-2.tg13.gathering.org";
+ range 151.216.15.197 151.216.15.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e43-3.conf b/dhcp/conf.d/e43-3.conf
new file mode 100644
index 0000000..cbb22b5
--- /dev/null
+++ b/dhcp/conf.d/e43-3.conf
@@ -0,0 +1,14 @@
+zone e43-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.16.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.16.1;
+ option domain-name "e43-3.tg13.gathering.org";
+ ddns-domainname "e43-3.tg13.gathering.org";
+ range 151.216.16.5 151.216.16.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e43-4.conf b/dhcp/conf.d/e43-4.conf
new file mode 100644
index 0000000..3c1bb39
--- /dev/null
+++ b/dhcp/conf.d/e43-4.conf
@@ -0,0 +1,14 @@
+zone e43-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.16.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.16.65;
+ option domain-name "e43-4.tg13.gathering.org";
+ ddns-domainname "e43-4.tg13.gathering.org";
+ range 151.216.16.69 151.216.16.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e45-1.conf b/dhcp/conf.d/e45-1.conf
new file mode 100644
index 0000000..0214ecd
--- /dev/null
+++ b/dhcp/conf.d/e45-1.conf
@@ -0,0 +1,14 @@
+zone e45-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.16.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.16.129;
+ option domain-name "e45-1.tg13.gathering.org";
+ ddns-domainname "e45-1.tg13.gathering.org";
+ range 151.216.16.133 151.216.16.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e45-2.conf b/dhcp/conf.d/e45-2.conf
new file mode 100644
index 0000000..e881d34
--- /dev/null
+++ b/dhcp/conf.d/e45-2.conf
@@ -0,0 +1,14 @@
+zone e45-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.16.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.16.193;
+ option domain-name "e45-2.tg13.gathering.org";
+ ddns-domainname "e45-2.tg13.gathering.org";
+ range 151.216.16.197 151.216.16.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e45-3.conf b/dhcp/conf.d/e45-3.conf
new file mode 100644
index 0000000..e686d74
--- /dev/null
+++ b/dhcp/conf.d/e45-3.conf
@@ -0,0 +1,14 @@
+zone e45-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.17.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.17.1;
+ option domain-name "e45-3.tg13.gathering.org";
+ ddns-domainname "e45-3.tg13.gathering.org";
+ range 151.216.17.5 151.216.17.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e45-4.conf b/dhcp/conf.d/e45-4.conf
new file mode 100644
index 0000000..d3855c3
--- /dev/null
+++ b/dhcp/conf.d/e45-4.conf
@@ -0,0 +1,14 @@
+zone e45-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.17.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.17.65;
+ option domain-name "e45-4.tg13.gathering.org";
+ ddns-domainname "e45-4.tg13.gathering.org";
+ range 151.216.17.69 151.216.17.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e47-1.conf b/dhcp/conf.d/e47-1.conf
new file mode 100644
index 0000000..6786b65
--- /dev/null
+++ b/dhcp/conf.d/e47-1.conf
@@ -0,0 +1,14 @@
+zone e47-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.17.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.17.129;
+ option domain-name "e47-1.tg13.gathering.org";
+ ddns-domainname "e47-1.tg13.gathering.org";
+ range 151.216.17.133 151.216.17.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e47-2.conf b/dhcp/conf.d/e47-2.conf
new file mode 100644
index 0000000..57b3830
--- /dev/null
+++ b/dhcp/conf.d/e47-2.conf
@@ -0,0 +1,14 @@
+zone e47-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.17.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.17.193;
+ option domain-name "e47-2.tg13.gathering.org";
+ ddns-domainname "e47-2.tg13.gathering.org";
+ range 151.216.17.197 151.216.17.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e47-3.conf b/dhcp/conf.d/e47-3.conf
new file mode 100644
index 0000000..acb3f53
--- /dev/null
+++ b/dhcp/conf.d/e47-3.conf
@@ -0,0 +1,14 @@
+zone e47-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.18.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.18.1;
+ option domain-name "e47-3.tg13.gathering.org";
+ ddns-domainname "e47-3.tg13.gathering.org";
+ range 151.216.18.5 151.216.18.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e47-4.conf b/dhcp/conf.d/e47-4.conf
new file mode 100644
index 0000000..5fe0ac3
--- /dev/null
+++ b/dhcp/conf.d/e47-4.conf
@@ -0,0 +1,14 @@
+zone e47-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.18.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.18.65;
+ option domain-name "e47-4.tg13.gathering.org";
+ ddns-domainname "e47-4.tg13.gathering.org";
+ range 151.216.18.69 151.216.18.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e49-1.conf b/dhcp/conf.d/e49-1.conf
new file mode 100644
index 0000000..4471449
--- /dev/null
+++ b/dhcp/conf.d/e49-1.conf
@@ -0,0 +1,14 @@
+zone e49-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.18.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.18.129;
+ option domain-name "e49-1.tg13.gathering.org";
+ ddns-domainname "e49-1.tg13.gathering.org";
+ range 151.216.18.133 151.216.18.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e49-2.conf b/dhcp/conf.d/e49-2.conf
new file mode 100644
index 0000000..138feeb
--- /dev/null
+++ b/dhcp/conf.d/e49-2.conf
@@ -0,0 +1,14 @@
+zone e49-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.18.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.18.193;
+ option domain-name "e49-2.tg13.gathering.org";
+ ddns-domainname "e49-2.tg13.gathering.org";
+ range 151.216.18.197 151.216.18.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e49-3.conf b/dhcp/conf.d/e49-3.conf
new file mode 100644
index 0000000..0856374
--- /dev/null
+++ b/dhcp/conf.d/e49-3.conf
@@ -0,0 +1,14 @@
+zone e49-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.19.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.19.1;
+ option domain-name "e49-3.tg13.gathering.org";
+ ddns-domainname "e49-3.tg13.gathering.org";
+ range 151.216.19.5 151.216.19.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e49-4.conf b/dhcp/conf.d/e49-4.conf
new file mode 100644
index 0000000..d4dfd47
--- /dev/null
+++ b/dhcp/conf.d/e49-4.conf
@@ -0,0 +1,14 @@
+zone e49-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.19.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.19.65;
+ option domain-name "e49-4.tg13.gathering.org";
+ ddns-domainname "e49-4.tg13.gathering.org";
+ range 151.216.19.69 151.216.19.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e5-3.conf b/dhcp/conf.d/e5-3.conf
new file mode 100644
index 0000000..cf6fd80
--- /dev/null
+++ b/dhcp/conf.d/e5-3.conf
@@ -0,0 +1,14 @@
+zone e5-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.2.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.2.1;
+ option domain-name "e5-3.tg13.gathering.org";
+ ddns-domainname "e5-3.tg13.gathering.org";
+ range 151.216.2.5 151.216.2.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e5-4.conf b/dhcp/conf.d/e5-4.conf
new file mode 100644
index 0000000..754d883
--- /dev/null
+++ b/dhcp/conf.d/e5-4.conf
@@ -0,0 +1,14 @@
+zone e5-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.2.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.2.65;
+ option domain-name "e5-4.tg13.gathering.org";
+ ddns-domainname "e5-4.tg13.gathering.org";
+ range 151.216.2.69 151.216.2.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e51-1.conf b/dhcp/conf.d/e51-1.conf
new file mode 100644
index 0000000..b50439d
--- /dev/null
+++ b/dhcp/conf.d/e51-1.conf
@@ -0,0 +1,14 @@
+zone e51-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.19.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.19.129;
+ option domain-name "e51-1.tg13.gathering.org";
+ ddns-domainname "e51-1.tg13.gathering.org";
+ range 151.216.19.133 151.216.19.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e51-2.conf b/dhcp/conf.d/e51-2.conf
new file mode 100644
index 0000000..17bbe65
--- /dev/null
+++ b/dhcp/conf.d/e51-2.conf
@@ -0,0 +1,14 @@
+zone e51-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.19.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.19.193;
+ option domain-name "e51-2.tg13.gathering.org";
+ ddns-domainname "e51-2.tg13.gathering.org";
+ range 151.216.19.197 151.216.19.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e51-3.conf b/dhcp/conf.d/e51-3.conf
new file mode 100644
index 0000000..52cbdd2
--- /dev/null
+++ b/dhcp/conf.d/e51-3.conf
@@ -0,0 +1,14 @@
+zone e51-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.20.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.20.1;
+ option domain-name "e51-3.tg13.gathering.org";
+ ddns-domainname "e51-3.tg13.gathering.org";
+ range 151.216.20.5 151.216.20.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e51-4.conf b/dhcp/conf.d/e51-4.conf
new file mode 100644
index 0000000..b7fb7b3
--- /dev/null
+++ b/dhcp/conf.d/e51-4.conf
@@ -0,0 +1,14 @@
+zone e51-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.20.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.20.65;
+ option domain-name "e51-4.tg13.gathering.org";
+ ddns-domainname "e51-4.tg13.gathering.org";
+ range 151.216.20.69 151.216.20.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e53-1.conf b/dhcp/conf.d/e53-1.conf
new file mode 100644
index 0000000..4abbc9f
--- /dev/null
+++ b/dhcp/conf.d/e53-1.conf
@@ -0,0 +1,14 @@
+zone e53-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.20.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.20.129;
+ option domain-name "e53-1.tg13.gathering.org";
+ ddns-domainname "e53-1.tg13.gathering.org";
+ range 151.216.20.133 151.216.20.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e53-2.conf b/dhcp/conf.d/e53-2.conf
new file mode 100644
index 0000000..9b31e74
--- /dev/null
+++ b/dhcp/conf.d/e53-2.conf
@@ -0,0 +1,14 @@
+zone e53-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.20.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.20.193;
+ option domain-name "e53-2.tg13.gathering.org";
+ ddns-domainname "e53-2.tg13.gathering.org";
+ range 151.216.20.197 151.216.20.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e53-3.conf b/dhcp/conf.d/e53-3.conf
new file mode 100644
index 0000000..9011399
--- /dev/null
+++ b/dhcp/conf.d/e53-3.conf
@@ -0,0 +1,14 @@
+zone e53-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.21.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.21.1;
+ option domain-name "e53-3.tg13.gathering.org";
+ ddns-domainname "e53-3.tg13.gathering.org";
+ range 151.216.21.5 151.216.21.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e53-4.conf b/dhcp/conf.d/e53-4.conf
new file mode 100644
index 0000000..b551888
--- /dev/null
+++ b/dhcp/conf.d/e53-4.conf
@@ -0,0 +1,14 @@
+zone e53-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.21.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.21.65;
+ option domain-name "e53-4.tg13.gathering.org";
+ ddns-domainname "e53-4.tg13.gathering.org";
+ range 151.216.21.69 151.216.21.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e55-1.conf b/dhcp/conf.d/e55-1.conf
new file mode 100644
index 0000000..b6ee46d
--- /dev/null
+++ b/dhcp/conf.d/e55-1.conf
@@ -0,0 +1,14 @@
+zone e55-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.21.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.21.129;
+ option domain-name "e55-1.tg13.gathering.org";
+ ddns-domainname "e55-1.tg13.gathering.org";
+ range 151.216.21.133 151.216.21.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e55-2.conf b/dhcp/conf.d/e55-2.conf
new file mode 100644
index 0000000..bcd889b
--- /dev/null
+++ b/dhcp/conf.d/e55-2.conf
@@ -0,0 +1,14 @@
+zone e55-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.21.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.21.193;
+ option domain-name "e55-2.tg13.gathering.org";
+ ddns-domainname "e55-2.tg13.gathering.org";
+ range 151.216.21.197 151.216.21.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e55-3.conf b/dhcp/conf.d/e55-3.conf
new file mode 100644
index 0000000..148f442
--- /dev/null
+++ b/dhcp/conf.d/e55-3.conf
@@ -0,0 +1,14 @@
+zone e55-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.22.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.22.1;
+ option domain-name "e55-3.tg13.gathering.org";
+ ddns-domainname "e55-3.tg13.gathering.org";
+ range 151.216.22.5 151.216.22.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e55-4.conf b/dhcp/conf.d/e55-4.conf
new file mode 100644
index 0000000..cdbb728
--- /dev/null
+++ b/dhcp/conf.d/e55-4.conf
@@ -0,0 +1,14 @@
+zone e55-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.22.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.22.65;
+ option domain-name "e55-4.tg13.gathering.org";
+ ddns-domainname "e55-4.tg13.gathering.org";
+ range 151.216.22.69 151.216.22.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e57-1.conf b/dhcp/conf.d/e57-1.conf
new file mode 100644
index 0000000..1f0c5cb
--- /dev/null
+++ b/dhcp/conf.d/e57-1.conf
@@ -0,0 +1,14 @@
+zone e57-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.22.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.22.129;
+ option domain-name "e57-1.tg13.gathering.org";
+ ddns-domainname "e57-1.tg13.gathering.org";
+ range 151.216.22.133 151.216.22.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e57-2.conf b/dhcp/conf.d/e57-2.conf
new file mode 100644
index 0000000..a2a73cd
--- /dev/null
+++ b/dhcp/conf.d/e57-2.conf
@@ -0,0 +1,14 @@
+zone e57-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.22.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.22.193;
+ option domain-name "e57-2.tg13.gathering.org";
+ ddns-domainname "e57-2.tg13.gathering.org";
+ range 151.216.22.197 151.216.22.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e57-3.conf b/dhcp/conf.d/e57-3.conf
new file mode 100644
index 0000000..318d60a
--- /dev/null
+++ b/dhcp/conf.d/e57-3.conf
@@ -0,0 +1,14 @@
+zone e57-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.23.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.23.1;
+ option domain-name "e57-3.tg13.gathering.org";
+ ddns-domainname "e57-3.tg13.gathering.org";
+ range 151.216.23.5 151.216.23.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e57-4.conf b/dhcp/conf.d/e57-4.conf
new file mode 100644
index 0000000..3db7c69
--- /dev/null
+++ b/dhcp/conf.d/e57-4.conf
@@ -0,0 +1,14 @@
+zone e57-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.23.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.23.65;
+ option domain-name "e57-4.tg13.gathering.org";
+ ddns-domainname "e57-4.tg13.gathering.org";
+ range 151.216.23.69 151.216.23.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e59-1.conf b/dhcp/conf.d/e59-1.conf
new file mode 100644
index 0000000..8251763
--- /dev/null
+++ b/dhcp/conf.d/e59-1.conf
@@ -0,0 +1,14 @@
+zone e59-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.23.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.23.129;
+ option domain-name "e59-1.tg13.gathering.org";
+ ddns-domainname "e59-1.tg13.gathering.org";
+ range 151.216.23.133 151.216.23.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e59-2.conf b/dhcp/conf.d/e59-2.conf
new file mode 100644
index 0000000..cb78cfe
--- /dev/null
+++ b/dhcp/conf.d/e59-2.conf
@@ -0,0 +1,14 @@
+zone e59-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.23.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.23.193;
+ option domain-name "e59-2.tg13.gathering.org";
+ ddns-domainname "e59-2.tg13.gathering.org";
+ range 151.216.23.197 151.216.23.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e59-3.conf b/dhcp/conf.d/e59-3.conf
new file mode 100644
index 0000000..5f8b18a
--- /dev/null
+++ b/dhcp/conf.d/e59-3.conf
@@ -0,0 +1,14 @@
+zone e59-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.24.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.24.1;
+ option domain-name "e59-3.tg13.gathering.org";
+ ddns-domainname "e59-3.tg13.gathering.org";
+ range 151.216.24.5 151.216.24.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e59-4.conf b/dhcp/conf.d/e59-4.conf
new file mode 100644
index 0000000..0f6303d
--- /dev/null
+++ b/dhcp/conf.d/e59-4.conf
@@ -0,0 +1,14 @@
+zone e59-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.24.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.24.65;
+ option domain-name "e59-4.tg13.gathering.org";
+ ddns-domainname "e59-4.tg13.gathering.org";
+ range 151.216.24.69 151.216.24.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e61-1.conf b/dhcp/conf.d/e61-1.conf
new file mode 100644
index 0000000..93eaf53
--- /dev/null
+++ b/dhcp/conf.d/e61-1.conf
@@ -0,0 +1,14 @@
+zone e61-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.24.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.24.129;
+ option domain-name "e61-1.tg13.gathering.org";
+ ddns-domainname "e61-1.tg13.gathering.org";
+ range 151.216.24.133 151.216.24.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e61-2.conf b/dhcp/conf.d/e61-2.conf
new file mode 100644
index 0000000..56c2bd6
--- /dev/null
+++ b/dhcp/conf.d/e61-2.conf
@@ -0,0 +1,14 @@
+zone e61-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.24.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.24.193;
+ option domain-name "e61-2.tg13.gathering.org";
+ ddns-domainname "e61-2.tg13.gathering.org";
+ range 151.216.24.197 151.216.24.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e61-3.conf b/dhcp/conf.d/e61-3.conf
new file mode 100644
index 0000000..1fe77ac
--- /dev/null
+++ b/dhcp/conf.d/e61-3.conf
@@ -0,0 +1,14 @@
+zone e61-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.25.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.25.1;
+ option domain-name "e61-3.tg13.gathering.org";
+ ddns-domainname "e61-3.tg13.gathering.org";
+ range 151.216.25.5 151.216.25.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e61-4.conf b/dhcp/conf.d/e61-4.conf
new file mode 100644
index 0000000..38767d1
--- /dev/null
+++ b/dhcp/conf.d/e61-4.conf
@@ -0,0 +1,14 @@
+zone e61-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.25.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.25.65;
+ option domain-name "e61-4.tg13.gathering.org";
+ ddns-domainname "e61-4.tg13.gathering.org";
+ range 151.216.25.69 151.216.25.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e63-1.conf b/dhcp/conf.d/e63-1.conf
new file mode 100644
index 0000000..b52c705
--- /dev/null
+++ b/dhcp/conf.d/e63-1.conf
@@ -0,0 +1,14 @@
+zone e63-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.25.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.25.129;
+ option domain-name "e63-1.tg13.gathering.org";
+ ddns-domainname "e63-1.tg13.gathering.org";
+ range 151.216.25.133 151.216.25.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e63-2.conf b/dhcp/conf.d/e63-2.conf
new file mode 100644
index 0000000..07d669f
--- /dev/null
+++ b/dhcp/conf.d/e63-2.conf
@@ -0,0 +1,14 @@
+zone e63-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.25.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.25.193;
+ option domain-name "e63-2.tg13.gathering.org";
+ ddns-domainname "e63-2.tg13.gathering.org";
+ range 151.216.25.197 151.216.25.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e63-3.conf b/dhcp/conf.d/e63-3.conf
new file mode 100644
index 0000000..0f570ab
--- /dev/null
+++ b/dhcp/conf.d/e63-3.conf
@@ -0,0 +1,14 @@
+zone e63-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.26.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.26.1;
+ option domain-name "e63-3.tg13.gathering.org";
+ ddns-domainname "e63-3.tg13.gathering.org";
+ range 151.216.26.5 151.216.26.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e63-4.conf b/dhcp/conf.d/e63-4.conf
new file mode 100644
index 0000000..427908a
--- /dev/null
+++ b/dhcp/conf.d/e63-4.conf
@@ -0,0 +1,14 @@
+zone e63-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.26.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.26.65;
+ option domain-name "e63-4.tg13.gathering.org";
+ ddns-domainname "e63-4.tg13.gathering.org";
+ range 151.216.26.69 151.216.26.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e65-1.conf b/dhcp/conf.d/e65-1.conf
new file mode 100644
index 0000000..ae4e114
--- /dev/null
+++ b/dhcp/conf.d/e65-1.conf
@@ -0,0 +1,14 @@
+zone e65-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.26.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.26.129;
+ option domain-name "e65-1.tg13.gathering.org";
+ ddns-domainname "e65-1.tg13.gathering.org";
+ range 151.216.26.133 151.216.26.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e65-2.conf b/dhcp/conf.d/e65-2.conf
new file mode 100644
index 0000000..d23cfa5
--- /dev/null
+++ b/dhcp/conf.d/e65-2.conf
@@ -0,0 +1,14 @@
+zone e65-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.26.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.26.193;
+ option domain-name "e65-2.tg13.gathering.org";
+ ddns-domainname "e65-2.tg13.gathering.org";
+ range 151.216.26.197 151.216.26.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e65-3.conf b/dhcp/conf.d/e65-3.conf
new file mode 100644
index 0000000..6d2aa36
--- /dev/null
+++ b/dhcp/conf.d/e65-3.conf
@@ -0,0 +1,14 @@
+zone e65-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.27.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.27.1;
+ option domain-name "e65-3.tg13.gathering.org";
+ ddns-domainname "e65-3.tg13.gathering.org";
+ range 151.216.27.5 151.216.27.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e65-4.conf b/dhcp/conf.d/e65-4.conf
new file mode 100644
index 0000000..542be9a
--- /dev/null
+++ b/dhcp/conf.d/e65-4.conf
@@ -0,0 +1,14 @@
+zone e65-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.27.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.27.65;
+ option domain-name "e65-4.tg13.gathering.org";
+ ddns-domainname "e65-4.tg13.gathering.org";
+ range 151.216.27.69 151.216.27.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e67-1.conf b/dhcp/conf.d/e67-1.conf
new file mode 100644
index 0000000..a689665
--- /dev/null
+++ b/dhcp/conf.d/e67-1.conf
@@ -0,0 +1,14 @@
+zone e67-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.27.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.27.129;
+ option domain-name "e67-1.tg13.gathering.org";
+ ddns-domainname "e67-1.tg13.gathering.org";
+ range 151.216.27.133 151.216.27.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e67-2.conf b/dhcp/conf.d/e67-2.conf
new file mode 100644
index 0000000..a34df75
--- /dev/null
+++ b/dhcp/conf.d/e67-2.conf
@@ -0,0 +1,14 @@
+zone e67-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.27.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.27.193;
+ option domain-name "e67-2.tg13.gathering.org";
+ ddns-domainname "e67-2.tg13.gathering.org";
+ range 151.216.27.197 151.216.27.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e67-3.conf b/dhcp/conf.d/e67-3.conf
new file mode 100644
index 0000000..e505ddb
--- /dev/null
+++ b/dhcp/conf.d/e67-3.conf
@@ -0,0 +1,14 @@
+zone e67-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.28.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.28.1;
+ option domain-name "e67-3.tg13.gathering.org";
+ ddns-domainname "e67-3.tg13.gathering.org";
+ range 151.216.28.5 151.216.28.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e67-4.conf b/dhcp/conf.d/e67-4.conf
new file mode 100644
index 0000000..8096ddc
--- /dev/null
+++ b/dhcp/conf.d/e67-4.conf
@@ -0,0 +1,14 @@
+zone e67-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.28.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.28.65;
+ option domain-name "e67-4.tg13.gathering.org";
+ ddns-domainname "e67-4.tg13.gathering.org";
+ range 151.216.28.69 151.216.28.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e69-1.conf b/dhcp/conf.d/e69-1.conf
new file mode 100644
index 0000000..0a10a9f
--- /dev/null
+++ b/dhcp/conf.d/e69-1.conf
@@ -0,0 +1,14 @@
+zone e69-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.28.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.28.129;
+ option domain-name "e69-1.tg13.gathering.org";
+ ddns-domainname "e69-1.tg13.gathering.org";
+ range 151.216.28.133 151.216.28.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e69-2.conf b/dhcp/conf.d/e69-2.conf
new file mode 100644
index 0000000..b4eaf6a
--- /dev/null
+++ b/dhcp/conf.d/e69-2.conf
@@ -0,0 +1,14 @@
+zone e69-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.28.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.28.193;
+ option domain-name "e69-2.tg13.gathering.org";
+ ddns-domainname "e69-2.tg13.gathering.org";
+ range 151.216.28.197 151.216.28.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e69-3.conf b/dhcp/conf.d/e69-3.conf
new file mode 100644
index 0000000..bb0a368
--- /dev/null
+++ b/dhcp/conf.d/e69-3.conf
@@ -0,0 +1,14 @@
+zone e69-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.29.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.29.1;
+ option domain-name "e69-3.tg13.gathering.org";
+ ddns-domainname "e69-3.tg13.gathering.org";
+ range 151.216.29.5 151.216.29.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e69-4.conf b/dhcp/conf.d/e69-4.conf
new file mode 100644
index 0000000..c335f7a
--- /dev/null
+++ b/dhcp/conf.d/e69-4.conf
@@ -0,0 +1,14 @@
+zone e69-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.29.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.29.65;
+ option domain-name "e69-4.tg13.gathering.org";
+ ddns-domainname "e69-4.tg13.gathering.org";
+ range 151.216.29.69 151.216.29.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e7-3.conf b/dhcp/conf.d/e7-3.conf
new file mode 100644
index 0000000..e3c5aa0
--- /dev/null
+++ b/dhcp/conf.d/e7-3.conf
@@ -0,0 +1,14 @@
+zone e7-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.2.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.2.129;
+ option domain-name "e7-3.tg13.gathering.org";
+ ddns-domainname "e7-3.tg13.gathering.org";
+ range 151.216.2.133 151.216.2.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e7-4.conf b/dhcp/conf.d/e7-4.conf
new file mode 100644
index 0000000..80ce037
--- /dev/null
+++ b/dhcp/conf.d/e7-4.conf
@@ -0,0 +1,14 @@
+zone e7-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.2.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.2.193;
+ option domain-name "e7-4.tg13.gathering.org";
+ ddns-domainname "e7-4.tg13.gathering.org";
+ range 151.216.2.197 151.216.2.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e71-1.conf b/dhcp/conf.d/e71-1.conf
new file mode 100644
index 0000000..34478a8
--- /dev/null
+++ b/dhcp/conf.d/e71-1.conf
@@ -0,0 +1,14 @@
+zone e71-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.29.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.29.129;
+ option domain-name "e71-1.tg13.gathering.org";
+ ddns-domainname "e71-1.tg13.gathering.org";
+ range 151.216.29.133 151.216.29.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e71-2.conf b/dhcp/conf.d/e71-2.conf
new file mode 100644
index 0000000..2763460
--- /dev/null
+++ b/dhcp/conf.d/e71-2.conf
@@ -0,0 +1,14 @@
+zone e71-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.29.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.29.193;
+ option domain-name "e71-2.tg13.gathering.org";
+ ddns-domainname "e71-2.tg13.gathering.org";
+ range 151.216.29.197 151.216.29.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e71-3.conf b/dhcp/conf.d/e71-3.conf
new file mode 100644
index 0000000..dcd66d3
--- /dev/null
+++ b/dhcp/conf.d/e71-3.conf
@@ -0,0 +1,14 @@
+zone e71-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.30.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.30.1;
+ option domain-name "e71-3.tg13.gathering.org";
+ ddns-domainname "e71-3.tg13.gathering.org";
+ range 151.216.30.5 151.216.30.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e71-4.conf b/dhcp/conf.d/e71-4.conf
new file mode 100644
index 0000000..8dda936
--- /dev/null
+++ b/dhcp/conf.d/e71-4.conf
@@ -0,0 +1,14 @@
+zone e71-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.30.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.30.65;
+ option domain-name "e71-4.tg13.gathering.org";
+ ddns-domainname "e71-4.tg13.gathering.org";
+ range 151.216.30.69 151.216.30.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e73-1.conf b/dhcp/conf.d/e73-1.conf
new file mode 100644
index 0000000..5675ddc
--- /dev/null
+++ b/dhcp/conf.d/e73-1.conf
@@ -0,0 +1,14 @@
+zone e73-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.30.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.30.129;
+ option domain-name "e73-1.tg13.gathering.org";
+ ddns-domainname "e73-1.tg13.gathering.org";
+ range 151.216.30.133 151.216.30.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e73-2.conf b/dhcp/conf.d/e73-2.conf
new file mode 100644
index 0000000..cb376a9
--- /dev/null
+++ b/dhcp/conf.d/e73-2.conf
@@ -0,0 +1,14 @@
+zone e73-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.30.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.30.193;
+ option domain-name "e73-2.tg13.gathering.org";
+ ddns-domainname "e73-2.tg13.gathering.org";
+ range 151.216.30.197 151.216.30.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e73-3.conf b/dhcp/conf.d/e73-3.conf
new file mode 100644
index 0000000..369fbb3
--- /dev/null
+++ b/dhcp/conf.d/e73-3.conf
@@ -0,0 +1,14 @@
+zone e73-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.31.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.31.1;
+ option domain-name "e73-3.tg13.gathering.org";
+ ddns-domainname "e73-3.tg13.gathering.org";
+ range 151.216.31.5 151.216.31.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e73-4.conf b/dhcp/conf.d/e73-4.conf
new file mode 100644
index 0000000..bc22c1c
--- /dev/null
+++ b/dhcp/conf.d/e73-4.conf
@@ -0,0 +1,14 @@
+zone e73-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.31.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.31.65;
+ option domain-name "e73-4.tg13.gathering.org";
+ ddns-domainname "e73-4.tg13.gathering.org";
+ range 151.216.31.69 151.216.31.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e75-1.conf b/dhcp/conf.d/e75-1.conf
new file mode 100644
index 0000000..d8cf0cd
--- /dev/null
+++ b/dhcp/conf.d/e75-1.conf
@@ -0,0 +1,14 @@
+zone e75-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.31.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.31.129;
+ option domain-name "e75-1.tg13.gathering.org";
+ ddns-domainname "e75-1.tg13.gathering.org";
+ range 151.216.31.133 151.216.31.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e75-2.conf b/dhcp/conf.d/e75-2.conf
new file mode 100644
index 0000000..be6c23d
--- /dev/null
+++ b/dhcp/conf.d/e75-2.conf
@@ -0,0 +1,14 @@
+zone e75-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.31.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.31.193;
+ option domain-name "e75-2.tg13.gathering.org";
+ ddns-domainname "e75-2.tg13.gathering.org";
+ range 151.216.31.197 151.216.31.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e75-3.conf b/dhcp/conf.d/e75-3.conf
new file mode 100644
index 0000000..e5e859e
--- /dev/null
+++ b/dhcp/conf.d/e75-3.conf
@@ -0,0 +1,14 @@
+zone e75-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.32.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.32.1;
+ option domain-name "e75-3.tg13.gathering.org";
+ ddns-domainname "e75-3.tg13.gathering.org";
+ range 151.216.32.5 151.216.32.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e75-4.conf b/dhcp/conf.d/e75-4.conf
new file mode 100644
index 0000000..6d1811f
--- /dev/null
+++ b/dhcp/conf.d/e75-4.conf
@@ -0,0 +1,14 @@
+zone e75-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.32.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.32.65;
+ option domain-name "e75-4.tg13.gathering.org";
+ ddns-domainname "e75-4.tg13.gathering.org";
+ range 151.216.32.69 151.216.32.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e77-1.conf b/dhcp/conf.d/e77-1.conf
new file mode 100644
index 0000000..0d99446
--- /dev/null
+++ b/dhcp/conf.d/e77-1.conf
@@ -0,0 +1,14 @@
+zone e77-1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.32.128 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.32.129;
+ option domain-name "e77-1.tg13.gathering.org";
+ ddns-domainname "e77-1.tg13.gathering.org";
+ range 151.216.32.133 151.216.32.190;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e77-2.conf b/dhcp/conf.d/e77-2.conf
new file mode 100644
index 0000000..b989747
--- /dev/null
+++ b/dhcp/conf.d/e77-2.conf
@@ -0,0 +1,14 @@
+zone e77-2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.32.192 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.32.193;
+ option domain-name "e77-2.tg13.gathering.org";
+ ddns-domainname "e77-2.tg13.gathering.org";
+ range 151.216.32.197 151.216.32.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e9-3.conf b/dhcp/conf.d/e9-3.conf
new file mode 100644
index 0000000..fd1f08e
--- /dev/null
+++ b/dhcp/conf.d/e9-3.conf
@@ -0,0 +1,14 @@
+zone e9-3.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.3.0 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.3.1;
+ option domain-name "e9-3.tg13.gathering.org";
+ ddns-domainname "e9-3.tg13.gathering.org";
+ range 151.216.3.5 151.216.3.62;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/e9-4.conf b/dhcp/conf.d/e9-4.conf
new file mode 100644
index 0000000..ae6638b
--- /dev/null
+++ b/dhcp/conf.d/e9-4.conf
@@ -0,0 +1,14 @@
+zone e9-4.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.3.64 netmask 255.255.255.192 {
+ authoritative;
+ option routers 151.216.3.65;
+ option domain-name "e9-4.tg13.gathering.org";
+ ddns-domainname "e9-4.tg13.gathering.org";
+ range 151.216.3.69 151.216.3.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/fugleberg1.conf b/dhcp/conf.d/fugleberg1.conf
new file mode 100644
index 0000000..c3e6488
--- /dev/null
+++ b/dhcp/conf.d/fugleberg1.conf
@@ -0,0 +1,14 @@
+zone fugleberg1.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.99.0 netmask 255.255.255.128 {
+ authoritative;
+ option routers 151.216.99.1;
+ option domain-name "fugleberg1.tg13.gathering.org";
+ ddns-domainname "fugleberg1.tg13.gathering.org";
+ range 151.216.99.5 151.216.99.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/fugleberg2.conf b/dhcp/conf.d/fugleberg2.conf
new file mode 100644
index 0000000..1a223ab
--- /dev/null
+++ b/dhcp/conf.d/fugleberg2.conf
@@ -0,0 +1,15 @@
+zone fugleberg2.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.99.128 netmask 255.255.255.128 {
+ authoritative;
+ option routers 151.216.99.129;
+ option domain-name "fugleberg2.tg13.gathering.org";
+ ddns-domainname "fugleberg2.tg13.gathering.org";
+ range 151.216.99.133 151.216.99.254;
+ ignore client-updates;
+}
+
+host fuglecam { hardware ethernet 90:2b:34:5c:49:d4; fixed-address 151.216.99.254; }
diff --git a/dhcp/conf.d/game.conf b/dhcp/conf.d/game.conf
new file mode 100644
index 0000000..23fbf84
--- /dev/null
+++ b/dhcp/conf.d/game.conf
@@ -0,0 +1,14 @@
+zone game.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.101.0 netmask 255.255.255.0 {
+ authoritative;
+ option routers 151.216.101.1;
+ option domain-name "game.tg13.gathering.org";
+ ddns-domainname "game.tg13.gathering.org";
+ range 151.216.101.5 151.216.101.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/gamehq.conf b/dhcp/conf.d/gamehq.conf
new file mode 100644
index 0000000..a4ab629
--- /dev/null
+++ b/dhcp/conf.d/gamehq.conf
@@ -0,0 +1,14 @@
+zone gamehq.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.54.0 netmask 255.255.255.0 {
+ authoritative;
+ option routers 151.216.54.1;
+ option domain-name "gamehq.tg13.gathering.org";
+ ddns-domainname "gamehq.tg13.gathering.org";
+ range 151.216.54.5 151.216.54.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/lager.conf b/dhcp/conf.d/lager.conf
new file mode 100644
index 0000000..094e1d4
--- /dev/null
+++ b/dhcp/conf.d/lager.conf
@@ -0,0 +1,14 @@
+zone lager.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.113.0 netmask 255.255.255.0 {
+ authoritative;
+ option routers 151.216.113.1;
+ option domain-name "lager.tg13.gathering.org";
+ ddns-domainname "lager.tg13.gathering.org";
+ range 151.216.113.5 151.216.113.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/logistikk.conf b/dhcp/conf.d/logistikk.conf
new file mode 100644
index 0000000..1c9eeae
--- /dev/null
+++ b/dhcp/conf.d/logistikk.conf
@@ -0,0 +1,14 @@
+zone logistikk.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.96.0 netmask 255.255.255.0 {
+ authoritative;
+ option routers 151.216.96.1;
+ option domain-name "logistikk.tg13.gathering.org";
+ ddns-domainname "logistikk.tg13.gathering.org";
+ range 151.216.96.5 151.216.96.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/marsrele.conf b/dhcp/conf.d/marsrele.conf
new file mode 100644
index 0000000..23b502c
--- /dev/null
+++ b/dhcp/conf.d/marsrele.conf
@@ -0,0 +1,14 @@
+zone marsrele.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.118.0 netmask 255.255.255.128 {
+ authoritative;
+ option routers 151.216.118.1;
+ option domain-name "marsrele.tg13.gathering.org";
+ ddns-domainname "marsrele.tg13.gathering.org";
+ range 151.216.118.5 151.216.118.126;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/noc.conf b/dhcp/conf.d/noc.conf
new file mode 100644
index 0000000..1694bf0
--- /dev/null
+++ b/dhcp/conf.d/noc.conf
@@ -0,0 +1,34 @@
+zone noc.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.124.0 netmask 255.255.255.0 {
+ authoritative;
+ option routers 151.216.124.1;
+ option domain-name "noc.tg13.gathering.org";
+ option domain-search "tg13.gathering.org", "infra.tg13.gathering.org", "noc.tg13.gathering.org";
+ ddns-domainname "noc.tg13.gathering.org";
+
+ # Steam/Origin testing
+ # VIKTIG med deny før allow :-))
+ pool {
+ allow members of "steam-clients";
+ range 151.216.124.5 151.216.124.15;
+ }
+ pool {
+ deny members of "steam-clients";
+ range 151.216.124.16 151.216.124.254;
+ }
+
+ # dette fungerer ikke :-))
+ #steam-clients
+ #if (substring (option host-name, 0, 4) = "ior-") {
+ # range 151.216.124.5 151.216.124.15;
+ #} else {
+ # range 151.216.124.16 151.216.124.254;
+ #}
+ ignore client-updates;
+}
+
+host widecam.noc { hardware ethernet 00:02:d1:15:64:80; fixed-address 151.216.124.79; }
diff --git a/dhcp/conf.d/presse.conf b/dhcp/conf.d/presse.conf
new file mode 100644
index 0000000..8cdad57
--- /dev/null
+++ b/dhcp/conf.d/presse.conf
@@ -0,0 +1,14 @@
+zone presse.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.98.0 netmask 255.255.255.0 {
+ authoritative;
+ option routers 151.216.98.1;
+ option domain-name "presse.tg13.gathering.org";
+ ddns-domainname "presse.tg13.gathering.org";
+ range 151.216.98.5 151.216.98.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/secmedic.conf b/dhcp/conf.d/secmedic.conf
new file mode 100644
index 0000000..0976053
--- /dev/null
+++ b/dhcp/conf.d/secmedic.conf
@@ -0,0 +1,14 @@
+zone secmedic.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.112.0 netmask 255.255.255.0 {
+ authoritative;
+ option routers 151.216.112.1;
+ option domain-name "secmedic.tg13.gathering.org";
+ ddns-domainname "secmedic.tg13.gathering.org";
+ range 151.216.112.5 151.216.112.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/sponsorvest.conf b/dhcp/conf.d/sponsorvest.conf
new file mode 100644
index 0000000..65362d1
--- /dev/null
+++ b/dhcp/conf.d/sponsorvest.conf
@@ -0,0 +1,16 @@
+zone sponsorvest.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.105.0 netmask 255.255.255.0 {
+ authoritative;
+ option routers 151.216.105.1;
+ option domain-name "sponsorvest.tg13.gathering.org";
+ ddns-domainname "sponsorvest.tg13.gathering.org";
+ range 151.216.105.5 151.216.105.254;
+ ignore client-updates;
+}
+
+host hacklol { hardware ethernet 00:24:7e:dd:e3:4c; fixed-address 151.216.105.9; }
+
diff --git a/dhcp/conf.d/stage.conf b/dhcp/conf.d/stage.conf
new file mode 100644
index 0000000..bdfd3bc
--- /dev/null
+++ b/dhcp/conf.d/stage.conf
@@ -0,0 +1,16 @@
+zone stage.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.114.0 netmask 255.255.255.0 {
+ authoritative;
+ option routers 151.216.114.1;
+ option domain-name "stage.tg13.gathering.org";
+ ddns-domainname "stage.tg13.gathering.org";
+ range 151.216.114.5 151.216.114.254;
+ ignore client-updates;
+}
+
+host timer.stage { hardware ethernet 00:0c:29:6c:dd:ab; fixed-address 151.216.114.250; }
+host politietno.stage { hardware ethernet 00:25:90:c1:bd:21; fixed-address 151.216.114.254; }
diff --git a/dhcp/conf.d/stageboh.conf b/dhcp/conf.d/stageboh.conf
new file mode 100644
index 0000000..62cc404
--- /dev/null
+++ b/dhcp/conf.d/stageboh.conf
@@ -0,0 +1,15 @@
+zone stageboh.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.107.0 netmask 255.255.255.0 {
+ authoritative;
+ option routers 151.216.107.1;
+ option domain-name "stageboh.tg13.gathering.org";
+ ddns-domainname "stageboh.tg13.gathering.org";
+ range 151.216.107.5 151.216.107.254;
+ ignore client-updates;
+}
+
+host linux.stageboh { hardware ethernet f4:ce:46:7f:9c:7a; fixed-address 151.216.107.14; }
diff --git a/dhcp/conf.d/tele.conf b/dhcp/conf.d/tele.conf
new file mode 100644
index 0000000..b5b2dd6
--- /dev/null
+++ b/dhcp/conf.d/tele.conf
@@ -0,0 +1,14 @@
+zone tele.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.126.0 netmask 255.255.255.0 {
+ authoritative;
+ option routers 151.216.126.1;
+ option domain-name "tele.tg13.gathering.org";
+ ddns-domainname "tele.tg13.gathering.org";
+ range 151.216.126.5 151.216.126.254;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/wlan.conf b/dhcp/conf.d/wlan.conf
new file mode 100644
index 0000000..c3d779d
--- /dev/null
+++ b/dhcp/conf.d/wlan.conf
@@ -0,0 +1,14 @@
+zone wlan.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.64.0 netmask 255.255.224.0 {
+ authoritative;
+ option routers 151.216.64.1;
+ option domain-name "wlan.tg13.gathering.org";
+ ddns-domainname "wlan.tg13.gathering.org";
+ range 151.216.64.5 151.216.95.253;
+ ignore client-updates;
+}
+
diff --git a/dhcp/conf.d/ymse.conf b/dhcp/conf.d/ymse.conf
new file mode 100644
index 0000000..06854df
--- /dev/null
+++ b/dhcp/conf.d/ymse.conf
@@ -0,0 +1,15 @@
+zone ymse.tg13.gathering.org {
+ primary 127.0.0.1;
+ key DHCP_UPDATER;
+}
+
+subnet 151.216.115.0 netmask 255.255.255.0 {
+ authoritative;
+ option routers 151.216.115.1;
+ option domain-name "ymse.tg13.gathering.org";
+ ddns-domainname "ymse.tg13.gathering.org";
+ range 151.216.115.5 151.216.115.254;
+ ignore client-updates;
+}
+
+host recording02.stageboh { hardware ethernet 80:ee:73:33:8e:e4; fixed-address 151.216.115.254; }
diff --git a/dhcp/dhcpd.conf b/dhcp/dhcpd.conf
new file mode 100644
index 0000000..a907a0d
--- /dev/null
+++ b/dhcp/dhcpd.conf
@@ -0,0 +1,30 @@
+# GENERATED BY make-dhcpd.pl
+#
+# Central concept: as little config in the main .conf,
+# include almost everything from separate files..
+#
+# log-facility local7;
+option domain-name "tg13.gathering.org";
+option domain-name-servers 151.216.126.2, 151.216.125.2;
+default-lease-time 3600;
+max-lease-time 7200;
+authoritative;
+
+ddns-update-style interim;
+key DHCP_UPDATER {
+ algorithm HMAC-MD5.SIG-ALG.REG.INT;
+ secret <removed>;
+}
+
+subnet 151.216.126.0 netmask 255.255.255.0 {}
+
+class "steam-clients" {
+ match if ((substring(option host-name, 0, 4) = "ior-"));
+}
+
+include "/etc/dhcp/revzones.conf";
+include "/etc/dhcp/generated-include.conf";
+include "/etc/dhcp/pxe-boot.conf";
+include "/etc/dhcp/ciscowlc.conf";
+
+
diff --git a/dhcp/generated-include.conf b/dhcp/generated-include.conf
new file mode 100644
index 0000000..a334283
--- /dev/null
+++ b/dhcp/generated-include.conf
@@ -0,0 +1,159 @@
+include "/etc/dhcp/conf.d/ap-dist0.conf";
+include "/etc/dhcp/conf.d/ap-dist1.conf";
+include "/etc/dhcp/conf.d/ap-dist2.conf";
+include "/etc/dhcp/conf.d/ap-dist3.conf";
+include "/etc/dhcp/conf.d/ap-dist4.conf";
+include "/etc/dhcp/conf.d/care.conf";
+include "/etc/dhcp/conf.d/chillout.conf";
+include "/etc/dhcp/conf.d/creativia.conf";
+include "/etc/dhcp/conf.d/crew1.conf";
+include "/etc/dhcp/conf.d/crew2.conf";
+include "/etc/dhcp/conf.d/crew3.conf";
+include "/etc/dhcp/conf.d/crew4.conf";
+include "/etc/dhcp/conf.d/crew5.conf";
+include "/etc/dhcp/conf.d/crew6.conf";
+include "/etc/dhcp/conf.d/defektraid.conf";
+include "/etc/dhcp/conf.d/e1-3.conf";
+include "/etc/dhcp/conf.d/e1-4.conf";
+include "/etc/dhcp/conf.d/e11-1.conf";
+include "/etc/dhcp/conf.d/e11-2.conf";
+include "/etc/dhcp/conf.d/e11-3.conf";
+include "/etc/dhcp/conf.d/e11-4.conf";
+include "/etc/dhcp/conf.d/e13-1.conf";
+include "/etc/dhcp/conf.d/e13-2.conf";
+include "/etc/dhcp/conf.d/e13-3.conf";
+include "/etc/dhcp/conf.d/e13-4.conf";
+include "/etc/dhcp/conf.d/e15-1.conf";
+include "/etc/dhcp/conf.d/e15-2.conf";
+include "/etc/dhcp/conf.d/e15-3.conf";
+include "/etc/dhcp/conf.d/e15-4.conf";
+include "/etc/dhcp/conf.d/e17-1.conf";
+include "/etc/dhcp/conf.d/e17-2.conf";
+include "/etc/dhcp/conf.d/e17-3.conf";
+include "/etc/dhcp/conf.d/e17-4.conf";
+include "/etc/dhcp/conf.d/e19-1.conf";
+include "/etc/dhcp/conf.d/e19-2.conf";
+include "/etc/dhcp/conf.d/e19-3.conf";
+include "/etc/dhcp/conf.d/e19-4.conf";
+include "/etc/dhcp/conf.d/e21-1.conf";
+include "/etc/dhcp/conf.d/e21-2.conf";
+include "/etc/dhcp/conf.d/e21-3.conf";
+include "/etc/dhcp/conf.d/e21-4.conf";
+include "/etc/dhcp/conf.d/e23-1.conf";
+include "/etc/dhcp/conf.d/e23-2.conf";
+include "/etc/dhcp/conf.d/e23-3.conf";
+include "/etc/dhcp/conf.d/e23-4.conf";
+include "/etc/dhcp/conf.d/e25-1.conf";
+include "/etc/dhcp/conf.d/e25-2.conf";
+include "/etc/dhcp/conf.d/e25-3.conf";
+include "/etc/dhcp/conf.d/e25-4.conf";
+include "/etc/dhcp/conf.d/e27-1.conf";
+include "/etc/dhcp/conf.d/e27-2.conf";
+include "/etc/dhcp/conf.d/e29-1.conf";
+include "/etc/dhcp/conf.d/e29-2.conf";
+include "/etc/dhcp/conf.d/e3-3.conf";
+include "/etc/dhcp/conf.d/e3-4.conf";
+include "/etc/dhcp/conf.d/e31-1.conf";
+include "/etc/dhcp/conf.d/e31-2.conf";
+include "/etc/dhcp/conf.d/e33-1.conf";
+include "/etc/dhcp/conf.d/e33-2.conf";
+include "/etc/dhcp/conf.d/e35-1.conf";
+include "/etc/dhcp/conf.d/e35-2.conf";
+include "/etc/dhcp/conf.d/e37-1.conf";
+include "/etc/dhcp/conf.d/e37-2.conf";
+include "/etc/dhcp/conf.d/e39-1.conf";
+include "/etc/dhcp/conf.d/e39-2.conf";
+include "/etc/dhcp/conf.d/e41-1.conf";
+include "/etc/dhcp/conf.d/e41-2.conf";
+include "/etc/dhcp/conf.d/e43-1.conf";
+include "/etc/dhcp/conf.d/e43-2.conf";
+include "/etc/dhcp/conf.d/e43-3.conf";
+include "/etc/dhcp/conf.d/e43-4.conf";
+include "/etc/dhcp/conf.d/e45-1.conf";
+include "/etc/dhcp/conf.d/e45-2.conf";
+include "/etc/dhcp/conf.d/e45-3.conf";
+include "/etc/dhcp/conf.d/e45-4.conf";
+include "/etc/dhcp/conf.d/e47-1.conf";
+include "/etc/dhcp/conf.d/e47-2.conf";
+include "/etc/dhcp/conf.d/e47-3.conf";
+include "/etc/dhcp/conf.d/e47-4.conf";
+include "/etc/dhcp/conf.d/e49-1.conf";
+include "/etc/dhcp/conf.d/e49-2.conf";
+include "/etc/dhcp/conf.d/e49-3.conf";
+include "/etc/dhcp/conf.d/e49-4.conf";
+include "/etc/dhcp/conf.d/e5-3.conf";
+include "/etc/dhcp/conf.d/e5-4.conf";
+include "/etc/dhcp/conf.d/e51-1.conf";
+include "/etc/dhcp/conf.d/e51-2.conf";
+include "/etc/dhcp/conf.d/e51-3.conf";
+include "/etc/dhcp/conf.d/e51-4.conf";
+include "/etc/dhcp/conf.d/e53-1.conf";
+include "/etc/dhcp/conf.d/e53-2.conf";
+include "/etc/dhcp/conf.d/e53-3.conf";
+include "/etc/dhcp/conf.d/e53-4.conf";
+include "/etc/dhcp/conf.d/e55-1.conf";
+include "/etc/dhcp/conf.d/e55-2.conf";
+include "/etc/dhcp/conf.d/e55-3.conf";
+include "/etc/dhcp/conf.d/e55-4.conf";
+include "/etc/dhcp/conf.d/e57-1.conf";
+include "/etc/dhcp/conf.d/e57-2.conf";
+include "/etc/dhcp/conf.d/e57-3.conf";
+include "/etc/dhcp/conf.d/e57-4.conf";
+include "/etc/dhcp/conf.d/e59-1.conf";
+include "/etc/dhcp/conf.d/e59-2.conf";
+include "/etc/dhcp/conf.d/e59-3.conf";
+include "/etc/dhcp/conf.d/e59-4.conf";
+include "/etc/dhcp/conf.d/e61-1.conf";
+include "/etc/dhcp/conf.d/e61-2.conf";
+include "/etc/dhcp/conf.d/e61-3.conf";
+include "/etc/dhcp/conf.d/e61-4.conf";
+include "/etc/dhcp/conf.d/e63-1.conf";
+include "/etc/dhcp/conf.d/e63-2.conf";
+include "/etc/dhcp/conf.d/e63-3.conf";
+include "/etc/dhcp/conf.d/e63-4.conf";
+include "/etc/dhcp/conf.d/e65-1.conf";
+include "/etc/dhcp/conf.d/e65-2.conf";
+include "/etc/dhcp/conf.d/e65-3.conf";
+include "/etc/dhcp/conf.d/e65-4.conf";
+include "/etc/dhcp/conf.d/e67-1.conf";
+include "/etc/dhcp/conf.d/e67-2.conf";
+include "/etc/dhcp/conf.d/e67-3.conf";
+include "/etc/dhcp/conf.d/e67-4.conf";
+include "/etc/dhcp/conf.d/e69-1.conf";
+include "/etc/dhcp/conf.d/e69-2.conf";
+include "/etc/dhcp/conf.d/e69-3.conf";
+include "/etc/dhcp/conf.d/e69-4.conf";
+include "/etc/dhcp/conf.d/e7-3.conf";
+include "/etc/dhcp/conf.d/e7-4.conf";
+include "/etc/dhcp/conf.d/e71-1.conf";
+include "/etc/dhcp/conf.d/e71-2.conf";
+include "/etc/dhcp/conf.d/e71-3.conf";
+include "/etc/dhcp/conf.d/e71-4.conf";
+include "/etc/dhcp/conf.d/e73-1.conf";
+include "/etc/dhcp/conf.d/e73-2.conf";
+include "/etc/dhcp/conf.d/e73-3.conf";
+include "/etc/dhcp/conf.d/e73-4.conf";
+include "/etc/dhcp/conf.d/e75-1.conf";
+include "/etc/dhcp/conf.d/e75-2.conf";
+include "/etc/dhcp/conf.d/e75-3.conf";
+include "/etc/dhcp/conf.d/e75-4.conf";
+include "/etc/dhcp/conf.d/e77-1.conf";
+include "/etc/dhcp/conf.d/e77-2.conf";
+include "/etc/dhcp/conf.d/e9-3.conf";
+include "/etc/dhcp/conf.d/e9-4.conf";
+include "/etc/dhcp/conf.d/fugleberg1.conf";
+include "/etc/dhcp/conf.d/fugleberg2.conf";
+include "/etc/dhcp/conf.d/game.conf";
+include "/etc/dhcp/conf.d/gamehq.conf";
+include "/etc/dhcp/conf.d/lager.conf";
+include "/etc/dhcp/conf.d/logistikk.conf";
+include "/etc/dhcp/conf.d/marsrele.conf";
+include "/etc/dhcp/conf.d/noc.conf";
+include "/etc/dhcp/conf.d/presse.conf";
+include "/etc/dhcp/conf.d/secmedic.conf";
+include "/etc/dhcp/conf.d/sponsorvest.conf";
+include "/etc/dhcp/conf.d/stage.conf";
+include "/etc/dhcp/conf.d/stageboh.conf";
+include "/etc/dhcp/conf.d/tele.conf";
+include "/etc/dhcp/conf.d/wlan.conf";
+include "/etc/dhcp/conf.d/ymse.conf";
diff --git a/dhcp/pxe-boot.conf b/dhcp/pxe-boot.conf
new file mode 100644
index 0000000..2641447
--- /dev/null
+++ b/dhcp/pxe-boot.conf
@@ -0,0 +1,2 @@
+next-server 151.216.125.3;
+filename "pxelinux.0";
diff --git a/dhcp/revzones.conf b/dhcp/revzones.conf
new file mode 100644
index 0000000..796d523
--- /dev/null
+++ b/dhcp/revzones.conf
@@ -0,0 +1,128 @@
+zone 0.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 1.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 2.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 3.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 4.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 5.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 6.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 7.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 8.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 9.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 10.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 11.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 12.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 13.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 14.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 15.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 16.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 17.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 18.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 19.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 20.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 21.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 22.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 23.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 24.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 25.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 26.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 27.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 28.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 29.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 30.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 31.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 32.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 33.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 34.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 35.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 36.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 37.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 38.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 39.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 40.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 41.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 42.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 43.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 44.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 45.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 46.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 47.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 48.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 49.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 50.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 51.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 52.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 53.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 54.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 55.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 56.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 57.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 58.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 59.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 60.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 61.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 62.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 63.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 64.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 65.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 66.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 67.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 68.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 69.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 70.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 71.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 72.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 73.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 74.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 75.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 76.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 77.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 78.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 79.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 80.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 81.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 82.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 83.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 84.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 85.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 86.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 87.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 88.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 89.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 90.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 91.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 92.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 93.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 94.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 95.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 96.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 97.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 98.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 99.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 100.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 101.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 102.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 103.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 104.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 105.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 106.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 107.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 108.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 109.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 110.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 111.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 112.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 113.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 114.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 115.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 116.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 117.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 118.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 119.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 120.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 121.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 122.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 123.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 124.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 125.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 126.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
+zone 127.216.151.in-addr.arpa { primary 127.0.0.1; key DHCP_UPDATER; }
diff --git a/dlink-ng/dlink-ng.pl b/dlink-ng/dlink-ng.pl
new file mode 100755
index 0000000..e395df9
--- /dev/null
+++ b/dlink-ng/dlink-ng.pl
@@ -0,0 +1,1097 @@
+#!/usr/bin/perl -I /root/tgmanage/
+use warnings;
+use strict;
+use lib '..';
+BEGIN {
+ require "include/config.pm";
+ eval {
+ require "include/config.local.pm";
+ };
+}
+use Net::Telnet::Cisco;
+use Net::Ping;
+use Net::IP;
+use Term::ANSIColor;
+use threads;
+use threads::shared;
+use Thread::Queue;
+use Getopt::Long;
+
+# Options
+my $cisco_user = "$nms::config::ios_user"; # Username used when logging into the swithces
+my $cisco_pass = "$nms::config::ios_pass"; # Password used when logging into the switches
+my $domain_name = ".infra.$nms::config::tgname.gathering.org"; # DNS-name to append to hostnames
+my $dlink_def_user = "admin"; # Default user for a factory-default D-Link
+my $dlink_def_ip = "10.90.90.90"; # IP for a factory-default D-Link
+my $dlink_def_mask = "255.255.255.0"; # Mask for a factory-default D-Link
+my $dlink_router_ip = "10.90.90.91"; # IP to use on the router/core
+my $dlink_prefix = "30"; # Prefix to use when setting D-Link IP
+my $dhcprelay4_pri = "$nms::config::dhcp_server1"; # Primary ip helper-address / ip dhcp relay address
+my $dhcprelay4_sec = "$nms::config::dhcp_server2"; # Secondary ip helper-address / ip dhcp relay address
+my $dhcprelay6_pri = ""; # Primary ipv6 dhcp relay
+my $dhcprelay6_sec = ""; # Secondary ipv6 dhcp relay
+my $vrf_prefix = "dlink"; # What to prefix the VRF-number (Thread ID) with
+my $max_threads = 20; # Max threads to use
+my $dlink_host_suffix = "_DGS-3100"; # Suffix for hostname on the D-Link switches (needed by NMS)
+my $log_dir = "dlink-ng/log"; # Path to logfiles
+my $default_coreswos = "ios"; # Default OS on coresw
+my $dlink_lacp_start = '45'; # First port for LACP-group on D-Links
+my $dlink_lacp_end = '48'; # Last port for LACP-group on D-Links
+my $skip_last_port = 1; # Skip last port -- set up as access port
+my $access_vlan = '3602'; # VLAN to use for skipped port
+
+# Stuff
+my $switchq = Thread::Queue->new(); # Queue to put switches in
+my $switches : shared = 0; # Number of successful switches
+my $failed_switches : shared = 0; # Number of failed switches
+my $total_time : shared = 0; # Total time spent for all switches
+my %telnet_sessions : shared; # Number of sessions currently in use
+my $DLINK_TEMPLATE; # Filehandle used for reading D-Link template
+
+# Custom Portchannel-config
+my $po_config = {
+ ios => [
+ "logging event link-status",
+ #"ip access-group end-user-protection in",
+ #"ip directed-broadcast 2000",
+ #"ipv6 nd prefix default 300 300 no-autoconfig",
+ #"ipv6 nd managed-config-flag",
+ #"ipv6 nd other-config-flag",
+ #"ipv6 dhcp relay destination $dhcprelay6_pri",
+ #"ipv6 dhcp relay destination $dhcprelay6_sec"
+ ],
+ nx => [
+ "",
+ ],
+};
+
+# Custom last port config
+my $last_port_config = {
+ ios => [
+ "logging event link-status",
+ "switchport mode access",
+ "switchport access vlan $access_vlan",
+ "spanning-tree bpduguard enable",
+ ],
+ nx => [
+ "",
+ ],
+};
+
+# Define what OS-version a coresw runs
+# NX, XR, XE, etc
+# The regex is matched against $coreswip
+my $os_regex = {
+ nx => 'flexusnexus',
+};
+
+# Configure settings for each OS
+my $os_info = {
+ ios => {
+ max_sessions => 10,
+ },
+ nx => {
+ # define 64 sessions on nxos
+ # nx-os# conf t
+ # nx-os(config)# feature dhcp
+ # nx-os(config)# line vty
+ # nx-os(config-line)# session-limit 64
+ max_sessions => 50,
+ },
+};
+
+# Autoflush
+$| = 1;
+
+# Get options
+my ($cisco_config, $single_switch, $dlink_config, $save_config, $skipped_port_only, $skipped_port_desc_only, $no_skip);
+if (@ARGV > 0) {
+ GetOptions(
+ 'c|cisco|ciscoconfig' => \$cisco_config, # Configure on the Cisco-side only (Portchannel, interfaces, etc)
+ 's|switch=s' => \$single_switch, # Configure a single switch
+ 'd|dlink|dlinkconfig=s' => \$dlink_config, # Push D-Link-template-config to D-Link (not used @ TG)
+ 'w|write' => \$save_config, # Write config on Cisco-side
+ 'portskip' => \$skipped_port_only, # Configure the skipped port only (Cisco-side)
+ 'skipdesc' => \$skipped_port_desc_only, # Configure the skipped port description only (Cisco-side)
+ 'noskip' => \$no_skip # Override $skip_last_port
+ )
+}
+
+# Exit if D-Link template file doesn't exist
+if ($dlink_config){
+ unless(-e $dlink_config){
+ die("File '$dlink_config' does not exists. Aborting.\n");
+ }
+}
+
+# Exit if $cisco_config and $skipped_port_only or $skipped_port_desc_only is set
+if ($cisco_config && ($skipped_port_only || $skipped_port_desc_only)){
+ die("\$cisco_config and \$skipped_port_only (or \$skipped_port_desc_only) can't be used together.\n");
+}
+
+# Update $skip_last_port if $no_skip is set
+if ($no_skip){
+ $skip_last_port = 0;
+}
+
+# If skipdesc, assume $skipped_port_only
+if ($skipped_port_desc_only){
+ $skipped_port_only = 1;
+}
+
+# Print stuff
+sub log_it{
+ my ($logtype, $color, $switchname, $msg) = @_;
+ printf ("%-38s %s\n", colored("$logtype", "$color") . "/" . colored("$switchname", "bold") . ":", "$msg");
+}
+
+# INFO-logs
+sub info{
+ my ($switchname, $msg) = @_;
+ log_it("INFO", "blue", $switchname, $msg);
+ return 1;
+}
+
+# ERROR-logs
+sub error{
+ my ($switchname, $msg) = @_;
+ printf ("%-38s %s\n", colored("ERROR", "red") . "/" . colored("$switchname", "bold") . ":", "$msg");
+ return 0;
+}
+
+# Debug from Net::Telnet::Cisco
+sub debug{
+ my ($switchname, $errmsg) = @_;
+
+ if ($errmsg){
+ foreach my $line (split('\\n', $errmsg)){
+ error($switchname, $line);
+ }
+ }
+}
+
+# Abort
+sub abort{
+ my ($switchname, $t1, $t2) = @_;
+
+ $t1->close if defined($t1);
+ $t2->close if defined($t2);
+
+ return error($switchname, "Aborting.");
+}
+
+# Set coreswos
+sub set_coreswos{
+ my $coreswip = shift;
+
+ my $os = $default_coreswos;
+
+ foreach my $swos ( sort keys %$os_regex ){
+ $os = $swos if ($coreswip =~ m/$os_regex->{$swos}/);
+ }
+
+ return $os;
+}
+
+# Is NX-OS?
+sub is_nx{
+ my $coreswos = shift;
+ return 1 if ($coreswos =~ m/^nx$/i);
+ return 0;
+}
+
+# Cisco-ping
+sub cisco_ping{
+ my ($cisco, $ip, $timeout, $coreswos, $vrf) = @_;
+ my $cmd;
+
+ if (is_nx($coreswos)){
+ $cmd = "ping $ip count 1 timeout 1";
+ $cmd .= " vrf ${vrf_prefix}${vrf}" if ($vrf && defined($vrf));
+ } else {
+ # IOS
+ $cmd = "ping";
+ $cmd .= " vrf ${vrf_prefix}${vrf}" if ($vrf && defined($vrf));
+ $cmd .= " $ip repeat 1 timeout 1";
+ }
+
+ my $pong = 0;
+ my $tries = 0;
+ while (($pong == 0) && ($tries < $timeout)){
+ my @res = $cisco->cmd($cmd);
+
+ # if blank, try again
+ # happens at least on ME3600X
+ next unless @res;
+
+ # sleep if it complains about no valid source address
+ # % VRF does not have a usable source address
+ # this is caused by no link, or network not propagated
+ # observed on WS-C6506-E with sup720 running 122-33.SXJ5
+ sleep 1 if ("@res" =~ m/VRF does not have a usable source address/);
+
+ if (is_nx($coreswos)){
+ $pong = 1 if ($res[1] =~ m/^64 bytes from $ip/i);
+ } else {
+ $pong = 1 if ($res[-1] =~ m/^\s*Success rate is 100 percent/i);
+ }
+ $tries++;
+ }
+ return $pong;
+}
+
+# Net::Ping-ping
+sub pong{
+ my ($ip, $timeout) = @_;
+ my $pong = 0;
+ my $tries = 0;
+
+ while(($pong == 0) && ($tries < $timeout)){
+ my $p = Net::Ping->new();
+
+ if ($p->ping($ip, 5)) {
+ $pong = 1;
+ }
+
+ $tries++;
+ }
+ return $pong;
+}
+
+# Create login to D-Link
+sub dlink_login{
+ my ($switch, $ip, $vrf, $telnet_source) = @_;
+
+ my $dlink = Net::Telnet::Cisco->new(
+ Host => $switch->{coreswip} . $domain_name,
+ Errmode => 'return',
+ output_log => "$log_dir/output-$switch->{coreswip}.log",
+ input_log => "$log_dir/input-$switch->{coreswip}.log",
+ Prompt => '/\S+[#>]/',
+ Timeout => 60
+ );
+
+ unless (defined($dlink)) {
+ return error($switch->{switchname}, "Could not connect to '$switch->{coreswip}'.");
+ }
+
+ info($switch->{switchname}, "Logging in to coreswitch '$switch->{coreswip}' to telnet to D-Link.");
+
+ unless ($dlink->login($cisco_user, $cisco_pass)){
+ $dlink->close;
+ return error($switch->{switchname}, "Can't log in to coreswitch '$switch->{coreswip}' (to telnet to D-Link).");
+ }
+
+ $dlink->enable;
+ debug($switch->{switchname}, $dlink->errmsg);
+
+ my $cmd;
+ if (is_nx($switch->{coreswos})){
+ $cmd = "telnet $ip";
+ $cmd .= " vrf ${vrf_prefix}${vrf}" if ($vrf && defined($vrf));
+ $cmd .= " source $telnet_source" if ($telnet_source && defined($telnet_source));
+ } else {
+ # IOS
+ $cmd = "telnet $ip";
+ $cmd .= " /vrf ${vrf_prefix}${vrf}" if ($vrf && defined($vrf));
+ $cmd .= " /source-interface $telnet_source" if ($telnet_source && defined($telnet_source));
+ }
+
+ info($switch->{switchname}, "Telneting to D-Link.");
+ $dlink->print($cmd);
+
+ info($switch->{switchname}, "Waiting for login prompt.");
+ $dlink->waitfor('/User ?Name:/')
+ or return abort($switch->{switchname}, $dlink);
+
+ info($switch->{switchname}, "Got login prompt, logging in.");
+ telnet_print($switch, $dlink, '', $dlink_def_user, 0)
+ or return abort($switch->{switchname}, $dlink);
+
+ info($switch->{switchname}, "Waiting for prompt.");
+ $dlink->waitfor('/\S+\#/')
+ or return abort($switch->{switchname}, $dlink);
+
+ # disable CLI paging
+ telnet_print($switch, $dlink, '', "disable clipaging")
+ or return abort($switch->{switchname}, $dlink);
+
+ info($switch->{switchname}, "Logged in to D-Link");
+ return $dlink;
+}
+
+# Execute telnet-command
+sub telnet_cmd{
+ my ($switch, $telnet, $cmd) = @_;
+
+ unless ($telnet->cmd($cmd)){
+ error($switch->{switchname}, "Command '$cmd' failed");
+ debug($switch->{switchname}, $telnet->errmsg);
+ return 0;
+ }
+
+ return 1;
+}
+
+# Execute telnet-print
+sub telnet_print{
+ my ($switch, $telnet, $telnet2, $cmd, $waitfor) = @_;
+
+ unless (defined($waitfor)){
+ $waitfor = 1;
+ }
+
+ unless ($telnet->print($cmd)){
+ error($switch->{switchname}, "Command '$cmd' failed.");
+ debug($switch->{switchname}, $telnet->errmsg);
+ return 0;
+ }
+
+ if ($waitfor){
+ $telnet->waitfor('/\S+\#/') or return 0;
+ }
+
+ return 1;
+}
+
+# Make sure interface actually is shut
+sub no_no_shut{
+ my ($switch, $cisco, $port) = @_;
+
+ info($switch->{switchname}, "Making sure interface $port /REALLY/ gets shut.");
+
+ # There is a few reasons as to why we want to do this.
+ # On some boxes/OSes, default config for an interface is 'no shut'.
+ # On some boxes/OSes, the 'shut' command isn't applied right away after
+ # you do a 'shut'.
+
+ my $tries = 0;
+ my $return = 0;
+
+ while (1){
+ if($tries >= 5){
+ # max 5 tries
+ last;
+ }
+
+ sleep 1; # wait a bit
+
+ telnet_cmd($switch, $cisco, "shut")
+ or return abort($switch->{switchname}, $cisco);
+
+ # now we need to check that the 'running config' actually reflects this
+
+ my @shut_info = $cisco->cmd("do sh run int $port | i shutdown");
+
+ unless(@shut_info){
+ $tries++;
+ next;
+ }
+
+ my $shut = "@shut_info";
+ chomp($shut);
+
+ if ($shut =~ m/shutdown/i){
+ $return = 1;
+ last;
+ } else {
+ $tries++;
+ next;
+ }
+ }
+
+ return $return;
+}
+
+# Reset all interfaces
+sub reset_interfaces{
+ my ($switch, $cisco) = @_;
+
+ # Take down interface
+ info($switch->{switchname}, "Resetting interfaces.");
+
+ telnet_cmd($switch, $cisco, "conf t")
+ or return abort($switch->{switchname}, $cisco);
+
+ # Remove old config/return to defaults on interfaces
+ # We also shut them to avoid D-Link looping
+ foreach my $port (@{$switch->{ports}}){
+ telnet_cmd($switch, $cisco, "default int $port")
+ or return abort($switch->{switchname}, $cisco);
+ telnet_cmd($switch, $cisco, "int $port")
+ or return abort($switch->{switchname}, $cisco);
+ no_no_shut($switch, $cisco, $port)
+ or return abort($switch->{switchname}, $cisco);
+ telnet_cmd($switch, $cisco, "no switchport")
+ or return abort($switch->{switchname}, $cisco);
+ }
+
+ # Remove portchannel
+ if(is_nx($switch->{coreswos})){
+ # NX-OS
+ telnet_cmd($switch, $cisco, "no int Po$switch->{etherchannel}")
+ or return abort($switch->{switchname}, $cisco);
+ } else {
+ # IOS fails on the next command, if the portchannel doesn't exist
+ # Ignore error on this command
+ $cisco->cmd("no int Po$switch->{etherchannel}");
+ }
+
+ telnet_cmd($switch, $cisco, "end")
+ or return abort($switch->{switchname}, $cisco);
+
+ return 1;
+}
+
+# Push D-Link template config to a D-Link
+sub push_dlink_template_config{
+ my $switch = shift; # switchinfo
+
+ # No need to bounce via Cisco-box; login directly to D-Link
+ my $dlink = Net::Telnet::Cisco->new(
+ Host => $switch->{ipv4address},
+ Errmode => 'return',
+ output_log => "$log_dir/output-$switch->{ipv4address}.log",
+ input_log => "$log_dir/input-$switch->{ipv4address}.log",
+ Prompt => '/\S+[#>]/',
+ Timeout => 60
+ );
+
+ unless (defined($dlink)) {
+ return error($switch->{switchname}, "Could not connect to '$switch->{switchname}' ($switch->{ipv4}).");
+ }
+
+ info($switch->{switchname}, "Logging in to D-Link '$switch->{switchname}' ($switch->{ipv4address}).");
+ $dlink->waitfor('/User ?Name:/')
+ or return abort($switch->{switchname}, $dlink);
+
+ info($switch->{switchname}, "Got login prompt, logging in.");
+ telnet_print($switch, $dlink, '', $dlink_def_user, 0)
+ or return abort($switch->{switchname}, $dlink);
+
+ info($switch->{switchname}, "Waiting for prompt.");
+ $dlink->waitfor('/\S+\#/')
+ or return abort($switch->{switchname}, $dlink);
+
+ # disable CLI paging
+ telnet_print($switch, $dlink, '', "disable clipaging")
+ or return abort($switch->{switchname}, $dlink);
+
+ info($switch->{switchname}, "Logged in to D-Link");
+
+ # Done logging in, let's configure stuff
+ info($switch->{switchname}, "Opening D-Link template file ($dlink_config).");
+ open $DLINK_TEMPLATE, '<', $dlink_config or return error($switch->{switchname}, "Couldn't open D-Link template ($dlink_config): $!");
+
+ info($switch->{switchname}, "Applying config from D-Link template file ($dlink_config).");
+
+ while (my $line=<$DLINK_TEMPLATE>) {
+ chomp $line;
+
+ next if ($line =~ m/^\s*(((#|\!).*)|$)/); # skip if comment, or blank line
+
+ telnet_print($switch, $dlink, '', $line)
+ or return abort($switch->{switchname}, $dlink);
+
+ sleep 1; # The D-Link's are a bit slow...
+ }
+
+ close $DLINK_TEMPLATE or return error($switch->{switchname}, "Couldn't close D-Link template ($dlink_config): $!");
+
+ info($switch->{switchname}, "Done applying config from D-Link template file ($dlink_config). Saving...");
+
+ # Save config + logout
+ telnet_print($switch, $dlink, '', "save", 0)
+ or return abort($switch->{switchname}, $dlink);
+ telnet_print($switch, $dlink, '', "Y")
+ or return abort($switch->{switchname}, $dlink);
+ telnet_print($switch, $dlink, '', "logout")
+ or return abort($switch->{switchname}, $dlink);
+
+ # Done
+ log_it("SUCCESS", "green", $switch->{switchname}, "Done pushing D-Link template config to switch $switch->{switchname} ($switch->{ipv4address}). \\o/");
+ $dlink->close;
+ return 1;
+}
+
+# Setup a switch
+sub setup{
+ my $switch = shift; # switchinfo
+ my $vrf = threads->tid(); # use thread ID as VRF-number
+
+ # Remove last port if we're skipping it
+ my $skipped_port;
+ if ($skip_last_port){
+ $skipped_port = pop(@{$switch->{ports}});
+ }
+
+ if($skipped_port_only){
+ info($switch->{switchname}, "Configuring skipped port only.");
+ }
+
+ if($cisco_config){
+ info($switch->{switchname}, "Configuring things on the Cisco-side only.");
+ }
+
+ unless($cisco_config || $skipped_port_only){
+ info($switch->{switchname}, "Starting configuration of $switch->{switchname} ($switch->{ipv4address}).");
+ info($switch->{switchname}, "Trying to ping $switch->{ipv4address}.");
+
+ if (pong($switch->{ipv4address}, 1)){
+ # push template-config to D-Link if template-file is given as argument
+ if($dlink_config){
+ log_it("INFO", "green", $switch->{switchname}, "Switch $switch->{switchname} ($switch->{ipv4address}) is already responding to ping! \\o/");
+ info($switch->{switchname}, "Going to push D-Link template config to switch $switch->{switchname} ($switch->{ipv4address})");
+ return push_dlink_template_config($switch);
+ } else {
+ # if not
+ log_it("INFO", "green", $switch->{switchname}, "Skipping $switch->{switchname} ($switch->{ipv4address}): is already responding to ping! \\o/");
+ return 1;
+ }
+ }
+
+ info($switch->{switchname}, "Not responding to ping, configuring device.");
+ }
+
+ info($switch->{switchname}, "Connecting to coreswitch '$switch->{coreswip}'.");
+
+ my $cisco = Net::Telnet::Cisco->new(
+ Host => $switch->{coreswip} . $domain_name,
+ Errmode => 'return',
+ output_log => "$log_dir/output-$switch->{coreswip}.log",
+ input_log => "$log_dir/input-$switch->{coreswip}.log",
+ Prompt => '/\S+[#>]/',
+ Timeout => 60
+ );
+
+ unless (defined($cisco)){
+ return error($switch->{switchname}, "Could not connect to '$switch->{coreswip}'.");
+ }
+
+ info($switch->{switchname}, "Logging in to coreswitch '$switch->{coreswip}'.");
+
+ unless ($cisco->login($cisco_user, $cisco_pass)){
+ $cisco->close;
+ return error($switch->{switchname}, "Can't log in to '$switch->{coreswip}'.");
+ }
+
+ $cisco->enable;
+ debug($switch->{switchname}, $cisco->errmsg);
+
+ # Disable paging
+ telnet_cmd($switch, $cisco, "terminal length 0")
+ or return abort($switch->{switchname}, $cisco);
+
+ unless($cisco_config || $skipped_port_only){
+ # Prepare ports
+ reset_interfaces($switch, $cisco)
+ or return abort($switch->{switchname}, $cisco);
+
+ # Set up port 1 for D-Link telneting
+ telnet_cmd($switch, $cisco, "conf t")
+ or return abort($switch->{switchname}, $cisco);
+
+ info($switch->{switchname}, "Enabling VRF (${vrf_prefix}${vrf}). Applying to interface.");
+ if(is_nx($switch->{coreswos})){
+ # Remove previous VRF
+ # No error-check on the next command, as NX-OS
+ # spits out "% VRF dlink-X not found"
+ # making Net::Telnet::Cisco think it's an error
+
+ # Extra overhead to delete, not used
+ #$cisco->cmd("no vrf context ${vrf_prefix}${vrf}");
+ #sleep 10; # NX-OS seems to need some time to delete a VRF
+
+ # Create VRF
+ telnet_cmd($switch, $cisco, "vrf context ${vrf_prefix}${vrf}")
+ or return abort($switch->{switchname}, $cisco);
+ } else {
+ # IOS
+ # IOS fails on the next command, if the vrf doesn't exist
+ # Ignore error on this command
+
+ # Extra overhead to delete, not used
+ #$cisco->cmd("no ip vrf ${vrf_prefix}${vrf}");
+
+ # Create VRF
+ telnet_cmd($switch, $cisco, "ip vrf ${vrf_prefix}${vrf}")
+ or return abort($switch->{switchname}, $cisco);
+ telnet_cmd($switch, $cisco, "rd $vrf:$vrf")
+ or return abort($switch->{switchname}, $cisco);
+ }
+
+ # Configure port #1
+ telnet_cmd($switch, $cisco, "int " . @{$switch->{ports}}[0])
+ or return abort($switch->{switchname}, $cisco);
+ telnet_cmd($switch, $cisco, "no switchport")
+ or return abort($switch->{switchname}, $cisco);
+
+ if(is_nx($switch->{coreswos})){
+ # No error-check on the next command, as NX-OS
+ # spits out "% Deleted all L3 config on interface Ethernet1/45"
+ # making Net::Telnet::Cisco think it's an error
+
+ $cisco->cmd("vrf member ${vrf_prefix}${vrf}");
+ } else {
+ # IOS
+ telnet_cmd($switch, $cisco, "ip vrf forwarding ${vrf_prefix}${vrf}")
+ or return abort($switch->{switchname}, $cisco);
+ }
+
+ # Add temporary D-Link IP
+ info($switch->{switchname}, "Adding IP-address to interface.");
+
+ telnet_cmd($switch, $cisco, "ip address $dlink_router_ip $dlink_def_mask")
+ or return abort($switch->{switchname}, $cisco);
+
+ # 'no shut'-patrol reporting in!
+ telnet_cmd($switch, $cisco, "no shut")
+ or return abort($switch->{switchname}, $cisco);
+
+ telnet_cmd($switch, $cisco, "end")
+ or return abort($switch->{switchname}, $cisco);
+
+ info($switch->{switchname}, "Waiting for D-Link to answer on $dlink_def_ip in VRF ${vrf_prefix}${vrf} on port #1 (" . @{$switch->{ports}}[0] . ").");
+
+ # Use port 1 if ping succeeds
+ my $p_count = 0;
+ my $dlink_port = @{$switch->{ports}}[$p_count];
+
+ until (cisco_ping($cisco, $dlink_def_ip, 30, $switch->{coreswos}, $vrf)) {
+ # Did not ping, let's try next port
+ # We do this because port#1 might be damaged/not patched
+
+ # First we need to check if there are more ports to test
+ if ($p_count >= $#{$switch->{ports}}){
+ # Current port is last port available
+ # Since it did not ping, we reset all interfaces
+
+ reset_interfaces($switch, $cisco)
+ or return abort($switch->{switchname}, $cisco);
+ $cisco->close;
+ return error($switch->{switchname}, "No more ports on $switch->{switchname}. Aborting.");
+ }
+
+ # Use next port
+ $p_count++;
+
+ info($switch->{switchname}, "D-Link on port #" . ($p_count) . " ($dlink_port) did not respond. Trying next port (" . @{$switch->{ports}}[$p_count] . ").");
+
+ # Try next port, reset old port
+ telnet_cmd($switch, $cisco, "conf t")
+ or return abort($switch->{switchname}, $cisco);
+ telnet_cmd($switch, $cisco, "default int $dlink_port")
+ or return abort($switch->{switchname}, $cisco);
+ telnet_cmd($switch, $cisco, "int $dlink_port")
+ or return abort($switch->{switchname}, $cisco);
+ no_no_shut($switch, $cisco, $dlink_port)
+ or return abort($switch->{switchname}, $cisco);
+
+ # Set new port
+ $dlink_port = @{$switch->{ports}}[$p_count];
+
+ # Configure new port
+ telnet_cmd($switch, $cisco, "int $dlink_port")
+ or return abort($switch->{switchname}, $cisco);
+ telnet_cmd($switch, $cisco, "no switchport")
+ or return abort($switch->{switchname}, $cisco);
+
+ if(is_nx($switch->{coreswos})){
+ # No error-check on the next command, as NX-OS
+ # spits out "% Deleted all L3 config on interface Ethernet1/45"
+ # making Net::Telnet::Cisco think it's an error
+
+ $cisco->cmd("vrf member ${vrf_prefix}${vrf}");
+ } else {
+ # IOS
+ telnet_cmd($switch, $cisco, "ip vrf forwarding ${vrf_prefix}${vrf}")
+ or return abort($switch->{switchname}, $cisco);
+ }
+
+ telnet_cmd($switch, $cisco, "ip address $dlink_router_ip $dlink_def_mask")
+ or return abort($switch->{switchname}, $cisco);
+ # 'no shut'-patrol reporting in!
+ telnet_cmd($switch, $cisco, "no shut")
+ or return abort($switch->{switchname}, $cisco);
+ telnet_cmd($switch, $cisco, "end")
+ or return abort($switch->{switchname}, $cisco);
+
+ info($switch->{switchname}, "Waiting for D-Link to answer on $dlink_def_ip in VRF ${vrf_prefix}${vrf} on port #" . ($p_count+1) . " (" . @{$switch->{ports}}[$p_count] . ").");
+ }
+
+ # Telnet to D-Link
+ info($switch->{switchname}, "Starting D-Link config phase 1.");
+ my $dlink = dlink_login($switch, $dlink_def_ip, $vrf)
+ or return abort($switch->{switchname}, $cisco);
+
+ info($switch->{switchname}, "Setting hostname to $switch->{switchname}${dlink_host_suffix}");
+ telnet_print($switch, $dlink, $cisco, "config snmp system_name $switch->{switchname}${dlink_host_suffix}")
+ or return abort($switch->{switchname}, $cisco, $dlink);
+
+ info($switch->{switchname}, "Adding LACP. Enabling STP.");
+ telnet_print($switch, $dlink, $cisco, "create link_aggregation group_id 1 type lacp")
+ or return abort($switch->{switchname}, $cisco, $dlink);
+ telnet_print($switch, $dlink, $cisco, "config link_aggregation group_id 1 ports 1:($dlink_lacp_start-$dlink_lacp_end)")
+ or return abort($switch->{switchname}, $cisco, $dlink);
+ telnet_print($switch, $dlink, $cisco, "enable stp")
+ or return abort($switch->{switchname}, $cisco, $dlink);
+
+ info($switch->{switchname}, "STP enabled, logging in again.");
+ $dlink->close;
+
+ unless (cisco_ping($cisco, $dlink_def_ip, 60, $switch->{coreswos}, $vrf)) {
+ reset_interfaces($switch, $cisco)
+ or return abort($switch->{switchname}, $cisco);
+ $cisco->close;
+ return error($switch->{switchname}, "Can't login to $switch->{switchname} on $dlink_def_ip, aborting.");
+ }
+
+ $dlink = dlink_login($switch, $dlink_def_ip, $vrf) or return abort($switch->{switchname}, $cisco);
+
+ info($switch->{switchname}, "Running STP config.");
+ telnet_print($switch, $dlink, $cisco, "config stp version mstp")
+ or return abort($switch->{switchname}, $cisco, $dlink);
+ telnet_print($switch, $dlink, $cisco, "config stp priority 61440 instance_id 0")
+ or return abort($switch->{switchname}, $cisco, $dlink);
+ telnet_print($switch, $dlink, $cisco, "config stp ports 1:(1-44) edge true")
+ or return abort($switch->{switchname}, $cisco, $dlink);
+ telnet_print($switch, $dlink, $cisco, "enable lldp")
+ or return abort($switch->{switchname}, $cisco, $dlink);
+
+ info($switch->{switchname}, "Setting IP address.");
+ telnet_print($switch, $dlink, $cisco, "config ipif System ipaddress $switch->{ipv4address}/$dlink_prefix vlan default")
+ or return abort($switch->{switchname}, $cisco, $dlink);
+
+ info($switch->{switchname}, "Closing D-Link link.");
+ $dlink->close;
+
+ info($switch->{switchname}, "Configuring IP on gateway.");
+ telnet_cmd($switch, $cisco, "conf t")
+ or return abort($switch->{switchname}, $cisco);
+ telnet_cmd($switch, $cisco, "default int $dlink_port")
+ or return abort($switch->{switchname}, $cisco);
+ telnet_cmd($switch, $cisco, "int $dlink_port")
+ or return abort($switch->{switchname}, $cisco);
+ telnet_cmd($switch, $cisco, "no switchport")
+ or return abort($switch->{switchname}, $cisco);
+ telnet_cmd($switch, $cisco, "ip address $switch->{ipv4gateway} $switch->{netmask}")
+ or return abort($switch->{switchname}, $cisco);
+ # 'no shut'-patrol reporting in!
+ telnet_cmd($switch, $cisco, "no shut")
+ or return abort($switch->{switchname}, $cisco);
+ telnet_cmd($switch, $cisco, "end")
+ or return abort($switch->{switchname}, $cisco);
+
+ # Wait for network convergence
+ info($switch->{switchname}, "Waiting for network to converge.");
+ unless (cisco_ping($cisco, $switch->{ipv4address}, 60, $switch->{coreswos})) {
+ reset_interfaces($switch, $cisco)
+ or return abort($switch->{switchname}, $cisco);
+ $cisco->close;
+ return error($switch->{switchname}, "Can't ping $switch->{switchname} on $switch->{ipv4address}, aborting.");
+ }
+
+ # Do it again!
+ info($switch->{switchname}, "D-Link config phase 2.");
+ $dlink = dlink_login($switch, $switch->{ipv4address}, '', $dlink_port) or return abort($switch->{switchname}, $cisco);
+
+ info($switch->{switchname}, "Setting default route on switch. Saving config.");
+ telnet_print($switch, $dlink, $cisco, "create iproute default $switch->{ipv4gateway}")
+ or return abort($switch->{switchname}, $cisco, $dlink);
+ telnet_print($switch, $dlink, $cisco, "save", 0)
+ or return abort($switch->{switchname}, $cisco, $dlink);
+ telnet_print($switch, $dlink, $cisco, "Y")
+ or return abort($switch->{switchname}, $cisco, $dlink);
+ telnet_print($switch, $dlink, $cisco, "logout")
+ or return abort($switch->{switchname}, $cisco, $dlink);
+
+ info($switch->{switchname}, "Closing D-Link link.");
+ $dlink->close;
+ }
+
+ unless($skipped_port_only){
+ # Configure final IOS stuff
+ info($switch->{switchname}, "Final IOS config phase. Setting up all interfaces + Port-Channel.");
+
+ # Reset interfaces
+ reset_interfaces($switch, $cisco)
+ or return abort($switch->{switchname}, $cisco);
+
+ telnet_cmd($switch, $cisco, "conf t")
+ or return abort($switch->{switchname}, $cisco);
+
+ # this needs to be done on IOS-XE
+ # Portchannel needs to exist before we can assign interfaces to it
+ telnet_cmd($switch, $cisco, "int Po$switch->{etherchannel}")
+ or return abort($switch->{switchname}, $cisco);
+
+ # Rest of the config
+ my $etherchan_desc;
+ foreach my $port (@{$switch->{ports}}){
+ telnet_cmd($switch, $cisco, "int $port")
+ or return abort($switch->{switchname}, $cisco);
+ telnet_cmd($switch, $cisco, "no switchport")
+ or return abort($switch->{switchname}, $cisco);
+ # 'no shut'-patrol reporting in!
+ telnet_cmd($switch, $cisco, "no shut")
+ or return abort($switch->{switchname}, $cisco);
+ telnet_cmd($switch, $cisco, "desc D-Link $switch->{switchname}; RJ-45; 1G;")
+ or return abort($switch->{switchname}, $cisco);
+ telnet_cmd($switch, $cisco, "channel-group $switch->{etherchannel} mode passive")
+ or return abort($switch->{switchname}, $cisco);
+
+ # add port to descr
+ $etherchan_desc .= "$port; ";
+ }
+
+ telnet_cmd($switch, $cisco, "int Po$switch->{etherchannel}")
+ or return abort($switch->{switchname}, $cisco);
+ telnet_cmd($switch, $cisco, "desc D-Link $switch->{switchname}; $etherchan_desc")
+ or return abort($switch->{switchname}, $cisco);
+ telnet_cmd($switch, $cisco, "ip address $switch->{ipv4gateway} $switch->{netmask}")
+ or return abort($switch->{switchname}, $cisco);
+
+ # ipv6-stuff
+ unless (is_nx($switch->{coreswos})){
+ # IOS
+ telnet_cmd($switch, $cisco, "ipv6 enable")
+ or return abort($switch->{switchname}, $cisco);
+ }
+
+ telnet_cmd($switch, $cisco, "ipv6 address $switch->{ipv6address}")
+ or return abort($switch->{switchname}, $cisco);
+
+ if (is_nx($switch->{coreswos})){
+ telnet_cmd($switch, $cisco, "ip dhcp relay address $dhcprelay4_pri")
+ or return abort($switch->{switchname}, $cisco);
+
+ # define secondary if present
+ if (defined($dhcprelay4_sec) && $dhcprelay4_sec){
+ telnet_cmd($switch, $cisco, "ip dhcp relay address $dhcprelay4_sec")
+ or return abort($switch->{switchname}, $cisco);
+ }
+ } else {
+ # IOS
+ telnet_cmd($switch, $cisco, "ip helper-address $dhcprelay4_pri")
+ or return abort($switch->{switchname}, $cisco);
+
+ # define secondary if present
+ if (defined($dhcprelay4_sec) && $dhcprelay4_sec){
+ telnet_cmd($switch, $cisco, "ip helper-address $dhcprelay4_sec")
+ or return abort($switch->{switchname}, $cisco);
+ }
+ }
+
+ # Custom Portchannel-config
+ # Dynamically applied depending on OS
+ foreach my $cmd (@{$po_config->{$switch->{coreswos}}}){
+ telnet_cmd($switch, $cisco, $cmd)
+ or return abort($switch->{switchname}, $cisco);
+ }
+
+ # 'no shut'-patrol reporting in!
+ telnet_cmd($switch, $cisco, "no shut")
+ or return abort($switch->{switchname}, $cisco);
+ telnet_cmd($switch, $cisco, "end")
+ or return abort($switch->{switchname}, $cisco);
+ }
+
+ # If we skipped last port at the start, we configure it now
+ if (($skip_last_port && $skipped_port && defined($skipped_port)) || ($skipped_port_only && defined($skipped_port_only))){
+ if ($skipped_port_desc_only){
+ info($switch->{switchname}, "Configuring skipped port... (description only)");
+ } else {
+ info($switch->{switchname}, "Configuring skipped port...");
+ }
+
+ telnet_cmd($switch, $cisco, "conf t")
+ or return abort($switch->{switchname}, $cisco);
+ unless ($skipped_port_desc_only){
+ telnet_cmd($switch, $cisco, "default int $skipped_port")
+ or return abort($switch->{switchname}, $cisco);
+ }
+
+ telnet_cmd($switch, $cisco, "int $skipped_port")
+ or return abort($switch->{switchname}, $cisco);
+ telnet_cmd($switch, $cisco, "desc AP \@ D-Link $switch->{switchname}; RJ-45; 1G;")
+ or return abort($switch->{switchname}, $cisco);
+
+ unless ($skipped_port_desc_only){
+ foreach my $cmd (@{$last_port_config->{$switch->{coreswos}}}){
+ telnet_cmd($switch, $cisco, $cmd)
+ or return abort($switch->{switchname}, $cisco);
+ }
+ # 'no shut'-patrol reporting in!
+ telnet_cmd($switch, $cisco, "no shut")
+ or return abort($switch->{switchname}, $cisco);
+ }
+ telnet_cmd($switch, $cisco, "end")
+ or return abort($switch->{switchname}, $cisco);
+ }
+
+ # If only cisco-config
+ if($cisco_config){
+ log_it("CONFIG", "green", $switch->{switchname}, "Cisco-config relevant to switch '$switch->{switchname}' ($switch->{ipv4address}) done! \\o/");
+ }
+
+ # Check if all is OK, but not if configuring skipped port only
+ my $return = 0;
+ if ($skipped_port_only){
+ info($switch->{switchname}, "Done doing skipped port config. Not checking if anything is online.");
+ $return = 1;
+ } else {
+ unless (pong($switch->{ipv4address}, 15)){
+ if (cisco_ping($cisco, $switch->{ipv4address}, 60, $switch->{coreswos})) {
+ # we can reach from core, but not from other places, lets warn
+ log_it("ERROR", "red", $switch->{switchname}, "Switch $switch->{switchname} reachable only from core/distro.");
+ } else {
+ reset_interfaces($switch, $cisco)
+ or return abort($switch->{switchname}, $cisco);
+ $cisco->close;
+ return error($switch->{switchname}, "Can't ping $switch->{switchname} on $switch->{ipv4address}, aborting.");
+ }
+ } else {
+ # pingable, OK
+ log_it("SUCCESS", "green", $switch->{switchname}, "Switch $switch->{switchname} ($switch->{ipv4address}) set up! \\o/");
+
+ $return = 1;
+
+ # push template-config to D-Link if template-file is given as argument
+ if($dlink_config){
+ info($switch->{switchname}, "Going to push D-Link template config to switch $switch->{switchname} ($switch->{ipv4address})");
+ $return = push_dlink_template_config($switch);
+ }
+ }
+ }
+
+ if($save_config){
+ # save the cisco-config
+ info($switch->{switchname}, "Saving config on core-switch ($switch->{coreswip}).");
+ telnet_cmd($switch, $cisco, "write")
+ or return abort($switch->{switchname}, $cisco);
+ }
+
+ $cisco->close;
+ return $return;
+}
+
+# Process switches
+sub process_switches {
+ while (my $switch = $switchq->dequeue()){
+ last if ($switch eq 'DONE'); # all done
+
+ my $time_start = time();
+
+ # Wait till there is sessions/VTYs available
+ while (1){
+ $telnet_sessions{$switch->{coreswip}} = 0 unless $telnet_sessions{$switch->{coreswip}};
+ $telnet_sessions{$switch->{coreswip}} += 2;
+
+ if ($telnet_sessions{$switch->{coreswip}} <= $os_info->{$switch->{coreswos}}{max_sessions}){
+ # lower or equal to max_sessions on current switch
+ # lets move on
+ last;
+ } else {
+ # we would exceed max_sessions on current switch
+ # we wait until there is free sessions
+ info($switch->{switchname}, "There are no more free sessions left on '$switch->{coreswip}' ($switch->{coreswos}). Waiting...");
+ $telnet_sessions{$switch->{coreswip}} -= 2;
+ sleep (int(rand(10)) + 10);
+ }
+ }
+
+ info($switch->{switchname}, "Number of sessions on switch '$switch->{coreswip}': $telnet_sessions{$switch->{coreswip}}.");
+
+ if (setup($switch)) {
+ # Count number of switches
+ $switches++;
+
+ } else {
+ log_it("FAILED", "red", $switch->{switchname}, "Configuring $switch->{switchname} failed.");
+
+ # Count failed switches
+ $failed_switches++;
+ }
+
+ # Remove session
+ $telnet_sessions{$switch->{coreswip}} -= 2;
+
+ # Summarize total time spent, used to calculate average per switch
+ $total_time += time() - $time_start;
+ }
+
+ # detach thread -- we're done
+ threads->detach;
+}
+
+# Let's start
+my $time_start = time();
+log_it("INFO", "yellow", "dlink-ng", "Starting dlink-ng with $max_threads threads...");
+log_it("INFO", "yellow", "dlink-ng", "Configured to skip last port on all switches.") if $skip_last_port;
+
+# Let's add all switches to the queue
+while (<STDIN>){
+ next if /^(.*#|\s+$)/; # skip if comment, or blank line
+
+ my ($switchname, $coreswip, $etherchannel, $cidr, $ipv4address, $ipv4gateway, $ipv6address, @ports) = split;
+
+ # skip if less than 1 port is provided
+ if (scalar(@ports) < 1){
+ log_it("FAILED", "red", $switchname, "Switch '$switchname' had less than 1 port configured. Skipping.");
+ next;
+ }
+
+ # define OS of the coresw
+ my $coreswos = set_coreswos($switchname);
+
+ # find netmask
+ my $netmask = Net::IP->new($cidr)->mask();
+
+ my %switch = (
+ switchname => $switchname,
+ coreswip => $coreswip,
+ coreswos => $coreswos,
+ etherchannel => $etherchannel,
+ ipv4address => $ipv4address,
+ ipv4gateway => $ipv4gateway,
+ netmask => $netmask,
+ ipv6address => $ipv6address,
+ ports => \@ports,
+ );
+
+ # Only configure a single switch?
+ if (defined $single_switch){
+ unless ($single_switch eq $switchname){
+ next;
+ }
+ }
+
+ # Add switch to queue
+ $switchq->enqueue(\%switch);
+}
+
+# Let the threads know when they're done
+$switchq->enqueue("DONE") for (1..$max_threads);
+
+# Start processing the queue
+threads->create("process_switches") for (1..$max_threads);
+
+# Wait till all threads is done
+sleep 5 while (threads->list(threads::running));
+
+# If 0 switches
+my $runtime = time() - $time_start;
+my $total_switches = $switches + $failed_switches;
+if($total_switches == 0){
+ log_it("INFO", "yellow", "dlink-ng", "Finished!");
+ log_it("INFO", "yellow", "dlink-ng", "Crunched 0 switches in $runtime seconds.");
+ exit 1;
+}
+
+# Done
+my $avg = sprintf("%.1f", $total_time / $total_switches);
+log_it("INFO", "yellow", "dlink-ng", "Finished!");
+log_it("INFO", "yellow", "dlink-ng", "Crunched $total_switches switches in $runtime seconds.");
+log_it("INFO", "yellow", "dlink-ng", "$switches of these were successful, while $failed_switches failed.");
+log_it("INFO", "yellow", "dlink-ng", "Average of $avg seconds per switch.");
+
diff --git a/dlink-ng/make-dlink-config.pl b/dlink-ng/make-dlink-config.pl
new file mode 100755
index 0000000..54284ac
--- /dev/null
+++ b/dlink-ng/make-dlink-config.pl
@@ -0,0 +1,70 @@
+#!/usr/bin/perl -I /root/tgmanage/
+use strict;
+use warnings;
+use lib '..';
+BEGIN {
+ require "include/config.pm";
+ eval {
+ require "include/config.local.pm";
+ };
+}
+
+unless (@ARGV > 0) {
+ print "No arguments. Need switches.txt and patchlist.txt.\n";
+ exit 1;
+}
+
+my $s = open(SWITCHES, "$ARGV[0]") or die ("Cannot open switches.txt");
+my $p = open(PATCH, "$ARGV[1]") or die ("Cannot open patchlist.txt");
+
+my $portchannel_start = 10;
+my %portchannels;
+my $letter = "a";
+
+my %switches;
+while(<SWITCHES>) {
+ chomp;
+ my ($network, $netmask, $switchname, $mngmt_ip) = split; # $mngmt_ip is unused
+ $switches{$switchname} = {
+ network => $network,
+ netmask => $netmask,
+ };
+}
+while (<PATCH>) {
+ chomp;
+ my ($switchname, $coregw, @ports) = split;
+ my $network = $switches{$switchname}{network};
+ my $netmask = $switches{$switchname}{netmask};
+ my ($o1, $o2, $o3, $o4) = split(/\./, $network);
+
+ # TG13-fiks
+ # Distroene ble kalt 1-5, men planning-forvirring førte til renaming 0-4
+ $coregw =~ s/^(distro)([0-9])$/$1 . ($2-1)/e;
+
+ # portchannel per distro
+ $portchannels{$coregw} = $portchannel_start unless ($portchannels{$coregw} && defined($portchannels{$coregw}));
+
+ if ($o4 eq "0") {
+ $letter = "a";
+ } elsif ($o4 eq "64") {
+ $letter = "b";
+ } elsif ($o4 eq "128") {
+ $letter = "c";
+ } elsif ($o4 eq "192") {
+ $letter = "d";
+ }
+
+ my $v6addr = $nms::config::base_ipv6net . $o3 . $letter ."::1/64";
+
+ $o4 += 1;
+ my $gateway_addr = "$o1.$o2.$o3.$o4";
+ $o4 += 1;
+ my $switch_addr = "$o1.$o2.$o3.$o4";
+
+ print "$switchname $coregw $portchannels{$coregw} $network/$netmask $switch_addr $gateway_addr $v6addr " . join(' ', @ports) . "\n";
+
+ # increase portchannel
+ $portchannels{$coregw}++;
+
+ die("NO MORE ETHERCHANNELS!") if($portchannels{$coregw} > 64); # IOS-XE 4500 only supports 64 portchannels
+} \ No newline at end of file
diff --git a/include/config.local.pm b/include/config.local.pm
new file mode 100644
index 0000000..8e0eeee
--- /dev/null
+++ b/include/config.local.pm
@@ -0,0 +1,100 @@
+#! /usr/bin/perl
+use strict;
+use warnings;
+use DBI;
+package nms::config;
+
+# Don't change this file for your local setup; use config.local.pm instead.
+
+our $db_name = "nms";
+our $db_host = "flexus.tg13.gathering.org";
+our $db_username = "nms";
+our $db_password = "<removed>";
+
+our $dhcp_server1 = "151.216.126.2";
+our $dhcp_server2 = "151.216.125.17"; # Cisco ISE profiling
+
+our $ios_user = "nms";
+our $ios_pass = "<removed>";
+
+# Tech:Net sets up at least a read-community for SNMP for use
+# with dlink1g, nms and sosuch. This is the one:
+our $snmp_community = "<removed>";
+
+our $dlink1g_user = 'dlinkng';
+our $dlink1g_passwd = '<removed>';
+
+# No longer in use as of '12 ?
+# our $telegw_ip = "12.34.56.78";
+# our @telegw_wanlinks = ("gig1/1", "gig1/2");
+
+our $tgname = "tg13";
+
+our $pri_a = "winix";
+our $pri_ptr = "151.216.126.2";
+our $pri_v6 = "2a02:ed02:126::2";
+our $pri_net = "151.216.126.0/24";
+our $sec_a = "tress90";
+our $sec_ptr = "151.216.125.2";
+our $sec_v6 = "2a02:ed02:125::2";
+
+# for RIPE to get reverse zones via DNS AXFR
+our $ext_xfer = "193.0.0.0/22";
+our $ext_ns = "194.19.3.20";
+
+# To generate new dnssec-key for ddns:
+# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST DHCP_UPDATER
+our $ddns_key = "<removed>";
+our $ddns_to = "127.0.0.1";
+
+# Used by make-named.pl
+our $noc_nett = "151.216.124.0/24";
+our $noc_nett_v6 = "2a02:ed02:124::/64";
+
+# Ikke i bruk i '11 til revers-soner.
+# Ikke i bruk i '12 heller
+# På tide å fjerne dette i '13?
+# Ikke brukt i '13 heller
+# På tide å fjerne dette i '14????????? :-D :-P
+#our $root_arpa = "22.89.in-addr.arpa";
+#our $ipv6nett = "2001:8c0:9840::/48";
+
+our $base_ipv4net = "151.216.0.0";
+our $base_ipv4prefix = 17;
+
+our $base_ipv6net = "2a02:ed02:";
+our $base_ipv6prefix = 32;
+our $ipv6zone = "2.0.d.e.2.0.a.2.ip6.arpa";
+
+our $pxe_server = "151.216.125.3";
+our $ciscowlc_a = "151.216.127.15";
+
+
+# static_switches is supposed to be legacy, and should be safe to remove.
+#130, 144, 145, 196, 197, 198, 199, 200, 203, 201, 206, 208, 209, 211, 213,
+#our @static_switches = (
+# 130,144,145,190,200,201,203,206,208,209,210,211,213,215,216,217,218,219,220,221,223,250,252
+# );
+#our @static_nets = (
+# 0, 212, 254, 255
+# );
+
+# Used by ipv6-stats, but never got updated for tg11-ip's. Commenting.
+# The following is the list of routing netboxes (core, dist, tele, a.s.o)
+our @distrobox_ips = (
+ '151.216.127.17', # distro0
+ '151.216.127.18', # distro1
+ '151.216.127.19', # distro2
+ '151.216.127.20', # distro3
+ '151.216.127.21', # distro4
+ '151.216.127.9', # crewgw
+ '151.216.127.11', # gamegw
+ '151.216.124.1', # nocgw
+ '151.216.127.6', # logistikkgw
+ '151.216.127.5', # wtfgw
+);
+
+# Forwarding zones.
+our @forwarding_zones = qw( );
+
+1;
diff --git a/include/config.pm b/include/config.pm
new file mode 100644
index 0000000..17f2c68
--- /dev/null
+++ b/include/config.pm
@@ -0,0 +1,25 @@
+#! /usr/bin/perl
+use strict;
+use warnings;
+use DBI;
+package nms::config;
+
+# Don't change this file for your local setup; use config.local.pm instead.
+
+our $db_name = "<removed>";
+our $db_host = "nms.tg08.gathering.org";
+our $db_username = "<removed>";
+our $db_password = "<removed>";
+
+our $zyxel_password = "<removed>";
+our $telnet_timeout = 300;
+
+# Tech:Net sets up at least a read-community for SNMP for use
+our $ios_user = "<removed>";
+our $ios_pass = "<removed>";
+
+# No longer in use as of '12 ?
+#our $telegw_ip = "12.34.56.78";
+#our @telegw_wanlinks = ("gig1/1", "gig1/2");
+
+1;
diff --git a/include/nms.pm b/include/nms.pm
new file mode 100644
index 0000000..9567bde
--- /dev/null
+++ b/include/nms.pm
@@ -0,0 +1,104 @@
+#! /usr/bin/perl
+use strict;
+use warnings;
+use DBI;
+use Net::Telnet;
+use Data::Dumper;
+use FileHandle;
+package nms;
+
+
+use base 'Exporter';
+our @EXPORT = qw(switch_disconnect switch_connect switch_exec switch_timeout db_connect);
+
+BEGIN {
+ require "config.pm";
+ eval {
+ require "config.local.pm";
+ };
+}
+
+sub db_connect {
+ my $dbh = DBI->connect("dbi:Pg:" .
+ "dbname=" . $nms::config::db_name .
+ ";host=" . $nms::config::db_host,
+ $nms::config::db_username,
+ $nms::config::db_password)
+ or die "Couldn't connect to database";
+ return $dbh;
+}
+
+sub switch_connect($) {
+ my ($ip) = @_;
+
+ my $dumplog = FileHandle->new;
+ $dumplog->open(">>/tmp/dumplog-queue") or die "/tmp/dumplog-queue: $!";
+ $dumplog->print("\n\nConnecting to " . $ip . "\n\n");
+
+ my $inputlog = FileHandle->new;
+ $inputlog->open(">>/tmp/inputlog-queue") or die "/tmp/inputlog-queue: $!";
+ $inputlog->print("\n\nConnecting to " . $ip . "\n\n");
+
+ my $conn = new Net::Telnet( Timeout => $nms::config::telnet_timeout,
+ Dump_Log => $dumplog,
+ Input_Log => $inputlog,
+ Errmode => 'return',
+ Prompt => '/DGS-3100# (?!\x1b\[K)/');
+ my $ret = $conn->open( Host => $ip);
+ if (!$ret || $ret != 1) {
+ return (undef);
+ }
+ # Handle login with and without password
+ print "Logging in without password\n";
+ $conn->waitfor('/User ?Name:/');
+ $conn->print('admin');
+ my (undef, $match) = $conn->waitfor('/DGS-3100#|Password:/');
+ die 'Unexpected prompt after login attempt' if (not defined $match);
+ if ($match eq 'Password:') {
+ $conn->print('gurbagurba'); # Dette passordet skal feile
+ $conn->waitfor('/User ?Name:/');
+ $conn->print($nms::config::dlink1g_user);
+ my (undef, $match) = $conn->waitfor('/DGS-3100#|Password:/');
+ if ($match eq 'Password:') {
+ $conn->cmd($nms::config::dlink1g_passwd);
+ }
+ }
+ return ($conn);
+}
+
+# Send a command to switch and return the data recvied from the switch
+sub switch_exec {
+ my ($cmd, $conn, $print) = @_;
+
+ # Send the command and get data from switch
+ my @data;
+ if (defined($print)) {
+ $conn->print($cmd);
+ return;
+ } else {
+ @data = $conn->cmd($cmd);
+ print $conn->errmsg, "\n";
+ }
+ return @data;
+# my @lines = ();
+# foreach my $line (@data) {
+# # Remove escape-7 sequence
+## $line =~ s/\x1b\x37//g;
+# push (@lines, $line);
+# }
+# return @lines;
+}
+
+sub switch_timeout {
+ my ($timeout, $conn) = @_;
+
+ $conn->timeout($timeout);
+ return ('Set timeout to ' . $timeout);
+}
+
+sub switch_disconnect {
+ my ($conn) = @_;
+ $conn->close;
+}
+
+1;
diff --git a/include/tgmanage.cfg.sh b/include/tgmanage.cfg.sh
new file mode 100644
index 0000000..a922f1c
--- /dev/null
+++ b/include/tgmanage.cfg.sh
@@ -0,0 +1,19 @@
+# This file is autogenerated by tools/create-shellconf.pl,
+# using data from nms::config.
+#
+# Do you need new common/configuration variables?
+# Add/update include/config.local.pm and tools/create-shellconf.pl
+
+PRIMARY="winix.tg13.gathering.org"
+SECONDARY="tress90.tg13.gathering.org"
+TGNAME="tg13"
+
+PRI_PTR="151.216.126.2"
+SEC_PTR="151.216.125.2"
+
+DDNS_KEY="<removed>"
+
+BASEV4="151.216.0.0"
+PREFIXV4="17"
+BASEV6="2a02:ed02:"
+PREFIXV6="32"
diff --git a/infra-dns.txt b/infra-dns.txt
new file mode 100644
index 0000000..6297a16
--- /dev/null
+++ b/infra-dns.txt
@@ -0,0 +1,28 @@
+# telegw 151.216.127.1 2a02:ed02:FFFF::1
+# nocgw 151.216.127.2 2a02:ed02:FFFF::2
+# camgw 151.216.127.3 2a02:ed02:FFFF::3
+# stageboh 151.216.127.4 2a02:ed02:FFFF::4
+# wtfgw 151.216.127.5 2a02:ed02:FFFF::5
+# logistikkGW 151.216.127.6 2a02:ed02:FFFF::6
+# corengw 151.216.127.7 2a02:ed02:FFFF::7
+# coresgw 151.216.127.8 2a02:ed02:FFFF::8
+# crewgw 151.216.127.9 2a02:ed02:FFFF::9
+# tvgw 151.216.127.10 2a02:ed02:FFFF::10
+# gameGW 151.216.127.11 2a02:ed02:FFFF::11
+# resepsjonGW 151.216.127.12 2a02:ed02:FFFF::12
+# presseGW 151.216.127.13 2a02:ed02:FFFF::13
+# sponsorGW 151.216.127.14 2a02:ed02:FFFF::14
+# KomplettGW 151.216.127.15 2a02:ed02:FFFF::15
+# eldregw 151.216.127.16 2a02:ed02:FFFF::16
+ distro0 151.216.127.17 2a02:ed02:FFFF::17
+ distro1 151.216.127.18 2a02:ed02:FFFF::18
+ distro2 151.216.127.19 2a02:ed02:FFFF::19
+ distro3 151.216.127.20 2a02:ed02:FFFF::20
+ distro4 151.216.127.21 2a02:ed02:FFFF::21
+
+# telegw -- BLIX SINE
+#telegw-po1 185.12.59.2 2a02:ed01::2
+# nocgw
+#nocgw-po1 151.216.0.3 nope
+#vss-core 151.216.123.254 2A02:ED02:123::254
+
diff --git a/iptables-dnat-hack.txt b/iptables-dnat-hack.txt
new file mode 100644
index 0000000..caa36a4
--- /dev/null
+++ b/iptables-dnat-hack.txt
@@ -0,0 +1,140 @@
+Since several services thought our IP's didn't belong to Norway, they sent us
+to CDN's in Japan, Africa, and some other weird countries. NRK nett-tv also
+didn't think we was in Norway, hence it did not let you stream things. Action
+had to be taken.
+
+We had a /24 from our ISP that we knew would be recognized as Norwegian. We
+therefore decided to NAT everything related to those services behind that /24.
+We had to figure out all the destination prefixes used for the different
+services, and only NAT sessions going to those networks. Tests showed that even
+if Origin was being NATed behind "Norwegian IPs", it would still connect to
+lol-CDN. We then decided to DNAT all connections to these specific IPs. We
+found a suitable Origin-CDN hosted at Telenor/Canal Digital, that would accept
+connections.
+
+In the process of setting this up, we found out that Cisco ASR1k doesn't (at
+the time, at least) support more than _one_ DNAT-entry (with the same
+destination, at least). iptables to the rescue.
+
+Two 10gig-interfaces was set up. One as the 'inside', and the other as the
+'outside'.
+
+The solution worked flawlessly, and peaked at about ~2Gbps of traffic.
+
+## IPTABLES START
+*filter
+:INPUT DROP [0:0]
+:FORWARD ACCEPT [497:117797]
+:OUTPUT ACCEPT [0:0]
+-A INPUT -i lo -j ACCEPT
+-A INPUT -i gre5 -j ACCEPT
+-A INPUT -i eth2 -j ACCEPT
+-A INPUT -p icmp -j ACCEPT
+-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
+-A INPUT -j DROP
+-A FORWARD -i eth3 -o gre5 -m state --state RELATED,ESTABLISHED -j ACCEPT
+-A FORWARD -i gre5 -o eth3 -j ACCEPT
+-A OUTPUT -o lo -j ACCEPT
+-A OUTPUT -j ACCEPT
+COMMIT
+# NAT
+*nat
+:PREROUTING ACCEPT [1073:112412]
+:POSTROUTING ACCEPT [65:16154]
+:OUTPUT ACCEPT [2:129]
+:nataccept - [0:0]
+-A PREROUTING -d 23.15.8.0/24 -j DNAT --to-destination 148.123.13.49
+-A PREROUTING -d 23.32.241.0/24 -j DNAT --to-destination 148.123.13.49
+-A PREROUTING -d 120.29.145.0/24 -j DNAT --to-destination 148.123.13.49
+-A PREROUTING -d 124.40.32.0/24 -j DNAT --to-destination 148.123.13.49
+-A PREROUTING -d 125.56.200.0/24 -j DNAT --to-destination 148.123.13.49
+-A POSTROUTING -s 151.216.0.0/17 -o eth3 -j nataccept
+-A nataccept -j LOG --log-prefix "iptables nat accept "
+-A nataccept -j SNAT --to-source 31.169.55.2-31.169.55.254
+COMMIT
+## IPTABLES END
+
+
+## Cisco ACL
+!
+ip access-list extended steamorigin
+ remark TEST
+ 10 permit ip 151.216.0.0 0.0.127.255 158.37.91.0 0.0.0.255
+ remark ORIGIN
+ 100 permit ip 151.216.0.0 0.0.127.255 23.15.8.0 0.0.0.255
+ 110 permit ip 151.216.0.0 0.0.127.255 23.21.0.0 0.0.255.255
+ 120 permit ip 151.216.0.0 0.0.127.255 23.23.0.0 0.0.255.255
+ 130 permit ip 151.216.0.0 0.0.127.255 23.32.241.0 0.0.0.255
+ 140 permit ip 151.216.0.0 0.0.127.255 23.46.0.0 0.0.255.255
+ 300 permit ip 151.216.0.0 0.0.127.255 50.16.0.0 0.0.255.255
+ 310 permit ip 151.216.0.0 0.0.127.255 50.17.0.0 0.0.255.255
+ 320 permit ip 151.216.0.0 0.0.127.255 54.225.0.0 0.0.255.255
+ 400 permit ip 151.216.0.0 0.0.127.255 81.21.146.0 0.0.0.255
+ 500 permit ip 151.216.0.0 0.0.127.255 107.20.244.0 0.0.0.255
+ 510 permit ip 151.216.0.0 0.0.127.255 120.29.145.0 0.0.0.255
+ 520 permit ip 151.216.0.0 0.0.127.255 124.40.32.0 0.0.0.255
+ 530 permit ip 151.216.0.0 0.0.127.255 125.56.200.0 0.0.0.255
+ 540 permit ip 151.216.0.0 0.0.127.255 164.177.139.0 0.0.0.255
+ 550 permit ip 151.216.0.0 0.0.127.255 184.73.0.0 0.0.255.255
+ 560 permit ip 151.216.0.0 0.0.127.255 204.236.239.0 0.0.0.255
+ remark STEAM
+ 5100 permit ip 151.216.0.0 0.0.127.255 72.165.61.0 0.0.0.255
+ 5110 permit ip 151.216.0.0 0.0.127.255 81.171.115.0 0.0.0.255
+ 5120 permit ip 151.216.0.0 0.0.127.255 87.248.217.0 0.0.0.255
+ 5300 permit ip 151.216.0.0 0.0.127.255 103.28.54.0 0.0.0.255
+ 5310 permit ip 151.216.0.0 0.0.127.255 146.66.152.0 0.0.0.255
+ 5500 permit ip 151.216.0.0 0.0.127.255 205.185.220.0 0.0.0.255
+ 5510 permit ip 151.216.0.0 0.0.127.255 208.64.200.0 0.0.0.255
+ 5520 permit ip 151.216.0.0 0.0.127.255 209.197.0.0 0.0.255.255
+ 5530 permit ip 151.216.0.0 0.0.127.255 212.187.201.0 0.0.0.255
+ remark NRK-TV
+ 9000 permit ip 151.216.0.0 0.0.127.255 23.8.146.0 0.0.0.255
+ 9010 permit ip 151.216.0.0 0.0.127.255 46.137.77.0 0.0.0.255
+ 9020 permit ip 151.216.0.0 0.0.127.255 50.16.209.0 0.0.0.255
+ 9030 permit ip 151.216.0.0 0.0.127.255 50.16.231.0 0.0.0.255
+ 9040 permit ip 151.216.0.0 0.0.127.255 50.17.243.0 0.0.0.255
+ 9050 permit ip 151.216.0.0 0.0.127.255 54.225.239.0 0.0.0.255
+ 9060 permit ip 151.216.0.0 0.0.127.255 54.243.145.0 0.0.0.255
+ 9070 permit ip 151.216.0.0 0.0.127.255 54.243.68.0 0.0.0.255
+ 9080 permit ip 151.216.0.0 0.0.127.255 65.52.155.0 0.0.0.255
+ 9090 permit ip 151.216.0.0 0.0.127.255 77.88.106.0 0.0.0.255
+ 9100 permit ip 151.216.0.0 0.0.127.255 82.96.58.0 0.0.0.255
+ 9110 permit ip 151.216.0.0 0.0.127.255 94.245.71.0 0.0.0.255
+ 9120 permit ip 151.216.0.0 0.0.127.255 160.68.205.0 0.0.0.255
+ 9130 permit ip 151.216.0.0 0.0.127.255 174.129.219.0 0.0.0.255
+ 9140 permit ip 151.216.0.0 0.0.127.255 184.28.17.0 0.0.0.255
+ 9150 permit ip 151.216.0.0 0.0.127.255 184.73.220.0 0.0.0.255
+ 9160 permit ip 151.216.0.0 0.0.127.255 204.245.63.0 0.0.0.255
+ 9170 permit ip 151.216.0.0 0.0.127.255 204.236.234.0 0.0.0.255
+!
+
+## Cisco route-map
+!!!! telegw;
+!
+route-map nat-madness permit 10
+ match ip address steamorigin
+ set ip next-hop 151.216.0.57
+!
+!
+interface Port-channel2
+ ip policy route-map nat-madness
+!
+interface Port-channel3
+ ip policy route-map nat-madness
+!
+interface TenGigabitEthernet4/4
+ ip policy route-map nat-madness
+!
+
+!!!! nocgw
+!
+route-map nat-madness permit 10
+ match ip address steamorigin
+ set ip next-hop 151.216.125.6
+!
+!
+interface vlan 124
+ ip policy route-map nat-madness
+!
+!
+
diff --git a/mbd/access_list.pl b/mbd/access_list.pl
new file mode 100644
index 0000000..89a8182
--- /dev/null
+++ b/mbd/access_list.pl
@@ -0,0 +1,294 @@
+
+package Config;
+
+sub game_id {
+ my ($data, $offset) = @_;
+ my $id = ((ord(substr($data, $offset, 1)) << 8) | ord(substr($data, $offset + 1, 1)));
+ return $id;
+}
+
+our @access_list = (
+ # half-life - untested (packet dump only)
+ {
+ name => 'Half-Life',
+ ports => [ 27015 ],
+ sizes => [ 16 ]
+ },
+
+ # cs 1.6 - verified
+ # (funker muligens for _alle_ source-spill inkl. hl2/cs:s)
+ {
+ name => 'CS:Source',
+ ports => [ "26900..26903", "27015..27017" ],
+ sizes => [ 25 ],
+ filter => sub { return (game_id(shift, 4) == 0x4325); }
+ },
+ {
+ name => 'Left 4 Dead',
+ ports => [ "26900..26903", "27015..27017" ],
+ sizes => [ 25 ],
+ filter => sub { return (game_id(shift, 4) == 0x43f3); }
+ },
+ {
+ name => 'CS 1.6',
+ ports => [ "26900..26903", "27015..27017" ],
+ sizes => [ 25 ],
+ filter => sub { return (game_id(shift, 4) == 0x5453); }
+ },
+ {
+ name => 'Unknown Source-based game (ID 0x4326)',
+ ports => [ "26900..26903", "27015..27017" ],
+ sizes => [ 25 ],
+ filter => sub { return (game_id(shift, 4) == 0x4326); }
+ },
+ {
+ name => 'Other Source game (unknown game ID)',
+ ports => [ "26900..26903", "27015..27017" ],
+ sizes => [ 25 ],
+ },
+ {
+ name => 'Other Source game (unknown game ID, odd length 33)',
+ ports => [ "26900..26903", "27015..27017" ],
+ sizes => [ 33 ],
+ },
+ {
+ name => 'Other Source game (unknown game ID, odd length 58)',
+ ports => [ "26900..26903", "27015..27017" ],
+ sizes => [ 58 ],
+ },
+ {
+ name => 'Other Source game (unknown game ID, odd length 15)',
+ ports => [ "26900..26903", "27015..27017" ],
+ sizes => [ 15 ],
+ },
+
+ # doom 3 - verified
+ {
+ name => 'Doom 3',
+ ports => [ "27666" ],
+ sizes => [ 14 ]
+ },
+
+ # quake 1 - verified
+ {
+ name => 'Quake 1',
+ ports => [ 26000 ],
+ sizes => [ 12 ]
+ },
+
+ # q3a - tested with demo only
+ # rtcw: enemy territory - untested (packet dump only)
+ {
+ name => 'Quake 3 Arena, RTCW: ET',
+# ports => [ "27960..27969" ],
+ ports => [ "27960..27961" ],
+ sizes => [ 15 ]
+ },
+
+ # bf2 - tested with demo only
+ # bf2142 reportedly uses same engine
+ {
+ name => 'BF2/BF2142',
+ ports => [ "29900" ],
+ sizes => [ 8 ]
+ },
+
+ # bf1942 - unverified (packet dump only)
+ {
+ name => 'BF1942',
+ ports => [ "22000..22010" ],
+ sizes => [ 8 ]
+ },
+
+ # quake 4 - tested with demo only, MUST select "internet"
+ {
+ name => 'Quake 4',
+ ports => [ 27950, 28004 ],
+ sizes => [ 14 ]
+ },
+
+ # quake 2 - untested (packet dump only)
+ {
+ name => 'Quake 2',
+ ports => [ 27910 ],
+ sizes => [ 11 ]
+ },
+
+ # warcraft 3 - untested (packet dump only)
+ {
+ name => 'Warcraft 3: Reign of Chaos (1.00)',
+ ports => [ 6112 ],
+ sizes => [ 16 ],
+ filter => sub { my $data = shift; return (ord(substr($data, 1, 1)) == 0x2f) && game_id($data, 4) == 0x3352 && ord(substr($data, 8, 1)) == 0; }
+ },
+ {
+ name => 'Warcraft 3: Reign of Chaos (1.07)',
+ ports => [ 6112 ],
+ sizes => [ 16 ],
+ filter => sub { my $data = shift; return (ord(substr($data, 1, 1)) == 0x2f) && game_id($data, 4) == 0x3352 && ord(substr($data, 8, 1)) == 7; }
+ },
+ {
+ name => 'Warcraft 3: Reign of Chaos (1.20)',
+ ports => [ 6112 ],
+ sizes => [ 16 ],
+ filter => sub { my $data = shift; return (ord(substr($data, 1, 1)) == 0x2f) && game_id($data, 4) == 0x3352 && ord(substr($data, 8, 1)) == 20; }
+ },
+ {
+ name => 'Warcraft 3: Reign of Chaos (1.22)',
+ ports => [ 6112 ],
+ sizes => [ 16 ],
+ filter => sub { my $data = shift; return (ord(substr($data, 1, 1)) == 0x2f) && game_id($data, 4) == 0x3352 && ord(substr($data, 8, 1)) == 22; }
+ },
+ {
+ name => 'Warcraft 3: Reign of Chaos (1.23)',
+ ports => [ 6112 ],
+ sizes => [ 16 ],
+ filter => sub { my $data = shift; return (ord(substr($data, 1, 1)) == 0x2f) && game_id($data, 4) == 0x3352 && ord(substr($data, 8, 1)) == 23; }
+ },
+ {
+ name => 'Warcraft 3: Reign of Chaos (other patch level)',
+ ports => [ 6112 ],
+ sizes => [ 16 ],
+ filter => sub { my $data = shift; return (ord(substr($data, 1, 1)) == 0x2f) && game_id($data, 4) == 0x3352; }
+ },
+ {
+ name => 'Warcraft 3: The Frozen Throne (1.17)',
+ ports => [ 6112 ],
+ sizes => [ 16 ],
+ filter => sub { my $data = shift; return (ord(substr($data, 1, 1)) == 0x2f) && game_id($data, 4) == 0x5058 && ord(substr($data, 8, 1)) == 17; }
+ },
+ {
+ name => 'Warcraft 3: The Frozen Throne (1.18)',
+ ports => [ 6112 ],
+ sizes => [ 16 ],
+ filter => sub { my $data = shift; return (ord(substr($data, 1, 1)) == 0x2f) && game_id($data, 4) == 0x5058 && ord(substr($data, 8, 1)) == 18; }
+ },
+ {
+ name => 'Warcraft 3: The Frozen Throne (1.20)',
+ ports => [ 6112 ],
+ sizes => [ 16 ],
+ filter => sub { my $data = shift; return (ord(substr($data, 1, 1)) == 0x2f) && game_id($data, 4) == 0x5058 && ord(substr($data, 8, 1)) == 20; }
+ },
+ {
+ name => 'Warcraft 3: The Frozen Throne (1.21)',
+ ports => [ 6112 ],
+ sizes => [ 16 ],
+ filter => sub { my $data = shift; return (ord(substr($data, 1, 1)) == 0x2f) && game_id($data, 4) == 0x5058 && ord(substr($data, 8, 1)) == 21; }
+ },
+ {
+ name => 'Warcraft 3: The Frozen Throne (1.22)',
+ ports => [ 6112 ],
+ sizes => [ 16 ],
+ filter => sub { my $data = shift; return (ord(substr($data, 1, 1)) == 0x2f) && game_id($data, 4) == 0x5058 && ord(substr($data, 8, 1)) == 22; }
+ },
+ {
+ name => 'Warcraft 3: The Frozen Throne (1.23)',
+ ports => [ 6112 ],
+ sizes => [ 16 ],
+ filter => sub { my $data = shift; return (ord(substr($data, 1, 1)) == 0x2f) && game_id($data, 4) == 0x5058 && ord(substr($data, 8, 1)) == 23; }
+ },
+ {
+ name => 'Warcraft 3: The Frozen Throne (1.26)',
+ ports => [ 6112 ],
+ sizes => [ 16 ],
+ filter => sub { my $data = shift; return (ord(substr($data, 1, 1)) == 0x2f) && game_id($data, 4) == 0x5058 && ord(substr($data, 8, 1)) == 26; }
+ },
+ {
+ name => 'Warcraft 3: The Frozen Throne (other patch level)',
+ ports => [ 6112 ],
+ sizes => [ 16 ],
+ filter => sub { my $data = shift; return (ord(substr($data, 1, 1)) == 0x2f) && game_id($data, 4) == 0x5058; }
+ },
+ {
+ name => 'Warcraft 3 (unknown version)',
+# ports => [ "6112..6119" ],
+ ports => [ 6112 ],
+ sizes => [ 16 ],
+ filter => sub { my $data = shift; return (ord(substr($data, 1, 1)) == 0x2f) && game_id($data, 4) != 0x5058 && game_id($data, 4) != 0x3352; }
+ },
+ {
+ name => 'Warcraft 3 (unknown version, odd length)',
+ ports => [ 6112 ],
+ sizes => [ 19 ],
+ },
+
+ # ut2003/ut2004 - untested (packet dump only)
+ {
+ name => 'UT2003/UT2004',
+ ports => [ 10777 ],
+ sizes => [ 5 ]
+ },
+
+ # soldat - untested (packet dump only)
+ {
+ name => 'Soldat',
+ ports => [ 23073 ],
+ sizes => [ 8 ]
+ },
+
+ # starcraft - untested (packet dump only)
+ {
+ name => 'Starcraft',
+ ports => [ 6111, 6112 ],
+ sizes => [ 8 ],
+ filter => sub { return (game_id(shift, 0) == 0x08ef); }
+ },
+ {
+ name => 'Starcraft: Brood War',
+ ports => [ 6111, 6112 ],
+ sizes => [ 8 ],
+ filter => sub { return (game_id(shift, 0) == 0xf733); }
+ },
+ {
+ name => 'Starcraft (unknown game ID)',
+ ports => [ 6111, 6112 ],
+ sizes => [ 8 ],
+ filter => sub { my $id = game_id(shift, 0); return ($id != 0x08ef && $id != 0xf733); }
+ },
+
+ # trackmania nations - untested (packet dump only)
+ {
+ name => 'Trackmania Nations',
+ ports => [ "2350" ],
+ sizes => [ 42, 30 ]
+ },
+
+ # company of heroes - untested (packet dump only)
+ {
+ name => 'Company of Heroes',
+ ports => [ 9100 ],
+ sizes => [ 39 ]
+ },
+
+ # command & conquer 3 - untested (packet dump only, reported to have some kind
+ # of chat functionality)
+# {
+# name => 'Command & Conquer 3',
+# ports => [ "8086..8093" ],
+# sizes => [ 476 ],
+# filter => sub { return 0; }
+# },
+
+ # openttd
+ {
+ name => 'OpenTTD',
+ ports => [ 3979 ],
+ sizes => [ 3 ]
+ },
+
+ # CoD4
+ {
+ name => 'Call of Duty 4',
+ ports => [ 28960 ],
+ sizes => [ 15 ],
+ },
+
+ # Far Cry 2
+ {
+ name => 'Far Cry 2',
+ ports => [ 9004 ],
+ sizes => [ 114, 118, 122, 126 ],
+ },
+
+ # unreal tournament, port 9777?
+)
diff --git a/mbd/derpspan.c b/mbd/derpspan.c
new file mode 100644
index 0000000..b9fb362
--- /dev/null
+++ b/mbd/derpspan.c
@@ -0,0 +1,48 @@
+// gcc -O2 -o derspan derspan.c -lpcap -std=gnu99 -Wall
+
+#include <pcap.h>
+#include <stdlib.h>
+#include <netinet/ip.h>
+#include <stdint.h>
+#include <stdio.h>
+
+int rawsock;
+
+void my_callback(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes)
+{
+ int len = h->caplen;
+ if (len < 40) {
+ //printf("skipped short packet\n");
+ return;
+ }
+ if (bytes[14] != 0x88 || bytes[15] != 0xbe) {
+ //printf("skipped non-ethernet packet\n");
+ return;
+ }
+ if (bytes[36] != 0x08 || bytes[37] != 0x00) {
+ //printf("skipped non-IPv4 packet\n");
+ return;
+ }
+
+ struct sockaddr_in self;
+ self.sin_family = AF_INET;
+ self.sin_addr.s_addr = htonl(0x7f000001); // localhost
+ self.sin_port = htons(1337);
+
+ sendto(rawsock, bytes + 38, len - 38, 0, (struct sockaddr *)&self, sizeof(self));
+}
+
+int main(int argc, char **argv)
+{
+ rawsock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
+ if (rawsock == -1) {
+ perror("socket");
+ exit(0);
+ }
+
+ pcap_t *pcap = pcap_open_live(argv[1], 1500, 1, 1000, NULL);
+ pcap_activate(pcap);
+ pcap_loop(pcap, -1, my_callback, NULL);
+ return 0;
+}
+
diff --git a/mbd/generate-helper-list.pl b/mbd/generate-helper-list.pl
new file mode 100755
index 0000000..fd89475
--- /dev/null
+++ b/mbd/generate-helper-list.pl
@@ -0,0 +1,15 @@
+#! /usr/bin/perl
+use strict;
+use warnings;
+require './access_list.pl';
+require './nets.pl';
+require './mbd.pm';
+
+my @ports = mbd::find_all_ports();
+
+print "no ip forward-protocol udp 137\n";
+print "no ip forward-protocol udp 138\n";
+
+for my $port (@ports) {
+ print "ip forward-protocol udp $port\n";
+}
diff --git a/mbd/make-mbd-nets.pl b/mbd/make-mbd-nets.pl
new file mode 100644
index 0000000..6af76f0
--- /dev/null
+++ b/mbd/make-mbd-nets.pl
@@ -0,0 +1,26 @@
+#!/usr/bin/perl -I /root/tgmanage/
+use strict;
+use warnings;
+
+unless (@ARGV > 0) {
+ print "No arguments. Need netlist.txt.\n";
+ exit 1;
+}
+
+my $n = open(NETLIST, "$ARGV[0]") or die ("Cannot open netlist.txt");
+
+print "# Autogenerated. Do not touch!\n";
+print "package Config;\n";
+print "our \@networks = (\n";
+
+while(<NETLIST>) {
+ next if /^(.*#|\s+$)/; # skip if comment, or blank line
+
+ chomp;
+ my ($network, $prefix, $switchname, undef) = split;
+
+ print "\t\"$network/$prefix\",\n";
+}
+
+print ");\n";
+print "1;\n";
diff --git a/mbd/mbd-unicast-segfaulting.pl b/mbd/mbd-unicast-segfaulting.pl
new file mode 100644
index 0000000..c167511
--- /dev/null
+++ b/mbd/mbd-unicast-segfaulting.pl
@@ -0,0 +1,273 @@
+#! /usr/bin/perl
+use strict;
+use warnings;
+use Socket;
+use Net::CIDR;
+use Net::RawIP;
+use Time::HiRes;
+require './access_list.pl';
+require './nets.pl';
+require './survey.pl';
+require './mbd.pm';
+use lib '../include';
+use nms;
+use strict;
+use warnings;
+use threads;
+
+# Mark packets with DSCP CS7
+my $tos = 56;
+
+my ($dbh, $q);
+
+sub fhbits {
+ my $bits = 0;
+ for my $fh (@_) {
+ vec($bits, fileno($fh), 1) = 1;
+ }
+ return $bits;
+}
+
+# used for rate limiting
+my %last_sent = ();
+
+# for own surveying
+my %active_surveys = ();
+my %last_survey = ();
+
+my %cidrcache = ();
+sub cache_cidrlookup {
+ my ($addr, $net) = @_;
+ my $key = $addr . " " . $net;
+
+ if (!exists($cidrcache{$key})) {
+ $cidrcache{$key} = Net::CIDR::cidrlookup($addr, $net);
+ }
+ return $cidrcache{$key};
+}
+
+my %rangecache = ();
+sub cache_cidrrange {
+ my ($net) = @_;
+
+ if (!exists($rangecache{$net})) {
+ my ($range) = Net::CIDR::cidr2range($net);
+ $range =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)-(\d+)\.(\d+)\.(\d+)\.(\d+)/ or die "Did not understand range: $range";
+ my @range = ();
+ for my $l (($4+1)..($8-1)) {
+ push @range, "$1.$2.$3.$l";
+ }
+ ($rangecache{$net}) = \@range;
+ }
+
+ return @{$rangecache{$net}};
+}
+
+open LOG, ">>", "mbd.log";
+
+my @ports = ( mbd::find_all_ports() , $Config::survey_port_low .. $Config::survey_port_high );
+
+# Open a socket for each port
+my @socks = ();
+my $udp = getprotobyname("udp");
+for my $p (@ports) {
+ my $sock;
+ socket($sock, PF_INET, SOCK_DGRAM, $udp);
+ bind($sock, sockaddr_in($p, INADDR_ANY));
+ push @socks, $sock;
+}
+
+my $sendsock = Net::RawIP->new({udp => {}});
+
+print "Listening on " . scalar @ports . " ports.\n";
+
+# Main loop
+while (1) {
+ my $rin = fhbits(@socks);
+ my $rout;
+
+ my $nfound = select($rout=$rin, undef, undef, undef);
+ my $now = [Time::HiRes::gettimeofday];
+
+ # First of all, close any surveys that are due.
+ for my $sport (keys %active_surveys) {
+ my $age = Time::HiRes::tv_interval($active_surveys{$sport}{start}, $now);
+ if ($age > $Config::survey_time && $active_surveys{$sport}{active}) {
+ my $hexdump = join(' ', map { sprintf "0x%02x", ord($_) } (split //, $active_surveys{$sport}{data}));
+ print "Survey ($hexdump) for '" . $Config::access_list[$active_surveys{$sport}{entry}]->{name} . "'/" .
+ $active_surveys{$sport}{dport} . ": " . $active_surveys{$sport}{num} . " active servers.\n";
+ $active_surveys{$sport}{active} = 0;
+
+ # (re)connect to the database if needed
+ if (!defined($dbh) || !$dbh->ping) {
+ $dbh = nms::db_connect();
+ $q = $dbh->prepare("INSERT INTO mbd_log (ts,game,port,description,active_servers) VALUES (CURRENT_TIMESTAMP,?,?,?,?)")
+ or die "Couldn't prepare query";
+ }
+ $q->execute($active_surveys{$sport}{entry}, $active_surveys{$sport}{dport}, $Config::access_list[$active_surveys{$sport}{entry}]->{name}, $active_surveys{$sport}{num});
+ }
+ if ($age > $Config::survey_time * 3.0) {
+ delete $active_surveys{$sport};
+ }
+ }
+
+ for my $sock (@socks) {
+ next unless (vec($rout, fileno($sock), 1) == 1);
+
+ my $data;
+ my $addr = recv($sock, $data, 8192, 0); # jumbo broadcast! :-P
+ my ($sport, $saddr) = sockaddr_in($addr);
+ my ($dport, $daddr) = sockaddr_in(getsockname($sock));
+ my $size = length($data);
+
+ # Check if this is a survey reply
+ if ($dport >= $Config::survey_port_low && $dport <= $Config::survey_port_high) {
+ if (!exists($active_surveys{$dport})) {
+ print "WARNING: Unknown survey port $dport, ignoring\n";
+ next;
+ }
+ if (!$active_surveys{$dport}{active}) {
+ # remains
+ next;
+ }
+
+ ++$active_surveys{$dport}{num};
+
+ next;
+ }
+
+ # Rate limiting
+ if (exists($last_sent{$saddr}{$dport})) {
+ my $elapsed = Time::HiRes::tv_interval($last_sent{$saddr}{$dport}, $now);
+ if ($elapsed < 1.0) {
+ print LOG "$dport $size 2\n";
+ print inet_ntoa($saddr), ", $dport, $size bytes => rate-limited ($elapsed secs since last)\n";
+ next;
+ }
+ }
+
+ # We don't get the packet's destination address, but I guess this should do...
+ # Check against the ACL.
+ my $pass = 0;
+ my $entry = -1;
+ for my $rule (@Config::access_list) {
+ ++$entry;
+
+ next unless (mbd::match_ranges($dport, $rule->{'ports'}));
+ next unless (mbd::match_ranges($size, $rule->{'sizes'}));
+
+ if ($rule->{'filter'}) {
+ next unless ($rule->{'filter'}($data));
+ }
+
+ $pass = 1;
+ last;
+ }
+
+ print LOG "$dport $size $pass\n";
+
+ if (!$pass) {
+ print inet_ntoa($saddr), ", $dport, $size bytes => filtered\n";
+ next;
+ }
+
+ $last_sent{$saddr}{$dport} = $now;
+
+ # The packet is OK! Do we already have a recent enough survey
+ # for this port, or should we use this packet?
+ my $survey = 1;
+ if (exists($last_survey{$entry . "/" . $dport})) {
+ my $age = Time::HiRes::tv_interval($last_survey{$entry . "/" . $dport}, $now);
+ if ($age < $Config::survey_freq) {
+ $survey = 0;
+ }
+ }
+
+ # New survey; find an unused port
+ my $survey_sport;
+ if ($survey) {
+ for my $port ($Config::survey_port_low..$Config::survey_port_high) {
+ if (!exists($active_surveys{$port})) {
+ $survey_sport = $port;
+
+ $active_surveys{$port} = {
+ start => $now,
+ active => 1,
+ dport => $dport,
+ entry => $entry,
+ num => 0,
+ data => $data,
+ };
+ $last_survey{$entry . "/" . $dport} = $now;
+
+ last;
+ }
+ }
+
+ if (!defined($survey_sport)) {
+ print "WARNING: no free survey source ports, not surveying.\n";
+ $survey = 0;
+ }
+ }
+
+ # precache
+ for my $net (@Config::networks) {
+ cache_cidrrange($net);
+ cache_cidrlookup(inet_ntoa($saddr), $net);
+ }
+
+ threads->create(sub {
+ my $sendsock = Net::RawIP->new({udp => {}});
+ my ($survey_sport, $dport, $data) = @_;
+
+ my $num_nets = 0;
+ for my $net (@Config::networks) {
+ my @daddrs = cache_cidrrange($net);
+
+ if ($survey) {
+ for my $daddr (@daddrs) {
+ $sendsock->set({
+ ip => {
+ saddr => $Config::survey_ip,
+ daddr => $daddr,
+ tos => $tos
+ },
+ udp => {
+ source => $survey_sport,
+ dest => $dport,
+ data => $data
+ }
+ });
+ $sendsock->send;
+ }
+ }
+
+ next if (cache_cidrlookup(inet_ntoa($saddr), $net));
+
+ for my $daddr (@daddrs) {
+ $sendsock->set({
+ ip => {
+ saddr => inet_ntoa($saddr),
+ daddr => $daddr,
+ tos => $tos
+ },
+ udp => {
+ source => $sport,
+ dest => $dport,
+ data => $data
+ }
+ });
+ $sendsock->send;
+ }
+
+ ++$num_nets;
+ }
+ if ($survey) {
+ print inet_ntoa($saddr), ", $dport, $size bytes => ($num_nets networks) [+survey from port $survey_sport]\n";
+ } else {
+ print inet_ntoa($saddr), ", $dport, $size bytes => ($num_nets networks)\n";
+ }
+ }, $survey_sport, $dport, $data)->detach();
+ }
+}
+
diff --git a/mbd/mbd-unicast.pl b/mbd/mbd-unicast.pl
new file mode 100644
index 0000000..6e63dee
--- /dev/null
+++ b/mbd/mbd-unicast.pl
@@ -0,0 +1,254 @@
+#! /usr/bin/perl
+use strict;
+use warnings;
+use Socket;
+use Net::CIDR;
+use Net::RawIP;
+use Time::HiRes;
+require './access_list.pl';
+require './nets.pl';
+require './survey.pl';
+require './mbd.pm';
+use lib '../include';
+use nms;
+use strict;
+use warnings;
+use threads;
+
+# Mark packets with DSCP CS7
+my $tos = 56;
+
+my ($dbh, $q);
+
+sub fhbits {
+ my $bits = 0;
+ for my $fh (@_) {
+ vec($bits, fileno($fh), 1) = 1;
+ }
+ return $bits;
+}
+
+# used for rate limiting
+my %last_sent = ();
+
+# for own surveying
+my %active_surveys = ();
+my %last_survey = ();
+
+my %cidrcache = ();
+sub cache_cidrlookup {
+ my ($addr, $net) = @_;
+ my $key = $addr . " " . $net;
+
+ if (!exists($cidrcache{$key})) {
+ $cidrcache{$key} = Net::CIDR::cidrlookup($addr, $net);
+ }
+ return $cidrcache{$key};
+}
+
+my %rangecache = ();
+sub cache_cidrrange {
+ my ($net) = @_;
+
+ if (!exists($rangecache{$net})) {
+ my ($range) = Net::CIDR::cidr2range($net);
+ $range =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)-(\d+)\.(\d+)\.(\d+)\.(\d+)/ or die "Did not understand range: $range";
+ my @range = ();
+ for my $l (($4+1)..($8-1)) {
+ push @range, "$1.$2.$3.$l";
+ }
+ ($rangecache{$net}) = \@range;
+ }
+
+ return @{$rangecache{$net}};
+}
+
+open LOG, ">>", "mbd.log";
+
+my @ports = ( mbd::find_all_ports() , $Config::survey_port_low .. $Config::survey_port_high );
+
+# Open a socket for each port
+my @socks = ();
+my $udp = getprotobyname("udp");
+for my $p (@ports) {
+ my $sock;
+ socket($sock, PF_INET, SOCK_DGRAM, $udp);
+ bind($sock, sockaddr_in($p, INADDR_ANY));
+ push @socks, $sock;
+}
+
+my $sendsock = Net::RawIP->new({udp => {}});
+
+print "Listening on " . scalar @ports . " ports.\n";
+
+open PKTS, "| ./packetpusher"
+ or die "./packetpusher: $!";
+
+# Main loop
+while (1) {
+ my $rin = fhbits(@socks);
+ my $rout;
+
+ my $nfound = select($rout=$rin, undef, undef, undef);
+ my $now = [Time::HiRes::gettimeofday];
+
+ # First of all, close any surveys that are due.
+ for my $sport (keys %active_surveys) {
+ my $age = Time::HiRes::tv_interval($active_surveys{$sport}{start}, $now);
+ if ($age > $Config::survey_time && $active_surveys{$sport}{active}) {
+ my $hexdump = join(' ', map { sprintf "0x%02x", ord($_) } (split //, $active_surveys{$sport}{data}));
+ print "Survey ($hexdump) for '" . $Config::access_list[$active_surveys{$sport}{entry}]->{name} . "'/" .
+ $active_surveys{$sport}{dport} . ": " . $active_surveys{$sport}{num} . " active servers.\n";
+ $active_surveys{$sport}{active} = 0;
+
+ # (re)connect to the database if needed
+ if (!defined($dbh) || !$dbh->ping) {
+ $dbh = nms::db_connect();
+ $q = $dbh->prepare("INSERT INTO mbd_log (ts,game,port,description,active_servers) VALUES (CURRENT_TIMESTAMP,?,?,?,?)")
+ or die "Couldn't prepare query";
+ }
+ $q->execute($active_surveys{$sport}{entry}, $active_surveys{$sport}{dport}, $Config::access_list[$active_surveys{$sport}{entry}]->{name}, $active_surveys{$sport}{num});
+ }
+ if ($age > $Config::survey_time * 3.0) {
+ delete $active_surveys{$sport};
+ }
+ }
+
+ for my $sock (@socks) {
+ next unless (vec($rout, fileno($sock), 1) == 1);
+
+ my $data;
+ my $addr = recv($sock, $data, 8192, 0); # jumbo broadcast! :-P
+ my ($sport, $saddr) = sockaddr_in($addr);
+ my ($dport, $daddr) = sockaddr_in(getsockname($sock));
+ my $size = length($data);
+
+ # Check if this is a survey reply
+ if ($dport >= $Config::survey_port_low && $dport <= $Config::survey_port_high) {
+ if (!exists($active_surveys{$dport})) {
+ print "WARNING: Unknown survey port $dport, ignoring\n";
+ next;
+ }
+ if (!$active_surveys{$dport}{active}) {
+ # remains
+ next;
+ }
+
+ ++$active_surveys{$dport}{num};
+
+ next;
+ }
+
+ # Rate limiting
+ if (exists($last_sent{$saddr}{$dport})) {
+ my $elapsed = Time::HiRes::tv_interval($last_sent{$saddr}{$dport}, $now);
+ if ($elapsed < 1.0) {
+ print LOG "$dport $size 2\n";
+ print inet_ntoa($saddr), ", $dport, $size bytes => rate-limited ($elapsed secs since last)\n";
+ next;
+ }
+ }
+
+ # We don't get the packet's destination address, but I guess this should do...
+ # Check against the ACL.
+ my $pass = 0;
+ my $entry = -1;
+ for my $rule (@Config::access_list) {
+ ++$entry;
+
+ next unless (mbd::match_ranges($dport, $rule->{'ports'}));
+ next unless (mbd::match_ranges($size, $rule->{'sizes'}));
+
+ if ($rule->{'filter'}) {
+ next unless ($rule->{'filter'}($data));
+ }
+
+ $pass = 1;
+ last;
+ }
+
+ print LOG "$dport $size $pass\n";
+
+ if (!$pass) {
+ print inet_ntoa($saddr), ", $dport, $size bytes => filtered\n";
+ next;
+ }
+
+ $last_sent{$saddr}{$dport} = $now;
+
+ # The packet is OK! Do we already have a recent enough survey
+ # for this port, or should we use this packet?
+ my $survey = 1;
+ if (exists($last_survey{$entry . "/" . $dport})) {
+ my $age = Time::HiRes::tv_interval($last_survey{$entry . "/" . $dport}, $now);
+ if ($age < $Config::survey_freq) {
+ $survey = 0;
+ }
+ }
+
+ # New survey; find an unused port
+ my $survey_sport;
+ if ($survey) {
+ for my $port ($Config::survey_port_low..$Config::survey_port_high) {
+ if (!exists($active_surveys{$port})) {
+ $survey_sport = $port;
+
+ $active_surveys{$port} = {
+ start => $now,
+ active => 1,
+ dport => $dport,
+ entry => $entry,
+ num => 0,
+ data => $data,
+ };
+ $last_survey{$entry . "/" . $dport} = $now;
+
+ last;
+ }
+ }
+
+ if (!defined($survey_sport)) {
+ print "WARNING: no free survey source ports, not surveying.\n";
+ $survey = 0;
+ }
+ }
+
+ # precache
+ for my $net (@Config::networks) {
+ cache_cidrrange($net);
+ cache_cidrlookup(inet_ntoa($saddr), $net);
+ }
+
+ my @packets = ();
+
+ my $num_nets = 0;
+ for my $net (@Config::networks) {
+ my @daddrs = cache_cidrrange($net);
+
+ if ($survey) {
+ for my $daddr (@daddrs) {
+ push @packets, [ $Config::survey_ip, $survey_sport, $daddr, $dport ];
+ }
+ }
+
+ next if (cache_cidrlookup(inet_ntoa($saddr), $net));
+
+ for my $daddr (@daddrs) {
+ push @packets, [ inet_ntoa($saddr), $sport, $daddr, $dport ];
+ }
+
+ ++$num_nets;
+ }
+ if ($survey) {
+ print inet_ntoa($saddr), ", $dport, $size bytes => ($num_nets networks) [+survey from port $survey_sport]\n";
+ } else {
+ print inet_ntoa($saddr), ", $dport, $size bytes => ($num_nets networks)\n";
+ }
+
+ printf PKTS "%d %s\n", scalar @packets, unpack('h*', $data);
+ for my $pkt (@packets) {
+ printf PKTS "%s %s %s %s\n", $pkt->[0], $pkt->[1], $pkt->[2], $pkt->[3];
+ }
+ }
+}
+
diff --git a/mbd/mbd.pl b/mbd/mbd.pl
new file mode 100644
index 0000000..065e76c
--- /dev/null
+++ b/mbd/mbd.pl
@@ -0,0 +1,254 @@
+#! /usr/bin/perl
+use strict;
+use warnings;
+use Socket;
+use Net::CIDR;
+use Net::RawIP;
+use Time::HiRes;
+require './access_list.pl';
+require './nets.pl';
+require './survey.pl';
+require './mbd.pm';
+use lib '../include';
+use nms;
+use strict;
+use warnings;
+
+# Mark packets with DSCP CS7
+my $tos = 56;
+
+my ($dbh, $q);
+
+sub fhbits {
+ my $bits = 0;
+ for my $fh (@_) {
+ vec($bits, fileno($fh), 1) = 1;
+ }
+ return $bits;
+}
+
+# used for rate limiting
+my %last_sent = ();
+
+# for own surveying
+my %active_surveys = ();
+my %last_survey = ();
+
+my %cidrcache = ();
+sub cache_cidrlookup {
+ my ($addr, $net) = @_;
+ my $key = $addr . " " . $net;
+
+ if (!exists($cidrcache{$key})) {
+ $cidrcache{$key} = Net::CIDR::cidrlookup($addr, $net);
+ }
+ return $cidrcache{$key};
+}
+
+my %rangecache = ();
+sub cache_cidrrange {
+ my ($net) = @_;
+
+ if (!exists($rangecache{$net})) {
+ ($rangecache{$net}) = Net::CIDR::cidr2range($net);
+ }
+
+ return $rangecache{$net};
+}
+
+open LOG, ">>", "mbd.log";
+
+my @ports = ( mbd::find_all_ports() , $Config::survey_port_low .. $Config::survey_port_high );
+
+# Open a socket for each port
+my @socks = ();
+my $udp = getprotobyname("udp");
+for my $p (@ports) {
+ my $sock;
+ socket($sock, PF_INET, SOCK_DGRAM, $udp);
+ bind($sock, sockaddr_in($p, INADDR_ANY));
+ push @socks, $sock;
+}
+
+my $sendsock = Net::RawIP->new({udp => {}});
+
+print "Listening on " . scalar @ports . " ports.\n";
+
+# Main loop
+while (1) {
+ my $rin = fhbits(@socks);
+ my $rout;
+
+ my $nfound = select($rout=$rin, undef, undef, undef);
+ my $now = [Time::HiRes::gettimeofday];
+
+ # First of all, close any surveys that are due.
+ for my $sport (keys %active_surveys) {
+ my $age = Time::HiRes::tv_interval($active_surveys{$sport}{start}, $now);
+ if ($age > $Config::survey_time && $active_surveys{$sport}{active}) {
+ my $hexdump = join(' ', map { sprintf "0x%02x", ord($_) } (split //, $active_surveys{$sport}{data}));
+ print "Survey ($hexdump) for '" . $Config::access_list[$active_surveys{$sport}{entry}]->{name} . "'/" .
+ $active_surveys{$sport}{dport} . ": " . $active_surveys{$sport}{num} . " active servers.\n";
+ $active_surveys{$sport}{active} = 0;
+
+ # (re)connect to the database if needed
+ if (!defined($dbh) || !$dbh->ping) {
+ $dbh = nms::db_connect();
+ $q = $dbh->prepare("INSERT INTO mbd_log (ts,game,port,description,active_servers) VALUES (CURRENT_TIMESTAMP,?,?,?,?)")
+ or die "Couldn't prepare query";
+ }
+ $q->execute($active_surveys{$sport}{entry}, $active_surveys{$sport}{dport}, $Config::access_list[$active_surveys{$sport}{entry}]->{name}, $active_surveys{$sport}{num});
+ }
+ if ($age > $Config::survey_time * 3.0) {
+ delete $active_surveys{$sport};
+ }
+ }
+
+ for my $sock (@socks) {
+ next unless (vec($rout, fileno($sock), 1) == 1);
+
+ my $data;
+ my $addr = recv($sock, $data, 8192, 0); # jumbo broadcast! :-P
+ my ($sport, $saddr) = sockaddr_in($addr);
+ my ($dport, $daddr) = sockaddr_in(getsockname($sock));
+ my $size = length($data);
+
+ # Check if this is a survey reply
+ if ($dport >= $Config::survey_port_low && $dport <= $Config::survey_port_high) {
+ if (!exists($active_surveys{$dport})) {
+ print "WARNING: Unknown survey port $dport, ignoring\n";
+ next;
+ }
+ if (!$active_surveys{$dport}{active}) {
+ # remains
+ next;
+ }
+
+ ++$active_surveys{$dport}{num};
+
+ next;
+ }
+
+ # Rate limiting
+ if (exists($last_sent{$saddr}{$dport})) {
+ my $elapsed = Time::HiRes::tv_interval($last_sent{$saddr}{$dport}, $now);
+ if ($elapsed < 1.0) {
+ print LOG "$dport $size 2\n";
+ print inet_ntoa($saddr), ", $dport, $size bytes => rate-limited ($elapsed secs since last)\n";
+ next;
+ }
+ }
+
+ # We don't get the packet's destination address, but I guess this should do...
+ # Check against the ACL.
+ my $pass = 0;
+ my $entry = -1;
+ for my $rule (@Config::access_list) {
+ ++$entry;
+
+ next unless (mbd::match_ranges($dport, $rule->{'ports'}));
+ next unless (mbd::match_ranges($size, $rule->{'sizes'}));
+
+ if ($rule->{'filter'}) {
+ next unless ($rule->{'filter'}($data));
+ }
+
+ $pass = 1;
+ last;
+ }
+
+ print LOG "$dport $size $pass\n";
+
+ if (!$pass) {
+ print inet_ntoa($saddr), ", $dport, $size bytes => filtered\n";
+ next;
+ }
+
+ $last_sent{$saddr}{$dport} = $now;
+
+ # The packet is OK! Do we already have a recent enough survey
+ # for this port, or should we use this packet?
+ my $survey = 1;
+ if (exists($last_survey{$entry . "/" . $dport})) {
+ my $age = Time::HiRes::tv_interval($last_survey{$entry . "/" . $dport}, $now);
+ if ($age < $Config::survey_freq) {
+ $survey = 0;
+ }
+ }
+
+ # New survey; find an unused port
+ my $survey_sport;
+ if ($survey) {
+ for my $port ($Config::survey_port_low..$Config::survey_port_high) {
+ if (!exists($active_surveys{$port})) {
+ $survey_sport = $port;
+
+ $active_surveys{$port} = {
+ start => $now,
+ active => 1,
+ dport => $dport,
+ entry => $entry,
+ num => 0,
+ data => $data,
+ };
+ $last_survey{$entry . "/" . $dport} = $now;
+
+ last;
+ }
+ }
+
+ if (!defined($survey_sport)) {
+ print "WARNING: no free survey source ports, not surveying.\n";
+ $survey = 0;
+ }
+ }
+
+ my $num_nets = 0;
+ for my $net (@Config::networks) {
+ my ($range) = cache_cidrrange($net);
+ $range =~ /-(.*?)$/;
+ my $broadcast = $1;
+
+ if ($survey) {
+ $sendsock->set({
+ ip => {
+ saddr => $Config::survey_ip,
+ daddr => $broadcast,
+ tos => $tos
+ },
+ udp => {
+ source => $survey_sport,
+ dest => $dport,
+ data => $data
+ }
+ });
+ $sendsock->send;
+ }
+
+ next if (cache_cidrlookup(inet_ntoa($saddr), $net));
+
+ $sendsock->set({
+ ip => {
+ saddr => inet_ntoa($saddr),
+ daddr => $broadcast,
+ tos => $tos
+ },
+ udp => {
+ source => $sport,
+ dest => $dport,
+ data => $data
+ }
+ });
+ $sendsock->send;
+
+ ++$num_nets;
+ }
+
+ if ($survey) {
+ print inet_ntoa($saddr), ", $dport, $size bytes => ($num_nets networks) [+survey from port $survey_sport]\n";
+ } else {
+ print inet_ntoa($saddr), ", $dport, $size bytes => ($num_nets networks)\n";
+ }
+ }
+}
+
diff --git a/mbd/mbd.pm b/mbd/mbd.pm
new file mode 100644
index 0000000..b844e5b
--- /dev/null
+++ b/mbd/mbd.pm
@@ -0,0 +1,50 @@
+#! /usr/bin/perl
+use strict;
+use warnings;
+use Socket;
+use Net::CIDR;
+use Net::RawIP;
+require './access_list.pl';
+require './nets.pl';
+
+package mbd;
+
+sub expand_range {
+ my $range = shift;
+
+ if ($range =~ /^(\d+)\.\.(\d+)$/) {
+ return $1..$2;
+ } else {
+ return $range;
+ }
+}
+
+sub match_ranges {
+ my ($elem, $ranges) = @_;
+
+ for my $range (@$ranges) {
+ if ($range =~ /^(\d+)\.\.(\d+)$/) {
+ return 1 if ($elem >= $1 && $elem <= $2);
+ } else {
+ return 1 if ($elem == $range);
+ }
+ }
+
+ return 0;
+}
+
+sub find_all_ports {
+ # Find what ports we need to listen on
+ my %port_hash = ();
+ for my $e (@Config::access_list) {
+ for my $r (@{$e->{'ports'}}) {
+ for my $p (expand_range($r)) {
+ $port_hash{$p} = 1;
+ }
+ }
+ }
+ my @ports = sort { $a <=> $b } keys %port_hash;
+ return @ports;
+}
+
+1;
diff --git a/mbd/nets.pl b/mbd/nets.pl
new file mode 100644
index 0000000..3298657
--- /dev/null
+++ b/mbd/nets.pl
@@ -0,0 +1,171 @@
+# Autogenerated. Do not touch!
+package Config;
+our @networks = (
+ "176.110.98.0/24",
+ "176.110.99.0/24",
+ "176.110.100.0/24",
+ "176.110.102.0/24",
+ "176.110.103.0/24",
+ "176.110.106.0/24",
+ "176.110.107.0/24",
+ "176.110.108.0/22",
+ "176.110.112.0/24",
+ "176.110.113.0/24",
+ "176.110.114.0/24",
+ "176.110.115.0/24",
+ "176.110.116.0/24",
+ "176.110.117.0/24",
+ "176.110.118.0/24",
+ "176.110.119.0/24",
+ "176.110.120.0/24",
+ "176.110.121.0/24",
+ "176.110.122.0/24",
+ "176.110.123.0/24",
+ "176.110.124.0/24",
+ "176.110.126.0/24",
+ "176.110.2.0/25",
+ "176.110.2.128/25",
+ "176.110.4.0/25",
+ "176.110.4.128/25",
+ "176.110.6.0/25",
+ "176.110.6.128/25",
+ "176.110.8.0/25",
+ "176.110.8.128/25",
+ "176.110.10.0/25",
+ "176.110.10.128/25",
+ "176.110.11.0/25",
+ "176.110.11.128/25",
+ "176.110.12.0/25",
+ "176.110.12.128/25",
+ "176.110.13.0/25",
+ "176.110.13.128/25",
+ "176.110.14.0/25",
+ "176.110.14.128/25",
+ "176.110.15.0/25",
+ "176.110.15.128/25",
+ "176.110.16.0/25",
+ "176.110.16.128/25",
+ "176.110.17.0/25",
+ "176.110.17.128/25",
+ "176.110.18.0/25",
+ "176.110.18.128/25",
+ "176.110.19.0/25",
+ "176.110.19.128/25",
+ "176.110.20.0/25",
+ "176.110.20.128/25",
+ "176.110.21.0/25",
+ "176.110.21.128/25",
+ "176.110.22.0/25",
+ "176.110.22.128/25",
+ "176.110.23.0/25",
+ "176.110.23.128/25",
+ "176.110.24.0/25",
+ "176.110.24.128/25",
+ "176.110.25.0/25",
+ "176.110.25.128/25",
+ "176.110.26.0/25",
+ "176.110.26.128/25",
+ "176.110.27.0/25",
+ "176.110.27.128/25",
+ "176.110.29.0/25",
+ "176.110.29.128/25",
+ "176.110.31.0/25",
+ "176.110.31.128/25",
+ "176.110.33.0/25",
+ "176.110.33.128/25",
+ "176.110.35.0/25",
+ "176.110.35.128/25",
+ "176.110.37.0/25",
+ "176.110.37.128/25",
+ "176.110.39.0/25",
+ "176.110.39.128/25",
+ "176.110.41.0/25",
+ "176.110.41.128/25",
+ "176.110.43.0/25",
+ "176.110.43.128/25",
+ "176.110.44.0/25",
+ "176.110.44.128/25",
+ "176.110.45.0/25",
+ "176.110.45.128/25",
+ "176.110.46.0/25",
+ "176.110.46.128/25",
+ "176.110.47.0/25",
+ "176.110.47.128/25",
+ "176.110.48.0/25",
+ "176.110.48.128/25",
+ "176.110.49.0/25",
+ "176.110.49.128/25",
+ "176.110.50.0/25",
+ "176.110.50.128/25",
+ "176.110.51.0/25",
+ "176.110.51.128/25",
+ "176.110.52.0/25",
+ "176.110.52.128/25",
+ "176.110.53.0/25",
+ "176.110.53.128/25",
+ "176.110.54.0/25",
+ "176.110.54.128/25",
+ "176.110.55.0/25",
+ "176.110.55.128/25",
+ "176.110.56.0/25",
+ "176.110.56.128/25",
+ "176.110.57.0/25",
+ "176.110.57.128/25",
+ "176.110.58.0/25",
+ "176.110.58.128/25",
+ "176.110.59.0/25",
+ "176.110.59.128/25",
+ "176.110.60.0/25",
+ "176.110.60.128/25",
+ "176.110.61.0/25",
+ "176.110.61.128/25",
+ "176.110.62.0/25",
+ "176.110.62.128/25",
+ "176.110.63.0/25",
+ "176.110.63.128/25",
+ "176.110.64.0/25",
+ "176.110.64.128/25",
+ "176.110.65.0/25",
+ "176.110.65.128/25",
+ "176.110.66.0/25",
+ "176.110.66.128/25",
+ "176.110.67.0/25",
+ "176.110.67.128/25",
+ "176.110.68.0/25",
+ "176.110.68.128/25",
+ "176.110.69.0/25",
+ "176.110.69.128/25",
+ "176.110.70.0/25",
+ "176.110.70.128/25",
+ "176.110.71.0/25",
+ "176.110.71.128/25",
+ "176.110.72.0/25",
+ "176.110.72.128/25",
+ "176.110.73.0/25",
+ "176.110.73.128/25",
+ "176.110.74.0/25",
+ "176.110.74.128/25",
+ "176.110.75.0/25",
+ "176.110.75.128/25",
+ "176.110.76.0/25",
+ "176.110.76.128/25",
+ "176.110.77.0/25",
+ "176.110.77.128/25",
+ "176.110.79.0/25",
+ "176.110.79.128/25",
+ "176.110.81.0/25",
+ "176.110.81.128/25",
+ "176.110.83.0/25",
+ "176.110.83.128/25",
+ "176.110.84.0/25",
+ "176.110.84.128/25",
+ "176.110.85.0/25",
+ "176.110.85.128/25",
+ "176.110.86.0/25",
+ "176.110.86.128/25",
+ "176.110.87.0/25",
+ "176.110.87.128/25",
+ "176.110.88.0/25",
+ "176.110.88.128/25",
+);
+1;
diff --git a/mbd/packetpusher.c b/mbd/packetpusher.c
new file mode 100644
index 0000000..c21a084
--- /dev/null
+++ b/mbd/packetpusher.c
@@ -0,0 +1,127 @@
+#include <stdio.h>
+#include <sys/socket.h>
+#include <stdlib.h>
+#include <string.h>
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#include <netinet/udp.h>
+#include <stdint.h>
+#include <arpa/inet.h>
+
+char encoded_pkt[4096], workspace[4096];
+unsigned char pkt[2048];
+
+typedef uint32_t u_int32_t;
+
+u_int32_t checksum(unsigned char *buf, unsigned nbytes, u_int32_t sum)
+{
+ int i;
+ /* Checksum all the pairs of bytes first... */
+ for (i = 0; i < (nbytes & ~1U); i += 2) {
+ sum += (u_int16_t)ntohs(*((u_int16_t *)(buf + i)));
+ if (sum > 0xFFFF)
+ sum -= 0xFFFF;
+ }
+
+ /*
+ * If there's a single byte left over, checksum it, too.
+ * Network byte order is big-endian, so the remaining byte is
+ * the high byte.
+ */
+
+ if (i < nbytes) {
+ sum += buf[i] << 8;
+ if (sum > 0xFFFF)
+ sum -= 0xFFFF;
+ }
+
+ return (sum);
+}
+
+u_int32_t wrapsum(u_int32_t sum)
+{
+ sum = ~sum & 0xFFFF;
+ return (htons(sum));
+}
+
+int main(int argc, char **argv)
+{
+ int sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
+ if (sock == -1) {
+ perror("socket");
+ exit(1);
+ }
+
+ for ( ;; ) {
+ int num_pkts;
+ int ret = scanf("%d %s", &num_pkts, encoded_pkt);
+ if (ret != 2) {
+ fprintf(stderr, "error parsing! ret=%d\n", ret);
+ exit(1);
+ }
+ if ((strlen(encoded_pkt) % 2) != 0) {
+ fprintf(stderr, "hex packet has odd length\n");
+ exit(1);
+ }
+
+ // de-hex packet
+ for (int i = 0; i < strlen(encoded_pkt); i += 2) {
+ char c[3];
+ c[0] = encoded_pkt[i];
+ c[1] = encoded_pkt[i + 1];
+ c[2] = 0;
+ int h = strtol(c, NULL, 16);
+ pkt[i / 2] = h;
+ }
+
+ int datalen = strlen(encoded_pkt) / 2;
+
+ for (int i = 0; i < num_pkts; ++i) {
+ char from_ip[256], to_ip[256];
+ int sport, dport;
+ if (scanf("%s %d %s %d", from_ip, &sport, to_ip, &dport) != 4) {
+ fprintf(stderr, "error parsing packet %d!\n", i);
+ exit(1);
+ }
+
+ // IP header
+ struct iphdr *ip = (struct iphdr *)workspace;
+ ip->version = 4;
+ ip->ihl = 5;
+ ip->tos = 0;
+ ip->tot_len = htons(datalen + sizeof(struct iphdr) + sizeof(struct udphdr));
+ ip->id = 0;
+ ip->frag_off = 0;
+ ip->ttl = 64;
+ ip->protocol = 17; // UDP
+ ip->saddr = inet_addr(from_ip);
+ ip->daddr = inet_addr(to_ip);
+ ip->check = 0;
+ ip->check = wrapsum(checksum((unsigned char *)ip, sizeof(*ip), 0));
+
+ // UDP header
+ struct udphdr *udp = (struct udphdr *)(workspace + sizeof(struct iphdr));
+ udp->source = htons(sport);
+ udp->dest = htons(dport);
+ udp->len = htons(datalen + sizeof(struct udphdr));
+ udp->check = 0;
+
+ int sum = checksum((unsigned char *)&ip->saddr, 2 * sizeof(ip->saddr), IPPROTO_UDP + ntohs(udp->len));
+ sum = checksum((unsigned char *)pkt, datalen, sum);
+ sum = checksum((unsigned char *)udp, sizeof(*udp), sum);
+ udp->check = wrapsum(sum);
+
+ // Data
+ memcpy(workspace + sizeof(struct iphdr) + sizeof(struct udphdr),
+ pkt, datalen);
+
+ // Send out the packet physically
+ struct sockaddr_in to;
+ to.sin_family = AF_INET;
+ to.sin_addr.s_addr = inet_addr(to_ip);
+ to.sin_port = htons(dport);
+
+ sendto(sock, workspace, ntohs(ip->tot_len), 0, (struct sockaddr *)&to, sizeof(to));
+ }
+ }
+}
diff --git a/mbd/survey.pl b/mbd/survey.pl
new file mode 100644
index 0000000..be33038
--- /dev/null
+++ b/mbd/survey.pl
@@ -0,0 +1,10 @@
+package Config;
+
+our $survey_ip = "176.110.125.15";
+our $survey_port_low = 60100;
+our $survey_port_high = 60200;
+our $survey_freq = 60.0;
+our $survey_time = 10.0;
+
+1;
+
diff --git a/netlist.txt b/netlist.txt
new file mode 100644
index 0000000..268d85f
--- /dev/null
+++ b/netlist.txt
@@ -0,0 +1,162 @@
+151.216.46.0 26 crew1
+151.216.46.128 26 crew2
+151.216.47.0 26 crew3
+151.216.47.128 26 crew4
+151.216.48.0 26 crew5
+151.216.48.128 26 crew6
+151.216.50.0 23 creativia
+151.216.54.0 24 gamehq
+151.216.55.0 24 chillout
+151.216.56.0 26 defektraid
+151.216.64.0 19 wlan
+151.216.96.0 24 logistikk
+151.216.98.0 24 presse
+151.216.99.0 25 fugleberg1
+151.216.99.128 25 fugleberg2
+151.216.101.0 24 game
+151.216.104.0 24 care
+151.216.105.0 24 sponsorvest
+151.216.107.0 24 stageboh
+151.216.112.0 24 secmedic
+151.216.113.0 24 lager
+151.216.114.0 24 stage
+151.216.115.0 24 ymse
+151.216.116.0 26 ap-dist0
+151.216.116.64 26 ap-dist1
+151.216.116.128 26 ap-dist2
+151.216.116.192 26 ap-dist3
+151.216.117.0 26 ap-dist4
+151.216.118.0 25 marsrele
+151.216.124.0 24 noc
+# --> Denne er det ikke meningen å rulle ut: 151.216.125.0 24 noc-server
+151.216.126.0 24 tele
+# Start av switches.txt fra planning.cpp
+151.216.1.0 26 e1-3 x.x.x.x
+151.216.1.64 26 e1-4 x.x.x.x
+151.216.1.128 26 e3-3 x.x.x.x
+151.216.1.192 26 e3-4 x.x.x.x
+151.216.2.0 26 e5-3 x.x.x.x
+151.216.2.64 26 e5-4 x.x.x.x
+151.216.2.128 26 e7-3 x.x.x.x
+151.216.2.192 26 e7-4 x.x.x.x
+151.216.3.0 26 e9-3 x.x.x.x
+151.216.3.64 26 e9-4 x.x.x.x
+151.216.3.128 26 e11-1 x.x.x.x
+151.216.3.192 26 e11-2 x.x.x.x
+151.216.4.0 26 e11-3 x.x.x.x
+151.216.4.64 26 e11-4 x.x.x.x
+151.216.4.128 26 e13-1 x.x.x.x
+151.216.4.192 26 e13-2 x.x.x.x
+151.216.5.0 26 e13-3 x.x.x.x
+151.216.5.64 26 e13-4 x.x.x.x
+151.216.5.128 26 e15-1 x.x.x.x
+151.216.5.192 26 e15-2 x.x.x.x
+151.216.6.0 26 e15-3 x.x.x.x
+151.216.6.64 26 e15-4 x.x.x.x
+151.216.6.128 26 e17-1 x.x.x.x
+151.216.6.192 26 e17-2 x.x.x.x
+151.216.7.0 26 e17-3 x.x.x.x
+151.216.7.64 26 e17-4 x.x.x.x
+151.216.7.128 26 e19-1 x.x.x.x
+151.216.7.192 26 e19-2 x.x.x.x
+151.216.8.0 26 e19-3 x.x.x.x
+151.216.8.64 26 e19-4 x.x.x.x
+151.216.8.128 26 e21-1 x.x.x.x
+151.216.8.192 26 e21-2 x.x.x.x
+151.216.9.0 26 e21-3 x.x.x.x
+151.216.9.64 26 e21-4 x.x.x.x
+151.216.9.128 26 e23-1 x.x.x.x
+151.216.9.192 26 e23-2 x.x.x.x
+151.216.10.0 26 e23-3 x.x.x.x
+151.216.10.64 26 e23-4 x.x.x.x
+151.216.10.128 26 e25-1 x.x.x.x
+151.216.10.192 26 e25-2 x.x.x.x
+151.216.11.0 26 e25-3 x.x.x.x
+151.216.11.64 26 e25-4 x.x.x.x
+151.216.11.128 26 e27-1 x.x.x.x
+151.216.11.192 26 e27-2 x.x.x.x
+151.216.12.0 26 e29-1 x.x.x.x
+151.216.12.64 26 e29-2 x.x.x.x
+151.216.12.128 26 e31-1 x.x.x.x
+151.216.12.192 26 e31-2 x.x.x.x
+151.216.13.0 26 e33-1 x.x.x.x
+151.216.13.64 26 e33-2 x.x.x.x
+151.216.13.128 26 e35-1 x.x.x.x
+151.216.13.192 26 e35-2 x.x.x.x
+151.216.14.0 26 e37-1 x.x.x.x
+151.216.14.64 26 e37-2 x.x.x.x
+151.216.14.128 26 e39-1 x.x.x.x
+151.216.14.192 26 e39-2 x.x.x.x
+151.216.15.0 26 e41-1 x.x.x.x
+151.216.15.64 26 e41-2 x.x.x.x
+151.216.15.128 26 e43-1 x.x.x.x
+151.216.15.192 26 e43-2 x.x.x.x
+151.216.16.0 26 e43-3 x.x.x.x
+151.216.16.64 26 e43-4 x.x.x.x
+151.216.16.128 26 e45-1 x.x.x.x
+151.216.16.192 26 e45-2 x.x.x.x
+151.216.17.0 26 e45-3 x.x.x.x
+151.216.17.64 26 e45-4 x.x.x.x
+151.216.17.128 26 e47-1 x.x.x.x
+151.216.17.192 26 e47-2 x.x.x.x
+151.216.18.0 26 e47-3 x.x.x.x
+151.216.18.64 26 e47-4 x.x.x.x
+151.216.18.128 26 e49-1 x.x.x.x
+151.216.18.192 26 e49-2 x.x.x.x
+151.216.19.0 26 e49-3 x.x.x.x
+151.216.19.64 26 e49-4 x.x.x.x
+151.216.19.128 26 e51-1 x.x.x.x
+151.216.19.192 26 e51-2 x.x.x.x
+151.216.20.0 26 e51-3 x.x.x.x
+151.216.20.64 26 e51-4 x.x.x.x
+151.216.20.128 26 e53-1 x.x.x.x
+151.216.20.192 26 e53-2 x.x.x.x
+151.216.21.0 26 e53-3 x.x.x.x
+151.216.21.64 26 e53-4 x.x.x.x
+151.216.21.128 26 e55-1 x.x.x.x
+151.216.21.192 26 e55-2 x.x.x.x
+151.216.22.0 26 e55-3 x.x.x.x
+151.216.22.64 26 e55-4 x.x.x.x
+151.216.22.128 26 e57-1 x.x.x.x
+151.216.22.192 26 e57-2 x.x.x.x
+151.216.23.0 26 e57-3 x.x.x.x
+151.216.23.64 26 e57-4 x.x.x.x
+151.216.23.128 26 e59-1 x.x.x.x
+151.216.23.192 26 e59-2 x.x.x.x
+151.216.24.0 26 e59-3 x.x.x.x
+151.216.24.64 26 e59-4 x.x.x.x
+151.216.24.128 26 e61-1 x.x.x.x
+151.216.24.192 26 e61-2 x.x.x.x
+151.216.25.0 26 e61-3 x.x.x.x
+151.216.25.64 26 e61-4 x.x.x.x
+151.216.25.128 26 e63-1 x.x.x.x
+151.216.25.192 26 e63-2 x.x.x.x
+151.216.26.0 26 e63-3 x.x.x.x
+151.216.26.64 26 e63-4 x.x.x.x
+151.216.26.128 26 e65-1 x.x.x.x
+151.216.26.192 26 e65-2 x.x.x.x
+151.216.27.0 26 e65-3 x.x.x.x
+151.216.27.64 26 e65-4 x.x.x.x
+151.216.27.128 26 e67-1 x.x.x.x
+151.216.27.192 26 e67-2 x.x.x.x
+151.216.28.0 26 e67-3 x.x.x.x
+151.216.28.64 26 e67-4 x.x.x.x
+151.216.28.128 26 e69-1 x.x.x.x
+151.216.28.192 26 e69-2 x.x.x.x
+151.216.29.0 26 e69-3 x.x.x.x
+151.216.29.64 26 e69-4 x.x.x.x
+151.216.29.128 26 e71-1 x.x.x.x
+151.216.29.192 26 e71-2 x.x.x.x
+151.216.30.0 26 e71-3 x.x.x.x
+151.216.30.64 26 e71-4 x.x.x.x
+151.216.30.128 26 e73-1 x.x.x.x
+151.216.30.192 26 e73-2 x.x.x.x
+151.216.31.0 26 e73-3 x.x.x.x
+151.216.31.64 26 e73-4 x.x.x.x
+151.216.31.128 26 e75-1 x.x.x.x
+151.216.31.192 26 e75-2 x.x.x.x
+151.216.32.0 26 e75-3 x.x.x.x
+151.216.32.64 26 e75-4 x.x.x.x
+151.216.32.128 26 e77-1 x.x.x.x
+151.216.32.192 26 e77-2 x.x.x.x
+# Slutt av switches.txt fra planning.cpp
diff --git a/patches/README b/patches/README
new file mode 100644
index 0000000..c89deaf
--- /dev/null
+++ b/patches/README
@@ -0,0 +1,13 @@
+Includes various patch(es) we had to use.
+
+> dhcpd-never-broadcast.diff
+
+When using DHCP in routed networks, the router has to participate in rewriting
+and sending DHCP replies on to the user. Unfortunately, some devices,
+in particular Cisco's Nexus series of switches, drop such DHCP reply packets
+with the broadcast bit in the flags field of the DHCP message header set.
+Thi means that some operating systems, in particular Microsoft Windows Vista,
+can have problems getting DHCP to work in such environments. If you enable
+this flag, the DHCP server will never set the broadcast flags in the replies
+it sends, even if the client set the broadcast flag. This flag overrides
+the never-broadcast flag if both are set.
diff --git a/patches/dhcpd-never-broadcast.diff b/patches/dhcpd-never-broadcast.diff
new file mode 100644
index 0000000..ac6d24d
--- /dev/null
+++ b/patches/dhcpd-never-broadcast.diff
@@ -0,0 +1,88 @@
+diff -ur isc-dhcp-4.1.1-P1/includes/dhcpd.h isc-dhcp-4.1.1-P1.patched//includes/dhcpd.h
+--- isc-dhcp-4.1.1-P1/includes/dhcpd.h 2012-04-04 16:49:44.000000000 +0200
++++ isc-dhcp-4.1.1-P1.patched//includes/dhcpd.h 2012-04-04 14:56:43.000000000 +0200
+@@ -626,6 +626,7 @@
+ #define SV_LIMIT_PREFS_PER_IA 57
+ #define SV_DELAYED_ACK 58
+ #define SV_MAX_ACK_DELAY 59
++#define SV_NEVER_BROADCAST 60
+
+ #if !defined (DEFAULT_PING_TIMEOUT)
+ # define DEFAULT_PING_TIMEOUT 1
+diff -ur isc-dhcp-4.1.1-P1/server/bootp.c isc-dhcp-4.1.1-P1.patched//server/bootp.c
+--- isc-dhcp-4.1.1-P1/server/bootp.c 2009-07-25 00:04:52.000000000 +0200
++++ isc-dhcp-4.1.1-P1.patched//server/bootp.c 2012-04-04 14:55:21.000000000 +0200
+@@ -283,6 +283,15 @@
+ &lease -> scope, oc, MDL))
+ raw.flags |= htons (BOOTP_BROADCAST);
+
++ /* The inverse. */
++ if ((oc = lookup_option (&server_universe,
++ options, SV_NEVER_BROADCAST)) &&
++ evaluate_boolean_option_cache (&ignorep, packet, lease,
++ (struct client_state *)0,
++ packet -> options, options,
++ &lease -> scope, oc, MDL))
++ raw.flags &= htons (~BOOTP_BROADCAST);
++
+ /* Figure out the address of the next server. */
+ memset (&d1, 0, sizeof d1);
+ oc = lookup_option (&server_universe, options, SV_NEXT_SERVER);
+diff -ur isc-dhcp-4.1.1-P1/server/dhcp.c isc-dhcp-4.1.1-P1.patched//server/dhcp.c
+--- isc-dhcp-4.1.1-P1/server/dhcp.c 2012-04-04 16:48:46.000000000 +0200
++++ isc-dhcp-4.1.1-P1.patched//server/dhcp.c 2012-04-04 14:55:45.000000000 +0200
+@@ -2482,6 +2482,15 @@
+ &lease -> scope, oc, MDL))
+ state -> bootp_flags |= htons (BOOTP_BROADCAST);
+
++ /* The inverse. */
++ if ((oc = lookup_option (&server_universe, state -> options,
++ SV_NEVER_BROADCAST)) &&
++ evaluate_boolean_option_cache (&ignorep, packet, lease,
++ (struct client_state *)0,
++ packet -> options, state -> options,
++ &lease -> scope, oc, MDL))
++ state -> bootp_flags &= htons (~BOOTP_BROADCAST);
++
+ /* Get the Maximum Message Size option from the packet, if one
+ was sent. */
+ oc = lookup_option (&dhcp_universe, packet -> options,
+diff -ur isc-dhcp-4.1.1-P1/server/dhcpd.conf.5 isc-dhcp-4.1.1-P1.patched//server/dhcpd.conf.5
+--- isc-dhcp-4.1.1-P1/server/dhcpd.conf.5 2012-04-04 16:48:46.000000000 +0200
++++ isc-dhcp-4.1.1-P1.patched//server/dhcpd.conf.5 2012-04-04 16:45:44.000000000 +0200
+@@ -1914,6 +1914,24 @@
+ .RE
+ .PP
+ The
++.I never-broadcast
++statement
++.RS 0.25i
++.PP
++.B never-broadcast \fIflag\fR\fB;\fR
++.PP
++When using DHCP in routed networks, the router has to participate in rewriting
++and sending DHCP replies on to the user. Unfortunately, some devices,
++in particular Cisco's Nexus series of switches, drop such DHCP reply packets
++with the broadcast bit in the flags field of the DHCP message header set.
++Thi means that some operating systems, in particular Microsoft Windows Vista,
++can have problems getting DHCP to work in such environments. If you enable
++this flag, the DHCP server will never set the broadcast flags in the replies
++it sends, even if the client set the broadcast flag. This flag overrides
++the never-broadcast flag if both are set.
++.RE
++.PP
++The
+ .I always-reply-rfc1048
+ statement
+ .RS 0.25i
+diff -ur isc-dhcp-4.1.1-P1/server/stables.c isc-dhcp-4.1.1-P1.patched//server/stables.c
+--- isc-dhcp-4.1.1-P1/server/stables.c 2012-04-04 16:49:44.000000000 +0200
++++ isc-dhcp-4.1.1-P1.patched//server/stables.c 2012-04-04 14:56:43.000000000 +0200
+@@ -203,6 +203,7 @@
+ { "always-reply-rfc1048", "f", &server_universe, 20, 1 },
+ { "site-option-space", "X", &server_universe, 21, 1 },
+ { "always-broadcast", "f", &server_universe, 22, 1 },
++ { "never-broadcast", "f", &server_universe, 60, 1 },
+ { "ddns-domainname", "t", &server_universe, 23, 1 },
+ { "ddns-hostname", "t", &server_universe, 24, 1 },
+ { "ddns-rev-domainname", "t", &server_universe, 25, 1 },
diff --git a/patchlist.txt b/patchlist.txt
new file mode 100644
index 0000000..30285d5
--- /dev/null
+++ b/patchlist.txt
@@ -0,0 +1,128 @@
+e1-3 distro1 Gi1/1 Gi2/1 Gi5/1 Gi6/1
+e1-4 distro1 Gi1/2 Gi2/2 Gi5/2 Gi6/2
+e3-3 distro1 Gi1/3 Gi2/3 Gi5/3 Gi6/3
+e3-4 distro1 Gi1/4 Gi2/4 Gi5/4 Gi6/4
+e5-3 distro1 Gi1/5 Gi2/5 Gi5/5 Gi6/5
+e5-4 distro1 Gi1/6 Gi2/6 Gi5/6 Gi6/6
+e7-3 distro1 Gi1/7 Gi2/7 Gi5/7 Gi6/7
+e7-4 distro1 Gi1/8 Gi2/8 Gi5/8 Gi6/8
+e9-3 distro1 Gi1/9 Gi2/9 Gi5/9 Gi6/9
+e9-4 distro1 Gi1/10 Gi2/10 Gi5/10 Gi6/10
+e11-1 distro2 Gi1/1 Gi2/1 Gi5/1 Gi6/1
+e11-2 distro2 Gi1/2 Gi2/2 Gi5/2 Gi6/2
+e11-3 distro1 Gi1/11 Gi2/11 Gi5/11 Gi6/11
+e11-4 distro1 Gi1/12 Gi2/12 Gi5/12 Gi6/12
+e13-1 distro2 Gi1/3 Gi2/3 Gi5/3 Gi6/3
+e13-2 distro2 Gi1/4 Gi2/4 Gi5/4 Gi6/4
+e13-3 distro1 Gi1/13 Gi2/13 Gi5/13 Gi6/13
+e13-4 distro1 Gi1/14 Gi2/14 Gi5/14 Gi6/14
+e15-1 distro2 Gi1/5 Gi2/5 Gi5/5 Gi6/5
+e15-2 distro2 Gi1/6 Gi2/6 Gi5/6 Gi6/6
+e15-3 distro1 Gi1/15 Gi2/15 Gi5/15 Gi6/15
+e15-4 distro1 Gi1/16 Gi2/16 Gi5/16 Gi6/16
+e17-1 distro2 Gi1/7 Gi2/7 Gi5/7 Gi6/7
+e17-2 distro2 Gi1/8 Gi2/8 Gi5/8 Gi6/8
+e17-3 distro1 Gi1/17 Gi2/17 Gi5/17 Gi6/17
+e17-4 distro1 Gi1/18 Gi2/18 Gi5/18 Gi6/18
+e19-1 distro2 Gi1/9 Gi2/9 Gi5/9 Gi6/9
+e19-2 distro2 Gi1/10 Gi2/10 Gi5/10 Gi6/10
+e19-3 distro1 Gi1/19 Gi2/19 Gi5/19 Gi6/19
+e19-4 distro1 Gi1/20 Gi2/20 Gi5/20 Gi6/20
+e21-1 distro2 Gi1/11 Gi2/11 Gi5/11 Gi6/11
+e21-2 distro2 Gi1/12 Gi2/12 Gi5/12 Gi6/12
+e21-3 distro1 Gi1/21 Gi2/21 Gi5/21 Gi6/21
+e21-4 distro1 Gi1/22 Gi2/22 Gi5/22 Gi6/22
+e23-1 distro2 Gi1/13 Gi2/13 Gi5/13 Gi6/13
+e23-2 distro2 Gi1/14 Gi2/14 Gi5/14 Gi6/14
+e23-3 distro1 Gi1/23 Gi2/23 Gi5/23 Gi6/23
+e23-4 distro1 Gi1/24 Gi2/24 Gi5/24 Gi6/24
+e25-1 distro2 Gi1/15 Gi2/15 Gi5/15 Gi6/15
+e25-2 distro2 Gi1/16 Gi2/16 Gi5/16 Gi6/16
+e25-3 distro1 Gi1/25 Gi2/25 Gi5/25 Gi6/25
+e25-4 distro1 Gi1/26 Gi2/26 Gi5/26 Gi6/26
+e27-1 distro2 Gi1/17 Gi2/17 Gi5/17 Gi6/17
+e27-2 distro2 Gi1/18 Gi2/18 Gi5/18 Gi6/18
+e29-1 distro2 Gi1/19 Gi2/19 Gi5/19 Gi6/19
+e29-2 distro2 Gi1/20 Gi2/20 Gi5/20 Gi6/20
+e31-1 distro2 Gi1/21 Gi2/21 Gi5/21 Gi6/21
+e31-2 distro2 Gi1/22 Gi2/22 Gi5/22 Gi6/22
+e33-1 distro3 Gi1/1 Gi2/1 Gi5/1 Gi6/1
+e33-2 distro2 Gi1/23 Gi2/23 Gi5/23 Gi6/23
+e35-1 distro3 Gi1/2 Gi2/2 Gi5/2 Gi6/2
+e35-2 distro3 Gi1/3 Gi2/3 Gi5/3 Gi6/3
+e37-1 distro3 Gi1/4 Gi2/4 Gi5/4 Gi6/4
+e37-2 distro3 Gi1/5 Gi2/5 Gi5/5 Gi6/5
+e39-1 distro3 Gi1/6 Gi2/6 Gi5/6 Gi6/6
+e39-2 distro3 Gi1/7 Gi2/7 Gi5/7 Gi6/7
+e41-1 distro3 Gi1/8 Gi2/8 Gi5/8 Gi6/8
+e41-2 distro3 Gi1/9 Gi2/9 Gi5/9 Gi6/9
+e43-1 distro3 Gi1/10 Gi2/10 Gi5/10 Gi6/10
+e43-2 distro3 Gi1/11 Gi2/11 Gi5/11 Gi6/11
+e43-3 distro4 Gi1/1 Gi2/1 Gi5/1 Gi6/1
+e43-4 distro4 Gi1/2 Gi2/2 Gi5/2 Gi6/2
+e45-1 distro3 Gi1/12 Gi2/12 Gi5/12 Gi6/12
+e45-2 distro3 Gi1/13 Gi2/13 Gi5/13 Gi6/13
+e45-3 distro4 Gi1/3 Gi2/3 Gi5/3 Gi6/3
+e45-4 distro4 Gi1/4 Gi2/4 Gi5/4 Gi6/4
+e47-1 distro3 Gi1/14 Gi2/14 Gi5/14 Gi6/14
+e47-2 distro3 Gi1/15 Gi2/15 Gi5/15 Gi6/15
+e47-3 distro4 Gi1/5 Gi2/5 Gi5/5 Gi6/5
+e47-4 distro4 Gi1/6 Gi2/6 Gi5/6 Gi6/6
+e49-1 distro3 Gi1/16 Gi2/16 Gi5/16 Gi6/16
+e49-2 distro3 Gi1/17 Gi2/17 Gi5/17 Gi6/17
+e49-3 distro4 Gi1/7 Gi2/7 Gi5/7 Gi6/7
+e49-4 distro4 Gi1/8 Gi2/8 Gi5/8 Gi6/8
+e51-1 distro3 Gi1/18 Gi2/18 Gi5/18 Gi6/18
+e51-2 distro3 Gi1/19 Gi2/19 Gi5/19 Gi6/19
+e51-3 distro4 Gi1/9 Gi2/9 Gi5/9 Gi6/9
+e51-4 distro4 Gi1/10 Gi2/10 Gi5/10 Gi6/10
+e53-1 distro3 Gi1/20 Gi2/20 Gi5/20 Gi6/20
+e53-2 distro3 Gi1/21 Gi2/21 Gi5/21 Gi6/21
+e53-3 distro4 Gi1/11 Gi2/11 Gi5/11 Gi6/11
+e53-4 distro4 Gi1/12 Gi2/12 Gi5/12 Gi6/12
+e55-1 distro3 Gi1/22 Gi2/22 Gi5/22 Gi6/22
+e55-2 distro3 Gi1/23 Gi2/23 Gi5/23 Gi6/23
+e55-3 distro4 Gi1/13 Gi2/13 Gi5/13 Gi6/13
+e55-4 distro4 Gi1/14 Gi2/14 Gi5/14 Gi6/14
+e57-1 distro3 Gi1/24 Gi2/24 Gi5/24 Gi6/24
+e57-2 distro3 Gi1/25 Gi2/25 Gi5/25 Gi6/25
+e57-3 distro4 Gi1/15 Gi2/15 Gi5/15 Gi6/15
+e57-4 distro4 Gi1/16 Gi2/16 Gi5/16 Gi6/16
+e59-1 distro5 Gi1/1 Gi2/1 Gi5/1 Gi6/1
+e59-2 distro5 Gi1/2 Gi2/2 Gi5/2 Gi6/2
+e59-3 distro4 Gi1/17 Gi2/17 Gi5/17 Gi6/17
+e59-4 distro4 Gi1/18 Gi2/18 Gi5/18 Gi6/18
+e61-1 distro5 Gi1/3 Gi2/3 Gi5/3 Gi6/3
+e61-2 distro5 Gi1/4 Gi2/4 Gi5/4 Gi6/4
+e61-3 distro4 Gi1/19 Gi2/19 Gi5/19 Gi6/19
+e61-4 distro4 Gi1/20 Gi2/20 Gi5/20 Gi6/20
+e63-1 distro5 Gi1/5 Gi2/5 Gi5/5 Gi6/5
+e63-2 distro5 Gi1/6 Gi2/6 Gi5/6 Gi6/6
+e63-3 distro5 Gi1/7 Gi2/7 Gi5/7 Gi6/7
+e63-4 distro5 Gi1/8 Gi2/8 Gi5/8 Gi6/8
+e65-1 distro5 Gi1/9 Gi2/9 Gi5/9 Gi6/9
+e65-2 distro5 Gi1/10 Gi2/10 Gi5/10 Gi6/10
+e65-3 distro5 Gi1/11 Gi2/11 Gi5/11 Gi6/11
+e65-4 distro5 Gi1/12 Gi2/12 Gi5/12 Gi6/12
+e67-1 distro5 Gi1/13 Gi2/13 Gi5/13 Gi6/13
+e67-2 distro5 Gi1/14 Gi2/14 Gi5/14 Gi6/14
+e67-3 distro5 Gi1/15 Gi2/15 Gi5/15 Gi6/15
+e67-4 distro5 Gi1/16 Gi2/16 Gi5/16 Gi6/16
+e69-1 distro5 Gi1/17 Gi2/17 Gi5/17 Gi6/17
+e69-2 distro5 Gi1/18 Gi2/18 Gi5/18 Gi6/18
+e69-3 distro5 Gi1/19 Gi2/19 Gi5/19 Gi6/19
+e69-4 distro5 Gi1/20 Gi2/20 Gi5/20 Gi6/20
+e71-1 distro5 Gi1/21 Gi2/21 Gi5/21 Gi6/21
+e71-2 distro5 Gi1/22 Gi2/22 Gi5/22 Gi6/22
+e71-3 distro5 Gi1/23 Gi2/23 Gi5/23 Gi6/23
+e71-4 distro5 Gi1/24 Gi2/24 Gi5/24 Gi6/24
+e73-1 distro5 Gi1/25 Gi2/25 Gi5/25 Gi6/25
+e73-2 distro5 Gi1/26 Gi2/26 Gi5/26 Gi6/26
+e73-3 distro5 Gi1/27 Gi2/27 Gi5/27 Gi6/27
+e73-4 distro5 Gi1/28 Gi2/28 Gi5/28 Gi6/28
+e75-1 distro5 Gi1/29 Gi2/29 Gi5/29 Gi6/29
+e75-2 distro5 Gi1/30 Gi2/30 Gi5/30 Gi6/30
+e75-3 distro5 Gi1/31 Gi2/31 Gi5/31 Gi6/31
+e75-4 distro5 Gi1/32 Gi2/32 Gi5/32 Gi6/32
+e77-1 distro5 Gi1/33 Gi2/33 Gi5/33 Gi6/33
+e77-2 distro5 Gi1/34 Gi2/34 Gi5/34 Gi6/34
diff --git a/patchlist.txt.crew b/patchlist.txt.crew
new file mode 100644
index 0000000..c69136a
--- /dev/null
+++ b/patchlist.txt.crew
@@ -0,0 +1,6 @@
+crew1 crewgw Gi1/11 Gi1/12 Gi1/13 Gi1/14
+crew2 crewgw Gi1/15 Gi1/16 Gi1/17 Gi1/18
+crew3 crewgw Gi1/19 Gi1/20 Gi1/21 Gi1/22
+crew4 crewgw Gi1/23 Gi1/24 Gi1/25 Gi1/26
+crew5 crewgw Gi1/27 Gi1/28 Gi1/29 Gi1/30
+crew6 crewgw Gi1/31 Gi1/32 Gi1/33 Gi1/34
diff --git a/pingswitches.txt b/pingswitches.txt
new file mode 100644
index 0000000..efd8454
--- /dev/null
+++ b/pingswitches.txt
@@ -0,0 +1,128 @@
+151.216.1.0 26 e1-3 x.x.x.x
+151.216.1.64 26 e1-4 x.x.x.x
+151.216.1.128 26 e3-3 x.x.x.x
+151.216.1.192 26 e3-4 x.x.x.x
+151.216.2.0 26 e5-3 x.x.x.x
+151.216.2.64 26 e5-4 x.x.x.x
+151.216.2.128 26 e7-3 x.x.x.x
+151.216.2.192 26 e7-4 x.x.x.x
+151.216.3.0 26 e9-3 x.x.x.x
+151.216.3.64 26 e9-4 x.x.x.x
+151.216.3.128 26 e11-1 x.x.x.x
+151.216.3.192 26 e11-2 x.x.x.x
+151.216.4.0 26 e11-3 x.x.x.x
+151.216.4.64 26 e11-4 x.x.x.x
+151.216.4.128 26 e13-1 x.x.x.x
+151.216.4.192 26 e13-2 x.x.x.x
+151.216.5.0 26 e13-3 x.x.x.x
+151.216.5.64 26 e13-4 x.x.x.x
+151.216.5.128 26 e15-1 x.x.x.x
+151.216.5.192 26 e15-2 x.x.x.x
+151.216.6.0 26 e15-3 x.x.x.x
+151.216.6.64 26 e15-4 x.x.x.x
+151.216.6.128 26 e17-1 x.x.x.x
+151.216.6.192 26 e17-2 x.x.x.x
+151.216.7.0 26 e17-3 x.x.x.x
+151.216.7.64 26 e17-4 x.x.x.x
+151.216.7.128 26 e19-1 x.x.x.x
+151.216.7.192 26 e19-2 x.x.x.x
+151.216.8.0 26 e19-3 x.x.x.x
+151.216.8.64 26 e19-4 x.x.x.x
+151.216.8.128 26 e21-1 x.x.x.x
+151.216.8.192 26 e21-2 x.x.x.x
+151.216.9.0 26 e21-3 x.x.x.x
+151.216.9.64 26 e21-4 x.x.x.x
+151.216.9.128 26 e23-1 x.x.x.x
+151.216.9.192 26 e23-2 x.x.x.x
+151.216.10.0 26 e23-3 x.x.x.x
+151.216.10.64 26 e23-4 x.x.x.x
+151.216.10.128 26 e25-1 x.x.x.x
+151.216.10.192 26 e25-2 x.x.x.x
+151.216.11.0 26 e25-3 x.x.x.x
+151.216.11.64 26 e25-4 x.x.x.x
+151.216.11.128 26 e27-1 x.x.x.x
+151.216.11.192 26 e27-2 x.x.x.x
+151.216.12.0 26 e29-1 x.x.x.x
+151.216.12.64 26 e29-2 x.x.x.x
+151.216.12.128 26 e31-1 x.x.x.x
+151.216.12.192 26 e31-2 x.x.x.x
+151.216.13.0 26 e33-1 x.x.x.x
+151.216.13.64 26 e33-2 x.x.x.x
+151.216.13.128 26 e35-1 x.x.x.x
+151.216.13.192 26 e35-2 x.x.x.x
+151.216.14.0 26 e37-1 x.x.x.x
+151.216.14.64 26 e37-2 x.x.x.x
+151.216.14.128 26 e39-1 x.x.x.x
+151.216.14.192 26 e39-2 x.x.x.x
+151.216.15.0 26 e41-1 x.x.x.x
+151.216.15.64 26 e41-2 x.x.x.x
+151.216.15.128 26 e43-1 x.x.x.x
+151.216.15.192 26 e43-2 x.x.x.x
+151.216.16.0 26 e43-3 x.x.x.x
+151.216.16.64 26 e43-4 x.x.x.x
+151.216.16.128 26 e45-1 x.x.x.x
+151.216.16.192 26 e45-2 x.x.x.x
+151.216.17.0 26 e45-3 x.x.x.x
+151.216.17.64 26 e45-4 x.x.x.x
+151.216.17.128 26 e47-1 x.x.x.x
+151.216.17.192 26 e47-2 x.x.x.x
+151.216.18.0 26 e47-3 x.x.x.x
+151.216.18.64 26 e47-4 x.x.x.x
+151.216.18.128 26 e49-1 x.x.x.x
+151.216.18.192 26 e49-2 x.x.x.x
+151.216.19.0 26 e49-3 x.x.x.x
+151.216.19.64 26 e49-4 x.x.x.x
+151.216.19.128 26 e51-1 x.x.x.x
+151.216.19.192 26 e51-2 x.x.x.x
+151.216.20.0 26 e51-3 x.x.x.x
+151.216.20.64 26 e51-4 x.x.x.x
+151.216.20.128 26 e53-1 x.x.x.x
+151.216.20.192 26 e53-2 x.x.x.x
+151.216.21.0 26 e53-3 x.x.x.x
+151.216.21.64 26 e53-4 x.x.x.x
+151.216.21.128 26 e55-1 x.x.x.x
+151.216.21.192 26 e55-2 x.x.x.x
+151.216.22.0 26 e55-3 x.x.x.x
+151.216.22.64 26 e55-4 x.x.x.x
+151.216.22.128 26 e57-1 x.x.x.x
+151.216.22.192 26 e57-2 x.x.x.x
+151.216.23.0 26 e57-3 x.x.x.x
+151.216.23.64 26 e57-4 x.x.x.x
+151.216.23.128 26 e59-1 x.x.x.x
+151.216.23.192 26 e59-2 x.x.x.x
+151.216.24.0 26 e59-3 x.x.x.x
+151.216.24.64 26 e59-4 x.x.x.x
+151.216.24.128 26 e61-1 x.x.x.x
+151.216.24.192 26 e61-2 x.x.x.x
+151.216.25.0 26 e61-3 x.x.x.x
+151.216.25.64 26 e61-4 x.x.x.x
+151.216.25.128 26 e63-1 x.x.x.x
+151.216.25.192 26 e63-2 x.x.x.x
+151.216.26.0 26 e63-3 x.x.x.x
+151.216.26.64 26 e63-4 x.x.x.x
+151.216.26.128 26 e65-1 x.x.x.x
+151.216.26.192 26 e65-2 x.x.x.x
+151.216.27.0 26 e65-3 x.x.x.x
+151.216.27.64 26 e65-4 x.x.x.x
+151.216.27.128 26 e67-1 x.x.x.x
+151.216.27.192 26 e67-2 x.x.x.x
+151.216.28.0 26 e67-3 x.x.x.x
+151.216.28.64 26 e67-4 x.x.x.x
+151.216.28.128 26 e69-1 x.x.x.x
+151.216.28.192 26 e69-2 x.x.x.x
+151.216.29.0 26 e69-3 x.x.x.x
+151.216.29.64 26 e69-4 x.x.x.x
+151.216.29.128 26 e71-1 x.x.x.x
+151.216.29.192 26 e71-2 x.x.x.x
+151.216.30.0 26 e71-3 x.x.x.x
+151.216.30.64 26 e71-4 x.x.x.x
+151.216.30.128 26 e73-1 x.x.x.x
+151.216.30.192 26 e73-2 x.x.x.x
+151.216.31.0 26 e73-3 x.x.x.x
+151.216.31.64 26 e73-4 x.x.x.x
+151.216.31.128 26 e75-1 x.x.x.x
+151.216.31.192 26 e75-2 x.x.x.x
+151.216.32.0 26 e75-3 x.x.x.x
+151.216.32.64 26 e75-4 x.x.x.x
+151.216.32.128 26 e77-1 x.x.x.x
+151.216.32.192 26 e77-2 x.x.x.x
diff --git a/planning/planning.cpp b/planning/planning.cpp
new file mode 100644
index 0000000..04dde6f
--- /dev/null
+++ b/planning/planning.cpp
@@ -0,0 +1,579 @@
+// Find optimal assignment of access switches using min-cost max-flow.
+// About three times as fast as the old DP+heuristics-based solution
+// (<2ms for planning TG), and can deal with less regular cost metrics.
+//
+// Given D distro switches and N access switches, complexity is approx. O(dn³)
+// (runs n iterations, each iteration is O(VE), V is O(n), E is O(dn))).
+//
+// g++ -std=gnu++0x -Wall -g -O2 -DOUTPUT_FILES=1 -o planning planning.cc && ./planning -6 11 22 -26 35
+
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <limits.h>
+#include <assert.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <vector>
+#include <map>
+#include <algorithm>
+#include <string>
+#include <utility>
+#include <queue>
+
+#define NUM_DISTRO 5
+#define SWITCHES_PER_ROW 4
+#define PORTS_PER_DISTRO 38
+
+#define TRUNCATE_METRIC 1
+#define EXTENSION_COST 70
+#define HORIZ_GAP_COST 100
+
+#define FIRST_SUBNET_ADDRESS "151.216.1.0"
+#define SUBNET_SIZE 26
+
+#define _INF 99999
+
+struct Switch {
+ unsigned row, num;
+
+ Switch(unsigned row, unsigned num) : row(row), num(num) {}
+};
+
+struct Inventory {
+ Inventory() : num_10m(0), num_30m(0), num_50m(0), extensions(0), horiz_gap_crossings(0) {}
+
+ Inventory& operator+= (const Inventory& other)
+ {
+ this->num_10m += other.num_10m;
+ this->num_30m += other.num_30m;
+ this->num_50m += other.num_50m;
+ this->extensions += other.extensions;
+ this->horiz_gap_crossings += other.horiz_gap_crossings;
+ return *this;
+ }
+
+ std::string to_string() const
+ {
+ if (num_10m >= _INF) {
+ return "XXXXX";
+ }
+
+ std::string ret;
+ Inventory copy = *this;
+ while (copy.num_50m-- > 0) {
+ if (!ret.empty()) {
+ ret += '+';
+ }
+ ret += "50";
+ }
+ while (copy.num_30m-- > 0) {
+ if (!ret.empty()) {
+ ret += '+';
+ }
+ ret += "30";
+ }
+ while (copy.num_10m-- > 0) {
+ if (!ret.empty()) {
+ ret += '+';
+ }
+ ret += "10";
+ }
+ return ret;
+ }
+
+ unsigned num_10m, num_30m, num_50m;
+ unsigned extensions, horiz_gap_crossings;
+};
+
+// Data structures for flow algorithm.
+struct Node;
+struct Edge {
+ Node *to;
+ Edge *reverse; // Edge in opposite direction.
+
+ int capacity, flow;
+ int cost;
+};
+struct Node {
+ std::vector<Edge *> edges;
+
+ // For debugging.
+ char name[16];
+
+ // Used in Dijkstra search.
+ int cost_from_source;
+ bool seen;
+ Edge *prev_edge;
+};
+
+
+const unsigned horiz_cost[SWITCHES_PER_ROW] = {
+ 216, 72, 72, 216 // Gap costs are added separately.
+};
+
+class Planner {
+ private:
+ int distro_placements[NUM_DISTRO];
+ std::vector<Switch> switches;
+ std::map<unsigned, unsigned> num_ports_used;
+ std::string *log_buf;
+
+ unsigned find_distance(Switch from_where, unsigned distro);
+ unsigned find_slack(Inventory inventory, unsigned distance);
+ unsigned find_cost(Switch from_where, unsigned distro);
+ Inventory find_inventory(Switch from_where, unsigned distro);
+ void logprintf(const char *str, ...);
+ void init_switches();
+
+ public:
+ Planner() : log_buf(NULL) {}
+ void set_log_buf(std::string *log_buf) { this->log_buf = log_buf; }
+ int do_work(int distro_placements[NUM_DISTRO]);
+};
+
+unsigned Planner::find_distance(Switch from_where, unsigned distro)
+{
+ const int dp = abs(distro_placements[distro]);
+
+ // 3.7m from row to row (2.5m gap + 1.2m boards).
+ unsigned base_cost = 37 * abs(from_where.row - dp) +
+ horiz_cost[from_where.num];
+
+ if ((distro_placements[distro] >= 0) == (from_where.num >= 2)) {
+ // 5.0m horizontal gap.
+ base_cost += 50;
+ }
+
+ // 4m, 5m, 4m gaps (1.5m, 2.5m, 1.5m extra).
+ if ((from_where.row <= 5) == (dp >= 6))
+ base_cost += 15;
+ if ((from_where.row <= 13) == (dp >= 14))
+ base_cost += 15;
+ if ((from_where.row <= 21) == (dp >= 22))
+ base_cost += 25;
+ if ((from_where.row <= 29) == (dp >= 30))
+ base_cost += 15;
+
+ // Add 5m slack.
+ return base_cost + 50;
+}
+
+Inventory Planner::find_inventory(Switch from_where, unsigned distro)
+{
+ unsigned distance = find_distance(from_where, distro);
+
+ Inventory inv;
+ if (distance <= 100) {
+ inv.num_10m = 1;
+ } else if (distance <= 200) {
+ inv.num_10m = 2;
+ inv.extensions = 1;
+ } else if (distance <= 300) {
+ inv.num_30m = 1;
+ } else if (distance <= 400) {
+ inv.num_10m = 1;
+ inv.num_30m = 1;
+ inv.extensions = 1;
+ } else if (distance <= 500) {
+ inv.num_50m = 1;
+ } else if (distance <= 600) {
+ inv.num_10m = 1;
+ inv.num_50m = 1;
+ inv.extensions = 1;
+ } else if (distance <= 800) {
+ inv.num_30m = 1;
+ inv.num_50m = 1;
+ inv.extensions = 1;
+ } else if (distance <= 1000) {
+ inv.num_50m = 2;
+ inv.extensions = 1;
+ } else {
+ inv.num_10m = _INF;
+ }
+
+ if ((distro_placements[distro] >= 0) == (from_where.num >= 2)) {
+ inv.horiz_gap_crossings = 1;
+ }
+
+ return inv;
+}
+
+unsigned Planner::find_slack(Inventory inventory, unsigned distance)
+{
+ return 100 * inventory.num_10m + 300 * inventory.num_30m + 500 * inventory.num_50m - distance;
+}
+
+unsigned Planner::find_cost(Switch from_where, unsigned distro)
+{
+ Inventory inv = find_inventory(from_where, distro);
+ unsigned cost;
+
+#if TRUNCATE_METRIC
+ cost = 100 * inv.num_10m + 300 * inv.num_30m + 500 * inv.num_50m + EXTENSION_COST * inv.extensions;
+ // cost = find_slack(inv, distance);
+#else
+ cost = find_distance(from_where, distro);
+ // cost = ((distance + 90) / 100) * 100;
+#endif
+
+ // We really, really do not want to cross the gap on the north side.
+ if (from_where.row <= 30) {
+ cost += _INF * inv.horiz_gap_crossings;
+ } else {
+ cost += HORIZ_GAP_COST * inv.horiz_gap_crossings;
+ }
+
+ return cost;
+}
+
+void Planner::logprintf(const char *fmt, ...)
+{
+ if (log_buf == NULL) {
+ return;
+ }
+
+ char buf[1024];
+ va_list ap;
+ va_start(ap, fmt);
+ vsnprintf(buf, sizeof(buf), fmt, ap);
+ va_end(ap);
+
+ log_buf->append(buf);
+}
+
+std::string distro_name(unsigned distro)
+{
+ char buf[16];
+ sprintf(buf, "distro%d", distro + 1);
+ return buf;
+}
+
+std::string port_name(unsigned distro, unsigned portnum)
+{
+ char buf[16];
+ int distros[] = { 1, 2, 5, 6 };
+ sprintf(buf, "Gi%u/%u", distros[portnum / 48], (portnum % 48) + 1);
+ return buf;
+}
+
+void Planner::init_switches()
+{
+ switches.clear();
+ for (unsigned i = 1; i <= 39; ++i) {
+ if (!(i >= 1 && i <= 5)) {
+ switches.push_back(Switch(i, 0));
+ switches.push_back(Switch(i, 1));
+ }
+ if (!(i >= 14 && i <= 21) &&
+ !(i >= 39)) {
+ switches.push_back(Switch(i, 2));
+ switches.push_back(Switch(i, 3));
+ }
+ }
+}
+
+void add_edge(Node *from, Node *to, int capacity, int cost, std::vector<Edge> *edges)
+{
+ assert(edges->size() + 2 <= edges->capacity());
+ edges->resize(edges->size() + 2);
+
+ Edge *e1 = &edges->at(edges->size() - 2);
+ Edge *e2 = &edges->at(edges->size() - 1);
+
+ e1->to = to;
+ e1->capacity = capacity;
+ e1->flow = 0;
+ e1->cost = cost;
+ e1->reverse = e2;
+ from->edges.push_back(e1);
+
+ e2->to = from;
+ e2->capacity = 0;
+ e2->flow = 0;
+ e2->cost = -cost;
+ e2->reverse = e1;
+ to->edges.push_back(e2);
+}
+
+int Planner::do_work(int distro_placements[NUM_DISTRO])
+{
+ memcpy(this->distro_placements, distro_placements, sizeof(distro_placements[0]) * NUM_DISTRO);
+
+ num_ports_used.clear();
+
+#if OUTPUT_FILES
+ FILE *patchlist = fopen("patchlist.txt", "w");
+ FILE *switchlist = fopen("switches.txt", "w");
+#endif
+ Inventory total_inv;
+ unsigned total_cost = 0, total_slack = 0;
+
+ init_switches();
+
+ logprintf("Finding optimal layout for %u switches\n", switches.size());
+
+ // Min-cost max-flow in a graph that looks something like this
+ // (ie., all distros connect to all access switches):
+ //
+ // ---- D1 \---/-- A1 --
+ // / \ / \ .
+ // source ----- D2 --X---- A2 --- sink
+ // \ / \ /
+ // ---- D3 /---\-- A3 -/
+ //
+ // Capacity from source to distro is 48 (or whatever), cost is 0.
+ // Capacity from distro to access is 1, cost is cable length + penalties.
+ // Capacity from access to sink is 1, cost is 0.
+ Node source_node, sink_node;
+ Node distro_nodes[NUM_DISTRO];
+ std::vector<Node> switch_nodes;
+ std::vector<Edge> edges;
+ switch_nodes.resize(switches.size());
+ edges.reserve(switches.size() * NUM_DISTRO * 2 + 16);
+
+ for (unsigned i = 0; i < NUM_DISTRO; ++i) {
+ add_edge(&source_node, &distro_nodes[i], PORTS_PER_DISTRO, 0, &edges);
+ }
+ for (unsigned i = 0; i < NUM_DISTRO; ++i) {
+ for (unsigned j = 0; j < switches.size(); ++j) {
+ int cost = find_cost(switches[j], i);
+ if (cost >= _INF) {
+ continue;
+ }
+ add_edge(&distro_nodes[i], &switch_nodes[j], 1, cost, &edges);
+ }
+ }
+ for (unsigned i = 0; i < switches.size(); ++i) {
+ add_edge(&switch_nodes[i], &sink_node, 1, 0, &edges);
+ }
+
+ std::vector<Node*> all_nodes;
+ all_nodes.push_back(&source_node);
+ strcpy(source_node.name, "source");
+
+ all_nodes.push_back(&sink_node);
+ strcpy(sink_node.name, "sink");
+
+ for (unsigned i = 0; i < NUM_DISTRO; ++i) {
+ all_nodes.push_back(&distro_nodes[i]);
+ sprintf(distro_nodes[i].name, "distro%d", i);
+ }
+ for (unsigned i = 0; i < switches.size(); ++i) {
+ all_nodes.push_back(&switch_nodes[i]);
+ sprintf(switch_nodes[i].name, "switch%d", i);
+ }
+
+ // We use the successive shortest path algorithm, using a primitive Dijkstra
+ // (not heap-based, so O(VE)) for search.
+ int num_paths = 0;
+ for ( ;; ) {
+ // Reset Dijkstra state.
+ for (unsigned i = 0; i < all_nodes.size(); ++i) {
+ Node *n = all_nodes[i];
+ n->cost_from_source = _INF;
+ n->seen = false;
+ n->prev_edge = NULL;
+ }
+ source_node.cost_from_source = 0;
+
+ for (unsigned i = 0; i < switches.size(); ++i) {
+ Node *cheapest_unseen_node = NULL;
+ for (unsigned i = 0; i < all_nodes.size(); ++i) {
+ Node *n = all_nodes[i];
+ if (n->seen || n->cost_from_source >= _INF) {
+ continue;
+ }
+ if (cheapest_unseen_node == NULL ||
+ n->cost_from_source < cheapest_unseen_node->cost_from_source) {
+ cheapest_unseen_node = n;
+ }
+ }
+ if (cheapest_unseen_node == NULL) {
+ // Oops, no usable path.
+ goto end;
+ }
+ if (cheapest_unseen_node == &sink_node) {
+ // Yay, we found a path to the sink.
+ break;
+ }
+
+ cheapest_unseen_node->seen = true;
+
+ // See if any of the edges out from this are feasible.
+ for (unsigned i = 0; i < cheapest_unseen_node->edges.size(); ++i) {
+ Edge *e = cheapest_unseen_node->edges[i];
+ if (e->flow + 1 > e->capacity || e->reverse->flow - 1 > e->reverse->capacity) {
+ // Not feasible.
+ continue;
+ }
+ if (e->to->cost_from_source <= cheapest_unseen_node->cost_from_source + e->cost) {
+ // Already seen through a better path.
+ continue;
+ }
+ e->to->seen = false;
+ e->to->prev_edge = e;
+ e->to->cost_from_source = cheapest_unseen_node->cost_from_source + e->cost;
+ }
+ }
+
+ // Increase flow along the path, moving backwards towards the source.
+ Node *n = &sink_node;
+ for ( ;; ) {
+ if (n->prev_edge == NULL) {
+ break;
+ }
+
+ n->prev_edge->flow += 1;
+ n->prev_edge->reverse->flow -= 1;
+
+ n = n->prev_edge->reverse->to;
+ }
+ ++num_paths;
+ }
+
+end:
+ logprintf("Augmented using %d paths.\n", num_paths, (unsigned)switches.size());
+ int last_row = 0, last_num = -1;
+#if OUTPUT_FILES
+ in_addr_t subnet_address = inet_addr(FIRST_SUBNET_ADDRESS);
+#endif
+ for (unsigned i = 0; i < switches.size(); ++i) {
+ // Figure out which distro this switch was connected to.
+ int distro = -1;
+ for (unsigned j = 0; j < NUM_DISTRO; ++j) {
+ Edge *flow_edge = NULL;
+ for (unsigned k = 0; k < distro_nodes[j].edges.size(); ++k) {
+ Edge *e = distro_nodes[j].edges[k];
+ if (e->to == &switch_nodes[i]) {
+ flow_edge = e;
+ break;
+ }
+ }
+ if (flow_edge != NULL && flow_edge->flow > 0) {
+ distro = j;
+ break;
+ }
+ }
+
+ if (i == 0 || switches[i].row != switches[i - 1].row) {
+ if (last_row == 13 || last_row == 21 || last_row == 29) {
+ logprintf("\n");
+ }
+ logprintf("\n%2u (%2u-%2u) ", switches[i].row, switches[i].row * 2 - 1, switches[i].row * 2 + 0);
+ last_num = -1;
+ }
+ for (unsigned j = last_num; j + 1 < switches[i].num; ++j) {
+ logprintf("%19s", "");
+ }
+
+ char distro_marker_left[16] = " ";
+ char distro_marker_right[16] = " ";
+ if (switches[i].num == 1) {
+ for (int d = 0; d < NUM_DISTRO; ++d) {
+ if (int(switches[i].row) == distro_placements[d]) {
+ sprintf(distro_marker_left, "[%u;1m*", d + 32);
+ }
+ if (int(switches[i].row) == -distro_placements[d]) {
+ sprintf(distro_marker_right, "[%u;1m*", d + 32);
+ }
+ }
+ }
+
+ int this_distance;
+ Inventory this_inv;
+ if (distro == -1) {
+ this_distance = _INF;
+ this_inv.num_10m = _INF;
+ logprintf("[%u;22m- ", distro + 32);
+ } else {
+ this_distance = find_distance(switches[i], distro);
+ this_inv = find_inventory(switches[i], distro);
+ total_cost += find_cost(switches[i], distro);
+ logprintf("[%u;22m%u ", distro + 32, distro);
+ }
+
+#if TRUNCATE_METRIC
+ logprintf("(%-5s) (%3.1f)%s %s", this_inv.to_string().c_str(), this_distance / 10.0, distro_marker_left, distro_marker_right);
+#else
+ logprintf("(%3.1f)%s %s", this_distance / 10.0, distro_marker_left, distro_marker_right);
+#endif
+ total_slack += find_slack(this_inv, this_distance);
+ total_inv += this_inv;
+
+ last_row = switches[i].row;
+ last_num = switches[i].num;
+
+#if OUTPUT_FILES
+ int port_num = num_ports_used[distro]++;
+ fprintf(patchlist, "e%u-%u %s %s %s %s %s\n",
+ last_row * 2 - 1, last_num + 1,
+ distro_name(distro).c_str(),
+ port_name(distro, port_num).c_str(),
+ port_name(distro, port_num + 48).c_str(),
+ port_name(distro, port_num + 96).c_str(),
+ port_name(distro, port_num + 144).c_str());
+
+ in_addr subnet_addr4;
+ subnet_addr4.s_addr = subnet_address;
+ fprintf(switchlist, "%s %u e%u-%u x.x.x.x\n",
+ inet_ntoa(subnet_addr4), SUBNET_SIZE, last_row * 2 - 1, last_num + 1);
+ subnet_address = htonl(ntohl(subnet_address) + (1ULL << (32 - SUBNET_SIZE)));
+#endif
+ }
+#if OUTPUT_FILES
+ fclose(patchlist);
+ fclose(switchlist);
+#endif
+ logprintf("\n");
+ logprintf("[%u;22m\n", 37);
+
+#if TRUNCATE_METRIC
+ logprintf("\n");
+ logprintf("10m: %3u\n", total_inv.num_10m);
+ logprintf("30m: %3u\n", total_inv.num_30m);
+ logprintf("50m: %3u\n", total_inv.num_50m);
+ logprintf("Extensions: %u\n", total_inv.extensions);
+ logprintf("Horizontal gap crossings: %u\n", total_inv.horiz_gap_crossings);
+ logprintf("\n");
+
+ if (total_inv.num_10m >= _INF) {
+ logprintf("Total cost: Impossible\n");
+ return INT_MAX;
+ }
+ int total_cable = 100 * total_inv.num_10m + 300 * total_inv.num_30m + 500 * total_inv.num_50m;
+#else
+ // Not correct unless EXTENSION_COST = HORIZ_GAP_COST = 0, but okay.
+ int total_cable = total_cost;
+#endif
+
+ logprintf("Total cable: %.1fm (cost = %.1fm)\n", total_cable / 10.0, total_cost / 10.0);
+ logprintf("Total slack: %.1fm (%.2f%%)\n", total_slack / 10.0, 100.0 * double(total_slack) / double(total_cable));
+
+ for (int i = 0; i < NUM_DISTRO; ++i) {
+ Edge *e = source_node.edges[i];
+ logprintf("Remaining ports on distro %d: %d\n", i + 1, e->capacity - e->flow);
+ }
+ return total_cost;
+}
+
+int main(int argc, char **argv)
+{
+ int distro_placements[NUM_DISTRO];
+ for (int i = 0; i < NUM_DISTRO; ++i) {
+ distro_placements[i] = atoi(argv[i + 1]);
+ }
+
+ std::string log;
+ Planner p;
+ log.clear();
+ p.set_log_buf(&log);
+ (void)p.do_work(distro_placements);
+ printf("%s\n", log.c_str());
+ return 0;
+}
diff --git a/pxe/chain.c32 b/pxe/chain.c32
new file mode 100644
index 0000000..cb1813b
--- /dev/null
+++ b/pxe/chain.c32
Binary files differ
diff --git a/pxe/menu.c32 b/pxe/menu.c32
new file mode 100644
index 0000000..4fa0a1c
--- /dev/null
+++ b/pxe/menu.c32
Binary files differ
diff --git a/pxe/menus/background.png b/pxe/menus/background.png
new file mode 100644
index 0000000..293e591
--- /dev/null
+++ b/pxe/menus/background.png
Binary files differ
diff --git a/pxe/menus/bg.png b/pxe/menus/bg.png
new file mode 100644
index 0000000..00bc09a
--- /dev/null
+++ b/pxe/menus/bg.png
Binary files differ
diff --git a/pxe/menus/common.cfg b/pxe/menus/common.cfg
new file mode 100644
index 0000000..904b2db
--- /dev/null
+++ b/pxe/menus/common.cfg
@@ -0,0 +1,24 @@
+MENU BACKGROUND menus/background.png
+ALLOWOPTIONS 1
+PROMPT 0
+MENU WIDTH 77
+MENU ROWS 14
+MENU TABMSGROW 25
+MENU CMDLINEROW 25
+MENU HELPMSGROW 23
+MENU MARGIN 15
+MENU VSHIFT 4
+MENU COLOR BORDER 37;40 #00000000 #00000000 none
+MENU COLOR TITLE 37;40 #ff6b0035 #ffffffff none
+
+MENU COLOR UNSEL 37;40 #ffeb088d #00ffffff none
+MENU COLOR HOTKEY 37;40 #ff6b0035 #00ffffff none
+
+MENU COLOR SEL 37;40 #ffeb088d #ffb1dbfa none
+MENU COLOR HOTSEL 37;40 #ff6b0035 #ffb1dbfa none
+
+MENU COLOR HELP 37;40 #fff9a11d #00ffffff none
+MENU COLOR TIMEOUT_MSG 37;40 #fff9a11d #0faaaaaa none
+MENU COLOR TIMEOUT 37;40 #fff9a11d #0faaaaff none
+
+MENU SEPARATOR
diff --git a/pxe/menus/debian.cfg b/pxe/menus/debian.cfg
new file mode 100644
index 0000000..e5e2376
--- /dev/null
+++ b/pxe/menus/debian.cfg
@@ -0,0 +1,35 @@
+# /var/lib/tftpboot/menus/debian.cfg
+MENU INCLUDE menus/common.cfg
+MENU TITLE Debian Installers
+
+LABEL mainmenu
+ MENU LABEL ^R Return to Main Menu
+ COM32 vesamenu.c32
+ APPEND ~
+
+MENU SEPARATOR
+
+
+LABEL squeeze_amd64_install
+ MENU LABEL ^1 Debian Stable amd64 (Squeeze) netinstall
+ KERNEL debian/squeeze/amd64/linux
+ APPEND vga=normal initrd=debian/squeeze/amd64/initrd.gz --
+
+LABEL squeeze_i386_install
+ MENU LABEL ^2 Debian Stable i386 (Squeeze) netinstall
+ KERNEL debian/squeeze/i386/linux
+ APPEND vga=normal initrd=debian/squeeze/i386/initrd.gz --
+
+MENU SEPARATOR
+
+LABEL wheezy_amd64_install
+ MENU LABEL ^3 Debian Testing amd64 (Wheezy) netinstall
+ KERNEL debian/wheezy/amd64/linux
+ APPEND vga=normal initrd=debian/wheezy/amd64/initrd.gz --
+
+LABEL wheezy_i386_install
+ MENU LABEL ^4 Debian Testing i386 (Wheezy) netinstall
+ KERNEL debian/wheezy/i386/linux
+ APPEND vga=normal initrd=debian/wheezy/i386/initrd.gz --
+
+TIMEOUT 900
diff --git a/pxe/menus/tools.cfg b/pxe/menus/tools.cfg
new file mode 100644
index 0000000..aa37dd0
--- /dev/null
+++ b/pxe/menus/tools.cfg
@@ -0,0 +1,36 @@
+# /var/lib/tftpboot/menus/debian.cfg
+MENU INCLUDE menus/common.cfg
+MENU TITLE Tools
+
+LABEL mainmenu
+ MENU LABEL ^R Return to Main Menu
+ COM32 vesamenu.c32
+ APPEND ~
+
+MENU SEPARATOR
+
+LABEL memtest
+ MENU LABEL ^Memory test using Memtest86+
+ TEXT HELP
+Run memory test using Memtest86+
+ ENDTEXT
+ KERNEL tools/memtest
+
+LABEL hdt
+ MENU LABEL ^HDT - Hardware Detection Tool
+ TEXT HELP
+Used to examine system devices, system information, diagnostics
+ ENDTEXT
+ COM32 tools/hdt_0_5_2.c32
+ APPEND pciids=tools/pci.ids
+
+LABEL ntpasswd
+ MENU LABEL ^Offline NT Password Recovery ...
+ MENU PASSWD nexuserbest
+ TEXT HELP
+Can be used to recover/clear Windows password. Password protected.
+ ENDTEXT
+ KERNEL tools/ntpasswd/vmlinuz
+ INITRD tools/ntpasswd/initrd.cgz,tools/ntpasswd/scsi.cgz
+
+TIMEOUT 900
diff --git a/pxe/menus/ubuntu.cfg b/pxe/menus/ubuntu.cfg
new file mode 100644
index 0000000..081bc61
--- /dev/null
+++ b/pxe/menus/ubuntu.cfg
@@ -0,0 +1,47 @@
+# /var/lib/tftpboot/menus/ubuntu.cfg
+MENU INCLUDE menus/common.cfg
+MENU TITLE Ubuntu Live boot
+
+LABEL mainmenu
+ MENU LABEL ^R Return to Main Menu
+ COM32 vesamenu.c32
+ APPEND ~
+
+MENU SEPARATOR
+
+LABEL pangolin32live
+ MENU LABEL ^1 Ubuntu 12.04.2 32bit LIVE boot
+ KERNEL ubuntu/12.04.2/i386/live/vmlinuz
+ APPEND boot=casper netboot=nfs nfsroot=151.216.125.3:/var/nfsroot/ubuntu/12.04.2/i386 quiet splash initrd=ubuntu/12.04.2/i386/live/initrd.lz --
+
+LABEL pangolin64live
+ MENU LABEL ^2 Ubuntu 12.04.2 64bit LIVE boot
+ KERNEL ubuntu/12.04.2/amd64/live/vmlinuz.efi
+ APPEND boot=casper netboot=nfs nfsroot=151.216.125.3:/var/nfsroot/ubuntu/12.04.2/amd64 quiet splash initrd=ubuntu/12.04.2/amd64/live/initrd.lz --
+
+MENU SEPARATOR
+
+LABEL xpangolin32live
+ MENU LABEL ^3 xubuntu 12.04.2 32bit LIVE boot
+ KERNEL xubuntu/12.04.2/i386/live/vmlinuz
+ APPEND boot=casper netboot=nfs nfsroot=151.216.125.3:/var/nfsroot/xubuntu/12.04.2/i386 quiet splash initrd=xubuntu/12.04.2/i386/live/initrd.lz --
+
+LABEL xpangolin64live
+ MENU LABEL ^4 xubuntu 12.04.2 64bit LIVE boot
+ KERNEL xubuntu/12.04.2/amd64/live/vmlinuz
+ APPEND boot=casper netboot=nfs nfsroot=151.216.125.3:/var/nfsroot/xubuntu/12.04.2/amd64 quiet splash initrd=xubuntu/12.04.2/amd64/live/initrd.lz --
+
+MENU SEPARATOR
+
+LABEL quetzal64
+ MENU LABEL ^5 Ubuntu 12.10 64bit Installer
+ KERNEL ubuntu/12.10/amd64/linux
+ APPEND boot=casper quiet splash initrd=ubuntu/12.10/amd64/initrd.gz --
+
+LABEL quetzal32
+ MENU LABEL ^6 Ubuntu 12.10 32bit Installer
+ KERNEL ubuntu/12.10/i386/linux
+ APPEND boot=casper quiet splash initrd=ubuntu/12.10/i386/initrd.gz --
+
+
+TIMEOUT 900
diff --git a/pxe/pxelinux.0 b/pxe/pxelinux.0
new file mode 100644
index 0000000..c763741
--- /dev/null
+++ b/pxe/pxelinux.0
Binary files differ
diff --git a/pxe/pxelinux.cfg/default b/pxe/pxelinux.cfg/default
new file mode 100644
index 0000000..8c594fa
--- /dev/null
+++ b/pxe/pxelinux.cfg/default
@@ -0,0 +1,39 @@
+# /var/lib/tftpboot/pxelinux.cfg/default
+DEFAULT vesamenu.c32
+MENU INCLUDE menus/common.cfg
+MENU TITLE The Gathering 2013 - Singularity boot menu
+
+LABEL boot_hd0
+ MENU LABEL Boot from first hard drive
+ MENU DEFAULT
+ TEXT HELP
+Boots your system as normal from the first BIOS drive
+ ENDTEXT
+ COM32 chain.c32
+ APPEND hd0
+
+MENU SEPARATOR
+
+LABEL debian
+ MENU LABEL ^1 Debian
+ TEXT HELP
+Debian installers and live-boot options.
+ ENDTEXT
+ COM32 vesamenu.c32
+ APPEND menus/debian.cfg
+
+LABEL ubuntu
+ MENU LABEL ^2 Ubuntu
+ TEXT HELP
+Ubuntu installers and live-boot options.
+ ENDTEXT
+ COM32 vesamenu.c32
+ APPEND menus/ubuntu.cfg
+
+LABEL tools
+ MENU LABEL ^3 Tools
+ COM32 vesamenu.c32
+ APPEND menus/tools.cfg
+
+ONTIMEOUT boot_hd0
+TIMEOUT 300
diff --git a/pxe/version.info b/pxe/version.info
new file mode 100644
index 0000000..8a4a704
--- /dev/null
+++ b/pxe/version.info
@@ -0,0 +1,2 @@
+Debian version: 6.0 (squeeze)
+Installer build: 20110106+squeeze4+b3
diff --git a/pxe/vesamenu.c32 b/pxe/vesamenu.c32
new file mode 100644
index 0000000..8dca92f
--- /dev/null
+++ b/pxe/vesamenu.c32
Binary files differ
diff --git a/sql/nms.sql b/sql/nms.sql
new file mode 100644
index 0000000..881e19a
--- /dev/null
+++ b/sql/nms.sql
@@ -0,0 +1,2043 @@
+--
+-- PostgreSQL database cluster dump
+--
+
+\connect postgres
+
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+
+--
+-- Roles
+--
+
+CREATE ROLE nms;
+ALTER ROLE nms WITH NOSUPERUSER INHERIT NOCREATEROLE NOCREATEDB LOGIN NOREPLICATION PASSWORD '<removed>';
+CREATE ROLE postgres;
+ALTER ROLE postgres WITH SUPERUSER INHERIT CREATEROLE CREATEDB LOGIN REPLICATION;
+
+
+
+
+
+
+--
+-- Database creation
+--
+
+CREATE DATABASE nms WITH TEMPLATE = template0 OWNER = nms;
+REVOKE ALL ON DATABASE template1 FROM PUBLIC;
+REVOKE ALL ON DATABASE template1 FROM postgres;
+GRANT ALL ON DATABASE template1 TO postgres;
+GRANT CONNECT ON DATABASE template1 TO PUBLIC;
+
+
+\connect nms
+
+--
+-- PostgreSQL database dump
+--
+
+SET statement_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+
+--
+-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner:
+--
+
+CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
+
+
+--
+-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner:
+--
+
+COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
+
+
+SET search_path = public, pg_catalog;
+
+--
+-- Name: datarate; Type: TYPE; Schema: public; Owner: nms
+--
+
+CREATE TYPE datarate AS (
+ switch integer,
+ port integer,
+ bytes_in double precision,
+ bytes_out double precision,
+ last_poll_time timestamp with time zone
+);
+
+
+ALTER TYPE public.datarate OWNER TO nms;
+
+--
+-- Name: sample; Type: TYPE; Schema: public; Owner: postgres
+--
+
+CREATE TYPE sample AS (
+ value bigint,
+ polled timestamp with time zone
+);
+
+
+ALTER TYPE public.sample OWNER TO postgres;
+
+--
+-- Name: sample_state; Type: TYPE; Schema: public; Owner: postgres
+--
+
+CREATE TYPE sample_state AS (
+ last sample,
+ next_last sample
+);
+
+
+ALTER TYPE public.sample_state OWNER TO postgres;
+
+--
+-- Name: add_new_element(sample[], sample); Type: FUNCTION; Schema: public; Owner: postgres
+--
+
+CREATE FUNCTION add_new_element(sample[], sample) RETURNS sample[]
+ LANGUAGE sql
+ AS $_$ select ('{' || $1[1] || ', ' || $2 || '}')::sample[] $_$;
+
+
+ALTER FUNCTION public.add_new_element(sample[], sample) OWNER TO postgres;
+
+--
+-- Name: add_new_element(sample_state, sample); Type: FUNCTION; Schema: public; Owner: postgres
+--
+
+CREATE FUNCTION add_new_element(sample_state, sample) RETURNS sample_state
+ LANGUAGE sql
+ AS $_$
+ SELECT ($1.next_last, $2)::sample_state
+$_$;
+
+
+ALTER FUNCTION public.add_new_element(sample_state, sample) OWNER TO postgres;
+
+--
+-- Name: get_current_datarate(); Type: FUNCTION; Schema: public; Owner: nms
+--
+
+CREATE FUNCTION get_current_datarate() RETURNS SETOF datarate
+ LANGUAGE plpgsql
+ AS $$
+DECLARE
+ num_entries INTEGER;
+ poll polls;
+ first_poll polls;
+ last_poll polls;
+ timediff float;
+ ret datarate;
+BEGIN
+ num_entries := 0;
+ last_poll.switch := -1;
+
+ FOR poll IN select * from polls where time >= now() - '15 minutes'::interval and time < now() order by switch,port,time LOOP
+ IF poll.switch <> last_poll.switch OR poll.port <> last_poll.port THEN
+ IF num_entries >= 2 THEN
+ timediff := EXTRACT(epoch from last_poll.time - first_poll.time);
+ ret.switch := last_poll.switch;
+ ret.port := last_poll.port;
+
+ IF last_poll.bytes_in >= first_poll.bytes_in AND last_poll.bytes_out >= first_poll.bytes_out THEN
+ ret.bytes_in := (last_poll.bytes_in - first_poll.bytes_in) / timediff;
+ ret.bytes_out := (last_poll.bytes_out - first_poll.bytes_out) / timediff;
+ ret.last_poll_time := last_poll.time;
+ return next ret;
+ END IF;
+ END IF;
+ num_entries := 0;
+ ELSE
+ -- reset if we have wraparound
+ IF last_poll.bytes_in < first_poll.bytes_in OR
+ last_poll.bytes_out < first_poll.bytes_out THEN
+ num_entries := 0;
+ END IF;
+ END IF;
+
+ num_entries := num_entries + 1;
+ IF num_entries = 1 THEN
+ first_poll.switch := poll.switch;
+ first_poll.port := poll.port;
+ first_poll.time := poll.time;
+ first_poll.bytes_in := poll.bytes_in;
+ first_poll.bytes_out := poll.bytes_out;
+ END IF;
+
+ last_poll.switch := poll.switch;
+ last_poll.port := poll.port;
+ last_poll.time := poll.time;
+ last_poll.bytes_in := poll.bytes_in;
+ last_poll.bytes_out := poll.bytes_out;
+ END LOOP;
+
+ -- last
+ IF num_entries >= 2 THEN
+ timediff := EXTRACT(epoch from last_poll.time - first_poll.time);
+ ret.switch := last_poll.switch;
+ ret.port := last_poll.port;
+
+ IF last_poll.bytes_in >= first_poll.bytes_in AND
+ last_poll.bytes_out >= first_poll.bytes_out THEN
+ ret.bytes_in := (last_poll.bytes_in - first_poll.bytes_in) / timediff;
+ ret.bytes_out := (last_poll.bytes_out - first_poll.bytes_out) / timediff;
+ ret.last_poll_time := last_poll.time;
+ return next ret;
+ END IF;
+ END IF;
+
+ RETURN;
+END;
+$$;
+
+
+ALTER FUNCTION public.get_current_datarate() OWNER TO nms;
+
+--
+-- Name: get_datarate(); Type: FUNCTION; Schema: public; Owner: nms
+--
+
+CREATE FUNCTION get_datarate() RETURNS SETOF datarate
+ LANGUAGE plpgsql
+ AS $$
+DECLARE
+ num_entries INTEGER;
+ poll polls;
+ second_last_poll polls;
+ last_poll polls;
+ timediff float;
+ ret datarate;
+BEGIN
+ num_entries := 0;
+ last_poll.switch = -1;
+
+ FOR poll IN select * from polls where time >= now() - '15 minutes'::interval and time < now() order by switch,port,time LOOP
+ IF poll.switch <> last_poll.switch OR poll.port <> last_poll.port THEN
+ IF num_entries >= 2 THEN
+ timediff := EXTRACT(epoch from last_poll.time - second_last_poll.time);
+ ret.switch := last_poll.switch;
+ ret.port := last_poll.port;
+
+ IF last_poll.bytes_in < second_last_poll.bytes_in THEN
+ second_last_poll.bytes_in = 0;
+ END IF;
+ IF last_poll.bytes_out < second_last_poll.bytes_out THEN
+ second_last_poll.bytes_out = 0;
+ END IF;
+
+ ret.bytes_in := (last_poll.bytes_in - second_last_poll.bytes_in) / timediff;
+ ret.bytes_out := (last_poll.bytes_out - second_last_poll.bytes_out) / timediff;
+ ret.last_poll_time := last_poll.time;
+ return next ret;
+ ELSIF num_entries = 1 THEN
+ ret.switch := last_poll.switch;
+ ret.port := last_poll.port;
+ ret.bytes_in := -1;
+ ret.bytes_out := -1;
+ ret.last_poll_time := last_poll.time;
+ return next ret;
+ END IF;
+ num_entries := 1;
+ ELSE
+ num_entries := num_entries + 1;
+ END IF;
+ second_last_poll.switch := last_poll.switch;
+ second_last_poll.port := last_poll.port;
+ second_last_poll.time := last_poll.time;
+ second_last_poll.bytes_in := last_poll.bytes_in;
+ second_last_poll.bytes_out := last_poll.bytes_out;
+ last_poll.switch := poll.switch;
+ last_poll.port := poll.port;
+ last_poll.time := poll.time;
+ last_poll.bytes_in := poll.bytes_in;
+ last_poll.bytes_out := poll.bytes_out;
+ END LOOP;
+ -- pah, and once more, for the last switch/port...
+ IF num_entries >= 2 THEN
+ timediff := EXTRACT(epoch from last_poll.time - second_last_poll.time);
+ ret.switch := last_poll.switch;
+ ret.port := last_poll.port;
+
+ IF last_poll.bytes_in < second_last_poll.bytes_in THEN
+ second_last_poll.bytes_in = 0;
+ END IF;
+ IF last_poll.bytes_out < second_last_poll.bytes_out THEN
+ second_last_poll.bytes_out = 0;
+ END IF;
+
+ ret.bytes_in := (last_poll.bytes_in - second_last_poll.bytes_in) / timediff;
+ ret.bytes_out := (last_poll.bytes_out - second_last_poll.bytes_out) / timediff;
+ ret.last_poll_time := last_poll.time;
+ return next ret;
+ ELSIF num_entries = 1 THEN
+ ret.switch := last_poll.switch;
+ ret.port := last_poll.port;
+ ret.bytes_in := -1;
+ ret.bytes_out := -1;
+ ret.last_poll_time := last_poll.time;
+ return next ret;
+ END IF;
+
+ RETURN;
+END;
+$$;
+
+
+ALTER FUNCTION public.get_datarate() OWNER TO nms;
+
+--
+-- Name: current_change(sample); Type: AGGREGATE; Schema: public; Owner: postgres
+--
+
+CREATE AGGREGATE current_change(sample) (
+ SFUNC = public.add_new_element,
+ STYPE = sample_state
+);
+
+
+ALTER AGGREGATE public.current_change(sample) OWNER TO postgres;
+
+SET default_tablespace = '';
+
+SET default_with_oids = false;
+
+--
+-- Name: ap_poll; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE ap_poll (
+ switch integer NOT NULL,
+ model character varying DEFAULT ''::character varying NOT NULL,
+ last_poll timestamp with time zone
+);
+
+
+ALTER TABLE public.ap_poll OWNER TO nms;
+
+--
+-- Name: backup_polls; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE backup_polls (
+ "time" timestamp with time zone,
+ switch integer,
+ port integer,
+ bytes_in bigint,
+ bytes_out bigint,
+ errors_in bigint,
+ errors_out bigint
+);
+
+
+ALTER TABLE public.backup_polls OWNER TO nms;
+
+--
+-- Name: cpuloadpoll_id_seq; Type: SEQUENCE; Schema: public; Owner: nms
+--
+
+CREATE SEQUENCE cpuloadpoll_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE public.cpuloadpoll_id_seq OWNER TO nms;
+
+--
+-- Name: cpuloadpoll; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE cpuloadpoll (
+ id integer DEFAULT nextval('cpuloadpoll_id_seq'::regclass) NOT NULL,
+ "time" timestamp without time zone NOT NULL,
+ switch integer NOT NULL,
+ entity integer NOT NULL,
+ value integer NOT NULL
+);
+
+
+ALTER TABLE public.cpuloadpoll OWNER TO nms;
+
+--
+-- Name: dhcp; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE dhcp (
+ switch integer NOT NULL,
+ network cidr NOT NULL,
+ last_ack timestamp without time zone,
+ owner_color character varying
+);
+
+
+ALTER TABLE public.dhcp OWNER TO nms;
+
+--
+-- Name: ipv4; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE ipv4 (
+ mac macaddr NOT NULL,
+ address inet NOT NULL,
+ "time" timestamp without time zone NOT NULL,
+ age integer
+);
+
+
+ALTER TABLE public.ipv4 OWNER TO nms;
+
+--
+-- Name: ipv6; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE ipv6 (
+ mac macaddr NOT NULL,
+ address inet NOT NULL,
+ "time" timestamp with time zone NOT NULL,
+ age integer,
+ vlan text
+);
+
+
+ALTER TABLE public.ipv6 OWNER TO nms;
+
+--
+-- Name: mbd_log; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE mbd_log (
+ ts timestamp without time zone,
+ game character varying,
+ port integer,
+ description character varying,
+ active_servers integer
+);
+
+
+ALTER TABLE public.mbd_log OWNER TO nms;
+
+--
+-- Name: mldpolls; Type: TABLE; Schema: public; Owner: postgres; Tablespace:
+--
+
+CREATE TABLE mldpolls (
+ "time" timestamp with time zone NOT NULL,
+ switch integer NOT NULL,
+ mcast_group inet NOT NULL,
+ count integer NOT NULL,
+ raw_portlist character varying
+);
+
+
+ALTER TABLE public.mldpolls OWNER TO postgres;
+
+--
+-- Name: placements; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE placements (
+ switch integer NOT NULL,
+ placement box NOT NULL,
+ zorder integer DEFAULT 0 NOT NULL
+);
+
+
+ALTER TABLE public.placements OWNER TO nms;
+
+--
+-- Name: polls; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE polls (
+ "time" timestamp with time zone NOT NULL,
+ switch integer NOT NULL,
+ port integer NOT NULL,
+ bytes_in bigint NOT NULL,
+ bytes_out bigint NOT NULL,
+ errors_in bigint NOT NULL,
+ errors_out bigint NOT NULL
+);
+ALTER TABLE ONLY polls ALTER COLUMN "time" SET STATISTICS 100;
+
+
+ALTER TABLE public.polls OWNER TO nms;
+
+--
+-- Name: polls_poll_seq; Type: SEQUENCE; Schema: public; Owner: nms
+--
+
+CREATE SEQUENCE polls_poll_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE public.polls_poll_seq OWNER TO nms;
+
+--
+-- Name: portnames; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE portnames (
+ switchtype character varying NOT NULL,
+ port integer NOT NULL,
+ description character varying NOT NULL
+);
+
+
+ALTER TABLE public.portnames OWNER TO nms;
+
+--
+-- Name: squeue; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE squeue (
+ id integer DEFAULT nextval(('squeue_sequence'::text)::regclass) NOT NULL,
+ gid integer NOT NULL,
+ added timestamp with time zone NOT NULL,
+ updated timestamp with time zone,
+ addr inet,
+ cmd character varying NOT NULL,
+ locked boolean DEFAULT false NOT NULL,
+ processed boolean DEFAULT false NOT NULL,
+ disabled boolean DEFAULT false NOT NULL,
+ priority integer DEFAULT 3,
+ sysname character varying NOT NULL,
+ author character varying NOT NULL,
+ result character varying,
+ delay timestamp with time zone,
+ delaytime interval DEFAULT '00:01:00'::interval
+);
+
+
+ALTER TABLE public.squeue OWNER TO nms;
+
+--
+-- Name: squeue_group_sequence; Type: SEQUENCE; Schema: public; Owner: nms
+--
+
+CREATE SEQUENCE squeue_group_sequence
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE public.squeue_group_sequence OWNER TO nms;
+
+--
+-- Name: squeue_sequence; Type: SEQUENCE; Schema: public; Owner: nms
+--
+
+CREATE SEQUENCE squeue_sequence
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE public.squeue_sequence OWNER TO nms;
+
+--
+-- Name: stemppoll_sequence; Type: SEQUENCE; Schema: public; Owner: nms
+--
+
+CREATE SEQUENCE stemppoll_sequence
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE public.stemppoll_sequence OWNER TO nms;
+
+--
+-- Name: switches; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE switches (
+ switch integer DEFAULT nextval(('"switches_switch_seq"'::text)::regclass) NOT NULL,
+ ip inet NOT NULL,
+ sysname character varying NOT NULL,
+ switchtype character varying NOT NULL,
+ last_updated timestamp with time zone,
+ locked boolean DEFAULT false NOT NULL,
+ priority integer DEFAULT 0 NOT NULL,
+ poll_frequency interval DEFAULT '00:05:00'::interval NOT NULL,
+ community character varying DEFAULT 'public'::character varying NOT NULL
+);
+
+
+ALTER TABLE public.switches OWNER TO nms;
+
+--
+-- Name: switches_switch_seq; Type: SEQUENCE; Schema: public; Owner: nms
+--
+
+CREATE SEQUENCE switches_switch_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER TABLE public.switches_switch_seq OWNER TO nms;
+
+--
+-- Name: switchtypes; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE switchtypes (
+ switchtype character varying NOT NULL,
+ ports character varying NOT NULL,
+ wide_counters boolean DEFAULT false NOT NULL
+);
+
+
+ALTER TABLE public.switchtypes OWNER TO nms;
+
+--
+-- Name: temppoll; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE temppoll (
+ id integer DEFAULT nextval(('stemppoll_sequence'::text)::regclass) NOT NULL,
+ "time" timestamp without time zone NOT NULL,
+ switch integer NOT NULL,
+ temp double precision
+);
+
+
+ALTER TABLE public.temppoll OWNER TO nms;
+
+--
+-- Name: uplinks; Type: TABLE; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE TABLE uplinks (
+ switch integer NOT NULL,
+ coreswitch integer NOT NULL,
+ blade integer NOT NULL,
+ port integer NOT NULL
+);
+
+
+ALTER TABLE public.uplinks OWNER TO nms;
+
+--
+-- Data for Name: ap_poll; Type: TABLE DATA; Schema: public; Owner: nms
+--
+
+COPY ap_poll (switch, model, last_poll) FROM stdin;
+\.
+
+
+--
+-- Data for Name: backup_polls; Type: TABLE DATA; Schema: public; Owner: nms
+--
+
+COPY backup_polls ("time", switch, port, bytes_in, bytes_out, errors_in, errors_out) FROM stdin;
+\.
+
+
+--
+-- Data for Name: cpuloadpoll; Type: TABLE DATA; Schema: public; Owner: nms
+--
+
+COPY cpuloadpoll (id, "time", switch, entity, value) FROM stdin;
+\.
+
+
+--
+-- Name: cpuloadpoll_id_seq; Type: SEQUENCE SET; Schema: public; Owner: nms
+--
+
+SELECT pg_catalog.setval('cpuloadpoll_id_seq', 1, false);
+
+
+--
+-- Data for Name: dhcp; Type: TABLE DATA; Schema: public; Owner: nms
+--
+
+COPY dhcp (switch, network, last_ack, owner_color) FROM stdin;
+106 151.216.27.64/26 2013-03-31 07:53:24 #000000
+2 151.216.1.64/26 2013-03-31 07:54:48 #000000
+91 151.216.23.128/26 2013-03-31 08:04:58 #000000
+108 151.216.27.192/26 2013-03-31 08:17:17 #000000
+79 151.216.20.128/26 2013-03-31 08:20:27 #000000
+83 151.216.21.128/26 2013-03-31 08:24:38 #000000
+107 151.216.27.128/26 2013-03-31 08:30:13 #000000
+31 151.216.8.128/26 2013-03-31 08:44:47 #000000
+104 151.216.26.192/26 2013-03-31 08:45:11 #000000
+11 151.216.3.128/26 2013-03-31 08:52:07 #000000
+102 151.216.26.64/26 2013-03-31 08:55:46 #000000
+15 151.216.4.128/26 2013-03-31 08:58:05 #000000
+26 151.216.7.64/26 2013-03-31 09:13:42 #000000
+93 151.216.24.0/26 2013-03-31 09:14:03 #000000
+57 151.216.15.0/26 2013-03-31 09:30:18 #000000
+47 151.216.12.128/26 2013-03-31 09:31:12 #000000
+103 151.216.26.128/26 2013-03-31 09:37:39 #000000
+23 151.216.6.128/26 2013-03-31 09:45:17 #000000
+113 151.216.29.0/26 2013-03-31 09:45:35 #000000
+18 151.216.5.64/26 2013-03-31 09:45:49 #000000
+89 151.216.23.0/26 2013-03-31 09:45:57 #000000
+114 151.216.29.64/26 2013-03-31 09:46:29 #000000
+87 151.216.22.128/26 2013-03-31 09:48:38 #000000
+8 151.216.2.192/26 2013-03-31 09:53:10 #000000
+46 151.216.12.64/26 2013-03-31 09:57:09 #000000
+95 151.216.24.128/26 2013-03-31 09:58:08 #000000
+72 151.216.18.192/26 2013-03-31 09:59:29 #000000
+116 151.216.29.192/26 2013-03-31 10:01:14 #000000
+17 151.216.5.0/26 2013-03-31 10:01:27 #000000
+59 151.216.15.128/26 2013-03-31 10:12:07 #000000
+68 151.216.17.192/26 2013-03-31 10:14:20 #000000
+22 151.216.6.64/26 2013-03-31 10:14:22 #000000
+90 151.216.23.64/26 2013-03-31 10:15:18 #000000
+30 151.216.8.64/26 2013-03-31 10:15:46 #000000
+56 151.216.14.192/26 2013-03-31 10:18:37 #000000
+61 151.216.16.0/26 2013-03-31 10:21:12 #000000
+126 151.216.32.64/26 2013-03-31 10:21:49 #000000
+24 151.216.6.192/26 2013-03-31 10:22:31 #000000
+43 151.216.11.128/26 2013-03-31 10:26:03 #000000
+28 151.216.7.192/26 2013-03-31 10:26:04 #000000
+71 151.216.18.128/26 2013-03-31 10:28:44 #000000
+75 151.216.19.128/26 2013-03-31 10:29:05 #000000
+101 151.216.26.0/26 2013-03-31 10:29:46 #000000
+128 151.216.32.192/26 2013-03-31 10:30:46 #000000
+55 151.216.14.128/26 2013-03-31 10:32:26 #000000
+4 151.216.1.192/26 2013-03-31 10:33:55 #000000
+99 151.216.25.128/26 2013-03-31 10:33:56 #000000
+85 151.216.22.0/26 2013-03-31 10:34:46 #000000
+67 151.216.17.128/26 2013-03-31 10:36:17 #000000
+49 151.216.13.0/26 2013-03-31 10:36:21 #000000
+44 151.216.11.192/26 2013-03-31 10:36:34 #000000
+70 151.216.18.64/26 2013-03-31 10:37:05 #000000
+94 151.216.24.64/26 2013-03-31 10:37:17 #000000
+73 151.216.19.0/26 2013-03-31 10:37:28 #000000
+10 151.216.3.64/26 2013-03-31 10:37:36 #000000
+64 151.216.16.192/26 2013-03-31 10:37:39 #000000
+119 151.216.30.128/26 2013-03-31 10:39:58 #000000
+48 151.216.12.192/26 2013-03-31 10:40:55 #000000
+33 151.216.9.0/26 2013-03-31 10:41:16 #000000
+1 151.216.1.0/26 2013-03-31 10:42:04 #000000
+32 151.216.8.192/26 2013-03-31 10:42:50 #000000
+3 151.216.1.128/26 2013-03-31 10:43:20 #000000
+84 151.216.21.192/26 2013-03-31 10:43:29 #000000
+13 151.216.4.0/26 2013-03-31 10:43:35 #000000
+105 151.216.27.0/26 2013-03-31 10:43:50 #000000
+42 151.216.11.64/26 2013-03-31 10:44:06 #000000
+21 151.216.6.0/26 2013-03-31 10:45:30 #000000
+60 151.216.15.192/26 2013-03-31 10:46:00 #000000
+82 151.216.21.64/26 2013-03-31 10:46:49 #000000
+80 151.216.20.192/26 2013-03-31 10:48:02 #000000
+9 151.216.3.0/26 2013-03-31 10:48:12 #000000
+78 151.216.20.64/26 2013-03-31 10:49:10 #000000
+40 151.216.10.192/26 2013-03-31 10:49:12 #000000
+120 151.216.30.192/26 2013-03-31 10:49:56 #000000
+51 151.216.13.128/26 2013-03-31 10:51:12 #000000
+111 151.216.28.128/26 2013-03-31 10:51:49 #000000
+36 151.216.9.192/26 2013-03-31 10:52:01 #000000
+127 151.216.32.128/26 2013-03-31 10:52:05 #000000
+98 151.216.25.64/26 2013-03-31 10:52:09 #000000
+50 151.216.13.64/26 2013-03-31 10:52:31 #000000
+20 151.216.5.192/26 2013-03-31 10:52:47 #000000
+41 151.216.11.0/26 2013-03-31 10:53:03 #000000
+58 151.216.15.64/26 2013-03-31 10:53:06 #000000
+37 151.216.10.0/26 2013-03-31 10:53:13 #000000
+76 151.216.19.192/26 2013-03-31 10:54:00 #000000
+34 151.216.9.64/26 2013-03-31 10:54:04 #000000
+45 151.216.12.0/26 2013-03-31 10:54:13 #000000
+65 151.216.17.0/26 2013-03-31 10:54:45 #000000
+96 151.216.24.192/26 2013-03-31 10:55:15 #000000
+74 151.216.19.64/26 2013-03-31 10:55:25 #000000
+6 151.216.2.64/26 2013-03-31 10:56:28 #000000
+53 151.216.14.0/26 2013-03-31 10:56:42 #000000
+63 151.216.16.128/26 2013-03-31 10:57:06 #000000
+7 151.216.2.128/26 2013-03-31 10:57:08 #000000
+122 151.216.31.64/26 2013-03-31 10:57:10 #000000
+52 151.216.13.192/26 2013-03-31 10:57:23 #000000
+19 151.216.5.128/26 2013-03-31 10:57:31 #000000
+27 151.216.7.128/26 2013-03-31 10:57:52 #000000
+124 151.216.31.192/26 2013-03-31 10:58:10 #000000
+16 151.216.4.192/26 2013-03-31 10:58:22 #000000
+62 151.216.16.64/26 2013-03-31 10:58:38 #000000
+110 151.216.28.64/26 2013-03-31 10:58:42 #000000
+5 151.216.2.0/26 2013-03-31 10:58:43 #000000
+35 151.216.9.128/26 2013-03-31 10:58:43 #000000
+81 151.216.21.0/26 2013-03-31 10:58:43 #000000
+25 151.216.7.0/26 2013-03-31 10:58:51 #000000
+117 151.216.30.0/26 2013-03-31 10:59:19 #000000
+115 151.216.29.128/26 2013-03-31 10:59:53 #000000
+14 151.216.4.64/26 2013-03-31 11:00:05 #000000
+38 151.216.10.64/26 2013-03-31 11:00:19 #000000
+77 151.216.20.0/26 2013-03-31 11:00:36 #000000
+12 151.216.3.192/26 2013-03-31 11:01:02 #000000
+109 151.216.28.0/26 2013-03-31 11:02:23 #000000
+97 151.216.25.0/26 2013-03-31 11:02:25 #000000
+123 151.216.31.128/26 2013-03-31 11:02:43 #000000
+121 151.216.31.0/26 2013-03-31 11:02:52 #000000
+88 151.216.22.192/26 2013-03-31 11:03:11 #000000
+29 151.216.8.0/26 2013-03-31 11:03:45 #000000
+86 151.216.22.64/26 2013-03-31 11:03:50 #000000
+125 151.216.32.0/26 2013-03-31 11:04:08 #000000
+118 151.216.30.64/26 2013-03-31 11:04:37 #000000
+66 151.216.17.64/26 2013-03-31 11:05:14 #000000
+112 151.216.28.192/26 2013-03-31 11:05:34 #000000
+92 151.216.23.192/26 2013-03-31 11:06:12 #000000
+69 151.216.18.0/26 2013-03-31 11:07:12 #000000
+39 151.216.10.128/26 2013-03-31 11:07:35 #000000
+54 151.216.14.64/26 2013-03-31 11:08:33 #000000
+100 151.216.25.192/26 2013-03-31 11:08:35 #000000
+\.
+
+
+--
+-- Data for Name: ipv4; Type: TABLE DATA; Schema: public; Owner: nms
+--
+
+COPY ipv4 (mac, address, "time", age) FROM stdin;
+\.
+
+
+--
+-- Data for Name: ipv6; Type: TABLE DATA; Schema: public; Owner: nms
+--
+
+COPY ipv6 (mac, address, "time", age, vlan) FROM stdin;
+\.
+
+
+--
+-- Data for Name: mbd_log; Type: TABLE DATA; Schema: public; Owner: nms
+--
+
+COPY mbd_log (ts, game, port, description, active_servers) FROM stdin;
+\.
+
+
+--
+-- Data for Name: mldpolls; Type: TABLE DATA; Schema: public; Owner: postgres
+--
+
+COPY mldpolls ("time", switch, mcast_group, count, raw_portlist) FROM stdin;
+\.
+
+
+--
+-- Data for Name: placements; Type: TABLE DATA; Schema: public; Owner: nms
+--
+
+COPY placements (switch, placement, zorder) FROM stdin;
+1 (234,310),(220,226) 0
+2 (234,226),(220,184) 0
+3 (255,310),(241,226) 0
+4 (255,226),(241,170) 0
+5 (277,310),(263,226) 0
+6 (277,226),(263,156) 0
+7 (298,310),(284,226) 0
+8 (298,226),(284,142) 0
+9 (320,310),(306,226) 0
+10 (320,226),(306,142) 0
+11 (351,507),(337,423) 0
+12 (351,423),(337,339) 0
+13 (351,310),(337,226) 0
+14 (351,226),(337,142) 0
+15 (373,507),(359,423) 0
+16 (373,423),(359,339) 0
+17 (373,310),(359,226) 0
+18 (373,226),(359,142) 0
+19 (394,507),(380,423) 0
+20 (394,423),(380,339) 0
+21 (394,310),(380,226) 0
+22 (394,226),(380,142) 0
+23 (416,507),(402,423) 0
+24 (416,423),(402,339) 0
+25 (416,310),(402,226) 0
+26 (416,226),(402,142) 0
+27 (437,507),(423,423) 0
+28 (437,423),(423,339) 0
+29 (437,310),(423,226) 0
+30 (437,226),(423,142) 0
+31 (459,507),(445,423) 0
+32 (459,423),(445,339) 0
+33 (459,310),(445,226) 0
+34 (459,226),(445,142) 0
+35 (480,507),(466,423) 0
+36 (480,423),(466,339) 0
+37 (480,310),(466,226) 0
+38 (480,226),(466,142) 0
+39 (502,507),(488,423) 0
+40 (502,423),(488,339) 0
+41 (502,310),(488,226) 0
+42 (502,226),(488,142) 0
+43 (533,507),(519,423) 0
+44 (533,423),(519,339) 0
+45 (555,507),(541,423) 0
+46 (555,423),(541,339) 0
+47 (576,507),(562,423) 0
+48 (576,423),(562,339) 0
+49 (598,507),(584,423) 0
+50 (598,423),(584,339) 0
+51 (619,507),(605,423) 0
+52 (619,423),(605,339) 0
+53 (641,507),(627,423) 0
+54 (641,423),(627,339) 0
+55 (662,507),(648,423) 0
+56 (662,423),(648,339) 0
+57 (684,507),(670,423) 0
+58 (684,423),(670,339) 0
+59 (715,507),(701,423) 0
+60 (715,423),(701,339) 0
+61 (715,310),(701,226) 0
+62 (715,226),(701,142) 0
+63 (737,507),(723,423) 0
+64 (737,423),(723,339) 0
+65 (737,310),(723,226) 0
+66 (737,226),(723,142) 0
+67 (758,507),(744,423) 0
+68 (758,423),(744,339) 0
+69 (758,310),(744,226) 0
+70 (758,226),(744,142) 0
+71 (780,507),(766,423) 0
+72 (780,423),(766,339) 0
+73 (780,310),(766,226) 0
+74 (780,226),(766,142) 0
+75 (801,507),(787,423) 0
+76 (801,423),(787,339) 0
+77 (801,310),(787,226) 0
+78 (801,226),(787,142) 0
+79 (823,507),(809,423) 0
+80 (823,423),(809,339) 0
+81 (823,310),(809,226) 0
+82 (823,226),(809,142) 0
+83 (844,507),(830,423) 0
+84 (844,423),(830,339) 0
+85 (844,310),(830,226) 0
+86 (844,226),(830,142) 0
+87 (866,507),(852,423) 0
+88 (866,423),(852,339) 0
+89 (866,310),(852,226) 0
+90 (866,226),(852,142) 0
+91 (897,507),(883,423) 0
+92 (897,423),(883,339) 0
+93 (897,310),(883,226) 0
+94 (897,226),(883,142) 0
+95 (919,507),(905,423) 0
+96 (919,423),(905,339) 0
+97 (919,310),(905,226) 0
+98 (919,226),(905,142) 0
+99 (940,507),(926,423) 0
+100 (940,423),(926,339) 0
+101 (940,310),(926,226) 0
+102 (940,226),(926,142) 0
+103 (962,507),(948,423) 0
+104 (962,423),(948,339) 0
+105 (962,310),(948,226) 0
+106 (962,226),(948,142) 0
+107 (983,507),(969,423) 0
+108 (983,423),(969,339) 0
+109 (983,310),(969,226) 0
+110 (983,226),(969,142) 0
+111 (1005,507),(991,423) 0
+112 (1005,423),(991,339) 0
+113 (1005,310),(991,226) 0
+114 (1005,226),(991,142) 0
+115 (1026,507),(1012,423) 0
+116 (1026,423),(1012,339) 0
+117 (1026,310),(1012,226) 0
+118 (1026,226),(1012,142) 0
+119 (1048,507),(1034,423) 0
+120 (1048,423),(1034,339) 0
+121 (1048,310),(1034,226) 0
+122 (1048,226),(1034,142) 0
+123 (1069,507),(1055,423) 0
+124 (1069,423),(1055,339) 0
+125 (1069,310),(1055,226) 0
+126 (1069,226),(1055,142) 0
+127 (1091,493),(1077,423) 0
+128 (1091,423),(1077,339) 0
+130 (1180,530),(1150,500) 1
+131 (1280,330),(1250,300) 1
+134 (830,130),(800,100) 1
+135 (1130,340),(1100,310) 1
+140 (360,340),(330,310) 1
+141 (460,340),(430,310) 1
+142 (730,340),(700,310) 1
+143 (800,340),(770,310) 1
+144 (1000,340),(970,310) 1
+136 (160,340),(130,310) 1
+132 (680,80),(650,50) 1
+133 (680,130),(650,100) 1
+137 (430,600),(400,570) 1
+139 (730,600),(700,570) 1
+138 (630,600),(600,570) 1
+129 (780,600),(750,570) 1
+360 (866,507),(852,423) 0
+359 (844,226),(830,142) 0
+361 (866,423),(852,339) 0
+397 (1069,423),(1055,339) 0
+379 (962,226),(948,142) 0
+373 (940,423),(926,339) 0
+297 (416,423),(402,339) 0
+300 (437,507),(423,423) 0
+321 (576,423),(562,339) 0
+288 (373,507),(359,423) 0
+332 (715,507),(701,423) 0
+325 (619,423),(605,339) 0
+326 (641,507),(627,423) 0
+381 (983,423),(969,339) 0
+335 (715,226),(701,142) 0
+305 (459,423),(445,339) 0
+368 (919,507),(905,423) 0
+296 (416,507),(402,423) 0
+316 (533,507),(519,423) 0
+376 (962,507),(948,423) 0
+357 (844,423),(830,339) 0
+286 (351,310),(337,226) 0
+327 (641,423),(627,339) 0
+280 (298,310),(284,226) 0
+369 (919,423),(905,339) 0
+298 (416,310),(402,226) 0
+307 (459,226),(445,142) 0
+336 (737,507),(723,423) 0
+328 (662,507),(648,423) 0
+399 (1069,226),(1055,142) 0
+378 (962,310),(948,226) 0
+292 (394,507),(380,423) 0
+314 (502,310),(488,226) 0
+333 (715,423),(701,339) 0
+275 (234,226),(220,184) 0
+380 (983,507),(969,423) 0
+363 (866,226),(852,142) 0
+371 (919,226),(905,142) 0
+295 (394,226),(380,142) 0
+322 (598,507),(584,423) 0
+313 (502,423),(488,339) 0
+337 (737,423),(723,339) 0
+329 (662,423),(648,339) 0
+372 (940,507),(926,423) 0
+370 (919,310),(905,226) 0
+334 (715,310),(701,226) 0
+277 (255,226),(241,170) 0
+377 (962,423),(948,339) 0
+382 (983,310),(969,226) 0
+294 (394,310),(380,226) 0
+338 (737,310),(723,226) 0
+331 (684,423),(670,339) 0
+276 (255,310),(241,226) 0
+367 (897,226),(883,142) 0
+365 (897,423),(883,339) 0
+274 (234,310),(220,226) 0
+278 (277,310),(263,226) 0
+323 (598,423),(584,339) 0
+315 (502,226),(488,142) 0
+358 (844,310),(830,226) 0
+383 (983,226),(969,142) 0
+364 (897,507),(883,423) 0
+289 (373,423),(359,339) 0
+374 (940,310),(926,226) 0
+339 (737,226),(723,142) 0
+340 (758,507),(744,423) 0
+320 (576,507),(562,423) 0
+279 (277,226),(263,156) 0
+400 (1091,493),(1077,423) 0
+356 (844,507),(830,423) 0
+285 (351,423),(337,339) 0
+398 (1069,310),(1055,226) 0
+384 (1005,507),(991,423) 0
+302 (437,310),(423,226) 0
+391 (1026,226),(1012,142) 0
+394 (1048,310),(1034,226) 0
+318 (555,507),(541,423) 0
+341 (758,423),(744,339) 0
+319 (555,423),(541,339) 0
+342 (758,310),(744,226) 0
+395 (1048,226),(1034,142) 0
+304 (459,507),(445,423) 0
+401 (1091,423),(1077,339) 0
+343 (758,226),(744,142) 0
+385 (1005,423),(991,339) 0
+312 (502,507),(488,423) 0
+392 (1048,507),(1034,423) 0
+291 (373,226),(359,142) 0
+344 (780,507),(766,423) 0
+396 (1069,507),(1055,423) 0
+345 (780,423),(766,339) 0
+386 (1005,310),(991,226) 0
+306 (459,310),(445,226) 0
+355 (823,226),(809,142) 0
+293 (394,423),(380,339) 0
+346 (780,310),(766,226) 0
+283 (320,226),(306,142) 0
+347 (780,226),(766,142) 0
+387 (1005,226),(991,142) 0
+330 (684,507),(670,423) 0
+290 (373,310),(359,226) 0
+303 (437,226),(423,142) 0
+317 (533,423),(519,339) 0
+348 (801,507),(787,423) 0
+366 (897,310),(883,226) 0
+301 (437,423),(423,339) 0
+362 (866,310),(852,226) 0
+388 (1026,507),(1012,423) 0
+281 (298,226),(284,142) 0
+349 (801,423),(787,339) 0
+393 (1048,423),(1034,339) 0
+350 (801,310),(787,226) 0
+308 (480,507),(466,423) 0
+311 (480,226),(466,142) 0
+351 (801,226),(787,142) 0
+389 (1026,423),(1012,339) 0
+375 (940,226),(926,142) 0
+287 (351,226),(337,142) 0
+310 (480,310),(466,226) 0
+282 (320,310),(306,226) 0
+352 (823,507),(809,423) 0
+390 (1026,310),(1012,226) 0
+353 (823,423),(809,339) 0
+284 (351,507),(337,423) 0
+324 (619,507),(605,423) 0
+354 (823,310),(809,226) 0
+299 (416,226),(402,142) 0
+309 (480,423),(466,339) 0
+402 (460,340),(430,310) 1
+403 (730,340),(700,310) 1
+404 (800,340),(770,310) 1
+405 (360,340),(330,310) 1
+406 (1000,340),(970,310) 1
+407 (1130,310),(1076,296) 0
+408 (1190,310),(1136,296) 0
+409 (1130,290),(1076,276) 0
+410 (1190,290),(1136,276) 0
+411 (1130,270),(1076,256) 0
+412 (1190,270),(1136,256) 0
+413 (1130,250),(1076,236) 0
+414 (1190,250),(1136,236) 0
+415 (1164,230),(1076,216) 0
+416 (1164,210),(1076,196) 0
+417 (1164,190),(1076,176) 0
+\.
+
+
+--
+-- Data for Name: polls; Type: TABLE DATA; Schema: public; Owner: nms
+--
+
+COPY polls ("time", switch, port, bytes_in, bytes_out, errors_in, errors_out) FROM stdin;
+\.
+
+
+--
+-- Name: polls_poll_seq; Type: SEQUENCE SET; Schema: public; Owner: nms
+--
+
+SELECT pg_catalog.setval('polls_poll_seq', 1, false);
+
+
+--
+-- Data for Name: portnames; Type: TABLE DATA; Schema: public; Owner: nms
+--
+
+COPY portnames (switchtype, port, description) FROM stdin;
+dlink3100 1 Ethernet Interface (port 1)
+dlink3100 2 Ethernet Interface (port 2)
+dlink3100 3 Ethernet Interface (port 3)
+dlink3100 4 Ethernet Interface (port 4)
+dlink3100 5 Ethernet Interface (port 5)
+dlink3100 6 Ethernet Interface (port 6)
+dlink3100 7 Ethernet Interface (port 7)
+dlink3100 8 Ethernet Interface (port 8)
+dlink3100 9 Ethernet Interface (port 9)
+dlink3100 10 Ethernet Interface (port 10)
+dlink3100 11 Ethernet Interface (port 11)
+dlink3100 12 Ethernet Interface (port 12)
+dlink3100 13 Ethernet Interface (port 13)
+dlink3100 14 Ethernet Interface (port 14)
+dlink3100 15 Ethernet Interface (port 15)
+dlink3100 16 Ethernet Interface (port 16)
+dlink3100 17 Ethernet Interface (port 17)
+dlink3100 18 Ethernet Interface (port 18)
+dlink3100 19 Ethernet Interface (port 19)
+dlink3100 20 Ethernet Interface (port 20)
+dlink3100 21 Ethernet Interface (port 21)
+dlink3100 22 Ethernet Interface (port 22)
+dlink3100 23 Ethernet Interface (port 23)
+dlink3100 24 Ethernet Interface (port 24)
+dlink3100 25 Ethernet Interface (port 25)
+dlink3100 26 Ethernet Interface (port 26)
+dlink3100 27 Ethernet Interface (port 27)
+dlink3100 28 Ethernet Interface (port 28)
+dlink3100 29 Ethernet Interface (port 29)
+dlink3100 30 Ethernet Interface (port 30)
+dlink3100 31 Ethernet Interface (port 31)
+dlink3100 32 Ethernet Interface (port 32)
+dlink3100 33 Ethernet Interface (port 33)
+dlink3100 34 Ethernet Interface (port 34)
+dlink3100 35 Ethernet Interface (port 35)
+dlink3100 36 Ethernet Interface (port 36)
+dlink3100 37 Ethernet Interface (port 37)
+dlink3100 38 Ethernet Interface (port 38)
+dlink3100 39 Ethernet Interface (port 39)
+dlink3100 40 Ethernet Interface (port 40)
+dlink3100 41 Ethernet Interface (port 41)
+dlink3100 42 Ethernet Interface (port 42)
+dlink3100 43 Ethernet Interface (port 43)
+dlink3100 44 Ethernet Interface (port 44)
+dlink3100 45 Ethernet Interface (port 45)
+dlink3100 46 Ethernet Interface (port 46)
+dlink3100 47 Ethernet Interface (port 47)
+dlink3100 48 Ethernet Interface (port 48)
+dlink3100 301 Ethernet Interface (port 301)
+dlink3100 302 Ethernet Interface (port 302)
+dlink3100 303 Ethernet Interface (port 303)
+dlink3100 304 Ethernet Interface (port 304)
+dlink3100 305 Ethernet Interface (port 305)
+dlink3100 306 Ethernet Interface (port 306)
+dlink3100 307 Ethernet Interface (port 307)
+dlink3100 308 Ethernet Interface (port 308)
+dlink3100 309 Ethernet Interface (port 309)
+dlink3100 310 Ethernet Interface (port 310)
+dlink3100 311 Ethernet Interface (port 311)
+dlink3100 312 Ethernet Interface (port 312)
+dlink3100 313 Ethernet Interface (port 313)
+dlink3100 314 Ethernet Interface (port 314)
+dlink3100 315 Ethernet Interface (port 315)
+dlink3100 316 Ethernet Interface (port 316)
+dlink3100 317 Ethernet Interface (port 317)
+dlink3100 318 Ethernet Interface (port 318)
+dlink3100 319 Ethernet Interface (port 319)
+dlink3100 320 Ethernet Interface (port 320)
+dlink3100 321 Ethernet Interface (port 321)
+dlink3100 322 Ethernet Interface (port 322)
+dlink3100 323 Ethernet Interface (port 323)
+dlink3100 324 Ethernet Interface (port 324)
+dlink3100 325 Ethernet Interface (port 325)
+dlink3100 326 Ethernet Interface (port 326)
+dlink3100 327 Ethernet Interface (port 327)
+dlink3100 328 Ethernet Interface (port 328)
+dlink3100 329 Ethernet Interface (port 329)
+dlink3100 330 Ethernet Interface (port 330)
+dlink3100 331 Ethernet Interface (port 331)
+dlink3100 332 Ethernet Interface (port 332)
+dlink3100 9000 Internal Interface (port 9000)
+dlink3100 100000 vlan (port 100000)
+\.
+
+
+--
+-- Data for Name: squeue; Type: TABLE DATA; Schema: public; Owner: nms
+--
+
+COPY squeue (id, gid, added, updated, addr, cmd, locked, processed, disabled, priority, sysname, author, result, delay, delaytime) FROM stdin;
+\.
+
+
+--
+-- Name: squeue_group_sequence; Type: SEQUENCE SET; Schema: public; Owner: nms
+--
+
+SELECT pg_catalog.setval('squeue_group_sequence', 71, true);
+
+
+--
+-- Name: squeue_sequence; Type: SEQUENCE SET; Schema: public; Owner: nms
+--
+
+SELECT pg_catalog.setval('squeue_sequence', 3324, true);
+
+
+--
+-- Name: stemppoll_sequence; Type: SEQUENCE SET; Schema: public; Owner: nms
+--
+
+SELECT pg_catalog.setval('stemppoll_sequence', 1, false);
+
+
+--
+-- Data for Name: switches; Type: TABLE DATA; Schema: public; Owner: nms
+--
+
+COPY switches (switch, ip, sysname, switchtype, last_updated, locked, priority, poll_frequency, community) FROM stdin;
+320 127.0.0.1 ap-e31-1 ciscoap 2013-03-31 14:03:35.163353+02 f 0 00:05:00 <removed>
+380 127.0.0.1 ap-e67-1 ciscoap 2013-03-31 14:03:45.678972+02 f 0 00:05:00 <removed>
+301 127.0.0.1 ap-e19-2 ciscoap 2013-03-31 14:04:15.974348+02 f 0 00:05:00 <removed>
+89 151.216.23.2 e57-3 dlink3100 2013-03-31 14:09:08.899489+02 f 0 00:01:00 <removed>
+32 151.216.8.194 e21-2 dlink3100 2013-03-31 14:09:19.750092+02 f 0 00:01:00 <removed>
+407 151.216.50.2 creativiasw01 dlink3100 2013-03-31 14:09:29.799659+02 f 0 00:01:00 <removed>
+121 151.216.31.2 e73-3 dlink3100 2013-03-31 14:09:39.03767+02 f 0 00:01:00 <removed>
+3 151.216.1.130 e3-3 dlink3100 2013-03-31 14:10:38.32422+02 f 0 00:01:00 <removed>
+57 151.216.15.2 e41-1 dlink3100 2013-03-31 14:10:46.324438+02 f 0 00:01:00 <removed>
+97 151.216.25.2 e61-3 dlink3100 2013-03-31 14:10:56.366466+02 f 0 00:01:00 <removed>
+108 151.216.27.194 e67-2 dlink3100 2013-03-31 14:11:06.409468+02 f 0 00:01:00 <removed>
+65 151.216.17.2 e45-3 dlink3100 2013-03-31 14:11:16.450631+02 f 0 00:01:00 <removed>
+416 151.216.50.11 creativiasw10 dlink3100 2013-03-31 14:11:29.776178+02 f 0 00:01:00 <removed>
+22 151.216.6.66 e15-4 dlink3100 2013-03-31 14:11:40.601614+02 f 0 00:01:00 <removed>
+30 151.216.8.66 e19-4 dlink3100 2013-03-31 14:11:49.857971+02 f 0 00:01:00 <removed>
+18 151.216.5.66 e13-4 dlink3100 2013-03-31 14:12:00.689688+02 f 0 00:01:00 <removed>
+43 151.216.11.130 e27-1 dlink3100 2013-03-31 14:12:10.733619+02 f 0 00:01:00 <removed>
+24 151.216.6.194 e17-2 dlink3100 2013-03-31 14:12:19.983821+02 f 0 00:01:00 <removed>
+4 151.216.1.194 e3-4 dlink3100 2013-03-31 14:12:30.025734+02 f 0 00:01:00 <removed>
+31 151.216.8.130 e21-1 dlink3100 2013-03-31 14:09:05.474089+02 f 0 00:01:00 <removed>
+47 151.216.12.130 e31-1 dlink3100 2013-03-31 14:12:40.068048+02 f 0 00:01:00 <removed>
+92 151.216.23.194 e59-2 dlink3100 2013-03-31 14:09:15.523555+02 f 0 00:01:00 <removed>
+33 151.216.9.2 e21-3 dlink3100 2013-03-31 14:09:25.573946+02 f 0 00:01:00 <removed>
+20 151.216.5.194 e15-2 dlink3100 2013-03-31 14:09:35.626024+02 f 0 00:01:00 <removed>
+133 151.216.127.5 wtfgw wtfgw 2013-03-31 14:09:35.670908+02 f 0 00:01:00 <removed>
+28 151.216.7.194 e19-2 dlink3100 2013-03-31 14:09:45.955527+02 f 0 00:01:00 <removed>
+67 151.216.17.130 e47-1 dlink3100 2013-03-31 14:09:58.029684+02 f 0 00:01:00 <removed>
+26 151.216.7.66 e17-4 dlink3100 2013-03-31 14:10:08.127872+02 f 0 00:01:00 <removed>
+102 151.216.26.66 e63-4 dlink3100 2013-03-31 14:10:16.136217+02 f 0 00:01:00 <removed>
+125 151.216.32.2 e75-3 dlink3100 2013-03-31 14:10:26.181503+02 f 0 00:01:00 <removed>
+130 151.216.127.1 telegw telegw 2013-03-31 14:07:58.60478+02 f 0 00:01:00 <removed>
+412 151.216.50.7 creativiasw06 dlink3100 2013-03-31 14:09:09.699614+02 f 0 00:01:00 <removed>
+128 151.216.32.194 e77-2 dlink3100 2013-03-31 14:09:27.615732+02 f 0 00:01:00 <removed>
+408 151.216.50.3 creativiasw02 dlink3100 2013-03-31 14:09:37.667708+02 f 0 00:01:00 <removed>
+417 151.216.50.12 creativiasw11 dlink3100 2013-03-31 14:09:47.935097+02 f 0 00:01:00 <removed>
+127 151.216.32.130 e77-1 dlink3100 2013-03-31 14:09:56.039513+02 f 0 00:01:00 <removed>
+376 127.0.0.1 ap-e65-1 ciscoap 2013-03-31 14:03:45.695637+02 f 0 00:05:00 <removed>
+112 151.216.28.194 e69-2 dlink3100 2013-03-31 14:10:06.089831+02 f 0 00:01:00 <removed>
+9 151.216.3.2 e9-3 dlink3100 2013-03-31 14:10:18.178421+02 f 0 00:01:00 <removed>
+83 151.216.21.130 e55-1 dlink3100 2013-03-31 14:10:28.282289+02 f 0 00:01:00 <removed>
+13 151.216.4.2 e11-3 dlink3100 2013-03-31 14:10:30.307108+02 f 0 00:01:00 <removed>
+343 127.0.0.1 ap-e47-4 ciscoap 2013-03-31 14:04:46.367004+02 f 0 00:05:00 <removed>
+45 151.216.12.2 e29-1 dlink3100 2013-03-31 14:10:39.315785+02 f 0 00:01:00 <removed>
+297 127.0.0.1 ap-e17-2 ciscoap 2013-03-31 14:04:46.750319+02 f 0 00:05:00 <removed>
+293 127.0.0.1 ap-e15-2 ciscoap 2013-03-31 14:05:06.492611+02 f 0 00:05:00 <removed>
+350 127.0.0.1 ap-e51-3 ciscoap 2013-03-31 14:05:06.525983+02 f 0 00:05:00 <removed>
+363 127.0.0.1 ap-e57-4 ciscoap 2013-03-31 14:05:16.625481+02 f 0 00:05:00 <removed>
+368 127.0.0.1 ap-e61-1 ciscoap 2013-03-31 14:05:16.700464+02 f 0 00:05:00 <removed>
+388 127.0.0.1 ap-e71-1 ciscoap 2013-03-31 14:05:26.787007+02 f 0 00:05:00 <removed>
+304 127.0.0.1 ap-e21-1 ciscoap 2013-03-31 14:05:26.853688+02 f 0 00:05:00 <removed>
+352 127.0.0.1 ap-e53-1 ciscoap 2013-03-31 14:05:26.887026+02 f 0 00:05:00 <removed>
+323 127.0.0.1 ap-e33-2 ciscoap 2013-03-31 14:05:26.912028+02 f 0 00:05:00 <removed>
+406 127.0.0.1 ap-distro4 ciscoap 2013-03-31 14:05:27.045455+02 f 0 00:05:00 <removed>
+339 127.0.0.1 ap-e45-4 ciscoap 2013-03-31 14:05:27.053748+02 f 0 00:05:00 <removed>
+393 127.0.0.1 ap-e73-2 ciscoap 2013-03-31 14:04:26.17466+02 f 0 00:05:00 <removed>
+337 127.0.0.1 ap-e45-2 ciscoap 2013-03-31 14:04:26.191324+02 f 0 00:05:00 <removed>
+384 127.0.0.1 ap-e69-1 ciscoap 2013-03-31 14:04:26.207988+02 f 0 00:05:00 <removed>
+387 127.0.0.1 ap-e69-4 ciscoap 2013-03-31 14:04:26.224645+02 f 0 00:05:00 <removed>
+371 127.0.0.1 ap-e61-4 ciscoap 2013-03-31 14:04:36.283297+02 f 0 00:05:00 <removed>
+398 127.0.0.1 ap-e75-3 ciscoap 2013-03-31 14:04:46.333668+02 f 0 00:05:00 <removed>
+351 127.0.0.1 ap-e51-4 ciscoap 2013-03-31 14:04:46.350332+02 f 0 00:05:00 <removed>
+356 127.0.0.1 ap-e55-1 ciscoap 2013-03-31 14:04:46.383667+02 f 0 00:05:00 <removed>
+389 127.0.0.1 ap-e71-2 ciscoap 2013-03-31 14:04:46.733636+02 f 0 00:05:00 <removed>
+372 127.0.0.1 ap-e63-1 ciscoap 2013-03-31 14:05:06.509265+02 f 0 00:05:00 <removed>
+328 127.0.0.1 ap-e39-1 ciscoap 2013-03-31 14:05:16.608766+02 f 0 00:05:00 <removed>
+5 151.216.2.2 e5-3 dlink3100 2013-03-31 14:09:17.565638+02 f 0 00:01:00 <removed>
+50 151.216.13.66 e33-2 dlink3100 2013-03-31 14:09:18.937921+02 f 0 00:01:00 <removed>
+103 151.216.26.130 e65-1 dlink3100 2013-03-31 14:09:28.988094+02 f 0 00:01:00 <removed>
+91 151.216.23.130 e59-1 dlink3100 2013-03-31 14:09:39.851074+02 f 0 00:01:00 <removed>
+63 151.216.16.130 e45-1 dlink3100 2013-03-31 14:09:49.897376+02 f 0 00:01:00 <removed>
+7 151.216.2.130 e7-3 dlink3100 2013-03-31 14:09:59.947741+02 f 0 00:01:00 <removed>
+100 151.216.25.194 e63-2 dlink3100 2013-03-31 14:10:10.223204+02 f 0 00:01:00 <removed>
+84 151.216.21.194 e55-2 dlink3100 2013-03-31 14:10:19.231795+02 f 0 00:01:00 <removed>
+126 151.216.32.66 e75-4 dlink3100 2013-03-31 14:10:29.273823+02 f 0 00:01:00 <removed>
+361 127.0.0.1 ap-e57-2 ciscoap 2013-03-31 14:04:16.074284+02 f 0 00:05:00 <removed>
+312 127.0.0.1 ap-e25-1 ciscoap 2013-03-31 14:04:26.124587+02 f 0 00:05:00 <removed>
+310 127.0.0.1 ap-e23-3 ciscoap 2013-03-31 14:04:26.141221+02 f 0 00:05:00 <removed>
+308 127.0.0.1 ap-e23-1 ciscoap 2013-03-31 14:04:26.157994+02 f 0 00:05:00 <removed>
+104 151.216.26.194 e65-2 dlink3100 2013-03-31 14:10:09.189552+02 f 0 00:01:00 <removed>
+119 151.216.30.130 e73-1 dlink3100 2013-03-31 14:12:40.859661+02 f 0 00:01:00 <removed>
+69 151.216.18.2 e47-3 dlink3100 2013-03-31 14:10:20.265181+02 f 0 00:01:00 <removed>
+37 151.216.10.2 e23-3 dlink3100 2013-03-31 14:12:40.88249+02 t 0 00:01:00 <removed>
+325 127.0.0.1 ap-e35-2 ciscoap 2013-03-31 14:06:47.598526+02 f 0 00:05:00 <removed>
+52 151.216.13.194 e35-2 dlink3100 2013-03-31 14:10:36.22414+02 f 0 00:01:00 <removed>
+399 127.0.0.1 ap-e75-4 ciscoap 2013-03-31 14:06:54.140511+02 f 0 00:05:00 <removed>
+401 127.0.0.1 ap-e77-2 ciscoap 2013-03-31 14:05:06.475953+02 f 0 00:05:00 <removed>
+109 151.216.28.2 e67-3 dlink3100 2013-03-31 14:10:40.349205+02 f 0 00:01:00 <removed>
+123 151.216.31.130 e75-1 dlink3100 2013-03-31 14:10:49.357742+02 f 0 00:01:00 <removed>
+332 127.0.0.1 ap-e43-1 ciscoap 2013-03-31 14:06:54.157133+02 f 0 00:05:00 <removed>
+98 151.216.25.66 e61-4 dlink3100 2013-03-31 14:06:56.826042+02 f 0 00:01:00 <removed>
+117 151.216.30.2 e71-3 dlink3100 2013-03-31 14:10:59.399785+02 f 0 00:01:00 <removed>
+101 151.216.26.2 e63-3 dlink3100 2013-03-31 14:11:09.441726+02 f 0 00:01:00 <removed>
+39 151.216.10.130 e25-1 dlink3100 2013-03-31 14:11:20.517295+02 f 0 00:01:00 <removed>
+290 127.0.0.1 ap-e13-3 ciscoap 2013-03-31 14:05:16.592114+02 f 0 00:05:00 <removed>
+345 127.0.0.1 ap-e49-2 ciscoap 2013-03-31 14:06:57.657385+02 f 0 00:05:00 <removed>
+366 127.0.0.1 ap-e59-3 ciscoap 2013-03-31 14:06:57.665697+02 f 0 00:05:00 <removed>
+392 127.0.0.1 ap-e73-1 ciscoap 2013-03-31 14:04:15.990948+02 f 0 00:05:00 <removed>
+355 127.0.0.1 ap-e53-4 ciscoap 2013-03-31 14:05:16.658807+02 f 0 00:05:00 <removed>
+86 151.216.22.66 e55-4 dlink3100 2013-03-31 14:11:30.559419+02 f 0 00:01:00 <removed>
+277 127.0.0.1 ap-e3-4 ciscoap 2013-03-31 14:04:16.007613+02 f 0 00:05:00 <removed>
+40 151.216.10.194 e25-2 dlink3100 2013-03-31 14:11:39.818373+02 f 0 00:01:00 <removed>
+314 127.0.0.1 ap-e25-3 ciscoap 2013-03-31 14:04:16.024289+02 f 0 00:05:00 <removed>
+289 127.0.0.1 ap-e13-2 ciscoap 2013-03-31 14:06:57.724049+02 f 0 00:05:00 <removed>
+2 151.216.1.66 e1-4 dlink3100 2013-03-31 14:11:50.641091+02 f 0 00:01:00 <removed>
+302 127.0.0.1 ap-e19-3 ciscoap 2013-03-31 14:06:57.732372+02 f 0 00:05:00 <removed>
+99 151.216.25.130 e63-1 dlink3100 2013-03-31 14:11:59.899883+02 f 0 00:01:00 <removed>
+344 127.0.0.1 ap-e49-1 ciscoap 2013-03-31 14:04:16.04092+02 f 0 00:05:00 <removed>
+335 127.0.0.1 ap-e43-4 ciscoap 2013-03-31 14:06:57.799008+02 f 0 00:05:00 <removed>
+279 127.0.0.1 ap-e5-4 ciscoap 2013-03-31 14:04:16.057621+02 f 0 00:05:00 <removed>
+38 151.216.10.66 e23-4 dlink3100 2013-03-31 14:12:09.94159+02 f 0 00:01:00 <removed>
+285 127.0.0.1 ap-e11-2 ciscoap 2013-03-31 14:06:57.824055+02 f 0 00:05:00 <removed>
+404 127.0.0.1 ap-distro3 ciscoap 2013-03-31 14:06:57.832368+02 f 0 00:05:00 <removed>
+21 151.216.6.2 e15-3 dlink3100 2013-03-31 14:12:20.775526+02 f 0 00:01:00 <removed>
+131 151.216.127.3 camgw camgw 2013-03-31 14:08:59.442796+02 f 0 00:01:00 <removed>
+415 151.216.50.10 creativiasw09 dlink3100 2013-03-31 14:09:49.089144+02 f 0 00:01:00 <removed>
+23 151.216.6.130 e17-1 dlink3100 2013-03-31 14:12:30.817401+02 f 0 00:01:00 <removed>
+140 151.216.127.17 distro0 distro0 2013-03-31 14:09:59.139467+02 f 0 00:01:00 <removed>
+303 127.0.0.1 ap-e19-4 ciscoap 2013-03-31 14:05:27.020371+02 f 0 00:05:00 <removed>
+348 127.0.0.1 ap-e51-1 ciscoap 2013-03-31 14:07:14.399896+02 f 0 00:05:00 <removed>
+46 151.216.12.66 e29-2 dlink3100 2013-03-31 14:11:58.658094+02 f 0 00:01:00 <removed>
+311 127.0.0.1 ap-e23-4 ciscoap 2013-03-31 14:07:14.433216+02 f 0 00:05:00 <removed>
+6 151.216.2.66 e5-4 dlink3100 2013-03-31 14:12:08.075251+02 f 0 00:01:00 <removed>
+61 151.216.16.2 e43-3 dlink3100 2013-03-31 14:12:18.115548+02 f 0 00:01:00 <removed>
+281 127.0.0.1 ap-e7-4 ciscoap 2013-03-31 14:07:14.449892+02 f 0 00:05:00 <removed>
+42 151.216.11.66 e25-4 dlink3100 2013-03-31 14:12:28.78394+02 f 0 00:01:00 <removed>
+124 151.216.31.194 e75-2 dlink3100 2013-03-31 14:12:38.82574+02 f 0 00:01:00 <removed>
+341 127.0.0.1 ap-e47-2 ciscoap 2013-03-31 14:07:14.49997+02 f 0 00:05:00 <removed>
+394 127.0.0.1 ap-e73-3 ciscoap 2013-03-31 14:07:18.250168+02 f 0 00:05:00 <removed>
+134 151.216.127.6 logistikkgw logistikkgw 2013-03-31 14:09:37.70706+02 f 0 00:01:00 <removed>
+296 127.0.0.1 ap-e17-1 ciscoap 2013-03-31 14:05:16.642148+02 f 0 00:05:00 <removed>
+342 127.0.0.1 ap-e47-3 ciscoap 2013-03-31 14:05:16.683807+02 f 0 00:05:00 <removed>
+138 151.216.127.14 sponsorgw sponsorgw 2013-03-31 14:10:36.296979+02 f 0 00:01:00 <removed>
+300 127.0.0.1 ap-e19-1 ciscoap 2013-03-31 14:05:26.753695+02 f 0 00:05:00 <removed>
+74 151.216.19.66 e49-4 dlink3100 2013-03-31 14:10:48.366303+02 f 0 00:01:00 <removed>
+90 151.216.23.66 e57-4 dlink3100 2013-03-31 14:10:50.391178+02 f 0 00:01:00 <removed>
+364 127.0.0.1 ap-e59-1 ciscoap 2013-03-31 14:06:57.699034+02 f 0 00:05:00 <removed>
+14 151.216.4.66 e11-4 dlink3100 2013-03-31 14:11:00.431572+02 f 0 00:01:00 <removed>
+280 127.0.0.1 ap-e7-3 ciscoap 2013-03-31 14:05:26.803681+02 f 0 00:05:00 <removed>
+357 127.0.0.1 ap-e55-2 ciscoap 2013-03-31 14:06:57.757379+02 f 0 00:05:00 <removed>
+144 151.216.127.21 distro4 distro4 2013-03-31 14:11:18.492445+02 f 0 00:01:00 <removed>
+19 151.216.5.130 e15-1 dlink3100 2013-03-31 14:11:19.483883+02 f 0 00:01:00 <removed>
+307 127.0.0.1 ap-e21-4 ciscoap 2013-03-31 14:06:57.790715+02 f 0 00:05:00 <removed>
+85 151.216.22.2 e55-3 dlink3100 2013-03-31 14:11:38.576512+02 f 0 00:01:00 <removed>
+286 127.0.0.1 ap-e11-3 ciscoap 2013-03-31 14:05:26.837029+02 f 0 00:05:00 <removed>
+369 127.0.0.1 ap-e61-2 ciscoap 2013-03-31 14:06:57.857392+02 f 0 00:05:00 <removed>
+10 151.216.3.66 e9-4 dlink3100 2013-03-31 14:11:48.616108+02 f 0 00:01:00 <removed>
+385 127.0.0.1 ap-e69-2 ciscoap 2013-03-31 14:07:07.916359+02 f 0 00:05:00 <removed>
+288 127.0.0.1 ap-e13-1 ciscoap 2013-03-31 14:05:26.945339+02 f 0 00:05:00 <removed>
+282 127.0.0.1 ap-e9-3 ciscoap 2013-03-31 14:07:07.924585+02 f 0 00:05:00 <removed>
+358 127.0.0.1 ap-e55-3 ciscoap 2013-03-31 14:05:26.953679+02 f 0 00:05:00 <removed>
+396 127.0.0.1 ap-e75-1 ciscoap 2013-03-31 14:07:14.333223+02 f 0 00:05:00 <removed>
+374 127.0.0.1 ap-e63-3 ciscoap 2013-03-31 14:07:14.349887+02 f 0 00:05:00 <removed>
+365 127.0.0.1 ap-e59-2 ciscoap 2013-03-31 14:05:26.978658+02 f 0 00:05:00 <removed>
+276 127.0.0.1 ap-e3-3 ciscoap 2013-03-31 14:05:26.987059+02 f 0 00:05:00 <removed>
+334 127.0.0.1 ap-e43-3 ciscoap 2013-03-31 14:05:27.012008+02 f 0 00:05:00 <removed>
+382 127.0.0.1 ap-e67-3 ciscoap 2013-03-31 14:07:14.466569+02 f 0 00:05:00 <removed>
+62 151.216.16.66 e43-4 dlink3100 2013-03-31 14:12:08.699458+02 f 0 00:01:00 <removed>
+275 127.0.0.1 ap-e1-4 ciscoap 2013-03-31 14:07:14.483301+02 f 0 00:05:00 <removed>
+36 151.216.9.194 e23-2 dlink3100 2013-03-31 14:12:18.742024+02 f 0 00:01:00 <removed>
+51 151.216.13.130 e35-1 dlink3100 2013-03-31 14:12:28.217471+02 f 0 00:01:00 <removed>
+324 127.0.0.1 ap-e35-1 ciscoap 2013-03-31 14:07:14.516632+02 f 0 00:05:00 <removed>
+1 151.216.1.2 e1-3 dlink3100 2013-03-31 14:12:38.299693+02 f 0 00:01:00 <removed>
+291 127.0.0.1 ap-e13-4 ciscoap 2013-03-31 14:05:47.253657+02 f 0 00:05:00 <removed>
+381 127.0.0.1 ap-e67-2 ciscoap 2013-03-31 14:07:14.533237+02 f 0 00:05:00 <removed>
+395 127.0.0.1 ap-e73-4 ciscoap 2013-03-31 14:05:47.261963+02 f 0 00:05:00 <removed>
+298 127.0.0.1 ap-e17-3 ciscoap 2013-03-31 14:07:18.24186+02 f 0 00:05:00 <removed>
+375 127.0.0.1 ap-e63-4 ciscoap 2013-03-31 14:05:26.770358+02 f 0 00:05:00 <removed>
+402 127.0.0.1 ap-distro1 ciscoap 2013-03-31 14:05:47.286984+02 f 0 00:05:00 <removed>
+278 127.0.0.1 ap-e5-3 ciscoap 2013-03-31 14:07:18.275213+02 f 0 00:05:00 <removed>
+349 127.0.0.1 ap-e51-2 ciscoap 2013-03-31 14:05:26.820365+02 f 0 00:05:00 <removed>
+390 127.0.0.1 ap-e71-3 ciscoap 2013-03-31 14:05:26.870368+02 f 0 00:05:00 <removed>
+135 151.216.127.9 crewgw crewgw 2013-03-31 14:09:59.991016+02 f 0 00:01:00 <removed>
+88 151.216.22.194 e57-2 dlink3100 2013-03-31 14:10:58.408324+02 f 0 00:01:00 <removed>
+378 127.0.0.1 ap-e65-3 ciscoap 2013-03-31 14:05:26.920352+02 f 0 00:05:00 <removed>
+64 151.216.16.194 e45-2 dlink3100 2013-03-31 14:11:08.451146+02 f 0 00:01:00 <removed>
+141 151.216.127.18 distro1 distro1 2013-03-31 14:11:10.476036+02 f 0 00:01:00 <removed>
+397 127.0.0.1 ap-e75-2 ciscoap 2013-03-31 14:06:57.690716+02 f 0 00:05:00 <removed>
+142 151.216.127.19 distro2 distro2 2013-03-31 14:11:26.53242+02 f 0 00:01:00 <removed>
+336 127.0.0.1 ap-e45-1 ciscoap 2013-03-31 14:05:37.128164+02 f 0 00:05:00 <removed>
+370 127.0.0.1 ap-e61-3 ciscoap 2013-03-31 14:05:37.136492+02 f 0 00:05:00 <removed>
+340 127.0.0.1 ap-e47-1 ciscoap 2013-03-31 14:06:57.765706+02 f 0 00:05:00 <removed>
+137 151.216.127.12 resepsjongw resepsjongw 2013-03-31 14:11:28.534488+02 f 0 00:01:00 <removed>
+71 151.216.18.130 e49-1 dlink3100 2013-03-31 14:11:36.567717+02 f 0 00:01:00 <removed>
+319 127.0.0.1 ap-e29-2 ciscoap 2013-03-31 14:07:07.949621+02 f 0 00:05:00 <removed>
+82 151.216.21.66 e53-4 dlink3100 2013-03-31 14:11:47.281839+02 f 0 00:01:00 <removed>
+403 127.0.0.1 ap-distro2 ciscoap 2013-03-31 14:07:14.316549+02 f 0 00:05:00 <removed>
+333 127.0.0.1 ap-e43-2 ciscoap 2013-03-31 14:07:14.366567+02 f 0 00:05:00 <removed>
+305 127.0.0.1 ap-e21-2 ciscoap 2013-03-31 14:05:37.161496+02 f 0 00:05:00 <removed>
+383 127.0.0.1 ap-e67-4 ciscoap 2013-03-31 14:05:37.169782+02 f 0 00:05:00 <removed>
+35 151.216.9.130 e23-1 dlink3100 2013-03-31 14:11:57.324788+02 f 0 00:01:00 <removed>
+329 127.0.0.1 ap-e39-2 ciscoap 2013-03-31 14:07:14.383235+02 f 0 00:05:00 <removed>
+295 127.0.0.1 ap-e15-4 ciscoap 2013-03-31 14:07:14.416546+02 f 0 00:05:00 <removed>
+322 127.0.0.1 ap-e33-1 ciscoap 2013-03-31 14:05:37.194794+02 f 0 00:05:00 <removed>
+316 127.0.0.1 ap-e27-1 ciscoap 2013-03-31 14:07:18.075143+02 f 0 00:05:00 <removed>
+317 127.0.0.1 ap-e27-2 ciscoap 2013-03-31 14:07:18.083421+02 f 0 00:05:00 <removed>
+410 151.216.50.5 creativiasw04 dlink3100 2013-03-31 14:08:38.747626+02 f 0 00:01:00 <removed>
+54 151.216.14.66 e37-2 dlink3100 2013-03-31 14:08:48.798532+02 f 0 00:01:00 <removed>
+346 127.0.0.1 ap-e49-3 ciscoap 2013-03-31 14:07:18.116747+02 f 0 00:05:00 <removed>
+16 151.216.4.194 e13-2 dlink3100 2013-03-31 14:08:59.398994+02 f 0 00:01:00 <removed>
+132 151.216.127.4 stageboh stageboh 2013-03-31 14:11:19.519638+02 f 0 00:01:00 <removed>
+353 127.0.0.1 ap-e53-2 ciscoap 2013-03-31 14:07:18.141775+02 f 0 00:05:00 <removed>
+122 151.216.31.66 e73-4 dlink3100 2013-03-31 14:12:38.849023+02 t 0 00:01:00 <removed>
+338 127.0.0.1 ap-e45-3 ciscoap 2013-03-31 14:07:18.175214+02 f 0 00:05:00 <removed>
+327 127.0.0.1 ap-e37-2 ciscoap 2013-03-31 14:07:18.216828+02 f 0 00:05:00 <removed>
+309 127.0.0.1 ap-e23-2 ciscoap 2013-03-31 14:07:24.68384+02 f 0 00:05:00 <removed>
+330 127.0.0.1 ap-e41-1 ciscoap 2013-03-31 14:07:24.71716+02 f 0 00:05:00 <removed>
+299 127.0.0.1 ap-e17-4 ciscoap 2013-03-31 14:07:24.733842+02 f 0 00:05:00 <removed>
+379 127.0.0.1 ap-e65-4 ciscoap 2013-03-31 14:07:24.750498+02 f 0 00:05:00 <removed>
+8 151.216.2.194 e7-4 dlink3100 2013-03-31 14:07:28.294572+02 f 0 00:01:00 <removed>
+70 151.216.18.66 e47-4 dlink3100 2013-03-31 14:06:47.567226+02 f 0 00:01:00 <removed>
+377 127.0.0.1 ap-e65-2 ciscoap 2013-03-31 14:07:28.367437+02 f 0 00:05:00 <removed>
+60 151.216.15.194 e43-2 dlink3100 2013-03-31 14:06:57.634414+02 f 0 00:01:00 <removed>
+292 127.0.0.1 ap-e15-1 ciscoap 2013-03-31 14:07:34.926035+02 f 0 00:05:00 <removed>
+114 151.216.29.66 e69-4 dlink3100 2013-03-31 14:07:07.891609+02 f 0 00:01:00 <removed>
+347 127.0.0.1 ap-e49-4 ciscoap 2013-03-31 14:07:34.959373+02 f 0 00:05:00 <removed>
+116 151.216.29.194 e71-2 dlink3100 2013-03-31 14:07:38.453277+02 f 0 00:01:00 <removed>
+411 151.216.50.6 creativiasw05 dlink3100 2013-03-31 14:07:17.968957+02 f 0 00:01:00 <removed>
+87 151.216.22.130 e57-1 dlink3100 2013-03-31 14:07:48.503769+02 f 0 00:01:00 <removed>
+113 151.216.29.2 e69-3 dlink3100 2013-03-31 14:07:58.545997+02 f 0 00:01:00 <removed>
+287 127.0.0.1 ap-e11-4 ciscoap 2013-03-31 14:07:18.016788+02 f 0 00:05:00 <removed>
+66 151.216.17.66 e45-4 dlink3100 2013-03-31 14:08:08.60963+02 f 0 00:01:00 <removed>
+120 151.216.30.194 e73-2 dlink3100 2013-03-31 14:08:18.656104+02 f 0 00:01:00 <removed>
+118 151.216.30.66 e71-4 dlink3100 2013-03-31 14:08:29.247615+02 f 0 00:01:00 <removed>
+400 127.0.0.1 ap-e77-1 ciscoap 2013-03-31 14:07:34.859414+02 f 0 00:05:00 <removed>
+139 151.216.127.16 eldregw eldregw 2013-03-31 14:12:28.253362+02 f 0 00:01:00 <removed>
+76 151.216.19.194 e51-2 dlink3100 2013-03-31 14:12:38.382364+02 t 0 00:01:00 <removed>
+405 127.0.0.1 ap-distro0 ciscoap 2013-03-31 14:07:34.876034+02 f 0 00:05:00 <removed>
+359 127.0.0.1 ap-e55-4 ciscoap 2013-03-31 14:07:18.041795+02 f 0 00:05:00 <removed>
+373 127.0.0.1 ap-e63-2 ciscoap 2013-03-31 14:07:18.050126+02 f 0 00:05:00 <removed>
+354 127.0.0.1 ap-e53-3 ciscoap 2013-03-31 14:07:34.892675+02 f 0 00:05:00 <removed>
+386 127.0.0.1 ap-e69-3 ciscoap 2013-03-31 14:07:18.108439+02 f 0 00:05:00 <removed>
+326 127.0.0.1 ap-e37-1 ciscoap 2013-03-31 14:07:34.909368+02 f 0 00:05:00 <removed>
+284 127.0.0.1 ap-e11-1 ciscoap 2013-03-31 14:07:34.942715+02 f 0 00:05:00 <removed>
+391 127.0.0.1 ap-e71-4 ciscoap 2013-03-31 14:07:18.150127+02 f 0 00:05:00 <removed>
+362 127.0.0.1 ap-e57-3 ciscoap 2013-03-31 14:07:34.976095+02 f 0 00:05:00 <removed>
+318 127.0.0.1 ap-e29-1 ciscoap 2013-03-31 14:07:18.183518+02 f 0 00:05:00 <removed>
+110 151.216.28.66 e67-4 dlink3100 2013-03-31 14:07:38.444965+02 f 0 00:01:00 <removed>
+274 127.0.0.1 ap-e1-3 ciscoap 2013-03-31 14:07:18.208538+02 f 0 00:05:00 <removed>
+53 151.216.14.2 e37-1 dlink3100 2013-03-31 14:07:48.49557+02 f 0 00:01:00 <removed>
+107 151.216.27.130 e67-1 dlink3100 2013-03-31 14:07:58.554186+02 f 0 00:01:00 <removed>
+315 127.0.0.1 ap-e25-4 ciscoap 2013-03-31 14:07:24.650503+02 f 0 00:05:00 <removed>
+360 127.0.0.1 ap-e57-1 ciscoap 2013-03-31 14:07:24.667163+02 f 0 00:05:00 <removed>
+78 151.216.20.66 e51-4 dlink3100 2013-03-31 14:08:09.146709+02 f 0 00:01:00 <removed>
+414 151.216.50.9 creativiasw08 dlink3100 2013-03-31 14:06:47.558957+02 f 0 00:01:00 <removed>
+294 127.0.0.1 ap-e15-3 ciscoap 2013-03-31 14:07:24.700488+02 f 0 00:05:00 <removed>
+25 151.216.7.2 e17-3 dlink3100 2013-03-31 14:07:28.311147+02 f 0 00:01:00 <removed>
+75 151.216.19.130 e51-1 dlink3100 2013-03-31 14:06:57.617774+02 f 0 00:01:00 <removed>
+93 151.216.24.2 e59-3 dlink3100 2013-03-31 14:08:19.189476+02 f 0 00:01:00 <removed>
+11 151.216.3.130 e11-1 dlink3100 2013-03-31 14:08:28.698108+02 f 0 00:01:00 <removed>
+55 151.216.14.130 e39-1 dlink3100 2013-03-31 14:08:39.297705+02 f 0 00:01:00 <removed>
+367 127.0.0.1 ap-e59-4 ciscoap 2013-03-31 14:07:28.334102+02 f 0 00:05:00 <removed>
+80 151.216.20.194 e53-2 dlink3100 2013-03-31 14:07:07.875693+02 f 0 00:01:00 <removed>
+321 127.0.0.1 ap-e31-2 ciscoap 2013-03-31 14:07:28.342401+02 f 0 00:05:00 <removed>
+94 151.216.24.66 e59-4 dlink3100 2013-03-31 14:07:17.985368+02 f 0 00:01:00 <removed>
+283 127.0.0.1 ap-e9-4 ciscoap 2013-03-31 14:07:28.375765+02 f 0 00:05:00 <removed>
+48 151.216.12.194 e31-2 dlink3100 2013-03-31 14:08:49.348586+02 f 0 00:01:00 <removed>
+68 151.216.17.194 e47-2 dlink3100 2013-03-31 14:08:58.847409+02 f 0 00:01:00 <removed>
+331 127.0.0.1 ap-e41-2 ciscoap 2013-03-31 14:07:18.008451+02 f 0 00:05:00 <removed>
+129 151.216.127.2 nocgw nocgw 2013-03-31 14:11:36.609335+02 f 0 00:01:00 <removed>
+306 127.0.0.1 ap-e21-3 ciscoap 2013-03-31 14:07:28.400753+02 f 0 00:05:00 <removed>
+313 127.0.0.1 ap-e25-2 ciscoap 2013-03-31 14:07:28.409069+02 f 0 00:05:00 <removed>
+136 151.216.127.11 gamegw gamegw 2013-03-31 14:06:54.076054+02 f 0 00:01:00 <removed>
+81 151.216.21.2 e53-3 dlink3100 2013-03-31 14:07:04.184831+02 f 0 00:01:00 <removed>
+105 151.216.27.2 e65-3 dlink3100 2013-03-31 14:07:14.28811+02 f 0 00:01:00 <removed>
+56 151.216.14.194 e39-2 dlink3100 2013-03-31 14:07:26.952794+02 f 0 00:01:00 <removed>
+72 151.216.18.194 e49-2 dlink3100 2013-03-31 14:07:36.993533+02 f 0 00:01:00 <removed>
+27 151.216.7.130 e19-1 dlink3100 2013-03-31 14:07:45.003682+02 f 0 00:01:00 <removed>
+17 151.216.5.2 e13-3 dlink3100 2013-03-31 14:07:57.079313+02 f 0 00:01:00 <removed>
+59 151.216.15.130 e43-1 dlink3100 2013-03-31 14:08:07.12975+02 f 0 00:01:00 <removed>
+79 151.216.20.130 e53-1 dlink3100 2013-03-31 14:08:15.230508+02 f 0 00:01:00 <removed>
+12 151.216.3.194 e11-2 dlink3100 2013-03-31 14:08:25.273211+02 f 0 00:01:00 <removed>
+413 151.216.50.8 creativiasw07 dlink3100 2013-03-31 14:08:35.321636+02 f 0 00:01:00 <removed>
+15 151.216.4.130 e13-1 dlink3100 2013-03-31 14:08:45.372088+02 f 0 00:01:00 <removed>
+106 151.216.27.66 e65-4 dlink3100 2013-03-31 14:08:57.465785+02 f 0 00:01:00 <removed>
+29 151.216.8.2 e19-3 dlink3100 2013-03-31 14:09:07.516177+02 f 0 00:01:00 <removed>
+34 151.216.9.66 e21-4 dlink3100 2013-03-31 14:12:40.090712+02 t 0 00:01:00 <removed>
+49 151.216.13.2 e33-1 dlink3100 2013-03-31 14:07:06.867675+02 f 0 00:01:00 <removed>
+44 151.216.11.194 e27-2 dlink3100 2013-03-31 14:07:16.909469+02 f 0 00:01:00 <removed>
+96 151.216.24.194 e61-2 dlink3100 2013-03-31 14:07:24.56102+02 f 0 00:01:00 <removed>
+73 151.216.19.2 e49-3 dlink3100 2013-03-31 14:07:34.777763+02 f 0 00:01:00 <removed>
+115 151.216.29.130 e71-1 dlink3100 2013-03-31 14:07:47.037305+02 f 0 00:01:00 <removed>
+95 151.216.24.130 e61-1 dlink3100 2013-03-31 14:07:55.137659+02 f 0 00:01:00 <removed>
+409 151.216.50.4 creativiasw03 dlink3100 2013-03-31 14:08:05.18812+02 f 0 00:01:00 <removed>
+111 151.216.28.130 e69-1 dlink3100 2013-03-31 14:08:17.239454+02 f 0 00:01:00 <removed>
+77 151.216.20.2 e51-3 dlink3100 2013-03-31 14:08:27.313458+02 f 0 00:01:00 <removed>
+58 151.216.15.66 e41-2 dlink3100 2013-03-31 14:08:37.363767+02 f 0 00:01:00 <removed>
+41 151.216.11.2 e25-3 dlink3100 2013-03-31 14:08:47.415311+02 f 0 00:01:00 <removed>
+143 151.216.127.20 distro3 distro3 2013-03-31 14:08:55.423637+02 f 0 00:01:00 <removed>
+\.
+
+
+--
+-- Name: switches_switch_seq; Type: SEQUENCE SET; Schema: public; Owner: nms
+--
+
+SELECT pg_catalog.setval('switches_switch_seq', 417, true);
+
+
+--
+-- Data for Name: switchtypes; Type: TABLE DATA; Schema: public; Owner: nms
+--
+
+COPY switchtypes (switchtype, ports, wide_counters) FROM stdin;
+dlink3100 1-44,46-48 t
+dlink3100full 1-48 t
+ciscoap f
+nocgw 1-114 t
+telegw 1-94,99-102 t
+camgw 1-52,55 t
+stageboh 1-52,55 t
+wtfgw 1-52,55 t
+logistikkgw 1-52,55 t
+crewgw 1-52,55 t
+gamegw 1-52,55 t
+resepsjongw 10101-10110 t
+sponsorgw t
+eldregw 1-5 t
+distro0 1-201 t
+distro1 1-201 t
+distro2 1-201 t
+distro3 1-201 t
+distro4 1-201 t
+\.
+
+
+--
+-- Data for Name: temppoll; Type: TABLE DATA; Schema: public; Owner: nms
+--
+
+COPY temppoll (id, "time", switch, temp) FROM stdin;
+\.
+
+
+--
+-- Data for Name: uplinks; Type: TABLE DATA; Schema: public; Owner: nms
+--
+
+COPY uplinks (switch, coreswitch, blade, port) FROM stdin;
+274 140 6 1
+275 140 6 2
+276 140 6 3
+277 140 6 4
+278 140 6 5
+279 140 6 6
+280 140 6 7
+281 140 6 8
+282 140 6 9
+283 140 6 10
+284 141 6 1
+285 141 6 2
+286 140 6 11
+287 140 6 12
+288 141 6 3
+289 141 6 4
+290 140 6 13
+291 140 6 14
+292 141 6 5
+293 141 6 6
+294 140 6 15
+295 140 6 16
+296 141 6 7
+297 141 6 8
+298 140 6 17
+299 140 6 18
+300 141 6 9
+301 141 6 10
+302 140 6 19
+303 140 6 20
+304 141 6 11
+305 141 6 12
+306 140 6 21
+307 140 6 22
+308 141 6 13
+309 141 6 14
+310 140 6 23
+311 140 6 24
+312 141 6 15
+313 141 6 16
+314 140 6 25
+315 140 6 26
+316 141 6 17
+317 141 6 18
+318 141 6 19
+319 141 6 20
+320 141 6 21
+321 141 6 22
+322 142 6 1
+323 141 6 23
+324 142 6 2
+325 142 6 3
+326 142 6 4
+327 142 6 5
+328 142 6 6
+329 142 6 7
+330 142 6 8
+331 142 6 9
+332 142 6 10
+333 142 6 11
+334 143 6 1
+335 143 6 2
+336 142 6 12
+337 142 6 13
+338 143 6 3
+339 143 6 4
+340 142 6 14
+341 142 6 15
+342 143 6 5
+343 143 6 6
+344 142 6 16
+345 142 6 17
+346 143 6 7
+347 143 6 8
+348 142 6 18
+349 142 6 19
+350 143 6 9
+351 143 6 10
+352 142 6 20
+353 142 6 21
+354 143 6 11
+355 143 6 12
+356 142 6 22
+357 142 6 23
+358 143 6 13
+359 143 6 14
+360 142 6 24
+361 142 6 25
+362 143 6 15
+363 143 6 16
+364 144 6 1
+365 144 6 2
+366 143 6 17
+367 143 6 18
+368 144 6 3
+369 144 6 4
+370 143 6 19
+371 143 6 20
+372 144 6 5
+373 144 6 6
+374 144 6 7
+375 144 6 8
+376 144 6 9
+377 144 6 10
+378 144 6 11
+379 144 6 12
+380 144 6 13
+381 144 6 14
+382 144 6 15
+383 144 6 16
+384 144 6 17
+385 144 6 18
+386 144 6 19
+387 144 6 20
+388 144 6 21
+389 144 6 22
+390 144 6 23
+391 144 6 24
+392 144 6 25
+393 144 6 26
+394 144 6 27
+395 144 6 28
+396 144 6 29
+397 144 6 30
+398 144 6 31
+399 144 6 32
+400 144 6 33
+401 144 6 34
+402 141 6 48
+403 142 6 47
+404 143 6 48
+405 140 6 48
+406 144 6 48
+\.
+
+
+--
+-- Name: cpuloadpoll_pkey; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
+--
+
+ALTER TABLE ONLY cpuloadpoll
+ ADD CONSTRAINT cpuloadpoll_pkey PRIMARY KEY (id);
+
+
+--
+-- Name: ipv4_pkey; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
+--
+
+ALTER TABLE ONLY ipv4
+ ADD CONSTRAINT ipv4_pkey PRIMARY KEY (mac, address, "time");
+
+
+--
+-- Name: ipv6_pkey; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
+--
+
+ALTER TABLE ONLY ipv6
+ ADD CONSTRAINT ipv6_pkey PRIMARY KEY (mac, address, "time");
+
+
+--
+-- Name: switches_pkey; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
+--
+
+ALTER TABLE ONLY switches
+ ADD CONSTRAINT switches_pkey PRIMARY KEY (switch);
+
+
+--
+-- Name: switchtypes_pkey; Type: CONSTRAINT; Schema: public; Owner: nms; Tablespace:
+--
+
+ALTER TABLE ONLY switchtypes
+ ADD CONSTRAINT switchtypes_pkey PRIMARY KEY (switchtype);
+
+
+--
+-- Name: polls_switchporttime; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE INDEX polls_switchporttime ON polls USING btree (switch, port, "time");
+
+
+--
+-- Name: polls_time; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE INDEX polls_time ON polls USING btree ("time");
+
+
+--
+-- Name: switches_ap_poll; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE UNIQUE INDEX switches_ap_poll ON ap_poll USING btree (switch);
+
+
+--
+-- Name: switches_dhcp; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE UNIQUE INDEX switches_dhcp ON dhcp USING btree (switch);
+
+
+--
+-- Name: switches_placement; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE UNIQUE INDEX switches_placement ON placements USING btree (switch);
+
+
+--
+-- Name: switches_switch; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE UNIQUE INDEX switches_switch ON switches USING btree (switch);
+
+
+--
+-- Name: temppoll_search; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE INDEX temppoll_search ON temppoll USING btree (switch, id);
+
+
+--
+-- Name: time_idx; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE INDEX time_idx ON ipv6 USING btree ("time");
+
+
+--
+-- Name: timev4_idx; Type: INDEX; Schema: public; Owner: nms; Tablespace:
+--
+
+CREATE INDEX timev4_idx ON ipv4 USING btree ("time");
+
+
+--
+-- Name: ap_poll_switch_fkey; Type: FK CONSTRAINT; Schema: public; Owner: nms
+--
+
+ALTER TABLE ONLY ap_poll
+ ADD CONSTRAINT ap_poll_switch_fkey FOREIGN KEY (switch) REFERENCES switches(switch);
+
+
+--
+-- Name: switches_switchtype_fkey; Type: FK CONSTRAINT; Schema: public; Owner: nms
+--
+
+ALTER TABLE ONLY switches
+ ADD CONSTRAINT switches_switchtype_fkey FOREIGN KEY (switchtype) REFERENCES switchtypes(switchtype);
+
+
+--
+-- Name: temppoll_switch_fkey; Type: FK CONSTRAINT; Schema: public; Owner: nms
+--
+
+ALTER TABLE ONLY temppoll
+ ADD CONSTRAINT temppoll_switch_fkey FOREIGN KEY (switch) REFERENCES switches(switch);
+
+
+--
+-- Name: uplinks_coreswitch_fkey; Type: FK CONSTRAINT; Schema: public; Owner: nms
+--
+
+ALTER TABLE ONLY uplinks
+ ADD CONSTRAINT uplinks_coreswitch_fkey FOREIGN KEY (coreswitch) REFERENCES switches(switch);
+
+
+--
+-- Name: uplinks_switch_fkey; Type: FK CONSTRAINT; Schema: public; Owner: nms
+--
+
+ALTER TABLE ONLY uplinks
+ ADD CONSTRAINT uplinks_switch_fkey FOREIGN KEY (switch) REFERENCES switches(switch);
+
+
+--
+-- Name: public; Type: ACL; Schema: -; Owner: postgres
+--
+
+REVOKE ALL ON SCHEMA public FROM PUBLIC;
+REVOKE ALL ON SCHEMA public FROM postgres;
+GRANT ALL ON SCHEMA public TO postgres;
+GRANT ALL ON SCHEMA public TO PUBLIC;
+
+
+--
+-- Name: ipv4; Type: ACL; Schema: public; Owner: nms
+--
+
+REVOKE ALL ON TABLE ipv4 FROM PUBLIC;
+REVOKE ALL ON TABLE ipv4 FROM nms;
+GRANT ALL ON TABLE ipv4 TO nms;
+
+
+--
+-- Name: ipv6; Type: ACL; Schema: public; Owner: nms
+--
+
+REVOKE ALL ON TABLE ipv6 FROM PUBLIC;
+REVOKE ALL ON TABLE ipv6 FROM nms;
+GRANT ALL ON TABLE ipv6 TO nms;
+
+
+--
+-- Name: mbd_log; Type: ACL; Schema: public; Owner: nms
+--
+
+REVOKE ALL ON TABLE mbd_log FROM PUBLIC;
+REVOKE ALL ON TABLE mbd_log FROM nms;
+GRANT ALL ON TABLE mbd_log TO nms;
+
+
+--
+-- Name: mldpolls; Type: ACL; Schema: public; Owner: postgres
+--
+
+REVOKE ALL ON TABLE mldpolls FROM PUBLIC;
+REVOKE ALL ON TABLE mldpolls FROM postgres;
+GRANT ALL ON TABLE mldpolls TO postgres;
+GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE mldpolls TO nms;
+
+
+--
+-- PostgreSQL database dump complete
+--
+
+\connect postgres
+
+--
+-- PostgreSQL database dump
+--
+
+SET statement_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+
+--
+-- Name: postgres; Type: COMMENT; Schema: -; Owner: postgres
+--
+
+COMMENT ON DATABASE postgres IS 'default administrative connection database';
+
+
+--
+-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner:
+--
+
+CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
+
+
+--
+-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner:
+--
+
+COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
+
+
+--
+-- Name: public; Type: ACL; Schema: -; Owner: postgres
+--
+
+REVOKE ALL ON SCHEMA public FROM PUBLIC;
+REVOKE ALL ON SCHEMA public FROM postgres;
+GRANT ALL ON SCHEMA public TO postgres;
+GRANT ALL ON SCHEMA public TO PUBLIC;
+
+
+--
+-- PostgreSQL database dump complete
+--
+
+\connect template1
+
+--
+-- PostgreSQL database dump
+--
+
+SET statement_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SET check_function_bodies = false;
+SET client_min_messages = warning;
+
+--
+-- Name: template1; Type: COMMENT; Schema: -; Owner: postgres
+--
+
+COMMENT ON DATABASE template1 IS 'default template for new databases';
+
+
+--
+-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner:
+--
+
+CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
+
+
+--
+-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner:
+--
+
+COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
+
+
+--
+-- Name: public; Type: ACL; Schema: -; Owner: postgres
+--
+
+REVOKE ALL ON SCHEMA public FROM PUBLIC;
+REVOKE ALL ON SCHEMA public FROM postgres;
+GRANT ALL ON SCHEMA public TO postgres;
+GRANT ALL ON SCHEMA public TO PUBLIC;
+
+
+--
+-- PostgreSQL database dump complete
+--
+
+--
+-- PostgreSQL database cluster dump complete
+--
+
diff --git a/sql/strip.pl b/sql/strip.pl
new file mode 100644
index 0000000..51739a6
--- /dev/null
+++ b/sql/strip.pl
@@ -0,0 +1,33 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+
+my $ignore = "((([0-9a-f]{2}[:]){5}[0-9a-f]{2})|";
+$ignore .= "([0-9]{4}\-[0-9]{2}\-[0-9]{2} [0-9]{2}\:[0-9]{2}\:[0-9]{2})";
+$ignore .= ").*";
+
+my $community = "<removed>";
+
+my $skip = 0;
+
+open (SQL, $ARGV[0]) or die "Unable to open SQL-file";
+while (<SQL>) {
+ unless (/^$ignore$/){
+
+ if (/COPY (mbd_log|squeue|temppoll|ap_poll)/){
+ $skip = 1;
+ print;
+ }
+
+ if (/\\\./){
+ $skip = 0;
+ }
+
+ unless ($skip){
+ s/$community/<removed>/g; # community
+ s/PASSWORD '.+'/PASSWORD '<removed>'/g; # password for SQL-users
+ s/public$/<removed>/; # public-community -- assuming last column
+ print;
+ }
+ }
+}
diff --git a/stream/encode/kliniskarbeidsflate/reflect-krosus.sh b/stream/encode/kliniskarbeidsflate/reflect-krosus.sh
new file mode 100755
index 0000000..a40500c
--- /dev/null
+++ b/stream/encode/kliniskarbeidsflate/reflect-krosus.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+while :; do vlc -vvv udp://@:9017 --network-caching 2000 --no-sout-audio --sout '#std{access=udp,mux=ts,dst=151.216.125.4:4016}' --intf dummy --ttl 60 vlc://quit;
+ sleep 5
+done
diff --git a/stream/encode/kliniskarbeidsflate/reflect.sh b/stream/encode/kliniskarbeidsflate/reflect.sh
new file mode 100755
index 0000000..7419433
--- /dev/null
+++ b/stream/encode/kliniskarbeidsflate/reflect.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+while :; do vlc -vvv rtsp://151.216.106.2:554/live1.sdp --network-caching 2000 --no-sout-audio --sout '#std{access=udp,mux=ts,dst=127.0.0.1:9017}' --intf dummy --ttl 60 vlc://quit;
+ sleep 5
+done
diff --git a/stream/encode/kliniskarbeidsflate/transcode-event-sd.sh b/stream/encode/kliniskarbeidsflate/transcode-event-sd.sh
new file mode 100755
index 0000000..fb5c055
--- /dev/null
+++ b/stream/encode/kliniskarbeidsflate/transcode-event-sd.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+while :; do
+cvlc -vv udp://@:4014 --network-caching 2000 --sout-x264-preset fast --sout-x264-tune film --sout-transcode-threads 22 --no-sout-x264-interlaced --sout-x264-keyint 50 --sout-x264-lookahead 100 \
+--sout '#transcode{height=576,vcodec=h264,vb=2000,acodec=mp4a,aenc=fdkaac,ab=128}:std{access=udp,mux=ts,dst=151.216.125.4:4014}'
+sleep 1
+done
diff --git a/stream/encode/kliniskarbeidsflate/transcode-fugle-flash.sh b/stream/encode/kliniskarbeidsflate/transcode-fugle-flash.sh
new file mode 100755
index 0000000..a924de2
--- /dev/null
+++ b/stream/encode/kliniskarbeidsflate/transcode-fugle-flash.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+while :; do
+cvlc -vv --network-caching 3000 --sout-x264-preset fast --sout-transcode-threads 10 --sout-x264-tune film --no-sout-x264-interlaced --sout-x264-lookahead 50 --sout-x264-vbv-maxrate 800 --sout-x264-vbv-bufsize 800 --sout-x264-keyint 50 -v http://stream.tg13.gathering.org:3015 vlc://quit \
+--sout '#transcode{height=480,fps=25,vcodec=h264,vb=800,acodec=aac,ab=128,deinterlace}:std{access=udp,mux=ffmpeg{mux=flv},dst=151.216.125.4:4020}'
+ sleep 1
+done
+
diff --git a/stream/encode/kliniskarbeidsflate/transcode-noc-fisheye-flash.sh b/stream/encode/kliniskarbeidsflate/transcode-noc-fisheye-flash.sh
new file mode 100755
index 0000000..3491232
--- /dev/null
+++ b/stream/encode/kliniskarbeidsflate/transcode-noc-fisheye-flash.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+while :; do
+cvlc -vv --network-caching 5000 --sout-x264-preset fast --sout-transcode-threads 16 --sout-x264-tune film --no-sout-x264-interlaced --sout-x264-lookahead 50 --sout-x264-vbv-maxrate 800 --sout-x264-vbv-bufsize 800 --sout-x264-keyint 50 -v http://stream.tg13.gathering.org:3018 vlc://quit \
+--sout '#transcode{width=768,height=768,vcodec=h264,vb=800}:std{access=udp,mux=ts,dst=151.216.125.4:4019}'
+ sleep 1
+done
diff --git a/stream/encode/kliniskarbeidsflate/transcode-south.sh b/stream/encode/kliniskarbeidsflate/transcode-south.sh
new file mode 100755
index 0000000..d5a83e4
--- /dev/null
+++ b/stream/encode/kliniskarbeidsflate/transcode-south.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+while :; do cvlc -vv udp://@:9017 \
+ --sout-ts-shaping=1000 --sout-ts-use-key-frames --sout-ts-dts-delay=500 --sout-transcode-fps 0 --no-sout-transcode-audio-sync --network-caching 2000 \
+ --no-sout-x264-interlaced --sout-x264-preset veryfast --sout-x264-tune film \
+ --sout-transcode-threads 3 --sout-x264-keyint 25 --no-sout-audio \
+ --sout '#duplicate{dst="transcode{vcodec=h264,height=720,vb=3000}:std{access=udp,mux=ts,dst=151.216.125.4:4017}",dst="std{access=udp,mux=ts,dst=151.216.125.4:4016}"}' \
+ --intf dummy --ttl 20 vlc://quit;
+ sleep 1
+done
diff --git a/stream/encode/politietno/foo-withoutreflect.sh b/stream/encode/politietno/foo-withoutreflect.sh
new file mode 100755
index 0000000..21bcda6
--- /dev/null
+++ b/stream/encode/politietno/foo-withoutreflect.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+/home/techserver/vlc/vlc -I dummy -vvvv --decklink-audio-connection embedded --live-caching 3000 --decklink-aspect-ratio 16:9 --decklink-mode hp50 \
+ --sout-x264-preset slow --sout-x264-tune film --sout-transcode-threads 23 --no-sout-x264-interlaced \
+ --sout-x264-keyint 50 --sout-x264-lookahead 100 --sout-x264-vbv-maxrate 5000 --sout-x264-vbv-bufsize 5000 \
+ -v decklink:// vlc://quit \
+ --sout '#transcode{vcodec=h264,vb=3000,acodec=mp4a,aenc=fdkaac,ab=256}:std{access=udp,mux=ts,dst=151.216.124.80:9094}'
diff --git a/stream/encode/politietno/foo.sh b/stream/encode/politietno/foo.sh
new file mode 100755
index 0000000..dfdfc03
--- /dev/null
+++ b/stream/encode/politietno/foo.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+/home/techserver/vlc/vlc -I dummy -vvvv --decklink-audio-connection embedded --live-caching 3000 --decklink-aspect-ratio 16:9 --decklink-mode hp50 \
+ --sout-x264-preset slow --sout-x264-tune film --sout-transcode-threads 23 --no-sout-x264-interlaced \
+ --sout-x264-keyint 50 --sout-x264-lookahead 100 --sout-x264-vbv-maxrate 5000 --sout-x264-vbv-bufsize 5000 \
+ -v decklink:// vlc://quit \
+ --sout '#transcode{vcodec=h264,vb=3000,acodec=mp4a,aenc=fdkaac,ab=256}:std{access=udp,mux=ts,dst=151.216.125.4:4013}'
diff --git a/stream/encode/politietno/svineri.sh b/stream/encode/politietno/svineri.sh
new file mode 100755
index 0000000..ac09601
--- /dev/null
+++ b/stream/encode/politietno/svineri.sh
@@ -0,0 +1,24 @@
+~/decklink-sdk/Linux/Samples/bmdtools/bmdcapture $(
+ echo '-C 0' # Decklink card number
+ echo '-m 11' # Input format mode (ID 8 = 1080i/25)
+ echo '-V 4' # Video input (4 = SDI)
+ echo '-A 2' # Audio input (2 = Embedded)
+ echo '-c 2' # Number of audio channels
+ echo '-M 10' # Memory limit, in GB, for the output buffer (it leaks slightly...)
+ echo '-F nut -f pipe:1' # Output format and file name
+) | \
+ffmpeg $(
+ echo '-y -re -i -' # Input from pipe
+ echo '-v verbose' # Verbosity level
+# echo '-filter:v format=yuv420p,yadif=1:0:0' # Video format conversion and deinterlacing
+ echo '-filter:v scale=480x270'
+ echo '-c:v libx264' # Video encoder to use
+ echo '-tune film -preset slow' # Video encoder options
+ echo '-x264opts keyint=50:rc-lookahead=0' # x264-specific options
+# echo '-b:v 1M' # Video bitrate
+ echo '-c:a libfaac' # Audio encoder to use
+ echo '-b:a 192k' # Audio bitrate
+ echo '-threads auto' # Number of threads to use
+ echo '-f mpegts udp://151.216.125.4:4013' # Output format and file name
+)
+
diff --git a/stream/encode/politietno/transcode-duplicate.sh b/stream/encode/politietno/transcode-duplicate.sh
new file mode 100755
index 0000000..591e529
--- /dev/null
+++ b/stream/encode/politietno/transcode-duplicate.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+while :; do
+cvlc -vv --decklink-audio-connection embedded --live-caching 2000 --decklink-aspect-ratio 16:9 --decklink-mode hp50 \
+ --sout-x264-preset fast --sout-x264-tune film --sout-transcode-threads 24 --no-sout-x264-interlaced --sout-x264-keyint 50 --sout-x264-lookahead 100 --sout-x264-vbv-maxrate 4000 --sout-x264-vbv-bufsize 4000 decklink:// vlc://quit \
+ --sout '#duplicate{dst="transcode{vcodec=h264,vb=6000,acodec=mp4a,aenc=fdkaac,ab=256}:std{access=udp,mux=ts,dst=151.216.125.4:4013}",dst="transcode{height=576,vcodec=h264,vb=2000,acodec=mp4a,aenc=fdkaac,ab=128}:std{access=udp,mux=ts,dst=151.216.125.4:4014}"}'
+sleep 1
+done
diff --git a/stream/encode/politietno/transcode-duplicate2.sh b/stream/encode/politietno/transcode-duplicate2.sh
new file mode 100755
index 0000000..6b85d1d
--- /dev/null
+++ b/stream/encode/politietno/transcode-duplicate2.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+# event signal:
+# transcode hd and move to reflector
+# mirror signal to encoder2 (kliniskarbeidsflate) and transcode sd -> reflector
+while :; do
+cvlc -vv --decklink-audio-connection embedded --live-caching 2000 --decklink-aspect-ratio 16:9 --decklink-mode hp50 \
+ --sout-x264-preset fast --sout-x264-tune film --sout-transcode-threads 22 --no-sout-x264-interlaced --sout-x264-keyint 50 --sout-x264-lookahead 100 decklink:// vlc://quit \
+ --sout '#duplicate{dst="transcode{vcodec=h264,vb=6000,acodec=mp4a,aenc=fdkaac,ab=256}:std{access=udp,mux=ts,dst=151.216.125.4:4013}",dst="std{access=udp,mux=ts,dst=151.216.125.9:4014}"}'
+sleep 1
+done
diff --git a/stream/encode/politietno/transcode.sh b/stream/encode/politietno/transcode.sh
new file mode 100755
index 0000000..a4feda9
--- /dev/null
+++ b/stream/encode/politietno/transcode.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+cvlc -I dummy -vvvv --decklink-audio-connection embedded --live-caching 2000 --decklink-aspect-ratio 16:9 --decklink-mode hp50 \
+ --sout-x264-preset slow --sout-x264-tune film --sout-transcode-threads 23 --no-sout-x264-interlaced \
+ --sout-x264-keyint 50 --sout-x264-lookahead 100 --sout-x264-vbv-maxrate 6000 --sout-x264-vbv-bufsize 6000 \
+ -v decklink:// vlc://quit \
+ --sout '#transcode{vcodec=h264,vb=6000,acodec=mp4a,aenc=fdkaac,ab=256}:std{access=udp,mux=ts,dst=151.216.125.4:4013}'
diff --git a/stream/encode/politietno/vid.sh b/stream/encode/politietno/vid.sh
new file mode 100755
index 0000000..8c5bcba
--- /dev/null
+++ b/stream/encode/politietno/vid.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+# VLC for box connected to broadcast-equipment Blackmagic/Decklink: Audio and Video from SDI Transcodes HD and sends via UDP to reflector - Marius / Tech:Server
+while :; do cvlc -vv --no-decklink-tenbits --decklink-audio-connection embedded --live-caching 1800 --decklink-aspect-ratio 16:9 --decklink-mode hp50 \
+ --sout-x264-preset medium --sout-x264-tune film --sout-transcode-threads 15 --no-sout-x264-interlaced --sout-x264-keyint 100 --sout-x264-lookahead 50 --sout-x264-vbv-maxrate 7000 --sout-x264-vbv-bufsize 7000 -v decklink:// vlc://quit \
+ --sout '#transcode{vcodec=h264,vb=3000,acodec=mp3,ab=256}:std{access=udp,mux=ts,dst=151.216.125.4:4013}'
+ sleep 1
+done
diff --git a/stream/reflect/count-retrofit.sh b/stream/reflect/count-retrofit.sh
new file mode 100755
index 0000000..1ff8c30
--- /dev/null
+++ b/stream/reflect/count-retrofit.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+while :; do
+ date=$(date +"%Y-%m-%d-%H:%M:%S")
+ #( lsof -n | grep vlc ; ssh root@gaffeltruck.tg12.gathering.org 'lsof -n | grep vlc' ) > /var/log/stream-count/$date
+ sudo lsof -n | grep vlc > /var/log/stream-count/$date
+ for PORT in 3013 3014 3015 3016 3017 3018 3019 5013 5015 5019; do
+ for PROTO in IPv4 IPv6; do
+ if [ "$PROTO" = "IPv4" ]; then
+ GREPFOR='151\.216'
+ else
+ GREPFOR='2a02:ed02:'
+ fi
+
+ # 151.216.x.x / 2a02:ed02::/32 -> TG13
+ cat /var/log/stream-count/$date | grep EST | egrep $GREPFOR | egrep "(151\.216\..*|2a02:ed02:.*):$PORT->" | cut -d'>' -f2 | sed 's/:[0-9]\+ (ESTABLISHED)//' | sort -u | grep -vEc -e "\[2a02:ed02:|151\.216\." | while read foo; do echo "$date $PORT $PROTO external $foo"; done | tee -a better_datacube.log
+ cat /var/log/stream-count/$date | grep EST | egrep $GREPFOR | egrep "(151\.216\..*|2a02:ed02:.*):$PORT->" | cut -d'>' -f2 | sed 's/:[0-9]\+ (ESTABLISHED)//' | sort -u | grep -Ec -e "\[2a02:ed02:|151\.216\." | while read foo; do echo "$date $PORT $PROTO internal $foo"; done | tee -a better_datacube.log
+ done
+ done
+ sleep 60
+done;
+
diff --git a/stream/reflect/count.sh b/stream/reflect/count.sh
new file mode 100755
index 0000000..e1fa38c
--- /dev/null
+++ b/stream/reflect/count.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+while :; do
+ date=$(date +"%Y-%m-%d-%H:%M:%S")
+ #( lsof -n | grep vlc ; ssh root@gaffeltruck.tg12.gathering.org 'lsof -n | grep vlc' ) > /var/log/stream-count/$date
+ sudo lsof -n | grep vlc > /var/log/stream-count/$date
+ for PORT in 3013 3014 3015 3016 3017 3018 3019 5013 5015 5019; do
+ for PROTO in IPv4 IPv6; do
+ if [ "$PROTO" = "IPv4" ]; then
+ GREPFOR='151\.216'
+ else
+ GREPFOR='2a02:ed02:'
+ fi
+
+ # 151.216.x.x / 2a02:ed02::/32 -> TG13
+ cat /var/log/stream-count/$date | grep EST | egrep $GREPFOR | egrep "(151\.216\..*|2a02:ed02:.*):$PORT->" | cut -d'>' -f2 | sed 's/:[0-9]\+ (ESTABLISHED)//' | sort -u | grep -vEc -e "\[2a02:ed02:|151\.216\." | while read foo; do echo "$date $PORT $PROTO external $foo"; done | tee -a count_datacube.log
+ cat /var/log/stream-count/$date | grep EST | egrep $GREPFOR | egrep "(151\.216\..*|2a02:ed02:.*):$PORT->" | cut -d'>' -f2 | sed 's/:[0-9]\+ (ESTABLISHED)//' | sort -u | grep -Ec -e "\[2a02:ed02:|151\.216\." | while read foo; do echo "$date $PORT $PROTO internal $foo"; done | tee -a count_datacube.log
+ done
+ done
+ sleep 60
+done;
+
diff --git a/stream/reflect/htb.sh b/stream/reflect/htb.sh
new file mode 100755
index 0000000..c6107ea
--- /dev/null
+++ b/stream/reflect/htb.sh
@@ -0,0 +1,79 @@
+#!/bin/bash
+it () {
+ iptables $@
+ ip6tables $@
+}
+
+setup_htb() {
+ FROM=$1
+ TO=$2
+ RATEMBIT=$3
+ FIFOLIMIT=$(( RATEMBIT * 1048576 / 8 )) # about one second
+ echo $FROM..$TO ${RATEMBIT}Mbit fifolimit=$FIFOLIMIT >&2
+
+ for i in $( seq $FROM $TO ); do
+ # slots need to be in hex, crazy enough
+ slot=$( printf %x $(( i + 1 )) )
+
+ # no burst! perfectly even sending at the given rate
+ echo class add dev eth0 parent 8000: classid 8000:$slot htb rate ${RATEMBIT}Mbit burst 0 mtu 576
+
+ # every class needs a child qdisc, plug in a plain fifo
+ # 8000kbit = 512 000
+ echo qdisc add dev eth0 parent 8000:$slot handle $slot: bfifo limit $FIFOLIMIT
+ #echo qdisc add dev eth0 parent 8000:$slot handle $slot: fq_codel limit 1000
+ done
+}
+
+ethtool -K eth0 gso off tso off
+
+# iptables stuff
+it -t mangle -F OUTPUT
+it -t mangle -A OUTPUT -p tcp -m multiport ! --sport 3013,3014,3015,3016,3017,3018,5013,5015,5016,5018 -j MARK --set-mark 65000
+it -t mangle -A OUTPUT ! -p tcp -j MARK --set-mark 65000
+
+(
+ # reset tc
+ echo qdisc del dev eth0 root
+
+ # @Sesse Rockj: https://www.google.com/search?q=6000+kbit%2Fsec+*+0.5+seconds+in+byte
+ # @Sesse ViD: også trenger du flere sett med køer, for 2mbit-strømmer burde shapes annerledes enn 5mbit-strømmer :-P
+
+ # root qdisc should be htb
+ echo qdisc add dev eth0 root handle 8000: htb r2q 100
+
+ # all non-vlc traffic (fwmark 5) goes into the default class
+ echo class add dev eth0 parent 8000: classid 8000:1 htb rate 10Gbit burst 8192 mtu 1514
+ echo filter add dev eth0 parent 8000: handle 65000 pref 10 fw classid 8000:1
+
+ # setup_htb 1 799 6 # Main stream hq 3mbps
+ # setup_htb 800 1000 15 # Fuglecam raw 7-8mbps
+ # # setup_htb 10000 11999 15 # South raw ??
+ # # setup_htb 12000 13999 1 # South transcoded, 500 kbits
+ # # setup_htb 14000 15999 25 # NOC Fisheye 15mbps ish
+ # # setup_htb 20000 21999 2 # Flashstrøm 1mbps
+
+ # setup_htb 1 4999 10 # Main stream hq 6mbps
+ # setup_htb 5000 7999 5 # Main stream sd 2mbit
+ # setup_htb 8000 9999 15 # Fuglecam raw 7-8mbps
+ # setup_htb 10000 11999 15 # South raw ??
+ # setup_htb 12000 13999 1 # South transcoded, 500 kbits
+ # setup_htb 14000 15999 25 # NOC Fisheye 15mbps ish
+ # setup_htb 16000 18999 2 # Flashstrøm fugleberget 1mbps
+ # setup_htb 19000 21999 2 # Flashstrøm event 1mbps
+ # setup_htb 22000 24999 2 # Flashstrøm south 1mbps
+ # setup_htb 25000 27999 2 # Flashstrøm noc 1mbps
+ setup_htb 1 4999 10 # Main stream hq 6mbps
+ setup_htb 5000 5999 5 # Main stream sd 2mbit
+ setup_htb 8000 9999 15 # Fuglecam raw 7-8mbps
+ setup_htb 10000 11999 15 # South raw ??
+ setup_htb 12000 13999 1 # South transcoded, 500 kbits
+ setup_htb 14000 15999 25 # NOC Fisheye 15mbps ish
+ setup_htb 16000 18999 2 # Flashstrøm fugleberget 1mbps
+ setup_htb 19000 21999 2 # Flashstrøm event 1mbps
+ setup_htb 22000 24999 2 # Flashstrøm south 1mbps
+ setup_htb 25000 25999 2 # Flashstrøm noc 1mbps
+
+ # decide between the classes by mark
+ echo filter add dev eth0 parent 8000: handle 2 pref 20 flow map key mark baseclass 8000:2
+) | tc -b
diff --git a/stream/reflect/old/reflectsouth.sh b/stream/reflect/old/reflectsouth.sh
new file mode 100755
index 0000000..39504e5
--- /dev/null
+++ b/stream/reflect/old/reflectsouth.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+while :; do
+vlc --intf dummy -v http://pannekake.samfundet.no:9094 vlc://quit --sout '#duplicate{dst=std{access=http,mux=ts,dst=:3014},dst=std{access=udp,mux=ts,dst=233.191.12.2:2014}' --intf dummy --ttl 20
+ sleep 1
+done
diff --git a/stream/reflect/old/reflectsouth720p.sh b/stream/reflect/old/reflectsouth720p.sh
new file mode 100755
index 0000000..355cf8e
--- /dev/null
+++ b/stream/reflect/old/reflectsouth720p.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+while :; do
+cvlc --intf dummy -v "#transcode{vcodec=h264,width=320,height=180,acodec=aac,ab=128,vb=500}:rtp{port=4555,sdp=rtsp://151.216.106.2:4555/stream.sdp,mp4a­-latm}"
+vlc --intf dummy -v http://pannekake.samfundet.no:9093 vlc://quit --sout '#std{access=http,mux=ts,dst=:5014}' --intf dummy --ttl 30
+ sleep 1
+done
diff --git a/stream/reflect/reflect-event-lol.sh b/stream/reflect/reflect-event-lol.sh
new file mode 100755
index 0000000..74dbea6
--- /dev/null
+++ b/stream/reflect/reflect-event-lol.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+while :; do
+sudo cvlc --intf dummy -v --sout-http-mark-start 0 --sout-http-mark-end 4999 udp://@:4013 vlc://quit --sout \
+'#duplicate{dst=std{access=http,mux=ts,dst=[::]:3013}",dst=std{access=udp,mux=ts,dst=[ff7e:a40:2a02:ed02:ffff::13]:2013},dst=std{access=livehttp{seglen=5,delsegs=true,numsegs=5,index=/srv/stream.tg13.gathering.org/ios/event.m3u8,index-url=http://stream.tg13.gathering.org/ios/event-########.ts},mux=ts{use-key-frames},dst=/srv/stream.tg13.gathering.org/ios/event-########.ts}}}' \
+--intf dummy --ttl 60
+ sleep 1
+done
diff --git a/stream/reflect/reflect-event-sd.sh b/stream/reflect/reflect-event-sd.sh
new file mode 100755
index 0000000..aa38018
--- /dev/null
+++ b/stream/reflect/reflect-event-sd.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+while :; do
+sudo cvlc --intf dummy -v --sout-http-mark-start 5000 --sout-http-mark-end 7999 udp://@:4014 vlc://quit --sout '#duplicate{dst=std{access=http,mux=ts,dst=[::]:3014},dst=std{access=udp,mux=ts,dst=[ff7e:a40:2a02:ed02:ffff::14]:2014}' --intf dummy --ttl 60
+ sleep 1
+done
diff --git a/stream/reflect/reflect-event.sh b/stream/reflect/reflect-event.sh
new file mode 100755
index 0000000..3ab8c42
--- /dev/null
+++ b/stream/reflect/reflect-event.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+while :; do
+sudo cvlc --intf dummy -v --sout-http-mark-start 0 --sout-http-mark-end 4999 udp://@:4013 vlc://quit --sout \
+'#duplicate{dst=std{access=http,mux=ts,dst=[::]:3013}",dst=std{access=udp,mux=ts,dst=[ff7e:a40:2a02:ed02:ffff::13]:2013},dst=std{access=livehttp{seglen=5,delsegs=true,numsegs=5,index=/srv/stream.tg13.gathering.org/ios/stream.m3u8,index-url=http://stream.tg13.gathering.org/ios/stream-########.ts},mux=ts{use-key-frames},dst=/srv/stream.tg13.gathering.org/ios/stream-########.ts}}}' \
+--intf dummy --ttl 60
+ sleep 1
+done
diff --git a/stream/reflect/reflect-fugle-flash.sh b/stream/reflect/reflect-fugle-flash.sh
new file mode 100755
index 0000000..5de38bb
--- /dev/null
+++ b/stream/reflect/reflect-fugle-flash.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+while :; do
+sudo cvlc -vv --sout-http-mark-start 16000 --sout-http-mark-end 18999 --network-caching 3000 --sout-x264-preset fast --sout-transcode-threads 10 --sout-x264-tune film --no-sout-x264-interlaced --sout-x264-lookahead 50 --sout-x264-vbv-maxrate 800 --sout-x264-vbv-bufsize 800 --sout-x264-keyint 50 -v udp://@:4020 vlc://quit \
+--sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=[::]:5015/stream.flv}'
+ sleep 1
+done
diff --git a/stream/reflect/reflect-fuglecam.sh b/stream/reflect/reflect-fuglecam.sh
new file mode 100755
index 0000000..c9a8917
--- /dev/null
+++ b/stream/reflect/reflect-fuglecam.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+while :; do
+sudo vlc -vvv --intf dummy -v --sout-http-mark-start 8000 --sout-http-mark-end 9999 udp://@:4015 vlc://quit --sout '#duplicate{dst=std{access=http,mux=ts,dst=[::]:3015},dst=std{access=udp,mux=ts,dst=[ff7e:a40:2a02:ed02:ffff::15]:2015}' --intf dummy --ttl 60
+ sleep 1
+done
diff --git a/stream/reflect/reflect-nicfisheye-flash.sh b/stream/reflect/reflect-nicfisheye-flash.sh
new file mode 100755
index 0000000..dd4da84
--- /dev/null
+++ b/stream/reflect/reflect-nicfisheye-flash.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+while :; do
+sudo vlc -vvv --intf dummy -v --sout-http-mark-start 25000 --sout-http-mark-end 27999 udp://@:4018 vlc://quit --sout '#duplicate{dst=std{access=http,mux=ts,dst=[::]:3018},dst=std{access=udp,mux=ts,dst=[ff7e:a40:2a02:ed02:ffff::18]:2018}' --intf dummy --ttl 60
+ sleep 1
+done
diff --git a/stream/reflect/reflect-noc-transcodes.sh b/stream/reflect/reflect-noc-transcodes.sh
new file mode 100755
index 0000000..3a1fe4e
--- /dev/null
+++ b/stream/reflect/reflect-noc-transcodes.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+while :; do
+sudo cvlc -vvv --intf dummy -v --sout-http-mark-start 25000 --sout-http-mark-end 27999 udp://@:4019 vlc://quit --sout '#duplicate{dst="std{access=http{mime=video/x-flv},dst=[::]:5019/stream.flv}",dst="std{access=http,mux=ts,dst=[::]:3019}",dst="std{access=udp,mux=ts,dst=[ff7e:a40:2a02:ed02:ffff::19]:2019}"}' --intf dummy --ttl 60
+ sleep 1
+done
diff --git a/stream/reflect/reflect-nocfisheye.sh b/stream/reflect/reflect-nocfisheye.sh
new file mode 100755
index 0000000..6a003f4
--- /dev/null
+++ b/stream/reflect/reflect-nocfisheye.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+while :; do
+sudo cvlc -vvv --intf dummy -v --sout-http-mark-start 14000 --sout-http-mark-end 15999 --network-caching 2000 rtsp://151.216.124.79/live.sdp vlc://quit --sout '#duplicate{dst=std{access=http,mux=ts,dst=[::]:3018},dst=std{access=udp,mux=ts,dst=[ff7e:a40:2a02:ed02:ffff::18]:2018}' --intf dummy --ttl 60
+ sleep 1
+done
diff --git a/stream/reflect/reflect-south-raw.sh b/stream/reflect/reflect-south-raw.sh
new file mode 100755
index 0000000..720e94c
--- /dev/null
+++ b/stream/reflect/reflect-south-raw.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+while :; do
+sudo cvlc -vvv --intf dummy -v --sout-http-mark-start 10000 --sout-http-mark-end 11999 udp://@151.216.125.4:4016 vlc://quit --sout '#duplicate{dst=std{access=http,mux=ts,dst=[::]:3016},dst=std{access=udp,mux=ts,dst=[ff7e:a40:2a02:ed02:ffff::16]:2016}' --intf dummy --ttl 60
+ sleep 1
+done
diff --git a/stream/reflect/reflect-south-transcode.sh b/stream/reflect/reflect-south-transcode.sh
new file mode 100755
index 0000000..65798dc
--- /dev/null
+++ b/stream/reflect/reflect-south-transcode.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+while :; do
+vlc -vvv --intf dummy -v --sout-http-mark-start 12000 --sout-http-mark-end 13999 udp://@:4017 vlc://quit --sout '#duplicate{dst=std{access=http,mux=ts,dst=[::]:3017},dst=std{access=udp,mux=ts,dst=[ff7e:a40:2a02:ed02:ffff::17]:2017}' --intf dummy --ttl 60
+ sleep 1
+done
diff --git a/stream/reflect/transcode-event-flash.sh b/stream/reflect/transcode-event-flash.sh
new file mode 100755
index 0000000..34f546f
--- /dev/null
+++ b/stream/reflect/transcode-event-flash.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+while :; do
+sudo cvlc -vv --sout-http-mark-start 19000 --sout-http-mark-end 21999 --network-caching 5000 --sout-x264-preset fast --sout-transcode-threads 10 --sout-x264-tune film --no-sout-x264-interlaced --sout-x264-lookahead 50 --sout-x264-vbv-maxrate 800 --sout-x264-vbv-bufsize 800 --sout-x264-keyint 50 -v http://stream.tg13.gathering.org:3013 vlc://quit \
+--sout '#transcode{height=480,fps=25,vcodec=h264,vb=800,acodec=aac,ab=128}:std{access=http{mime=video/x-flv},dst=[::]:5013/stream.flv}'
+ sleep 1
+done
diff --git a/stream/reflect/transcode-fugle-flash.sh b/stream/reflect/transcode-fugle-flash.sh
new file mode 100755
index 0000000..110b8b8
--- /dev/null
+++ b/stream/reflect/transcode-fugle-flash.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+while :; do
+sudo cvlc -vv --sout-http-mark-start 16000 --sout-http-mark-end 18999 --network-caching 3000 --sout-x264-preset fast --sout-transcode-threads 10 --sout-x264-tune film --no-sout-x264-interlaced --sout-x264-lookahead 50 --sout-x264-vbv-maxrate 800 --sout-x264-vbv-bufsize 800 --sout-x264-keyint 50 -v http://stream.tg13.gathering.org:3015 vlc://quit \
+--sout '#transcode{height=480,fps=25,vcodec=h264,vb=800,acodec=aac,ab=128,deinterlace}:std{access=http{mime=video/x-flv},dst=[::]:5015/stream.flv}'
+ sleep 1
+done
diff --git a/stream/reflect/transcode-nocfisheye-flash.sh b/stream/reflect/transcode-nocfisheye-flash.sh
new file mode 100755
index 0000000..19f89ad
--- /dev/null
+++ b/stream/reflect/transcode-nocfisheye-flash.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+while :; do
+sudo cvlc -vv --sout-http-mark-start 25000 --sout-http-mark-end 27999 --network-caching 5000 --sout-x264-preset fast --sout-transcode-threads 10 --sout-x264-tune film --no-sout-x264-interlaced --sout-x264-lookahead 50 --sout-x264-vbv-maxrate 800 --sout-x264-vbv-bufsize 800 --sout-x264-keyint 50 -v http://stream.tg13.gathering.org:3018 vlc://quit \
+--sout '#transcode{height=480,fps=25,vcodec=h264,vb=800,acodec=aac,ab=128}:std{access=http{mime=video/x-flv},dst=[::]:5018/stream.flv}'
+ sleep 1
+done
diff --git a/stream/reflect/transcode-south-flash.sh b/stream/reflect/transcode-south-flash.sh
new file mode 100755
index 0000000..6bf2cb8
--- /dev/null
+++ b/stream/reflect/transcode-south-flash.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+while :; do
+sudo cvlc -vv --sout-http-mark-start 22000 --sout-http-mark-end 24999 --network-caching 5000 --sout-x264-preset fast --sout-transcode-threads 10 --sout-x264-tune film --no-sout-x264-interlaced --sout-x264-lookahead 50 --sout-x264-vbv-maxrate 800 --sout-x264-vbv-bufsize 800 --sout-x264-keyint 50 -v http://stream.tg13.gathering.org:3016 vlc://quit \
+--sout '#transcode{height=480,fps=25,vcodec=h264,vb=800,acodec=aac,ab=128}:std{access=http{mime=video/x-flv},dst=[::]:5016/stream.flv}'
+ sleep 1
+done
diff --git a/stream/reflect/usage.txt b/stream/reflect/usage.txt
new file mode 100644
index 0000000..8b90bee
--- /dev/null
+++ b/stream/reflect/usage.txt
@@ -0,0 +1,3 @@
+event-sd - ./reflect-event-sd.sh
+event - ./reflect-event-lol.sh
+event-flash - ./transcode-event-flash.sh
diff --git a/stream/transcode/count.sh b/stream/transcode/count.sh
new file mode 100755
index 0000000..22f6aa1
--- /dev/null
+++ b/stream/transcode/count.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+while :; do
+ date=$(date +"%Y-%m-%d-%H:%M:%S")
+ ( lsof -n | grep vlc ; ssh root@gaffeltruck.tg12.gathering.org 'lsof -n | grep vlc' ) > /var/log/stream-count/$date
+ for PORT in 3013 5013 3014 5014 3015; do
+ for PROTO in IPv4 IPv6; do
+ # 176.110.x.x / 2a01:798:76a:125:: -> TG12
+ # 176.31.230.19 / 2001:41d0:2:f700::2 -> OVH box
+ cat /var/log/stream-count/$date | grep EST | egrep $PROTO | egrep "(176\.31\.230\.19|2001:41d0:2:f700::.*):$PORT->" | cut -d'>' -f2 | sed 's/:[0-9]\+ (ESTABLISHED)//' | sort -u | grep -vEc 'fisk' | while read foo; do echo "$date $PORT $PROTO foreign $foo"; done | tee -a count_datacube.log
+ cat /var/log/stream-count/$date | grep EST | egrep $PROTO | egrep "(176\.110\..*|2a01:798:76a:125::.*):$PORT->" | cut -d'>' -f2 | sed 's/:[0-9]\+ (ESTABLISHED)//' | sort -u | grep -vEc -e "\[2a01:798:76a:|176\.110\." | while read foo; do echo "$date $PORT $PROTO external $foo"; done | tee -a count_datacube.log
+ cat /var/log/stream-count/$date | grep EST | egrep $PROTO | egrep "(176\.110\..*|2a01:798:76a:125::.*):$PORT->" | cut -d'>' -f2 | sed 's/:[0-9]\+ (ESTABLISHED)//' | sort -u | grep -Ec -e "\[2a01:798:76a:|176\.110\." | while read foo; do echo "$date $PORT $PROTO internal $foo"; done | tee -a count_datacube.log
+ done
+ done
+ sleep 60
+done;
+
diff --git a/stream/transcode/flash.sh b/stream/transcode/flash.sh
new file mode 100755
index 0000000..3c42a8c
--- /dev/null
+++ b/stream/transcode/flash.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+# udp://@:5013
+while :; do
+vlc --intf dummy -vvv http://vivace.tg12.gathering.org:5013/stream.flv vlc://quit --network-caching 2000 --sout-mux-caching 3000 --sout "#std{access=http{mime=video/x-flv},dst=:5013/stream.flv}"
+ sleep 1
+done
diff --git a/stream/transcode/flashtest.sh b/stream/transcode/flashtest.sh
new file mode 100755
index 0000000..83ea48d
--- /dev/null
+++ b/stream/transcode/flashtest.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+while :; do
+ vlc --intf dummy -vvv http://stream.tg12.gathering.org:3013 vlc://quit --udp-caching 1000 --sout-x264-tune film --sout-x264-keyint 25 --sout-x264-preset veryfast --sout "#transcode{width=980,height=550,vcodec=h264,vb=1000,acodec=aac,ab=128}:std{access=http{mime=video/x-flv},dst=:5013/stream.flv}"
+ sleep 1
+done
diff --git a/stream/transcode/ios-sd.sh b/stream/transcode/ios-sd.sh
new file mode 100755
index 0000000..28a907a
--- /dev/null
+++ b/stream/transcode/ios-sd.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+while :; do
+vlc -I dummy --live-caching 0 http://vivace.tg12.gathering.org:5013/stream.flv --sout-x264-profile baseline --sout-x264-preset veryfast --sout-x264-aud --sout-x264-keyint 30 --sout-x264-ref 1 vlc://quit --sout='#std{access=livehttp{seglen=10,delsegs=true,numsegs=5,index=/srv/stream.tg12.gathering.org/ios/sd.m3u8,index-url=http://stream.tg12.gathering.org/ios/sd-########.ts},mux=ts{use-key-frames},dst=/srv/stream.tg12.gathering.org/ios/sd-########.ts}'
+ sleep 2
+done
+
+# --sout-x264-level 30
diff --git a/stream/transcode/ios-south.sh b/stream/transcode/ios-south.sh
new file mode 100755
index 0000000..ac06968
--- /dev/null
+++ b/stream/transcode/ios-south.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+while :; do
+vlc -I dummy --live-caching 0 udp://@:5114 vlc://quit --sout='#std{access=livehttp{seglen=10,delsegs=true,numsegs=5,index=/srv/stream.tg12.gathering.org/ios/south.m3u8,index-url=http://stream.tg12.gathering.org/ios/south-########.ts},mux=ts{use-key-frames},dst=/srv/stream.tg12.gathering.org/ios/south-########.ts}'
+ sleep 2
+done
+
+# --sout-x264-level 30
diff --git a/stream/vlc-patches/listen_all.git.patch b/stream/vlc-patches/listen_all.git.patch
new file mode 100644
index 0000000..41e1c87
--- /dev/null
+++ b/stream/vlc-patches/listen_all.git.patch
@@ -0,0 +1,28 @@
+diff --git a/src/network/io.c b/src/network/io.c
+index 7cc9764..08a0b56 100644
+--- a/src/network/io.c
++++ b/src/network/io.c
+@@ -87,14 +87,15 @@ int net_Socket (vlc_object_t *p_this, int family, int socktype,
+
+ setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &(int){ 1 }, sizeof (int));
+
+-#ifdef IPV6_V6ONLY
+- /*
+- * Accepts only IPv6 connections on IPv6 sockets.
+- * If possible, we should open two sockets, but it is not always possible.
+- */
+- if (family == AF_INET6)
+- setsockopt (fd, IPPROTO_IPV6, IPV6_V6ONLY, &(int){ 1 }, sizeof (int));
+-#endif
++ // sesse fix monday night
++// #ifdef IPV6_V6ONLY
++// /*
++// * Accepts only IPv6 connections on IPv6 sockets.
++// * If possible, we should open two sockets, but it is not always possible.
++// */
++// if (family == AF_INET6)
++// setsockopt (fd, IPPROTO_IPV6, IPV6_V6ONLY, &(int){ 1 }, sizeof (int));
++// #endif
+
+ #if defined (WIN32)
+ # ifndef IPV6_PROTECTION_LEVEL
diff --git a/stream/vlc-patches/vlc-git-sesse.patch b/stream/vlc-patches/vlc-git-sesse.patch
new file mode 100644
index 0000000..a38b378
--- /dev/null
+++ b/stream/vlc-patches/vlc-git-sesse.patch
@@ -0,0 +1,131 @@
+diff --git a/modules/access_output/http.c b/modules/access_output/http.c
+index 61095f5..18ffc9a 100644
+--- a/modules/access_output/http.c
++++ b/modules/access_output/http.c
+@@ -72,9 +72,17 @@ vlc_module_begin ()
+ PASS_TEXT, PASS_LONGTEXT, true )
+ add_string( SOUT_CFG_PREFIX "mime", "",
+ MIME_TEXT, MIME_LONGTEXT, true )
++ add_integer( SOUT_CFG_PREFIX "mark-start", "",
++ "lol", "Fancy option", -1 )
++ add_integer( SOUT_CFG_PREFIX "mark-end", "",
++ "rotfl", "Should maybe also be set", -1 )
+ set_callbacks( Open, Close )
+ vlc_module_end ()
+
++// globals
++extern vlc_mutex_t mark_lock;
++extern int *mark_used;
++extern int mark_start, mark_end;
+
+ /*****************************************************************************
+ * Exported prototypes
+@@ -178,6 +186,21 @@ static int Open( vlc_object_t *p_this )
+ return VLC_EGENERIC;
+ }
+
++ fprintf(stderr, "tjobing\n");
++ if (mark_used == NULL) {
++ mark_start = var_InheritInteger( p_access, SOUT_CFG_PREFIX "mark-start");
++ mark_end = var_InheritInteger( p_access, SOUT_CFG_PREFIX "mark-end");
++ fprintf(stderr, "jabla: %d -> %d\n", mark_start, mark_end);
++
++ if (mark_start >= 0 && mark_end > mark_start) {
++ vlc_mutex_init(&mark_lock);
++ mark_used = (int *)malloc((mark_end - mark_start) * sizeof(int));
++ for (int i = 0; i < mark_end - mark_start; ++i) {
++ mark_used[i] = 0;
++ }
++ }
++ }
++
+ psz_user = var_GetNonEmptyString( p_access, SOUT_CFG_PREFIX "user" );
+ psz_pwd = var_GetNonEmptyString( p_access, SOUT_CFG_PREFIX "pwd" );
+ if( p_access->psz_access && !strcmp( p_access->psz_access, "mmsh" ) )
+diff --git a/src/libvlccore.sym b/src/libvlccore.sym
+index 25d83c5..335edda 100644
+--- a/src/libvlccore.sym
++++ b/src/libvlccore.sym
+@@ -631,3 +631,7 @@ xml_ReaderDelete
+ xml_ReaderReset
+ vlc_keycode2str
+ vlc_str2keycode
++mark_end
++mark_lock
++mark_start
++mark_used
+diff --git a/src/network/httpd.c b/src/network/httpd.c
+index f76c47c..d7897bb 100644
+--- a/src/network/httpd.c
++++ b/src/network/httpd.c
+@@ -67,6 +67,50 @@
+
+ static void httpd_ClientClean( httpd_client_t *cl );
+
++VLC_API vlc_mutex_t mark_lock;
++VLC_API int *mark_used = NULL;
++VLC_API int mark_start = -1;
++VLC_API int mark_end = -1;
++
++void mark_socket(int fd)
++{
++ vlc_mutex_lock(&mark_lock);
++ int best_mark = mark_start;
++ int best_mark_val = mark_used[0];
++
++ for (int i = 1; i < mark_end - mark_start; ++i) {
++ if (mark_used[i] < best_mark_val) {
++ best_mark = mark_start + i;
++ best_mark_val = mark_used[i];
++ }
++ }
++ fprintf( stderr, "PICKED MARK %d WITH OLD USAGE %d\n", best_mark, best_mark_val);
++ if (setsockopt (fd, SOL_SOCKET, SO_MARK, &best_mark, sizeof(best_mark)) == -1) {
++ perror("setsockopt(SO_MARK)");
++ } else {
++ ++mark_used[best_mark - mark_start];
++ }
++ vlc_mutex_unlock(&mark_lock);
++}
++
++void unmark_socket(int fd)
++{
++ int mark;
++ socklen_t mark_len = sizeof(mark);
++ if (getsockopt (fd, SOL_SOCKET, SO_MARK, &mark, &mark_len) == -1) {
++ perror("getsockopt(SO_MARK)");
++ return;
++ }
++ if (mark < mark_start || mark >= mark_end) {
++ fprintf("UNKNOWN MARK %d\n", mark);
++ }
++
++ vlc_mutex_lock(&mark_lock);
++ --mark_used[mark - mark_start];
++ fprintf(stderr, "UNMARKED MARK %d WITH NEW USAGE %d\n", mark, mark_used[mark - mark_start]);
++ vlc_mutex_unlock(&mark_lock);
++}
++
+ /* each host run in his own thread */
+ struct httpd_host_t
+ {
+@@ -1295,6 +1339,7 @@ static void httpd_ClientClean( httpd_client_t *cl )
+ {
+ if( cl->p_tls != NULL )
+ vlc_tls_SessionDelete( cl->p_tls );
++ unmark_socket( cl->fd );
+ net_Close( cl->fd );
+ cl->fd = -1;
+ }
+@@ -2309,6 +2354,11 @@ static void* httpd_HostThread( void *data )
+ setsockopt (fd, SOL_SOCKET, SO_REUSEADDR,
+ &(int){ 1 }, sizeof(int));
+
++ // find a free mark
++ if (mark_used != NULL) {
++ mark_socket(fd);
++ }
++
+ vlc_tls_t *p_tls;
+
+ if( host->p_tls != NULL )
diff --git a/stream/vlc-patches/vlc-mark.patch b/stream/vlc-patches/vlc-mark.patch
new file mode 100644
index 0000000..877b78c
--- /dev/null
+++ b/stream/vlc-patches/vlc-mark.patch
@@ -0,0 +1,136 @@
+diff -ur vlc-2.0.5/modules/access_output/http.c vlc-2.0.5.patchde/modules/access_output/http.c
+--- vlc-2.0.5/modules/access_output/http.c 2011-12-22 11:38:28.000000000 +0100
++++ vlc-2.0.5.patchde/modules/access_output/http.c 2013-02-07 01:23:10.966721881 +0100
+@@ -89,9 +89,17 @@
+ add_bool( SOUT_CFG_PREFIX "bonjour", false,
+ BONJOUR_TEXT, BONJOUR_LONGTEXT, true);
+ #endif
++ add_integer( SOUT_CFG_PREFIX "mark-start", "",
++ "lol", "Fancy option", -1 )
++ add_integer( SOUT_CFG_PREFIX "mark-end", "",
++ "rotfl", "Should maybe also be set", -1 )
+ set_callbacks( Open, Close )
+ vlc_module_end ()
+
++// globals
++extern vlc_mutex_t mark_lock;
++extern int *mark_used;
++extern int mark_start, mark_end;
+
+ /*****************************************************************************
+ * Exported prototypes
+@@ -199,6 +207,21 @@
+ return VLC_EGENERIC;
+ }
+
++ fprintf(stderr, "tjobing\n");
++ if (mark_used == NULL) {
++ mark_start = var_InheritInteger( p_access, SOUT_CFG_PREFIX "mark-start");
++ mark_end = var_InheritInteger( p_access, SOUT_CFG_PREFIX "mark-end");
++ fprintf(stderr, "jabla: %d -> %d\n", mark_start, mark_end);
++
++ if (mark_start >= 0 && mark_end > mark_start) {
++ vlc_mutex_init(&mark_lock);
++ mark_used = (int *)malloc((mark_end - mark_start) * sizeof(int));
++ for (int i = 0; i < mark_end - mark_start; ++i) {
++ mark_used[i] = 0;
++ }
++ }
++ }
++
+ psz_user = var_GetNonEmptyString( p_access, SOUT_CFG_PREFIX "user" );
+ psz_pwd = var_GetNonEmptyString( p_access, SOUT_CFG_PREFIX "pwd" );
+ if( p_access->psz_access && !strcmp( p_access->psz_access, "mmsh" ) )
+diff -ur vlc-2.0.5/src/libvlccore.sym vlc-2.0.5.patchde/src/libvlccore.sym
+--- vlc-2.0.5/src/libvlccore.sym 2012-05-15 14:41:19.000000000 +0200
++++ vlc-2.0.5.patchde/src/libvlccore.sym 2013-02-07 01:16:16.917330547 +0100
+@@ -673,3 +673,7 @@
+ xml_ReaderReset
+ vlc_keycode2str
+ vlc_str2keycode
++mark_end
++mark_lock
++mark_start
++mark_used
+diff -ur vlc-2.0.5/src/network/httpd.c vlc-2.0.5.patchde/src/network/httpd.c
+--- vlc-2.0.5/src/network/httpd.c 2012-09-04 00:14:53.000000000 +0200
++++ vlc-2.0.5.patchde/src/network/httpd.c 2013-02-07 01:35:50.777081814 +0100
+@@ -69,6 +69,50 @@
+
+ static void httpd_ClientClean( httpd_client_t *cl );
+
++VLC_API vlc_mutex_t mark_lock;
++VLC_API int *mark_used = NULL;
++VLC_API int mark_start = -1;
++VLC_API int mark_end = -1;
++
++void mark_socket(int fd)
++{
++ vlc_mutex_lock(&mark_lock);
++ int best_mark = mark_start;
++ int best_mark_val = mark_used[0];
++
++ for (int i = 1; i < mark_end - mark_start; ++i) {
++ if (mark_used[i] < best_mark_val) {
++ best_mark = mark_start + i;
++ best_mark_val = mark_used[i];
++ }
++ }
++ fprintf( stderr, "PICKED MARK %d WITH OLD USAGE %d\n", best_mark, best_mark_val);
++ if (setsockopt (fd, SOL_SOCKET, SO_MARK, &best_mark, sizeof(best_mark)) == -1) {
++ perror("setsockopt(SO_MARK)");
++ } else {
++ ++mark_used[best_mark - mark_start];
++ }
++ vlc_mutex_unlock(&mark_lock);
++}
++
++void unmark_socket(int fd)
++{
++ int mark;
++ socklen_t mark_len = sizeof(mark);
++ if (getsockopt (fd, SOL_SOCKET, SO_MARK, &mark, &mark_len) == -1) {
++ perror("getsockopt(SO_MARK)");
++ return;
++ }
++ if (mark < mark_start || mark >= mark_end) {
++ fprintf("UNKNOWN MARK %d\n", mark);
++ }
++
++ vlc_mutex_lock(&mark_lock);
++ --mark_used[mark - mark_start];
++ fprintf(stderr, "UNMARKED MARK %d WITH NEW USAGE %d\n", mark, mark_used[mark - mark_start]);
++ vlc_mutex_unlock(&mark_lock);
++}
++
+ /* each host run in his own thread */
+ struct httpd_host_t
+ {
+@@ -1412,6 +1456,7 @@
+ {
+ if( cl->p_tls != NULL )
+ vlc_tls_ServerSessionDelete( cl->p_tls );
++ unmark_socket( cl->fd );
+ net_Close( cl->fd );
+ cl->fd = -1;
+ }
+@@ -2461,6 +2506,11 @@
+ setsockopt (fd, SOL_SOCKET, SO_REUSEADDR,
+ &(int){ 1 }, sizeof(int));
+
++ // find a free mark
++ if (mark_used != NULL) {
++ mark_socket(fd);
++ }
++
+ vlc_tls_t *p_tls;
+
+ if( host->p_tls != NULL )
+@@ -2471,6 +2521,7 @@
+ case -1:
+ msg_Err( host, "Rejecting TLS connection" );
+ /* p_tls is destroyed implicitly */
++ unmark_socket( fd );
+ net_Close( fd );
+ fd = -1;
+ p_tls = NULL;
diff --git a/switches.txt b/switches.txt
new file mode 100644
index 0000000..efd8454
--- /dev/null
+++ b/switches.txt
@@ -0,0 +1,128 @@
+151.216.1.0 26 e1-3 x.x.x.x
+151.216.1.64 26 e1-4 x.x.x.x
+151.216.1.128 26 e3-3 x.x.x.x
+151.216.1.192 26 e3-4 x.x.x.x
+151.216.2.0 26 e5-3 x.x.x.x
+151.216.2.64 26 e5-4 x.x.x.x
+151.216.2.128 26 e7-3 x.x.x.x
+151.216.2.192 26 e7-4 x.x.x.x
+151.216.3.0 26 e9-3 x.x.x.x
+151.216.3.64 26 e9-4 x.x.x.x
+151.216.3.128 26 e11-1 x.x.x.x
+151.216.3.192 26 e11-2 x.x.x.x
+151.216.4.0 26 e11-3 x.x.x.x
+151.216.4.64 26 e11-4 x.x.x.x
+151.216.4.128 26 e13-1 x.x.x.x
+151.216.4.192 26 e13-2 x.x.x.x
+151.216.5.0 26 e13-3 x.x.x.x
+151.216.5.64 26 e13-4 x.x.x.x
+151.216.5.128 26 e15-1 x.x.x.x
+151.216.5.192 26 e15-2 x.x.x.x
+151.216.6.0 26 e15-3 x.x.x.x
+151.216.6.64 26 e15-4 x.x.x.x
+151.216.6.128 26 e17-1 x.x.x.x
+151.216.6.192 26 e17-2 x.x.x.x
+151.216.7.0 26 e17-3 x.x.x.x
+151.216.7.64 26 e17-4 x.x.x.x
+151.216.7.128 26 e19-1 x.x.x.x
+151.216.7.192 26 e19-2 x.x.x.x
+151.216.8.0 26 e19-3 x.x.x.x
+151.216.8.64 26 e19-4 x.x.x.x
+151.216.8.128 26 e21-1 x.x.x.x
+151.216.8.192 26 e21-2 x.x.x.x
+151.216.9.0 26 e21-3 x.x.x.x
+151.216.9.64 26 e21-4 x.x.x.x
+151.216.9.128 26 e23-1 x.x.x.x
+151.216.9.192 26 e23-2 x.x.x.x
+151.216.10.0 26 e23-3 x.x.x.x
+151.216.10.64 26 e23-4 x.x.x.x
+151.216.10.128 26 e25-1 x.x.x.x
+151.216.10.192 26 e25-2 x.x.x.x
+151.216.11.0 26 e25-3 x.x.x.x
+151.216.11.64 26 e25-4 x.x.x.x
+151.216.11.128 26 e27-1 x.x.x.x
+151.216.11.192 26 e27-2 x.x.x.x
+151.216.12.0 26 e29-1 x.x.x.x
+151.216.12.64 26 e29-2 x.x.x.x
+151.216.12.128 26 e31-1 x.x.x.x
+151.216.12.192 26 e31-2 x.x.x.x
+151.216.13.0 26 e33-1 x.x.x.x
+151.216.13.64 26 e33-2 x.x.x.x
+151.216.13.128 26 e35-1 x.x.x.x
+151.216.13.192 26 e35-2 x.x.x.x
+151.216.14.0 26 e37-1 x.x.x.x
+151.216.14.64 26 e37-2 x.x.x.x
+151.216.14.128 26 e39-1 x.x.x.x
+151.216.14.192 26 e39-2 x.x.x.x
+151.216.15.0 26 e41-1 x.x.x.x
+151.216.15.64 26 e41-2 x.x.x.x
+151.216.15.128 26 e43-1 x.x.x.x
+151.216.15.192 26 e43-2 x.x.x.x
+151.216.16.0 26 e43-3 x.x.x.x
+151.216.16.64 26 e43-4 x.x.x.x
+151.216.16.128 26 e45-1 x.x.x.x
+151.216.16.192 26 e45-2 x.x.x.x
+151.216.17.0 26 e45-3 x.x.x.x
+151.216.17.64 26 e45-4 x.x.x.x
+151.216.17.128 26 e47-1 x.x.x.x
+151.216.17.192 26 e47-2 x.x.x.x
+151.216.18.0 26 e47-3 x.x.x.x
+151.216.18.64 26 e47-4 x.x.x.x
+151.216.18.128 26 e49-1 x.x.x.x
+151.216.18.192 26 e49-2 x.x.x.x
+151.216.19.0 26 e49-3 x.x.x.x
+151.216.19.64 26 e49-4 x.x.x.x
+151.216.19.128 26 e51-1 x.x.x.x
+151.216.19.192 26 e51-2 x.x.x.x
+151.216.20.0 26 e51-3 x.x.x.x
+151.216.20.64 26 e51-4 x.x.x.x
+151.216.20.128 26 e53-1 x.x.x.x
+151.216.20.192 26 e53-2 x.x.x.x
+151.216.21.0 26 e53-3 x.x.x.x
+151.216.21.64 26 e53-4 x.x.x.x
+151.216.21.128 26 e55-1 x.x.x.x
+151.216.21.192 26 e55-2 x.x.x.x
+151.216.22.0 26 e55-3 x.x.x.x
+151.216.22.64 26 e55-4 x.x.x.x
+151.216.22.128 26 e57-1 x.x.x.x
+151.216.22.192 26 e57-2 x.x.x.x
+151.216.23.0 26 e57-3 x.x.x.x
+151.216.23.64 26 e57-4 x.x.x.x
+151.216.23.128 26 e59-1 x.x.x.x
+151.216.23.192 26 e59-2 x.x.x.x
+151.216.24.0 26 e59-3 x.x.x.x
+151.216.24.64 26 e59-4 x.x.x.x
+151.216.24.128 26 e61-1 x.x.x.x
+151.216.24.192 26 e61-2 x.x.x.x
+151.216.25.0 26 e61-3 x.x.x.x
+151.216.25.64 26 e61-4 x.x.x.x
+151.216.25.128 26 e63-1 x.x.x.x
+151.216.25.192 26 e63-2 x.x.x.x
+151.216.26.0 26 e63-3 x.x.x.x
+151.216.26.64 26 e63-4 x.x.x.x
+151.216.26.128 26 e65-1 x.x.x.x
+151.216.26.192 26 e65-2 x.x.x.x
+151.216.27.0 26 e65-3 x.x.x.x
+151.216.27.64 26 e65-4 x.x.x.x
+151.216.27.128 26 e67-1 x.x.x.x
+151.216.27.192 26 e67-2 x.x.x.x
+151.216.28.0 26 e67-3 x.x.x.x
+151.216.28.64 26 e67-4 x.x.x.x
+151.216.28.128 26 e69-1 x.x.x.x
+151.216.28.192 26 e69-2 x.x.x.x
+151.216.29.0 26 e69-3 x.x.x.x
+151.216.29.64 26 e69-4 x.x.x.x
+151.216.29.128 26 e71-1 x.x.x.x
+151.216.29.192 26 e71-2 x.x.x.x
+151.216.30.0 26 e71-3 x.x.x.x
+151.216.30.64 26 e71-4 x.x.x.x
+151.216.30.128 26 e73-1 x.x.x.x
+151.216.30.192 26 e73-2 x.x.x.x
+151.216.31.0 26 e73-3 x.x.x.x
+151.216.31.64 26 e73-4 x.x.x.x
+151.216.31.128 26 e75-1 x.x.x.x
+151.216.31.192 26 e75-2 x.x.x.x
+151.216.32.0 26 e75-3 x.x.x.x
+151.216.32.64 26 e75-4 x.x.x.x
+151.216.32.128 26 e77-1 x.x.x.x
+151.216.32.192 26 e77-2 x.x.x.x
diff --git a/switches.txt.crew b/switches.txt.crew
new file mode 100644
index 0000000..c31afeb
--- /dev/null
+++ b/switches.txt.crew
@@ -0,0 +1,6 @@
+151.216.46.0 25 crew1 x.x.x.x
+151.216.46.128 25 crew2 x.x.x.x
+151.216.47.0 25 crew3 x.x.x.x
+151.216.47.128 25 crew4 x.x.x.x
+151.216.48.0 25 crew5 x.x.x.x
+151.216.48.128 25 crew6 x.x.x.x
diff --git a/tools/README b/tools/README
new file mode 100644
index 0000000..2276ebb
--- /dev/null
+++ b/tools/README
@@ -0,0 +1,139 @@
+Outline:
+------------------------------------------------------------------
+
+ 1 Install OS on three boxes
+ 2 Bootstrap:
+ * Install tgmanage on one, the bootstrap (tools, include, netlist.txt)
+ * Install dependencies on bootstrap
+ * Push SSH key key to the other boxes (init-sshkeys.sh)
+ * Update configuration
+ * Update netlist.txt
+ * Bootstrap the primary and secondary (make-base-requires.sh)
+ 3 Create new networks/scopes/zones Update during the party using
+ update-baseservice.sh from bootstrap
+ 4 Apply changes usling tools/apply-baseupdate.sh (reloads bind, restarts dhcpd)
+ 5 Changes to generated scopes, pools, zones are done on the primary, in the files
+ 6 If tools need patching, patch on boot and push with update-tools.sh
+ 7 Before wednesday evening, the infra.tgXX.gathering.org zone should be updated!
+ * Only use make-base-requires.sh during bootstrap !!!!!!! :P
+
+Detailed instructions and description:
+==================================================================
+
+1: Install Debian
+------------------------------------------------------------------
+
+The following three hosts/servers are normally used:
+ * A 'bootstrap' box. This server will be used to configure
+ the first TG-servers, and may end up hosting the switch-config and NMS.
+ * The server to use as Primary DNS and DHCP server
+ * The server to use as Secondary DNS and SMTP.
+Add the three hosts to /etc/hosts, DNS is not available yet...
+
+2: Perform bootstrapping.
+------------------------------------------------------------------
+
+Start by placing the 'tgmanage' directory as '/root/tgmanage' on the bootstrap
+box. Change into the 'tgmanage' directory. Next, run
+'tools/install-dependencies.sh boot'
+
+
+Edit 'include/config.local.pm' and update for this year's TG. Use
+'tools/create-shellconf.pl' to extract configuration from the perl module to
+create/update the 'include/tgmanage.cfg.sh' configuration script.
+
+
+The tools make extensive use of key-based SSH logins, to make this work
+seamlessly, run 'tools/init-sshkeys.sh' to create an RSA priv/pub keypair, and
+push the pubkey to the Primary and Secondary boxes.
+
+
+The Network-list is _not_ automagically updated. A copy of last year's
+netlist.txt should be included in the goodiebag. With that as a base, update
+for this year's address plan. Remember that client nets in the hall are
+supposed to be pulled from switches.txt ...
+The rest of the information needed should be pulled from techwiki.g.o The
+format of the file is: one net per line, lines starting with # are skipped,
+format of each net-line is:
+176.110.124.0 24 noc
+# <network adress> <prefixlen> <network-name>
+
+
+Run 'tools/make-base-requires.sh'. This script will log in on the Primary and
+Secondary boxes, install dependencies and the BIND/DHCP packages, create all
+needed directories, create the initial configuration files.
+
+A short listing of the tasks of scripts called by make-base-requires:
+tools/install-dependencies.sh Installs needed base software to boot, primary and secondary
+tools/make-named.pl Basic BIND setup (creates named.conf et.al)
+tools/make-first-zones.pl Creates static zone-files (tgname, infra, ipv6zone)
+tools/make-reverse4-files.pl Creates reverse-zones for IPv4
+tools/make-dhcpd.pl Sets up the base setup for DHCP
+NOTE: these scripts are run by tools/make-base-requires.sh, you should not need to
+run these individually
+
+3++: Update during the party using update-baseservice.sh from bootstrap
+------------------------------------------------------------------
+
+After 'tools/make-base-requires.sh' has been run, further updating should be
+managed by the following three files:
+tools/update-baseservice.sh Used to add/update bind and DHCP configuration
+tools/apply-baseupdate.sh Used to reload bind and restart DHCP
+tools/update-tools.sh Used to push changes to the tgmanage toolchain
+
+This means, after the base setup is completed, updating and managing the
+configuration is done by updating netlist.txt and running tools/update-baseservice.sh
+from the bootstrap box, or from the NMS box if the toolchain gets moved there during
+the party.
+
+To create a new DHCP scope, add DNS forward and reverse zone for a new network:
+
+ * Add the network to netlist.txt
+ * Run tools/update-baseservice.sh to generate new .conf and .zone files
+ * Run tools/apply-baseupdate.sh to load new configuration
+
+To do changes to DHCP config after the scope .conf file has been created
+(read: later in the party), log in to the primary/dhcp server, and make
+the changes in the appropriate .conf file ..
+
+To do DNS changes to the main DNS zone or the infra-zone, make the changes
+in the appropriate zone file on the primary DNS server.
+
+To add DNS records to any other DNS zone (forward or reverse), you have
+to use 'nsupdate'. To simplify the process, use tools/generate-dnsrr.pl
+Usage on this tool is documented in the "header" of the script...
+
+
+The update prosess is handled by a bunch of "sub-tools", these should typically
+not need to be run individually:
+tools/make-bind-include.pl Run via update-baseservice, adds new net's to DNS include
+tools/make-dhcpd-include.pl Run via update-baseservice, adds new net's to DHCP include
+tools/make-missing-conf.pl Run via update-baseservice, adds missing net-conf to BIND/DHCP
+
+
+7: Generation of linknet dns content
+------------------------------------------------------------------
+
+Format for linknet.txt is documented in make-linknet-hosts.pl
+
+Generate IPv4 infra hostnames and IP address assignments
+by using tools/generate-dnsrr.pl
+
+> cat linknet.txt | tools/make-linknet-hosts.pl | tools/generate-dnsrr.pl --domain infra.tgXX.gathering.org
+Output from this shuld go in infra.tgXX.gathering.org.zone on primary
+
+> cat linknet.txt | tools/make-linknet-hosts.pl | tools/generate-dnsrr.pl --domain infra.tgXX.gathering.org -ns -rev
+Output from this should go as input to nsupdate, see doc in generate-dnsrr.pl
+
+
+Other stuff....
+------------------------------------------------------------------
+Files that are not used? Need to revisit these files...
+
+>tools/make-switch-placements.pl
+
+Updates positions for switches in NMS map (png)
+
+> tools/make-switches.pl
+> tools/fetch-portlist.sh
+
diff --git a/tools/TODO b/tools/TODO
new file mode 100644
index 0000000..70898a3
--- /dev/null
+++ b/tools/TODO
@@ -0,0 +1,26 @@
+make-first-zones.pl does not add AAAA records for NS'es (pri/sec)
+None of the tools add IPv4 reverse for pri/sec
+nsupdate log for adding reverse after building base-requires:
+
+ nsupdate -k Kdhcp_updater.+157+57267.key
+ server 176.110.126.2
+ prereq nxdomain 2.126.110.176.in-addr.arpa.
+ update add 2.126.110.176.in-addr.arpa. 3600 in ptr abscess.tg12.gathering.org.
+ send
+ prereq nxdomain 2.125.110.176.in-addr.arpa.
+ update add 2.125.110.176.in-addr.arpa. 3600 in ptr acetat.tg12.gathering.org.
+ send
+ prereq nxdomain 3.125.110.176.in-addr.arpa.
+ update add 3.125.110.176.in-addr.arpa. 3600 in ptr abc.tg12.gathering.org.
+ send
+
+Another handy dump, not a TODO-item, just a reminder:
+
+ prereq nxdomain 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.5.2.1.0.a.6.7.0.8.9.7.0.1.0.a.2.ip6.arpa.
+ update add 3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.5.2.1.0.a.6.7.0.8.9.7.0.1.0.a.2.ip6.arpa. 3600 IN PTR abc.tg12.gathering.org.
+ send
+
+
+Uhm, our $dhcp_server1 = "176.110.126.2"; <- wtf?
+
+Opps, forgot to asdd CiscoWLC magic to make-dhcpd.pl includes...
diff --git a/tools/apply-baseupdate.sh b/tools/apply-baseupdate.sh
new file mode 100755
index 0000000..055320c
--- /dev/null
+++ b/tools/apply-baseupdate.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+set -e
+
+source include/tgmanage.cfg.sh
+if [ -z ${PRIMARY} ]
+then
+ echo "Not configured!";
+ exit 1;
+fi;
+
+ssh -l root ${PRIMARY} "/etc/init.d/isc-dhcp-server restart"
+ssh -l root ${PRIMARY} "/usr/sbin/rndc reload"
+ssh -l root ${SECONDARY} "/usr/sbin/rndc reload"
diff --git a/tools/create-shellconf.pl b/tools/create-shellconf.pl
new file mode 100755
index 0000000..8e2582d
--- /dev/null
+++ b/tools/create-shellconf.pl
@@ -0,0 +1,51 @@
+#!/usr/bin/perl -I /root/tgmanage
+use strict;
+
+BEGIN {
+ require "include/config.pm";
+ eval {
+ require "include/config.local.pm";
+ };
+}
+
+my $bind_base = "/etc/bind/";
+my $dhcpd_base = "/etc/dhcp/";
+
+my $shellconf_file = "include/tgmanage.cfg.sh";
+
+my $tgname = $nms::config::tgname;
+
+my $pri_a = $nms::config::pri_a;
+my $pri_ptr = $nms::config::pri_ptr;
+my $pri_v6 = $nms::config::pri_v6;
+
+my $sec_a = $nms::config::sec_a;
+my $sec_ptr = $nms::config::sec_ptr;
+my $sec_v6 = $nms::config::sec_v6;
+
+my $ddns_key = $nms::config::ddns_key;
+
+my $base_ipv4net = $nms::config::base_ipv4net;
+my $base_ipv4prefix = $nms::config::base_ipv4prefix;
+
+my $base_ipv6net = $nms::config::base_ipv6net;
+my $base_ipv6prefix = $nms::config::base_ipv6prefix;
+
+open CFG, ">" . $shellconf_file or die ($! . " " . $shellconf_file );
+
+print CFG "# This file is autogenerated by tools/create-shellconf.pl,\n";
+print CFG "# using data from nms::config.\n";
+print CFG "#\n";
+print CFG "# Do you need new common/configuration variables?\n";
+print CFG "# Add/update include/config.local.pm and tools/create-shellconf.pl\n\n";
+print CFG "PRIMARY=\"$pri_a.$tgname.gathering.org\"\n";
+print CFG "SECONDARY=\"$sec_a.$tgname.gathering.org\"\n";
+print CFG "TGNAME=\"$tgname\"\n\n";
+print CFG "PRI_PTR=\"$pri_ptr\"\n";
+print CFG "SEC_PTR=\"$sec_ptr\"\n\n";
+print CFG "DDNS_KEY=\"$ddns_key\"\n\n";
+print CFG "BASEV4=\"$base_ipv4net\"\n";
+print CFG "PREFIXV4=\"$base_ipv4prefix\"\n";
+print CFG "BASEV6=\"$base_ipv6net\"\n";
+print CFG "PREFIXV6=\"$base_ipv6prefix\"\n";
+close CFG;
diff --git a/tools/dhcp6-nets.pl b/tools/dhcp6-nets.pl
new file mode 100755
index 0000000..3866ac5
--- /dev/null
+++ b/tools/dhcp6-nets.pl
@@ -0,0 +1,12 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+
+while(<STDIN>){
+ my ($row, $v6) = split;
+ $v6 =~ s/::1/::/;
+
+ print "subnet6 $v6 {\n";
+ print "\toption domain-name \"$row.tg13.gathering.org\";\n";
+ print "}\n\n";
+}
diff --git a/tools/dlink-ng2dns.pl b/tools/dlink-ng2dns.pl
new file mode 100755
index 0000000..2b6f965
--- /dev/null
+++ b/tools/dlink-ng2dns.pl
@@ -0,0 +1,77 @@
+#!/usr/bin/perl
+use strict;
+
+BEGIN {
+ require "include/config.pm";
+ eval {
+ require "include/config.local.pm";
+ };
+}
+
+use Net::IP;
+use Getopt::Long;
+
+my ($delete);
+
+if (@ARGV > 0) {
+ GetOptions(
+ 'del|delete' => \$delete,
+ )
+}
+
+print "server $nms::config::pri_ptr\n";
+
+while (<STDIN>)
+{
+ my ( $sysname, $distro, $ponum, $cidr, $ipaddr, $gwaddr, $v6addr, @ports ) = split;
+
+
+ my $ip = new Net::IP($ipaddr);
+
+ my $v4gw = new Net::IP($gwaddr);
+
+ ( my $gw6 = $v6addr ) =~ s/\/.*//;
+ my $v6gw = new Net::IP($gw6);
+
+ my $fqdn = $sysname . "." . $nms::config::tgname . ".gathering.org.";
+ my $sw_fqdn = $sysname . "-sw." . $fqdn;
+ my $text_info = $distro . " - " . join(' + ', @ports) . ", po" . $ponum . ", gwaddr " . $gwaddr;
+
+ # A-record to the switch
+ print "prereq nxdomain " . $sw_fqdn . "\n" unless $delete;
+ print "update add " . $sw_fqdn . " \t 3600 IN A \t " . $ipaddr . "\n" unless $delete;
+ print "update delete " . $sw_fqdn . " \t IN A\n" if $delete;
+ print "send\n";
+
+ # PTR to the switch
+ print "prereq nxdomain " . $ip->reverse_ip() . "\n" unless $delete;
+ print "update add " . $ip->reverse_ip() . " \t 3600 IN PTR \t " . $sw_fqdn . "\n" unless $delete;
+ print "update delete " . $ip->reverse_ip() . " \t IN PTR\n" if $delete;
+ print "send\n";
+
+ # TXT-record with details
+ print "update delete " . $sw_fqdn . " IN TXT\n" unless $delete;
+ print "update add " . $sw_fqdn . " \t 3600 IN TXT \t \"" . $text_info . "\"\n" unless $delete;
+ print "update delete " . $sw_fqdn . " \t IN TXT\n" if $delete;
+ print "send\n";
+
+ # A and AAAA-record to the gateway/router
+ print "prereq nxrrset gw." . $fqdn . " IN A\n" unless $delete;
+ print "update add gw." . $fqdn . " \t 3600 IN A \t " . $gwaddr . "\n" unless $delete;
+ print "update delete gw." . $fqdn . " \t IN A\n" if $delete;
+ print "send\n";
+ print "prereq nxrrset gw." . $fqdn . " IN AAAA\n" unless $delete;
+ print "update add gw." . $fqdn . " \t 3600 IN AAAA \t " . $gw6 . "\n" unless $delete;
+ print "update delete gw." . $fqdn . " \t IN AAAA\n" if $delete;
+ print "send\n";
+
+ # PTR to the gateway/router
+ print "prereq nxdomain " . $v4gw->reverse_ip() . "\n" unless $delete;
+ print "update add " . $v4gw->reverse_ip() . " \t 3600 IN PTR \t gw." . $fqdn . "\n" unless $delete;
+ print "update delete " . $v4gw->reverse_ip() . " \t IN PTR\n" if $delete;
+ print "send\n";
+ print "prereq nxdomain " . $v6gw->reverse_ip() . "\n" unless $delete;
+ print "update add " . $v6gw->reverse_ip() . " \t 3600 IN PTR \t gw." . $fqdn . "\n" unless $delete;
+ print "update delete " . $v6gw->reverse_ip() . " \t IN PTR\n" if $delete;
+ print "send\n";
+}
diff --git a/tools/fetch-debinstall.sh b/tools/fetch-debinstall.sh
new file mode 100755
index 0000000..069e39a
--- /dev/null
+++ b/tools/fetch-debinstall.sh
@@ -0,0 +1,17 @@
+#!/bin/bash -xe
+INSTALLER_DEST=$1
+DEBINSTROOT=http://ftp.no.debian.org/debian/dists
+
+mkdir -p ${INSTALLER_DEST}/{squeeze,wheezy}/{amd64,i386}
+for DIST in squeeze wheezy
+do
+ for ARCH in i386 amd64;
+ do
+ for FILE in initrd.gz linux
+ do
+ wget ${DEBINSTROOT}/${DIST}/main/installer-${ARCH}/current/images/netboot/debian-installer/${ARCH}/${FILE} \
+ -O ${INSTALLER_DEST}/${DIST}/${ARCH}/${FILE}
+ done
+ done
+done
+
diff --git a/tools/fetch-portlist.sh b/tools/fetch-portlist.sh
new file mode 100755
index 0000000..94ca41c
--- /dev/null
+++ b/tools/fetch-portlist.sh
@@ -0,0 +1,42 @@
+print_range() {
+ FIRST=$1
+ LAST=$2
+ if [ "$1" = "$2" ]; then
+ echo $FIRST
+ else
+ echo $FIRST-$LAST
+ fi
+}
+
+walk_ports() {
+ IP=$1
+ COMMUNITY=$2
+
+ FIRST_PORT=
+ LAST_PORT=
+
+ for PORT in $( snmpwalk -Os -m IF-MIB -v 2c -c $COMMUNITY $IP ifDescr 2>/dev/null | grep -E 'GigE|Ethernet' | cut -d. -f2 | cut -d" " -f1 ); do
+ if ! snmpget -m IF-MIB -v 2c -c $COMMUNITY $IP ifHCInOctets.$PORT 2>/dev/null | grep -q 'No Such Instance'; then
+ if [ "$LAST_PORT" ] && [ `expr $LAST_PORT + 1` = $PORT ]; then
+ LAST_PORT=$PORT
+ else
+ if [ "$LAST_PORT" ]; then
+ print_range $FIRST_PORT $LAST_PORT
+ fi
+ FIRST_PORT=$PORT
+ LAST_PORT=$PORT
+ fi
+ fi
+ done
+
+ print_range $FIRST_PORT $LAST_PORT
+}
+
+COMMUNITY=$1
+IP=$2
+SYSNAME=$3
+PORTS=$( walk_ports $IP $COMMUNITY | tr "\n" "," | sed 's/,$//' )
+
+echo "insert into switchtypes values ('$SYSNAME','$PORTS',true);"
+echo "insert into switches values (default,'$IP','$SYSNAME','$SYSNAME',null,default, default, '1 minute', '$COMMUNITY');"
+
diff --git a/tools/generate-dnsrr.pl b/tools/generate-dnsrr.pl
new file mode 100755
index 0000000..789f268
--- /dev/null
+++ b/tools/generate-dnsrr.pl
@@ -0,0 +1,147 @@
+#!/usr/bin/perl -I /root/tgmanage
+#
+# USAGE:
+# Generate BIND Zone-file data based on the file hosts-to-add.txt
+# cat hosts-to-add.txt | tools/generate-dnsrr.pl
+#
+# Generate input data for nsupdate, to add FORWARD records based on hosts-to-add.txt
+# cat hosts-to-add.txt | tools/generate-dnsrr.pl --domain foo.tgXX.gathering.org -ns
+#
+# Generate input data for nsupdate, to add REVERSE records based on hosts-to-add.txt
+# cat hosts-to-add.txt | tools/generate-dnsrr.pl --domain foo.tgXX.gathering.org -ns -rev
+#
+# Generate input data for nsupdate, to DELETE forward records based on hosts-to-add.txt
+# cat hosts-to-DELETE.txt | tools/generate-dnsrr.pl --domain foo.tgXX.gathering.org -ns -del
+#
+# Generate input data for nsupdate, to DELETE reverse records based on hosts-to-add.txt
+# cat hosts-to-DELETE.txt | tools/generate-dnsrr.pl --domain foo.tgXX.gathering.org -ns -rev -del
+#
+# Command-syntax to send this to nsupdate, running it on the DNS server:
+# cat file.txt | tools/generate-dnsrr.pl --dom foo -ns | ssh $dnsserver "nsupdate -k /etc/bind/Kdhcp_updater.+157+XXXXX"
+#
+# Format of input:
+# hostname ipv4-adress ipv6-address
+# If any of ipv4-address or ipv6-address are NOT set for the host, specify "nope"
+# Lines starting with # will (should) be skipped (comments)
+#
+# Example:
+#
+# host1 192.168.0.1 2001:db8:f00::1
+# host2 nope 2001:db8:f00::2
+# host3 192.168.0.3 nope
+# # comment, to be ignored.
+# host4 192.168.0.4
+
+use strict;
+use warnings;
+use lib '..';
+BEGIN {
+ require "include/config.pm";
+ eval {
+ require "include/config.local.pm";
+ };
+}
+use Net::IP;
+use Getopt::Long;
+
+my ($delete, $auto, $nsupdate, $reverse, $domain);
+
+if (@ARGV > 0) {
+ GetOptions(
+ 'del|delete' => \$delete,
+ 'a|auto' => \$auto,
+ 'ns|nsupdate' => \$nsupdate,
+ 'r|reverse' => \$reverse,
+ 'domain=s' => \$domain
+ )
+}
+
+if ($nsupdate || $reverse){
+ unless (defined($domain)){
+ print "Missing domain.\n";
+ exit 1 unless defined($domain);
+ }
+}
+
+$domain = "." . $domain if defined($domain);
+
+print "server $nms::config::pri_ptr\n" if ($nsupdate || $reverse);
+
+while (<STDIN>) {
+ next if /^(#|\s+$)/; # skip if comment, or blank line
+
+ my ($hostname, $ipv4, $ipv6) = split;
+ $hostname = lc($hostname);
+
+ unless ($ipv6){
+ if ($auto){
+ # Get IPv6-address based on IPv4-address
+
+ my ($first, $second, $third, $fourth) = split('\.', $ipv4);
+ $ipv6 = $nms::config::base_ipv6net . $third . "::" . $fourth;
+ }
+ }
+
+ if ($reverse){
+ # print ptr
+ print_ptr($hostname, $ipv4, $ipv6);
+ } else {
+ # print forward
+ print_fwd($hostname, $ipv4, $ipv6);
+ }
+}
+
+sub print_ptr{
+ my ($hostname, $ipv4, $ipv6) = @_;
+
+ # IPv4
+ unless ( $ipv4 eq "nope" ) {
+ my $v4 = new Net::IP($ipv4);
+
+ print "prereq nxdomain " . $v4->reverse_ip() . "\n" unless $delete;
+ print "update add " . $v4->reverse_ip() . " 3600 IN PTR " . $hostname . $domain .".\n" unless $delete;
+ print "update delete " . $v4->reverse_ip() . " IN PTR\n" if $delete;
+ print "send\n";
+ }
+
+ # IPv6
+ if (( not ($ipv6 eq "nope") ) && ( $ipv6 )) {
+ my $v6 = new Net::IP($ipv6);
+
+ print "prereq nxdomain " . $v6->reverse_ip() . "\n" unless $delete;
+ print "update add " . $v6->reverse_ip() . " 3600 IN PTR " . $hostname . $domain . ".\n" unless $delete;
+ print "update delete " . $v6->reverse_ip() . " IN PTR\n" if $delete;
+ print "send\n";
+ }
+}
+
+sub print_fwd{
+ my ($hostname, $ipv4, $ipv6) = @_;
+
+ if ($nsupdate){
+
+ unless ( $ipv4 eq "nope" ) {
+ # IPv4
+ print "prereq nxrrset " . $hostname . $domain . " IN A\n" unless $delete;
+ print "update add " . $hostname . $domain . " 3600 IN A $ipv4\n" unless $delete;
+ print "update delete " . $hostname . $domain . " IN A\n" if $delete;
+ print "send\n";
+ }
+ if (( not ($ipv6 eq "nope") ) && ( $ipv6 )) {
+ # IPv6
+ print "prereq nxrrset " . $hostname . $domain . " IN AAAA\n" unless $delete;
+ print "update add " . $hostname . $domain . " 3600 IN AAAA $ipv6\n" unless $delete;
+ print "update delete " . $hostname . $domain . " IN AAAA\n" if $delete;
+ print "send\n";
+ }
+ } else {
+ # IPv4
+ unless ( $ipv4 eq "nope" ) {
+ printf ("%-24s%s\t%s\t%s\n", $hostname, "IN", "A", $ipv4);
+ }
+ # IPv6
+ if (( not ($ipv6 eq "nope") ) && ( $ipv6 )) {
+ printf ("%-24s%s\t%s\t%s\n", $hostname, "IN", "AAAA", $ipv6) if ($ipv6);
+ }
+ }
+}
diff --git a/tools/init-sshkeys.sh b/tools/init-sshkeys.sh
new file mode 100755
index 0000000..9427bad
--- /dev/null
+++ b/tools/init-sshkeys.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+set -e
+
+source include/tgmanage.cfg.sh
+if [ -z ${PRIMARY} ]
+then
+ echo "Not configured!";
+ exit 1;
+fi;
+
+ssh-keygen -P '' -f ~/.ssh/id_rsa -b 2048
+ssh-copy-id root@${PRIMARY}
+ssh-copy-id root@${SECONDARY}
diff --git a/tools/install-dependencies.sh b/tools/install-dependencies.sh
new file mode 100755
index 0000000..bf68134
--- /dev/null
+++ b/tools/install-dependencies.sh
@@ -0,0 +1,53 @@
+#!/bin/bash -e
+
+if [ "$1" != "master" -a "$1" != "slave" -a "$1" != "boot" ]; then
+ echo "Run as $0 <boot|master|slave>"
+ exit
+fi
+
+# OK, we know the content of $0 is OK. I prefer sane names.
+ROLE=$1;
+
+# Start by installing common packages. Remember to update
+# this when a new common dependency is discovered, plx.
+apt-get -y install \
+ vim-nox \
+ git \
+ ntp \
+ screen \
+ dnsutils \
+ build-essential \
+ libnet-ip-perl \
+ libnetaddr-ip-perl \
+ libnet-telnet-cisco-perl \
+ libnet-ping-external-perl \
+ perl-modules \
+ libdbi-perl \
+ libdbd-pg-perl \
+ libnet-telnet-perl
+
+if [ "${ROLE}" == "boot" ]; then
+ # Install-tasks specific for the _bootstrab box_ here
+ echo "Installing for bootstrap"
+ apt-get -y install \
+ bind9utils
+fi
+
+if [ "${ROLE}" == "master" ]; then
+ # Install-tasks specific for the _primary_ here
+ echo "Installing for primary/master"
+ apt-get -y install \
+ isc-dhcp-server \
+ bind9utils \
+ bind9
+fi
+
+if [ "${ROLE}" == "slave" ]; then
+ # Install-tasks specific for the _secondary_ here
+ echo "Installing for secondary/slave"
+ apt-get -y install \
+ bind9utils \
+ bind9
+fi
+
+echo "Dependency installation for ${ROLE} complete."
diff --git a/tools/make-accesspoints.pl b/tools/make-accesspoints.pl
new file mode 100755
index 0000000..b84321a
--- /dev/null
+++ b/tools/make-accesspoints.pl
@@ -0,0 +1,24 @@
+#! /usr/bin/perl
+use strict;
+use warnings;
+
+while (<>) {
+ my @arr = split " ";
+ my $ap = 'ap-'.$arr[0];
+ my $core = $arr[1];
+ # Trekk fra 1
+ $core =~ s/^(distro)(\d+)$/$1.($2-1)/e;
+
+ # Fjerde kabel er aksesspunkt
+ my $blade;
+ my $port;
+ if ($arr[5] =~ /^Gi(\d+)\/(\d+)$/) {
+ $blade = $1;
+ $port = $2;
+ } else {
+ die "Unknown port: ".$arr[5];
+ }
+ printf "INSERT INTO switches(ip, sysname, switchtype) values(inet '127.0.0.1', '%s', 'ciscoap');\n", $ap;
+ printf "INSERT INTO uplinks SELECT (SELECT switch FROM switches WHERE sysname = '%s') AS switch, (SELECT switch FROM switches WHERE sysname = '%s') AS coreswitch, %d AS blade, %d AS port;\n", $ap, $core, $blade, $port;
+ printf "INSERT INTO ap_poll(switch) SELECT switch FROM switches WHERE sysname = '%s';\n", $ap;
+}
diff --git a/tools/make-base-requires.sh b/tools/make-base-requires.sh
new file mode 100755
index 0000000..d19ffd9
--- /dev/null
+++ b/tools/make-base-requires.sh
@@ -0,0 +1,60 @@
+#!/bin/bash
+
+set -e
+
+BASE="/etc";
+if [ "$1" != "" ]
+then
+ BASE=$1
+ echo "Using base path ${BASE}"
+fi
+
+source include/tgmanage.cfg.sh
+if [ -z ${PRIMARY} ]
+then
+ echo "Not configured!";
+ exit 1;
+fi;
+
+tools/update-tools.sh
+ssh -l root ${PRIMARY} "~/tgmanage/tools/install-dependencies.sh master"
+ssh -l root ${SECONDARY} "~/tgmanage/tools/install-dependencies.sh slave"
+
+if [ "${BASE}" == "/etc" ]; then
+ ssh -l root ${PRIMARY} "cp -pR /etc/bind /etc/bind.dist"
+ ssh -l root ${PRIMARY} "cp -pR /etc/dhcp /etc/dhcp.dist"
+ ssh -l root ${SECONDARY} "cp -pR /etc/bind /etc/bind.dist"
+
+ set +e
+ ssh -l root ${PRIMARY} "rm /etc/bind/named.conf"
+ ssh -l root ${PRIMARY} "rm /etc/dhcp/dhcpd.conf"
+ ssh -l root ${SECONDARY} "rm /etc/bind/named.conf"
+ set -e
+fi
+
+ssh -l root ${PRIMARY} "mkdir -p ${BASE}/bind/conf-master/"
+ssh -l root ${PRIMARY} "mkdir -p ${BASE}/bind/reverse/"
+ssh -l root ${PRIMARY} "mkdir -p ${BASE}/bind/dynamic/"
+ssh -l root ${PRIMARY} "mkdir -p ${BASE}/dhcp/conf.d/"
+ssh -l root ${PRIMARY} "~/tgmanage/tools/make-named.pl master ${BASE}"
+ssh -l root ${PRIMARY} "~/tgmanage/tools/make-dhcpd.pl ${BASE}"
+ssh -l root ${PRIMARY} "~/tgmanage/tools/make-first-zones.pl ${BASE}"
+ssh -l root ${PRIMARY} "~/tgmanage/tools/make-reverse4-files.pl master ${BASE}"
+
+ssh -l root ${SECONDARY} "mkdir -p ${BASE}/bind/conf-slave/"
+ssh -l root ${SECONDARY} "mkdir -p ${BASE}/bind/slave/"
+ssh -l root ${SECONDARY} "~/tgmanage/tools/make-named.pl slave ${BASE}"
+ssh -l root ${SECONDARY} "~/tgmanage/tools/make-reverse4-files.pl slave ${BASE}"
+
+set +e
+ssh -l root ${PRIMARY} "chown -R bind.bind ${BASE}/bind"
+ssh -l root ${SECONDARY} "chown -R bind.bind ${BASE}/bind"
+set -e
+
+ssh -l root ${PRIMARY} "echo THIS COPY OF TGMANAGE IS MANAGED FROM BOOTSTRAP SERVER > ~/tgmanage/NOTICE"
+ssh -l root ${SECONDARY} "echo THIS COPY OF TGMANAGE IS MANAGED FROM BOOTSTRAP SERVER > ~/tgmanage/NOTICE"
+
+# No point in _not_ running update-baseservice at this point....
+tools/update-baseservice.sh ${BASE}
+
+# all done.
diff --git a/tools/make-bind-include.pl b/tools/make-bind-include.pl
new file mode 100755
index 0000000..d688dec
--- /dev/null
+++ b/tools/make-bind-include.pl
@@ -0,0 +1,51 @@
+#!/usr/bin/perl -I /root/tgmanage
+
+# TODO: Port this to the "master|slave base" parameter syntax!
+
+use strict;
+
+unless ( (($#ARGV == 0 ) || ( $#ARGV == 1))
+ && (( $ARGV[0] eq "master" ) || ( $ARGV[0] eq "slave" )) )
+{
+ print STDERR "Invalid usage!\ncat netnames.txt | $0 <master|slave> [basedir]\n";
+ exit 1;
+}
+
+my $role = $ARGV[0];
+
+my $base = "/etc";
+$base = $ARGV[1] if $#ARGV == 1;
+$base .= "/" if not $base =~ m/\/$/ and not $base eq "";
+
+my $bind_base = $base . "bind/";
+my $masterinclude = $bind_base . "named.master-include.conf";
+my $slaveinclude = $bind_base . "named.slave-include.conf";
+
+my $glob;
+my @configs;
+
+if ( $role eq "master" )
+{
+ $glob = $bind_base . "conf-master/*.conf";
+ @configs = glob($glob);
+
+ open CONF, ">" . $masterinclude or die ( $! . " " . $masterinclude);
+ foreach my $config ( @configs )
+ {
+ print CONF "include \"" . $config . "\";\n";
+ }
+ close CONF;
+}
+
+if ( $role eq "slave" )
+{
+ $glob = $bind_base . "conf-slave/*.conf";
+ @configs = glob($glob);
+
+ open CONF, ">" . $slaveinclude or die ( $! . " " . $slaveinclude);
+ foreach my $config ( @configs )
+ {
+ print CONF "include \"" . $config . "\";\n";
+ }
+ close CONF;
+}
diff --git a/tools/make-dhcpd-include.pl b/tools/make-dhcpd-include.pl
new file mode 100755
index 0000000..ded5551
--- /dev/null
+++ b/tools/make-dhcpd-include.pl
@@ -0,0 +1,18 @@
+#!/usr/bin/perl -I /root/tgmanage
+use strict;
+my $base = "/etc";
+$base = $ARGV[0] if $#ARGV > -1;
+$base .= "/" if not $base =~ m/\/$/ and not $base eq "";
+
+my $dhcpd_base = $base . "dhcp/";
+my $includeconfig = $dhcpd_base . "generated-include.conf";
+
+my $glob = $dhcpd_base . "conf.d/*.conf";
+my @configs = glob($glob);
+
+open CONF, ">" . $includeconfig or die ( $! . " " . $includeconfig);
+foreach my $config ( @configs )
+{
+ print CONF "include \"" . $config . "\";\n";
+}
+close CONF;
diff --git a/tools/make-dhcpd.pl b/tools/make-dhcpd.pl
new file mode 100755
index 0000000..2cf388a
--- /dev/null
+++ b/tools/make-dhcpd.pl
@@ -0,0 +1,104 @@
+#!/usr/bin/perl -I /root/tgmanage
+use strict;
+
+use Net::IP;
+use Net::IP qw(:PROC);
+
+BEGIN {
+ require "include/config.pm";
+ eval {
+ require "include/config.local.pm";
+ };
+}
+
+my $base = "/etc";
+$base = $ARGV[0] if $#ARGV > -1;
+$base .= "/" if not $base =~ m/\/$/ and not $base eq "";
+
+my $dhcpd_base = $base . "dhcp/";
+my $dhcpd_conf = $dhcpd_base . "dhcpd.conf";
+my $dhcp_pxeconf = $dhcpd_base . "pxe-boot.conf";
+my $dhcp_ciscoapconf = $dhcpd_base . "ciscowlc.conf";
+
+my $tgname = $nms::config::tgname;
+my $pri_ptr = $nms::config::pri_ptr;
+my $pri_net = $nms::config::pri_net;
+my $sec_ptr = $nms::config::sec_ptr;
+my $pxe_server = $nms::config::pxe_server;
+my $ddns_key = $nms::config::ddns_key;
+my $ciscowlc_a = $nms::config::ciscowlc_a;
+
+my $range = new Net::IP( $pri_net ) or die ("oopxos");
+my $mask = $range->mask();
+my ($net, undef) = split "/", $pri_net;
+
+
+# Create PXE-boot configuration file for DHCP on master.
+if ( not -f $dhcpd_conf )
+{
+ print STDERR "Creating file " . $dhcpd_conf . "\n";
+ open DHCPDFILE, ">" . $dhcpd_conf or die ( $! . " " . $dhcpd_conf);
+
+ print DHCPDFILE <<"EOF";
+# GENERATED BY make-dhcpd.pl
+#
+# Central concept: as little config in the main .conf,
+# include almost everything from separate files..
+#
+# log-facility local7;
+option domain-name "$tgname.gathering.org";
+option domain-name-servers $pri_ptr, $sec_ptr;
+default-lease-time 3600;
+max-lease-time 7200;
+authoritative;
+
+ddns-update-style interim;
+key DHCP_UPDATER {
+ algorithm HMAC-MD5.SIG-ALG.REG.INT;
+ secret $ddns_key;
+}
+
+subnet $net netmask $mask {}
+
+include "/etc/dhcp/revzones.conf";
+include "/etc/dhcp/generated-include.conf";
+include "/etc/dhcp/pxe-boot.conf";
+include "/etc/dhcp/ciscowlc.conf";
+
+EOF
+ close DHCPDFILE;
+}
+
+# Create PXE-boot configuration file for DHCP on master.
+if ( not -f $dhcp_pxeconf )
+{
+ print STDERR "Creating file " . $dhcp_pxeconf . "\n";
+ open PXEFILE, ">" . $dhcp_pxeconf or die ( $! . " " . $dhcp_pxeconf);
+
+ print PXEFILE "next-server " . $pxe_server . ";\n";
+ print PXEFILE "filename \"pxelinux.0\";\n";
+
+ close PXEFILE;
+}
+
+
+# Create PXE-boot configuration file for DHCP on master.
+if ( not -f $dhcp_ciscoapconf )
+{
+ print STDERR "Creating file " . $dhcp_ciscoapconf . "\n";
+ open CISCOFILE, ">" . $dhcp_ciscoapconf or die ( $! . " " . $dhcp_pxeconf);
+
+ print CISCOFILE <<"EOF";
+option space CiscoAP;
+option CiscoAP.server-address code 241 = array of ip-address;
+set vendor-string = option vendor-class-identifier;
+
+class "cisco-aps" {
+ match if substring (option vendor-class-identifier, 0, 8) = "Cisco AP";
+ vendor-option-space CiscoAP;
+ option CiscoAP.server-address $ciscowlc_a;
+}
+EOF
+ close CISCOFILE;
+}
+
diff --git a/tools/make-first-zones.pl b/tools/make-first-zones.pl
new file mode 100755
index 0000000..1227129
--- /dev/null
+++ b/tools/make-first-zones.pl
@@ -0,0 +1,124 @@
+#!/usr/bin/perl -I /root/tgmanage
+use strict;
+
+use Net::IP;
+
+BEGIN {
+ require "include/config.pm";
+ eval {
+ require "include/config.local.pm";
+ };
+}
+
+my $base = "/etc";
+$base = $ARGV[0] if $#ARGV > -1;
+$base .= "/" if not $base =~ m/\/$/ and not $base eq "";
+
+my $tgname = $nms::config::tgname;
+my $pri_a = $nms::config::pri_a;
+my $pri_ptr = $nms::config::pri_ptr;
+my $pri_v6 = $nms::config::pri_v6;
+my $sec_a = $nms::config::sec_a;
+my $sec_ptr = $nms::config::sec_ptr;
+my $sec_v6 = $nms::config::sec_v6;
+my $ipv6zone = $nms::config::ipv6zone;
+
+# FIXME: THIS IS NOT APPRORPIATE!
+my $serial = `date +%Y%m%d01`;
+chomp $serial;
+# FIXME
+
+my $zonefile;
+
+$zonefile = $base . "bind/" . $tgname . ".gathering.org.zone";
+if ( not -f $zonefile )
+{
+ print $zonefile . "\n";
+ open MAINZONE, ">" . $zonefile or die $! . " " . $zonefile;
+
+ print MAINZONE <<"EOF";
+\$TTL 3600
+@ IN SOA $pri_a.$tgname.gathering.org. abuse.gathering.org. (
+ $serial; serial
+ 3600 ; refresh
+ 1800 ; retry
+ 608400 ; expire
+ 3600 ) ; minimum and default TTL
+
+ IN NS ns1.$tgname.gathering.org.
+ IN NS ns2.$tgname.gathering.org.
+
+ns1 IN A $pri_ptr
+ns1 IN AAAA $pri_v6
+ns2 IN A $sec_ptr
+ns2 IN AAAA $sec_v6
+$pri_a IN A $pri_ptr
+$pri_a IN AAAA $pri_v6
+$sec_a IN A $sec_ptr
+$sec_a IN AAAA $sec_v6
+
+; Generated by make-all-config.sh on the bootstrapping/nms server.
+; Will not be overwritten unless it is missing ;)
+
+EOF
+ close MAINZONE;
+}
+else { print "Skipped TG-zone, file exists.\n"; }
+
+$zonefile = $base . "bind/infra." . $tgname . ".gathering.org.zone";
+if ( not -f $zonefile )
+{
+ print $zonefile . "\n";
+ open MAINZONE, ">" . $zonefile or die $! . " " . $zonefile;
+
+ print MAINZONE <<"EOF";
+\$TTL 3600
+@ IN SOA $pri_a.$tgname.gathering.org. abuse.gathering.org. (
+ $serial; serial
+ 3600 ; refresh
+ 1800 ; retry
+ 608400 ; expire
+ 3600 ) ; minimum and default TTL
+
+ IN NS $pri_a.$tgname.gathering.org.
+ IN NS $sec_a.$tgname.gathering.org.
+
+; Generated by make-all-config.sh on the bootstrapping/nms server.
+; Will not be overwritten unless it is missing ;)
+EOF
+ close MAINZONE;
+}
+else { print "Skipped infra-zone, file exists.\n"; }
+
+$zonefile = $base . "bind/" . $ipv6zone . ".zone";
+if ( not -f $zonefile )
+{
+ print $zonefile . "\n";
+ open IPV6ZONE, ">" . $zonefile or die $! . " " . $zonefile;
+
+ print IPV6ZONE <<"EOF";
+; autogenerated, and updated from dhcpd -- DO NOT TOUCH!
+\$TTL 3600
+@ IN SOA ns1.$tgname.gathering.org. abuse.gathering.org. (
+ $serial; serial
+ 3600 ; refresh
+ 1800 ; retry
+ 608400 ; expire
+ 3600 ) ; minimum and default TTL
+
+ IN NS ns1.$tgname.gathering.org.
+ IN NS ns2.$tgname.gathering.org.
+
+; WARNING! Do not edit this file directly!
+; on the bootstrapping/nms server!
+
+EOF
+ my $ip_pri = new Net::IP( $pri_v6 ) or die ( "Error, new Net::IP for " . $pri_v6 );
+ my $ip_sec = new Net::IP( $sec_v6 ) or die ( "Error, new Net::IP for " . $sec_v6 );
+ print IPV6ZONE $ip_pri->reverse_ip() . " IN PTR ns1.$tgname.gathering.org.\n";
+ print IPV6ZONE $ip_pri->reverse_ip() . " IN PTR $pri_a.$tgname.gathering.org.\n";
+ print IPV6ZONE $ip_sec->reverse_ip() . " IN PTR ns2.$tgname.gathering.org.\n";
+ print IPV6ZONE $ip_sec->reverse_ip() . " IN PTR $sec_a.$tgname.gathering.org.\n";
+ close IPV6ZONE;
+}
+else { print "Skipped v6-reverse-zone, file exists.\n"; }
diff --git a/tools/make-linknet-hosts.pl b/tools/make-linknet-hosts.pl
new file mode 100755
index 0000000..d535832
--- /dev/null
+++ b/tools/make-linknet-hosts.pl
@@ -0,0 +1,34 @@
+#!/usr/bin/perl
+use NetAddr::IP;
+use Net::IP;
+#
+# Input file format:
+#
+# ipv4-link-network router1 router2
+#
+# e.g.
+# 151.216.0.2 telegw nocgw
+# 151.216.0.4 telegw cam
+# 151.216.0.6 nocgw coren
+# 151.216.0.8 telegw pressegw
+#
+# Note: IPv6 linknets use link-local adresses, so they are not included in list.
+#
+while (<STDIN>) {
+ next if /^(#|\s+$)/; # skip if comment, or blank line
+
+ my ($ipv4_raw, $from, $to) = split;
+ my $ipv4;
+
+ # Assumes ipv4 address is the first address in a /31 :-))
+ $ipv4 = NetAddr::IP->new($ipv4_raw."/31") unless $ipv4=~/no/;
+ printf STDERR "Missing IPv4 scope for linket %s -> %s\n", $from, $to if not $ipv4;
+ next if not $ipv4;
+
+
+ # generate-dnsrr.pl format:
+ # hostname ipv4 ipv6 (with nope as valid null argument)
+ my $ipv4_other = $ipv4 +1;
+ printf("%s-%s %s nope\n", $from, $to, $ipv4->addr);
+ printf("%s-%s %s nope\n", $to, $from, $ipv4_other->addr);
+}
diff --git a/tools/make-missing-conf.pl b/tools/make-missing-conf.pl
new file mode 100755
index 0000000..f0fb0a0
--- /dev/null
+++ b/tools/make-missing-conf.pl
@@ -0,0 +1,187 @@
+#!/usr/bin/perl -I /root/tgmanage
+use strict;
+
+BEGIN {
+ require "include/config.pm";
+ eval {
+ require "include/config.local.pm";
+ };
+}
+
+
+use Net::IP;
+use Net::IP qw(:PROC);
+
+# FIXME: THIS IS NOT APPRORPIATE!
+my $serial = `date +%Y%m%d01`;
+chomp $serial;
+# FIXME
+
+unless ( (($#ARGV == 0 ) || ( $#ARGV == 1))
+ && (( $ARGV[0] eq "master" ) || ( $ARGV[0] eq "slave" )) )
+{
+ print STDERR "Invalid usage!\ncat netnames.txt | $0 <master|slave> [basedir]\n";
+ exit 1;
+}
+
+my $role = $ARGV[0];
+
+my $base = "/etc";
+$base = $ARGV[1] if $#ARGV == 1;
+$base .= "/" if not $base =~ m/\/$/ and not $base eq "";
+
+
+print STDERR "Role is " . $role . "\n";
+print STDERR "Base dir is " . $base . "\n";
+
+my $bind_base = $base . "bind/";
+my $dhcpd_base = $base . "dhcp/";
+
+my $dhcp_dynconf_dir = $dhcpd_base . "conf.d/";
+my $bind_conf_master = $bind_base . "conf-master/";
+my $bind_conf_slave = $bind_base . "conf-slave/";
+
+my $tgname = $nms::config::tgname;
+
+my $pri_a = $nms::config::pri_a;
+my $pri_ptr = $nms::config::pri_ptr;
+my $pri_v6 = $nms::config::pri_v6;
+
+my $sec_a = $nms::config::sec_a;
+my $sec_ptr = $nms::config::sec_ptr;
+my $sec_v6 = $nms::config::sec_v6;
+
+my $ext_xfer = $nms::config::ext_xfer;
+my $ext_ns = $nms::config::ext_ns;
+
+my $ddns_key = $nms::config::ddns_key;
+
+my $base_ipv4net = $nms::config::base_ipv4net;
+my $base_ipv4prefix = $nms::config::base_ipv4prefix;
+
+my $ddns_to = $nms::config::ddns_to;
+
+my $base_ipv4 = new Net::IP( $base_ipv4net . "/" . $base_ipv4prefix );
+
+$base_ipv4net =~ m/^(\d+)\.(\d+)\.(\d+)\..*/;
+my ( $cp_oct, $cs_oct, $ct_oct ) = ( $1, $2, $3 );
+
+while ( <STDIN> )
+{
+ next if ( $_ =~ m/^#/);
+ my $line = $_;
+ chomp $line;
+ die ("Invalid format on input") if not $line =~ m/^(\d+)\.(\d+)\.(\d+)\.(\d+)\s+(\d+)\s+([\w|-]+)\s*.*/;
+ my ( $p_oct, $s_oct, $t_oct, $f_oct, $size, $name ) = ( $1, $2, $3, $4, $5, $6 );
+
+
+ my $dhconfig = $dhcp_dynconf_dir . $name . ".conf";
+ my $master_config = $bind_conf_master . $name . ".conf";
+ my $slave_config = $bind_conf_slave . $name . ".conf";
+ my $zone_file = $bind_base . "dynamic/$name.$tgname.gathering.org.zone";
+
+ my $net_base = $p_oct . "." . $s_oct . "." . $t_oct;
+ my $net = $net_base . "." . $f_oct;
+ my $range = new Net::IP( $net . "/" . $size ) or die ("oopxos");
+
+ # Create configuration files for DHCP on master/primary
+ if ( ( not -f $dhconfig ) && ( $role eq "master" ) )
+ {
+ print STDERR "Creating file " . $dhconfig . "\n";
+ my $numhosts = $range->size();
+ my $mask = $range->mask();
+ my $router = $net_base . "." . ($f_oct+1);
+ my $first = $net_base . "." . ( $f_oct + 5 );
+
+ my $last = $first;
+ if ( $size < 24 )
+ {
+ # Net::IP iteration is crazyslow. So, we stopped using iterations.
+ my $last_ip = $range->last_ip();
+ $last_ip =~ m/(\d+)\.(\d+)\.(\d+)\.(\d+)/;
+ $last = sprintf("%d.%d.%d.%d", $1, $2, $3, $4-2);
+ }
+ else { $last = $net_base . "." . ( $f_oct + $numhosts - 2 ); }
+
+ #print STDERR "Name : " . $name . "\n";
+ #print STDERR "Net : " . $net . "\n";
+ #print STDERR "Mask : " . $mask . "\n";
+ #print STDERR "Router : " . $router . "\n";
+ #print STDERR "Size : " . $size . "\n";
+ #print STDERR "Numhosts : " . $numhosts . "\n";
+ #print STDERR "First : " . $first . "\n";
+ #print STDERR "Last : " . $last . "\n";
+
+ open DFILE, ">" . $dhconfig or die ( $! . " " . $dhconfig);
+
+ print DFILE "zone $name.$tgname.gathering.org {\n";
+ print DFILE " primary $ddns_to;\n";
+ print DFILE " key DHCP_UPDATER;\n";
+ print DFILE "}\n\n";
+
+ print DFILE "subnet $net netmask $mask {\n";
+ print DFILE " authoritative;\n";
+ print DFILE " option routers $router;\n";
+ print DFILE " option domain-name \"$name.$tgname.gathering.org\";\n";
+ print DFILE " ddns-domainname \"$name.$tgname.gathering.org\";\n";
+ print DFILE " range $first $last;\n";
+ print DFILE " ignore client-updates;\n";
+ print DFILE "}\n\n";
+
+ close DFILE;
+ }
+
+ # Create zone files for bind9 on master/primary
+ if ( ( not -f $zone_file ) && ( $role eq "master" ) )
+ {
+ print STDERR "Creating file " . $zone_file . "\n";
+ open ZFILE, ">" . $zone_file or die ( $! . " " . $zone_file);
+ print ZFILE << "EOF";
+; Base reverse zones are updated from dhcpd -- DO NOT TOUCH!
+\$TTL 3600
+@ IN SOA $pri_a.$tgname.gathering.org. abuse.gathering.org. (
+ $serial ; serial
+ 3600 ; refresh
+ 1800 ; retry
+ 608400 ; expire
+ 3600 ) ; minimum and default TTL
+
+ IN NS $pri_a.$tgname.gathering.org.
+ IN NS $sec_a.$tgname.gathering.org.
+\$ORIGIN $name.$tgname.gathering.org.
+EOF
+ close ZFILE;
+ }
+
+
+ # Create bind9 configuration files for zones.
+ my $bind_file = "";
+ $bind_file = $master_config if ( $role eq "master");
+ $bind_file = $slave_config if ( $role eq "slave");
+ die ("WTF, role does not match 'master' or 'slave'" ) if ( $bind_file eq "");
+
+ if ( not -f $bind_file )
+ {
+ print STDERR "Creating file " . $bind_file . "\n";
+ open NFILE, ">" . $bind_file or die ( $! . " " . $bind_file);
+
+ print NFILE "zone \"$name.$tgname.gathering.org\" {\n";
+ if ( $role eq "master" ) {
+ print NFILE " type master;\n";
+ print NFILE " notify yes;\n";
+ print NFILE " allow-update { key DHCP_UPDATER; };\n";
+ print NFILE " file \"dynamic/$name.$tgname.gathering.org.zone\";\n";
+ }
+ else
+ {
+ print NFILE " type slave;\n";
+ print NFILE " notify no;\n";
+ print NFILE " masters { bootstrap; };\n";
+ print NFILE " file \"slave/$name.$tgname.gathering.org.zone\";\n";
+ }
+ print NFILE " allow-transfer { ns-xfr; };\n";
+ print NFILE "};\n";
+
+ close NFILE;
+ }
+}
diff --git a/tools/make-named.pl b/tools/make-named.pl
new file mode 100755
index 0000000..7e543e1
--- /dev/null
+++ b/tools/make-named.pl
@@ -0,0 +1,156 @@
+#!/usr/bin/perl -I /root/tgmanage
+use strict;
+
+BEGIN {
+ require "include/config.pm";
+ eval {
+ require "include/config.local.pm";
+ };
+}
+
+
+use Net::IP;
+use Net::IP qw(:PROC);
+
+unless ( (($#ARGV == 0 ) || ( $#ARGV == 1))
+ && (( $ARGV[0] eq "master" ) || ( $ARGV[0] eq "slave" )) )
+{
+ print STDERR "Invalid usage!\ncat netnames.txt | $0 <master|slave> [basedir]\n";
+ exit 1;
+}
+
+my $role = $ARGV[0];
+
+my $base = "/etc";
+$base = $ARGV[1] if $#ARGV == 1;
+$base .= "/" if not $base =~ m/\/$/ and not $base eq "";
+
+my $bind_base = $base . "bind/";
+my $named_file = $bind_base . "named.conf";
+
+if ( -f $named_file )
+{
+ print STDERR $named_file . " already exists. Cowardly refusing to continue\n";
+ exit;
+}
+
+my $tgname = $nms::config::tgname;
+
+my $pri_a = $nms::config::pri_a;
+my $pri_ptr = $nms::config::pri_ptr;
+my $pri_v6 = $nms::config::pri_v6;
+
+my $sec_a = $nms::config::sec_a;
+my $sec_ptr = $nms::config::sec_ptr;
+my $sec_v6 = $nms::config::sec_v6;
+my $ipv6zone = $nms::config::ipv6zone;
+my $ext_xfer = $nms::config::ext_xfer;
+my $ext_ns = $nms::config::ext_ns;
+
+my $ddns_key = $nms::config::ddns_key;
+
+my $base_ipv4net = $nms::config::base_ipv4net;
+my $base_ipv4prefix = $nms::config::base_ipv4prefix;
+
+my $base_ipv6net = $nms::config::base_ipv6net;
+my $base_ipv6prefix = $nms::config::base_ipv6prefix;
+
+my $noc_nett = $nms::config::noc_nett;
+
+my $ddns_to = $nms::config::ddns_to;
+
+my $pxe_server = $nms::config::ddns_to;
+
+my $run = `date +%Y%m%d-%H%M`;
+
+open NFILE, ">" . $named_file or die ( $! . " " . $named_file );
+
+chomp $run;
+print NFILE <<EOF;
+// This named.conf was generated by make-named.pl at $run
+// The current version of make-named.pl should not overwrite this file.
+acl tg-nett { $base_ipv4net/$base_ipv4prefix; $base_ipv6net:/$base_ipv6prefix; 127.0.0.0/8; ::1; };
+acl ns-xfr { $ext_ns; $sec_ptr; $sec_v6; $pri_ptr; $pri_v6; $noc_nett; };
+acl ripe-xfr { $ext_ns; $sec_ptr; $sec_v6; $pri_ptr; $pri_v6; $ext_xfer; };
+
+options {
+ directory "/etc/bind";
+ allow-recursion { tg-nett; };
+ allow-query { any; };
+ allow-transfer { ns-xfr; };
+ recursion yes;
+ auth-nxdomain no;
+ listen-on-v6 { any; };
+};
+
+key DHCP_UPDATER {
+ algorithm HMAC-MD5.SIG-ALG.REG.INT;
+ secret $ddns_key;
+};
+EOF
+
+if ( $role eq "master" )
+{
+ print NFILE <<EOF;
+
+zone "$tgname.gathering.org" {
+ type master;
+ file "$tgname.gathering.org.zone";
+ notify yes;
+ allow-transfer { ns-xfr; };
+};
+
+zone "infra.$tgname.gathering.org" {
+ type master;
+ file "infra.$tgname.gathering.org.zone";
+ notify yes;
+ allow-transfer { ns-xfr; };
+};
+
+zone "$ipv6zone" {
+ type master;
+ allow-update { key DHCP_UPDATER; };
+ notify yes;
+ file "$ipv6zone.zone";
+ allow-transfer { ns-xfr; ripe-xfr; };
+};
+
+include "/etc/bind/named.conf.default-zones";
+include "named.reverse4.conf";
+include "named.master-include.conf";
+EOF
+}
+
+if ( $role eq "slave" )
+{
+ print NFILE <<EOF;
+
+masters bootstrap { $pri_ptr; };
+
+zone "$tgname.gathering.org" {
+ type slave;
+ file "slave/$tgname.gathering.org";
+ notify no;
+ masters { bootstrap; };
+};
+
+zone "infra.$tgname.gathering.org" {
+ type slave;
+ file "slave/infra.$tgname.gathering.org";
+ notify no;
+ masters { bootstrap; };
+};
+
+zone "$ipv6zone" {
+ type slave;
+ notify no;
+ masters { bootstrap; };
+ file "slave/$ipv6zone:";
+ allow-transfer { ns-xfr; ripe-xfr; };
+};
+
+include "named.conf.default-zones";
+include "named.slave-reverse4.conf";
+include "named.slave-include.conf";
+EOF
+}
diff --git a/tools/make-pxeboot.sh b/tools/make-pxeboot.sh
new file mode 100755
index 0000000..0d53e6a
--- /dev/null
+++ b/tools/make-pxeboot.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+#
+# TODO: This tool assumes that the bootstrap box
+# is used as the PXE server. This should be updated
+# to use the configuration information in config.local.pm ...
+
+apt-get install tftpd-hpa
+apt-get install nfs-kernel-server
+
+cat << END > /etc/default/tftpd-hpa
+TFTP_USERNAME="tftp"
+TFTP_DIRECTORY="/var/lib/tftpboot"
+TFTP_ADDRESS="0.0.0.0:69"
+TFTP_OPTIONS="--secure"
+END
+
+/etc/init.d/tftpd-hpa restart
+
+mkdir -p /var/lib/tftpboot
+cp -R pxe/* /var/lib/tftpboot
+
+tools/fetch-debinstall.sh /var/lib/tftpboot/debian
+# tools/fetch-ubuntulive.sh <- this tool does not exist xD
+# NOTE! The pxe/ directory contains an 'ubuntu' menu...
+# The files required to booting Ubuntu installer or live
+# must be fetched manually (for now)
diff --git a/tools/make-reverse4-files.pl b/tools/make-reverse4-files.pl
new file mode 100755
index 0000000..d20ea37
--- /dev/null
+++ b/tools/make-reverse4-files.pl
@@ -0,0 +1,164 @@
+#!/usr/bin/perl -I /root/tgmanage
+use strict;
+
+BEGIN {
+ require "include/config.pm";
+ eval {
+ require "include/config.local.pm";
+ };
+}
+
+
+use Net::IP;
+use Net::IP qw(:PROC);
+
+# FIXME: THIS IS NOT APPRORPIATE!
+my $serial = `date +%Y%m%d01`;
+chomp $serial;
+# FIXME
+
+unless ( (($#ARGV == 0 ) || ( $#ARGV == 1))
+ && (( $ARGV[0] eq "master" ) || ( $ARGV[0] eq "slave" )) )
+{
+ print STDERR "Invalid usage!\n$0 <master|slave> [basedir]\n";
+ exit 1;
+}
+
+my $role = $ARGV[0];
+
+my $base = "/etc";
+$base = $ARGV[1] if $#ARGV == 1;
+$base .= "/" if not $base =~ m/\/$/ and not $base eq "";
+
+
+my $bind_base = $base . "bind/";
+my $dhcpd_base = $base . "dhcp/";
+
+my $dhcp_revzones_file = $dhcpd_base . "revzones.conf";
+my $bind_pri_revzones_file = $bind_base . "named.reverse4.conf";
+my $bind_sec_revzones_file = $bind_base . "named.slave-reverse4.conf";
+
+my $tgname = $nms::config::tgname;
+
+my $pri_a = $nms::config::pri_a;
+my $pri_ptr = $nms::config::pri_ptr;
+my $pri_v6 = $nms::config::pri_v6;
+
+my $sec_a = $nms::config::sec_a;
+my $sec_ptr = $nms::config::sec_ptr;
+my $sec_v6 = $nms::config::sec_v6;
+
+my $ext_xfer = $nms::config::ext_xfer;
+my $ext_ns = $nms::config::ext_ns;
+
+my $ddns_key = $nms::config::ddns_key;
+
+my $base_ipv4net = $nms::config::base_ipv4net;
+my $base_ipv4prefix = $nms::config::base_ipv4prefix;
+
+my $noc_nett = $nms::config::noc_nett;
+my $noc_nett_v6 = $nms::config::noc_nett_v6;
+
+my $ddns_to = $nms::config::ddns_to;
+
+my $pxe_server = $nms::config::ddns_to;
+
+my $base_ipv4 = new Net::IP( $base_ipv4net . "/" . $base_ipv4prefix );
+
+$base_ipv4net =~ m/^(\d+)\.(\d+)\.(\d+)\..*/;
+my ( $p_oct, $s_oct, $t_oct ) = ( $1, $2, $3 );
+
+$pri_ptr =~ m/^(\d+)\.(\d+)\.(\d+)\.(\d+).*/;
+my ( $pp_oct, $ps_oct, $pt_oct, $pf_oct) = ( $1, $2, $3, $4 );
+$sec_ptr =~ m/^(\d+)\.(\d+)\.(\d+)\.(\d+).*/;
+my ( $sp_oct, $ss_oct, $st_oct, $sf_oct) = ( $1, $2, $3, $4 );
+
+if ( $role eq "master" )
+{
+ open DFILE, ">" . $dhcp_revzones_file or die $!;
+ open NFILE, ">" . $bind_pri_revzones_file or die $!;
+}
+elsif ( $role eq "slave" )
+{
+ open SFILE, ">" . $bind_sec_revzones_file or die $!;
+}
+else
+{
+ die ("WTF, role is neither 'master' or 'slave'");
+}
+
+while (1)
+{
+
+ my $block = $p_oct . "." . $s_oct . "." . $t_oct . ".0/24";
+ my $current = new Net::IP( $block ) or die ("new Net::IP failed for " . $block);
+
+ my $rev_zone = $t_oct . "." . $s_oct . "." . $p_oct . ".in-addr.arpa";
+
+ if ( $role eq "master" )
+ {
+ # Generating IPv4-related reverse-stuff for
+ # both bind9 and dhcp on master.
+
+ print DFILE "zone " . $rev_zone . " { primary " . $ddns_to . "; key DHCP_UPDATER; }\n";
+
+ print NFILE "zone \"". $rev_zone ."\" {\n";
+ print NFILE " type master;\n";
+ print NFILE " allow-update { key DHCP_UPDATER; };\n";
+ print NFILE " notify yes;\n";
+ print NFILE " allow-transfer { $sec_ptr; $ext_xfer; $noc_nett; $noc_nett_v6; };\n";
+ print NFILE " file \"reverse/". $rev_zone .".zone\";\n";
+ print NFILE "};\n\n";
+
+ my $zfilename = $bind_base . "reverse/" . $rev_zone . ".zone";
+ open ZFILE, ">", $zfilename;
+
+ print ZFILE "; " . $zfilename . "\n";
+ print ZFILE <<"EOF";
+; Base reverse zones are updated from dhcpd -- DO NOT TOUCH!
+\$TTL 3600
+@ IN SOA ns1.$tgname.gathering.org. abuse.gathering.org. (
+ $serial ; serial
+ 3600 ; refresh
+ 1800 ; retry
+ 608400 ; expire
+ 3600 ) ; minimum and default TTL
+
+ IN NS ns1.$tgname.gathering.org.
+ IN NS ns2.$tgname.gathering.org.
+
+\$ORIGIN $rev_zone.
+EOF
+ if ( ($pt_oct == $t_oct) && ($ps_oct == $s_oct) )
+ {
+ print ZFILE $pf_oct . " IN PTR ns1.$tgname.gathering.org.\n";
+ }
+ if ( ($st_oct == $t_oct) && ($ss_oct == $s_oct) )
+ {
+ print ZFILE $sf_oct . " IN PTR ns2.$tgname.gathering.org.\n";
+ }
+ }
+ else
+ {
+ # AKA "if not master", as in "is slave".
+ # A lot less work: update the named.slave-reverse4.conf file..
+ print SFILE "zone \"". $rev_zone ."\" {\n";
+ print SFILE " type slave;\n";
+ print SFILE " notify no;\n";
+ print SFILE " file \"slave/". $rev_zone .".cache\";\n";
+ print SFILE " masters { bootstrap; };\n";
+ print SFILE " allow-transfer { $ext_xfer; $noc_nett; $noc_nett_v6; };\n";
+ print SFILE "};\n\n";
+ }
+
+ if ( $current->last_int() == $base_ipv4->last_int() )
+ {
+ print STDERR "Reached last IP network. Finished\n";
+ last;
+ }
+ $t_oct++;
+}
+# Close all files, even those that have never been opened ;)
+close DFILE;
+close NFILE;
+close SFILE;
diff --git a/tools/make-switch-placements.pl b/tools/make-switch-placements.pl
new file mode 100755
index 0000000..58538e2
--- /dev/null
+++ b/tools/make-switch-placements.pl
@@ -0,0 +1,88 @@
+#! /usr/bin/perl
+use strict;
+use warnings;
+
+my $switchtype = "dlink3100";
+
+print "begin;\n";
+print "delete from placements where switch in (select switch from switches where switchtype = '$switchtype');\n";
+
+my %ip;
+my $i = 1;
+while (<STDIN>) {
+ chomp;
+ my @info = split(/ /);
+
+ if (scalar @info < 5) {
+ die "Unknown line: $_";
+ }
+ my ($x, $y, $xx, $yy);
+
+ my $name = $info[0];
+ if ($name =~ /^e\d+-\d+$/) {
+ $name =~ /e(\d+)-(\d+)/;
+ my ($e, $s) = ($1, $2);
+
+ $x = int(220 + (($e-1)/2) * 21.5);
+ $y = undef;
+
+ $x += 10 if ($e >= 11);
+ $x += 10 if ($e >= 27);
+ $x += 10 if ($e >= 43);
+ $x += 10 if ($e >= 59);
+
+ if ($s > 2) {
+ $y = 310 - 84 * ($s-2);
+ } else {
+ $y = 507 - 84 * ($s);
+ }
+
+ $xx = $x + 14;
+ $yy = $y + 84;
+
+ # Justeringer
+ $y += 42 if $name eq "e1-4";
+ $y += 28 if $name eq "e3-4";
+ $y += 14 if $name eq "e5-4";
+
+ $yy -= 14 if $name eq "e77-1";
+ $yy -= 28 if $name eq "e79-1";
+ $yy -= 42 if $name eq "e81-1";
+ $yy -= 56 if $name eq "e83-1";
+ } elsif ($name =~ /^creative(\d+)$/) {
+ my $s = $1;
+ if ($s < 3) {
+ if ($s == 1) {
+ $x = 1190;
+ $y = 278;
+ } else {
+ $x = 1180;
+ $y = 230;
+ }
+ $xx = $x+35;
+ $yy = $y+19;
+ $yy += 6;
+ } else {
+ $x = 1056;
+ $y = 296 - 22 * ($s-3);
+ if ($s <= 4) {
+ $xx = $x+100;
+ } elsif ($s <= 7) {
+ $xx = $x+70;
+ } elsif ($s <= 8) {
+ $xx = $x+55;
+ } else {
+ $xx = $x+35;
+ }
+ $yy = $y+19;
+ $yy -= 5 if $s == 3;
+ }
+ } else {
+ die "Unknown switch: $name";
+ }
+
+ print "insert into placements select switch, box '(($x,$y),($xx,$yy))' from switches where sysname = '$name';\n";
+ $i++;
+}
+
+print "end;\n";
diff --git a/tools/make-switches.pl b/tools/make-switches.pl
new file mode 100755
index 0000000..a2f5d22
--- /dev/null
+++ b/tools/make-switches.pl
@@ -0,0 +1,33 @@
+#! /usr/bin/perl
+use strict;
+use warnings;
+
+my $switchtype = "dlink3100";
+
+print "begin;\n";
+print "delete from temppoll;\n";
+print "delete from dhcp;\n";
+print "delete from switches where switchtype = '$switchtype';\n";
+#print "SELECT pg_catalog.setval('switches_switch_seq', 1, false);\n";
+print "SELECT pg_catalog.setval('polls_poll_seq', 1, false);\n";
+
+my %ip;
+my $i = 1;
+while (<STDIN>) {
+ chomp;
+ my @info = split(/ /);
+
+ if (scalar @info < 5) {
+ die "Unknown line: $_";
+ }
+
+ my $name = $info[0];
+ my $range = $info[3];
+ my $ip = $info[4];
+
+ print "insert into switches (ip, sysname, switchtype) values ('$ip', '$name', '$switchtype');\n";
+ print "insert into dhcp select switch, '$range' from switches where sysname = '$name';\n";
+}
+close HOSTS;
+
+print "end;\n";
diff --git a/tools/update-baseservice.sh b/tools/update-baseservice.sh
new file mode 100755
index 0000000..5908941
--- /dev/null
+++ b/tools/update-baseservice.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+set -e
+
+BASE="";
+if [ -n $1 ]
+then
+ BASE=$1
+ echo "Using base path ${BASE}"
+fi
+
+source include/tgmanage.cfg.sh
+if [ -z ${PRIMARY} ]
+then
+ echo "Not configured!";
+ exit 1;
+fi;
+
+cat netlist.txt | ssh -l root ${PRIMARY} "~/tgmanage/tools/make-missing-conf.pl master ${BASE}"
+ssh -l root ${PRIMARY} "~/tgmanage/tools/make-dhcpd-include.pl ${BASE}"
+ssh -l root ${PRIMARY} "~/tgmanage/tools/make-bind-include.pl master ${BASE}"
+
+set +e
+ssh -l root ${PRIMARY} "chown bind.bind /etc/bind/dynamic/*.zone";
+set -e
+
+cat netlist.txt | ssh -l root ${SECONDARY} "~/tgmanage/tools/make-missing-conf.pl slave ${BASE}"
+ssh -l root ${SECONDARY} "~/tgmanage/tools/make-bind-include.pl slave ${BASE}"
+
diff --git a/tools/update-tools.sh b/tools/update-tools.sh
new file mode 100755
index 0000000..99f712a
--- /dev/null
+++ b/tools/update-tools.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+set -e
+
+source include/tgmanage.cfg.sh
+if [ -z ${PRIMARY} ]
+then
+ echo "Not configured!";
+ exit 1;
+fi;
+
+ssh -l root ${PRIMARY} "mkdir -p ~/tgmanage"
+ssh -l root ${SECONDARY} "mkdir -p ~/tgmanage"
+
+scp -r netlist.txt root@${PRIMARY}:tgmanage/
+scp -r tools root@${PRIMARY}:tgmanage/
+scp -r tools root@${SECONDARY}:tgmanage/
+scp -r include root@${PRIMARY}:tgmanage/
+scp -r include root@${SECONDARY}:tgmanage/
+scp -r clients root@${PRIMARY}:tgmanage/
+scp -r clients root@${SECONDARY}:tgmanage/
diff --git a/web/etc/apache2/nms-public.tg13.gathering.org b/web/etc/apache2/nms-public.tg13.gathering.org
new file mode 100644
index 0000000..2c6115a
--- /dev/null
+++ b/web/etc/apache2/nms-public.tg13.gathering.org
@@ -0,0 +1,11 @@
+<VirtualHost *:80>
+ ServerAdmin drift@gathering.org
+ ServerName nms-public.tg13.gathering.org
+
+ DocumentRoot /srv/www/nms-public.tg13.gathering.org
+ AddHandler cgi-script .cgi .sh .pl .py
+
+ LogLevel warn
+ ErrorLog /var/log/apache2/error-nms-public.tg13.gathering.org.log
+ CustomLog /var/log/apache2/access-nms-public.tg13.gathering.org.log combined
+</VirtualHost>
diff --git a/web/etc/apache2/nms.tg13.gathering.org b/web/etc/apache2/nms.tg13.gathering.org
new file mode 100644
index 0000000..cb81598
--- /dev/null
+++ b/web/etc/apache2/nms.tg13.gathering.org
@@ -0,0 +1,39 @@
+<VirtualHost *:80>
+ ServerAdmin drift@gathering.org
+ ServerName nms.tg13.gathering.org
+ ServerAlias flexus.tg13.gathering.org
+
+ DocumentRoot /root/tgmanage/web/nms.gathering.org
+ <Directory "/root/tgmanage/web/nms.gathering.org">
+ AllowOverride None
+ Options Indexes FollowSymLinks ExecCGI MultiViews
+ Order allow,deny
+ Satisfy any
+ Allow from ::1
+ Allow from 127.0.0.1
+ Allow from 151.216.125.0/24
+ Allow from 151.216.124.0/24
+ Allow from 2a02:ed02:124::/64
+ Allow from 2a02:ed02:125::/64
+
+ AddHandler cgi-script .cgi .sh .pl .py
+ AddDefaultCharset UTF-8
+
+ AuthUserFile /root/tgmanage/web/.htpasswd
+ AuthGroupFile /dev/null
+ AuthName "Tech:Server Secret Volcano Lair"
+ AuthType Basic
+
+ require valid-user
+ </Directory>
+
+ ErrorLog /var/log/apache2/error-nms.tg13.gathering.org.log
+
+ # Possible values include: debug, info, notice, warn, error, crit,
+ # alert, emerg.
+ LogLevel warn
+
+ CustomLog /var/log/apache2/access-nms.tg13.gathering.org.log combined
+ ServerSignature On
+
+</VirtualHost>
diff --git a/web/etc/apache2/stream.tg13.gathering.org b/web/etc/apache2/stream.tg13.gathering.org
new file mode 100644
index 0000000..b184b1c
--- /dev/null
+++ b/web/etc/apache2/stream.tg13.gathering.org
@@ -0,0 +1,25 @@
+ <VirtualHost *:80>
+ ServerAdmin drift@gathering.org
+ ServerName stream.tg13.gathering.org
+ ServerAlias krosus.tg13.gathering.org
+
+ DocumentRoot /srv/stream.tg13.gathering.org
+ <Directory "/srv/stream.tg13.gathering.org/">
+ AllowOverride None
+ Options Indexes FollowSymLinks ExecCGI MultiViews
+ Order allow,deny
+ Allow from all
+ AddHandler cgi-script .cgi .sh .pl .py
+ AddDefaultCharset UTF-8
+
+ </Directory>
+
+ ErrorLog /var/log/apache2/error-stream.tg13.gathering.org.log
+
+ # Possible values include: debug, info, notice, warn, error, crit,
+ # alert, emerg.
+ LogLevel info
+
+ CustomLog /var/log/apache2/access-stream.tg13.gathering.org.log combined
+ ServerSignature On
+</VirtualHost>
diff --git a/web/etc/apache2/tech.tg13.gathering.org b/web/etc/apache2/tech.tg13.gathering.org
new file mode 100644
index 0000000..7ab303b
--- /dev/null
+++ b/web/etc/apache2/tech.tg13.gathering.org
@@ -0,0 +1,12 @@
+<VirtualHost *:80>
+ ServerAdmin drift@gathering.org
+ ServerName tech.tg13.gathering.org
+
+ DocumentRoot /srv/www/tech.tg13.gathering.org
+
+ LogLevel warn
+ ErrorLog /var/log/apache2/error-tech.tg13.gathering.org.log
+ CustomLog /var/log/apache2/access-tech.tg13.gathering.org.log combined
+
+ AddHandler cgi-script .pl
+</VirtualHost>
diff --git a/web/etc/cron/update-public-nms b/web/etc/cron/update-public-nms
new file mode 100644
index 0000000..3018042
--- /dev/null
+++ b/web/etc/cron/update-public-nms
@@ -0,0 +1,3 @@
+# Update public nms
+
+* * * * * root /root/tgmanage/clients/update-public-nms.sh
diff --git a/web/nms-public.gathering.org/dhcp.html b/web/nms-public.gathering.org/dhcp.html
new file mode 100644
index 0000000..332ea0a
--- /dev/null
+++ b/web/nms-public.gathering.org/dhcp.html
@@ -0,0 +1,10 @@
+<html>
+<head>
+<title>NMS Public - DHCP KART - The Gathering 2013</title>
+<meta http-equiv="refresh" content="5;URL='/dhcp.html'">
+</head>
+<body>
+<img src="nettkart-dhcp.png" alt="DHCP KART" />
+<p>Sist oppdatert: Sun, 31 Mar 2013 16:03:02 +0200
+</body>
+</html>
diff --git a/web/nms-public.gathering.org/dhcpkart.html b/web/nms-public.gathering.org/dhcpkart.html
new file mode 100644
index 0000000..77f7ad5
--- /dev/null
+++ b/web/nms-public.gathering.org/dhcpkart.html
@@ -0,0 +1,10 @@
+<html>
+ <head>
+ <title>DHCP-kart</title>
+ <meta http-equiv="refresh" content="60">
+ </head>
+ <body>
+
+ <p><img src="nettkart-dhcp.png" /></p>
+ </body>
+</html>
diff --git a/web/nms-public.gathering.org/index.html b/web/nms-public.gathering.org/index.html
new file mode 100644
index 0000000..1917fd3
--- /dev/null
+++ b/web/nms-public.gathering.org/index.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+<title>NMS Public - The Gathering 2013</title>
+</head>
+
+<body>
+
+<h1>NMS Public - The Gathering 2013</h1>
+
+<h2><a href="dhcp.html">DHCP-kart</a></h2>
+<h2><a href="trafikk.html">Trafikk-kart</a></h2>
+
+</body>
+</html>
+
diff --git a/web/nms-public.gathering.org/led.pl b/web/nms-public.gathering.org/led.pl
new file mode 100644
index 0000000..12b540b
--- /dev/null
+++ b/web/nms-public.gathering.org/led.pl
@@ -0,0 +1,128 @@
+e1-3 on
+e1-4 on
+e3-3 on
+e3-4 on
+e5-3 on
+e5-4 on
+e7-3 on
+e7-4 on
+e9-3 on
+e9-4 on
+e11-1 on
+e11-2 on
+e11-3 on
+e11-4 on
+e13-1 on
+e13-2 on
+e13-3 on
+e13-4 on
+e15-1 on
+e15-2 on
+e15-3 on
+e15-4 on
+e17-1 on
+e17-2 on
+e17-3 on
+e17-4 on
+e19-1 on
+e19-2 on
+e19-3 on
+e19-4 on
+e21-1 on
+e21-2 on
+e21-3 on
+e21-4 on
+e23-1 on
+e23-2 on
+e23-3 on
+e23-4 on
+e25-1 on
+e25-2 on
+e25-3 on
+e25-4 on
+e27-1 on
+e27-2 on
+e29-1 on
+e29-2 on
+e31-1 on
+e31-2 on
+e33-1 on
+e33-2 on
+e35-1 on
+e35-2 on
+e37-1 on
+e37-2 on
+e39-1 on
+e39-2 on
+e41-1 on
+e41-2 on
+e43-1 on
+e43-2 on
+e43-3 on
+e43-4 on
+e45-1 on
+e45-2 on
+e45-3 on
+e45-4 on
+e47-1 on
+e47-2 on
+e47-3 on
+e47-4 on
+e49-1 on
+e49-2 on
+e49-3 on
+e49-4 on
+e51-1 on
+e51-2 on
+e51-3 on
+e51-4 on
+e53-1 on
+e53-2 on
+e53-3 on
+e53-4 on
+e55-1 on
+e55-2 on
+e55-3 on
+e55-4 on
+e57-1 on
+e57-2 on
+e57-3 on
+e57-4 on
+e59-1 on
+e59-2 on
+e59-3 on
+e59-4 on
+e61-1 on
+e61-2 on
+e61-3 on
+e61-4 on
+e63-1 on
+e63-2 on
+e63-3 on
+e63-4 on
+e65-1 on
+e65-2 on
+e65-3 on
+e65-4 on
+e67-1 on
+e67-2 on
+e67-3 on
+e67-4 on
+e69-1 on
+e69-2 on
+e69-3 on
+e69-4 on
+e71-1 on
+e71-2 on
+e71-3 on
+e71-4 on
+e73-1 on
+e73-2 on
+e73-3 on
+e73-4 on
+e75-1 on
+e75-2 on
+e75-3 on
+e75-4 on
+e77-1 on
+e77-2 on
diff --git a/web/nms-public.gathering.org/led.txt b/web/nms-public.gathering.org/led.txt
new file mode 100644
index 0000000..42a189c
--- /dev/null
+++ b/web/nms-public.gathering.org/led.txt
@@ -0,0 +1,256 @@
+e65-4 off
+ap-e47-2 off
+ap-e15-1 off
+e11-4 off
+e69-1 off
+ap-e13-4 off
+ap-e11-3 off
+e23-2 off
+e41-2 off
+e65-1 off
+ap-e25-1 off
+e21-3 off
+e3-3 off
+e45-1 off
+ap-e59-4 off
+ap-e17-3 off
+ap-e69-3 off
+e45-2 off
+e25-2 off
+ap-e61-3 off
+e55-1 off
+ap-e49-2 off
+e5-3 off
+ap-e59-2 off
+e15-3 off
+ap-e49-1 off
+e67-4 off
+e21-1 off
+ap-e13-3 off
+ap-e59-1 off
+e27-1 off
+ap-e43-4 off
+ap-e37-1 off
+e7-3 off
+ap-e77-1 off
+ap-e43-3 off
+ap-e65-4 off
+ap-e23-2 off
+ap-e5-4 off
+e1-3 off
+e63-4 off
+ap-e19-3 off
+ap-e39-1 off
+e53-2 off
+e13-1 off
+ap-e13-1 off
+ap-e63-1 off
+ap-e55-3 off
+e65-2 off
+ap-e73-2 off
+ap-e71-4 off
+ap-e77-2 off
+ap-e63-4 off
+e25-3 off
+ap-e49-4 off
+ap-e43-1 off
+e63-2 off
+e19-2 off
+e61-4 off
+ap-e53-4 off
+e55-4 off
+ap-e69-4 off
+ap-e41-2 off
+e9-4 off
+e43-4 off
+ap-e47-4 off
+ap-e15-4 off
+ap-e17-1 off
+ap-e19-4 off
+ap-e37-2 off
+ap-e67-1 off
+e19-1 off
+ap-e23-1 off
+ap-e29-2 off
+e49-4 off
+ap-e7-3 off
+ap-e65-3 off
+e13-3 off
+e57-3 off
+ap-e25-3 off
+e23-3 off
+e37-2 off
+ap-e1-3 off
+ap-e75-2 off
+e47-4 off
+e21-4 off
+e33-1 off
+ap-e69-2 off
+ap-e17-2 off
+ap-e73-3 off
+ap-e71-3 off
+ap-e25-4 off
+ap-e45-3 off
+e69-2 off
+e13-2 off
+e51-1 off
+ap-e7-4 off
+ap-e9-3 off
+e19-4 off
+e17-4 off
+e61-2 off
+e57-2 off
+ap-e63-3 off
+ap-e45-2 off
+e67-1 off
+ap-e27-1 off
+e51-2 off
+e49-2 off
+ap-e19-1 off
+ap-e47-1 off
+e59-3 off
+ap-e25-2 off
+ap-e65-2 off
+e21-2 off
+e59-4 off
+e39-2 off
+ap-e3-4 off
+e19-3 off
+ap-e29-1 off
+e13-4 off
+ap-e35-1 off
+ap-e75-3 off
+e35-1 off
+ap-e13-2 off
+ap-e57-3 off
+ap-e73-4 off
+e71-2 off
+ap-e71-1 off
+ap-e75-1 off
+e71-1 off
+ap-e41-1 off
+ap-e57-4 off
+e23-1 off
+e77-1 off
+e69-3 off
+e29-1 off
+ap-e49-3 off
+ap-e45-1 off
+e59-1 off
+e73-3 off
+e53-1 off
+ap-e33-2 off
+ap-e47-3 off
+e17-1 off
+e31-1 off
+e55-3 off
+e17-3 off
+ap-e19-2 off
+ap-e61-1 off
+ap-e63-2 off
+ap-e21-3 off
+e75-1 off
+ap-e61-2 off
+ap-e55-1 off
+ap-e33-1 off
+e53-4 off
+e3-4 off
+ap-e9-4 off
+ap-e31-1 off
+e65-3 off
+e75-4 off
+ap-e15-2 off
+ap-e35-2 off
+e51-4 off
+ap-e55-4 off
+e51-3 off
+ap-e21-1 off
+e39-1 off
+e63-1 off
+ap-e57-1 off
+ap-e11-1 off
+e43-2 off
+e75-3 off
+e47-1 off
+e25-4 off
+e71-4 off
+e47-2 off
+e43-3 off
+ap-e15-3 off
+ap-e3-3 off
+ap-e75-4 off
+ap-e43-2 off
+e15-2 off
+ap-e67-3 off
+ap-e59-3 off
+e27-2 off
+e11-1 off
+ap-e23-3 off
+ap-e11-2 off
+ap-e51-2 off
+e55-2 off
+ap-e27-2 off
+ap-e53-2 off
+ap-e11-4 off
+e69-4 off
+e33-2 off
+ap-e57-2 off
+e11-3 off
+e57-1 off
+e37-1 off
+e11-2 off
+e53-3 off
+e67-2 off
+ap-e53-3 off
+e67-3 off
+ap-e71-2 off
+e57-4 off
+e73-4 off
+e73-1 off
+ap-e67-2 off
+e61-3 off
+e29-2 off
+ap-e67-4 off
+e15-1 off
+ap-e53-1 off
+ap-e55-2 off
+ap-e5-3 off
+ap-e51-1 off
+ap-e61-4 off
+ap-e45-4 off
+e35-2 off
+e61-1 off
+e49-1 off
+e43-1 off
+ap-e69-1 off
+ap-e39-2 off
+e45-3 off
+e23-4 off
+e73-2 off
+ap-e23-4 off
+ap-e31-2 off
+e71-3 off
+e15-4 off
+e17-2 off
+e45-4 off
+e47-3 off
+ap-e73-1 off
+e49-3 off
+e63-3 off
+ap-e21-2 off
+ap-e51-4 off
+e7-4 off
+e41-1 off
+ap-e17-4 off
+e1-4 off
+e5-4 off
+ap-e1-4 off
+e59-2 off
+ap-e51-3 off
+ap-e21-4 off
+e25-1 off
+e75-2 off
+e77-2 off
+e31-2 off
+e9-3 off
+ap-e65-1 off
diff --git a/web/nms-public.gathering.org/nettkart-dhcp.png b/web/nms-public.gathering.org/nettkart-dhcp.png
new file mode 100644
index 0000000..d9232de
--- /dev/null
+++ b/web/nms-public.gathering.org/nettkart-dhcp.png
Binary files differ
diff --git a/web/nms-public.gathering.org/nettkart-trafikk.html b/web/nms-public.gathering.org/nettkart-trafikk.html
new file mode 100644
index 0000000..5675473
--- /dev/null
+++ b/web/nms-public.gathering.org/nettkart-trafikk.html
@@ -0,0 +1,10 @@
+<html>
+ <head>
+ <title>nettkart</title>
+ <meta http-equiv="refresh" content="60">
+ </head>
+ <body>
+
+ <p><img src="nettkart-trafikk.png" /></p>
+ </body>
+</html>
diff --git a/web/nms-public.gathering.org/nettkart-trafikk.png b/web/nms-public.gathering.org/nettkart-trafikk.png
new file mode 100644
index 0000000..79661fc
--- /dev/null
+++ b/web/nms-public.gathering.org/nettkart-trafikk.png
Binary files differ
diff --git a/web/nms-public.gathering.org/trafikk.html b/web/nms-public.gathering.org/trafikk.html
new file mode 100644
index 0000000..ee417a8
--- /dev/null
+++ b/web/nms-public.gathering.org/trafikk.html
@@ -0,0 +1,10 @@
+<html>
+<head>
+<title>NMS Public - TRAFIKK KART - The Gathering 2013</title>
+<meta http-equiv="refresh" content="60;URL='/trafikk.html'">
+</head>
+<body>
+<img src="nettkart-trafikk.png" alt="TRAFIKK KART" />
+<p>Sist oppdatert: Sun, 31 Mar 2013 16:03:02 +0200
+</body>
+</html>
diff --git a/web/nms.gathering.org/apkart.pl b/web/nms.gathering.org/apkart.pl
new file mode 100755
index 0000000..a89cb68
--- /dev/null
+++ b/web/nms.gathering.org/apkart.pl
@@ -0,0 +1,89 @@
+#! /usr/bin/perl
+use CGI qw(fatalsToBrowser);
+use GD;
+use DBI;
+use lib '../../include';
+use nms;
+use strict;
+use warnings;
+my $cgi = CGI->new;
+
+#my $greentimeout = 7200;
+my $greentimeout = 15*60;
+my $maxtimeout = $greentimeout*9;
+
+my $dbh = nms::db_connect();
+
+GD::Image->trueColor(1);
+
+my $img = GD::Image->new('bg07.png');
+
+my $blk = $img->colorResolve(0, 0, 0);
+my $red = $img->colorResolve(255, 0, 0);
+my $grn = $img->colorResolve(0, 255, 0);
+my $blu = $img->colorResolve(0, 0, 255);
+
+# Her ska' det bættre skrivas STORT jah!
+my $title = new GD::Image(75,15);
+$img->alphaBlending(1);
+$title->alphaBlending(1);
+my $titlebg = $title->colorResolve(255, 255, 255);
+$title->fill(0,0,$titlebg);
+$title->transparent($titlebg);
+$title->string(gdGiantFont,7,0,"APEKART",$title->colorResolve(255, 0, 0));
+$img->copyResampled($title, 500, 0, 0, 0, 400, 100, 75, 15);
+$img->copyResampled($title, 500, 550, 0, 0, 400, 100, 75, 15);
+
+$img->string(gdMediumBoldFont,0,0,"Access points",$blk);
+$img->string(gdSmallFont,0,20,"Shows if a Cisco access point is plugged into the port",$blk);
+
+my %palette = ( 'notpolled' => $blu, 'missing' => $red, 'present' => $grn );
+
+my @states = qw(present missing notpolled);
+
+for my $i (0..$#states) {
+ my $y = 60 + 20 * (4 - $i);
+ $img->filledRectangle(20, $y, 30, $y + 10, $palette{$states[$i]});
+ $img->rectangle(20, $y, 30, $y + 10, $blk);
+ $img->stringFT($blk, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, 40, $y + 10, $states[$i]);
+}
+
+my $q = $dbh->prepare("select switch,sysname,model,last_poll < now() - '30 seconds'::interval as notpolled,placement from switches natural join placements natural join ap_poll order by zorder");
+$q->execute();
+while (my $ref = $q->fetchrow_hashref()) {
+ my $sysname = $ref->{'sysname'};
+ my $model = $ref->{'model'};
+ my $state;
+ if ($ref->{'notpolled'}) {
+ $state = 'notpolled';
+ } elsif ($model =~ /^cisco AIR-/) {
+ $state = 'present';
+ } else {
+ $state = 'missing';
+ $sysname .= " $model";
+ }
+ my $clr = $palette{$state};
+
+ $ref->{'placement'} =~ /\((\d+),(\d+)\),\((\d+),(\d+)\)/;
+ $img->filledRectangle($3,$4,$1,$2,$clr);
+ $img->rectangle($3,$4,$1,$2,$blk);
+
+ my ($x2, $y2, $x1, $y1) = ($1, $2, $3, $4);
+ my $max_textlen = ($x2-$x1) > ($y2-$y1) ? $x2-$x1 : $y2-$y1;
+ while (length($sysname) * 6 > $max_textlen) {
+ # Try to abbreviate sysname if it is too long for the box
+ $sysname =~ s/^(.*)[a-z]~?([0-9]+)$/$1~$2/ or last;
+ }
+ if (($x2-$x1) > ($y2-$y1)) {
+ $img->string(gdSmallFont,$x1+2,$y1,$sysname,$blk);
+ } else {
+ $img->stringUp(gdSmallFont,$x1,$y2-3,$sysname,$blk);
+ }
+}
+$dbh->disconnect;
+
+if (!defined($ARGV[0])) {
+ print $cgi->header(-type=>'image/png',
+ -refresh=>'10; ' . CGI::url());
+}
+print $img->png;
diff --git a/web/nms.gathering.org/bg07.png b/web/nms.gathering.org/bg07.png
new file mode 100644
index 0000000..ec54ad3
--- /dev/null
+++ b/web/nms.gathering.org/bg07.png
Binary files differ
diff --git a/web/nms.gathering.org/dhcpkart.pl b/web/nms.gathering.org/dhcpkart.pl
new file mode 100755
index 0000000..2af4272
--- /dev/null
+++ b/web/nms.gathering.org/dhcpkart.pl
@@ -0,0 +1,94 @@
+#! /usr/bin/perl
+use CGI qw(fatalsToBrowser);
+use GD;
+use DBI;
+use lib '../../include';
+use nms;
+my $cgi = CGI->new;
+
+#my $greentimeout = 7200;
+my $greentimeout = 15*60;
+my $maxtimeout = $greentimeout*9;
+
+my $dbh = nms::db_connect();
+
+GD::Image->trueColor(1);
+my $map = 'bg07.png';
+die "$map does not exist" unless -e $map;
+$img = GD::Image->new($map);
+
+my $blk = $img->colorResolve(0, 0, 0);
+
+$img->string(gdMediumBoldFont,0,0,"DHCP-lease status",$blk);
+$img->string(gdSmallFont,0,20,"Last received DHCP-request",$blk);
+
+# first 1/5: green (<30 min)
+# middle 3/5: yellow -> red (30 min - 6 hours)
+# last 1/5: blue (>6 hours)
+my $grn = $img->colorResolve(0, 255, 0);
+my $blu = $img->colorResolve(0, 0, 255);
+
+my $l1 = 42 + (236 - 42)/5;
+my $l2 = 236 - (236 - 42)/5;
+
+$img->filledRectangle(32, 42, 53, $l1, $grn);
+$img->string(gdSmallFont,56,$l1-8,($greentimeout/60)." min",$blk);
+
+$img->filledRectangle(32, $l2, 53, 237, $blu);
+$img->string(gdSmallFont,56,$l2-5,($maxtimeout/60)." min",$blk);
+
+for my $y ($l1..$l2) {
+ my $i = 1.0 - ($y - $l1) / ($l2 - $l1);
+ my $clr = get_color($i);
+
+ $img->filledRectangle(32,$y,53,$y+1,$clr);
+}
+
+my $q = $dbh->prepare('select switch,sysname,placement,EXTRACT(EPOCH FROM now() - last_ack) as age from switches natural join placements natural join dhcp order by sysname');
+$q->execute();
+while (my $ref = $q->fetchrow_hashref()) {
+ my $age = $ref->{'age'};
+ if (!defined($age) || $age > $maxtimeout) {
+ $clr = $img->colorResolve(0, 0, 255);
+ } elsif ($age < $greentimeout) {
+ $clr = $img->colorResolve(0, 255, 0);
+ } else {
+ # 30 minutes = 0.0
+ # 6 hours = 1.0
+
+ my $intensity = log($age / $greentimeout) / log($maxtimeout/$greentimeout);
+ $clr = get_color(1.0 - $intensity);
+ }
+
+ my $sysname = $ref->{'sysname'};
+ if ($sysname !~ m/d0/i) { # don't draw distro-switches
+ $ref->{'placement'} =~ /\((\d+),(\d+)\),\((\d+),(\d+)\)/;
+ $img->filledRectangle($3,$4,$1,$2,$clr);
+ $img->rectangle($3,$4,$1,$2,$blk);
+
+ my ($x2, $y2, $x1, $y1) = ($1, $2, $3, $4);
+ my $max_textlen = ($x2-$x1) > ($y2-$y1) ? $x2-$x1 : $y2-$y1;
+ while (length($sysname) * 6 > $max_textlen) {
+ # Try to abbreviate sysname if it is too long for the box
+ $sysname =~ s/^(.*)[a-z]~?([0-9]+)$/$1~$2/ or last;
+ }
+ if (($x2-$x1) > ($y2-$y1)) {
+ $img->string(gdSmallFont,$x1+2,$y1,$sysname,$blk);
+ } else {
+ $img->stringUp(gdSmallFont,$x1,$y2-3,$sysname,$blk);
+ }
+ }
+}
+$dbh->disconnect;
+
+if (!defined($ARGV[0])) {
+ print $cgi->header(-type=>'image/png',
+ -refresh=>'10; ' . CGI::url());
+}
+print $img->png;
+
+sub get_color {
+ my $intensity = shift;
+ my $gamma = 1.0/1.90;
+ return $img->colorResolve(255.0, 255.0 * ($intensity ** $gamma), 0);
+}
diff --git a/web/nms.gathering.org/index.html b/web/nms.gathering.org/index.html
new file mode 100644
index 0000000..2857377
--- /dev/null
+++ b/web/nms.gathering.org/index.html
@@ -0,0 +1,92 @@
+<html>
+ <head>
+ <title>snmp</title>
+ </head>
+ <body>
+ <p>tg light &amp; magic. :-)</p>
+
+ <ul>
+ <li><a href="dhcpkart.pl">DHCP-kart</a>
+ <br /><i>Oversikt over DHCP-lease etter switch</i>
+ </li>
+
+ <br />
+
+ <li><a href="nettkart-text.pl">Nettkart</a>
+ <br /><i>Trafikkoversikt</i>
+ </li>
+
+ <br />
+
+ <li><a href="nettkart-telnet.pl">Nettkart</a>
+ <br /><i>Trafikkoversikt /m telnetlink</i>
+ </li>
+
+ <br />
+<!-- Kun moderat nyttig når vi har disablet alle webinterfacene...
+ <li><a href="nettkart-web.pl">Nettkart</a>
+ <br /><i>Trafikkoversikt /m weblink</i>
+ </li>
+
+ <br />
+-->
+ <li><a href="portkart.pl">Nettkart, per port</a>
+ <br /><i>Trafikkoversikt per port</i>
+ </li>
+
+ <br />
+
+ <li><a href="uplinkkart.pl">Uplink-kart</a>
+ <br /><i>Hvilke switcher har ikke to uplinker</i>
+ </li>
+
+ <br />
+
+ <li><a href="uplinktrafikkart.pl">Uplink-trafikkart</a>
+ <br /><i>Hvem burde hatt mer enn to uplinker</i>
+ </li>
+
+ <br />
+
+ <li><a href="stromkart.pl">Strømkart</a>
+ <br /><i>Hvilke switcher har færre enn fem tilkoblede klienter</i>
+ </li>
+
+ <br />
+
+ <li><a href="apkart.pl">Aksesspunkt-kart</a>
+ <br /><i>Hvilke aksesspunkter er plugget i</i>
+ </li>
+
+ <br />
+
+ <!--<li><a href="overlay.pl">Overlay-nettkart</a>
+ <br /><i>Teh magic 3D!</i>
+ </li>
+
+ <br /> -->
+
+ <li><a href="smanagement.pl">Kommander switcher</a>
+ <br /><i>Konfigurer switchene</i>
+ </li>
+
+ <br />
+
+ <li><a href="sshow.pl">Utførte og køede kommandoer</a>
+ <br /><i>Se og håndter kommandoer som er utført og fortsatt i køen</i>
+ </li>
+
+ <br />
+
+ <!--<li><a href="stempmap.pl">Temperaturkart</a>
+ <br /><i>Temperaturkart for switchene</i>
+ </li>
+
+ <br /> -->
+
+ <li><a href="mbd-status.pl">MBD-status</a>
+ <br /><i>Hva spiller folk mest?</i>
+ </li>
+ </ul>
+ </body>
+</html>
diff --git a/web/nms.gathering.org/led.pl b/web/nms.gathering.org/led.pl
new file mode 100755
index 0000000..a05041d
--- /dev/null
+++ b/web/nms.gathering.org/led.pl
@@ -0,0 +1,20 @@
+#! /usr/bin/perl
+use CGI;
+use GD;
+use DBI;
+use lib '../../include';
+use nms;
+my $cgi = CGI->new;
+
+my $dbh = nms::db_connect();
+
+print $cgi->header(-type=>'text/plain', -expires=>'now');
+
+my $q = $dbh->prepare('select * from ( SELECT switch,sysname,sum(bytes_in) AS bytes_in,sum(bytes_out) AS bytes_out from switches natural left join get_current_datarate() group by switch,sysname) t1 natural join placements order by zorder;');
+$q->execute();
+while (my $ref = $q->fetchrow_hashref()) {
+ my $sysname = $ref->{'sysname'};
+ next unless $sysname =~ /e\d+-\d+/;
+ printf "%s %s\n", $sysname, (defined($ref->{'bytes_in'}) ? 'on' : 'off');
+}
+$dbh->disconnect;
diff --git a/web/nms.gathering.org/mbd-status.pl b/web/nms.gathering.org/mbd-status.pl
new file mode 100755
index 0000000..d37781f
--- /dev/null
+++ b/web/nms.gathering.org/mbd-status.pl
@@ -0,0 +1,44 @@
+#! /usr/bin/perl
+use CGI;
+use DBI;
+use lib '../../include';
+use nms;
+my $cgi = CGI->new;
+
+my $dbh = nms::db_connect();
+print $cgi->header(-type=>'text/html; charset=utf-8', -refresh=>'10; ' . CGI::url());
+
+print <<"EOF";
+<html>
+ <head>
+ <title>MBD status</title>
+ </head>
+ <body>
+ <h1>MBD status</h1>
+
+ <p>Spill søkt etter siste 15 minutter:</p>
+
+ <table>
+ <tr>
+ <th>Beskrivelse</th>
+ <th>Aktive servere</th>
+ </tr>
+EOF
+
+my $q = $dbh->prepare('select description,sum(active_servers) as active_servers from (select distinct on (game,port) * from mbd_log where ts >= now() - \'10 minutes\'::interval order by game,port,ts desc ) t1 group by description order by sum(active_servers) desc, description;');
+$q->execute();
+while (my $ref = $q->fetchrow_hashref()) {
+ print <<"EOF";
+ <tr>
+ <td>$ref->{'description'}</td>
+ <td>$ref->{'active_servers'}</td>
+ </tr>
+EOF
+}
+$dbh->disconnect;
+
+print <<"EOF";
+ </table>
+ </body>
+</html>
+EOF
diff --git a/web/nms.gathering.org/mygraph.pl b/web/nms.gathering.org/mygraph.pl
new file mode 100755
index 0000000..64104aa
--- /dev/null
+++ b/web/nms.gathering.org/mygraph.pl
@@ -0,0 +1,179 @@
+#! /usr/bin/perl -T
+use strict;
+use warnings;
+use GD;
+use POSIX;
+use Time::Zone;
+
+sub blendpx {
+ my ($gd, $x, $y, $r, $g, $b, $frac) = @_;
+ my ($ro, $go, $bo) = $gd->rgb($gd->getPixel($x, $y));
+
+ # workaround for icky 256-color graphs
+ # $frac = int($frac * 32) / 32;
+
+ my $rn = $ro * (1.0 - $frac) + $r * $frac;
+ my $gn = $go * (1.0 - $frac) + $g * $frac;
+ my $bn = $bo * (1.0 - $frac) + $b * $frac;
+
+ $gd->setPixel($x, $y, $gd->colorResolve($rn, $gn, $bn));
+}
+
+# Standard implementation of Wu's antialiased line algorithm.
+sub wuline {
+ my ($gd, $x1, $y1, $x2, $y2, $r, $g, $b, $a) = @_;
+ $x1 = POSIX::floor($x1);
+ $x2 = POSIX::floor($x2);
+ $y1 = POSIX::floor($y1);
+ $y2 = POSIX::floor($y2);
+
+ if (abs($x2 - $x1) > abs($y2 - $y1)) {
+ # x-directional
+ if ($y2 < $y1) {
+ ($x2, $y2, $x1, $y1) = ($x1, $y1, $x2, $y2);
+ }
+
+ my $y = POSIX::floor($y1);
+ my $frac = $y1 - $y;
+ my $dx = ($x2 > $x1) ? 1 : -1;
+ my $dy = ($y2 - $y1) / abs($x2 - $x1);
+
+ for (my $x = $x1; $x != $x2 + $dx; $x += $dx) {
+ blendpx($gd, $x, $y, $r, $g, $b, $a * (1.0 - $frac));
+ blendpx($gd, $x, $y + 1, $r, $g, $b, $a * $frac);
+ $frac += $dy;
+ if ($frac > 1) {
+ $frac -= 1;
+ ++$y;
+ }
+ }
+ } else {
+ # y-directional
+ if ($x2 < $x1) {
+ ($x2, $y2, $x1, $y1) = ($x1, $y1, $x2, $y2);
+ }
+ my $x = POSIX::floor($x1);
+ my $frac = $x1 - $x;
+ my $dy = ($y2 > $y1) ? 1 : -1;
+ my $dx = ($x2 - $x1) / abs($y2 - $y1);
+
+ for (my $y = $y1; $y != $y2 + $dy; $y += $dy) {
+ blendpx($gd, $x, $y, $r, $g, $b, $a * (1.0 - $frac));
+ blendpx($gd, $x + 1, $y, $r, $g, $b, $a * $frac);
+ $frac += $dx;
+ if ($frac > 1) {
+ $frac -= 1;
+ ++$x;
+ }
+ }
+ }
+}
+
+sub makegraph {
+ my $xoffset = 70;
+ my ($width, $height, $min_x, $max_x, $min_y, $max_y, $tickgran) = @_;
+
+ # Create our base graph
+ my $graph = new GD::Image($width, $height, 1);
+ my $white = $graph->colorAllocate(255, 255, 255);
+ my $gray = $graph->colorAllocate(230, 230, 255);
+ my $black = $graph->colorAllocate(0, 0, 0);
+
+# $graph->fill(0, 0, $white);
+ $graph->filledRectangle(0, 0, $width, $height, $white); # seems to work better
+
+ $::xs = ($width - ($xoffset+2)) / ($max_x - $min_x);
+ $::ys = ($height - 33) / ($min_y - $max_y);
+
+ # Hour marks
+ for my $i ($xoffset+1..$width-2) {
+ if (((($i-($xoffset+1)) / $::xs + $min_x) / 3600) % 2 == 1) {
+ $graph->line($i, 0, $i, $height - 1, $gray);
+ }
+ }
+
+ # Hour text
+ for my $i (0..23) {
+ my @bounds = GD::Image::stringFT(undef, $black, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, 0, 0, $i);
+ my $w = $bounds[2] - $bounds[0];
+
+ # Determine where the center of this will be
+ my $starthour = POSIX::fmod(($min_x + Time::Zone::tz_local_offset()) / 3600, 24);
+ my $diff = POSIX::fmod($i - $starthour + 24, 24);
+
+ my $center = ($diff * 3600 + 1800) * $::xs;
+
+ next if ($center - $w / 2 < 1 || $center + $w / 2 > $width - ($xoffset+2));
+ $graph->stringFT($black, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, $xoffset + $center - $w / 2, $height - 6, $i);
+ }
+
+ #
+ # Y lines; we want max 11 of them (zero-line, plus five on each side, or
+ # whatever) but we don't want the ticks to be on minimum 50 (or
+ # whatever $tickgran is set to). However, if there would be
+ # really really few lines, go down an order of magnitude and try
+ # again.
+ #
+ my $ytick;
+ do {
+ $ytick = ($max_y - $min_y) / 11;
+ $ytick = POSIX::ceil($ytick / $tickgran) * $tickgran;
+ $tickgran *= 0.1;
+ } while (($max_y - $min_y) / $ytick < 4);
+
+ for my $i (-11..11) {
+ my $y = ($i * $ytick - $max_y) * $::ys + 10;
+ next if ($y < 2 || $y > $height - 18);
+
+ if ($i == 0) {
+ wuline($graph, $xoffset, $y, $width - 1, $y, 0, 0, 0, 1.0);
+ wuline($graph, $xoffset, $y + 1, $width - 1, $y + 1, 0, 0, 0, 1.0);
+ } else {
+ wuline($graph, $xoffset, $y, $width - 1, $y, 0, 0, 0, 0.2);
+ }
+
+ # text
+ my $traf = 8 * ($i * $ytick);
+ my $text;
+ if ($traf >= 500_000_000) {
+ $text = (sprintf "%.1f Gbit", ($traf/1_000_000_000));
+ } elsif ($traf >= 500_000) {
+ $text = (sprintf "%.1f Mbit", ($traf/1_000_000));
+ } else {
+ $text = (sprintf "%.1f kbit", ($traf/1_000));
+ }
+
+ my @bounds = GD::Image::stringFT(undef, $black, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, 0, 0, $text);
+ my $w = $bounds[2] - $bounds[0];
+ my $h = $bounds[1] - $bounds[5];
+
+ next if ($y - $h/2 < 2 || $y + $h/2 > $height - 12);
+ $graph->stringFT($black, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, ($xoffset - 4) - $w, $y + $h/2, $text);
+ }
+
+ # Nice border(TM)
+ $graph->rectangle($xoffset, 0, $width - 1, $height - 1, $black);
+
+ return $graph;
+}
+
+sub plotseries {
+ my ($graph, $xvals, $yvals, $r, $g, $b, $min_x, $max_y) = @_;
+ my $xoffset = 70;
+
+ my @xvals = @{$xvals};
+ my @yvals = @{$yvals};
+
+ my $x = $xvals[0];
+ my $y = $yvals[0];
+ for my $i (1..$#xvals) {
+ next if ($::xs * ($xvals[$i] - $x) < 2 && $::ys * ($yvals[$i] - $y) > -2);
+
+ wuline($graph, ($x-$min_x) * $::xs + $xoffset + 1, ($y-$max_y) * $::ys + 10,
+ ($xvals[$i]-$min_x) * $::xs + $xoffset + 1, ($yvals[$i]-$max_y) * $::ys + 10, $r, $g, $b, 1.0);
+ $x = $xvals[$i];
+ $y = $yvals[$i];
+ }
+}
+
+1;
diff --git a/web/nms.gathering.org/nettkart-continuous.html b/web/nms.gathering.org/nettkart-continuous.html
new file mode 100644
index 0000000..e51eea0
--- /dev/null
+++ b/web/nms.gathering.org/nettkart-continuous.html
@@ -0,0 +1,31 @@
+<html>
+ <body>
+ <div id="d"></div>
+ <script type="text/javascript">
+ <!--
+ var existing_img = null;
+
+ function load_new() {
+ var i = document.createElement('img');
+ i.onload = function() { loaded(i); };
+ i.style.display = 'none';
+ i.src = '/nettkart.pl?random=' + (new Date()).getTime();
+ document.getElementById('d').appendChild(i);
+ }
+
+ function loaded(i) {
+ i.style.display = '';
+
+ if (existing_img) {
+ existing_img.parentElement.removeChild(existing_img);
+ }
+ existing_img = i;
+
+ setTimeout(function() { load_new(); }, 10000);
+ }
+
+ load_new();
+ -->
+ </script>
+ </body>
+</html>
diff --git a/web/nms.gathering.org/nettkart-telnet.pl b/web/nms.gathering.org/nettkart-telnet.pl
new file mode 100755
index 0000000..57cac19
--- /dev/null
+++ b/web/nms.gathering.org/nettkart-telnet.pl
@@ -0,0 +1,47 @@
+#! /usr/bin/perl
+use CGI;
+use DBI;
+use lib '../../include';
+use nms;
+my $cgi = CGI->new;
+
+my $dbh = nms::db_connect();
+print $cgi->header(-type=>'text/html; charset=utf-8', -refresh=>'45; ' . CGI::url());
+
+print <<"EOF";
+<html>
+ <head>
+ <title>nettkart - telnet</title>
+ </head>
+ <body>
+ <map name="switches">
+EOF
+
+my $q = $dbh->prepare("select * from switches natural join placements where ip <> inet '127.0.0.1'");
+$q->execute();
+while (my $ref = $q->fetchrow_hashref()) {
+ $ref->{'placement'} =~ /\((\d+),(\d+)\),\((\d+),(\d+)\)/;
+
+ my $traffic = 4.0 * $ref->{'bytes_in'} + $ref->{'bytes_out'}; # average and convert to bits (should be about the same in practice)
+ my $ttext;
+ if ($traffic >= 1_000_000_000) {
+ $ttext = sprintf "%.2f Gbit/port/sec", $traffic/1_000_000_000;
+ } elsif ($traffic => 1_000_000) {
+ $ttext = sprintf "%.2f Mbit/port/sec", $traffic/1_000_000;
+ } else {
+ $ttext = sprintf "%.2f kbit/port/sec", $traffic/1_000;
+ }
+
+ printf " <area shape=\"rect\" coords=\"%u,%u,%u,%u\" target=\"blank\" href=\"telnet://$ref->{'ip'}\" alt=\"%s (%s)\" onmouseover=\"window.status='%s (%s)'; return true\" onmouseout=\"window.status=''\" />\n",
+ $3, $4, $1, $2, $ref->{'switch'}, $ref->{'sysname'},
+ $ttext, $ref->{'sysname'}, $ttext;
+}
+$dbh->disconnect;
+
+print <<"EOF";
+ </map>
+
+ <p><img src="nettkart.pl" usemap="#switches" /></p>
+ </body>
+</html>
+EOF
diff --git a/web/nms.gathering.org/nettkart-text.pl b/web/nms.gathering.org/nettkart-text.pl
new file mode 100755
index 0000000..d3f4be7
--- /dev/null
+++ b/web/nms.gathering.org/nettkart-text.pl
@@ -0,0 +1,47 @@
+#! /usr/bin/perl
+use CGI;
+use DBI;
+use lib '../../include';
+use nms;
+my $cgi = CGI->new;
+
+my $dbh = nms::db_connect();
+print $cgi->header(-type=>'text/html; charset=utf-8', -refresh=>'10; ' . CGI::url());
+
+print <<"EOF";
+<html>
+ <head>
+ <title>nettkart</title>
+ </head>
+ <body>
+ <map name="switches">
+EOF
+
+my $q = $dbh->prepare("select * from switches natural join placements where ip <> inet '127.0.0.1'");
+$q->execute();
+while (my $ref = $q->fetchrow_hashref()) {
+ $ref->{'placement'} =~ /\((\d+),(\d+)\),\((\d+),(\d+)\)/;
+
+ my $traffic = 4.0 * $ref->{'bytes_in'} + $ref->{'bytes_out'}; # average and convert to bits (should be about the same in practice)
+ my $ttext;
+ if ($traffic >= 1_000_000_000) {
+ $ttext = sprintf "%.2f Gbit/port/sec", $traffic/1_000_000_000;
+ } elsif ($traffic => 1_000_000) {
+ $ttext = sprintf "%.2f Mbit/port/sec", $traffic/1_000_000;
+ } else {
+ $ttext = sprintf "%.2f kbit/port/sec", $traffic/1_000;
+ }
+
+ printf " <area shape=\"rect\" coords=\"%u,%u,%u,%u\" href=\"showswitch.pl?id=%u\" alt=\"%s (%s)\" onmouseover=\"window.status='%s (%s)'; return true\" onmouseout=\"window.status=''\" />\n",
+ $3, $4, $1, $2, $ref->{'switch'}, $ref->{'sysname'},
+ $ttext, $ref->{'sysname'}, $ttext;
+}
+$dbh->disconnect;
+
+print <<"EOF";
+ </map>
+
+ <p><img src="nettkart.pl" usemap="#switches" /></p>
+ </body>
+</html>
+EOF
diff --git a/web/nms.gathering.org/nettkart-web.pl b/web/nms.gathering.org/nettkart-web.pl
new file mode 100755
index 0000000..ce76c35
--- /dev/null
+++ b/web/nms.gathering.org/nettkart-web.pl
@@ -0,0 +1,47 @@
+#! /usr/bin/perl
+use CGI;
+use DBI;
+use lib '../../include';
+use nms;
+my $cgi = CGI->new;
+
+my $dbh = nms::db_connect();
+print $cgi->header(-type=>'text/html; charset=utf-8', -refresh=>'45; ' . CGI::url());
+
+print <<"EOF";
+<html>
+ <head>
+ <title>nettkart - web</title>
+ </head>
+ <body>
+ <map name="switches">
+EOF
+
+my $q = $dbh->prepare("select * from switches natural join placements where ip <> inet '127.0.0.1'");
+$q->execute();
+while (my $ref = $q->fetchrow_hashref()) {
+ $ref->{'placement'} =~ /\((\d+),(\d+)\),\((\d+),(\d+)\)/;
+
+ my $traffic = 4.0 * $ref->{'bytes_in'} + $ref->{'bytes_out'}; # average and convert to bits (should be about the same in practice)
+ my $ttext;
+ if ($traffic >= 1_000_000_000) {
+ $ttext = sprintf "%.2f Gbit/port/sec", $traffic/1_000_000_000;
+ } elsif ($traffic => 1_000_000) {
+ $ttext = sprintf "%.2f Mbit/port/sec", $traffic/1_000_000;
+ } else {
+ $ttext = sprintf "%.2f kbit/port/sec", $traffic/1_000;
+ }
+
+ printf " <area shape=\"rect\" coords=\"%u,%u,%u,%u\" href=\"http://$ref->{'ip'}\" alt=\"%s (%s)\" onmouseover=\"window.status='%s (%s)'; return true\" onmouseout=\"window.status=''\" />\n",
+ $3, $4, $1, $2, $ref->{'switch'}, $ref->{'sysname'},
+ $ttext, $ref->{'sysname'}, $ttext;
+}
+$dbh->disconnect;
+
+print <<"EOF";
+ </map>
+
+ <p><img src="nettkart.pl" usemap="#switches" /></p>
+ </body>
+</html>
+EOF
diff --git a/web/nms.gathering.org/nettkart.pl b/web/nms.gathering.org/nettkart.pl
new file mode 100755
index 0000000..b9517f8
--- /dev/null
+++ b/web/nms.gathering.org/nettkart.pl
@@ -0,0 +1,142 @@
+#! /usr/bin/perl
+use CGI;
+use GD;
+use Image::Magick;
+use DBI;
+use lib '../../include';
+use nms;
+my $cgi = CGI->new;
+
+# Sekrit night-mode
+my $night = defined($cgi->param('night'));
+
+my $dbh = nms::db_connect();
+
+GD::Image->trueColor(1);
+my ($img, $text_img);
+
+my $img = GD::Image->new('bg07.png');
+if ($night) {
+ my ($width, $height) = ($img->width, $img->height);
+
+ $img = GD::Image->new($width, $height, 1);
+ $img->alphaBlending(0);
+ $img->saveAlpha(1);
+ my $blank = $img->colorAllocateAlpha(0, 0, 0, 127);
+ $img->filledRectangle(0, 0, $img->width - 1, $img->height - 1, $blank);
+
+ $text_img = GD::Image->new($width, $height, 1);
+ $text_img->alphaBlending(0);
+ $text_img->saveAlpha(1);
+ my $blank = $text_img->colorAllocateAlpha(0, 0, 0, 127);
+ $text_img->filledRectangle(0, 0, $text_img->width - 1, $text_img->height - 1, $blank);
+} else {
+ $img = GD::Image->new('bg07.png');
+ $text_img = $img;
+}
+
+my $blk = $img->colorResolve(0, 0, 0);
+
+for my $y (42..236) {
+ my $i = 4.0 * ($y - 236.0) / (42.0 - 237.0);
+ my $clr = get_color($i);
+
+ $img->filledRectangle(12, $y, 33, $y+1, $clr);
+ $text_img->filledRectangle(12, $y, 33, $y+1, $clr);
+}
+
+$text_img->rectangle(12,42,33,236,$blk);
+
+my $tclr = $night ? $text_img->colorResolve(255, 255, 255) : $blk;
+$text_img->stringFT($tclr, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, 40, 47 + (236-42)*0.0/4.0, "100 Gbit/sec");
+$text_img->stringFT($tclr, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, 40, 47 + (236-42)*1.0/4.0, "10 Gbit/sec");
+$text_img->stringFT($tclr, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, 40, 47 + (236-42)*2.0/4.0, "1 Gbit/sec");
+$text_img->stringFT($tclr, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, 40, 47 + (236-42)*3.0/4.0, "100 Mbit/sec");
+$text_img->stringFT($tclr, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, 40, 47 + (236-42)*4.0/4.0, "10 Mbit/sec");
+$text_img->stringFT($tclr, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, 1000, 700, "NMS (C) 2005-2012 Tech:Server");
+
+my $q = $dbh->prepare("select * from ( SELECT switch,sysname,sum(bytes_in) AS bytes_in,sum(bytes_out) AS bytes_out from switches natural left join get_current_datarate() where ip <> inet '127.0.0.1' group by switch,sysname) t1 natural join placements order by zorder;");
+$q->execute();
+while (my $ref = $q->fetchrow_hashref()) {
+
+ # for now:
+ # 10Mbit/switch = green
+ # 100Mbit/switch = yellow
+ # 1Gbit/switch = red
+ # 10Gbit/switch = white
+
+ my $clr;
+
+ if (defined($ref->{'bytes_in'})) {
+ my $intensity = 0.0;
+ my $traffic = 4.0 * ($ref->{'bytes_in'} + $ref->{'bytes_out'}); # average and convert to bits (should be about the same in practice)
+
+ my $max = 100_000_000_000.0; # 100Gbit
+ my $min = 10_000_000.0; # 10Mbit
+ if ($traffic >= $min) {
+ $intensity = log($traffic / $min) / log(10);
+ $intensity = 4.0 if ($intensity > 4.0);
+ }
+ $clr = get_color($intensity);
+ } else {
+ $clr = $img->colorResolve(0, 0, 255);
+ }
+
+ my $sysname = $ref->{'sysname'};
+ $sysname =~ s/-sekrit//;
+
+ $ref->{'placement'} =~ /\((\d+),(\d+)\),\((\d+),(\d+)\)/;
+ $img->filledRectangle($3,$4,$1,$2,$clr);
+ $text_img->filledRectangle($3,$4,$1,$2,$clr);
+
+ $img->rectangle($3,$4,$1,$2,$blk);
+ $text_img->rectangle($3,$4,$1,$2,$blk);
+ my ($x2, $y2, $x1, $y1) = ($1, $2, $3, $4);
+ my $max_textlen = ($x2-$x1) > ($y2-$y1) ? $x2-$x1 : $y2-$y1;
+ while (length($sysname) * 6 > $max_textlen) {
+ # Try to abbreviate sysname if it is too long for the box
+ $sysname =~ s/^(.*)[a-z]~?([0-9]+)$/$1~$2/ or last;
+ }
+ if (($x2-$x1) > ($y2-$y1)) {
+ $text_img->string(gdSmallFont,$x1+2,$y1,$sysname,$blk);
+ } else {
+ $text_img->stringUp(gdSmallFont,$x1,$y2-3,$sysname,$blk);
+ }
+}
+$dbh->disconnect;
+
+print $cgi->header(-type=>'image/png', -expires=>'now');
+if ($night) {
+ my $magick = Image::Magick->new;
+ $magick->BlobToImage($img->png);
+ $magick->Blur(sigma=>10.0, channel=>'All');
+ $magick->Gamma(gamma=>1.90);
+
+ my $m2 = Image::Magick->new;
+ $m2->Read('bg07.png');
+ $m2->Negate();
+ $m2->Composite(image=>$magick, compose=>'Atop');
+
+ my $m3 = Image::Magick->new;
+ $m3->BlobToImage($text_img->png);
+ $m2->Composite(image=>$m3, compose=>'Atop');
+
+ $img = $m2->ImageToBlob();
+ print $img;
+} else {
+ print $img->png;
+}
+
+sub get_color {
+ my $intensity = shift;
+ my $gamma = 1.0/1.90;
+ if ($intensity > 3.0) {
+ return $img->colorResolve(255.0 * ((4.0 - $intensity) ** $gamma), 255.0 * ((4.0 - $intensity) ** $gamma), 255.0 * ((4.0 - $intensity) ** $gamma));
+ } elsif ($intensity > 2.0) {
+ return $img->colorResolve(255.0, 255.0 * (($intensity - 2.0) ** $gamma), 255.0 * (($intensity - 2.0) ** $gamma));
+ } elsif ($intensity > 1.0) {
+ return $img->colorResolve(255.0, 255.0 * ((2.0 - $intensity) ** $gamma), 0);
+ } else {
+ return $img->colorResolve(255.0 * ($intensity ** $gamma), 255, 0);
+ }
+}
diff --git a/web/nms.gathering.org/portkart.pl b/web/nms.gathering.org/portkart.pl
new file mode 100755
index 0000000..1269173
--- /dev/null
+++ b/web/nms.gathering.org/portkart.pl
@@ -0,0 +1,82 @@
+#! /usr/bin/perl
+use CGI;
+use GD;
+use DBI;
+use lib '../../include';
+use nms;
+my $cgi = CGI->new;
+
+my $dbh = nms::db_connect();
+
+GD::Image->trueColor(1);
+$img = GD::Image->new('bg07.png');
+
+my $blk = $img->colorResolve(0, 0, 0);
+
+for my $y (42..236) {
+ my $i = 3.0 * ($y - 236.0) / (42.0 - 237.0);
+ my $clr = get_color($i);
+
+ $img->filledRectangle(12,$y,33,$y+1,$clr);
+}
+
+$img->stringFT($blk, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, 40, 47 + (236-42)*0.0/3.0, "1 Gbit/sec");
+$img->stringFT($blk, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, 40, 47 + (236-42)*1.0/3.0, "100 Mbit/sec");
+$img->stringFT($blk, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, 40, 47 + (236-42)*2.0/3.0, "10 Mbit/sec");
+$img->stringFT($blk, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, 40, 47 + (236-42)*3.0/3.0, "1 Mbit/sec");
+$img->stringFT($blk, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, 1000, 620, "NMS (C) 2005-2007 Tech:Server");
+
+my $q = $dbh->prepare('select switch,port,bytes_in,bytes_out,placement,switchtype from switches natural join placements natural join get_datarate() where switchtype like \'%3100%\'');
+$q->execute();
+while (my $ref = $q->fetchrow_hashref()) {
+
+ # for now:
+ # 100kbit/port = all green
+ # 1gbit/port = all red
+
+ my $clr;
+
+ if (defined($ref->{'bytes_in'})) {
+ my $intensity = 0.0;
+ my $traffic = 4.0 * ($ref->{'bytes_in'} + $ref->{'bytes_out'}); # average and convert to bits (should be about the same in practice)
+
+ my $max = 100_000_000_000.0; # 1Gbit
+ my $min = 1_000_000.0; # 1Mbit
+ if ($traffic >= $min) {
+ $intensity = log($traffic / $min) / log(10);
+ $intensity = 4.0 if ($intensity > 4.0);
+ }
+ $clr = get_color($intensity);
+ } else {
+ $clr = $img->colorResolve(0, 0, 255);
+ }
+
+ $ref->{'placement'} =~ /\((\d+),(\d+)\),\((\d+),(\d+)\)/;
+ my $npo = 48;
+ my $f = ($ref->{'port'} - 1) % 2;
+ my $po = ($ref->{'port'} - 1 - $f)/2;
+ my $h = 2*($2-$4)/$npo;
+ my $w = ($1-$3)/2;
+
+ $img->filledRectangle($3+$w*$f,$4+$po*$h,$3+$w+$w*$f,$4+$h*($po+1),$clr);
+# $img->rectangle($3+$w*$f,$4+$po*$h,$3+$w+$w*$f,$4+$h*($po+1),$blk);
+ $img->rectangle($3,$4,$1,$2,$blk);
+}
+$dbh->disconnect;
+
+print $cgi->header(-type=>'image/png');
+print $img->png;
+
+sub get_color {
+ my $intensity = shift;
+ my $gamma = 1.0/1.90;
+ if ($intensity > 3.0) {
+ return $img->colorResolve(255.0 * ((4.0 - $intensity) ** $gamma), 255.0 * ((4.0 - $intensity) ** $gamma), 255.0 * ((4.0 - $intensity) ** $gamma));
+ } elsif ($intensity > 2.0) {
+ return $img->colorResolve(255.0, 255.0 * (($intensity - 2.0) ** $gamma), 255.0 * (($intensity - 2.0) ** $gamma));
+ } elsif ($intensity > 1.0) {
+ return $img->colorResolve(255.0, 255.0 * ((2.0 - $intensity) ** $gamma), 0);
+ } else {
+ return $img->colorResolve(255.0 * ($intensity ** $gamma), 255, 0);
+ }
+}
diff --git a/web/nms.gathering.org/showswitch.pl b/web/nms.gathering.org/showswitch.pl
new file mode 100755
index 0000000..5ed0029
--- /dev/null
+++ b/web/nms.gathering.org/showswitch.pl
@@ -0,0 +1,221 @@
+#! /usr/bin/perl
+use CGI;
+use DBI;
+use Time::HiRes;
+use POSIX ":sys_wait_h";
+use strict;
+use warnings;
+use lib '../../include';
+use nms;
+my $cgi = CGI->new;
+my $switch = $cgi->param('id');
+my $width = $cgi->param('width');
+my $height = $cgi->param('height');
+my @pids = ();
+my $resthtml = "";
+
+$width = 500 unless (defined($width));
+$height = 250 unless (defined($height));
+
+require './mygraph.pl';
+
+my $start = [Time::HiRes::gettimeofday];
+my $dbh = nms::db_connect();
+
+# Fetch the name
+my $ref = $dbh->selectrow_hashref('SELECT sysname FROM switches WHERE switch=?', undef, $switch);
+
+print $cgi->header(-type=>'text/html; charset=utf-8');
+print <<"EOF";
+<html>
+ <head>
+ <title>snmp</title>
+ </head>
+ <body>
+ <h1>Switch $switch ($ref->{'sysname'})</h1>
+EOF
+
+my $q = $dbh->prepare('select port,coalesce(description, \'Port \' || port) as description,extract(epoch from time) as time,bytes_in,bytes_out from switches natural left join portnames natural join polls where time between now() - \'1 day\'::interval and now() and switch=? order by switch,port,time;') or die $dbh->errstr;
+$q->execute($switch) or die $dbh->errstr;
+
+my (@totx, @toty1, @toty2) = ();
+
+my (@x, @y1, @y2) = ();
+my $last_port = -1;
+my $portname = "";
+my $min_x = time;
+my $max_x = time - 86400;
+my ($min_y, $max_y, $prev_time, $prev_in, $prev_out);
+my ($if,$of,$ifv,$ofv);
+my $idx;
+my ($min_ty,$max_ty) = (0, 10_000_000/8);
+
+$prev_time = -1;
+my $last_totx;
+while (my $ref = $q->fetchrow_hashref()) {
+ my $time = $ref->{'time'};
+ my $in = $ref->{'bytes_in'};
+ my $out = $ref->{'bytes_out'};
+ next if ($time == $prev_time);
+
+ if ($ref->{'port'} != $last_port) {
+ if ($last_port != -1) {
+ my $filename = "$switch-$last_port-$width-$height.png";
+
+ # reap children
+ waitpid(-1, WNOHANG);
+
+ my $pid = fork();
+ if ($pid == 0) {
+# write out the graph
+ my $graph = makegraph($width, $height, $min_x, $max_x, $min_y, $max_y, 5);
+ plotseries($graph, \@x, \@y1, 255, 0, 0, $min_x, $max_y);
+ plotseries($graph, \@x, \@y2, 0, 0, 255, $min_x, $max_y);
+
+ open GRAPH, ">img/$filename"
+ or die "img/$filename: $!";
+ print GRAPH $graph->png;
+ close GRAPH;
+ exit;
+ }
+
+ push @pids, $pid;
+
+ $resthtml .= "<div style=\"float: left;\"><h2>$portname</h2>\n";
+ $resthtml .= "<p><img src=\"img/$filename\" width=\"$width\" height=\"$height\" /></p></div>\n";
+ }
+
+ # Reset all the variables
+ @x = ();
+ @y1 = ();
+ @y2 = ();
+ ($min_y,$max_y) = (0, 10_000_000/8);
+ $prev_time = $ref->{'time'};
+ $prev_in = $ref->{'bytes_in'};
+ $prev_out = $ref->{'bytes_out'};
+ $last_port = $ref->{'port'};
+ $portname = $ref->{'description'};
+ ($if,$of,$ifv,$ofv) = (0,0,0,0);
+ ($prev_time,$prev_in,$prev_out) = ($time,$in,$out);
+ $idx = 0;
+ $last_totx = undef;
+ next;
+ }
+
+ # Assume overflow (unless the switch has been down for >10 minutes)
+ my ($calc_in, $calc_out) = ($in, $out);
+ if ($in < $prev_in || $out < $prev_out) {
+ if ($prev_in < 4294967296 && $prev_out < 4294967296) {
+ # ick, heuristics
+ if ($prev_time - $time > 600 || ($in + 4294967296 - $prev_in) > 2147483648 || ($out + 4294967296 - $prev_out) > 2147483648) {
+ ($prev_time,$prev_in,$prev_out) = ($time,$in,$out);
+ next;
+ }
+
+ $calc_in += 4294967296 if ($in < $prev_in);
+ $calc_out += 4294967296 if ($out < $prev_out);
+ } else {
+ $prev_in = 0;
+ $prev_out = 0;
+ }
+ }
+
+ # Remove dupes
+ if ($in == $prev_in && $out == $prev_out) {
+ ($prev_time,$prev_in,$prev_out) = ($time,$in,$out);
+ next;
+ }
+
+ # Find the current flow
+ my $if = ($calc_in - $prev_in) / ($time - $prev_time);
+ my $of = ($calc_out - $prev_out) / ($time - $prev_time);
+
+ # Summarize (we don't care about the summed variance for now)
+ $min_x = $time if (!defined($min_x) || $time < $min_x);
+ $max_x = $time if (!defined($max_x) || $time > $max_x);
+ $min_y = $if if (!defined($min_y) || $if < $min_y);
+ $min_y = $of if ($of < $min_y);
+ $max_y = $if if (!defined($max_y) || $if > $max_y);
+ $max_y = $of if ($of > $max_y);
+
+ my $pt = 0.5 * ($time + $prev_time);
+
+ push @x, $pt;
+ push @y1, $if;
+ push @y2, $of;
+
+ while ($idx < $#totx && $pt > $totx[$idx]) {
+ ++$idx;
+ }
+ if ($idx >= $#totx) {
+ push @totx, $pt;
+ push @toty1, $if;
+ push @toty2, $of;
+ ++$idx;
+
+ $min_ty = $if if (!defined($min_ty) || $if < $min_ty);
+ $min_ty = $of if ($of < $min_ty);
+ $max_ty = $if if (!defined($max_ty) || $if > $max_ty);
+ $max_ty = $of if ($of > $max_ty);
+ } else {
+ if (!defined($last_totx) || $last_totx != $idx) {
+ $toty1[$idx] += $if;
+ $toty2[$idx] += $of;
+ }
+ $last_totx = $idx;
+
+ $min_ty = $toty1[$idx] if (!defined($min_ty) || $toty1[$idx] < $min_ty);
+ $min_ty = $toty2[$idx] if ($toty2[$idx] < $min_ty);
+ $max_ty = $toty1[$idx] if (!defined($max_ty) || $toty1[$idx] > $max_ty);
+ $max_ty = $toty2[$idx] if ($toty2[$idx] > $max_ty);
+ }
+
+ ($prev_time,$prev_in,$prev_out) = ($time,$in,$out);
+}
+$dbh->disconnect;
+
+# last graph
+my $filename = "$switch-$last_port-$width-$height.png";
+
+my $pid = fork();
+if ($pid == 0) {
+ my $graph = makegraph($width, $height, $min_x, $max_x, $min_y, $max_y, 5);
+ plotseries($graph, \@x, \@y1, 255, 0, 0, $min_x, $max_y);
+ plotseries($graph, \@x, \@y2, 0, 0, 255, $min_x, $max_y);
+
+ open GRAPH, ">img/$filename"
+ or die "img/$filename: $!";
+ print GRAPH $graph->png;
+ close GRAPH;
+ exit;
+}
+
+push @pids, $pid;
+
+$resthtml .= "<div style=\"float: left;\"><h2>$portname</h2>\n";
+$resthtml .= "<p><img src=\"img/$filename\" width=\"$width\" height=\"$height\" /></p></div>\n";
+
+# total graph
+my $graph = makegraph($width, $height, $min_x, $max_x, $min_ty, $max_ty, 5);
+plotseries($graph, \@totx, \@toty1, 255, 0, 0, $min_x, $max_ty);
+plotseries($graph, \@totx, \@toty2, 0, 0, 255, $min_x, $max_ty);
+
+$filename = "$switch-$width-$height.png";
+open GRAPH, ">img/$filename" or die "img/$filename: $!";
+print GRAPH $graph->png;
+close GRAPH;
+
+
+# Wait for all the other graphs to be done
+while (waitpid(-1, 0) != -1) {
+ 1;
+}
+
+print $resthtml;
+
+print "<div style=\"float: left;\"><h2>Total</h2>\n";
+print "<p><img src=\"img/$filename\" width=\"$width\" height=\"$height\" /></p></div>\n";
+
+my $elapsed = Time::HiRes::tv_interval($start);
+printf "<p style=\"clear: both;\">Page and all graphs generated in %.2f seconds.</p>\n", $elapsed;
+print "</body>\n</html>\n";
diff --git a/web/nms.gathering.org/slide.html b/web/nms.gathering.org/slide.html
new file mode 100644
index 0000000..046020d
--- /dev/null
+++ b/web/nms.gathering.org/slide.html
@@ -0,0 +1,38 @@
+<!doctype html>
+<html>
+ <body>
+ <iframe id="tgview" style="border: 0; width: 1536px; height: 864px"></iframe>
+
+ <script>
+ (function() {
+ var urls = [
+ 'http://onlineclock.net/',
+ 'http://nms.tg13.gathering.org/dhcpkart.pl',
+ 'http://nms.tg13.gathering.org/nettkart-text.pl',
+ 'http://nms.tg13.gathering.org/nettkart-text.pl',
+ 'http://nms.tg13.gathering.org/uplinkkart.pl',
+ 'http://nms.tg13.gathering.org/uplinktrafikkart.pl',
+ 'http://nms.tg13.gathering.org/apkart.pl',
+ 'http://stats.tg13.gathering.org/'
+ ];
+
+ var view = document.getElementById('tgview');
+ var fload = function( frame, url ) {
+ frame.src = url;
+ };
+
+ var i = 0;
+ (function rotation() {
+ //if ( i != l-1 ) {
+ if ( i != urls.length-1 ) {
+ i++
+ } else {
+ i = 0;
+ }
+ fload( view, urls[i] );
+ setTimeout( arguments.callee, 10000 );
+ })();
+ })();
+ </script>
+ </body>
+</html>
diff --git a/web/nms.gathering.org/smanagement.pl b/web/nms.gathering.org/smanagement.pl
new file mode 100755
index 0000000..c01c52d
--- /dev/null
+++ b/web/nms.gathering.org/smanagement.pl
@@ -0,0 +1,239 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+use CGI;
+use DBI;
+use Data::Dumper;
+use Switch;
+use lib '../../include';
+use nms;
+
+# Grab from .htaccess-authentication
+my $user = $ENV{'REMOTE_USER'};
+
+my $dbh = nms::db_connect();
+$dbh->{AutoCommit} = 0;
+
+# Ugly casting, found no other way
+my $sinsert = $dbh->prepare( "INSERT INTO squeue
+ (gid, added, priority, addr, sysname, cmd, author)
+ VALUES(?::text::int, timeofday()::timestamptz, ?::text::int, ?::text::inet, ?, ?, ?)")
+ or die "Could not prepare sinsert";
+my $sgetip = $dbh->prepare("SELECT ip FROM switches WHERE sysname = ?")
+ or die "Could not prepare sgetip";
+my $sgid = $dbh->prepare("SELECT nextval('squeue_group_sequence') as gid");
+my $all_switches = $dbh->prepare("SELECT sysname FROM switches ORDER BY sysname");
+
+sub parse_range($) {
+ my $switches = $_;
+ my @range;
+
+ my @rangecomma = split(/\s*,\s*/, $switches);
+ foreach (@rangecomma) {
+ my ($first, $last) = $_ =~ /(e\d+\-(?:sw)?[123456])\s*\-\s*(e\d+\-(?:sw)?[123456])?/;
+ if (!defined($first) && $_ =~ /e\d+\-(sw)?[123456]/) {
+ $first = $_;
+ }
+ if (!defined($first)) {
+ print "<font color=\"red\">Parse error in: $_</font><br>\n";
+ next;
+ }
+ my ($rowstart, $placestart) = $first =~ /e(\d+)\-(?:sw)?([123456])/;
+ if (!defined($rowstart) || !defined($placestart)) {
+ print "<font color=\"red\">Parse error in: $_</font><br>\n";
+ next;
+ }
+ my ($rowend, $placeend);
+ if (!defined($last)) {
+ $rowend = $rowstart;
+ $placeend = $placestart;
+ }
+ else {
+ ($rowend, $placeend) = $last =~ /e(\d+)\-(?:sw)?([123456])/;
+ }
+ if (!defined($rowend) || !defined($placeend)) {
+ print "<font color=\"red\">Parse error in: $_</font><br>\n";
+ next;
+ }
+ #print "e $rowstart - $placestart to e $rowend - $placeend <br>\n";
+ for (my $i = $rowstart; $i <= $rowend; $i++) {
+ my $dostart;
+ if ($rowstart != $i) {
+ $dostart = 1;
+ }
+ else {
+ $dostart = $placestart;
+ }
+ for (my $j = $dostart; $j <= 6; $j++) {
+ last if ($i == $rowend && $j > $placeend);
+ push(@range, "e$i-$j");
+ }
+ }
+ }
+# foreach (@range) {
+# print ":: $_<br>\n";
+# }
+ return @range;
+}
+
+sub get_addr_from_switchnum($) {
+ my ($sysname) = @_;
+
+ $sgetip->execute($sysname);
+ if ($sgetip->rows() < 1) {
+ print "Could not get the ip for: ".$sysname;
+ return undef;
+ }
+ my $row = $sgetip->fetchrow_hashref();
+ return $row->{'ip'};
+}
+
+my $cgi = new CGI;
+
+print $cgi->header(-type=>'text/html; charset=utf-8');
+
+print << "EOF";
+<html>
+ <head>
+ <title>Switch managment</title>
+ </head>
+ <body>
+ <p>Du er logget inn som: $user</p>
+ <form method="POST" action="smanagement.pl">
+ <table>
+ <tr>
+ <td>Alle switchene</td>
+ <td><input type="radio" name="rangetype" value="all" /></td>
+ <td></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>Switch</td>
+ <td><input type="radio" checked name="rangetype" value="switch" /></td>
+ <td><input type="text" name="range" /></td>
+ <td>e1-2, e3-3 - e10-2</td>
+ </tr>
+ <tr>
+ <td>Regexp</td>
+ <td><input type="radio" name="rangetype" value="regexp" /></td>
+ <td><input type="text" name="regexp" /></td>
+ <td>Regulært uttrykk</td>
+ </tr>
+ <tr>
+ <td>Rad</td>
+ <td><input type="radio" name="rangetype" value="row" /></td>
+ <td><input type="text" name="range" /></td>
+ <td>1,3-5 (Disabled)</td>
+ </tr>
+ <tr>
+ <td><hr /></td>
+ <td><hr /></td>
+ <td><hr /></td>
+ <td><hr /></td>
+ </tr>
+ <tr>
+ <td>Prioritet</td>
+ <td></td>
+ <td>
+ <select name="priority">
+ <option value="1">1 (lavest)</option>
+ <option value="2">2</option>
+ <option selected value="3">3</option>
+ <option value="4">4</option>
+ <option value="5">5 (høyest)</option>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td>Kommando(er):</td>
+ <td></td>
+ <td><textarea name="cmd" cols="80" rows="24"></textarea></td>
+ <td>En kommando per linje. Linjer som begynner med ! sørger for at nms ikke venter på normal prompt, men fyrer av gårde neste linje umiddelbart. Kjekt for kommandoer av typen "!save\\nY"</td>
+ </td>
+ <tr>
+ <td><hr /></td>
+ <td><hr /></td>
+ <td><hr /></td>
+ <td><hr /></td>
+ </tr>
+ </table>
+ <input type="submit" value="Execute!" /><br />
+ </form>
+EOF
+
+print "<br />\n";
+
+my @switches = ();
+switch ($cgi->param('rangetype')) {
+ case 'all' {
+ print "Sender `".$cgi->param('cmd')."` til alle switchene<br />";
+ @switches = ();
+ $all_switches->execute();
+ while (my $ref = $all_switches->fetchrow_hashref) {
+ push @switches, $ref->{'sysname'};
+ }
+ }
+ case 'switch' {
+# print "Sender `".$cgi->param('cmd')."` til switchene `"
+# .$cgi->param('range')."`.<br />";
+ $_ = $cgi->param('range');
+ @switches = parse_range($_);
+ }
+ case 'regexp' {
+ @switches = ();
+ $all_switches->execute();
+ while (my $ref = $all_switches->fetchrow_hashref) {
+ push @switches, $ref->{'sysname'} if $ref->{'sysname'} =~ $cgi->param('regexp');
+ }
+ }
+ case 'row' {
+# print "Sender `".$cgi->param('cmd')."` til radene `"
+# .$cgi->param('range')."`.<br />";
+# print "This function does not work yet.";
+# $_ = $cgi->param('range');
+# @switches = &parse_row_range($_);
+# @switches = ();
+ print "<font color=\"red\">Slått av!</font>\n";
+ }
+}
+
+my $gid;
+if (@switches > 0) {
+ $sgid->execute();
+ my $row = $sgid->fetchrow_hashref();
+ $gid = $row->{gid};
+}
+
+my $pri = $cgi->param('priority');
+
+print "<pre>\n";
+foreach my $switch (@switches) {
+ my $addr = get_addr_from_switchnum($switch);
+ if (!defined($addr)) {
+ next;
+ }
+ my $cmd = $cgi->param('cmd');
+ print "$switch got addr $addr <br>\n";
+ print "Queuing commands for $switch:\n";
+ my $result = $sinsert->execute($gid, $pri, $addr, $switch, $cmd, $user);
+ if (!$result) {
+ print "\t<font color=\"red\">"
+ ."Could not execute query."
+ ."</font>\n";
+ print "\t".$dbh->errstr."\n";
+ }
+ else {
+ print "\tQueued: $cmd\n";
+ }
+ print "\n";
+}
+$dbh->commit;
+if (defined($gid)) {
+ print "<a href=\"sshow.pl?action=showgid&gid=".$gid."\">Vis resultat</a>\n";
+}
+print "</pre>\n";
+
+print << "EOF";
+ </body>
+</html>
+EOF
diff --git a/web/nms.gathering.org/ssendfile.pl b/web/nms.gathering.org/ssendfile.pl
new file mode 100755
index 0000000..ec2ebb8
--- /dev/null
+++ b/web/nms.gathering.org/ssendfile.pl
@@ -0,0 +1,48 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+use lib '../../include';
+use POSIX;
+
+my $delaytime = 30;
+my $poll_frequency = 60;
+
+sub mylog {
+ my $msg = shift;
+ my $time = POSIX::ctime(time);
+ $time =~ s/\n.*$//;
+ printf STDERR "[%s] %s\n", $time, $msg;
+}
+
+if ($#ARGV != 1) {
+ die("Error in arguments passed\n".
+ "./ssendfile.pl addr configfile\n");
+}
+
+my $conn = nms::switch_connect($ARGV[0]);
+if (!defined($conn)) {
+ die("Could not connect to switch.\n");
+}
+
+open(CONFIG, $ARGV[1]);
+while (<CONFIG>) {
+ my $cmd = $_;
+ $cmd =~ s/[\r\n]+//g;
+ print "Executing: `$cmd`\n";
+# if ($cmd =~ /ip ifconfig swif0 (\d{1-3}\.\d{1-3}\.\d{1-3}\.\d{1-3})/) {
+# print "New ip: $1\n";
+# $conn->cmd( String => $cmd,
+# Timeout => 3);
+# $conn = nms::switch_connect($1);
+# if (!defined($conn)) {
+# die "Could not connect to new ip: $1\n";
+# }
+# }
+# else {
+ my @data = nms::switch_exec($cmd, $conn);
+ foreach my $line (@data) {
+ $line =~ s/[\r\n]+//g;
+ print "$line\n";
+ }
+# }
+}
diff --git a/web/nms.gathering.org/sshow.pl b/web/nms.gathering.org/sshow.pl
new file mode 100755
index 0000000..f406b69
--- /dev/null
+++ b/web/nms.gathering.org/sshow.pl
@@ -0,0 +1,257 @@
+#!/usr/bin/perl
+use lib '../../include';
+use nms;
+
+use warnings;
+use strict;
+use Switch;
+use CGI;
+use DBI;
+
+# Grab from .htaccess-authentication
+my $user = $ENV{'REMOTE_USER'};
+
+my $dbh = nms::db_connect();
+$dbh->{AutoCommit} = 0;
+
+my $sgetdone = $dbh->prepare(
+"SELECT *
+FROM squeue
+WHERE processed = 't'
+ORDER BY updated DESC, sysname
+LIMIT ?::text::int")
+ or die "Could not prepare sgetdone";
+
+my $sgetdonegid = $dbh->prepare(
+"SELECT *
+FROM squeue
+WHERE processed = 't' AND gid = ?::text::int
+ORDER BY updated DESC, sysname")
+ or die "Could not prepare sgetdonegid";
+
+my $slistdonegid = $dbh->prepare(
+"SELECT DISTINCT gid, cmd, author, added
+FROM squeue
+WHERE processed = 't'
+ORDER BY gid")
+ or die "Could not prepare slistdonegid";
+
+my $slistprocgid = $dbh->prepare(
+"SELECT DISTINCT gid, cmd, author, added
+FROM squeue
+WHERE processed = 'f'
+ORDER BY gid")
+ or die "Could not prepare slistdonegid";
+
+my $sgetgid = $dbh->prepare(
+"SELECT *
+FROM squeue
+WHERE gid = ?")
+ or die "Could not prepare sgetgid";
+
+my $sgetprocessing = $dbh->prepare(
+"SELECT *
+FROM squeue
+WHERE processed = 'f'
+ORDER BY updated DESC, gid, sysname")
+ or die "Could not prepare sgetdone";
+
+my $sgetnoconnect = $dbh->prepare(
+"SELECT *
+FROM squeue
+WHERE result = 'Could not connect to switch, delaying...'")
+ or die "Could not prepare sgetnoconnect";
+
+my $sdisablegid = $dbh->prepare("
+UPDATE squeue SET disabled = 't'
+WHERE gid = ?::text::int")
+ or die "Could not prepare sdisablegid";
+my $senablegid = $dbh->prepare("
+UPDATE squeue SET disabled = 'f'
+WHERE gid = ?::text::int")
+ or die "Could not prepare sdisablegid";
+
+
+my $cgi = new CGI;
+
+print $cgi->header(-type=>'text/html; charset=utf-8');
+
+print << "EOF";
+<html>
+ <head>
+ <title>Switch managment</title>
+ </head>
+ <body>
+ <p>Du er logget inn som: $user</p>
+ <form method="POST" action="sshow.pl">
+ <p>
+ Vis <input type="text" name="count" size="4" value="10" /> siste<br />
+ Vis: <select name="action" />
+ <option value="listgid">Grupper</option>
+ <option value="done">Ferdige</option>
+ <option value="processing">I kø</option>
+ </select>
+ <input type="submit" value="Vis" /><br />
+ </p>
+ </form>
+ <br />
+EOF
+
+my $limit = $cgi->param('count');
+if (!defined($limit)) {
+ $limit = 10;
+}
+my $action = $cgi->param('action');
+if (!defined($action)) {
+ $action = 'listgid';
+}
+
+if (defined($cgi->param('agid'))) {
+ my $gid = $cgi->param('gid');
+ if (!defined($gid)) {
+ print "<font color=\"red\">Du har ikke valgt en gid å slette.</font>\n";
+ print "<p>gid: ".$cgi->param('gid')." har blitt disablet.\n";
+ }
+ else {
+ $senablegid->execute($gid);
+ print "<p>gid: ".$cgi->param('gid')." har blitt enablet.\n";
+ }
+ $dbh->commit();
+}
+
+if ($action eq 'noconnect') {
+ print "<h3>Kunne ikke koble til disse switchene:</h3>\n";
+ $sgetnoconnect->execute();
+ print "<pre>\n";
+ while ((my $row = $sgetnoconnect->fetchrow_hashref())) {
+ print "$row->{'sysname'} : $row->{'cmd'} : Added: $row->{'added'} : Updated: $row->{'updated'}\n";
+ }
+ print "</pre>\n";
+}
+
+if ($action eq 'listgid') {
+ print "<pre>\n";
+ print "<a href=\"sshow.pl?action=noconnect\" />Kunne ikke koble til</a>\n\n\n";
+ print "<b>Ferdige:</b>\n";
+ $slistdonegid->execute();
+ my ($gid, $author);
+ $gid = -1;
+ while ((my $row = $slistdonegid->fetchrow_hashref())) {
+ $author = $row->{author};
+ if ($gid != $row->{gid}) {
+ $gid = $row->{gid};
+ print "GID: <a href=\"sshow.pl?action=showgid&gid=$gid\">$gid</a>\n";
+ print "Author: $author\n";
+ print "Added: ".$row->{added}."\n";
+ }
+ my $cmd = $row->{cmd};
+ print "\t$cmd\n";
+ }
+ print "\n\n";
+ print "<b>I kø:</b>\n";
+ $slistprocgid->execute();
+ $gid = -1;
+ while ((my $row = $slistprocgid->fetchrow_hashref())) {
+ $author = $row->{author};
+ if ($gid != $row->{gid}) {
+ $gid = $row->{gid};
+ print "GID: <a href=\"sshow.pl?action=showgid&gid=$gid\">$gid</a>\n";
+ print "Author: $author\n";
+ print "Added: ".$row->{added}."\n";
+ }
+ my $cmd = $row->{cmd};
+ print "\t$cmd\n";
+ }
+ $dbh->commit();
+ print "</pre>\n";
+}
+
+if ($action eq 'showgid') {
+ print "<pre>\n";
+ $sgetgid->execute($cgi->param('gid'));
+ my $row = $sgetgid->fetchrow_hashref();
+ print "GID: ".$row->{gid}."\n";
+ print "Author: ".$row->{author}."\n";
+ do {
+ print " <b>Name: ".$row->{sysname}." Addr: ".$row->{addr}."</b>\n";
+ print " `<b>".$row->{cmd}."`</b>\n";
+ print " <i>Added: ".$row->{added}." executed ".$row->{updated}."</i>\n";
+ my $data = $row->{result};
+ if (!defined($data)) {
+ $data = "Not executed yet!";
+ }
+ my @lines = split(/[\n\r]+/, $data);
+ foreach my $line (@lines) {
+ print "\t$line\n";
+ }
+ } while (($row = $sgetgid->fetchrow_hashref()));
+ print "</pre>\n";
+}
+
+if ($action eq 'done') {
+ print "<h3>Done</h3>\n";
+ print "<pre>\n";
+
+ my $squery;
+ if (defined($cgi->param('gid'))) {
+ my $gid = $cgi->param('gid');
+ $sgetdonegid->execute($gid);
+ $squery = $sgetdonegid;
+ }
+ else {
+ $sgetdone->execute($limit);
+ $squery = $sgetdone;
+ }
+ my $sysname = '';
+ while (my $row = $squery->fetchrow_hashref()) {
+ if ($sysname ne $row->{'sysname'}) {
+ $sysname = $row->{'sysname'};
+ print "$sysname (".$row->{addr}."):\n";
+ }
+ print " Author: ".$row->{author}."\n";
+ print " Cmd: ".$row->{cmd}."\n";
+ print " Added: ".$row->{added}." Updated: ".$row->{updated}."\n";
+ print " gID: ".$row->{gid}."\n";
+ my @result = split(/[\n\r]+/, $row->{result});
+ foreach (@result) {
+ print "\t".$_."\n";
+ }
+ print "\n";
+ }
+ $dbh->commit();
+ print "</pre>\n";
+}
+elsif ($action eq 'processing') {
+ print "<h3>Processing</h3>\n";
+ print "<pre>\n";
+ $sgetprocessing->execute();
+ while (my $row = $sgetprocessing->fetchrow_hashref()) {
+ my $sysname = $row->{'sysname'};
+ print "$sysname (".$row->{addr}."):\n";
+ print " Author: ".$row->{author}."\n";
+ print " Cmd: ".$row->{cmd}."\n";
+ my $updated;
+ if (defined($row->{updated})) { $updated = $row->{updated}; }
+ else { $updated = 'never'; }
+ print " Added: ".$row->{added}." Updated: ".$updated."\n";
+ print " Disabled: ".$row->{disabled}."\n";
+ print " Locked: ".$row->{locked}."\n";
+ print " gID: ".$row->{gid};
+ print " <form action=\"sshow.pl\" methos=\"POST\">";
+ print "<input type=\"hidden\" name=\"gid\" value=\"".$row->{gid}."\">";
+ print "<input type=\"hidden\" name=\"action\" value=\"processing\">";
+ if ($row->{disabled} == 0) {
+ print "<input type=\"submit\" name=\"agid\" value=\"Disable\">\n";
+ }
+ else {
+ print "<input type=\"submit\" name=\"agid\" value=\"Enable\">\n";
+ }
+ }
+ $dbh->commit();
+ print "</pre>\n";
+}
+
+print << "EOF";
+ </body>
+</html>
+EOF
diff --git a/web/nms.gathering.org/stromkart.pl b/web/nms.gathering.org/stromkart.pl
new file mode 100755
index 0000000..0aef634
--- /dev/null
+++ b/web/nms.gathering.org/stromkart.pl
@@ -0,0 +1,69 @@
+#! /usr/bin/perl
+use CGI qw(fatalsToBrowser);
+use GD;
+use DBI;
+use lib '../../include';
+use nms;
+use strict;
+use warnings;
+my $cgi = CGI->new;
+
+#my $greentimeout = 7200;
+my $greentimeout = 15*60;
+my $maxtimeout = $greentimeout*9;
+
+my $dbh = nms::db_connect();
+
+GD::Image->trueColor(1);
+my $img = GD::Image->new('bg07.png');
+
+my $blk = $img->colorResolve(0, 0, 0);
+
+$img->string(gdMediumBoldFont,0,0,"Switch uplink status",$blk);
+$img->string(gdSmallFont,0,20,"Number of ports with activity",$blk);
+
+my $red = $img->colorResolve(255, 0, 0);
+my $yel = $img->colorResolve(255, 255, 0);
+my $grn = $img->colorResolve(0, 255, 0);
+my $wht = $img->colorResolve(255, 255, 255);
+my $gry = $img->colorResolve(127, 127, 127);
+
+my $q = $dbh->prepare('select switch,sysname,(select placement from placements where placements.switch=switches.switch) as placement,count((bytes_in > 0 and bytes_out > 0) or null) as active_ports,(max(last_poll_time) >= current_timestamp - interval \'2 minutes\') as fresh from switches natural left join get_current_datarate() natural join placements where switchtype like \'dlink3100%\' group by switch,sysname');
+$q->execute();
+while (my $ref = $q->fetchrow_hashref()) {
+ my $ports = $ref->{'active_ports'};
+ my $sysname = $ref->{'sysname'};
+ my $clr;
+ if ($ports < 5) {
+ $clr = $red;
+ } else {
+ if (!$ref->{'fresh'}) {
+ $clr = $yel;
+ } else {
+ $clr = $grn;
+ }
+ }
+
+ $ref->{'placement'} =~ /\((\d+),(\d+)\),\((\d+),(\d+)\)/;
+ $img->filledRectangle($3,$4,$1,$2,$clr);
+ $img->rectangle($3,$4,$1,$2,$blk);
+
+ my ($x2, $y2, $x1, $y1) = ($1, $2, $3, $4);
+ my $max_textlen = ($x2-$x1) > ($y2-$y1) ? $x2-$x1 : $y2-$y1;
+ while (length($sysname) * 6 > $max_textlen) {
+ # Try to abbreviate sysname if it is too long for the box
+ $sysname =~ s/^(.*)[a-z]~?([0-9]+)$/$1~$2/ or last;
+ }
+ if (($x2-$x1) > ($y2-$y1)) {
+ $img->string(gdSmallFont,$x1+2,$y1,$sysname,$blk);
+ } else {
+ $img->stringUp(gdSmallFont,$x1,$y2-3,$sysname,$blk);
+ }
+}
+$dbh->disconnect;
+
+if (!defined($ARGV[0])) {
+ print $cgi->header(-type=>'image/png',
+ -refresh=>'10; ' . CGI::url());
+}
+print $img->png;
diff --git a/web/nms.gathering.org/uplinkkart-text.pl b/web/nms.gathering.org/uplinkkart-text.pl
new file mode 100755
index 0000000..de91e92
--- /dev/null
+++ b/web/nms.gathering.org/uplinkkart-text.pl
@@ -0,0 +1,38 @@
+#! /usr/bin/perl
+use CGI;
+use DBI;
+use lib '../../include';
+use nms;
+my $cgi = CGI->new;
+
+my $dbh = nms::db_connect();
+print $cgi->header(-type=>'text/html; charset=utf-8', -refresh=>'10; ' . CGI::url());
+
+print <<"EOF";
+<html>
+ <head>
+ <title>Uplinkkart</title>
+ </head>
+ <body>
+ <map name="switches">
+EOF
+
+my $q = $dbh->prepare("SELECT * FROM switches NATURAL JOIN placements WHERE switchtype = 'dlink3100'");
+$q->execute();
+while (my $ref = $q->fetchrow_hashref()) {
+ $ref->{'placement'} =~ /\((\d+),(\d+)\),\((\d+),(\d+)\)/;
+
+ my $ttext = 'FIXME: Put something here';
+ printf " <area shape=\"rect\" coords=\"%u,%u,%u,%u\" href=\"switchdiag.pl?id=%u\" alt=\"%s (%s)\" onmouseover=\"window.status='%s (%s)'; return true\" onmouseout=\"window.status=''\" />\n",
+ $3, $4, $1, $2, $ref->{'switch'}, $ref->{'sysname'},
+ $ttext, $ref->{'sysname'}, $ttext;
+}
+$dbh->disconnect;
+
+print <<"EOF";
+ </map>
+
+ <p><img src="uplinkkart.pl" usemap="#switches" /></p>
+ </body>
+</html>
+EOF
diff --git a/web/nms.gathering.org/uplinkkart.pl b/web/nms.gathering.org/uplinkkart.pl
new file mode 100755
index 0000000..32581a6
--- /dev/null
+++ b/web/nms.gathering.org/uplinkkart.pl
@@ -0,0 +1,70 @@
+#! /usr/bin/perl
+use CGI qw(fatalsToBrowser);
+use GD;
+use DBI;
+use lib '../../include';
+use nms;
+use strict;
+use warnings;
+my $cgi = CGI->new;
+
+#my $greentimeout = 7200;
+my $greentimeout = 15*60;
+my $maxtimeout = $greentimeout*9;
+
+my $dbh = nms::db_connect();
+
+GD::Image->trueColor(1);
+my $img = GD::Image->new('bg07.png');
+
+my $blk = $img->colorResolve(0, 0, 0);
+
+$img->string(gdMediumBoldFont,0,0,"Switch uplink status",$blk);
+$img->string(gdSmallFont,0,20,"Number of ports with activity",$blk);
+
+my $red = $img->colorResolve(255, 0, 0);
+my $yel = $img->colorResolve(255, 255, 0);
+my $grn = $img->colorResolve(0, 255, 0);
+my $blu = $img->colorResolve(0, 0, 255);
+my $wht = $img->colorResolve(255, 255, 255);
+my $gry = $img->colorResolve(127, 127, 127);
+
+my @palette = ( $blu, $red, $yel, $grn, $wht );
+
+for my $ports (0..4) {
+ my $y = 60 + 20 * (4 - $ports);
+ $img->filledRectangle(20, $y, 30, $y + 10, $palette[$ports]);
+ $img->rectangle(20, $y, 30, $y + 10, $blk);
+ $img->stringFT($blk, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, 40, $y + 10, $ports);
+}
+
+my $q = $dbh->prepare('select switch,sysname,(select placement from placements where placements.switch=switches.switch) as placement,count((bytes_in > 0 and bytes_out > 0) or null) as active_ports from switches natural left join get_current_datarate() natural join placements where port between 45 and 48 and switchtype like \'dlink3100%\' group by switch,sysname');
+$q->execute();
+while (my $ref = $q->fetchrow_hashref()) {
+ my $ports = $ref->{'active_ports'};
+ my $sysname = $ref->{'sysname'};
+ my $clr = $palette[$ports];
+
+ $ref->{'placement'} =~ /\((\d+),(\d+)\),\((\d+),(\d+)\)/;
+ $img->filledRectangle($3,$4,$1,$2,$clr);
+ $img->rectangle($3,$4,$1,$2,$blk);
+
+ my ($x2, $y2, $x1, $y1) = ($1, $2, $3, $4);
+ my $max_textlen = ($x2-$x1) > ($y2-$y1) ? $x2-$x1 : $y2-$y1;
+ while (length($sysname) * 6 > $max_textlen) {
+ # Try to abbreviate sysname if it is too long for the box
+ $sysname =~ s/^(.*)[a-z]~?([0-9]+)$/$1~$2/ or last;
+ }
+ if (($x2-$x1) > ($y2-$y1)) {
+ $img->string(gdSmallFont,$x1+2,$y1,$sysname,$blk);
+ } else {
+ $img->stringUp(gdSmallFont,$x1,$y2-3,$sysname,$blk);
+ }
+}
+$dbh->disconnect;
+
+if (!defined($ARGV[0])) {
+ print $cgi->header(-type=>'image/png',
+ -refresh=>'10; ' . CGI::url());
+}
+print $img->png;
diff --git a/web/nms.gathering.org/uplinktrafikkart.pl b/web/nms.gathering.org/uplinktrafikkart.pl
new file mode 100755
index 0000000..32869b3
--- /dev/null
+++ b/web/nms.gathering.org/uplinktrafikkart.pl
@@ -0,0 +1,90 @@
+#! /usr/bin/perl
+use CGI qw(fatalsToBrowser);
+use GD;
+use DBI;
+use lib '../../include';
+use nms;
+use strict;
+use warnings;
+my $cgi = CGI->new;
+
+#my $greentimeout = 7200;
+my $greentimeout = 15*60;
+my $maxtimeout = $greentimeout*9;
+
+my $dbh = nms::db_connect();
+
+GD::Image->trueColor(1);
+my $img = GD::Image->new('bg07.png');
+
+my $blk = $img->colorResolve(0, 0, 0);
+
+for my $y (42..236) {
+ my $i = 2.0 * ($y - 236.0) / (42.0 - 237.0);
+ my $clr = get_color($i);
+
+ $img->filledRectangle(12, $y, 33, $y+1, $clr);
+}
+
+$img->string(gdMediumBoldFont,0,0,"Switch uplink traffic",$blk);
+$img->string(gdSmallFont,0,20,"max of bytes in/out",$blk);
+
+my $red = $img->colorResolve(255, 0, 0);
+my $yel = $img->colorResolve(255, 255, 0);
+my $grn = $img->colorResolve(0, 255, 0);
+my $wht = $img->colorResolve(255, 255, 255);
+
+$img->rectangle(12,42,33,236,$blk);
+
+$img->stringFT($blk, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, 40, 47 + (236-42)*0.0/2.0, "4 Gbit/sec");
+$img->stringFT($blk, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, 40, 47 + (236-42)*1.0/2.0, "2 Gbit/sec");
+$img->stringFT($blk, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, 40, 47 + (236-42)*2.0/2.0, "1 Gbit/sec");
+$img->stringFT($blk, "/usr/share/fonts/truetype/msttcorefonts/Arial.ttf", 10, 0, 1000, 700, "NMS (C) 2005-2012 Tech:Server");
+
+my $q = $dbh->prepare('select switch,sysname,(select placement from placements where placements.switch=switches.switch) as placement,greatest(sum(bytes_in),sum(bytes_out)) as traffic from switches natural left join get_current_datarate() natural join placements where port between 45 and 48 and switchtype like \'dlink3100%\' group by switch,sysname');
+$q->execute();
+while (my $ref = $q->fetchrow_hashref()) {
+ my $traffic = $ref->{'traffic'} * 8.0; # convert to bits
+ my $sysname = $ref->{'sysname'};
+
+ my $max = 4_000_000_000.0; # 2Gbit
+ my $min = 1_000_000_000.0; # 1Gbit
+ $traffic = $max if ($traffic > $max);
+ $traffic = $min if ($traffic < $min);
+ my $intensity = log($traffic / $min) / log(2);
+ my $clr = get_color($intensity);
+
+ $ref->{'placement'} =~ /\((\d+),(\d+)\),\((\d+),(\d+)\)/;
+ $img->filledRectangle($3,$4,$1,$2,$clr);
+ $img->rectangle($3,$4,$1,$2,$blk);
+
+ my ($x2, $y2, $x1, $y1) = ($1, $2, $3, $4);
+ my $max_textlen = ($x2-$x1) > ($y2-$y1) ? $x2-$x1 : $y2-$y1;
+ while (length($sysname) * 6 > $max_textlen) {
+ # Try to abbreviate sysname if it is too long for the box
+ $sysname =~ s/^(.*)[a-z]~?([0-9]+)$/$1~$2/ or last;
+ }
+ if (($x2-$x1) > ($y2-$y1)) {
+ $img->string(gdSmallFont,$x1+2,$y1,$sysname,$blk);
+ } else {
+ $img->stringUp(gdSmallFont,$x1,$y2-3,$sysname,$blk);
+ }
+}
+$dbh->disconnect;
+
+if (!defined($ARGV[0])) {
+ print $cgi->header(-type=>'image/png',
+ -refresh=>'10; ' . CGI::url());
+}
+print $img->png;
+
+sub get_color {
+ my $intensity = shift;
+ my $gamma = 1.0/1.90;
+ if ($intensity > 1.0) {
+ $intensity -= 1.0;
+ return $img->colorResolve(255.0, 255.0 * ($intensity ** $gamma), 255.0 * ($intensity ** $gamma));
+ } else {
+ return $img->colorResolve(255.0 * ($intensity ** $gamma), 255.0 * (1.0 - ($intensity ** $gamma)), 0);
+ }
+}
diff --git a/web/stream.tg13.gathering.org/fix_count.pl b/web/stream.tg13.gathering.org/fix_count.pl
new file mode 100755
index 0000000..aaaf42e
--- /dev/null
+++ b/web/stream.tg13.gathering.org/fix_count.pl
@@ -0,0 +1,31 @@
+#! /usr/bin/perl
+
+my $lines = {};
+
+open LOG, "<", "/home/techserver/count_datacube.log"
+ or die "count_datacube.log: $!";
+
+while (<LOG>) {
+ chomp;
+ my ($date, $port, $proto, $audience, $count) = split /\s+/;
+ my $key = $port . ' ' . $proto . ' ' . $audience;
+ $lines->{$date}{$key} = $count;
+}
+
+close LOG;
+
+my $last_date = undef;
+for my $date (sort keys %$lines) {
+ for my $key (keys %{$lines->{$date}}) {
+ if (defined($last_date) && !exists($lines->{$last_date}{$key})) {
+ $lines->{$last_date}{$key} = $lines->{$date}{$key};
+ }
+ }
+ $last_date = $date;
+}
+
+for my $date (sort keys %$lines) {
+ for my $key (sort keys %{$lines->{$date}}) {
+ print "$date $key " . $lines->{$date}{$key} . "\n";
+ }
+}
diff --git a/web/stream.tg13.gathering.org/img/cam-map.png b/web/stream.tg13.gathering.org/img/cam-map.png
new file mode 100644
index 0000000..759641a
--- /dev/null
+++ b/web/stream.tg13.gathering.org/img/cam-map.png
Binary files differ
diff --git a/web/stream.tg13.gathering.org/img/icon_1.png b/web/stream.tg13.gathering.org/img/icon_1.png
new file mode 100644
index 0000000..6d6e67e
--- /dev/null
+++ b/web/stream.tg13.gathering.org/img/icon_1.png
Binary files differ
diff --git a/web/stream.tg13.gathering.org/img/icon_2.png b/web/stream.tg13.gathering.org/img/icon_2.png
new file mode 100644
index 0000000..599d5f6
--- /dev/null
+++ b/web/stream.tg13.gathering.org/img/icon_2.png
Binary files differ
diff --git a/web/stream.tg13.gathering.org/img/icon_3.png b/web/stream.tg13.gathering.org/img/icon_3.png
new file mode 100644
index 0000000..4d1de76
--- /dev/null
+++ b/web/stream.tg13.gathering.org/img/icon_3.png
Binary files differ
diff --git a/web/stream.tg13.gathering.org/img/icon_camera.png b/web/stream.tg13.gathering.org/img/icon_camera.png
new file mode 100644
index 0000000..e1bf2c3
--- /dev/null
+++ b/web/stream.tg13.gathering.org/img/icon_camera.png
Binary files differ
diff --git a/web/stream.tg13.gathering.org/img/icon_event.png b/web/stream.tg13.gathering.org/img/icon_event.png
new file mode 100644
index 0000000..9ce6df4
--- /dev/null
+++ b/web/stream.tg13.gathering.org/img/icon_event.png
Binary files differ
diff --git a/web/stream.tg13.gathering.org/img/icon_hd.png b/web/stream.tg13.gathering.org/img/icon_hd.png
new file mode 100644
index 0000000..d9086bc
--- /dev/null
+++ b/web/stream.tg13.gathering.org/img/icon_hd.png
Binary files differ
diff --git a/web/stream.tg13.gathering.org/img/icon_sd.png b/web/stream.tg13.gathering.org/img/icon_sd.png
new file mode 100644
index 0000000..3bddbe9
--- /dev/null
+++ b/web/stream.tg13.gathering.org/img/icon_sd.png
Binary files differ
diff --git a/web/stream.tg13.gathering.org/index-bak.pl b/web/stream.tg13.gathering.org/index-bak.pl
new file mode 100755
index 0000000..3e31107
--- /dev/null
+++ b/web/stream.tg13.gathering.org/index-bak.pl
@@ -0,0 +1,67 @@
+#!/usr/bin/perl -I /srv/streamlib
+use warnings;
+use strict;
+use CGI;
+use Geo::IP;
+use NetAddr::IP;
+use Net::IP;
+# apt-get install libnet-ip-perl libnetaddr-ip-perl
+use HTML::Template;
+use stream;
+use stream::config;
+
+my $client = CGI->new;
+
+my $v4net = $stream::config::v4net;
+my $v6net = $stream::config::v6net;
+my $tg = $stream::config::tg;
+my $tg_full = $stream::config::tg_full;
+my %streams = %stream::config::streams;
+
+my $force_unicast = $client->param('forceunicast');
+
+my $location = undef;
+
+print $client->header();
+
+my $clip = $client->remote_addr();
+my $template = HTML::Template->new(filename => 'index.tmpl');
+my $is_local = &is_ip_local($clip, $v4net, $v6net);
+
+my @streams = &html_local_test();
+$template->param(TG => $tg);
+$template->param(TG_FULL => $tg_full);
+$template->param(STREAMS => \@streams);
+print $template->output();
+
+
+sub html_local_test() {
+ my @s = ();
+ foreach my $name (sort { $streams{$a}->{priority} <=> $streams{$b}->{priority} } keys %streams) {
+ my $title_link = "http://stream.tg$tg.gathering.org/stream.pl?delivery=%s&stream=${name}&interlaced=%s";
+ my $multicast_link = $streams{$name}->{has_multicast} ? "multicast" : "unicast";
+ $multicast_link = "unicast" if ($force_unicast == 1 || not $is_local);
+
+ if ($streams{$name}->{external}) {
+ $title_link = $streams{$name}->{url};
+ } else {
+ $title_link = sprintf($title_link, $multicast_link, $streams{$name}->{interlaced});
+ }
+ my %hash = (
+ 'title_link' => $title_link,
+ 'title' => $streams{$name}->{title},
+ 'source' => $streams{$name}->{source},
+ 'delivery' => $multicast_link
+ );
+ if ($multicast_link eq "multicast") {
+ $hash{'is_multicast'} .= 1;
+ my $unicast_link = $title_link;
+ $unicast_link=~s/multicast/unicast/g;
+ $hash{'unicast_link'} .= $unicast_link;
+ }
+ $hash{'description'} .= $streams{$name}->{description} if exists($streams{$name}->{description});
+ push(@s, \%hash);
+
+ }
+ return @s;
+}
diff --git a/web/stream.tg13.gathering.org/index-bak.tmpl b/web/stream.tg13.gathering.org/index-bak.tmpl
new file mode 100644
index 0000000..c0aa95d
--- /dev/null
+++ b/web/stream.tg13.gathering.org/index-bak.tmpl
@@ -0,0 +1,31 @@
+<html>
+<head>
+ <title>The Gathering <TMPL_VAR NAME=TG_FULL></title>
+ <link rel="stylesheet" type="text/css" media="screen" href="superawesomeness.css">
+ <link href='http://fonts.googleapis.com/css?family=Open+Sans&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
+</head>
+<body>
+ <div id="spaceship"></div>
+ <div id="innhold">
+ <h1>The Gathering <TMPL_VAR NAME=TG_FULL></h1>
+ <ul>
+ <TMPL_LOOP NAME="STREAMS">
+ <li><a href="<TMPL_VAR NAME=TITLE_LINK>"><TMPL_VAR NAME=TITLE ></a>
+ <p>
+ Source: <TMPL_VAR NAME=SOURCE >
+ <br/>Delivery: <TMPL_VAR NAME=delivery> <TMPL_IF NAME=IS_MULTICAST>(<a href='<TMPL_VAR NAME=UNICAST_LINK>'>problems? try unicast vlc link here</a>)</TMPL_IF>
+ <TMPL_IF NAME="DESCRIPTION"><br /><TMPL_VAR NAME=DESCRIPTION></TMPL_IF></li>
+ </TMPL_LOOP>
+ </ul>
+ </div>
+ <footer>
+ <p>Problems with the non game streams? The easiest way to get hold of us is on IRC (EFNet);
+ one of ViD, Rockj and Sesse should be available if there's too much traffic
+ on #tg to be heard.</p>
+ <p><a href="http://stream.tg<TMPL_VAR NAME="TG">.gathering.org">http://stream.tg<TMPL_VAR NAME="TG">.gathering.org</a></p>
+
+ </footer>
+</body>
+</html>
+
+
diff --git a/web/stream.tg13.gathering.org/index.pl b/web/stream.tg13.gathering.org/index.pl
new file mode 100755
index 0000000..e5f103c
--- /dev/null
+++ b/web/stream.tg13.gathering.org/index.pl
@@ -0,0 +1,72 @@
+#!/usr/bin/perl -I /srv/streamlib
+use warnings;
+use strict;
+use CGI;
+use Geo::IP;
+use NetAddr::IP;
+use Net::IP;
+# apt-get install libnet-ip-perl libnetaddr-ip-perl
+use HTML::Template;
+use stream;
+use stream::config;
+
+my $client = CGI->new;
+
+my $v4net = $stream::config::v4net;
+my $v6net = $stream::config::v6net;
+my $tg = $stream::config::tg;
+my $tg_full = $stream::config::tg_full;
+my %streams = %stream::config::streams;
+
+my $force_unicast = $client->param('forceunicast');
+my $no_header = $client->param('noheader');
+
+my $location = undef;
+
+print $client->header();
+
+my $clip = $client->remote_addr();
+my $template = HTML::Template->new(filename => 'index.tmpl');
+my $is_local = &is_ip_local($clip, $v4net, $v6net);
+
+my @streams = &html_local_test();
+$template->param(TG => $tg);
+$template->param(TG_FULL => $tg_full);
+$template->param(STREAMS => \@streams);
+$template->param(NOHEADER => $no_header);
+print $template->output();
+
+
+sub html_local_test() {
+ my @s = ();
+ foreach my $name (sort { $streams{$a}->{priority} <=> $streams{$b}->{priority} } keys %streams) {
+ my $title_link = "http://stream.tg$tg.gathering.org/stream.pl?delivery=%s&stream=${name}&interlaced=%s";
+ my $multicast_link = $streams{$name}->{has_multicast} ? "multicast" : "unicast";
+ $multicast_link = "unicast" if ($force_unicast == 1 || not $is_local);
+
+ if ($streams{$name}->{external}) {
+ $title_link = $streams{$name}->{url};
+ } else {
+ $title_link = sprintf($title_link, $multicast_link, $streams{$name}->{interlaced});
+ }
+ my %hash = (
+ 'title_link' => $title_link,
+ 'title' => $streams{$name}->{title},
+ 'source' => $streams{$name}->{source},
+ 'quality' => $streams{$name}->{quality},
+ 'location' => $streams{$name}->{location},
+ 'type' => $streams{$name}->{type},
+ 'delivery' => $multicast_link,
+ );
+ if ($multicast_link eq "multicast") {
+ $hash{'is_multicast'} .= 1;
+ my $unicast_link = $title_link;
+ $unicast_link=~s/multicast/unicast/g;
+ $hash{'unicast_link'} .= $unicast_link;
+ }
+ $hash{'description'} .= $streams{$name}->{description} if exists($streams{$name}->{description});
+ push(@s, \%hash);
+
+ }
+ return @s;
+}
diff --git a/web/stream.tg13.gathering.org/index.tmpl b/web/stream.tg13.gathering.org/index.tmpl
new file mode 100644
index 0000000..a565f0e
--- /dev/null
+++ b/web/stream.tg13.gathering.org/index.tmpl
@@ -0,0 +1,35 @@
+<html>
+<head>
+ <title>The Gathering <TMPL_VAR NAME=TG_FULL> Streams</title>
+ <link rel="stylesheet" type="text/css" href="singularity.css" media="all">
+</head>
+<body>
+ <div id="innhold">
+ <TMPL_UNLESS NAME=NOHEADER>
+ <h1>The Gathering <TMPL_VAR NAME=TG_FULL> Streams</h1>
+ </TMPL_UNLESS>
+
+ <TMPL_LOOP NAME="STREAMS">
+ <div class="stream-link">
+ <div class="stream-icon"><img src="img/icon_<TMPL_VAR NAME=QUALITY>.png" /> <img src="img/icon_<TMPL_VAR NAME=TYPE>.png" /> <TMPL_IF NAME=LOCATION><img src="img/icon_<TMPL_VAR NAME=LOCATION>.png"></TMPL_IF></div>
+ <div class="stream-link-content">
+ <a href="<TMPL_VAR NAME=TITLE_LINK>"><TMPL_VAR NAME=TITLE></a><br>
+ Source: <TMPL_VAR NAME=SOURCE><br>
+ Delivery: <TMPL_VAR NAME=delivery> <TMPL_IF NAME=IS_MULTICAST>(<a href='<TMPL_VAR NAME=UNICAST_LINK>'>problems? try unicast vlc link here</a>)</TMPL_IF>
+
+ </div>
+ </div>
+ </TMPL_LOOP>
+ <div id="map">
+ <img src="img/cam-map.png">
+ </div>
+
+ </div>
+
+ <p>Problems with the non game streams? The easiest way to get hold of us is on IRC (EFNet); one of ViD, Rockj and Sesse should be available if there's too much traffic on #tg to be heard.</p>
+ <p><a href="http://stream.tg<TMPL_VAR NAME="TG">.gathering.org">http://stream.tg<TMPL_VAR NAME="TG">.gathering.org</a></p>
+
+</body>
+</html>
+
+
diff --git a/web/stream.tg13.gathering.org/ios/PLACEHOLDER b/web/stream.tg13.gathering.org/ios/PLACEHOLDER
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/web/stream.tg13.gathering.org/ios/PLACEHOLDER
diff --git a/web/stream.tg13.gathering.org/ios/event.m3u8 b/web/stream.tg13.gathering.org/ios/event.m3u8
new file mode 100644
index 0000000..11152d3
--- /dev/null
+++ b/web/stream.tg13.gathering.org/ios/event.m3u8
@@ -0,0 +1,16 @@
+#EXTM3U
+#EXT-X-TARGETDURATION:5
+#EXT-X-VERSION:3
+#EXT-X-ALLOW-CACHE:NO
+#EXT-X-MEDIA-SEQUENCE:27432
+#EXTINF:4.97,
+http://stream.tg13.gathering.org/ios/event-00027432.ts
+#EXTINF:4.04,
+http://stream.tg13.gathering.org/ios/event-00027433.ts
+#EXTINF:3.99,
+http://stream.tg13.gathering.org/ios/event-00027434.ts
+#EXTINF:3.97,
+http://stream.tg13.gathering.org/ios/event-00027435.ts
+#EXTINF:3.74,
+http://stream.tg13.gathering.org/ios/event-00027436.ts
+#EXT-X-ENDLIST
diff --git a/web/stream.tg13.gathering.org/ios/stream.m3u8 b/web/stream.tg13.gathering.org/ios/stream.m3u8
new file mode 100644
index 0000000..d3d46a6
--- /dev/null
+++ b/web/stream.tg13.gathering.org/ios/stream.m3u8
@@ -0,0 +1,8 @@
+#EXTM3U
+#EXT-X-TARGETDURATION:5
+#EXT-X-VERSION:3
+#EXT-X-ALLOW-CACHE:NO
+#EXT-X-MEDIA-SEQUENCE:1
+#EXTINF:3.84,
+http://stream.tg13.gathering.org/ios/stream-00000001.ts
+#EXT-X-ENDLIST
diff --git a/web/stream.tg13.gathering.org/singularity.css b/web/stream.tg13.gathering.org/singularity.css
new file mode 100644
index 0000000..05e1518
--- /dev/null
+++ b/web/stream.tg13.gathering.org/singularity.css
@@ -0,0 +1,1960 @@
+•/* http://meyerweb.com/eric/tools/css/reset/
+ v2.0 | 20110126
+ License: none (public domain)
+*/
+
+html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-size: 100%;
+ font: inherit;
+ vertical-align: baseline;
+}
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section {
+ display: block;
+}
+body {
+ line-height: 1.5;
+}
+ol, ul {
+ list-style: none;
+}
+blockquote, q {
+ quotes: none;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+ content: '';
+ content: none;
+}
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+/* @override http://www.gathering.org/tg12/files/content/design/css/typography.css */
+
+/* Generic
+------------------------------------------------------ */
+html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
+ font-family: Arial, Sans-Serif;
+ font-weight: 400;
+}
+body {
+ font-size: 15px;
+ line-height: 20px;
+ color: #777;
+}
+/* Headings
+------------------------------------------------------ */
+h1, h2, h3, h4, h5, h6 { font-weight: bold; color: #404040; }
+h1 { font-size: 45px; line-height: 50px; margin-bottom: 15px; }
+h2 { font-size: 25px; line-height: 31px; margin-bottom: 12px;}
+h3 { font-size: 20px; line-height: 26px; }
+h4 { font-size: 16px; line-height: 22px; }
+h5 { font-size: 15px; line-height: 20px; }
+h6 { font-size: 12px; line-height: 17px; }
+
+/* Text 'n stuff
+------------------------------------------------------ */
+p { margin: 0 0 20px 0; }
+.page p {
+ margin: 0 0 0.8em 0 !important;
+}
+blockquote {
+ margin: 20px;
+ padding: 0 0 0 40px;
+ color: #555;
+ font-style: italic;
+ color: #888;
+ position: relative;
+}
+blockquote p::before {
+ position: absolute;
+ top: 50px;
+ margin-left: -60px;
+ content: "\201D";
+ font-size: 150px;
+ font-style: normal;
+ color: #00aaad;
+}
+blockquote p {
+ display: block;
+ margin-left: 40px !important;
+}
+blockquote small::before {
+ content: "\2013";
+ margin: 5px;
+}
+blockquote small {
+ font-size: 13px;
+ margin-left: -55px;
+}
+strong { font-weight: bold; }
+
+ul {
+ margin: 0 0 20px 10px;
+ list-style-type: none;
+ position: relative;
+}
+ul.submenu ul {
+ margin-bottom: 0px;
+}
+ul li:before {
+ content: "\2022";
+ position: absolute;
+ left: -17px;
+ width: 15px;
+ text-align: right;
+ color: #00aaad;
+ font-size: 13px;
+ line-height: 21px;
+}
+i, em { font-style: italic; }
+
+ol {
+ margin: 0 0 20px 15px;
+ list-style-type: none;
+ position: relative;
+ counter-reset: section;
+}
+ol > li {
+ counter-increment: section;
+}
+ol > li:before {
+ content: counter(section);
+ position: absolute;
+ left: -30px;
+ width: 23px;
+ text-align: right;
+ color: #00aaad;
+ font-size: 12px;
+ line-height: 22px;
+}
+dl dt { font-weight: bold; }
+dd { margin: 0 0 0 20px; }
+
+a { color: #00aaad; text-decoration: none; }
+a:hover { color: #c3027b; }
+code, pre {
+ padding: 0 3px 2px;
+ font-family: Menlo, Monaco, "Courier New", monospace;
+ font-size: 12px;
+ color: #8F8F8F;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+ background-color: #F8F8F8;
+ border: 1px solid #C0C4C5;
+}
+code {
+ padding: 3px 4px;
+ color: #00aaad;
+}
+pre {
+ display: block;
+ padding: 8.5px;
+ margin: 0 0 9px;
+ line-height: 18px;
+ white-space: pre;
+ white-space: pre-wrap;
+ word-break: break-all;
+}
+table {
+ margin-bottom: 20px;
+}
+th, td {
+ padding: 4px 5px;
+}
+td, th {
+ border-left: 1px solid #E2E2E2;
+}
+tr td:first-child, tr th:first-child {
+ border: none;
+}
+tr td {
+ text-align: right;
+}
+th {
+ font-weight: bold;
+ vertical-align: bottom;
+}
+th, td {
+ min-width: 100px;
+}
+th p, td p {
+ margin: 0;
+}
+tbody tr:nth-child(even) td, thead tr th {
+ background-color: #F2F2F2;
+}
+hr {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ border: 0;
+ color: #D5D5D5;
+ background-color: #D5D5D5;
+ height: 1px;
+}
+.visible-phone {
+ display: none;
+}
+.title-container h2 {
+ font-family: Tahoma, Geneva, sans-serif;
+ font-size: 26px;
+ margin-bottom: 5px;
+ line-height: normal;
+}
+h2.size13 { font-size: 13px; }
+h2.size14 { font-size: 14px; }
+h2.size15 { font-size: 15px; }
+h2.size16 { font-size: 16px; }
+h2.size17 { font-size: 17px; }
+h2.size18 { font-size: 18px; }
+h2.size19 { font-size: 19px; }
+h2.size20 { font-size: 20px; }
+h2.size21 { font-size: 21px; }
+h2.size22 { font-size: 22px; }
+h2.size23 { font-size: 23px; }
+h2.size24 { font-size: 24px; }
+h2.size25 { font-size: 25px; }
+h2.size26 { font-size: 26px; }
+h2.size27 { font-size: 27px; }
+h2.size28 { font-size: 28px; }
+h2.size29 { font-size: 29px; }
+h2.size30 { font-size: 30px; }
+h2.size31 { font-size: 31px; }
+h2.size32 { font-size: 32px; }
+h2.size33 { font-size: 33px; }
+h2.size34 { font-size: 34px; }
+h2.size35 { font-size: 35px; }
+h2.size36 { font-size: 36px; }
+h2.size37 { font-size: 37px; }
+h2.size38 { font-size: 38px; }
+h2.size39 { font-size: 39px; }
+h2.size40 { font-size: 40px; }
+h2.size41 { font-size: 41px; }
+h2.size42 { font-size: 42px; }
+h2.size43 { font-size: 43px; }
+h2.size44 { font-size: 44px; }
+h2.size45 { font-size: 45px; }
+h2.size46 { font-size: 46px; }
+h2.size47 { font-size: 47px; }
+h2.size48 { font-size: 48px; }
+h2.size49 { font-size: 49px; }
+h2.size50 { font-size: 50px; }
+h2.size51 { font-size: 51px; }
+h2.size52 { font-size: 52px; }
+h2.size53 { font-size: 53px; }
+h2.size54 { font-size: 54px; }
+h2.size55 { font-size: 55px; }
+h2.size56 { font-size: 56px; }
+h2.size57 { font-size: 57px; }
+h2.size58 { font-size: 58px; }
+h2.size59 { font-size: 59px; }
+h2.size60 { font-size: 60px; }
+h2.size61 { font-size: 61px; }
+h2.size62 { font-size: 62px; }
+h2.size63 { font-size: 63px; }
+h2.size64 { font-size: 64px; }
+h2.size65 { font-size: 65px; }
+h2.size66 { font-size: 66px; }
+h2.size67 { font-size: 67px; }
+h2.size68 { font-size: 68px; }
+h2.size69 { font-size: 69px; }
+h2.size70 { font-size: 70px; }
+h2.size71 { font-size: 71px; }
+h2.size72 { font-size: 72px; }
+h2.size73 { font-size: 73px; }
+h2.size74 { font-size: 74px; }
+h2.size75 { font-size: 75px; }
+h2.size76 { font-size: 76px; }
+h2.size77 { font-size: 77px; }
+h2.size78 { font-size: 78px; }
+h2.size79 { font-size: 79px; }
+h2.size80 { font-size: 80px; }
+h2.size81 { font-size: 81px; }
+h2.size82 { font-size: 82px; }
+h2.size83 { font-size: 83px; }
+h2.size84 { font-size: 84px; }
+h2.size85 { font-size: 85px; }
+h2.size86 { font-size: 86px; }
+h2.size87 { font-size: 87px; }
+h2.size88 { font-size: 88px; }
+h2.size89 { font-size: 89px; }
+h2.size90 { font-size: 90px; }
+h2.size91 { font-size: 91px; }
+h2.size92 { font-size: 92px; }
+h2.size93 { font-size: 93px; }
+h2.size94 { font-size: 94px; }
+h2.size95 { font-size: 95px; }
+h2.size96 { font-size: 96px; }
+h2.size97 { font-size: 97px; }
+h2.size98 { font-size: 98px; }
+h2.size99 { font-size: 99px; }
+h2.size100 { font-size: 100px; }
+
+.cite:before {
+ content: "\201C";
+}
+.cite:after {
+ content: "\201D";
+}
+.cite > .cite:before {
+ content: "\2018";
+}
+.cite > .cite:after {
+ content: "\2019";
+}
+.bullet:before {
+ content: "\2022";
+}
+.dash:after {
+ content: "\2013";
+}
+.hellip:after {
+ content: "\2026";
+}
+.cite:lang(no):before {
+ content: "\00AB";
+}
+.cite:lang(no):after {
+ content: "\00BB";
+}
+/* Meta thingy
+------------------------------------------------------ */
+.breadcrumbs span.delimiter:before {
+ content: "\25BA";
+ margin-right: 8px;
+ font-size: 8px;
+ position: relative;
+ top: -2px;
+ margin: 0 5px 0 3px;
+ color: #00aaad;
+}
+.breadcrumbs {
+ font-size: 12px;
+ margin-bottom: 10px;
+}
+.summary,
+.summary p {
+ font-size: 16px;
+ line-height: 22px;
+ font-weight: 600 !important;
+ margin-bottom: 10px;
+}
+.metainfo { margin: 10px 0; }
+.byline, .meta {
+ color: #888;
+ display: block;
+ font-size: 12px;
+ margin-bottom: 0.8em;
+}
+.byline span.delimiter:before {
+ content: "\2022";
+ margin-right: 8px;
+ font-size: 8px;
+ position: relative;
+ top: -2px;
+ margin: 0 5px 0 5px;
+ color: #00aaad;
+}
+.phototext {
+ margin-top: 5px;
+ line-height: 18px;
+}
+.photoline {
+ margin-top: 5px;
+ font-style: italic;
+ font-size: 12px;
+ float: right;
+}
+.page h1 { margin-top: 10px; }
+.vignette {
+ background-color: #6e6e6e;
+ margin-top: 5px;
+ margin-bottom: 5px;
+ height: 8px;
+ position: relative;
+}
+.vignette span {
+ line-height: 19px;
+}
+div.page .vignette {
+ margin-bottom: 10px;
+}
+div.page .span11 img {
+ max-width: 488px;
+ height: auto;
+}
+.vignette > span {
+ text-transform: lowercase;
+ color: #6e6e6e;
+ display: block;
+ margin-left: 15px;
+ background-color: white;
+ position: absolute;
+ top: -6px;
+ font-size: 12px;
+ padding: 0 3px 0 3px;
+ font-weight: 500;
+}
+div.news33.category-news:nth-child(3n) {
+ clear: left;
+}
+div.portal > h1 {
+ font-size: 20px;
+ padding: 0 10px;
+ color: white;
+}
+h1.portal-creative {
+ background-color: #ec008c;
+}
+h1.portal-game {
+ background-color: #fba51e;
+}
+h1.portal-entertainmentlectures {
+ background-color: #819700;
+}
+div.portal > div.row {
+ margin-bottom: 40px;
+}
+div.category-news h2 a {
+ color: black;
+}
+/*
+ * CSS for The Gathering 2013.
+ * Copyright KANDU and contributors
+ */
+
+/* HTML & BODY
+------------------------------------------------------ */
+body {
+ background: url('/tg13/files/content/design/images/background.jpg') no-repeat;
+ background-position: top center;
+}
+
+html, body {
+ height:100%;
+}
+body.iframe {
+ background-image: none;
+ height: auto;
+}
+
+/* Generic styles
+------------------------------------------------------ */
+
+.hidden { display: none; }
+menu { margin: 0; padding: 0; }
+
+/* Containers and rows
+------------------------------------------------------ */
+.container {
+ width: 1320px;
+ margin: 0 auto;
+ zoom: 1;
+}
+
+.content {
+ width: 840px;
+}
+
+.container:before,
+.container:after {
+ zoom: 1;
+}
+.container:before,
+.container:after,
+.content:before,
+.content:after,
+.row:before,
+.row:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+.container:after,
+.row:after {
+ clear: both;
+}
+.row {
+ margin-left: -40px;
+}
+
+/* Main structure
+------------------------------------------------------ */
+header, header > div.container {
+}
+header {
+ margin-bottom: 40px;
+}
+header > div.container {
+}
+header > div.container .inner {
+ float: left;
+ width: 830px;
+}
+footer a, footer, footer p, footer h4 {
+ color: #2d4f9e;
+}
+footer a:hover {
+ color: #fff;
+}
+header a {
+ color: #c3027b;
+}
+header a:hover {
+ color: #860050;
+}
+header > div.container .logo {
+ float: left;
+ width: 250px;
+}
+header .left, header .left > div {
+ float: right;
+}
+header .right {
+ margin-left: 10px;
+ float: right;
+ width: 180px;
+}
+header .when {
+ background-color: #5a0037;
+ padding: 10px;
+ color: white;
+ border-bottom-right-radius: 6px;
+ border-bottom-left-radius: 6px;
+ font-size: 11px;
+ line-height: 12px;
+ width: 110px;
+ text-align: center;
+}
+header .when-phone .when {
+ width: 120px;
+}
+header .when-phone {
+ float: right;
+}
+header .language {
+ margin-top: 10px;
+ line-height: 25px;
+ font-weight: 300;
+ margin-right: 10px;
+ padding-right: 10px;
+ border-right: 1px solid white;
+ font-size: 12px;
+}
+header ul.promo-menu {
+ padding-top: 40px;
+ margin: 0 0 0 15px;
+}
+header ul.promo-menu a {
+ font-weight: bold;
+ font-size: 13px;
+}
+header ul li:before {
+ margin-top: 2px;
+ content: "\25A0";
+ position: absolute;
+ left: -15px;
+ width: 10px;
+ text-align: right;
+ color: #860050;
+ font-size: 18px;
+ line-height: 13px;
+}
+header .language a {
+ color: white;
+}
+header .language a:hover {
+ color: #2d4f9e;
+}
+footer {
+ margin-top: 80px;
+ background-color: #abdcff;
+ background-image: url('/tg13/files/content/design/images/footerbg.jpg');
+ background-repeat: no-repeat;
+ background-position: center bottom;
+}
+footer > div.container {
+ padding: 0px 0px 150px 0px;
+}
+.footer-about {
+ margin-bottom: 40px;
+ height: 100px;
+ position: relative;
+}
+.footer-about > span {
+ position: absolute !important;
+ bottom: 0; left: 0;
+}
+footer > div.container > div.row {
+ margin-top: 80px;
+}
+footer ul {
+ margin: 0;
+}
+footer h4 {
+ margin-bottom: 20px;
+}
+footer div.full-span2 > iframe {
+ margin: 20px 0px;
+}
+footer a {
+ line-height: 25px;
+}
+footer ul li::before {
+ content: "";
+}
+footer div.row {
+ margin-left: -20px;
+}
+footer div.row div.row {
+ margin-left: -40px;
+}
+.footnote p {
+ font-size: 13px;
+}
+.full-span9 { width: 1360px; }
+.full-span8 { width: 1280px; }
+.full-span7 { width: 1115px; }
+.full-span6 { width: 950px; }
+.full-span5 { width: 785px; }
+.full-span4 { width: 620px; }
+.full-span3 { width: 455px; }
+.full-span2 { width: 290px; }
+.full-span1 { width: 125px; }
+.content, .sidebar {
+ float: left;
+}
+.content {
+ margin: 0 40px 0 40px;
+}
+.sidebar {
+ width: 200px;
+}
+.sidebar.sponsor img {
+ width: 200px;
+}
+.sidebar.sponsor img,
+.sidebar.sponsor > div.vignette {
+ margin-bottom: 20px;
+}
+.sidebar.sponsor img {
+ filter: grayscale(100%);
+ -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%);
+ -ms-filter: grayscale(100%); -o-filter: grayscale(100%);
+ filter: url(/tg13/files/content/design/css/filters.svg#grayscale);
+ filter: gray;
+ -webkit-filter: grayscale(1);
+}
+.sidebar.sponsor img:hover {
+ filter: none;
+ -webkit-filter: grayscale(0%); -moz-filter: grayscale(0%);
+ -ms-filter: grayscale(0%); -o-filter: grayscale(0%);
+}
+.fb-comments, .fb-comments *, .fb_iframe_widget, .fb_iframe_widget * {width: 100% !important;}
+.span4 iframe {
+ width: 100%;
+}
+div.comments_header {
+ padding:8px;
+ background-color: #b1b1b1;
+ color: white;
+ border-radius: 5px;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ margin-bottom: 10px;
+ margin-top: 10px;
+}
+div.comments_header > div {
+ float: left;
+ margin-right: 8px;
+ content:url('/tg13/files/content/design/images/info.png');
+}
+div.comments_header h4 {
+ line-height: 34px;
+ color: white;
+}
+div.comments_header p {
+ clear: both;
+ margin: 8px 0 0 0 !important;
+ font-size: 12px;
+ line-height: 15px;
+}
+.media-page {
+ margin-left: 40px;
+}
+.videoWrapper, #mediaspace {
+ position: relative;
+ padding-bottom: 56.25%; /* 16:9 */
+ padding-top: 25px;
+ height: 0;
+ margin-bottom: 0.8em;
+}
+.videoWrapper iframe, #mediaspace embed {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+.stream-icon {
+ float: left;
+ margin-right: 10px;
+}
+.stream-link { margin-bottom: 8px;}
+#galleria {
+ width: 840px;
+}
+
+/* Menu & Sidebar
+------------------------------------------------------ */
+
+menu {
+ list-style: none;
+}
+menu a {
+ color: #777;
+}
+menu a:hover, li[class^="menu-"] a:hover {
+ color: black;
+}
+li.menu-creative a, li.menu-creative span, li.menu-creative + menu.sub-menu a, li.menu-creative + menu.submenu span {
+ color: #ec008c;
+}
+li.menu-game a, li.menu-game span, li.menu-game + menu.sub-menu a, li.menu-game + menu.submenu span {
+ color: #fba51e;
+}
+li.menu-tickets a, li.menu-tickets span, li.menu-tickets + menu.sub-menu a, li.menu-tickets + menu.submenu span {
+ color: #00aaad;
+}
+li.menu-guide a, li.menu-guide span, li.menu-guide + menu.sub-menu a, li.menu-guide + menu.submenu span {
+ color: #034ea2;
+}
+li.menu-entertainment-lectures a, li.menu-entertainment-lectures span, li.menu-entertainment-lectures + menu.sub-menu a, li.menu-entertainment-lectures + menu.submenu span {
+ color: #819700;
+}
+menu.top-menu > li {
+ margin-bottom: 10px;
+}
+
+div.top-menu-text > span {
+ color: #7595af;
+ font-size: 23px;
+ font-weight: bold;
+ display: table-row;
+ line-height: 23px;
+}
+div.top-menu-text > span.help-text {
+ font-weight: normal;
+ font-size: 14px;
+ display: table-row;
+ color: #a3a3a3;
+ line-height: 15px;
+}
+div.top-menu-text {
+ height: 38px;
+ padding: 6px 0 6px 0;
+ margin: 0 0 0 56px;
+}
+div.top-menu-icon {
+ width: 50px;
+ height: 50px;
+ float: left;
+ background-color: #bfd4e5;
+ border-radius: 5px;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+}
+menu.top-menu a:hover div.top-menu-text > span,
+menu.top-menu a:hover div.top-menu-text > span.help-text {
+ color: #27448b;
+}
+menu.top-menu a:hover div.top-menu-icon {
+ background-color: #3d6db3;
+}
+div.top-menu-icon.icon-schedule {
+ background-image: url('/tg13/files/content/design/images/schedule.png');
+}
+div.top-menu-icon.icon-tgtv {
+ background-image: url('/tg13/files/content/design/images/tgtv.png');
+}
+div.top-menu-icon.icon-tng {
+ background-image: url('/tg13/files/content/design/images/tng.png');
+}
+div.top-menu-icon.icon-forum {
+ background-image: url('/tg13/files/content/design/images/forum.png');
+}
+div.top-menu-icon.icon-compo {
+ background-image: url('/tg13/files/content/design/images/compo.png');
+}
+div.top-menu-icon.icon-news {
+ background-image: url('/tg13/files/content/design/images/news.png');
+}
+menu.section-menu {
+ margin-top: 40px;
+ margin-left: 15px;
+}
+menu.section-menu li {
+ margin-bottom: 15px;
+}
+menu.sub-menu {
+ margin-bottom: 20px;
+ margin-left: 15px;
+}
+span.menu-expand {
+ display: block;
+ float: left;
+ margin-left: -15px;
+ cursor: pointer;
+}
+
+/* Graphical Elements
+------------------------------------------------------ */
+/* Language
+------------------------------------------------------ */
+/* Search
+------------------------------------------------------ */
+.search input {
+ vertical-align: top;
+ line-height: 1;
+}
+.search input[type="search"] {
+ -webkit-appearance: none;
+ box-sizing:content-box;
+ padding: 0;
+ padding-left: 3px;
+ margin: 0;
+ margin-top: 10px;
+ border: none;
+ color: #9dbfd9;
+ height: 25px;
+ width: 200px;
+ font-size: 12px;
+ font-style: italic;
+ border-radius: 3px;
+ line-height: 15px;
+}
+.search input:focus {
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+ outline: 0;
+}
+input[type=search]::-webkit-search-decoration {
+ -webkit-appearance:none;
+}
+input::-webkit-input-placeholder,
+isindex::-webkit-input-placeholder,
+textarea::-webkit-input-placeholder,
+input::-moz-placeholder,
+textarea::-moz-placeholder {
+ font-style: italic;
+ color: silver;
+}
+/* News
+------------------------------------------------------ */
+.news { position: relative; }
+
+.news100, .clearer, .span19 { width: 840px; }
+.span18 { width: 796px; }
+.span17 { width: 752px; }
+.span16 { width: 708px; }
+.span15 { width: 664px; }
+.news75, .span14 { width: 620px; }
+.span13 { width: 576px; }
+.news66, .span-two-third { width: 547px; }
+.span12 { width: 532px; }
+.span11 { width: 488px; }
+.span10 { width: 444px; }
+.news50, .span9 { width: 400px; }
+.span8 { width: 356px; }
+.span7 { width: 312px; }
+.span6 { width: 268px; }
+.news33, .span-one-third { width: 253px; }
+.span5 { width: 224px; }
+.news25, .span4 { width: 180px; }
+.span3 { width: 136px; }
+.span2 { width: 92px; }
+.span1 { width: 48px; }
+.clearer { clear: both; margin: 0px 0px 0px 40px !important; }
+
+div[class^="news"] > span,
+div[class^="full-span"] > span,
+div[class^="span"] > span {
+ position: relative;
+ display: block;
+}
+div[class^="news"] p,
+div[class^="full-span"] p,
+div[class^="span"] p {
+ margin: 0;
+}
+.article {
+ float: left;
+ margin: 0px 0px 40px 40px;
+}
+.article a,
+.article a:hover {
+ text-decoration: none;
+ color: #777;
+}
+
+.news_img_100 {
+ width: 100%;
+ margin: 20px 0 10px 0;
+}
+img.news_img_right {
+ width: 50%;
+ float: right;
+ margin: 0 0 20px 40px;
+}
+.span2.social-news div {
+ margin-bottom: 10px;
+}
+.icon-more > a {
+ float: right;
+ font-size: 13px;
+ margin-right: 21px;
+}
+.icon-more {
+ position: relative;
+}
+.icon-more > a::after {
+ margin-top: 2px;
+ padding-left: 3px;
+ padding-top: 2px;
+ padding-bottom: 1px;
+ margin-left: 5px;
+ position: absolute;
+ content: "\25BA";
+ color: white;
+ background-color: black;
+ -webkit-border-radius: 8px;
+ -moz-border-radius: 8px;
+ border-radius: 8px;
+ width: 13px;
+ height: 13px;
+ font-size: 11px;
+ line-height: 11px;
+}
+
+/* Page
+------------------------------------------------------ */
+.page {
+ float: left;
+ margin: 0px 0px 40px 40px;
+}
+.page .page {
+ margin-left: 0px;
+}
+.page .page.news33 {
+ margin-left: 40px;
+}
+div.news-portal-header {
+ width: 840px;
+ margin-left: 40px !important;
+}
+div[class^="full-span"],
+.page div[class^="news"],
+.page div[class^="span"]{
+ float: left;
+ margin-left: 40px;
+}
+.page h3 a,
+.page li a {
+ border: none;
+}
+.page-right {
+ float: right;
+ clear: right;
+ margin-bottom: 40px;
+ margin-left: 40px;
+}
+.page-right a {
+ border: none;
+}
+.page-sidebar {
+ margin-left: 40px;
+}
+.page-right h3,
+.page-sidebar h3 {
+ border-bottom: solid 4px #c0c4c5;
+ position: relative;
+ margin: 0 0 10px 0;
+}
+.page-sidebar .meta {
+ text-transform: uppercase;
+ font-size: 10px;
+}
+.page-sidebar {
+ position: relative;
+}
+.related-news {
+ margin-bottom: 8px;
+}
+.img-container {
+ margin-bottom: -5px;
+}
+.img-container a {
+ display:block;
+}
+/* Article skins
+------------------------------------------------------ */
+div.article.skin-important {
+ background-color: black;
+ color: white;
+}
+div.article.skin-important {
+ padding-bottom: 40px;
+}
+div.article.skin-important > div[class^="news"] > span.content-container,
+div.article.skin-important > div[class^="news"] > span.title-container {
+ margin-left: 40px;
+ margin-right: 40px;
+}
+div.article.skin-important > div[class^="news"] > span.title-container {
+ padding-top: 40px;
+}
+div.article.skin-important p,
+div.article.skin-important h2,
+div.article.skin-important a,
+div.article.skin-important a:hover,
+div.article.skin-important a:visited {
+ color: white;
+}
+div.article.skin-game .vignette,
+div.article.skin-creative .vignette,
+div.article.skin-entertainment .vignette {
+ background-color: #000;
+ margin: 5px 0 5px 0;
+ height: 8px;
+ position: relative;
+}
+div.article.skin-game .vignette span,
+div.article.skin-creative .vignette span,
+div.article.skin-entertainment .vignette span {
+ text-transform: lowercase;
+ color: #000;
+ display: block;
+ margin-left: 15px;
+ background-color: white;
+ position: absolute;
+ top: -6px;
+ font-size: 12px;
+ padding: 0 3px 0 3px;
+ font-weight: 500;
+}
+div.article.skin-game .vignette,
+div.vignette.category-game {
+ background-color: #fba51e;
+}
+div.article.skin-creative .vignette,
+div.vignette.category-creative {
+ background-color: #ec008c;
+}
+div.article.skin-entertainment .vignette,
+div.vignette.category-entertainmentlectures {
+ background-color: #819700;
+}
+div.article.skin-game .vignette span,
+div.vignette.category-game span{
+ color: #fba51e;
+}
+div.article.skin-creative .vignette span,
+div.vignette.category-creative span{
+ color: #ec008c;
+}
+div.article.skin-entertainment .vignette span,
+div.vignette.category-entertainmentlectures span{
+ color: #819700;
+}
+div.article.skin-info {
+ background-color: #E6E7E8;
+ padding-bottom: 40px;
+}
+div.article.skin-info > div[class^="news"] > span.content-container,
+div.article.skin-info > div[class^="news"] > span.title-container {
+ margin-left: 40px;
+ margin-right: 40px;
+}
+div.article.skin-info > div[class^="news"] > span.title-container {
+ padding-top: 40px;
+}
+div.article.skin-important > div[class^="news"] > span.img-container,
+div.article.skin-info > div[class^="news"] > span.img-container {
+ margin-bottom: -25px;
+}
+
+/* Modal
+------------------------------------------------------ */
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1040;
+ background-color: #000000;
+}
+.modal-backdrop.fade {
+ opacity: 0;
+}
+.modal-backdrop {
+ opacity: 0.8;
+ filter: alpha(opacity=80);
+}
+.modal-c {
+ width: 800px;
+}
+.modal {
+ position: absolute;
+ top: 206px;
+ z-index: 1050;
+ width: 800px;
+ margin: 0 auto;
+ background-color: #ffffff;
+ -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+ -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+ box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding-box;
+ background-clip: padding-box;
+}
+.modal-body {
+ padding: 20px;
+ padding-top: 10px;
+}
+.modal-body .modal-form {
+ margin-bottom: 0;
+}
+.right {
+ float: right;
+}
+
+/* Video
+----------------------------------------------------- */
+
+.video h2 {
+ margin-top: 10px;
+ margin-bottom: 5px;
+}
+.tags span {
+ margin-left: 5px;
+ padding: 3px 4px;
+ border: 1px solid #DDD;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+.tags span:hover {
+ background-color: whiteSmoke;
+}
+.tags span:hover a {
+ color: black;
+}
+.tags span a {
+ color: #07A430;
+ border-bottom: none !important;
+}
+.tags span a:hover {
+ border-bottom: none !important;
+}
+.tags {
+ margin-bottom: 20px;
+}
+
+/* Buttons
+----------------------------------------------------- */
+.btn.stage,
+.btn.stage.active,
+.btn.stage:hover,
+.btn.game,
+.btn.game.active,
+.btn.game:hover,
+.btn.creative,
+.btn.creative.active,
+.btn.creative:hover,
+.btn.auditorium,
+.btn.auditorium.active,
+.btn.auditorium:hover {
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ color: white;
+}
+.btn.stage {
+ background-color: #ff7800;
+ background-image: -moz-linear-gradient(top, #ff7800, #db4d00);
+ background-image: -ms-linear-gradient(top, #ff7800, #db4d00);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ff7800), to(#db4d00));
+ background-image: -webkit-linear-gradient(top, #ff7800, #db4d00);
+ background-image: -o-linear-gradient(top, #ff7800, #db4d00);
+ background-image: linear-gradient(top, #ff7800, #db4d00);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff7800', endColorstr='#db4d00', GradientType=0);
+ border-color: #db4d00 #db4d00 #ca4900;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn.stage:hover,
+.btn.stage:active,
+.btn.stage.active,
+.btn.stage.disabled,
+.btn.stage[disabled] {
+ background-color: #db4d00;
+}
+.btn.stage:active, .btn.stage.active {
+ background-color: #e65a99 \9;
+}
+.btn.game {
+ background-color: #49afcd;
+ background-image: -moz-linear-gradient(top, #009cff, #0078c4);
+ background-image: -ms-linear-gradient(top, #009cff, #0078c4);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#009cff), to(#0078c4));
+ background-image: -webkit-linear-gradient(top, #009cff, #0078c4);
+ background-image: -o-linear-gradient(top, #009cff, #0078c4);
+ background-image: linear-gradient(top, #009cff, #0078c4);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#009cff', endColorstr='#0078c4', GradientType=0);
+ border-color: #0078c4 #0078c4 #0062a0;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn.game:hover,
+.btn.game:active,
+.btn.game.active,
+.btn.game.disabled,
+.btn.game[disabled] {
+ background-color: #0078c4;
+}
+.btn.game:active, .btn.game.active {
+ background-color: #0089e0 \9;
+}
+.btn.auditorium {
+ background-color: #49afcd;
+ background-image: -moz-linear-gradient(top, #f33183, #dc0c64);
+ background-image: -ms-linear-gradient(top, #f33183, #dc0c64);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f33183), to(#dc0c64));
+ background-image: -webkit-linear-gradient(top, #f33183, #dc0c64);
+ background-image: -o-linear-gradient(top, #f33183, #dc0c64);
+ background-image: linear-gradient(top, #f33183, #dc0c64);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f33183', endColorstr='#dc0c64', GradientType=0);
+ border-color: #dc0c64 #dc0c64 #bb004f;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn.auditorium:hover,
+.btn.auditorium:active,
+.btn.auditorium.active,
+.btn.auditorium.disabled,
+.btn.auditorium[disabled] {
+ background-color: #dc0c64;
+}
+.btn.auditorium:active, .btn.auditorium.active {
+ background-color: #e81f74 \9;
+}
+.btn.creative {
+ background-color: #009997;
+ background-image: -moz-linear-gradient(top, #009997, #007170);
+ background-image: -ms-linear-gradient(top, #009997, #007170);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#009997), to(#007170));
+ background-image: -webkit-linear-gradient(top, #009997, #007170);
+ background-image: -o-linear-gradient(top, #009997, #007170);
+ background-image: linear-gradient(top, #009997, #007170);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#009997', endColorstr='#007170', GradientType=0);
+ border-color: #007170 #007170 #004e4d;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn.creative:hover,
+.btn.creative:active,
+.btn.creative.active,
+.btn.creative.disabled,
+.btn.creative[disabled] {
+ background-color: #007170;
+}
+.btn.creative:active, .btn.creative.active {
+ background-color: #007f7d \9;
+}
+.btn {
+ display: inline-block;
+ padding: 4px 10px 4px;
+ font-size: 13px;
+ line-height: 18px;
+ color: #333;
+ text-align: center;
+ text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+ background-color: #FAFAFA;
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(white), color-stop(25%, white), to(#E6E6E6));
+ background-image: -webkit-linear-gradient(white, white 25%, #E6E6E6);
+ background-image: -moz-linear-gradient(top, white, white 25%, #E6E6E6);
+ background-image: -ms-linear-gradient(white, white 25%, #E6E6E6);
+ background-image: -o-linear-gradient(white, white 25%, #E6E6E6);
+ background-image: linear-gradient(white, white 25%, #E6E6E6);
+ background-repeat: no-repeat;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);
+ border: 1px solid #CCC;
+ border-bottom-color: #BBB;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ cursor: pointer;
+}
+.btn:first-child {
+ *margin-left: 0;
+}
+.btn:hover {
+ color: #333333;
+ text-decoration: none;
+ background-color: #e6e6e6;
+ background-position: 0 -15px;
+ -webkit-transition: background-position 0.1s linear;
+ -moz-transition: background-position 0.1s linear;
+ -ms-transition: background-position 0.1s linear;
+ -o-transition: background-position 0.1s linear;
+ transition: background-position 0.1s linear;
+}
+.btn:focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+.btn.active, .btn:active {
+ background-image: none;
+ -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+ background-color: #e6e6e6;
+ background-color: #d9d9d9 \9;
+ color: rgba(0, 0, 0, 0.5);
+ outline: 0;
+}
+.btn-group {
+ position: relative;
+ *zoom: 1;
+ *margin-left: .3em;
+}
+.btn-group:before, .btn-group:after {
+ display: table;
+ content: "";
+}
+.btn-group:after {
+ clear: both;
+}
+.btn-group:first-child {
+ *margin-left: 0;
+}
+.btn-group + .btn-group {
+ margin-left: 5px;
+}
+.btn-group .btn {
+ position: relative;
+ float: left;
+ margin-left: -1px;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+.btn-group .btn:first-child {
+ margin-left: 0;
+ -webkit-border-top-left-radius: 4px;
+ -moz-border-radius-topleft: 4px;
+ border-top-left-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ -moz-border-radius-bottomleft: 4px;
+ border-bottom-left-radius: 4px;
+}
+.btn-group .btn:last-child, .btn-group .dropdown-toggle {
+ -webkit-border-top-right-radius: 4px;
+ -moz-border-radius-topright: 4px;
+ border-top-right-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -moz-border-radius-bottomright: 4px;
+ border-bottom-right-radius: 4px;
+}
+.btn-group .btn.large:first-child {
+ margin-left: 0;
+ -webkit-border-top-left-radius: 6px;
+ -moz-border-radius-topleft: 6px;
+ border-top-left-radius: 6px;
+ -webkit-border-bottom-left-radius: 6px;
+ -moz-border-radius-bottomleft: 6px;
+ border-bottom-left-radius: 6px;
+}
+.btn-group .btn.large:last-child, .btn-group .large.dropdown-toggle {
+ -webkit-border-top-right-radius: 6px;
+ -moz-border-radius-topright: 6px;
+ border-top-right-radius: 6px;
+ -webkit-border-bottom-right-radius: 6px;
+ -moz-border-radius-bottomright: 6px;
+ border-bottom-right-radius: 6px;
+}
+.btn-group .btn:hover,
+.btn-group .btn:focus,
+.btn-group .btn:active,
+.btn-group .btn.active {
+ z-index: 2;
+}
+.page a.btn,
+.page a.btn::hover {
+ border-bottom: 1px solid #CCC;
+}
+
+/* Schedule
+------------------------------------------------------ */
+a.stage {
+ color: white;
+ background-color: #819700;
+}
+a.game {
+ color: white;
+ background-color: #fba51e;
+}
+a.auditorium {
+ color: black;
+ background-color: #d8e600;
+}
+a.creative {
+ color: white;
+ background-color: #ec008c;
+}
+a.agora {
+ color: white;
+ background-color: #2e4f9e;
+}
+a.remove-filter {
+ color: white;
+ background-color: #CCC;
+}
+.filterLink {
+ padding: 3px 6px;
+ margin-right: 5px;
+ line-height: 28px;
+}
+.calendar .stage {
+ color: #819700;
+ font-size: 25px;
+}
+.calendar .game {
+ color: #fba51e;
+ font-size: 25px;
+}
+.calendar .auditorium {
+ color: #d8e600;
+ font-size: 25px;
+}
+.calendar .creative {
+ color: #ec008c;
+ font-size: 25px;
+}
+.calendar .agora {
+ color: #2e4f9e;
+ font-size: 25px;
+}
+.calendar tr td {
+ text-align: left;
+}
+.calendar td, .calendar td {
+ min-width: 0;
+}
+.calendar tbody tr:nth-child(even) td {
+ background-color: transparent;
+}
+.calendar tbody tr.odd td {
+ background-color: #F2F2F2;
+}
+/* Responsive
+------------------------------------------------------ */
+@media (max-width: 1320px) {
+ footer {
+ width: 1320px;
+ }
+}
+@media (max-width: 1094px) {
+ div.news-portal-header {
+ width: 630px;
+ margin-left: 30px !important;
+ }
+ .news100, .clearer, .span19 { width: 630px; }
+ .span18 { width: 597px; }
+ .span17 { width: 564px; }
+ .span16 { width: 531px; }
+ .span15 { width: 498px; }
+ .news75, .span14 { width: 465px; }
+ .span13 { width: 432px; }
+ .news66, .span-two-third { width: 410px; }
+ .span12 { width: 399px; }
+ .span11 { width: 366px; }
+ .span10 { width: 333px; }
+ .news50, .span9 { width: 300px; }
+ .span8 { width: 267px; }
+ .span7 { width: 234px; }
+ .span6 { width: 201px; }
+ .news33, .span-one-third { width: 190px; }
+ .span5 { width: 168px; }
+ .news25, .span4 { width: 135px; }
+ .span3 { width: 102px; }
+ .span2 { width: 69px; }
+ .span1 { width: 36px; }
+ .clearer { margin: 0px 0px 0px 30px !important; }
+ .full-span9 { width: 1094px; }
+ .full-span8 { width: 1034x; }
+ .full-span7 { width: 901px; }
+ .full-span6 { width: 768px; }
+ .full-span5 { width: 635px; }
+ .full-span4 { width: 502px; }
+ .full-span3 { width: 369px; }
+ .full-span2 { width: 236px; }
+ .full-span1 { width: 103px; }
+ .img-container.news100 img { width: 630px; height: auto; }
+ .img-container.news75 img { width: 465px; height: auto; }
+ .img-container.news66 img { width: 410px; height: auto; }
+ .img-container.news50 img { width: 300px; height: auto; }
+ .img-container.news33 img { width: 190px; height: auto; }
+ .img-container.news25 img { width: 135px; height: auto; }
+ .title-container h2 {
+ margin-bottom: 4px;
+ font-size: 19px;
+ }
+ h2.size13 { font-size: 9px; }
+ h2.size14 { font-size: 10px; }
+ h2.size15 { font-size: 11px; }
+ h2.size16 { font-size: 12px; }
+ h2.size17 { font-size: 12px; }
+ h2.size18 { font-size: 13px; }
+ h2.size19 { font-size: 14px; }
+ h2.size20 { font-size: 15px; }
+ h2.size21 { font-size: 15px; }
+ h2.size22 { font-size: 16px; }
+ h2.size23 { font-size: 17px; }
+ h2.size24 { font-size: 18px; }
+ h2.size25 { font-size: 18px; }
+ h2.size26 { font-size: 19px; }
+ h2.size27 { font-size: 20px; }
+ h2.size28 { font-size: 21px; }
+ h2.size29 { font-size: 21px; }
+ h2.size30 { font-size: 22px; }
+ h2.size31 { font-size: 23px; }
+ h2.size32 { font-size: 24px; }
+ h2.size33 { font-size: 24px; }
+ h2.size34 { font-size: 25px; }
+ h2.size35 { font-size: 26px; }
+ h2.size36 { font-size: 27px; }
+ h2.size37 { font-size: 27px; }
+ h2.size38 { font-size: 28px; }
+ h2.size39 { font-size: 29px; }
+ h2.size40 { font-size: 30px; }
+ h2.size41 { font-size: 30px; }
+ h2.size42 { font-size: 31px; }
+ h2.size43 { font-size: 32px; }
+ h2.size44 { font-size: 33px; }
+ h2.size45 { font-size: 33px; }
+ h2.size46 { font-size: 34px; }
+ h2.size47 { font-size: 35px; }
+ h2.size48 { font-size: 36px; }
+ h2.size49 { font-size: 36px; }
+ h2.size50 { font-size: 37px; }
+ h2.size51 { font-size: 38px; }
+ h2.size52 { font-size: 39px; }
+ h2.size53 { font-size: 39px; }
+ h2.size54 { font-size: 40px; }
+ h2.size55 { font-size: 41px; }
+ h2.size56 { font-size: 42px; }
+ h2.size57 { font-size: 42px; }
+ h2.size58 { font-size: 43px; }
+ h2.size59 { font-size: 44px; }
+ h2.size60 { font-size: 45px; }
+ h2.size61 { font-size: 45px; }
+ h2.size62 { font-size: 46px; }
+ h2.size63 { font-size: 47px; }
+ h2.size64 { font-size: 48px; }
+ h2.size65 { font-size: 48px; }
+ h2.size66 { font-size: 49px; }
+ h2.size67 { font-size: 50px; }
+ h2.size68 { font-size: 51px; }
+ h2.size69 { font-size: 51px; }
+ h2.size70 { font-size: 52px; }
+ h2.size71 { font-size: 53px; }
+ h2.size72 { font-size: 54px; }
+ h2.size73 { font-size: 54px; }
+ h2.size74 { font-size: 55px; }
+ h2.size75 { font-size: 56px; }
+ h2.size76 { font-size: 57px; }
+ h2.size77 { font-size: 57px; }
+ h2.size78 { font-size: 58px; }
+ h2.size79 { font-size: 59px; }
+ h2.size80 { font-size: 60px; }
+ h2.size81 { font-size: 60px; }
+ h2.size82 { font-size: 61px; }
+ h2.size83 { font-size: 62px; }
+ h2.size84 { font-size: 63px; }
+ h2.size85 { font-size: 63px; }
+ h2.size86 { font-size: 64px; }
+ h2.size87 { font-size: 65px; }
+ h2.size88 { font-size: 66px; }
+ h2.size89 { font-size: 66px; }
+ h2.size90 { font-size: 67px; }
+ h2.size91 { font-size: 68px; }
+ h2.size92 { font-size: 69px; }
+ h2.size93 { font-size: 69px; }
+ h2.size94 { font-size: 70px; }
+ h2.size95 { font-size: 71px; }
+ h2.size96 { font-size: 72px; }
+ h2.size97 { font-size: 72px; }
+ h2.size98 { font-size: 73px; }
+ h2.size99 { font-size: 74px; }
+ h2.size100 { font-size: 75px; }
+ .content-container p {
+ font-size: 12px !important;
+ line-height: 14px !important;
+ font-weight: 300;
+ }
+ .article, .page, .page-right {
+ margin: 0px 0px 30px 30px;
+ }
+ .page div[class^="news"],
+ div[class^="full-span"],
+ .page div[class^="span"]{
+ margin-left: 30px;
+ }
+ .content {
+ width: 630px;
+ margin: 0 30px 0 30px;
+ }
+ .row {
+ margin-left: -30px;
+ }
+ footer div.row {
+ margin-left: -15px;
+ }
+ .container, footer {
+ width: 1094px;
+ }
+ .sidebar {
+ width: 202px;
+ }
+ .img-container {
+ margin-bottom: 4px;
+ }
+ div[class^="news"] p,
+ div[class^="full-span"] p,
+ div[class^="span"] p {
+ line-height: 18px;
+ }
+ div.article.skin-important {
+ padding-bottom: 30px;
+ }
+ div.article.skin-important > div[class^="news"] > span.content-container,
+ div.article.skin-important > div[class^="news"] > span.title-*,
+ div.article.skin-info > div[class^="news"] > span.content-container,
+ div.article.skin-info > div[class^="news"] > span.title-container {
+ margin-left: 30px;
+ margin-right: 30px;
+ }
+ div.article.skin-important > div[class^="news"] > span.title-container,
+ div.article.skin-info > div[class^="news"] > span.title-container {
+ padding-top: 30px;
+ }
+ .row.news .page img {
+ width: 100%;
+ }
+ header > div.container .inner {
+ width: 640px;
+ }
+ div.page .span11 img {
+ max-width: 366px;
+ height: auto;
+ }
+ footer div.row div.row {
+ margin-left: -30px;
+ }
+ div.content > div.row > div.page > img {
+ width: 630px;
+ height: auto;
+ }
+ div.content > div.row.news > iframe.full {
+ width: 630px;
+ margin-left: 30px;
+ }
+ #galleria {
+ width: 630px;
+ }
+ .media-page {
+ margin-left: 30px;
+ }
+}
+@media (max-width: 767px) {
+ .media-page {
+ margin-left: 0px;
+ }
+ div.page.news33.category-news {
+ margin-bottom: 40px;
+ }
+ div.news-portal-header {
+ width: 100%;
+ margin-left: 0px !important;
+ }
+ .img-container.news100 img,
+ .img-container.news75 img,
+ .img-container.news66 img,
+ .img-container.news50 img,
+ .img-container.news33 img,
+ .img-container.news25 img,
+ div.page .span11 img {
+ width: 100%;
+ height: auto;
+ }
+ .img-container { width: 100%; }
+ .img-container a { display:block; width: 100%; }
+ div[class^="news"],
+ div[class^="span"],
+ div[class^="full-span"],
+ .page div[class^="news"],
+ .page div[class^="span"],
+ .clearer, .content, .container, .sidebar, .page, header > div.container .inner, footer {
+ width: auto;
+ float: none;
+ clear: both;
+ }
+ .content {
+ margin: 0px 20px 20px 20px;
+ }
+ div.article.skin-important {
+ padding-bottom: 20px;
+ }
+ div.article {
+ width: 100% !important;
+ margin-left: 0;
+ }
+ .row.news {
+ margin-left: 0;
+ }
+ div.article.skin-important > div[class^="news"] > span.content-container,
+ div.article.skin-important > div[class^="news"] > span.title-container,
+ div.article.skin-info > div[class^="news"] > span.content-container,
+ div.article.skin-info > div[class^="news"] > span.title-container {
+ width: auto;
+ margin-left: 10px;
+ margin-right: 10px;
+ }
+ div.article.skin-important > div[class^="news"] > span.title-container,
+ div.article.skin-info > div[class^="news"] > span.title-container {
+ padding-top: 20px;
+ }
+ .content > div[class^="news"],
+ div[class^="span"] {
+ margin: 0 0 0 20px;
+ }
+ h2[class^="size"] {
+ font-size: 15px;
+ }
+ .sidebar {
+ margin: 0 20px 20px 20px;
+ }
+ header, footer {
+ padding: 0 20px 20px 20px;
+ }
+ .sidebar.sponsor a {
+ margin: 0 10px 10px 0;
+ float: left;
+ }
+ .sidebar.sponsor div.vignette {
+ clear: both;
+ }
+ .footnote > div {
+ width: auto;
+ display: block;
+ text-align: center;
+ }
+ footer div[class^="full-span"] {
+ margin-bottom: 20px;
+ }
+ .social-news > div {
+ float: left;
+ margin-right: 20px;
+ }
+ menu.top-menu {
+ height: 100px;
+ }
+ menu.top-menu li {
+ width: 45%;
+ float: left;
+ background-color: #bfd4e5;
+ border-radius: 5px;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ }
+ menu.top-menu li > a {
+ color: white;
+ }
+ menu.top-menu .top-menu-text {
+ text-align: center;
+ margin: 0;
+ }
+ menu.top-menu .top-menu-text > span:first-child {
+ display: block;
+ font-size: 15px;
+ line-height: 38px;
+ }
+ menu.top-menu > li:nth-child(odd) {
+ margin-right: 10%;
+ }
+ div.top-menu-icon {
+ display: none;
+ }
+ .hidden-phone {
+ display: none;
+ }
+ .visible-phone {
+ display: block;
+ }
+ menu.section-menu {
+ margin: 20px 0px 0px;
+ padding: 60px 10px 10px;
+ background-color: #555;
+ border-radius: 5px;
+ color: white;
+ }
+ menu.section-menu li {
+ padding: 6px;
+ border-radius: 5px;
+ }
+ menu.section-menu a, menu.section-menu a:hover {
+ color: white;
+ }
+ div.top-menu-text > span.help-text {
+ display: none;
+ }
+ th, td {
+ min-width: 0px;
+ }
+ .section-menu-button {
+ float: right;
+ margin-bottom: 15px;
+ }
+ .section-menu-button a {
+ width: 70px;
+ height: 50px;
+ line-height: 50px;
+ display: block;
+ text-align: center;
+ border-radius: 5px;
+ background-color: #555;
+ color: white;
+ }
+ .section-menu-button a:hover, menu.section-menu li:hover {
+ background-color: #6f6f6f;
+ }
+ h1 { font-size: 25px; line-height: 30px; margin-bottom: 10px; }
+ h2 { font-size: 20px; line-height: 25px; margin-bottom: 8px;}
+ h3 { font-size: 15px; line-height: 20px; }
+ h4 { font-size: 12px; line-height: 17px; }
+ h5 { font-size: 12px; line-height: 17px; }
+ h6 { font-size: 12px; line-height: 17px; }
+ .row.news .page {
+ margin: 0px;
+ }
+ header {
+ margin-bottom: 0px;
+ }
+ menu.top-menu a:hover div.top-menu-text > span, menu.top-menu a:hover div.top-menu-text > span.help-text, div.top-menu-text > span {
+ color: white;
+ }
+ div.logo {
+ width: 132px;
+ }
+ div.logo img {
+ height: 100px;
+ }
+ div.inner div.when {
+ display: none;
+ }
+ div.inner div.right {
+ float: left;
+ }
+ footer > div.container > div.row {
+ margin-top: 30px;
+ }
+ div[class^="full-span"] {
+ margin: 0px 0px 0px 15px;
+ }
+ footer .search input[type="search"]{
+ width: 100%;
+ }
+ footer .language {
+ text-align: center;
+ }
+ footer > div.container {
+ padding: 0px 0px 90px 0px;
+ }
+ header ul.promo-menu {
+ padding-top: 20px;
+ }
+ footer div.row div.row {
+ margin-left: -20px;
+ }
+ div.content > div.row > div.page > img {
+ width: 100%;
+ height: auto;
+ }
+ div.content > div.row.news > iframe.full {
+ width: 100%;
+ margin-left: 0px;
+ }
+ #galleria {
+ width: 100%;
+ }
+ div.calendar table,
+ div.calendar table thead,
+ div.calendar table tbody,
+ div.calendar table th,
+ div.calendar table td,
+ div.calendar table tr {
+ display: block;
+ }
+ div.calendar table thead tr {
+ position: absolute;
+ top: -9999px;
+ left: -9999px;
+ }
+ div.calendar table td {
+ border: none;
+ border-bottom: 1px solid #CCC;
+ position: relative;
+ padding-left: 20%;
+ white-space: normal;
+ text-align: left;
+ }
+ div.calendar table td:before {
+ position: absolute;
+ top: 6px;
+ left: 6px;
+ width: 45%;
+ padding-right: 10px;
+ white-space: nowrap;
+ text-align:left;
+ font-weight: bold;
+ content: attr(data-title);
+ }
+ .filterLink {
+ clear: right;
+ display: block;
+ text-align: center;
+ }
+ li.menu-creative a, li.menu-creative span, li.menu-creative + menu.sub-menu a, li.menu-creative + menu.submenu span,
+ li.menu-game a, li.menu-game span, li.menu-game + menu.sub-menu a, li.menu-game + menu.submenu span,
+ li.menu-tickets a, li.menu-tickets span, li.menu-tickets + menu.sub-menu a, li.menu-tickets + menu.submenu span,
+ li.menu-guide a, li.menu-guide span, li.menu-guide + menu.sub-menu a, li.menu-guide + menu.submenu span,
+ li.menu-entertainment-lectures a, li.menu-entertainment-lectures span, li.menu-entertainment-lectures + menu.sub-menu a, li.menu-entertainment-lectures + menu.submenu span {
+ color: white;
+ }
+}
diff --git a/web/stream.tg13.gathering.org/singularity.png b/web/stream.tg13.gathering.org/singularity.png
new file mode 100644
index 0000000..3a13cdf
--- /dev/null
+++ b/web/stream.tg13.gathering.org/singularity.png
Binary files differ
diff --git a/web/stream.tg13.gathering.org/stream.pl b/web/stream.tg13.gathering.org/stream.pl
new file mode 100755
index 0000000..8ccf05c
--- /dev/null
+++ b/web/stream.tg13.gathering.org/stream.pl
@@ -0,0 +1,87 @@
+#!/usr/bin/perl -I /srv/streamlib
+
+use warnings;
+use strict;
+
+use stream;
+use stream::config;
+use CGI;
+my $client = CGI->new;
+
+my $stream = $client->param('stream');
+my $interlaced = $client->param('interlaced');
+my $delivery = $client->param('delivery');
+
+my $v4net = $stream::config::v4net;
+my $v6net = $stream::config::v6net;
+my $multicast_ip = $stream::config::multicast;
+my $tg = $stream::config::tg;
+my $base_url = $stream::config::vlc_base_host;
+my %streams = %stream::config::streams;
+
+
+
+#default
+if (not defined $delivery) {
+ $delivery = "multicast";
+}
+
+if((not defined $stream) or (not defined $delivery)) {
+ print $client->header();
+ die "No stream and/or delivery method, robots unhappy :/\n";
+}
+
+my $url = "";
+my $port_del = "";
+my $port_str = "";
+my $extinf = "";
+my $flash_appendix = "";
+
+my $clip = $client->remote_addr();
+
+if (exists($streams{$stream})) {
+ my $is_multicast = 0;
+ # add force is_ip_local in check?
+ $is_multicast = 1 if (exists($streams{$stream}->{has_multicast}) && $delivery eq "multicast");
+
+ if ($is_multicast) {
+ $port_del = 20;
+ $extinf .= "Multicasted";
+ $url = $streams{$stream}->{multicast_ip};
+ } else {
+ $port_del = 30;
+ $extinf .= "Unicasted";
+ $url = $base_url;
+
+ if ($streams{$stream}->{is_flash}) {
+ $port_del = 50;
+ $flash_appendix = "/stream.flv";
+ }
+ }
+
+ $port_del = $streams{$stream}->{preport} if (defined($streams{$stream}->{preport}));
+ $port_str = $streams{$stream}->{port};
+ $extinf .= " $streams{$stream}->{title}";
+
+} else {
+ &error("No stream and/or delivery method, robots unhappy :-/");
+}
+
+#print out new file
+print $client->header(-type => "application/vlc",
+ "-Content-disposition" => "attachment; filename=tg-".$delivery."-".$stream.".vlc"
+);
+
+print "#EXTM3U\n";
+print "#EXTINF:-1,TG$tg $extinf\n";
+if(defined $interlaced && $interlaced == 1) {
+ print "#EXTVLCOPT:deinterlace=1\n";
+ print "#EXTVLCOPT:deinterlace-mode=linear\n";
+}
+print "$url:$port_del$port_str$flash_appendix\n";
+
+sub error($) {
+ my $message = shift;
+ print $client->header();
+ die($message."\n");
+}
diff --git a/web/stream.tg13.gathering.org/streamstats-fast.pl b/web/stream.tg13.gathering.org/streamstats-fast.pl
new file mode 100755
index 0000000..f4caa24
--- /dev/null
+++ b/web/stream.tg13.gathering.org/streamstats-fast.pl
@@ -0,0 +1,15 @@
+#! /usr/bin/perl
+use strict;
+use warnings;
+use POSIX;
+use CGI qw(fatalsToBrowser);
+
+my $port_spec = CGI::param('port');
+my $proto_spec = CGI::param('proto');
+my $audience_spec = CGI::param('audience');
+
+print CGI::header(-type=>'image/png');
+
+# I'm sure this is really safe
+system("/srv/stream.tg13.gathering.org/fix_count.pl | /srv/stream.tg13.gathering.org/streamstats - $port_spec $proto_spec $audience_spec");
+#system("/srv/stream.tg13.gathering.org/streamstats", "/home/techserver/cleaned_datacube.log", $port_spec, $proto_spec, $audience_spec);
diff --git a/web/stream.tg13.gathering.org/streamstats.cpp b/web/stream.tg13.gathering.org/streamstats.cpp
new file mode 100644
index 0000000..e81419f
--- /dev/null
+++ b/web/stream.tg13.gathering.org/streamstats.cpp
@@ -0,0 +1,217 @@
+#include <stdio.h>
+#include <string.h>
+#include <map>
+#include <set>
+#include <string>
+#include <vector>
+#include <stdlib.h>
+
+using namespace std;
+
+map<string, string> port_desc = {
+ { "3013", "main (3013)" },
+ { "3014", "main-sd (3014)" },
+ { "3015", "webcam (3015)" },
+ { "3016", "webcam-south (3016)" },
+ { "3017", "webcam-south-transcode (3017)" },
+ { "3018", "webcam-fisheye (3018)" },
+ { "5013", "main-transcode (5013)" },
+ { "5015", "webcam-transcode (5015)" },
+};
+
+struct Spec {
+ set<string> incl;
+ bool compare;
+};
+
+Spec parse_spec(const string &spec)
+{
+ Spec ret;
+ ret.compare = false;
+
+ if (spec == "compare") {
+ ret.compare = true;
+ return ret;
+ }
+ if (spec == "dontcare") {
+ return ret;
+ }
+
+ const char *ptr = spec.c_str();
+ if (strncmp(ptr, "compare:", 8) == 0) {
+ ptr += 8;
+ ret.compare = true;
+ }
+
+ for ( ;; ) {
+ const char *end = strchr(ptr, ',');
+ if (end == NULL) {
+ ret.incl.insert(ptr);
+ break;
+ } else {
+ ret.incl.insert(string(ptr, end));
+ ptr = end + 1;
+ }
+ }
+
+ return ret;
+}
+
+bool filter(const string &entry, const Spec &spec)
+{
+ if (spec.incl.empty()) {
+ return false;
+ }
+ return spec.incl.count(entry) == 0;
+}
+
+vector<string> get_stream_id(const string& port, const string &proto, const string &audience,
+ const Spec& port_spec, const Spec &proto_spec, const Spec &audience_spec)
+{
+ vector<string> keys;
+ if (port_spec.compare) {
+ if (port_desc.count(port)) {
+ keys.push_back(port_desc[port]);
+ } else {
+ char buf[256];
+ sprintf(buf, "___%s___", port.c_str());
+ keys.push_back(buf);
+ }
+ }
+ if (proto_spec.compare) {
+ keys.push_back(proto);
+ }
+ if (audience_spec.compare) {
+ keys.push_back(audience);
+ }
+ return keys;
+}
+
+string get_stream_desc(const vector<string> &stream_id)
+{
+ string ret;
+ for (int i = 0; i < stream_id.size(); ++i) {
+ if (i != 0) {
+ ret += ",";
+ }
+ ret += stream_id[i];
+ }
+ return ret;
+}
+
+int main(int argc, char **argv)
+{
+ Spec port_spec = parse_spec(argv[2]);
+ Spec proto_spec = parse_spec(argv[3]);
+ Spec audience_spec = parse_spec(argv[4]);
+
+ map<string, map<vector<string>, int> > lines;
+ map<vector<string>, int> stream_ids;
+ vector<string> stream_descs;
+
+ // Parse the log.
+ FILE *fp;
+ if (strcmp(argv[1], "-") == 0) {
+ fp = stdin;
+ } else {
+ fp = fopen(argv[1], "r");
+ }
+ while (!feof(fp)) {
+ char buf[1024];
+ fgets(buf, 1024, fp);
+
+ if (buf == NULL) {
+ break;
+ }
+ char *ptr = strchr(buf, '\n');
+ if (ptr != NULL) {
+ *ptr = 0;
+ }
+
+ char *date = strtok(buf, " ");
+ char *port = strtok(NULL, " ");
+ char *proto = strtok(NULL, " ");
+ char *audience = strtok(NULL, " ");
+ char *count = strtok(NULL, " ");
+
+ if (date == NULL || port == NULL || proto == NULL || audience == NULL || count == NULL) {
+ continue;
+ }
+
+ if (filter(port, port_spec)) {
+ continue;
+ }
+ if (filter(proto, proto_spec)) {
+ continue;
+ }
+ if (filter(audience, audience_spec)) {
+ continue;
+ }
+
+ vector<string> stream_id = get_stream_id(port, proto, audience, port_spec, proto_spec, audience_spec);
+ if (stream_ids.count(stream_id) == 0) {
+ int stream_id_num = stream_ids.size();
+ stream_ids.insert(make_pair(stream_id, stream_id_num));
+ stream_descs.push_back(get_stream_desc(stream_id));
+ }
+ lines[date][stream_id] += atoi(count);
+ }
+ fclose(fp);
+
+ // Output.
+ char *data_file = tempnam(NULL, "data");
+ FILE *datafp = fopen(data_file, "w");
+ if (datafp == NULL) {
+ perror(data_file);
+ exit(1);
+ }
+
+ vector<int> cols(stream_ids.size());
+ for (auto& it : lines) {
+ const string& date = it.first;
+
+ for (const auto& it2 : stream_ids) {
+ const vector<string>& stream_id = it2.first;
+ int stream_id_num = it2.second;
+
+ cols[stream_id_num] = it.second[stream_id]; // note: might zero-initialize
+ }
+ fprintf(datafp, "%s", date.c_str());
+ for (int i = 0; i < cols.size(); ++i) {
+ fprintf(datafp, " %d", cols[i]);
+ }
+ fprintf(datafp, "\n");
+ }
+ fclose(datafp);
+
+ // Make gnuplot script.
+ char *plot_file = tempnam(NULL, "plot");
+ FILE *plotfp = fopen(plot_file, "w");
+ if (plotfp == NULL) {
+ perror(plot_file);
+ exit(1);
+ }
+
+ fprintf(plotfp, "set terminal png\n");
+ fprintf(plotfp, "set xdata time\n");
+ fprintf(plotfp, "set timefmt \"20%%y-%%m-%%d-%%H:%%M:%%S\"\n");
+ fprintf(plotfp, "set xtics axis \"2000-00-00-01:00:00\"\n");
+ fprintf(plotfp, "set format x \"%%H\"\n");
+
+ fprintf(plotfp, "plot");
+ for (int i = 0; i < cols.size(); ++i) {
+ if (i == 0) {
+ fprintf(plotfp, " ");
+ } else {
+ fprintf(plotfp, ",");
+ }
+ fprintf(plotfp, "\"%s\" using 1:%d title \"%s\" with lines", data_file, i + 2, stream_descs[i].c_str());
+ }
+ fprintf(plotfp, "\n");
+
+ fclose(plotfp);
+
+ char buf[1024];
+ sprintf(buf, "gnuplot < %s", plot_file);
+ system(buf);
+}
diff --git a/web/stream.tg13.gathering.org/streamstats.html b/web/stream.tg13.gathering.org/streamstats.html
new file mode 100644
index 0000000..5d6adc7
--- /dev/null
+++ b/web/stream.tg13.gathering.org/streamstats.html
@@ -0,0 +1,81 @@
+<html>
+ <head>
+ <script>
+ function construct_url(name, choices) {
+ // port
+ var url = name + '=';
+ if (document.getElementById('split_' + name).checked) {
+ url += 'compare:';
+ }
+ var choices_so_far = 0;
+ for (var i = 0; i < choices.length; ++i) {
+ var check = document.getElementById(name + '_' + choices[i]);
+ if (!check.checked) {
+ continue;
+ }
+ if (choices_so_far++ != 0) {
+ url += ',';
+ }
+ url += choices[i];
+ }
+ return url;
+ }
+
+ function update() {
+ var url = 'http://stream.tg13.gathering.org/streamstats-fast.pl?';
+ url += construct_url('port', [ 3013, 3014, 3015, 3016, 3017, 3018, 5013, 5015 ]);
+ url += '&' + construct_url('proto', [ 'IPv4', 'IPv6' ]);
+ url += '&' + construct_url('audience', [ 'internal', 'external' ]);
+
+ document.getElementById('graph').src = url;
+ }
+ </script>
+ </head>
+ <body>
+ <table>
+ <tr>
+ <th>Ports:</th>
+ <td>
+ <label><input type="checkbox" id="port_3013" checked="checked" onchange="update();" /> 3013 (Main)</label><br />
+ <label><input type="checkbox" id="port_3014" checked="checked" onchange="update();" /> 3014 (Main SD)</label><br />
+ <label><input type="checkbox" id="port_3015" checked="checked" onchange="update();" /> 3015 (Webcam)</label><br />
+ <label><input type="checkbox" id="port_3016" checked="checked" onchange="update();" /> 3016 (Webcam south)</label><br />
+ <label><input type="checkbox" id="port_3017" checked="checked" onchange="update();" /> 3017 (Webcam south transcode)</label><br />
+ <label><input type="checkbox" id="port_3018" checked="checked" onchange="update();" /> 3018 (Fisheye)</label><br />
+ <label><input type="checkbox" id="port_5013" checked="checked" onchange="update();" /> 5013 (Main LQ/Flash)</label><br />
+ <label><input type="checkbox" id="port_5015" checked="checked" onchange="update();" /> 5015 (Webcam LQ/Flash)</label>
+ </td>
+ <td>
+ <label><input type="checkbox" id="split_port" onchange="update();" /> Split</label>
+ </td>
+ </tr>
+ <tr>
+ <th>Protocol:</th>
+ <td>
+ <label><input type="checkbox" id="proto_IPv4" checked="checked" onchange="update();" /> IPv4</label><br />
+ <label><input type="checkbox" id="proto_IPv6" checked="checked" onchange="update();" /> IPv6</label><br />
+ </td>
+ <td>
+ <label><input type="checkbox" id="split_proto" onchange="update();" /> Split</label>
+ </td>
+ </tr>
+ <tr>
+ <th>Audience:</th>
+ <td>
+ <label><input type="checkbox" id="audience_internal" checked="checked" onchange="update();" /> Internal</label><br />
+ <label><input type="checkbox" id="audience_external" checked="checked" onchange="update();" /> External</label><br />
+ </td>
+ <td>
+ <label><input type="checkbox" id="split_audience" onchange="update();" /> Split</label>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="3">
+ <input type="button" value="Update display" onclick="update();" />
+ </td>
+ </tr>
+ </table>
+ <p><img src="" id="graph" /></p>
+ <script>update();</script>
+ </body>
+</html>
diff --git a/web/stream.tg13.gathering.org/streamstats.pl b/web/stream.tg13.gathering.org/streamstats.pl
new file mode 100755
index 0000000..e4c20f9
--- /dev/null
+++ b/web/stream.tg13.gathering.org/streamstats.pl
@@ -0,0 +1,116 @@
+#! /usr/bin/perl
+use strict;
+use warnings;
+use POSIX;
+use CGI qw(fatalsToBrowser);
+
+my %port_spec = prepare_spec(CGI::param('port'));
+my %proto_spec = prepare_spec(CGI::param('proto'));
+my %audience_spec = prepare_spec(CGI::param('audience'));
+
+#open LOG, "<", "/home/techserver/count_datacube.log"
+open LOG, "-|", "/home/techserver/fix_count.pl"
+#open LOG, "<", "/home/techserver/cleaned_datacube.log"
+ or die "count_datacube.log: $!";
+
+our %desc = (
+ 3013 => 'main (3013)',
+ 3014 => 'main-sd (3014)',
+ 3015 => 'webcam (3015)',
+ 3016 => 'webcam-south (3016)',
+ 3017 => 'webcam-south-transcode (3017)',
+ 3018 => 'webcam-fisheye (3018)',
+ 5013 => 'main-transcode (5013)',
+ 5015 => 'webcam-transcode (5015)',
+);
+
+my $lines = {};
+my %streams = ();
+
+while (<LOG>) {
+ chomp;
+ my ($date, $port, $proto, $audience, $count) = split /\s+/;
+ next if (filter($port, $proto, $audience));
+ my $stream_id = get_stream_id($port, $proto, $audience);
+ $streams{$stream_id} = 1;
+ $lines->{$date}{$stream_id} += $count;
+}
+
+close LOG;
+
+print CGI::header(-type=>'image/png');
+
+my $tmpfile = POSIX::tmpnam();
+open GRAPH, ">", $tmpfile
+ or die "$tmpfile: $!";
+for my $date (sort keys %$lines) {
+ my @cols = ();
+ for my $stream (keys %streams) {
+ push @cols, ($lines->{$date}{$stream} // "0");
+ }
+ print GRAPH "$date ", join(' ', @cols), "\n";
+}
+close GRAPH;
+
+my $tmpfile2 = POSIX::tmpnam();
+open GNUPLOT, ">", $tmpfile2
+ or die "$tmpfile2: $!";
+print GNUPLOT "set terminal png\n";
+print GNUPLOT "set xdata time\n";
+print GNUPLOT "set timefmt \"20%y-%m-%d-%H:%M:%S\"\n";
+print GNUPLOT "set xtics axis \"2000-00-00-01:00:00\"\n";
+print GNUPLOT "set format x \"%H\"\n";
+
+my @plots = ();
+my $idx = 2;
+for my $stream (keys %streams) {
+ push @plots, "\"$tmpfile\" using 1:$idx title \"$stream\" with lines";
+ ++$idx;
+}
+print GNUPLOT "plot ", join(', ', @plots);
+
+# \"$tmpfile\" using 0:2 with lines, \"$tmpfile\" using 0:3 with lines\n";
+close GNUPLOT;
+
+system("gnuplot < $tmpfile2");
+
+sub prepare_spec {
+ my $spec = shift;
+ return () if ($spec eq 'compare' || $spec eq 'dontcare');
+ $spec =~ s/^compare://;
+
+ my %ret = ();
+ for my $s (split /,/, $spec) {
+ $ret{$s} = 1;
+ }
+ return %ret;
+}
+
+sub filter {
+ my ($port, $proto, $audience) = @_;
+ return 1 if (filter_list(\%port_spec, $port));
+ return 1 if (filter_list(\%proto_spec, $proto));
+ return 1 if (filter_list(\%audience_spec, $audience));
+ return 0;
+}
+
+sub filter_list {
+ my ($spec, $candidate) = @_;
+ return 0 if ((scalar keys %$spec) == 0);
+ return !exists($spec->{$candidate});
+}
+
+sub get_stream_id {
+ my ($port, $proto, $audience) = @_;
+ my @keys = ();
+ if (CGI::param('port') =~ /^compare/) {
+ if (exists($desc{$port})) {
+ push @keys, $desc{$port};
+ } else {
+ push @keys, "___" . $port . "___";
+ }
+ }
+ push @keys, $proto if (CGI::param('proto') =~ /^compare/);
+ push @keys, $audience if (CGI::param('audience') =~ /^compare/);
+ return join(',', @keys);
+}
diff --git a/web/stream.tg13.gathering.org/superawesomeness.css b/web/stream.tg13.gathering.org/superawesomeness.css
new file mode 100644
index 0000000..b8c5545
--- /dev/null
+++ b/web/stream.tg13.gathering.org/superawesomeness.css
@@ -0,0 +1,24 @@
+* { font-family: 'Open Sans', sans-serif;
+
+}
+
+body {
+ background: #fff; color: #000; opacity: 1;
+}
+
+#spaceship { background: url('singularity.png'); width: 237px; height: 200px;position:absolute; top: 0; right: 0;z-index: -1}
+
+@media screen and (max-width: 1145px) { /* Min iPad size*/
+ #spaceship {
+ background: #fff;
+ }
+}
+
+
+/* #innhold { position: absolute; left:0px ; top: 50px; margin: 0 50px 0 50px; z-index: 9; width: 520px; }*/
+#innhold { width: 480px; }
+footer { clear: both; width:480px; }
+a { color: #000; }
+h4 { margin: 0; margin-top: 35px;}
+p { margin: 0; padding: 0; }
+li { margin-bottom: 14px; }
diff --git a/web/stream.tg13.gathering.org/test.pl b/web/stream.tg13.gathering.org/test.pl
new file mode 100755
index 0000000..3b440d5
--- /dev/null
+++ b/web/stream.tg13.gathering.org/test.pl
@@ -0,0 +1,70 @@
+#!/usr/bin/perl -I /srv/streamlib
+use warnings;
+use strict;
+use CGI;
+use Geo::IP;
+use NetAddr::IP;
+use Net::IP;
+# apt-get install libnet-ip-perl libnetaddr-ip-perl
+use HTML::Template;
+use stream;
+use stream::config;
+
+my $client = CGI->new;
+
+my $v4net = $stream::config::v4net;
+my $v6net = $stream::config::v6net;
+my $tg = $stream::config::tg;
+my $tg_full = $stream::config::tg_full;
+my %streams = %stream::config::streams;
+
+my $force_unicast = $client->param('forceunicast');
+
+my $location = undef;
+
+print $client->header();
+
+my $clip = $client->remote_addr();
+my $template = HTML::Template->new(filename => 'test.tmpl');
+my $is_local = &is_ip_local($clip, $v4net, $v6net);
+
+my @streams = &html_local_test();
+$template->param(TG => $tg);
+$template->param(TG_FULL => $tg_full);
+$template->param(STREAMS => \@streams);
+print $template->output();
+
+
+sub html_local_test() {
+ my @s = ();
+ foreach my $name (sort { $streams{$a}->{priority} <=> $streams{$b}->{priority} } keys %streams) {
+ my $title_link = "http://stream.tg$tg.gathering.org/stream.pl?delivery=%s&stream=${name}&interlaced=%s";
+ my $multicast_link = $streams{$name}->{has_multicast} ? "multicast" : "unicast";
+ $multicast_link = "unicast" if ($force_unicast == 1 || not $is_local);
+
+ if ($streams{$name}->{external}) {
+ $title_link = $streams{$name}->{url};
+ } else {
+ $title_link = sprintf($title_link, $multicast_link, $streams{$name}->{interlaced});
+ }
+ my %hash = (
+ 'title_link' => $title_link,
+ 'title' => $streams{$name}->{title},
+ 'source' => $streams{$name}->{source},
+ 'quality' => $streams{$name}->{quality},
+ 'location' => $streams{$name}->{location},
+ 'type' => $streams{$name}->{type},
+ 'delivery' => $multicast_link,
+ );
+ if ($multicast_link eq "multicast") {
+ $hash{'is_multicast'} .= 1;
+ my $unicast_link = $title_link;
+ $unicast_link=~s/multicast/unicast/g;
+ $hash{'unicast_link'} .= $unicast_link;
+ }
+ $hash{'description'} .= $streams{$name}->{description} if exists($streams{$name}->{description});
+ push(@s, \%hash);
+
+ }
+ return @s;
+}
diff --git a/web/stream.tg13.gathering.org/test.tmpl b/web/stream.tg13.gathering.org/test.tmpl
new file mode 100644
index 0000000..ea0eaca
--- /dev/null
+++ b/web/stream.tg13.gathering.org/test.tmpl
@@ -0,0 +1,31 @@
+<html>
+<head>
+ <title>The Gathering <TMPL_VAR NAME=TG_FULL> Streams</title>
+ <link rel="stylesheet" type="text/css" href="singularity.css" media="all">
+</head>
+<body>
+ <div id="innhold">
+ <h1>The Gathering <TMPL_VAR NAME=TG_FULL> Streams</h1>
+ <TMPL_LOOP NAME="STREAMS">
+ <div class="stream-link">
+ <div class="stream-icon"><img src="img/icon_<TMPL_VAR NAME=QUALITY>.png" /> <img src="img/icon_<TMPL_VAR NAME=TYPE>.png" /> <TMPL_IF NAME=LOCATION><img src="img/icon_<TMPL_VAR NAME=LOCATION>.png"></TMPL_IF></div>
+ <div class="stream-link-content">
+ <a href="<TMPL_VAR NAME=TITLE_LINK>"><TMPL_VAR NAME=TITLE></a><br>
+ Source: <TMPL_VAR NAME=SOURCE><br>
+ Delivery: <TMPL_VAR NAME=delivery> <TMPL_IF NAME=IS_MULTICAST>(<a href='<TMPL_VAR NAME=UNICAST_LINK>'>problems? try unicast vlc link here</a>)</TMPL_IF>
+ </div>
+ </div>
+ </TMPL_LOOP>
+ <div id="map">
+ <img src="img/cam-map.png">
+ </div>
+
+ </div>
+
+ <p>Problems with the non game streams? The easiest way to get hold of us is on IRC (EFNet); one of ViD, Rockj and Sesse should be available if there's too much traffic on #tg to be heard.</p>
+ <p><a href="http://stream.tg<TMPL_VAR NAME="TG">.gathering.org">http://stream.tg<TMPL_VAR NAME="TG">.gathering.org</a></p>
+
+</body>
+</html>
+
+
diff --git a/web/streamlib/stream.pm b/web/streamlib/stream.pm
new file mode 100644
index 0000000..c28136e
--- /dev/null
+++ b/web/streamlib/stream.pm
@@ -0,0 +1,36 @@
+package stream;
+use strict;
+use warnings;
+
+BEGIN {
+ use Exporter();
+
+ our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
+
+ @ISA = qw(Exporter);
+ $VERSION = 1.00;
+ @EXPORT = qw(&is_ip_local);
+
+}
+
+sub is_ip_local($$$) {
+ my $clip = shift;
+ my $v4net = shift;
+ my $v6net = shift;
+ return 0 unless defined($clip);
+
+ my $is_local = 0;
+ if ($clip =~ m/\:/){
+ if (NetAddr::IP->new($clip)->within($v6net)){
+ $is_local = 1;
+ }
+ } else {
+ if (NetAddr::IP->new($clip)->within($v4net)){
+ $is_local = 1;
+ }
+ }
+ return $is_local;
+}
+
+
+1;
diff --git a/web/streamlib/stream/config.pm b/web/streamlib/stream/config.pm
new file mode 100644
index 0000000..7c488b6
--- /dev/null
+++ b/web/streamlib/stream/config.pm
@@ -0,0 +1,160 @@
+package stream::config;
+use strict;
+use warnings;
+use NetAddr::IP;
+
+our $v4net = NetAddr::IP->new("151.216.0.0/17");
+our $v6net = NetAddr::IP->new("2a02:ed02::/32");
+our $multicast = "udp://\@233.191.12.1";
+our $vlc_base_host = "http://stream.tg13.gathering.org";
+our $tg = 13;
+our $tg_full = 2013;
+
+
+# priority = sorting order in streaming list
+# port , "post port number"
+# has_external , shows on OVH/.fr reflector if set
+# external , replaces static url link
+# source , video source pew pew
+# title , title doh \:D/
+our %streams = (
+# Deaktivert 31.mars kl 05.30 iush
+# 'event-ios' => {
+# 'type' => 'event',
+# 'quality' => 'hd',
+# 'priority' => 26,
+# 'external' => 1,
+# 'url' => "$vlc_base_host/ios/event.m3u8",
+# 'source' => 'Event',
+# 'title' => 'Event HD Stream for iOS devices (Apple)',
+# },
+# 'event-hd' => {
+# 'type' => 'event',
+# 'quality' => 'hd',
+# 'priority' => 20,
+# 'port' => 13,
+# 'interlaced' => 0,
+# 'has_multicast' => 1,
+# 'multicast_ip' => 'udp://@[ff7e:a40:2a02:ed02:ffff::13]',
+# 'source' => 'Event',
+# 'title' => 'Event HD (720p50)'
+# },
+# 'event-sd' => {
+# 'type' => 'event',
+# 'quality' => 'sd',
+# 'priority' => 24,
+# 'port' => 14,
+# 'interlaced' => 0,
+# 'has_multicast' => 1,
+# 'multicast_ip' => 'udp://@[ff7e:a40:2a02:ed02:ffff::14]',
+# 'source' => 'Event',
+# 'title' => 'Event SD (576p) (2mbps)'
+# },
+# 'event-flash' => {
+# 'type' => 'event',
+# 'quality' => 'sd',
+# 'priority' => 25,
+# 'interlaced' => 0,
+# 'external' => 1,
+# 'url' => 'http://www.gathering.org/tg13/no/live-tv/',
+# 'source' => 'Event',
+# 'title' => 'Event SD (gathering.org flash player)',
+# },
+#
+
+
+ 'south-raw' => {
+ 'type' => 'camera',
+ 'location' => 3,
+ 'quality' => 'hd',
+ 'priority' => 40,
+ 'port' => 16,
+ 'interlaced' => 1,
+ 'has_multicast' => 0,
+# 'multicast_ip' => "udp://@[ff7e:a40:2a02:ed02:ffff::16]",
+ 'source' => 'Tech',
+ 'title' => 'Webcam South (HD) (1080i25)',
+ },
+
+ 'south-transcode' => {
+ 'type' => 'camera',
+ 'location' => 3,
+ 'quality' => 'hd',
+ 'priority' => 50,
+ 'port' => 17,
+ 'interlaced' => 0,
+ 'has_multicast' => 1,
+ 'multicast_ip' => "udp://@[ff7e:a40:2a02:ed02:ffff::17]",
+ 'source' => 'Tech',
+ 'title' => 'Webcam South (HD) (720p50)',
+ },
+
+
+ 'fuglecam' => {
+ 'type' => 'camera',
+ 'location' => 2,
+ 'quality' => 'hd',
+ 'priority' => 118,
+ 'port' => 15,
+ 'interlaced' => 1,
+ 'has_multicast' => 1,
+ 'multicast_ip' => "udp://\@[ff7e:a40:2a02:ed02:ffff::15]",
+ 'source' => 'Tech',
+ 'title' => 'Webcam Fugleberget (HD) (1080i50)',
+ },
+
+
+
+ 'fuglecam-flv-sd' => {
+ 'location' => 2,
+ 'type' => 'camera',
+ 'quality' => 'sd',
+ 'priority' => 121,
+ 'interlaced' => 1,
+ 'external' => 1,
+ 'url' => 'http://www.gathering.org/tg13/no/webcam/',
+ 'title' => 'Webcam Fugleberget (SD) (gathering.org flash player)',
+ },
+
+ 'noc-fisheye' => {
+ 'type' => 'camera',
+ 'location' => 1,
+ 'quality' => 'hd',
+ 'priority' => 130,
+ 'port' => 18,
+ 'has_multicast' => 1,
+ 'interlaced' => 0,
+ 'multicast_ip' => "udp://@[ff7e:a40:2a02:ed02:ffff::18]:2018",
+ 'source' => "Tech",
+ 'title' => "Webcam NOC Fisheye (HD)"
+ },
+ 'noc-fisheye-transcode' => {
+ 'type' => 'camera',
+ 'location' => 1,
+ 'quality' => 'hd',
+ 'priority' => 131,
+ 'port' => 19,
+ 'has_multicast' => 1,
+ 'interlaced' => 0,
+ 'multicast_ip' => "udp://@[ff7e:a40:2a02:ed02:ffff::19]:2019",
+ 'source' => "Tech",
+ 'title' => "Webcam NOC Fisheye (HD transcoded)"
+ },
+
+
+ 'south-still' => {
+ 'location' => 3,
+ 'type' => 'camera',
+ 'quality' => 'hd',
+ 'priority' => 110,
+ 'external' => 1,
+ 'url' => 'http://stillcam.tg13.gathering.org/',
+ 'title' => 'Webcam South (Image)',
+ 'source' => 'Tech'
+ },
+
+
+ );
+
+
+1;
diff --git a/web/tech.gathering.org/event-720p.mp4.pl b/web/tech.gathering.org/event-720p.mp4.pl
new file mode 100755
index 0000000..631e40d
--- /dev/null
+++ b/web/tech.gathering.org/event-720p.mp4.pl
@@ -0,0 +1,11 @@
+#!/usr/bin/env
+use strict;
+use warnings;
+use Capture::Tiny ':all';
+
+$! = 1;
+print "Content-Type: video/mp4\n\n";
+
+my ($stdout, $stderr) = tee {
+ system('wget', '-qO-', 'http://stream.tg13.gathering.org:3013');
+};
diff --git a/web/tech.gathering.org/index.html b/web/tech.gathering.org/index.html
new file mode 100644
index 0000000..9a5b0ad
--- /dev/null
+++ b/web/tech.gathering.org/index.html
@@ -0,0 +1,20 @@
+<html>
+<head>
+<title>Tech resources - The Gathering 2013</title>
+<link rel="stylesheet" type="text/css" href="/styles.css" media="all">
+</head>
+<body>
+
+<h1>Tech resources - The Gathering 2013</h1>
+
+<img id="logo" src="logo.png" alt="The Gathering 2013" />
+
+<h2><a href="http://stats.tg13.gathering.org">stats.tg13.gathering.org (weathermap)</a></h2>
+<h2><a href="http://nms-public.tg13.gathering.org">nms-public.tg13.gathering.org</a></h2>
+<h2><a href="http://stream.tg13.gathering.org">stream.tg13.gathering.org</a></h2>
+
+<h2><a href="http://techserver.gathering.org/ircrules">IRC rules for #tg@EFnet</a></h2>
+
+<p>Enjoy :-)</p>
+</body>
+</html>
diff --git a/web/tech.gathering.org/logo.png b/web/tech.gathering.org/logo.png
new file mode 100644
index 0000000..3a13cdf
--- /dev/null
+++ b/web/tech.gathering.org/logo.png
Binary files differ
diff --git a/web/tech.gathering.org/styles.css b/web/tech.gathering.org/styles.css
new file mode 100644
index 0000000..e690989
--- /dev/null
+++ b/web/tech.gathering.org/styles.css
@@ -0,0 +1,24 @@
+* { font-family: 'Open Sans', sans-serif;
+
+}
+
+body {
+ background: #fff; color: #000; opacity: 1;
+}
+
+#logo { background: url('logo.png'); width: 237px; height: 200px;position:absolute; top: 0; right: 0;z-index: -1}
+
+@media screen and (max-width: 1145px) { /* Min iPad size*/
+ #spaceship {
+ background: #fff;
+ }
+}
+
+/* #innhold { position: absolute; left:0px ; top: 50px; margin: 0 50px 0 50px; z-index: 9; width: 520px; }*/
+#innhold { width: 480px; }
+footer { clear: both; width:480px; }
+a { color: #000; }
+h4 { margin: 0; margin-top: 35px;}
+p { margin: 0; padding: 0; }
+li { margin-bottom: 14px; }
+