Zuzu
view release on metacpan or search on metacpan
lib/Zuzu/Module/DNS.pm view on Meta::CPAN
elsif ( $type eq 'SRV' ) {
$out{target} = $value;
$out{port} = 0 + $rr->port;
$out{priority} = 0 + $rr->priority;
$out{weight} = 0 + $rr->weight;
}
return \%out;
}
sub _lookup_records {
my ( $name, $type_value ) = @_;
my $query_name = _str( $name, '' );
my $type = _record_type($type_value);
my $resolver = _resolver();
my $packet = $resolver->query( $query_name, $type );
if ( !$packet ) {
my $error = $resolver->errorstring;
return [] if _no_data_error($error);
die "DNSException: $error";
}
my @records;
for my $rr ( $packet->answer ) {
next if uc( $rr->type // '' ) ne $type;
push @records, _record_dict( $query_name, $type, $rr );
}
return \@records;
}
sub _addresses {
my ( $name, $family_value ) = @_;
my $query_name = _str( $name, '' );
my $family = lc _str( $family_value, 'any' );
my $socket_family;
if ( $family eq 'any' ) {
$socket_family = AF_UNSPEC;
}
elsif ( $family eq 'ipv4' ) {
$socket_family = AF_INET;
}
elsif ( $family eq 'ipv6' ) {
$socket_family = AF_INET6;
}
else {
die "DNSException: unsupported address family '$family'";
}
my ( $err, @results ) = getaddrinfo(
$query_name,
undef,
{
family => $socket_family,
socktype => SOCK_STREAM,
},
);
if ($err) {
return [] if $err =~ /(?:Name or service not known|nodename nor servname|no address)/i;
die "DNSException: $err";
}
my %seen;
my @addresses;
for my $result ( @results ) {
my ( $host_err, $host ) = getnameinfo( $result->{addr}, NI_NUMERICHOST );
next if $host_err;
next if $seen{$host}++;
push @addresses, $host;
}
return \@addresses;
}
sub _reverse_name {
my ( $address ) = @_;
if ( $address =~ /\A([0-9]{1,3}(?:\.[0-9]{1,3}){3})\z/ ) {
my @octets = split /\./, $1;
die "DNSException: invalid IPv4 address '$address'"
if grep { $_ > 255 } @octets;
return join( '.', reverse @octets ) . '.in-addr.arpa';
}
my $packed = inet_pton( AF_INET6, $address );
if ( defined $packed ) {
my $hex = unpack 'H*', $packed;
return join( '.', reverse split //, $hex ) . '.ip6.arpa';
}
die "DNSException: invalid IP address '$address'";
}
sub _reverse {
my ( $address_value ) = @_;
my $address = _str( $address_value, '' );
my $records = _lookup_records( _reverse_name($address), 'PTR' );
return [ map { $_->{target} } @{ $records } ];
}
sub _async_task {
my ( $runtime, $name, $work, $wrap ) = @_;
my $worker = $runtime->_new_task(
name => "$name.worker",
start => 1,
schedule => 1,
thunk => $work,
);
return $runtime->_new_task(
name => $name,
schedule => 1,
thunk => sub {
my $value = $worker->await;
return defined $wrap ? $wrap->($value) : $value;
},
);
}
( run in 2.160 seconds using v1.01-cache-2.11-cpan-0bb4e1dffa6 )