You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

130 lines
3.3 KiB

#!/usr/bin/perl
use strict;
use warnings;
use Config::JSON;
use DBI;
use File::Compare;
use File::Copy;
use Sys::Hostname;
$| = 1;
# Read config file
my $config_file = $ARGV[0];
my $config = Config::JSON->new($config_file) or die "Can not open config file: $config_file";
my $crontab = $config->get('crontab');
my $sharedcrontab = $config->get('sharedcrontab');
my $masterfile = $config->get('masterfile');
my $i = `hostname --fqdn`;
chomp $i;
my $apacheuid = 33;
my $crongid = 107;
# Connect to the dabase and see which one icinga thinks is the master
sub get_master_from_db {
# Setting up for db query
my $database = $config->get('db');
my $db_host = $config->get('host');
my $db_user = $config->get('user');
my $db_password = $config->get('password');
my $connect = DBI->connect( "DBI:mysql:database=$database;host=$db_host",
$db_user, $db_password, { RaiseError => 1 } );
my $query =
$connect->prepare("SELECT endpoint_name FROM icinga_programstatus");
$query->execute();
my $active = $query->fetchrow();
return $active;
}
# See what the file sais about who is master
sub get_master_from_file {
open( my $fh, '<:encoding(UTF-8)', $masterfile )
or die "Could not open file '$masterfile' $!";
my $master = <$fh>;
close($fh);
chomp $master;
return $master;
}
# update the file with current master
sub set_master_in_file {
open( my $fh, '>', $masterfile )
or die "Could not open file '$masterfile' $!";
print $fh $i;
close $fh;
}
# See if I am master
sub is_active {
my ($master) = @_;
my $status = 0;
if ( $i eq $master ) {
$status = 1;
}
return $status;
}
# Do the work
sub run {
print "Starting run at $i.\n";
# See if I am active as far as Icinga is concerned
if (is_active(get_master_from_db)) {
print "Icinga sais that I am master.\n";
# See if I am active as far as the file thinks
if (is_active(get_master_from_file)) {
print "No failover has happened.\n";
# See if the crontab has changed
if (compare( $crontab, $sharedcrontab ) != 0) {
print "The cronfile has changed, copying it to the shared drive.\n";
# Copy the crontab to the shared file if it has changed
copy( $crontab, $sharedcrontab );
chown $apacheuid, $crongid, ($sharedcrontab);
}
}
# If this clause executes, there has been a failover
else {
print "A failover has happened.\n";
print "Installing cronfile from the shared drive.\n";
# Copy the shared crontab to my crontab and set me as active in the file
copy( $sharedcrontab, $crontab );
chown $apacheuid, $crongid, ($crontab);
set_master_in_file;
}
}
# If this clause executes, I am not the master
else {
print "Icinga sais I am not master.\n";
# Remove the cronfile
if( -e $crontab) {
print "A failover has happened.\n";
print "Removing crontab.\n";
unlink $crontab;
}
}
}
# We want to run six times in a minute
for (my $index = 0; $index < 6; $index++) {
my $start = time;
run;
if ((my $remaining = 10 - (time - $start)) > 0) {
sleep $remaining;
}
}
exit;