From 0391d55e91fd817cb86f6866b7bfbb879072f9d3 Mon Sep 17 00:00:00 2001 From: serega6531 Date: Mon, 6 Apr 2020 01:46:06 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=8D=D0=BD=D0=B4=D0=BF=D0=BE=D0=B8=D0=BD=D1=82=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0?= =?UTF-8?q?=20pcap?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + docker-compose.yml | 3 ++ .../packmate/PackmateApplication.java | 12 ++++--- .../ApplicationConfiguration.java | 3 +- .../packmate/controller/PcapController.java | 36 +++++++++++++++++++ .../packmate/pcap/FilePcapWorker.java | 4 ++- .../packmate/service/PcapService.java | 29 +++++++++++++++ src/main/resources/application.yml | 1 + 8 files changed, 83 insertions(+), 6 deletions(-) rename src/main/java/ru/serega6531/packmate/{ => configuration}/ApplicationConfiguration.java (97%) create mode 100644 src/main/java/ru/serega6531/packmate/controller/PcapController.java create mode 100644 src/main/java/ru/serega6531/packmate/service/PcapService.java diff --git a/.gitignore b/.gitignore index 69eef86..985e68d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ src/main/resources/static/* +*.pcap HELP.md .gradle diff --git a/docker-compose.yml b/docker-compose.yml index c969e43..f0709f3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,6 +7,8 @@ services: DB_NAME: ${PACKMATE_DB_NAME:-packmate} INTERFACE: ${PACKMATE_INTERFACE} LOCAL_IP: ${PACKMATE_LOCAL_IP} + MODE: ${PACKMATE_MODE:-LIVE} + PCAP_FILE: ${PACKMATE_PCAP_FILE} WEB_LOGIN: ${PACKMATE_WEB_LOGIN:-BinaryBears} WEB_PASSWORD: ${PACKMATE_WEB_PASSWORD:-123456} env_file: @@ -21,6 +23,7 @@ services: "java", "-Djava.net.preferIPv4Stack=true", "-Djava.net.preferIPv4Addresses=true", "-jar", "/app/app.jar", "--spring.datasource.url=jdbc:postgresql://127.0.0.1:65001/$${DB_NAME}", "--spring.datasource.username=$${DB_USER}", "--spring.datasource.password=$${DB_PASSWORD}", + "--capture-mode=$${MODE}", "--pcap-file=$${PCAP_FILE}", "--interface-name=$${INTERFACE}", "--local-ip=$${LOCAL_IP}", "--account-login=$${WEB_LOGIN}", "--account-password=$${WEB_PASSWORD}", "--server.port=65000", "--server.address=0.0.0.0" ] diff --git a/src/main/java/ru/serega6531/packmate/PackmateApplication.java b/src/main/java/ru/serega6531/packmate/PackmateApplication.java index 2cf49fb..ddad525 100644 --- a/src/main/java/ru/serega6531/packmate/PackmateApplication.java +++ b/src/main/java/ru/serega6531/packmate/PackmateApplication.java @@ -6,7 +6,8 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.event.EventListener; -import ru.serega6531.packmate.pcap.PcapWorker; +import ru.serega6531.packmate.model.enums.CaptureMode; +import ru.serega6531.packmate.service.PcapService; @SpringBootApplication public class PackmateApplication { @@ -14,15 +15,18 @@ public class PackmateApplication { @Value("${enable-capture}") private boolean enableCapture; + @Value("${capture-mode}") + private CaptureMode captureMode; + public static void main(String[] args) { SpringApplication.run(PackmateApplication.class, args); } @EventListener(ApplicationReadyEvent.class) public void afterStartup(ApplicationReadyEvent event) throws PcapNativeException { - if (enableCapture) { - final PcapWorker pcapWorker = event.getApplicationContext().getBean(PcapWorker.class); - pcapWorker.start(); + if (enableCapture && captureMode == CaptureMode.LIVE) { + final PcapService pcapService = event.getApplicationContext().getBean(PcapService.class); + pcapService.start(); } } diff --git a/src/main/java/ru/serega6531/packmate/ApplicationConfiguration.java b/src/main/java/ru/serega6531/packmate/configuration/ApplicationConfiguration.java similarity index 97% rename from src/main/java/ru/serega6531/packmate/ApplicationConfiguration.java rename to src/main/java/ru/serega6531/packmate/configuration/ApplicationConfiguration.java index c049d50..fcfcee9 100644 --- a/src/main/java/ru/serega6531/packmate/ApplicationConfiguration.java +++ b/src/main/java/ru/serega6531/packmate/configuration/ApplicationConfiguration.java @@ -1,4 +1,4 @@ -package ru.serega6531.packmate; +package ru.serega6531.packmate.configuration; import org.pcap4j.core.PcapNativeException; import org.springframework.beans.factory.annotation.Autowired; @@ -15,6 +15,7 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; +import ru.serega6531.packmate.WebSocketHandler; import ru.serega6531.packmate.model.enums.CaptureMode; import ru.serega6531.packmate.pcap.FilePcapWorker; import ru.serega6531.packmate.pcap.LivePcapWorker; diff --git a/src/main/java/ru/serega6531/packmate/controller/PcapController.java b/src/main/java/ru/serega6531/packmate/controller/PcapController.java new file mode 100644 index 0000000..7199f68 --- /dev/null +++ b/src/main/java/ru/serega6531/packmate/controller/PcapController.java @@ -0,0 +1,36 @@ +package ru.serega6531.packmate.controller; + +import org.pcap4j.core.PcapNativeException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import ru.serega6531.packmate.service.PcapService; + +@RestController +@RequestMapping("/api/pcap/") +public class PcapController { + + private final PcapService service; + + @Autowired + public PcapController(PcapService service) { + this.service = service; + } + + @GetMapping("/started") + public boolean started() { + return service.isStarted(); + } + + public boolean isRunning() { + return true; //TODO + } + + @PostMapping("/start") + public void start() throws PcapNativeException { + service.start(); + } + +} diff --git a/src/main/java/ru/serega6531/packmate/pcap/FilePcapWorker.java b/src/main/java/ru/serega6531/packmate/pcap/FilePcapWorker.java index 7a8f1ea..6a541f1 100644 --- a/src/main/java/ru/serega6531/packmate/pcap/FilePcapWorker.java +++ b/src/main/java/ru/serega6531/packmate/pcap/FilePcapWorker.java @@ -42,6 +42,7 @@ public class FilePcapWorker extends AbstractPcapWorker { log.error("Pcap read", e); Thread.sleep(100); } catch (EOFException e) { + log.info("All packets processed"); stop(); break; } @@ -54,6 +55,7 @@ public class FilePcapWorker extends AbstractPcapWorker { pcap.close(); } - log.info("Intercept stopped"); + //TODO закрывать все стримы + log.info("Pcap closed"); } } diff --git a/src/main/java/ru/serega6531/packmate/service/PcapService.java b/src/main/java/ru/serega6531/packmate/service/PcapService.java new file mode 100644 index 0000000..b503bd3 --- /dev/null +++ b/src/main/java/ru/serega6531/packmate/service/PcapService.java @@ -0,0 +1,29 @@ +package ru.serega6531.packmate.service; + +import lombok.Getter; +import org.pcap4j.core.PcapNativeException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import ru.serega6531.packmate.pcap.PcapWorker; + +@Service +public class PcapService { + + @Getter + private boolean started = false; + + private final PcapWorker worker; + + @Autowired + public PcapService(PcapWorker worker) { + this.worker = worker; + } + + public synchronized void start() throws PcapNativeException { + if(!started) { + started = true; + worker.start(); + } + } + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index ed78283..4abd2b1 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -17,6 +17,7 @@ spring: enable-capture: true capture-mode: LIVE # LIVE, FILE interface-name: enp0s31f6 +pcap-file: file.pcap local-ip: "192.168.0.125" account-login: BinaryBears account-password: 123456