Net::DN...:Donuts(3)

πŸ“¦
version 2.2.3 Β· 3 versions
, in arch rolling

πŸ’– Net::DN...:Donuts(3) πŸ’–

okay bestie, welcome to the Net::DN...:Donuts(3) page β€” yes, that's the manual name, and it's filed under User Contributed Perl Documentation. We're doing the Donuts module today, and it's gonna be a whole vibe. 🍩✨

🌸 NAME 🌸

Net::DNS::SEC::Tools::Donuts β€” execute DNS and DNSSEC lint-like tests on zone data. That's the job, and it ate. πŸ’…

✨ SYNOPSIS ✨

okay so here's the group-chat recap in code, and I'm keeping it exactly as the original has it, typos and all, because we do not edit the sacred text:

# load a zone, rules and analyze everything
#   by default, this will print errors in 'wrapped text' format
#   to stdout.
my $donuts = new Net::DNS::SEC::Tools::Donuts();
$donuts->load_zone("/path/to/example.com.signed", "example.com");
$donuts->load_rule_files("/path/to/installed/rules/*.txt");
my ($rulecount, $errorcount) = $donuts->analyze();

# send the output in json format to /tmp/foo.json instead
$donuts->set_output_format('json');
$donuts->set_output_location('file:/tmp/foo.json');
$donuts->analyze();

# display the available features
print "features: ", join(", ", $donuts->available_features()), "\n";

# enable the 'live' and 'check_data' features in the rule sets
$donuts->set_feature_list('live', 'check_data);

# ignore some rules (regexp's to match against rule names)
$donuts->set_ignore_list('NSEC');

# retrieve the rules loaded into the zone
my @rules = $donuts->rules();

# retrieve the records from the loaded zone
#  (these will be Net::DNS::RR based records)
my @records = $donuts->zone_records();

# or just of a certain name:
#   (these will be a hash reference like { type => [records] })
my $records = $donuts->find_records_by_name('www.example.com');

# or of just a type for a name:
#   (these will be an array reference to the [records])
my $records =
   $donuts->find_records_by_name_and_type('www.example.com', 'A');

🍩 DESCRIPTION 🍩

okay so the tea is: Net::DNS::SEC::Tools::Donuts (aka Donuts) can load a zone file, load rules to test against it, then analyze those rules and report the results. that's the whole arc. πŸ¦‹

πŸŽ€ Creating a Donuts instance πŸŽ€

creating an instance of a Donuts object is straightforward, literally:

use Net::DNS::SEC::Tools::Donuts
my $donuts = new Net::DNS::SEC::Tools::Donuts();

🌈 Loading and Accessing Zone Data 🌈

okay so load_zone(SPECIFIER, ZONENAME) is how you get zone data into the Donuts module. By default this function takes a file path as an argument, or you can use one of the special specifiers listed below too. ✨

  • $donuts->load_zone("/path/to/file", "example.com"); β€” loads a file from a typical (text based) zone data file. It uses the Net::DNS::Zonefile::Fast module for parsing the zone file into Net::DNS::RR records. πŸ“
  • $donuts->load_zone("axfr:example.com", "example.com"); β€” if the host has the ability to perform an axfr transfer of a given zone, this specifier can be used to dynamically transfer the zone data from the online servers. πŸ”₯
  • $donuts->load_zone("live:www,ftp:aaaa,ns", "example.com"); β€” when the live: specifier prefix is used, the Donuts module will attempt to perform single queries from the zone for the specified list of domain name prefixes for the zone. The default list (i.e. just "live:") of zone records to query for is just "www". Query types may be specified by separating the label with a ':' character, as in the example above which indicates a AAAA record should be queried for the 'ftp' host. 🧚

In addition to the list specified within the specifier itself, each zone is always queried for the following entries as well:

  • ZONENAME:DNSKEY
  • ZONENAME:SOA
  • ZONENAME:NS
Note that because the zone won't be entirely complete, careful selection or exclusion of rules (see "Ignoring and Only Executing Rules") will likely be required to filter out bad results during any analysis that is performed. πŸ’€

🧁 Loading Donuts Rules 🧁

the original page has literally no prose under this heading β€” it's just the heading, so I'm not gonna invent lore. mystery unlocked, bestie. πŸ•΅οΈβ€β™€οΈ

πŸ” Analyzing Zones Using Rules πŸ”

same situation here: the original gives us a heading and then dips. no extra details to report. πŸ™ˆ

⭐ Features ⭐

heading only in the original. no feature list on this page. don't come for me, I'm just the messenger. πŸ’…

πŸŽ€ Ignoring and Only Executing Rules πŸŽ€

also heading-only in the original. The note up in the zone-loading section points you here, but this page doesn't fill it in. iconic cliffhanger behavior. 😭

πŸ› οΈ Configuration πŸ› οΈ

heading only, no config prose in the original. that's it, that's the section. ✨

Copyright 2013-2013 Parsons. All rights reserved. See the COPYING file included with the DNSSEC-Tools package for details. 🫢

πŸ‘‘ AUTHOR πŸ‘‘

Wes Hardaker <hardaker@users.sourceforge.net> πŸ’–

πŸ”— SEE ALSO πŸ”—

πŸ’€ POD ERRORS πŸ’€

Hey! The above document had some coding errors, which are explained below:

Around line 972:
    =back without =over

byeee 🫢 this page came from perl v5.44.0, dated 2026-10-17, and it's the Net::DN...:Donuts(3) manual page. mwah πŸ’–

πŸ“¦ where this page comes from