you-dont-need-pihole/make-block.pl

90 lines
2.2 KiB
Perl
Executable File

#!/usr/bin/perl
# vi: et sts=4 sw=4 ts=4
use strict;
use warnings;
use Getopt::Long qw/ GetOptions :config no_ignore_case /;
my %domains;
my $dupes = 0;
my $skip = 0;
sub add_domain_list {
my $file = shift;
open my $fni, '<', $file
or die "Failed to open file $file for reading: $!";
foreach my $line (<$fni>) {
chomp $line;
$line =~ s/^\s+|\s+$//;
my $domain = lc $line;
++$dupes if defined $domains{$domain};
$domains{$domain} = 1;
}
}
sub add_host_file {
my $file = shift;
open my $fni, '<', $file
or die "Failed to open file $file for reading: $!";
foreach my $line (<$fni>) {
chomp $line;
# strip whitespace and comments
$line =~ s/^\s+|\s+$|\s*#.*$//;
next unless $line;
my @parts = split /\s+/, $line;
die "Malformed line in $file: $line; @parts"
unless @parts > 1;
if (lc $parts[0] eq lc $parts[1]) {
++$skip;
next;
}
unless (lc $parts[0] eq '0.0.0.0') {
++$skip;
next;
}
my $domain = lc $parts[1];
++$dupes if defined $domains{$domain};
$domains{$domain} = 1;
}
}
MAIN: {
my $out = 'block.list';
my $block_ip = '0.0.0.0';
unless (&GetOptions(
'out=s' => \$out,
'O=s' => \$out,
'i=s' => \$block_ip,
'block-ip=s' => \$block_ip,
)) {
exit 2;
}
my @domain_lists = glob 'lists/*.domains';
my @hosts_lists = glob 'lists/*.hosts';
foreach my $listfile (@domain_lists) {
&add_domain_list($listfile);
}
foreach my $hostfile (@hosts_lists) {
&add_host_file($hostfile);
}
my $written = 0;
open my $fho, '>', $out
or die "Failed to open file $out for writing: $!";
print $fho map {
++$written;
"$block_ip $_\n"
} sort keys %domains;
printf STDERR "%d domains written to %s from\n", $written, $out;
printf STDERR " - %d .domains files\n", (scalar @domain_lists);
printf STDERR " - %d .hosts files\n", (scalar @hosts_lists);
printf STDERR "(%d duplicates)\n", $dupes if $dupes;
printf STDERR "(%d skipped)\n", $skip if $skip;
}