+ 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)
+ {
+ $gdnsweightedfile->print("${name} => {\n");
+
+ while (my($index,$server) = each @{$cluster->{servers}})
+ {
+ if ($server->{status} eq "up")
+ {
+ my $number = sprintf("%02d", $index + 1);
+ my $bandwidth = $server->{bandwidth};
+
+ $gdnsweightedfile->print(" ${name}-${number} = [ ${name}-${number}.${zone}., ${bandwidth} ]\n");
+ }
+ }
+
+ $gdnsweightedfile->print("}\n");
+
+ $gdnsresourcefile->print(" ${name} => %weighted!${name}\n");
+ }
+ else
+ {
+ $gdnsresourcefile->print(" ${name} => ${name}.${zone}.\n");
+ }
+ }
+
+ $gdnsresourcefile->print(" }\n");
+ $gdnsresourcefile->print("}\n");
+
+ $gdnsweightedfile->close();
+ $gdnsresourcefile->close();
+ $gdnsmapfile->close();
+}
+
+# Output the target details in origin format if required
+YAML::DumpFile($targetoriginfile, $targetorigins) if $targetoriginfile;
+
+exit 0;
+
+#
+# Match an origin against a cluster
+#
+sub match_origin
+{
+ my $cluster = shift;
+ my $origin = shift;