Skip to content

Commit

Permalink
[backend] Fix
Browse files Browse the repository at this point in the history
  • Loading branch information
RomuDeuxfois committed Jul 16, 2024
1 parent 926c0fa commit 2e9c8b5
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ public class CalderaExecutorService implements Runnable {
private final CalderaExecutorContextService calderaExecutorContextService;

private final InjectorService injectorService;
private final PlatformSettingsService platformSettingsService;

private Executor executor = null;

Expand Down Expand Up @@ -81,54 +82,58 @@ public CalderaExecutorService(
this.endpointService = endpointService;
this.calderaExecutorContextService = calderaExecutorContextService;
this.injectorService = injectorService;
this.platformSettingsService = platformSettingsService;
try {
if (config.isEnable()) {
this.executor = executorService.register(config.getId(), CALDERA_EXECUTOR_TYPE, CALDERA_EXECUTOR_NAME, getClass().getResourceAsStream("/img/icon-caldera.png"), new String[]{Endpoint.PLATFORM_TYPE.Windows.name(), Endpoint.PLATFORM_TYPE.Linux.name(), Endpoint.PLATFORM_TYPE.MacOS.name()});
this.calderaExecutorContextService.registerAbilities();
} else {
executorService.remove(config.getId());
}
platformSettingsService.cleanMessage();
} catch (Exception e) {
log.log(Level.SEVERE, "Error creating caldera executor: " + e);
platformSettingsService.errorMessage("Executor Caldera is not responding, your exercises may be impacted.");
}
}

@Override
public void run() {
log.info("Running Caldera executor endpoints gathering...");
// The executor only retrieve "main" agents (without the keyword "executor")
// This is NOT a standard behaviour, this is because we are using Caldera as an executor and we should not
// Will be replaced by the XTM agent
List<Agent> agents = this.client.agents().stream().filter(agent -> !agent.getExe_name().contains("implant")).toList();
List<Endpoint> endpoints = toEndpoint(agents).stream().filter(Asset::getActive).toList();
log.info("Caldera executor provisioning based on " + endpoints.size() + " assets");
endpoints.forEach(endpoint -> {
List<Endpoint> existingEndpoints = this.endpointService.findAssetsForInjectionByHostname(endpoint.getHostname()).stream().filter(endpoint1 -> Arrays.stream(endpoint1.getIps()).anyMatch(s -> Arrays.stream(endpoint.getIps()).toList().contains(s))).toList();
if (existingEndpoints.isEmpty()) {
Optional<Endpoint> endpointByExternalReference = endpointService.findByExternalReference(endpoint.getExternalReference());
if (endpointByExternalReference.isPresent()) {
this.updateEndpoint(endpoint, List.of(endpointByExternalReference.get()));
try {
log.info("Running Caldera executor endpoints gathering...");

Check warning on line 101 in openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java

View check run for this annotation

Codecov / codecov/patch

openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java#L101

Added line #L101 was not covered by tests
// The executor only retrieve "main" agents (without the keyword "executor")
// This is NOT a standard behaviour, this is because we are using Caldera as an executor and we should not
// Will be replaced by the XTM agent
List<Agent> agents = this.client.agents().stream().filter(agent -> !agent.getExe_name().contains("implant")).toList();
List<Endpoint> endpoints = toEndpoint(agents).stream().filter(Asset::getActive).toList();
log.info("Caldera executor provisioning based on " + endpoints.size() + " assets");
endpoints.forEach(endpoint -> {
List<Endpoint> existingEndpoints = this.endpointService.findAssetsForInjectionByHostname(endpoint.getHostname()).stream().filter(endpoint1 -> Arrays.stream(endpoint1.getIps()).anyMatch(s -> Arrays.stream(endpoint.getIps()).toList().contains(s))).toList();

Check warning on line 109 in openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java

View check run for this annotation

Codecov / codecov/patch

openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java#L106-L109

Added lines #L106 - L109 were not covered by tests
if (existingEndpoints.isEmpty()) {
Optional<Endpoint> endpointByExternalReference = endpointService.findByExternalReference(endpoint.getExternalReference());

Check warning on line 111 in openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java

View check run for this annotation

Codecov / codecov/patch

openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java#L111

Added line #L111 was not covered by tests
if (endpointByExternalReference.isPresent()) {
this.updateEndpoint(endpoint, List.of(endpointByExternalReference.get()));

Check warning on line 113 in openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java

View check run for this annotation

Codecov / codecov/patch

openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java#L113

Added line #L113 was not covered by tests
} else {
this.endpointService.createEndpoint(endpoint);

Check warning on line 115 in openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java

View check run for this annotation

Codecov / codecov/patch

openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java#L115

Added line #L115 was not covered by tests
}
} else {
this.endpointService.createEndpoint(endpoint);
this.updateEndpoint(endpoint, existingEndpoints);

Check warning on line 118 in openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java

View check run for this annotation

Codecov / codecov/patch

openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java#L118

Added line #L118 was not covered by tests
}
} else {
this.updateEndpoint(endpoint, existingEndpoints);
}
});
List<Endpoint> inactiveEndpoints = toEndpoint(agents).stream().filter(endpoint -> !endpoint.getActive()).toList();
inactiveEndpoints.forEach(endpoint -> {
Optional<Endpoint> optionalExistingEndpoint = this.endpointService.findByExternalReference(endpoint.getExternalReference());
if (optionalExistingEndpoint.isPresent()) {
Endpoint existingEndpoint = optionalExistingEndpoint.get();
if ((now().toEpochMilli() - existingEndpoint.getClearedAt().toEpochMilli()) > DELETE_TTL) {
log.info("Found stale agent " + existingEndpoint.getName() + ", deleting it...");
this.client.deleteAgent(existingEndpoint);
this.endpointService.deleteEndpoint(existingEndpoint.getId());
});

Check warning on line 120 in openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java

View check run for this annotation

Codecov / codecov/patch

openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java#L120

Added line #L120 was not covered by tests
List<Endpoint> inactiveEndpoints = toEndpoint(agents).stream().filter(endpoint -> !endpoint.getActive()).toList();
inactiveEndpoints.forEach(endpoint -> {
Optional<Endpoint> optionalExistingEndpoint = this.endpointService.findByExternalReference(endpoint.getExternalReference());

Check warning on line 123 in openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java

View check run for this annotation

Codecov / codecov/patch

openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java#L122-L123

Added lines #L122 - L123 were not covered by tests
if (optionalExistingEndpoint.isPresent()) {
Endpoint existingEndpoint = optionalExistingEndpoint.get();

Check warning on line 125 in openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java

View check run for this annotation

Codecov / codecov/patch

openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java#L125

Added line #L125 was not covered by tests
if ((now().toEpochMilli() - existingEndpoint.getClearedAt().toEpochMilli()) > DELETE_TTL) {
log.info("Found stale agent " + existingEndpoint.getName() + ", deleting it...");
this.client.deleteAgent(existingEndpoint);
this.endpointService.deleteEndpoint(existingEndpoint.getId());

Check warning on line 129 in openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java

View check run for this annotation

Codecov / codecov/patch

openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java#L127-L129

Added lines #L127 - L129 were not covered by tests
}
}
}
});
});
this.platformSettingsService.cleanMessage();
} catch (Exception e) {
this.platformSettingsService.errorMessage("Executor Caldera is not responding, your exercises may be impacted.");
}

Check warning on line 136 in openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java

View check run for this annotation

Codecov / codecov/patch

openbas-api/src/main/java/io/openbas/executors/caldera/service/CalderaExecutorService.java#L132-L136

Added lines #L132 - L136 were not covered by tests
}

// -- PRIVATE --
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
package io.openbas.injectors.caldera.client;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.openbas.database.model.Endpoint;
import io.openbas.database.model.Injector;
import io.openbas.injectors.caldera.client.model.Ability;
import io.openbas.injectors.caldera.client.model.Agent;
import io.openbas.injectors.caldera.client.model.Result;
Expand All @@ -13,8 +11,8 @@
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import lombok.extern.java.Log;
import org.apache.hc.client5.http.ClientProtocolException;
import org.apache.hc.client5.http.classic.HttpClient;
import org.apache.hc.client5.http.classic.methods.HttpDelete;
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.classic.methods.HttpPatch;
Expand All @@ -27,13 +25,13 @@
import org.springframework.util.StringUtils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RequiredArgsConstructor
@Service
@Log
public class CalderaInjectorClient {

private static final String KEY_HEADER = "KEY";
Expand Down Expand Up @@ -86,6 +84,7 @@ public List<Agent> agents() {
return this.objectMapper.readValue(jsonResponse, new TypeReference<>() {
});
} catch (IOException e) {
log.severe("Cannot retrieve agent list");

Check warning on line 87 in openbas-api/src/main/java/io/openbas/injectors/caldera/client/CalderaInjectorClient.java

View check run for this annotation

Codecov / codecov/patch

openbas-api/src/main/java/io/openbas/injectors/caldera/client/CalderaInjectorClient.java#L87

Added line #L87 was not covered by tests
throw new RuntimeException(e);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public List<Agent> agents() {
});
} catch (IOException e) {
log.severe("Cannot retrieve agent list");
return new ArrayList<>();
throw new RuntimeException(e);
}
}

Expand Down

0 comments on commit 2e9c8b5

Please sign in to comment.