#!/usr/bin/perl

use utf8;
use strict;
use warnings;

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

use Dbase::Getopt;
use Dbase::Globals qw(get_descr);
use Dbase::Help qw(:readonly DoSelect);
use Fehler qw(probleme warnungen);
use Loader qw(check_mailrule);

my @ignore_errors;
GetOptions(
    'ignore-error=s' =>
      sub { ( undef, my $error_re ) = @_; push @ignore_errors, qr/$error_re/ },
    'ignore-quelle=s' => \my @ignore_quelle,
    'verbose+'        => \my $Verbose,
);

{
    my $ignore_errors = qr/${\ join '|', @ignore_errors }/;

    sub trim {
        my @input = @_;
        @input = grep $_ !~ $ignore_errors, @input or return if @ignore_errors;
        ( my $s = "@input" ) =~ s/\n/ /g;
        $s =~ s/^\s+//;
        $s =~ s/\s+\z//;
        $s;
    }
}

my $add_where = @ignore_quelle > 0
  && "\t     AND mailrules.quelle NOT IN ("
  . join( ',', map qquote($_), @ignore_quelle ) . ')';

$| = 1;
DoSelect {
    my ( $kunde, $quelle, $typ, $ziel ) = @_;
    check_mailrule( $quelle, $typ, $ziel );
    my @fehler;
    probleme  { push @fehler, trim(@_); 1 };
    warnungen { push @fehler, trim(@_); 1 };
    my $rule = "$kunde: "
      . ( defined $quelle ? $quelle : '*' ) . ' -> '
      . get_descr( mailrules => $typ )
      . ( defined $ziel && "!$ziel" )
      . '... ';
    if (@fehler) {
        print $rule . join( "; ", @fehler ) . "\n";
    }
    elsif ($Verbose) {
        print $rule . "OK\n";
    }
  }
  <<_
	SELECT   kunde.name, mailrules.quelle, mailrules.typ, mailrules.ziel
	FROM     kunde, mailrules
	WHERE    kunde.id = mailrules.kunde
	     AND ( kunde.ende IS NULL OR kunde.ende >= UNIX_TIMESTAMP(NOW()) )
$add_where
	ORDER BY kunde.name, mailrules.quelle
_

__END__

=head1 NAME

ueberpruefe_mailrules - checkt alle Mailrules durch

=head1 SYNOPSE

  check_mailrules --ignore-error ' existiert eine smtp_route_(?:a|mx)-Weiterleitung auf '   \
                  --ignore-error '^MX-Records für "(\S+)" zeigen nicht ausschließlich auf '

=head1 BESCHREIBUNG

Dieses Script überprüft alle in der Datenbank eingetragenen aktiven Mail-Regeln
und gibt Inkonsistenzen aus.

=head1 OPTIONEN

=head2 ignore-error=s @

zur Angabe zu ignorierender Fehlertypen in Form regulärer Ausdrücke

=head2 ignore-quelle=s @

Mail-Regeln für diese Quelle(n) ignorieren

=head2 verbose+

Bei Verwendung dieser Option werden auch solche Einträge ausgegeben,
zu denen keine Inkonsistenzen gefunden wurden.

=head2 help|?

um (nur) diese Dokumentation anzeigen zu lassen

