App-Acmeman
view release on metacpan or search on metacpan
lib/App/Acmeman.pm view on Meta::CPAN
}
if ($addhost) {
foreach my $ip ($self->resolve(hostname())) {
$ips->{$ip} = 1;
}
}
}
return $ips->{$host};
}
sub host_ns_ok {
my ($self, $host) = @_;
foreach my $ip ($self->resolve($host)) {
return 1 if $self->myip($ip);
}
error("$host does not resolve to our IP");
return 0
}
sub prep_dir {
my ($self, $name) = @_;
my $dir = dirname($name);
if (! -d $dir) {
debug(3, "creating directory $dir");
return if $self->dry_run_option;
my @created = make_path("$dir", { error => \my $err } );
if (@$err) {
for my $diag (@$err) {
my ($file, $message) = %$diag;
if ($file eq '') {
error($message);
} else {
error("mkdir $file: $message");
}
}
exit(EX_CANTCREAT);
}
}
}
sub get_root_cert {
my $self = shift;
my $name = shift;
$self->prep_dir($name) unless $self->dry_run_option;
debug(1, "downloading $letsencrypt_root_cert_url to \"$name\"");
my $ua = LWP::UserAgent->new;
my $response = $ua->get($letsencrypt_root_cert_url);
if ($response->is_success) {
unless ($self->dry_run_option) {
open(my $fd, '>', $name)
or abend(EX_CANTCREAT,
"can't open \"$name\" for writing: $!");
print $fd $response->decoded_content;
close $fd;
}
} else {
error("error downloading certificate from $letsencrypt_root_cert_url");
abend(EX_NOINPUT, $response->status_line);
}
}
sub setup {
my $self = shift;
$self->prep_dir($self->cf->get(qw(core rootdir)).'/file');
$self->get_root_cert(File::Spec->catfile($acme_dir,
$letsencrypt_root_cert_basename));
foreach my $src ($self->cf->get(qw(core source))) {
unless ($src->setup(dry_run => $self->dry_run_option,
force => $self->force_option)) {
exit(1);
}
}
exit(EX_OK);
}
sub collect {
my $self = shift;
my $err;
my $node = $self->cf->getnode('domain') or return;
my $subs = $node->as_hash;
while (my ($k, $v) = each %$subs) {
my $dom;
my $ft;
my $alt = [grep { !$self->cf->get(qw(core check-dns))
|| $self->host_ns_ok($_) }
($k, ($v->{alt} ? @{$v->{alt}} : ()))];
if (@$alt) {
my $name = shift @$alt;
if ($name ne $k) {
error("$k: CN changed to $name, update your configuration");
}
$k = $name;
$alt = undef unless @$alt;
} else {
error("ignoring $k: none of its names resolves to our IP");
next;
}
if (exists($v->{files})) {
if (my $fref = $self->cf->getnode('files', $v->{files})) {
$dom = new App::Acmeman::Domain(
cn => $k,
alt => $alt,
postrenew => $v->{postrenew},
%{$fref->as_hash});
} else {
error("files.$v->{files} is referenced from [domain $k], but never declared");
++$err;
next;
}
} else {
$dom = new App::Acmeman::Domain(
cn => $k,
( run in 2.401 seconds using v1.01-cache-2.11-cpan-13bb782fe5a )