#!/usr/bin/perl

# Source: @RPM_PACKAGE_VERSION@-@RPM_PACKAGE_RELEASE@

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

use utf8;
use strict;
use warnings;
use Umlaut qw(textmodus);

my $warn = "";

use Cf qw($DATAHOST $DATAHOST2 $DATAPASS);
use Dbase::Help;
use Dbase::Help qw(DoTime);
use Dbase::Globals;
use Fehler qw(report_fehler ffehler);

sub Usage() {
	my $vers = '@RPM_PACKAGE_VERSION@-@RPM_PACKAGE_RELEASE@';

	textmodus(\*STDERR);
    die <<END;
Usage: $0 -- prüft Datenbank-Updatestatus
          -n       immer max. Verzögerung ausgeben
          -v       genaue Zeiten ausgeben
		  -s       suche anhand Slavepointer nach weiteren Hosts
		  -S       prüfe Slavezustand
          HOST,... diese Rechner prüfen

Version: $vers
END
  exit 1;
}

use Getopt::Std;
our($opt_h,$opt_v,$opt_n,$opt_s,$opt_S);
getopts("hnsSv") or Usage;
Usage if $opt_h;

my %t = ("JETZT",DoTime);
my %m;
my %p;

foreach my $h(@ARGV ? @ARGV : split(/\s+/,"$DATAHOST $DATAHOST2")) {
	my $pass = ($h =~ s/=(.+)//) ? $1 : $DATAPASS;
	$p{$h} = $pass;
}

my $new;
do {
	$new=0;
	foreach my $h(keys %p) {
	  ffehler {
		next if exists $t{$h};
		my $db = Dbase->new(DATAHOST => $h, DATAHOST2 => $h, DATAPASS => $p{$h});
		$t{$h} = $db->DoFn("select id from nextid where name = 'lastupdate'");
		if($opt_s) {
			my($mh,undef,undef,undef,undef,undef,$st,@rest) = $db->DoFn("show slave status");
			$warn .= "Die Replikation $mh an $h steht\n" if $st ne "Yes";
			print "$h <= $mh\n" if $opt_v;
			next if defined $p{$mh};
			$p{$mh} = $DATAPASS;
			$new++;
		}
	  } sub {
		report_fehler;
		die "Die Datenbank auf $h ist nicht erreichbar\n";
	  };
	}
} while($new);

if($opt_S) {
	foreach my $h(keys %p) {
	  ffehler {
		my $db = Dbase->new(DATAHOST => $h, DATAHOST2 => $h, DATAPASS => $p{$h});
		my($mh,@rest) = $db->DoFn("show slave status");
		my $mdb = Dbase->new(DATAHOST => $mh, DATAHOST2 => $mh, DATAPASS => $p{$mh}||$DATAPASS);
		my($mf,$mp,@rh) = $mdb->DoFn("show master status");
		my(undef,undef,undef,undef,$sf,$sp,$sr,@rrh) = $mdb->DoFn("show master status");
		if($mf gt $sf or ($mf eq $sf and $mp > $sp)) {
			$warn .= "Verzögerung: $mh:$mf:$mp => $h:$sf:$sp\n";
		} else {
			$warn .= "Replikation: $mh:$mf:$mp => $h:$sf:$sp\n" if $opt_v;
		}
		
		next;
	  } sub {
		report_fehler;
		die "Die Datenbank auf $h ist nicht erreichbar\n";
	  };
	}
}

my $max = 0;
foreach my $t(values %t) {
	$max = $t if $t > $max;
}

my $mdel = 0;
my $mdh = "";
foreach my $t(sort { $t{$b} <=> $t{$a} or $a cmp $b } keys %t) {
	my $del = $max - $t{$t};
	$mdel = $del, $mdh = $t if $mdel < $del;
	print "$del\t$t\n" if $opt_v and not ($t eq "JETZT" and $del == 0);
}
if($opt_n) {
	print "$mdel $mdh\n";
	exit(0);
}
print STDERR $warn;
die "Datenbank auf $mdh: Verzögerung: $mdel Sekunden\n" if $mdel > 60;
