From d6812f56bcdd6d86072526edf4de2ca3ab2df567 Mon Sep 17 00:00:00 2001 From: sergiotarxz Date: Sat, 13 Nov 2021 03:41:38 +0100 Subject: [PATCH] Is now possible to delete services from the monitor. --- cualsea-server/bin/cualsead | 12 +++- .../lib/Cualsea/Server/MessageController.pm | 56 +++++++++++++++---- 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/cualsea-server/bin/cualsead b/cualsea-server/bin/cualsead index fa4a464..7a3aaae 100755 --- a/cualsea-server/bin/cualsead +++ b/cualsea-server/bin/cualsead @@ -4,7 +4,17 @@ use v5.30.0; use strict; use warnings; + +use Carp qw/confess/; + use Cualsea::Server::Loop; my $loop = Cualsea::Server::Loop->new; -$loop->run while 1; + +while (1) { + try { + $loop->run; + } catch { + confess $_; + }; +} diff --git a/cualsea-server/lib/Cualsea/Server/MessageController.pm b/cualsea-server/lib/Cualsea/Server/MessageController.pm index d3b29a6..1f59f73 100644 --- a/cualsea-server/lib/Cualsea/Server/MessageController.pm +++ b/cualsea-server/lib/Cualsea/Server/MessageController.pm @@ -23,8 +23,7 @@ sub handle_add { my $init = $params{init}; my $pidfile = $params{pidfile}; my $binpath = $params{binpath}; - if ( !-e $binpath || $init ne 'sysvinit' || !_validate_init_name($name) ) - { + if ( !-e $binpath || $init ne 'sysvinit' || !_validate_init_name($name) ) { return { is_error => 1, desc => "Parameters didn't pass contraints on add", @@ -39,11 +38,11 @@ INSERT INTO services (name, init, pidfile, binpath) VALUES (?, ?, ?, ?); EOF }; if ($@) { - if ($@ =~ /UNIQUE/i) { + if ( $@ =~ /UNIQUE/i ) { my $return_value = { - status => 400, + status => 400, is_error => 1, - desc => 'Endpoint already exists.', + desc => 'Endpoint already exists.', }; return $return_value; } @@ -56,6 +55,34 @@ EOF }; } +sub handle_del { + my %params = @_; + my $name = $params{name}; + my $dbh = Cualsea::Server::DB->dbh(); + + my $service = $dbh->selectrow_hashref( <<"EOF", undef, $name ); +SELECT name FROM services WHERE name = ? +EOF + + if ( !defined $service ) { + return { + is_error => 1, + desc => 'Service not found.', + status => 404, + }; + } + + $dbh->do( <<'EOF', undef, $name ); +DELETE FROM services WHERE name = ? +EOF + + return { + is_error => 0, + desc => "Succesful deletion of init service $name.", + status => 200, + }; +} + my %COMMANDS = ( add => { params => [ @@ -81,6 +108,7 @@ my %COMMANDS = ( name => { type => Str }, } ), + handle => \&handle_del }, report => { params => [], @@ -149,6 +177,7 @@ sub new { my $message = $message_manager->read_message; if ( !$self->check_if_user_has_permissions( socket => $socket ) ) { $self->write_no_permission( message_manager => $message_manager ); + return; } if ( !$self->check_is_command( message => $message ) ) { $self->write_malformed( message_manager => $message_manager ); @@ -186,9 +215,12 @@ sub new { # We want to forget about $params arrayref # and previous hash as soon as possible. %params = (); - for my $param_info_index ( scalar @$params_info ? (0..$#$params_info) : () ) { + for my $param_info_index ( + scalar @$params_info ? ( 0 .. $#$params_info ) : () ) + { my $param_info = $params_info->[$param_info_index]; + # May not come defined, if ( $param_info_index > scalar $#$params ) { last; @@ -229,12 +261,16 @@ sub new { my $socket = $params{socket}; my ( $pid, $uid, $gid ) = unpack 'LLL', $socket->sockopt(SO_PEERCRED); my $user = getpwuid($uid); - while ( my ( $name, undef, undef, $members ) = getgrent() ) { - if ( $name eq 'cualsea' ) { - return any { $_ eq $user } split ',', $members; - last; + state $name = ''; + state $members = ''; + if (!$name || !$members) { + while ( ( $name, undef, undef, $members ) = getgrent() ) { + if ( $name eq 'cualsea' ) { + last; + } } } + return any { $_ eq $user } split ',', $members; } } {