+# Output footers
+$zonefile->print("];\n");
+
+# Close the output files
+$zonefile->close();
+$zonefile->close();
+
+# Output gdnsd configuration
+if (defined($gdnsname))
+{
+ my $gdnsmapfile = IO::File->new("> gdns/${gdnsname}.map") || die "$!";
+ my $gdnsresourcefile = IO::File->new("> gdns/${gdnsname}.resource") || die "$!";
+ my $gdnsweightedfile = IO::File->new("> gdns/${gdnsname}.weighted") || die "$!";
+ my $continent = "";
+
+ $gdnsmapfile->print("${gdnsname} => {\n");
+ $gdnsmapfile->print(" geoip2_db => /usr/share/GeoIP/GeoLite2-Country.mmdb\n");
+ $gdnsmapfile->print(" datacenters => [" . join(",", sort(keys(%$clusters))) . "]\n");
+ $gdnsmapfile->print(" map => {\n");
+ $gdnsmapfile->print(" default => [" . join(",", sort(map { $_->{name} } grep { $_->{default} } values(%$clusters))) . "]\n");
+
+ foreach my $origin (sort { $a->{continent} cmp $b->{continent} || $a->{code} cmp $b->{code} } values %$origins)
+ {
+ my $code = $origin->{code};
+ my $cluster = $origin->{cluster}->{name};
+
+ next if $code eq "XK";
+
+ if ($continent ne $origin->{continent})
+ {
+ $gdnsmapfile->print(" }\n") if $continent;
+
+ $continent = $origin->{continent};
+
+ $gdnsmapfile->print(" ${continent} => {\n");
+ }
+
+ $gdnsmapfile->print(" ${code} => [${cluster}]\n");
+ }
+
+ $gdnsmapfile->print(" }\n") if $continent;
+
+ $gdnsmapfile->print(" }\n");
+ $gdnsmapfile->print("}\n");
+
+ $gdnsresourcefile->print("${gdnsname} => {\n");
+ $gdnsresourcefile->print(" map => ${gdnsname}\n");
+ $gdnsresourcefile->print(" dcmap => {\n");
+
+ foreach my $cluster (sort { $a->{name} cmp $b->{name} } values %$clusters)
+ {
+ my $name = $cluster->{name};
+
+ if (@{$cluster->{servers}} > 1 && grep { $_->{status} eq "up" } @{$cluster->{servers}})
+ {
+ $gdnsweightedfile->print("${name} => {\n");
+
+ while (my($index,$server) = each @{$cluster->{servers}})
+ {
+ if ($server->{status} eq "up")
+ {
+ my $number = sprintf("%02d", $index + 1);
+ my $requests = $server->{requests};
+
+ if (my $cname = $server->{cname})
+ {
+ $gdnsweightedfile->print(" ${name}-${number} = [ ${cname}., ${requests} ]\n");
+ }
+ else
+ {
+ $gdnsweightedfile->print(" ${name}-${number} = [ ${name}-${number}.${zone}.openstreetmap.org., ${requests} ]\n");
+ }
+ }
+ }
+
+ $gdnsweightedfile->print("}\n");
+
+ $gdnsresourcefile->print(" ${name} => %weighted!${name}\n");
+ }
+ elsif (my $cname = $cluster->{cname})
+ {
+ $gdnsresourcefile->print(" ${name} => ${cname}.\n");
+ }
+ else
+ {
+ $gdnsresourcefile->print(" ${name} => ${name}.${zone}.openstreetmap.org.\n");
+ }
+ }
+
+ $gdnsresourcefile->print(" }\n");
+ $gdnsresourcefile->print("}\n");
+
+ $gdnsweightedfile->close();
+ $gdnsresourcefile->close();
+ $gdnsmapfile->close();