#!/usr/bin/perl -w

# Source: @RPM_PACKAGE_VERSION@-@RPM_PACKAGE_RELEASE@

BEGIN {
	unshift( @INC, ( $ENV{'POPHOME'} || '@POPHOME@' ) . '/lib' )
	  unless $ENV{'TESTING2'}
	  or $ENV{'TESTING'};
}

use utf8;
use strict;
use warnings;

use Dbase::Getopt qw(:DEFAULT getopt_date);
use Dbase::Globals qw(find_descr);
use Dbase::Help qw(:readonly DoSelect);
use Acct qw();

my $Datum;
my @Args = GetOptions(
  'datum=s'  => sub { $Datum = &getopt_date },
  'list'     => \my $List,
  'quelle=s' => \my @Quellen,
  'ziel=s'   => \my @Ziele,
);

die <<_ if @Args && $List;
-list und die Angabe von IP-Adressen auf der Kommandozeile schließen sich aus.
_

$Datum = $^T unless defined $Datum;

my $acct = Acct->new(
	want => join(
		',',
		kunde => @Quellen
		? @Quellen
		: qw(ip
		  ip_de)
	),
	timestamp        => $Datum,
	dienst           => 'ip',
	quelle           => 'test',
	logdir           => undef,
	do_reverse       => 0,
	do_same_customer => 0,
	no_lock          => 1,
);

my %z = map { ( find_descr( ziel => $_ ) || '?' ) => 1 } @Ziele;

if ($List) {
	my @hip = @{$acct->{hash_ip}};
	while(@hip) {
		my $hip = pop @hip;
		next unless ref $hip;
		my $bits = len($hip);
		while ( my ( $ip, $net ) = each %$hip) {
			$net =~ s/.* //;
			my $b = ($ip =~ /:/) ? 128-$bits : 32-$bits;
			print "$ip/$b\n" if $z{ ord $net };
		}
	}
	exit 0;
}

sub run(&) {
	my ($proc) = @_;
	if (@Args) { $proc->($_) for @Args }
	else {
		while (<>) {
			chomp;
			$proc->($_);
		}
	}
}

my %kzhash;

if (@Ziele) {
	run {
		my ($adr) = $_;
		my $ziel = $acct->who_ip($adr);
		print "$adr\n" if $z{ ord($ziel) };
	};
}
else {
	run {
		my $ziel = $acct->who_ip($_);
		print "$ziel\n";
	};
}

__END__

=head1 NAME

ipacct - listet / filtert nach IP-Adressbereichen

=head1 SYNOPSE

	ipacct -list -ziel deutsch

listet alle IP-Adresse / Zonen, die von der Datenbank mit dem Ziel
"deutsch" accountet werden.

Vorsicht: Sub-Zonen in anderen Bereichen werden ignoriert -- es kann also
sein, dass eine gegebene Adresse trotzdem anders accountet wird!

	ipacct 192.168.1.1

liefert das dieser Adresse entsprechende Ziel.

	ipacct -ziel deutsch 192.168.1.1

gibt die Adresse auf die Standardausgabe aus, wenn sie als Ziel "deutsch" hat.
Ansonsten wird nichts ausgegeben.

Bei Aufrufen ohne "-list" und ohne IP-Adressen werden die Adressen
von der Standardeingabe gelesen.

=head1 OPTIONEN

=over 4

-item -quelle Quelle

Quellen von IP-Adressen auswählen bzw. einschränken.
Kann mehrfach verwendet werden, um mehrere Quellen auszuwählen.
Default sind "ip" und "ip_de".
Die jeweils erste Angabe hat Priorität.

=over 4

=item ip

Die IP-Adress-Tabelle der Datenbank.

=item ip_dtag

Die Liste der IP-Adressen der Telekomik.

=item ip_de

Die Liste der deutschen IP-Adressen (vom RIPE).

=back

Hinweis: Die ip-Liste ist tagesaktuell, mit Datumsangabe sind Aktivitäten
aus der Vergangenheit reproduzierbar; die anderen beiden Dateien werden
maximal drei Tage lang gecacht und sind bei Datensätzen aus der Vergangenheit
unzuverlässig.

=item -Ziel Ziel

nur IP-Adressen berücksichtigen, die das angegebene Ziel haben.
Kann mehrfach verwendet werden, um IP-Adressen mit unterschiedlichen Zielen zu
berücksichtigen.

=item -datum Datum

Datum, an dem die Prüfdaten erfasst wurden

=item -help

=item -?

um (nur) diese Dokumentation anzeigen zu lassen

=back

=cut

