From fb3825990f2c184ff81d1ef1d8dbf98f1ee2ab49 Mon Sep 17 00:00:00 2001 From: "adel.kalimullin" Date: Mon, 23 Dec 2024 11:16:33 +0300 Subject: [PATCH 1/6] SUPPORT-8818:add logging and description service --- README.md | 32 +++++++++++++++++++ .../controller/FileScanController.java | 5 +++ .../av/service/service/FileManager.java | 2 +- .../av/service/service/FileScanService.java | 4 +-- 4 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..72a1b96 --- /dev/null +++ b/README.md @@ -0,0 +1,32 @@ +# av-service + +av-service — это сервис, взаимодействующий с Kaspersky Endpoint Security для Linux (KESL) на одной машине. + +Основная задача сервиса — обеспечение защиты и анализа файлов с помощью интеграции с KESL. + +## Основные функции +- Интеграция с KESL: выполнение проверки файлов на наличие угроз. +- Обработка файлов через HTTP POST запросы. +- Логирование результатов: запись результатов проверки для последующего анализа. +- Управление ошибками: обработка ошибок и уведомление о причинах их возникновения. + +## Требования +- Java 17 +- KESL (установлен и настроен на одной машине с сервисом) + +## Конфигурация и запуск + +### Конфигурация параметров для сервиса +Для корректного запуска сервиса, добавьте следующие параметры в файл application.properties: +```properties +file.upload.directory=/tmp/uploaded_files # Путь для папки для хранения временных файлов +spring.servlet.multipart.max-file-size=10MB # Максимальный размер загружаемого файла +spring.servlet.multipart.max-request-size=10MB # Максимальный размер запроса +server.port=8080 # Порт сервиса +``` +### Запуск JAR-файла с конфигурационным файлом +```bash +java -jar app.jar --spring.config.location=file:/path/to/your/application.properties +``` + + diff --git a/src/main/java/ru/micord/av/service/controller/FileScanController.java b/src/main/java/ru/micord/av/service/controller/FileScanController.java index f947fe4..dd7d0be 100644 --- a/src/main/java/ru/micord/av/service/controller/FileScanController.java +++ b/src/main/java/ru/micord/av/service/controller/FileScanController.java @@ -28,10 +28,15 @@ public class FileScanController { @PostMapping("/scan-file") public ResponseEntity scanFile(@RequestPart("file") MultipartFile file) { if (file.isEmpty()) { + LOGGER.warn("The uploaded file is empty or missing."); return ResponseEntity.badRequest().build(); } try { ScanResult result = fileScanService.scanFile(file); + LOGGER.info("Scan result for file {}: status - {}, verdicts - {}", + file.getOriginalFilename(), + result.status(), + String.join(", ", result.verdicts())); return ResponseEntity.ok(result); } catch (Exception e) { diff --git a/src/main/java/ru/micord/av/service/service/FileManager.java b/src/main/java/ru/micord/av/service/service/FileManager.java index 71441f5..c301685 100644 --- a/src/main/java/ru/micord/av/service/service/FileManager.java +++ b/src/main/java/ru/micord/av/service/service/FileManager.java @@ -35,7 +35,7 @@ public class FileManager { Files.delete(file.toPath()); } catch (IOException e) { - throw new AvException("Ошибка удаления временного файла: " + file.getAbsolutePath(), e); + throw new AvException("Error deleting temporary file: " + file.getAbsolutePath(), e); } } } diff --git a/src/main/java/ru/micord/av/service/service/FileScanService.java b/src/main/java/ru/micord/av/service/service/FileScanService.java index e7f85d2..278b29d 100644 --- a/src/main/java/ru/micord/av/service/service/FileScanService.java +++ b/src/main/java/ru/micord/av/service/service/FileScanService.java @@ -41,7 +41,7 @@ public class FileScanService { ); } catch (Exception e) { - throw new AvException("Ошибка при сканировании файла: " + file.getOriginalFilename(), e); + throw new AvException("Error scanning file: " + file.getOriginalFilename(), e); } finally { fileManager.deleteFile(tempFile); @@ -58,7 +58,7 @@ public class FileScanService { String result = new String(inputStream.readAllBytes()); int exitCode = process.waitFor(); if (exitCode != 0 && exitCode != 72) { - throw new AvException("Ошибка KESL, код завершения: " + exitCode); + throw new AvException("KESL error, exit code: " + exitCode); } return result; } From 574cfe97b0af5e6b578da59ddc2eb956a1e75f7b Mon Sep 17 00:00:00 2001 From: "adel.kalimullin" Date: Mon, 23 Dec 2024 12:50:25 +0300 Subject: [PATCH 2/6] SUPPORT-8818:fix --- README.md | 43 +++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 72a1b96..a6561fc 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,35 @@ -# av-service +# **av-service** -av-service — это сервис, взаимодействующий с Kaspersky Endpoint Security для Linux (KESL) на одной машине. +`av-service` — это сервис, взаимодействующий с Kaspersky Endpoint Security для Linux (KESL) на одной машине. -Основная задача сервиса — обеспечение защиты и анализа файлов с помощью интеграции с KESL. +Основная задача сервиса — обеспечение защиты и анализа файлов с помощью интеграции с KESL. +Сервис использует консольные команды для выполнения операций и взаимодействия с KESL, таких как запуск задач проверки и получение результатов анализа. +--- -## Основные функции -- Интеграция с KESL: выполнение проверки файлов на наличие угроз. -- Обработка файлов через HTTP POST запросы. -- Логирование результатов: запись результатов проверки для последующего анализа. -- Управление ошибками: обработка ошибок и уведомление о причинах их возникновения. +## **Основные функции** +- Проверка файлов на наличие угроз с использованием KESL. +- Обработка файлов через POST-запросы. +- Логирование результатов проверки. -## Требования -- Java 17 -- KESL (установлен и настроен на одной машине с сервисом) +--- -## Конфигурация и запуск +## **Требования** +- **Java 17** +- **KESL** (установлен и настроен на одной машине с сервисом) -### Конфигурация параметров для сервиса -Для корректного запуска сервиса, добавьте следующие параметры в файл application.properties: +--- + +## **Конфигурация и запуск** + +### **1. Конфигурация параметров для сервиса** +Для корректного запуска сервиса добавьте следующие параметры в файл `application.properties`: ```properties -file.upload.directory=/tmp/uploaded_files # Путь для папки для хранения временных файлов +file.upload.directory=/tmp/uploaded_files # Путь для хранения временных файлов spring.servlet.multipart.max-file-size=10MB # Максимальный размер загружаемого файла spring.servlet.multipart.max-request-size=10MB # Максимальный размер запроса -server.port=8080 # Порт сервиса +server.port=8080 # Порт, на котором работает сервис ``` -### Запуск JAR-файла с конфигурационным файлом +### **2. Запуск JAR-файла с конфигурационным файлом** ```bash java -jar app.jar --spring.config.location=file:/path/to/your/application.properties -``` - - +``` \ No newline at end of file From b3a32e77d782073d99703d16a226d4b94482e833 Mon Sep 17 00:00:00 2001 From: "adel.kalimullin" Date: Mon, 23 Dec 2024 14:00:03 +0300 Subject: [PATCH 3/6] SUPPORT-8818:fix from review --- src/main/java/ru/micord/av/service/service/FileManager.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/micord/av/service/service/FileManager.java b/src/main/java/ru/micord/av/service/service/FileManager.java index c301685..fa6eb12 100644 --- a/src/main/java/ru/micord/av/service/service/FileManager.java +++ b/src/main/java/ru/micord/av/service/service/FileManager.java @@ -6,16 +6,18 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; -import ru.micord.av.service.exception.AvException; /** * @author Adel Kalimullin */ @Service public class FileManager { + private static final Logger LOGGER = LoggerFactory.getLogger(FileManager.class); @Value("${file.upload.directory}") public String uploadDirectory; @@ -35,7 +37,7 @@ public class FileManager { Files.delete(file.toPath()); } catch (IOException e) { - throw new AvException("Error deleting temporary file: " + file.getAbsolutePath(), e); + LOGGER.warn("Error deleting file: " + file.getAbsolutePath()); } } } From fdcfdfa13ca1bb91dd0b297899fa58807a5cf2ed Mon Sep 17 00:00:00 2001 From: "adel.kalimullin" Date: Mon, 23 Dec 2024 14:03:04 +0300 Subject: [PATCH 4/6] SUPPORT-8818:fix from review --- src/main/java/ru/micord/av/service/service/FileManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/micord/av/service/service/FileManager.java b/src/main/java/ru/micord/av/service/service/FileManager.java index fa6eb12..1b7799e 100644 --- a/src/main/java/ru/micord/av/service/service/FileManager.java +++ b/src/main/java/ru/micord/av/service/service/FileManager.java @@ -37,7 +37,7 @@ public class FileManager { Files.delete(file.toPath()); } catch (IOException e) { - LOGGER.warn("Error deleting file: " + file.getAbsolutePath()); + LOGGER.warn("Error deleting file: " + file.getAbsolutePath(), e); } } } From e389a75ac8c9bb5736014de60169820f5f060c8e Mon Sep 17 00:00:00 2001 From: "adel.kalimullin" Date: Mon, 23 Dec 2024 14:15:56 +0300 Subject: [PATCH 5/6] SUPPORT-8818:fix from review --- .../av/service/service/FileManager.java | 44 ------------------- .../av/service/service/FileScanService.java | 39 ++++++++++++---- 2 files changed, 30 insertions(+), 53 deletions(-) delete mode 100644 src/main/java/ru/micord/av/service/service/FileManager.java diff --git a/src/main/java/ru/micord/av/service/service/FileManager.java b/src/main/java/ru/micord/av/service/service/FileManager.java deleted file mode 100644 index 1b7799e..0000000 --- a/src/main/java/ru/micord/av/service/service/FileManager.java +++ /dev/null @@ -1,44 +0,0 @@ -package ru.micord.av.service.service; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -/** - * @author Adel Kalimullin - */ -@Service -public class FileManager { - private static final Logger LOGGER = LoggerFactory.getLogger(FileManager.class); - @Value("${file.upload.directory}") - public String uploadDirectory; - - public File saveFile(MultipartFile file) throws IOException { - Path uploadPath = Paths.get(uploadDirectory); - if (!Files.exists(uploadPath)) { - Files.createDirectories(uploadPath); - } - Path tempFile = Files.createTempFile(uploadPath, "kesl-upload-", ".tmp"); - file.transferTo(tempFile.toFile()); - return tempFile.toFile(); - } - - public void deleteFile(File file) { - if (file != null && file.exists()) { - try { - Files.delete(file.toPath()); - } - catch (IOException e) { - LOGGER.warn("Error deleting file: " + file.getAbsolutePath(), e); - } - } - } -} diff --git a/src/main/java/ru/micord/av/service/service/FileScanService.java b/src/main/java/ru/micord/av/service/service/FileScanService.java index 278b29d..8292642 100644 --- a/src/main/java/ru/micord/av/service/service/FileScanService.java +++ b/src/main/java/ru/micord/av/service/service/FileScanService.java @@ -3,12 +3,18 @@ package ru.micord.av.service.service; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import ru.micord.av.service.exception.AvException; @@ -19,20 +25,18 @@ import ru.micord.av.service.model.ScanResult; */ @Service public class FileScanService { - public static String KESL_CONTROL = "kesl-control"; - public static String KESL_SCAN = "--scan-file"; - private final FileManager fileManager; - - public FileScanService(FileManager fileManager) { - this.fileManager = fileManager; - } + public static final String KESL_CONTROL = "kesl-control"; + public static final String KESL_SCAN = "--scan-file"; + private static final Logger LOGGER = LoggerFactory.getLogger(FileScanService.class); + @Value("${file.upload.directory}") + public String uploadDirectory; public ScanResult scanFile(MultipartFile file) { File tempFile = null; LocalDateTime startTime; LocalDateTime stopTime; try { - tempFile = fileManager.saveFile(file); + tempFile = saveFile(file); startTime = LocalDateTime.now(); String rawResult = runKeslScan(tempFile); stopTime = LocalDateTime.now(); @@ -44,10 +48,27 @@ public class FileScanService { throw new AvException("Error scanning file: " + file.getOriginalFilename(), e); } finally { - fileManager.deleteFile(tempFile); + try { + if (tempFile != null && tempFile.exists()) { + Files.delete(tempFile.toPath()); + } + } + catch (IOException e) { + LOGGER.warn("Error deleting file: " + tempFile.getAbsolutePath(), e); + } } } + private File saveFile(MultipartFile file) throws IOException { + Path uploadPath = Paths.get(uploadDirectory); + if (!Files.exists(uploadPath)) { + Files.createDirectories(uploadPath); + } + Path tempFile = Files.createTempFile(uploadPath, "kesl-upload-", ".tmp"); + file.transferTo(tempFile.toFile()); + return tempFile.toFile(); + } + private String runKeslScan(File file) throws IOException, InterruptedException { ProcessBuilder processBuilder = new ProcessBuilder(KESL_CONTROL, KESL_SCAN, file.getAbsolutePath() From ab23d96bdf7745a71ffb2eeb1ffc9bae15b5800d Mon Sep 17 00:00:00 2001 From: "adel.kalimullin" Date: Tue, 24 Dec 2024 09:19:56 +0300 Subject: [PATCH 6/6] SUPPORT-8818:fix --- .../java/ru/micord/av/service/service/FileScanService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/micord/av/service/service/FileScanService.java b/src/main/java/ru/micord/av/service/service/FileScanService.java index 8292642..33f4771 100644 --- a/src/main/java/ru/micord/av/service/service/FileScanService.java +++ b/src/main/java/ru/micord/av/service/service/FileScanService.java @@ -25,11 +25,11 @@ import ru.micord.av.service.model.ScanResult; */ @Service public class FileScanService { - public static final String KESL_CONTROL = "kesl-control"; - public static final String KESL_SCAN = "--scan-file"; + private static final String KESL_CONTROL = "kesl-control"; + private static final String KESL_SCAN = "--scan-file"; private static final Logger LOGGER = LoggerFactory.getLogger(FileScanService.class); @Value("${file.upload.directory}") - public String uploadDirectory; + private String uploadDirectory; public ScanResult scanFile(MultipartFile file) { File tempFile = null;