diff --git a/src/main/java/ru/serega6531/packmate/PcapWorker.java b/src/main/java/ru/serega6531/packmate/PcapWorker.java index 71bf26b..12e12e4 100644 --- a/src/main/java/ru/serega6531/packmate/PcapWorker.java +++ b/src/main/java/ru/serega6531/packmate/PcapWorker.java @@ -136,8 +136,10 @@ public class PcapWorker implements PacketListener { servicesService.findService(sourceIp, sourcePort, destIp, destPort); if (serviceOptional.isPresent()) { + final long time = System.currentTimeMillis(); + listenerExecutorService.execute(() -> { - UnfinishedStream stream = addNewPacket(sourceIp, destIp, sourcePort, destPort, ttl, content, Protocol.TCP); + UnfinishedStream stream = addNewPacket(sourceIp, destIp, time, sourcePort, destPort, ttl, content, Protocol.TCP); if (log.isDebugEnabled()) { log.debug("tcp {} {}:{} -> {}:{}, номер пакета {}", @@ -173,8 +175,10 @@ public class PcapWorker implements PacketListener { servicesService.findService(sourceIp, sourcePort, destIp, destPort); if (serviceOptional.isPresent()) { + final long time = System.currentTimeMillis(); + listenerExecutorService.execute(() -> { - UnfinishedStream stream = addNewPacket(sourceIp, destIp, sourcePort, destPort, ttl, content, Protocol.UDP); + UnfinishedStream stream = addNewPacket(sourceIp, destIp, time, sourcePort, destPort, ttl, content, Protocol.UDP); if (log.isDebugEnabled()) { log.debug("udp {} {}:{} -> {}:{}, номер пакета {}", @@ -189,7 +193,7 @@ public class PcapWorker implements PacketListener { } } - private UnfinishedStream addNewPacket(Inet4Address sourceIp, Inet4Address destIp, + private UnfinishedStream addNewPacket(Inet4Address sourceIp, Inet4Address destIp, long time, int sourcePort, int destPort, byte ttl, byte[] content, Protocol protocol) { var incoming = destIp.equals(localIp); var stream = new UnfinishedStream(sourceIp, destIp, sourcePort, destPort, protocol); @@ -197,7 +201,7 @@ public class PcapWorker implements PacketListener { var packet = ru.serega6531.packmate.model.Packet.builder() .tempId(packetIdCounter++) .ttl(ttl) - .timestamp(System.currentTimeMillis()) + .timestamp(time) .incoming(incoming) .content(content) .build(); diff --git a/src/main/java/ru/serega6531/packmate/controller/PacketController.java b/src/main/java/ru/serega6531/packmate/controller/PacketController.java index 6b55258..84b353d 100644 --- a/src/main/java/ru/serega6531/packmate/controller/PacketController.java +++ b/src/main/java/ru/serega6531/packmate/controller/PacketController.java @@ -7,7 +7,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import ru.serega6531.packmate.model.Packet; import ru.serega6531.packmate.model.Stream; -import ru.serega6531.packmate.service.PacketService; import ru.serega6531.packmate.service.StreamService; import java.util.Collections; @@ -19,19 +18,17 @@ import java.util.Optional; public class PacketController { private final StreamService streamService; - private final PacketService packetService; @Autowired - public PacketController(StreamService streamService, PacketService packetService) { + public PacketController(StreamService streamService) { this.streamService = streamService; - this.packetService = packetService; } @PostMapping("/{streamId}") public List getPacketsForStream(@PathVariable long streamId) { final Optional stream = streamService.find(streamId); if (stream.isPresent()) { - return packetService.getPacketsForStream(stream.get()); + return stream.get().getPackets(); } else { return Collections.emptyList(); } diff --git a/src/main/java/ru/serega6531/packmate/model/Pattern.java b/src/main/java/ru/serega6531/packmate/model/Pattern.java index 612c777..bf499fa 100644 --- a/src/main/java/ru/serega6531/packmate/model/Pattern.java +++ b/src/main/java/ru/serega6531/packmate/model/Pattern.java @@ -38,7 +38,7 @@ public class Pattern { private PatternDirectionType directionType; - @ManyToMany(mappedBy = "foundPatterns", cascade = CascadeType.ALL, fetch = FetchType.LAZY) + @ManyToMany(mappedBy = "foundPatterns", fetch = FetchType.LAZY) @JsonIgnore private List matchedStreams; diff --git a/src/main/java/ru/serega6531/packmate/model/Stream.java b/src/main/java/ru/serega6531/packmate/model/Stream.java index 1dd18a0..2524d97 100644 --- a/src/main/java/ru/serega6531/packmate/model/Stream.java +++ b/src/main/java/ru/serega6531/packmate/model/Stream.java @@ -33,8 +33,7 @@ public class Stream { private Protocol protocol; - @OneToMany(mappedBy = "stream", cascade = CascadeType.ALL, orphanRemoval = true) - @OrderColumn + @OneToMany(mappedBy = "stream", cascade = CascadeType.ALL) @JsonIgnore private List packets; @@ -42,13 +41,14 @@ public class Stream { private long endTimestamp; - @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @ManyToMany(cascade = CascadeType.ALL) private Set foundPatterns; private boolean favorite; private byte ttl; + @Column(columnDefinition = "char(3)") private String userAgentHash; } diff --git a/src/main/java/ru/serega6531/packmate/repository/PacketRepository.java b/src/main/java/ru/serega6531/packmate/repository/PacketRepository.java deleted file mode 100644 index b0d88df..0000000 --- a/src/main/java/ru/serega6531/packmate/repository/PacketRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package ru.serega6531.packmate.repository; - -import org.springframework.data.jpa.repository.JpaRepository; -import ru.serega6531.packmate.model.Packet; -import ru.serega6531.packmate.model.Stream; - -import java.util.List; - -public interface PacketRepository extends JpaRepository { - - List findAllByStream(Stream stream); - -} diff --git a/src/main/java/ru/serega6531/packmate/service/PacketService.java b/src/main/java/ru/serega6531/packmate/service/PacketService.java deleted file mode 100644 index 9a16b36..0000000 --- a/src/main/java/ru/serega6531/packmate/service/PacketService.java +++ /dev/null @@ -1,29 +0,0 @@ -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.model.Stream; -import ru.serega6531.packmate.repository.PacketRepository; - -import java.util.List; - -@Service -public class PacketService { - - private final PacketRepository repository; - - @Autowired - public PacketService(PacketRepository repository) { - this.repository = repository; - } - - public List getPacketsForStream(Stream stream) { - return repository.findAllByStream(stream); - } - - public List saveAll(List packets) { - return repository.saveAll(packets); - } - -} diff --git a/src/main/java/ru/serega6531/packmate/service/PatternService.java b/src/main/java/ru/serega6531/packmate/service/PatternService.java index 2cc982d..fd03a71 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 lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import ru.serega6531.packmate.model.FoundPattern; @@ -21,17 +20,14 @@ import java.util.stream.Collectors; public class PatternService { private final PatternRepository repository; - private final StreamService streamService; private final StreamSubscriptionService subscriptionService; private final Map patterns = new HashMap<>(); @Autowired public PatternService(PatternRepository repository, - @Lazy StreamService streamService, StreamSubscriptionService subscriptionService) { this.repository = repository; - this.streamService = streamService; this.subscriptionService = subscriptionService; repository.findAll().forEach(p -> patterns.put(p.getId(), p)); @@ -63,10 +59,11 @@ public class PatternService { for (Stream stream : pattern.getMatchedStreams()) { stream.getFoundPatterns().remove(pattern); - streamService.save(stream); + stream.getPackets().forEach(p -> + p.getMatches().removeIf(m -> + m.getPatternId() == pattern.getId())); } - pattern.getMatchedStreams().clear(); patterns.remove(id); repository.delete(pattern); subscriptionService.broadcast(new SubscriptionMessage(SubscriptionMessageType.DELETE_PATTERN, id)); @@ -76,7 +73,7 @@ public class PatternService { public Pattern save(Pattern pattern) { log.info("Добавлен новый паттерн {} со значением {}", pattern.getName(), pattern.getValue()); final Pattern saved = repository.save(pattern); - patterns.put(saved.getId(), pattern); + patterns.put(saved.getId(), saved); subscriptionService.broadcast(new SubscriptionMessage(SubscriptionMessageType.SAVE_PATTERN, saved)); return saved; } diff --git a/src/main/java/ru/serega6531/packmate/service/ServicesService.java b/src/main/java/ru/serega6531/packmate/service/ServicesService.java index d8134fe..4037371 100644 --- a/src/main/java/ru/serega6531/packmate/service/ServicesService.java +++ b/src/main/java/ru/serega6531/packmate/service/ServicesService.java @@ -68,7 +68,7 @@ public class ServicesService { public CtfService save(CtfService service) { log.info("Добавлен или изменен сервис {} на порту {}", service.getName(), service.getPort()); final CtfService saved = repository.save(service); - services.put(saved.getPort(), service); + services.put(saved.getPort(), saved); subscriptionService.broadcast(new SubscriptionMessage(SubscriptionMessageType.SAVE_SERVICE, saved)); return saved; } diff --git a/src/main/java/ru/serega6531/packmate/service/StreamService.java b/src/main/java/ru/serega6531/packmate/service/StreamService.java index d284ae1..14a60ed 100644 --- a/src/main/java/ru/serega6531/packmate/service/StreamService.java +++ b/src/main/java/ru/serega6531/packmate/service/StreamService.java @@ -7,6 +7,7 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import ru.serega6531.packmate.model.*; import ru.serega6531.packmate.model.enums.SubscriptionMessageType; @@ -29,7 +30,6 @@ public class StreamService { private final StreamRepository repository; private final PatternService patternService; private final ServicesService servicesService; - private final PacketService packetService; private final StreamSubscriptionService subscriptionService; private final boolean ignoreEmptyPackets; @@ -40,13 +40,11 @@ public class StreamService { public StreamService(StreamRepository repository, PatternService patternService, ServicesService servicesService, - PacketService packetService, StreamSubscriptionService subscriptionService, @Value("${ignore-empty-packets}") boolean ignoreEmptyPackets) { this.repository = repository; this.patternService = patternService; this.servicesService = servicesService; - this.packetService = packetService; this.subscriptionService = subscriptionService; this.ignoreEmptyPackets = ignoreEmptyPackets; } @@ -54,7 +52,7 @@ public class StreamService { /** * @return был ли сохранен стрим */ - @Transactional + @Transactional(propagation = Propagation.NEVER) public boolean saveNewStream(UnfinishedStream unfinishedStream, List packets) { final var serviceOptional = servicesService.findService( unfinishedStream.getFirstIp(), @@ -83,7 +81,7 @@ public class StreamService { .filter(Packet::isIncoming) .findFirst(); - Stream stream = new Stream(); + final Stream stream = new Stream(); stream.setProtocol(unfinishedStream.getProtocol()); stream.setTtl(firstIncoming.isPresent() ? firstIncoming.get().getTtl() : 0); stream.setStartTimestamp(packets.get(0).getTimestamp()); @@ -97,7 +95,7 @@ public class StreamService { Set foundPatterns = getFoundPatterns(packets, savedStream); savedStream.setFoundPatterns(foundPatterns); - savedStream.setPackets(packetService.saveAll(packets)); + savedStream.setPackets(packets); savedStream = save(savedStream); subscriptionService.broadcast(new SubscriptionMessage(SubscriptionMessageType.NEW_STREAM, savedStream));