package Cualsea::Server::Mail; use v5.30.0; use strict; use warnings; use Const::Fast; use Email::Sender::Transport::SMTP; use Email::Sender::Simple qw/sendmail/; use Email::MIME; const my $MAIL_CONFIG_FILE => '/etc/cualsea/mail.conf'; const my $REPORT_TO_CONFIG_FILE => '/etc/cualsea/report_to'; const my $FROM_CONFIG_FILE => '/etc/cualsea/from'; sub new { my $class = shift; return bless {}, $class; } sub notify_service_down { my $self = shift; my $name = shift; my $mime = Email::MIME->create( header_str => [ From => $self->from, To => [ $self->report_to ], Subject => "Service $name down", ], parts => [ Email::MIME->create( attributes => { content_type => 'text/plain', disposition => 'attachment', charset => 'UTF-8', encoding => "8bit", }, body_str => "$name is not up", ) ] ); sendmail( $mime, { transport => $self->transport } ); } sub report { my $self = shift; my $dbh = Cualsea::Server::DB->dbh(); my $current_date = DateTime->now; my $message = "$current_date\n\n"; $message .= "@{[`uname -a`]} @{[`free -m`]} @{[`uptime`]}\n\n"; $message .= "List of services\n\n"; my $services = $dbh->selectall_arrayref( <<'EOF', { Slice => {} } ); SELECT name FROM services; EOF for my $service (@$services) { $message .= "@{[$service->{name}]}\n"; } $message .= "\nLast hour monitor\n\n"; my $monitor = $dbh->selectall_arrayref( <<'EOF', { Slice => {} }, $current_date->clone->add( hours => -1 ) . '' ); SELECT date_execution, name, is_up FROM monitor where date_execution > ?; EOF for my $register (@$monitor) { my $date_execution = $register->{date_execution}; my $name = $register->{name}; my $is_up = $register->{is_up}; $message .= "$date_execution @{[ defined $name ? $name : '']} @{[$is_up ? 'started' : 'stopped']}\n"; } $message .= "\nLast 20 commands\n\n"; my $log = $dbh->selectall_arrayref( <<'EOF', { Slice => {} } ); SELECT date_execution, parameters, result FROM log ORDER BY id DESC LIMIT 20; EOF for my $register (@$log) { my $date_execution = $register->{date_execution}; my $parameters = $register->{parameters}; my $result = $register->{result}; $message .= "$date_execution $parameters $result\n"; } my $mime = Email::MIME->create( header_str => [ From => $self->from, To => [ $self->report_to ], Subject => "Service report.", ], parts => [ Email::MIME->create( attributes => { content_type => 'text/plain', disposition => 'attachment', charset => 'UTF-8', encoding => "8bit", }, body_str => $message, ) ] ); sendmail( $mime, { transport => $self->transport } ); } sub report_to { my $self = shift; if ( !defined $self->{report_to} ) { open my $fh, '<', $REPORT_TO_CONFIG_FILE or die "Unable to get mail to report from config file"; my $email = <$fh>; chomp $email; close $fh; $self->{report_to} = $email; } return $self->{report_to}; } sub from { my $self = shift; if ( !defined $self->{from} ) { open my $fh, '<', $FROM_CONFIG_FILE or die "Unable to get mail From from config file"; my $email = <$fh>; chomp $email; close $fh; $self->{from} = $email; } return $self->{from}; } sub transport { my $self = shift; if ( !defined $self->{transport} ) { my %parameters; open my $fh, '<', $MAIL_CONFIG_FILE or die "Unable to get transport from config file"; while ( my $line = <$fh> ) { my ( $key, $value ) = $line =~ /^(.*?)=(.*?)\s*$/; if ( $key eq 'hosts' ) { $value = [$value]; } $parameters{$key} = $value; } close $fh; $self->{transport} = Email::Sender::Transport::SMTP->new(%parameters); } return $self->{transport}; } 1;