Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

wcdns - report on wildcard DNS domains

by thrig (Beadle)
on Sep 16, 2003 at 22:47 UTC ( [id://291983]=sourcecode: print w/replies, xml ) Need Help??
Category: Networking Code
Author/Contact Info Jeremy Mates <jmates@sial.org>
Description: Provides means to determine which TLD have wildcard DNS records, or whether particular domains resolve to the wildcard address(es).
#!/usr/bin/perl -w
#
# $Id: wcdns,v 1.5 2003/09/16 22:25:52 jmates Exp $
#
# The author disclaims all copyrights and releases this script into th
+e
# public domain.
#
# Checks whether domain(s) listed on command line (or failing that
# STDIN) are wildcard domains.
#
# Run perldoc(1) on this file for more documentation.

use strict;

# how to match Top Level Domains (TLD)
my $tld_re = qr/( \.\w+ )/x;

# domain portion option so can handle just TLD input
my $domain_re = qr/( (?:[\w-]+)? $tld_re )/x;

use Net::DNS;
my $dns = Net::DNS::Resolver->new;
$dns->defnames(0);  # do not search default domain

chomp(@ARGV = <STDIN>) unless @ARGV;

for my $input (@ARGV) {
  my ($domain, $tld) = $input =~ / $domain_re \W* $ /x;

  # real TLD should have SOA records
  unless ($dns->query($tld, 'SOA')) {
    warn "notice: skipping as no SOA record: $tld\n";
    next;
  }

  my $wildcard = '*' . $tld;
  my @wc_ip    = get_ip_list($dns, $wildcard);

  # no wildcards for this TLD
  next unless @wc_ip;

  if ($domain eq $tld) {
    print "tld $tld wildcard @wc_ip\n";
  } else {
    my @dom_ip = get_ip_list($dns, $domain);
    die "error: no addresses for domain $domain\n" unless @dom_ip;

    my (%union, %isect);
    for my $ip (@wc_ip, @dom_ip) { $union{$ip}++ && $isect{$ip}++ }

    if (keys %isect) {
      print "domain $domain wildcard ", join (" ", keys %isect), "\n";
    }
  }
}

# Accepts Net::DNS::Resolver object and item to lookup for A records,
# returns undef or list of ip addresses
sub get_ip_list {
  my $dns  = shift;
  my $what = shift;

  my $query = $dns->query($what, 'A');
  return unless $query;

  my @ips;

  for my $rr ($query->answer) {
    push @ips, $rr->address if $rr->type eq 'A';
  }

  return @ips;
}

__END__

=head1 NAME

wcdns - report wildcard DNS domains

=head1 SYNOPSIS

List Top Level Domains (TLD) with wildcard records enabled.

  $ wcdns .com .net .org .edu
  tld .com wildcard 64.94.110.11
  tld .net wildcard 64.94.110.11

Check whether host is a wildcard domain.

  $ wcdns an17iqz4dhxm6es532feaxrkyidvoh7fkav.net
  domain an17iqz4dhxm6es532feaxrkyidvoh7fkav.net wildcard 64.94.110.11

=head1 DESCRIPTION

=head2 Overview

Provides means to determine which TLD have wildcard DNS records, or
whether particular domains resolve to the wildcard address(es).

=head2 Normal Usage

  $ wcdns domain [domain2 ...]

If no domains (top level domains, domain names, hostnames, or domainis
+h
input) are listed on the command line, the script will attempt to read
the list from standard input, which allows input from a file or pipe:

  $ wcdns < domainlistfile

Output will be sent to stdout, errors to stderr. Problems will result 
+in
a non-zero exit code. No news is good news; TLD or domains will only b
+e
listed if there are wildcard entries infesting the data. See
L<"SYNOPSIS"> for the two output formats; one is whether the TLD
speicifed has wildcard support; the other is whether a domain is
wildcarded.

=head1 BUGS

=head2 Reporting Bugs

Newer versions of this script may be available from:

http://sial.org/code/perl/

If the bug is in the latest version, send a report to the author.
Patches that fix problems or add new features are welcome.

=head2 Known Issues

No known issues.

=head1 TODO

More sanity checking, especially on multiple IP address results where
there is only a partial overlap between the TLD wildcard addresses and
the addresses for the domain in question.

=head1 SEE ALSO

perl(1), Net::DNS

=head1 AUTHOR

Jeremy Mates, http://sial.org/contact/

Based heavily on code posted by John Rowan Littell to the MIMEDefang
mailing list.

http://lists.roaringpenguin.com/pipermail/mimedefang/2003-September/00
+8061.html

=head1 COPYRIGHT

The author disclaims all copyrights and releases this script into the
public domain.

=head1 VERSION

  $Id: wcdns,v 1.5 2003/09/16 22:25:52 jmates Exp $

=cut

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: sourcecode [id://291983]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others cooling their heels in the Monastery: (4)
As of 2024-04-19 02:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found