#!/usr/bin/perl -w

BEGIN {
        select(STDERR); $|=1; select(STDOUT);
        unshift(@INC,($ENV{'POPHOME'}||'@POPHOME@').'/lib')
            unless $ENV{'KUNDE_NO_PERLPATH'};
      }

use utf8;
use strict;
use warnings;

use Dbase::Getopt;

@ARGV = GetOptions( 'check-network!' => \( my $CheckNetwork = 1 ) );

sub error($) {
    my ($message) = @_;
    "$message in Zeile $."
      . ( defined $ARGV && $ARGV ne '-' && qq( von "$ARGV") ) . ": $_";
}

require NetAddr::IP if $CheckNetwork;

my $network;
while (<>) {
    my ( $status, $origin, $maybe_network ) = /^\*(.)(.)(\S*)/ or next;
    warn error(qq(Unerwarteter Origin-Code "$origin"))
      if $origin !~ /^[ie ]\z/;

    if ( $maybe_network ne '' ) {
        die error('Kein gültiges Netz')
          if $CheckNetwork && !NetAddr::IP->new($maybe_network);
	$network = $maybe_network;
    }

    if ( $status eq '>' ) {
        die error(
            'Netzwerk nicht angegeben oder wiederholt als "best" markiert')
          unless defined $network;
        print "$network\n";
        undef $network;
    }
}

__END__

=head1 NAME

extract_networks_from_bgp-table - extrahiert Netwerke aus einer BGP-Table

=head1 SYNOPSE

 extract_networks_from_bgp-table Datei_mit_BGP-Tabelle

=head1 BESCHREIBUNG

Wir benötigen dieses Tool, um aus einer BGP-Tabelle, wie sie z. B. im Anhang von
RT#272980-13 zu finden ist, eine Liste von Netzwerken zu extrahieren, die wir
wiederum benötigen, um beim Accounting zu entscheiden, zu welchem Ziel eine
bestimmte IP-Adresse gehört.

Das Tool liest wahlweise aus den namentlich auf der Kommandozeile übergebenen
Dateien oder von der Standardeingabe.

=head1 OPTIONEN

=over 4

=item --nocheck-network

Per Default wird sicherheitshalber mittels L<NetAddr::IP> überprüft, ob es sich
bei den extrahierten Daten tatsächlich um gültige Netwerkangaben im handelt.
Durch diese Option lässt sich das bei Bedarf ausschalten, was die Verarbeitung
deutlich beschleunigt.

=back
