diff --git a/cualsea-server/lib/Cualsea/Server/DB.pm b/cualsea-server/lib/Cualsea/Server/DB.pm index 361e406..677c9f7 100644 --- a/cualsea-server/lib/Cualsea/Server/DB.pm +++ b/cualsea-server/lib/Cualsea/Server/DB.pm @@ -30,7 +30,9 @@ my @migrations = ( id INTEGER PRIMARY KEY, date_execution TEXT, is_up INTEGER - );' + );', + 'ALTER TABLE monitor + ADD COLUMN name TEXT', ); sub dbh { @@ -50,7 +52,6 @@ sub run_migrations { my $dbh = shift; my $current_migration = _get_current_migration_number($dbh); say $current_migration; - say scalar @migrations; if ($current_migration < scalar @migrations) { my @needed_migrations = @migrations[$current_migration .. $#migrations]; for my $migration (@needed_migrations) { diff --git a/cualsea-server/lib/Cualsea/Server/Mail.pm b/cualsea-server/lib/Cualsea/Server/Mail.pm index 6333e77..63fffbd 100644 --- a/cualsea-server/lib/Cualsea/Server/Mail.pm +++ b/cualsea-server/lib/Cualsea/Server/Mail.pm @@ -10,9 +10,9 @@ 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 $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'; +const my $FROM_CONFIG_FILE => '/etc/cualsea/from'; sub new { my $class = shift; @@ -25,29 +25,93 @@ sub notify_service_down { my $mime = Email::MIME->create( header_str => [ - From => $self->from, - To => [ $self->report_to ], + 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", + disposition => 'attachment', + charset => 'UTF-8', + encoding => "8bit", }, body_str => "$name is not up", ) ] ); - sendmail($mime, { transport => $self->transport }); + 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 $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; @@ -57,9 +121,10 @@ sub 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 $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; @@ -69,14 +134,15 @@ sub from { } sub transport { - my $self = shift; - if (!defined $self->{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 ]; + 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; } diff --git a/cualsea-server/lib/Cualsea/Server/MessageController.pm b/cualsea-server/lib/Cualsea/Server/MessageController.pm index 2624643..dc4dfda 100644 --- a/cualsea-server/lib/Cualsea/Server/MessageController.pm +++ b/cualsea-server/lib/Cualsea/Server/MessageController.pm @@ -160,6 +160,16 @@ sub handle_restart { }; } +sub handle_report { + my $mailer = Cualsea::Server::Mail->new(); + $mailer->report; + return { + is_error => 0, + status => 200, + desc => 'Successfully sent report.', + }; +} + my %COMMANDS = ( add => { params => [ @@ -190,6 +200,7 @@ my %COMMANDS = ( report => { params => [], validator => sub { }, + handle => \&handle_report, }, start => { params => ['name'], diff --git a/cualsea-server/lib/Cualsea/Server/MonitorController.pm b/cualsea-server/lib/Cualsea/Server/MonitorController.pm index d448ba6..fa15766 100644 --- a/cualsea-server/lib/Cualsea/Server/MonitorController.pm +++ b/cualsea-server/lib/Cualsea/Server/MonitorController.pm @@ -56,8 +56,8 @@ EOF $started = !system 'ps', '-p', $pid; close $fh; }} - $dbh->do( 'INSERT INTO monitor (date_execution, is_up) VALUES (?, ?);', - undef, DateTime->now() . '', $started ); + $dbh->do( 'INSERT INTO monitor (date_execution, name, is_up) VALUES (?, ?);', + undef, DateTime->now() . '', $name, $started ); if (!$started) { say "$name stopped"; my $mailer = Cualsea::Server::Mail->new();