2021-11-13 20:38:53 +01:00
|
|
|
package Cualsea::Server::MonitorController;
|
|
|
|
|
|
|
|
use v5.30.0;
|
|
|
|
|
|
|
|
use strict;
|
|
|
|
use warnings;
|
|
|
|
|
|
|
|
use DateTime;
|
|
|
|
|
|
|
|
use Cualsea::Server::DB;
|
|
|
|
use Cualsea::Server::Service;
|
|
|
|
use Cualsea::Server::Mail;
|
|
|
|
|
|
|
|
sub new {
|
|
|
|
my $class = shift;
|
|
|
|
return bless {}, $class;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub last_date {
|
|
|
|
my $self = shift;
|
|
|
|
if ( !exists $self->{last_date} ) {
|
|
|
|
$self->{last_date} = DateTime->now();
|
|
|
|
}
|
|
|
|
return $self->{last_date};
|
|
|
|
}
|
|
|
|
|
|
|
|
sub loop {
|
|
|
|
my $self = shift;
|
|
|
|
my $last_date = $self->last_date;
|
|
|
|
my $current_date = DateTime->now();
|
|
|
|
if ( $current_date > $last_date->clone->add( minutes => 1 ) ) {
|
|
|
|
$self->{last_date} = $current_date;
|
|
|
|
$self->monitor;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sub monitor {
|
|
|
|
my $self = shift;
|
|
|
|
my $dbh = Cualsea::Server::DB->dbh();
|
|
|
|
my $services = $dbh->selectall_arrayref( <<'EOF', { Slice => {} } );
|
|
|
|
SELECT name,pidfile FROM services;
|
|
|
|
EOF
|
|
|
|
for my $service (@$services) {
|
|
|
|
my $pidfile = $service->{pidfile};
|
|
|
|
my $name = $service->{name};
|
|
|
|
my $started = Cualsea::Server::Service::is_started_service($name);
|
|
|
|
if ($started) {{
|
|
|
|
my $success_opening = open my $fh, '<', $pidfile;
|
|
|
|
if (!$success_opening) {
|
|
|
|
$started = 0;
|
|
|
|
# Cool trick to escape if {{ }}
|
|
|
|
next;
|
|
|
|
}
|
|
|
|
my $pid = <$fh>;
|
|
|
|
chomp $pid;
|
|
|
|
$started = !system 'ps', '-p', $pid;
|
|
|
|
close $fh;
|
|
|
|
}}
|
2021-11-13 21:26:42 +01:00
|
|
|
$dbh->do( 'INSERT INTO monitor (date_execution, name, is_up) VALUES (?, ?);',
|
|
|
|
undef, DateTime->now() . '', $name, $started );
|
2021-11-13 20:38:53 +01:00
|
|
|
if (!$started) {
|
|
|
|
say "$name stopped";
|
|
|
|
my $mailer = Cualsea::Server::Mail->new();
|
|
|
|
$mailer->notify_service_down($name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
1;
|