You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

185 lines
3.4 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

package configuration;
use YAML::XS;
use URI;
use fileutil ':all';
use Exporter 'import';
# what we want to export eventually
our @EXPORT_OK = qw/
get_cfg is_reserved
get_zonedir_from_cfg
get_dnsslavekey_from_cfg
get_v4_from_name
get_v6_from_name
get_v4_from_cfg
get_v6_from_cfg
get_host_from_cfg
get_user_from_cfg
get_port_from_cfg
get_tmpdir_from_uri
is_view_test
/;
# bundle of exports (tags)
our %EXPORT_TAGS = ( all => [qw/
get_cfg is_reserved
get_zonedir_from_cfg
get_dnsslavekey_from_cfg
get_v4_from_name
get_v6_from_name
get_v4_from_cfg
get_v6_from_cfg
get_host_from_cfg
get_user_from_cfg
get_port_from_cfg
get_tmpdir_from_uri
is_view_test
/] );
sub is_conf_file {
my $f = shift;
unless(-f $f) {
die "$f : not a file";
}
unless(-r $f) {
die "$f : not readable";
}
unless(-T $f) {
die "$f : not plain text";
}
}
sub get_cfg {
my ($cfgdir) = @_;
$cfgdir //= './conf/';
my $f = "$cfgdir/config.yml";
is_conf_file $f;
YAML::XS::LoadFile($f)
}
sub is_reserved {
my ($domain) = @_;
my $filename = 'conf/reserved.zone';
is_conf_file $filename;
my $data = read_file $filename;
$data =~ /^$domain$/m;
}
# TODO : tests
sub get_v6_from_name {
my $name = shift;
my $val = qx/host -t AAAA $name | grep -oE '[^[:space:]]+\$'/;
chomp $val;
#die q{There is no available v6. TODO.} if($val =~ 'NXDOMAIN');
return undef if($val =~ 'NXDOMAIN');
$val
}
sub get_v4_from_name {
my $name = shift;
my $val = qx/host -t A $name | grep -oE '[^[:space:]]+\$'/;
chomp $val;
die q{There is no available v4. TODO.} if($val =~ 'NXDOMAIN');
$val
}
sub get_v6_from_cfg {
my $cfg = shift;
$$cfg{domain}{v6} // get_v6_from_name($$cfg{domain}{name})
}
sub get_v4_from_cfg {
my $cfg = shift;
$$cfg{domain}{v4} // get_v4_from_name($$cfg{domain}{name})
}
sub get_tmpdir_from_uri {
my $tmpdir = shift;
unless($tmpdir) {
die 'There is no tmpdir';
}
URI->new($tmpdir)->path;
}
sub get_zonedir_from_cfg {
my $cfg = shift;
unless($$cfg{zonedir}) {
die 'For now, the only way to get the zone path is to setup zonedir '
. 'in the primaryserver configuration in config.yml.';
}
URI->new($$cfg{zonedir})->path;
}
# in production by default, get the isviewtest value elsewise
sub is_view_test {
my $cfg = shift;
$$cfg{isviewtest}
}
sub get_host_from_cfg {
my $cfg = shift;
if($$cfg{zonedir}) {
my $u = URI->new($$cfg{zonedir});
return $u->host;
}
elsif($$cfg{domain}{name}) {
return $$cfg{domain}{name};
}
die "Impossible to get the host from the configuration."
}
sub get_dnsslavekey_from_cfg {
my $cfg = shift;
if($$cfg{dnsslavekey}) {
return $$cfg{dnsslavekey};
}
die "Impossible to get the dns slave key from the configuration."
}
sub get_user_from_cfg {
my $cfg = shift;
if($$cfg{zonedir}) {
my $u = URI->new($$cfg{zonedir});
return $u->user;
}
elsif($$cfg{domain}{user}) {
return $$cfg{domain}{user};
}
die "Impossible to get the user from the configuration."
}
sub get_port_from_cfg {
my $cfg = shift;
if($$cfg{zonedir}) {
my $u = URI->new($$cfg{zonedir});
return $u->port;
}
elsif($$cfg{domain}{port}) {
return $$cfg{domain}{port};
}
die "Impossible to get the port from the configuration."
}
1;