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, is_up) VALUES (?, ?);', undef, DateTime->now() . '', $started ); if (!$started) { say "$name stopped"; my $mailer = Cualsea::Server::Mail->new(); $mailer->notify_service_down($name); } } } 1;