diff --git a/Dockerfile b/Dockerfile
index 3910669..b163daa 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
FROM bellsoft/liberica-openjdk-alpine:17-cds
COPY target/*.jar app.jar
-CMD ["java", "-jar", "app.jar"]
+CMD ["java", "-Dcom.sun.management.jmxremote", "-Dfile.encoding=UTF-8", "-Dcom.amazonaws.sdk.disableCertChecking", "-jar", "app.jar"]
diff --git a/pom.xml b/pom.xml
index 0891a7d..47a74a8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,13 +7,13 @@
org.springframework.boot
spring-boot-starter-parent
- 3.3.5
+ 3.4.4
ru.micord.ervu.lkrp
file-upload
- 1.9.8
+ 1.10.0-SNAPSHOT
diff --git a/src/main/java/ru/micord/ervu/av/kafka/dto/DownloadRequest.java b/src/main/java/ru/micord/ervu/av/kafka/dto/DownloadRequest.java
index fb31779..822fcf9 100644
--- a/src/main/java/ru/micord/ervu/av/kafka/dto/DownloadRequest.java
+++ b/src/main/java/ru/micord/ervu/av/kafka/dto/DownloadRequest.java
@@ -19,7 +19,7 @@ public record DownloadRequest(OrgInfo orgInfo, @NonNull FileInfo fileInfo) {
private final String fileName;
private final String fileSize;
private final String filePatternCode;
- private final String FilePatternName;
+ private final String filePatternName;
private final String departureDateTime;
private final String timeZone;
@Setter
diff --git a/src/main/java/ru/micord/ervu/av/response/AvResponse.java b/src/main/java/ru/micord/ervu/av/response/AvResponse.java
deleted file mode 100644
index 48e71ae..0000000
--- a/src/main/java/ru/micord/ervu/av/response/AvResponse.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package ru.micord.ervu.av.response;
-
-import java.util.Map;
-
-/**
- * @author r.latypov
- */
-public record AvResponse(String completed, String created, Integer progress,
- Map scan_result, String status, String[] verdicts) {
- public record Scan(String started, String stopped, Threat[] threats, String verdict) {
- public static final String VERDICT_CLEAN = "clean";
- public static final String VERDICT_INFECTED = "infected";
-
- public record Threat(String name, String object) {
- }
- }
-}
diff --git a/src/main/java/ru/micord/ervu/av/service/FileUploadService.java b/src/main/java/ru/micord/ervu/av/service/FileUploadService.java
index b4f44a7..9db19bf 100644
--- a/src/main/java/ru/micord/ervu/av/service/FileUploadService.java
+++ b/src/main/java/ru/micord/ervu/av/service/FileUploadService.java
@@ -5,7 +5,6 @@ import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.util.Arrays;
import java.util.concurrent.CompletableFuture;
import com.google.gson.Gson;
@@ -30,7 +29,6 @@ import ru.micord.ervu.av.exception.RetryableException;
import ru.micord.ervu.av.kafka.dto.DownloadRequest;
import ru.micord.ervu.av.kafka.dto.DownloadResponse;
import ru.micord.ervu.av.kafka.dto.FileStatus;
-import ru.micord.ervu.av.response.AvResponse;
import ru.micord.ervu.av.s3.S3Service;
/**
@@ -38,7 +36,8 @@ import ru.micord.ervu.av.s3.S3Service;
*/
@Service
public class FileUploadService {
- private static final Logger logger = LoggerFactory.getLogger(FileUploadService.class);
+ private static final int INFECTED_CODE = 72;
+ private static final Logger LOGGER = LoggerFactory.getLogger(FileUploadService.class);
@Value("${av.check.enabled}")
private boolean avCheckEnabled;
@Value("${file.saving.path}")
@@ -78,36 +77,25 @@ public class FileUploadService {
try {
FileUrl fileUrl = parseFileUrl(downloadRequest.fileInfo().getFileUrl());
-
- try {
- Files.createDirectories(Paths.get(fileSavingPath));
- }
- catch (IOException e) {
- throw new RuntimeException("Failed to create directory " + fileSavingPath, e);
- }
- logger.info("working in {}", System.getProperty("user.home"));
+ Files.createDirectories(Paths.get(fileSavingPath));
+ LOGGER.info("working in {}", System.getProperty("user.home"));
Path filePath = Paths.get(fileSavingPath, fileUrl.fileName());
String downloadUrl = fileUrl.fileUrl();
fIleManager.downloadFile(downloadUrl, filePath);
boolean isAvError = false;
- boolean clean = true;
- boolean infected = false;
+ int exitCode = 0;
if (avCheckEnabled) {
try {
- AvResponse avResponse = receiveScanReportRetryable.checkFile(filePath);
- clean = Arrays.stream(avResponse.verdicts())
- .anyMatch(verdict -> verdict.equalsIgnoreCase(AvResponse.Scan.VERDICT_CLEAN));
- infected = Arrays.stream(avResponse.verdicts())
- .anyMatch(verdict -> verdict.equalsIgnoreCase(AvResponse.Scan.VERDICT_INFECTED));
+ exitCode = receiveScanReportRetryable.checkFile(filePath);
}
catch (FileUploadException | RetryableException e) {
- logger.error(e.getMessage(), e);
+ LOGGER.error(e.getMessage(), e);
isAvError = true;
}
}
- if (isAvError || infected || !clean) {
+ if (isAvError || exitCode == INFECTED_CODE) {
downloadRequest.fileInfo().setFileUrl(null);
FileStatus fileStatus = isAvError ? FileStatus.FILE_STATUS_11 : FileStatus.FILE_STATUS_02;
downloadRequest.fileInfo().setFileStatus(fileStatus);
@@ -131,7 +119,7 @@ public class FileUploadService {
Files.delete(filePath);
}
catch (IOException e) {
- throw new RuntimeException("Failed to delete file " + filePath.getFileName());
+ LOGGER.error("Failed to delete file " + filePath, e);
}
finally {
acknowledgment.acknowledge();
@@ -140,16 +128,16 @@ public class FileUploadService {
catch (InvalidHttpFileUrlException e) {
// считаем, что повторная обработка сообщения не нужна
// ошибку логируем, отправляем сообщение с новым статусом, помечаем прочтение сообщения
- logger.error(e.getMessage() + ": " + kafkaInMessage);
+ LOGGER.error(e.getMessage() + ": " + kafkaInMessage);
downloadRequest.fileInfo().setFileUrl(null);
downloadRequest.fileInfo().setFileStatus(FileStatus.FILE_STATUS_11);
sendMessage(inStatusTopic.name(), downloadRequest, messageId, inKafkaTemplate);
acknowledgment.acknowledge();
}
- catch (FileUploadException e) {
+ catch (FileUploadException | IOException e) {
// считаем, что нужно повторное считывание сообщения
// ошибку логируем, сообщение оставляем непрочитанным
- logger.error(e.getMessage(), e);
+ LOGGER.error(e.getMessage(), e);
}
}
diff --git a/src/main/java/ru/micord/ervu/av/service/ReceiveScanReportRetryable.java b/src/main/java/ru/micord/ervu/av/service/ReceiveScanReportRetryable.java
index 679b05a..c74f03e 100644
--- a/src/main/java/ru/micord/ervu/av/service/ReceiveScanReportRetryable.java
+++ b/src/main/java/ru/micord/ervu/av/service/ReceiveScanReportRetryable.java
@@ -6,7 +6,6 @@ import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.Path;
-import com.google.gson.Gson;
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
@@ -24,7 +23,6 @@ import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;
import ru.micord.ervu.av.exception.FileUploadException;
import ru.micord.ervu.av.exception.RetryableException;
-import ru.micord.ervu.av.response.AvResponse;
/**
* @author r.latypov
@@ -38,12 +36,11 @@ public class ReceiveScanReportRetryable {
@Retryable(retryFor = {RetryableException.class},
maxAttemptsExpression = "${av.retry.max.attempts.count}",
backoff = @Backoff(delayExpression = "${av.retry.delay.milliseconds}"))
- public AvResponse checkFile(Path filePath) throws RetryableException, FileUploadException {
+ public int checkFile(Path filePath) throws RetryableException, FileUploadException {
File file = filePath.toFile();
try (CloseableHttpClient client = HttpClients.createDefault()) {
URI uri = new URIBuilder(avRestAddress)
- .addParameter("wait", "1")
.build();
HttpPost post = new HttpPost(uri);
HttpEntity entity = MultipartEntityBuilder.create()
@@ -53,10 +50,10 @@ public class ReceiveScanReportRetryable {
try (CloseableHttpResponse postResponse = client.execute(post)) {
int postStatusCode = postResponse.getStatusLine().getStatusCode();
- String postResponseJson = EntityUtils.toString(postResponse.getEntity());
+ String exitCode = EntityUtils.toString(postResponse.getEntity());
if (postStatusCode == HttpStatus.OK.value()) {
- return new Gson().fromJson(postResponseJson, AvResponse.class);
+ return Integer.parseInt(exitCode);
}
else {
throw new FileUploadException(