cualsea/cualsea-server/lib/Cualsea/Server/MonitorController.pm

69 lines
1.7 KiB
Perl

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;
}}
$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();
$mailer->notify_service_down($name);
}
}
}
1;