From 9c9b7cc942be5fc99106e02106a2c24a5ebb5a9b Mon Sep 17 00:00:00 2001 From: serega6531 Date: Mon, 29 Apr 2019 19:58:39 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=BA=D0=BE=D0=BD=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D1=81=D1=82=D1=80=D0=B8=D0=BC=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/serega6531/packmate/PcapWorker.java | 48 +++++++++++++++---- .../ru/serega6531/packmate/model/Packet.java | 1 - .../ru/serega6531/packmate/model/Stream.java | 4 +- .../packmate/service/PacketService.java | 15 ++++++ .../packmate/service/StreamService.java | 8 ++++ 5 files changed, 65 insertions(+), 11 deletions(-) diff --git a/src/main/java/ru/serega6531/packmate/PcapWorker.java b/src/main/java/ru/serega6531/packmate/PcapWorker.java index c3155b6..4ea42ec 100644 --- a/src/main/java/ru/serega6531/packmate/PcapWorker.java +++ b/src/main/java/ru/serega6531/packmate/PcapWorker.java @@ -14,6 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import ru.serega6531.packmate.model.CtfService; +import ru.serega6531.packmate.model.Stream; import ru.serega6531.packmate.model.UnfinishedStream; import ru.serega6531.packmate.service.PacketService; import ru.serega6531.packmate.service.PatternService; @@ -145,13 +146,7 @@ public class PcapWorker { } if(sourceIpString != null && sourcePort != -1) { - Optional serviceOptional = Optional.empty(); - - if(sourceIpString.equals(localIp)) { - serviceOptional = servicesService.findByPort(sourcePort); - } else if(destIpString.equals(localIp)) { - serviceOptional = servicesService.findByPort(destPort); - } + final Optional serviceOptional = findService(sourceIpString, sourcePort, destIpString, destPort); if(serviceOptional.isPresent()) { String sourceIpAndPort = sourceIpString + ":" + sourcePort; @@ -174,7 +169,7 @@ public class PcapWorker { } log.info("{} {} {}:{} -> {}:{}, номер пакета {}", - packet.getTempId(), serviceOptional.get(), sourceIpString, sourcePort, destIpString, destPort, + protocol.name().toLowerCase(), serviceOptional.get(), sourceIpString, sourcePort, destIpString, destPort, unfinishedStreams.get(stream).size()); if(protocol == Protocol.TCP) { @@ -198,11 +193,46 @@ public class PcapWorker { } if(rst || (acksForStream.contains(sourceIpAndPort) && acksForStream.contains(destIpAndPort))) { + final Stream finishedStream = saveStream(stream); log.info("Конец стрима"); - //TODO + //TODO send to ws } } } } } + + private Stream saveStream(UnfinishedStream unfinishedStream) { + final List packets = unfinishedStreams.get(unfinishedStream); + + Stream stream = new Stream(); + stream.setProtocol(unfinishedStream.getProtocol()); + stream.setStartTimestamp(packets.get(0).getTimestamp()); + stream.setEndTimestamp(packets.get(packets.size() - 1).getTimestamp()); + stream.setService(findService( + unfinishedStream.getFirstIp().getHostAddress(), + unfinishedStream.getFirstPort(), + unfinishedStream.getSecondIp().getHostAddress(), + unfinishedStream.getSecondPort() + ).get()); + + final Stream saved = streamService.save(stream); + + for (ru.serega6531.packmate.model.Packet packet : packets) { + packet.setStream(saved); + packetService.save(packet); + } + + return saved; + } + + private Optional findService(String firstIp, int firstPort, String secondIp, int secondPort) { + if(firstIp.equals(localIp)) { + return servicesService.findByPort(firstPort); + } else if(secondIp.equals(localIp)) { + return servicesService.findByPort(secondPort); + } + + return Optional.empty(); + } } diff --git a/src/main/java/ru/serega6531/packmate/model/Packet.java b/src/main/java/ru/serega6531/packmate/model/Packet.java index 9ed1b7c..7a83b5e 100644 --- a/src/main/java/ru/serega6531/packmate/model/Packet.java +++ b/src/main/java/ru/serega6531/packmate/model/Packet.java @@ -33,7 +33,6 @@ public class Packet { private long timestamp; - @Lob private byte[] content; } diff --git a/src/main/java/ru/serega6531/packmate/model/Stream.java b/src/main/java/ru/serega6531/packmate/model/Stream.java index d034305..37a4c31 100644 --- a/src/main/java/ru/serega6531/packmate/model/Stream.java +++ b/src/main/java/ru/serega6531/packmate/model/Stream.java @@ -33,6 +33,8 @@ public class Stream { @OneToMany(mappedBy = "stream", cascade = CascadeType.ALL, orphanRemoval = true) private List packets; - private long timestamp; + private long startTimestamp; + + private long endTimestamp; } diff --git a/src/main/java/ru/serega6531/packmate/service/PacketService.java b/src/main/java/ru/serega6531/packmate/service/PacketService.java index 423db96..aec4e2b 100644 --- a/src/main/java/ru/serega6531/packmate/service/PacketService.java +++ b/src/main/java/ru/serega6531/packmate/service/PacketService.java @@ -1,7 +1,22 @@ package ru.serega6531.packmate.service; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import ru.serega6531.packmate.model.Packet; +import ru.serega6531.packmate.repository.PacketRepository; @Service public class PacketService { + + private final PacketRepository repository; + + @Autowired + public PacketService(PacketRepository repository) { + this.repository = repository; + } + + public Packet save(Packet packet) { + return repository.save(packet); + } + } diff --git a/src/main/java/ru/serega6531/packmate/service/StreamService.java b/src/main/java/ru/serega6531/packmate/service/StreamService.java index a94e8a8..28a9c07 100644 --- a/src/main/java/ru/serega6531/packmate/service/StreamService.java +++ b/src/main/java/ru/serega6531/packmate/service/StreamService.java @@ -1,5 +1,6 @@ package ru.serega6531.packmate.service; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ru.serega6531.packmate.model.Stream; @@ -8,6 +9,7 @@ import ru.serega6531.packmate.repository.StreamRepository; import java.util.List; @Service +@Slf4j public class StreamService { private final StreamRepository repository; @@ -17,6 +19,12 @@ public class StreamService { this.repository = repository; } + public Stream save(Stream stream) { + final Stream saved = repository.save(stream); + log.info("Создан стрим с id {}", saved.getId()); + return saved; + } + public List findAll() { return repository.findAll(); }