From 8cb109ac7dc1d4820d7a7a20c6b1e5dda8937c0f Mon Sep 17 00:00:00 2001 From: serega6531 Date: Sun, 28 Apr 2019 02:21:13 +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=20PcapWorker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 + .../packmate/PackmateApplication.java | 9 ++ .../ru/serega6531/packmate/PcapWorker.java | 90 +++++++++++++++++++ .../serega6531/packmate/model/CtfService.java | 6 +- .../packmate/service/PatternService.java | 1 - src/main/resources/application.yml | 3 +- 6 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 src/main/java/ru/serega6531/packmate/PcapWorker.java diff --git a/build.gradle b/build.gradle index a228936..5f2abf5 100644 --- a/build.gradle +++ b/build.gradle @@ -23,6 +23,9 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.session:spring-session-core' + compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.7' + compile 'org.pcap4j:pcap4j-core:1.+' + compile 'org.pcap4j:pcap4j-packetfactory-static:1.+' compileOnly 'org.projectlombok:lombok' runtimeOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'org.postgresql:postgresql' diff --git a/src/main/java/ru/serega6531/packmate/PackmateApplication.java b/src/main/java/ru/serega6531/packmate/PackmateApplication.java index a1ae6f3..3e62812 100644 --- a/src/main/java/ru/serega6531/packmate/PackmateApplication.java +++ b/src/main/java/ru/serega6531/packmate/PackmateApplication.java @@ -1,7 +1,10 @@ package ru.serega6531.packmate; +import org.pcap4j.core.PcapNativeException; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; @SpringBootApplication public class PackmateApplication { @@ -10,4 +13,10 @@ public class PackmateApplication { SpringApplication.run(PackmateApplication.class, args); } + @EventListener(ApplicationReadyEvent.class) + public void afterStartup(ApplicationReadyEvent event) throws PcapNativeException { + final PcapWorker pcapWorker = event.getApplicationContext().getBean(PcapWorker.class); + pcapWorker.start(); + } + } diff --git a/src/main/java/ru/serega6531/packmate/PcapWorker.java b/src/main/java/ru/serega6531/packmate/PcapWorker.java new file mode 100644 index 0000000..3342f7f --- /dev/null +++ b/src/main/java/ru/serega6531/packmate/PcapWorker.java @@ -0,0 +1,90 @@ +package ru.serega6531.packmate; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.concurrent.BasicThreadFactory; +import org.pcap4j.core.PcapHandle; +import org.pcap4j.core.PcapNativeException; +import org.pcap4j.core.PcapNetworkInterface; +import org.pcap4j.core.Pcaps; +import org.pcap4j.packet.Packet; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import ru.serega6531.packmate.service.PacketService; +import ru.serega6531.packmate.service.PatternService; +import ru.serega6531.packmate.service.ServicesService; +import ru.serega6531.packmate.service.StreamService; + +import javax.annotation.PreDestroy; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeoutException; + +@Component +@Slf4j +public class PcapWorker { + + private final ServicesService servicesService; + private final StreamService streamService; + private final PacketService packetService; + private final PatternService patternService; + + private PcapNetworkInterface device; + private PcapHandle pcap = null; + private ExecutorService executorService; + + @Autowired + public PcapWorker(ServicesService servicesService, + StreamService streamService, + PacketService packetService, + PatternService patternService, + @Value("${interface-name}") String interfaceName) throws PcapNativeException { + this.servicesService = servicesService; + this.streamService = streamService; + this.packetService = packetService; + this.patternService = patternService; + + BasicThreadFactory factory = new BasicThreadFactory.Builder() + .namingPattern("pcap-worker").build(); + executorService = Executors.newSingleThreadExecutor(factory); + device = Pcaps.getDevByName(interfaceName); + } + + public void start() throws PcapNativeException { + System.out.println("Using interface " + device.getName()); + pcap = device.openLive(65536, PcapNetworkInterface.PromiscuousMode.PROMISCUOUS, 100); + + executorService.execute(() -> { + try { + log.info("Intercept started"); + while (true) { + if (pcap.isOpen()) { + try { + final Packet packet = pcap.getNextPacketEx(); + processPacket(packet); + } catch (TimeoutException ignored) { + } + } else { + break; + } + } + } catch (Exception e) { + log.error("Error while capturing packet", e); + stop(); + } + }); + } + + @PreDestroy + public void stop() { + if (pcap != null && pcap.isOpen()) { + pcap.close(); + } + + log.info("Intercept stopped"); + } + + private void processPacket(Packet packet) { + System.out.println(packet); + } +} diff --git a/src/main/java/ru/serega6531/packmate/model/CtfService.java b/src/main/java/ru/serega6531/packmate/model/CtfService.java index a912765..06b3ace 100644 --- a/src/main/java/ru/serega6531/packmate/model/CtfService.java +++ b/src/main/java/ru/serega6531/packmate/model/CtfService.java @@ -2,14 +2,12 @@ package ru.serega6531.packmate.model; import lombok.Data; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.OneToMany; +import javax.persistence.*; import java.util.List; @Data @Entity +@Table(name = "service") public class CtfService { @Id diff --git a/src/main/java/ru/serega6531/packmate/service/PatternService.java b/src/main/java/ru/serega6531/packmate/service/PatternService.java index 63c3685..d6bd541 100644 --- a/src/main/java/ru/serega6531/packmate/service/PatternService.java +++ b/src/main/java/ru/serega6531/packmate/service/PatternService.java @@ -2,7 +2,6 @@ package ru.serega6531.packmate.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.web.bind.annotation.*; import ru.serega6531.packmate.model.Pattern; import ru.serega6531.packmate.repository.PatternRepository; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 11ba9c6..b2f9d2e 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -6,4 +6,5 @@ spring: driver-class-name: org.postgresql.Driver jpa: hibernate: - ddl-auto: update \ No newline at end of file + ddl-auto: update +interface-name: enp0s31f6 \ No newline at end of file