Basic zone writing script

This commit is contained in:
Al Beano 2017-08-12 11:26:06 +01:00
parent e91816381d
commit 98c3c97e34
4 changed files with 85 additions and 2 deletions

73
bin/writezone.pl Executable file
View File

@ -0,0 +1,73 @@
#!/usr/bin/env perl
# Zone writer for cyberman.
# This won't scale well, but it's a basic way to get domains online
# Tested with NSD but should work with your favourite
use strict;
use warnings;
use feature 'say';
use FindBin qw($Bin);
use YAML::Tiny;
use DBI;
my $yml = YAML::Tiny->read("$Bin/../config.yml");
my $tld = $yml->[0]->{"tld"};
my $conf = $yml->[0]->{"zonewriter"};
open my $out, ">", $conf->{"file"} or die $!;
# Introduction
say $out <<'END';
; File produced by cyberman. Do not edit!
$TTL 86400
$ORIGIN cyb.
END
# Write SOA
# Uses mostly hard-coded values for now
say $out "@ 1D IN SOA $conf->{ns} $conf->{responsible} (";
say $out time;
say $out <<'END';
3H ; refresh
15 ; retry
604800 ; expire
3h ; nxdomain ttl
)
END
if ($conf->{"include"}->{"enabled"}) {
say $out "\$INCLUDE $conf->{include}->{file}";
}
# Time to get the records
die "Unsupported database!"
unless $yml->[0]->{"plugins"}->{"Database"}->{"driver"} eq "SQLite";
my $dbfile = "$Bin/../$yml->[0]->{plugins}->{Database}->{dbname}";
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile", "", "");
my $sth = $dbh->prepare("SELECT * FROM record");
$sth->execute;
while (my $r = $sth->fetchrow_hashref) {
# Look up domain
my $dsth = $dbh->prepare("select * from domain where id=?");
$dsth->bind_param(1, $r->{"domainid"});
$dsth->execute;
my $d = $dsth->fetchrow_hashref;
# domain name
if ($r->{"name"} eq '@') {
print $out $d->{"name"}, " ";
} else {
print $out $r->{"name"}, ".", $d->{"name"}, " ";
}
# record type
print $out "IN $r->{type} ";
# value
say $out $r->{value};
}
close $out;

View File

@ -17,3 +17,14 @@ plugins:
log_queries: 1
tld: 'cyb'
zonewriter:
# Values used for SOA
ns: 'ns12.opennic.glue'
responsible: 'hostmaster.opennic.cyb.'
file: '/var/nsd/zones/master/cyb'
include:
# Optionally, you can have the zonewriter include another file
# in the zone, which allows you to define some records manually
enabled: true
file: 'human_cyb'

View File

@ -1,6 +1,7 @@
requires "Dancer2" => "0.205001";
requires "YAML" => "0";
requires "YAML::Tiny" => "0";
requires "URL::Encode::XS" => "0";
requires "CGI::Deurl::XS" => "0";
requires "HTTP::Parser::XS" => "0";

View File

@ -57,8 +57,6 @@ post '/domains/new' => sub {
};
}
# TODO: send domains to nsd
database->quick_insert(
"domain",
{