Local modifications to ClusterLabs/Anvil by Alteeve
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.

187 lines
5.0 KiB

package Anvil::Tools::Email;
#
# This module contains methods used to manage the local postfix server and handle and dispatch email via
# mailx.
#
use strict;
use warnings;
use Scalar::Util qw(weaken isweak);
use Data::Dumper;
our $VERSION = "3.0.0";
my $THIS_FILE = "Email.pm";
### Methods;
# check_alert_recipients
# check_postfix
=pod
=encoding utf8
=head1 NAME
Anvil::Tools::Email
Provides all methods used to manage the local C<< postfix >> server and handle and dispatch email via C<< mailx >>
=head1 SYNOPSIS
use Anvil::Tools;
# Get a common object handle on all Anvil::Tools modules.
my $anvil = Anvil::Tools->new();
# Access to methods using '$anvil->Email->X'.
#
#
=head1 METHODS
Methods in this module;
=cut
sub new
{
my $class = shift;
my $self = {
};
bless $self, $class;
return ($self);
}
# Get a handle on the Anvil::Tools object. I know that technically that is a sibling module, but it makes more
# sense in this case to think of it as a parent.
sub parent
{
my $self = shift;
my $parent = shift;
$self->{HANDLE}{TOOLS} = $parent if $parent;
# Defend against memory leads. See Scalar::Util'.
if (not isweak($self->{HANDLE}{TOOLS}))
{
weaken($self->{HANDLE}{TOOLS});
}
return ($self->{HANDLE}{TOOLS});
}
#############################################################################################################
# Public methods #
#############################################################################################################
=head2 check_alert_recipients
This loops through all known hosts and all known C<< recipients >> and any C<< hosts >> that don't have a corresponding entry in C<< notifications >>. When found, an entry is created using the recipient's new level.
=cut
sub check_alert_recipients
{
my $self = shift;
my $parameter = shift;
my $anvil = $self->parent;
my $debug = defined $parameter->{debug} ? $parameter->{debug} : 3;
# Get a list of all recipients.
$anvil->Database->get_recipients({debug => 2});
# Get a list of hosts.
$anvil->Database->get_hosts({debug => 2});
# Get the notification list
$anvil->Database->get_notifications({debug => 2});
# Now loop!
foreach my $host_uuid (keys %{$anvil->data->{hosts}{host_uuid}})
{
my $host_name = $anvil->data->{hosts}{host_uuid}{$host_uuid}{host_name};
# Loop through recipients.
foreach my $recipient_uuid (keys %{$anvil->data->{recipients}{recipient_uuid}})
{
my $recipient_new_level = $anvil->data->{recipients}{recipient_uuid}{$recipient_uuid}{recipient_new_level};
# Now see if there's already an entry in notifications.
my $exists = 0;
foreach my $notification_uuid (keys %{$anvil->data->{notifications}{notification_uuid}})
{
my $notification_recipient_uuid = $anvil->data->{notifications}{notification_uuid}{$notification_uuid}{notification_recipient_uuid};
my $notification_host_uuid = $anvil->data->{notifications}{notification_uuid}{$notification_uuid}{notification_host_uuid};
if (($host_uuid eq $notification_host_uuid) && ($recipient_uuid eq $notification_recipient_uuid))
{
$exists = 1;
last;
}
}
# Did we find an entry?
if (not $exists)
{
# Nope, save it.
my ($notification_uuid) = $anvil->Database->insert_or_update_notifications({
debug => 2,
notification_recipient_uuid => $recipient_uuid,
notification_host_uuid => $host_uuid,
notification_alert_level => $recipient_new_level,
});
}
}
}
return(0);
}
=head2 check_postfix
This method checks the current postfix server configuration to see if it needs to be updated, then checks to see if the local C<< postfix >> daemin is enabled and started.
If any problem is encountered, C<< 1 >> is returned. Otherwise, if all is well, C<< 0 >> is returned.
Parameters;
=head3 config (optional, default '1')
If set to C<< 0 >>, the configuration is not checked or updated.
=head3 daemon (optional, default '1')
If set to C<< 0 >>, the C<< postfix >> daemon is not checked or started.
=cut
sub check_postfix
{
my $self = shift;
my $parameter = shift;
my $anvil = $self->parent;
my $debug = defined $parameter->{debug} ? $parameter->{debug} : 3;
my $problem = 0;
my $config = defined $parameter->{config} ? $parameter->{config} : 1;
my $daemon = defined $parameter->{daemon} ? $parameter->{daemon} : 1;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
config => $config,
daemon => $daemon,
}});
return($problem);
}
# =head3
#
# Private Functions;
#
# =cut
#############################################################################################################
# Private functions #
#############################################################################################################