Skip to content

Commit

Permalink
rest: improve error handling when requesting unknown sites
Browse files Browse the repository at this point in the history
  • Loading branch information
sni committed Jul 25, 2024
1 parent 0d6c7f2 commit c58e0b4
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 14 deletions.
3 changes: 3 additions & 0 deletions lib/Thruk/Action/AddDefaults.pm
Original file line number Diff line number Diff line change
Expand Up @@ -1091,6 +1091,7 @@ sub set_enabled_backends {
$disabled_backends->{$peer->{'key'}} = 0;
} else {
if(!_set_disabled_by_section($c, $b, $disabled_backends)) {
$c->stash->{'failed_backends'}->{$b} = 'backend does not exist';
_warn(sprintf("no backend found for: %s", $b));
}
}
Expand Down Expand Up @@ -1131,6 +1132,7 @@ sub set_enabled_backends {
# silently ignore, leads to hen/egg problem when using federation peers
#die("got no peer for: ".$b);
#_warn(sprintf("no backend found for: %s", $b));
$c->stash->{'failed_backends'}->{$b} = 'backend does not exist';
}
}
}
Expand Down Expand Up @@ -1171,6 +1173,7 @@ sub set_enabled_backends {
} else {
if(!_set_disabled_by_section($c, $b, $disabled_backends)) {
#_warn(sprintf("no backend found for: %s", $b));
$c->stash->{'failed_backends'}->{$b} = 'backend does not exist';
}
}
}
Expand Down
53 changes: 39 additions & 14 deletions lib/Thruk/Controller/rest_v1.pm
Original file line number Diff line number Diff line change
Expand Up @@ -111,16 +111,29 @@ sub index {
}
}
Thruk::Action::AddDefaults::set_processinfo($c, Thruk::Constants::ADD_CACHED_DEFAULTS) if $ENV{'THRUK_USE_LMD'}; # required for the first request on federated backends
if(scalar @{$backends} > 0) {
Thruk::Action::AddDefaults::set_enabled_backends($c, $backends);
}

# activate backends
if(scalar @{$backends} > 0) {}
elsif($c->req->parameters->{'backend'}) {
Thruk::Action::AddDefaults::set_enabled_backends($c, $c->req->parameters->{'backend'});
$backends = [$c->req->parameters->{'backend'}];
delete $c->req->parameters->{'backend'};
}
elsif($c->req->parameters->{'backends'}) {
Thruk::Action::AddDefaults::set_enabled_backends($c, $c->req->parameters->{'backends'});
$backends = [$c->req->parameters->{'backends'}];
delete $c->req->parameters->{'backends'};
}

if(scalar @{$backends} > 0) {
local $ENV{'THRUK_TEST_NO_LOG'} = ""; # suppress warnings
Thruk::Action::AddDefaults::set_enabled_backends($c, $backends);
if($c->stash->{'failed_backends'} && scalar keys %{$c->stash->{'failed_backends'}} > 0) {
my $data = {
'message' => 'failed to find backend(s): '.join(', ', keys %{$c->stash->{'failed_backends'}}),
'code' => 400,
'failed' => Cpanel::JSON::XS::true,
};
return(_format_output($c, $format, $data));
}
} else {
my($disabled_backends) = Thruk::Action::AddDefaults::set_enabled_backends($c);
Thruk::Action::AddDefaults::set_possible_backends($c, $disabled_backends);
Expand All @@ -131,20 +144,25 @@ sub index {
$c->user->set_dynamic_attributes($c);
}

my $data;
if($c->user->{'readonly'} && $c->req->method ne 'GET') {
$data = {
my $data = {
'message' => 'only GET requests allowed for readonly api keys.',
'code' => 400,
'failed' => Cpanel::JSON::XS::true,
};
} elsif($c->config->{'demo_mode'} && $c->req->method ne 'GET') {
$data = {
};
return(_format_output($c, $format, $data));
}

if($c->config->{'demo_mode'} && $c->req->method ne 'GET') {
my $data = {
'message' => 'only GET requests allowed in demo_mode.',
'code' => 400,
'failed' => Cpanel::JSON::XS::true,
};
} elsif($path_info =~ m/\.cgi$/mx) {
};
return(_format_output($c, $format, $data));
}

if($path_info =~ m/\.cgi$/mx) {
my $uri = $c->env->{'thruk.request.url'} // $c->req->url();
$uri =~ s/^.*?\/r\/(v1\/|)/\/cgi-bin\//gmx;
my $sub_c = $c->sub_request($uri, $c->req->env->{'REQUEST_METHOD'}, $c->req->parameters, 1, 7);
Expand All @@ -154,9 +172,16 @@ sub index {
$c->{'rendered'} = 1;
$c->stash->{'inject_stats'} = 0;
return;
} else {
$data = process_rest_request($c, $path_info);
}

my $data = process_rest_request($c, $path_info);
return(_format_output($c, $format, $data));
}

##########################################################
sub _format_output {
my($c, $format, $data) = @_;

return $data if $c->{'rendered'};

if($format eq 'csv') {
Expand Down

0 comments on commit c58e0b4

Please sign in to comment.