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 # #############################################################################################################