#! /usr/bin/env perl # based in part on code from # https://perlmaven.com/checking-the-whois-record-of-many-domains use strict; use warnings; use Data::Dumper; use File::Basename; my %results; for ( my $i = 0; $i < scalar( @ARGV ); $i++ ) { my $data = ''; my $domain = basename( $ARGV[$i], ( '.whois' ) ); if ( open DATA,"<$ARGV[$i]" ) { $data = join( '', ); } else { warn "Could not read $ARGV[$i]: $!\n"; next; } my @ns = get_ns($data); if ( @ns ) { foreach my $thisNS ( @ns ) { push @{ $results{ $thisNS } }, $domain; } } else { push @{ $results{ 'Unknown' } }, $domain; } } foreach my $ns ( sort keys %results ) { print "$ns\t", join( "\n$ns\t", @{ $results{$ns} } ) . "\n"; } sub get_ns { my ($data) = @_; my @ns; return ('Empty Record') unless $data; # this is a bad domain? return ('Invalid TLD' ) if $data =~ m/No whois server is known for this kind of object/; @ns = map { uc $_ } $data =~ /^\s*Name Server:\s*(\S+)\s*$/mg; if (not @ns) { @ns = map { uc $_ } $data =~ /^nserver:\s*(\S+)\s*$/mg; } if (not @ns) { my @lines = split /\n/, $data; return ('Expired Domain') if $lines[0] =~ m/^No Data Found/ || $lines[0] =~ m/^No match for/ || $lines[0] =~ m/^NOT FOUND/; my $in_ns = 0; for my $line (@lines) { if ($line =~ /^\s*Domain servers in listed order:\s*$/) { $in_ns = 1; next; } if ($line =~ /^\s*$/) { $in_ns = 0; } if ($in_ns) { $line =~ s/^\s+|\s+$//g; push @ns, uc $line; } } @ns = sort @ns; } return @ns; }