Package: libnet-dns-perl
Version: 0.66-2+b2

        There doesn't seem to be an easy way to create a Net::DNS::RR
        instance given a “pre-parsed” resource record serialization
        (such as one read from a XML or CSV file, or an SQL database.)

        Consider, e. g.:

## as read, e. g., from a CSV file
my @rrs
    = (["foo.example.org", "AAAA",  "2001:db8:1337::cafe"],
       ["bar.example.org", "CNAME", "foo.example.org"]);

foreach my $rr (@rrs) {
    ## FIXME: this switch shouldn't be necessary
    my $key
        = ($rr->[1] eq "AAAA"     ? "address"
           : $rr->[1] eq "CNAME"  ? "cname"
           : ...);
    my $rr
        = Net::DNS::RR->new ("name" => $rr->[0], "type" => $rr->[1],
                             $key   => $rr->[2]);
}

        Obviously, this is further complicated by the fact that certain
        RR's include more than one payload value (MX, SRV, etc.)

        A possible work-around function is MIME'd (based on the the
        Net::DNS::RR->new_from_string () constructor's code), which, I
        believe, should be possible to adapt into a proper Net::DNS::RR
        constructor.

        TIA.

-- 
FSF associate member #7257      rp. The Evil That Men Do — Iron Maiden
require Net::DNS;

sub rr_new_mixed {
    my ($rdatastr, @rest) = @_;

    my $rr1
        = Net::DNS::RR->new (@rest)
        or die ();

    ## NB: accessing the internals directly
    my $rr_class
        = Net::DNS::RR->_get_subclass ($rr1->type ())
        or die ();
    my $rr
        = $rr_class->new_from_string ($rr1, $rdatastr)
        or die ();

    ## .
    $rr;
}

# require Data::Dump;

# my $rr_1
#     = rr_new_mixed ("2001:db8:1337::cafe",
#                     "name"  => "foo.example.org",
#                     "type"  => "AAAA");
# print ($rr_1->string (), "\n",
#        Data::Dump::dump ($rr_1), "\n");
# my $rr_2
#     = rr_new_mixed ("foo.example.org",
#                     "name"  => "bar.example.org",
#                     "type"  => "CNAME");
# print ($rr_2->string (), "\n",
#        Data::Dump::dump ($rr_2), "\n");

Reply via email to