From 43d6973948bf7e3d6856e177957cd1eb77277e0e Mon Sep 17 00:00:00 2001 From: serega6531 Date: Mon, 25 Nov 2019 00:52:08 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=20?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=20=D1=81=D0=BE=D0=BE=D0=B1?= =?UTF-8?q?=D1=89=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=B2=20ws,=20=D1=80=D0=B5?= =?UTF-8?q?=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../packmate/PackmateApplication.java | 2 +- .../ru/serega6531/packmate/PcapWorker.java | 8 ++++---- .../packmate/TimeoutStreamsSaver.java | 6 +++--- .../packmate/controller/PacketController.java | 8 +++++--- .../packmate/controller/StreamController.java | 2 +- .../ru/serega6531/packmate/model/Pattern.java | 1 + .../ru/serega6531/packmate/model/Protocol.java | 5 ----- .../ru/serega6531/packmate/model/Stream.java | 1 + .../model/{ => enums}/PatternType.java | 2 +- .../packmate/model/enums/Protocol.java | 5 +++++ .../model/enums/SubscriptionMessageType.java | 7 +++++++ .../packmate/model/{ => pojo}/Pagination.java | 3 ++- .../model/pojo/SubscriptionMessage.java | 14 ++++++++++++++ .../model/{ => pojo}/UnfinishedStream.java | 5 +++-- .../packmate/repository/PatternRepository.java | 2 +- .../packmate/service/PatternService.java | 13 +++++++++++-- .../packmate/service/ServicesService.java | 10 +++++++++- .../packmate/service/StreamService.java | 18 +++++++++++------- .../service/StreamSubscriptionService.java | 14 +++++++------- 19 files changed, 87 insertions(+), 39 deletions(-) delete mode 100644 src/main/java/ru/serega6531/packmate/model/Protocol.java rename src/main/java/ru/serega6531/packmate/model/{ => enums}/PatternType.java (54%) create mode 100644 src/main/java/ru/serega6531/packmate/model/enums/Protocol.java create mode 100644 src/main/java/ru/serega6531/packmate/model/enums/SubscriptionMessageType.java rename src/main/java/ru/serega6531/packmate/model/{ => pojo}/Pagination.java (85%) create mode 100644 src/main/java/ru/serega6531/packmate/model/pojo/SubscriptionMessage.java rename src/main/java/ru/serega6531/packmate/model/{ => pojo}/UnfinishedStream.java (88%) diff --git a/src/main/java/ru/serega6531/packmate/PackmateApplication.java b/src/main/java/ru/serega6531/packmate/PackmateApplication.java index bf33a40..4054f15 100644 --- a/src/main/java/ru/serega6531/packmate/PackmateApplication.java +++ b/src/main/java/ru/serega6531/packmate/PackmateApplication.java @@ -23,7 +23,7 @@ public class PackmateApplication { @EventListener(ApplicationReadyEvent.class) public void afterStartup(ApplicationReadyEvent event) throws PcapNativeException { - if(enableCapture) { + if (enableCapture) { 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 index f5e502f..5268087 100644 --- a/src/main/java/ru/serega6531/packmate/PcapWorker.java +++ b/src/main/java/ru/serega6531/packmate/PcapWorker.java @@ -12,8 +12,8 @@ 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.Protocol; -import ru.serega6531.packmate.model.UnfinishedStream; +import ru.serega6531.packmate.model.enums.Protocol; +import ru.serega6531.packmate.model.pojo.UnfinishedStream; import ru.serega6531.packmate.service.ServicesService; import ru.serega6531.packmate.service.StreamService; @@ -208,13 +208,13 @@ public class PcapWorker implements PacketListener { if (stream.getProtocol() == protocol) { final List packets = entry.getValue(); if (System.currentTimeMillis() - packets.get(packets.size() - 1).getTimestamp() > timeoutMillis) { - if(streamService.saveNewStream(stream, packets)) { + if (streamService.saveNewStream(stream, packets)) { streamsClosed++; } iterator.remove(); - if(protocol == Protocol.TCP) { + if (protocol == Protocol.TCP) { fins.remove(stream); acks.remove(stream); } diff --git a/src/main/java/ru/serega6531/packmate/TimeoutStreamsSaver.java b/src/main/java/ru/serega6531/packmate/TimeoutStreamsSaver.java index 0a63d87..b924b68 100644 --- a/src/main/java/ru/serega6531/packmate/TimeoutStreamsSaver.java +++ b/src/main/java/ru/serega6531/packmate/TimeoutStreamsSaver.java @@ -5,7 +5,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -import ru.serega6531.packmate.model.Protocol; +import ru.serega6531.packmate.model.enums.Protocol; import java.util.concurrent.TimeUnit; @@ -29,12 +29,12 @@ public class TimeoutStreamsSaver { @Scheduled(fixedRateString = "PT${timeout-stream-check-interval}S", initialDelayString = "PT${timeout-stream-check-interval}S") public void saveStreams() { int streamsClosed = pcapWorker.closeTimeoutStreams(Protocol.UDP, udpStreamTimeoutMillis); - if(streamsClosed > 0) { + if (streamsClosed > 0) { log.info("Закрыто {} udp стримов", streamsClosed); } streamsClosed = pcapWorker.closeTimeoutStreams(Protocol.TCP, tcpStreamTimeoutMillis); - if(streamsClosed > 0) { + if (streamsClosed > 0) { log.info("Закрыто {} tcp стримов", streamsClosed); } } diff --git a/src/main/java/ru/serega6531/packmate/controller/PacketController.java b/src/main/java/ru/serega6531/packmate/controller/PacketController.java index 4a83aa7..6b55258 100644 --- a/src/main/java/ru/serega6531/packmate/controller/PacketController.java +++ b/src/main/java/ru/serega6531/packmate/controller/PacketController.java @@ -1,9 +1,11 @@ package ru.serega6531.packmate.controller; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PathVariable; +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.model.Packet; -import ru.serega6531.packmate.model.Pagination; import ru.serega6531.packmate.model.Stream; import ru.serega6531.packmate.service.PacketService; import ru.serega6531.packmate.service.StreamService; @@ -28,7 +30,7 @@ public class PacketController { @PostMapping("/{streamId}") public List getPacketsForStream(@PathVariable long streamId) { final Optional stream = streamService.find(streamId); - if(stream.isPresent()) { + if (stream.isPresent()) { return packetService.getPacketsForStream(stream.get()); } else { return Collections.emptyList(); diff --git a/src/main/java/ru/serega6531/packmate/controller/StreamController.java b/src/main/java/ru/serega6531/packmate/controller/StreamController.java index a4d7f84..b72cec4 100644 --- a/src/main/java/ru/serega6531/packmate/controller/StreamController.java +++ b/src/main/java/ru/serega6531/packmate/controller/StreamController.java @@ -2,8 +2,8 @@ package ru.serega6531.packmate.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import ru.serega6531.packmate.model.Pagination; import ru.serega6531.packmate.model.Stream; +import ru.serega6531.packmate.model.pojo.Pagination; import ru.serega6531.packmate.service.StreamService; import java.util.List; diff --git a/src/main/java/ru/serega6531/packmate/model/Pattern.java b/src/main/java/ru/serega6531/packmate/model/Pattern.java index 38ea512..bbff213 100644 --- a/src/main/java/ru/serega6531/packmate/model/Pattern.java +++ b/src/main/java/ru/serega6531/packmate/model/Pattern.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import lombok.ToString; import org.hibernate.annotations.GenericGenerator; +import ru.serega6531.packmate.model.enums.PatternType; import javax.persistence.*; import java.util.List; diff --git a/src/main/java/ru/serega6531/packmate/model/Protocol.java b/src/main/java/ru/serega6531/packmate/model/Protocol.java deleted file mode 100644 index 2a5d979..0000000 --- a/src/main/java/ru/serega6531/packmate/model/Protocol.java +++ /dev/null @@ -1,5 +0,0 @@ -package ru.serega6531.packmate.model; - -public enum Protocol { - TCP, UDP -} diff --git a/src/main/java/ru/serega6531/packmate/model/Stream.java b/src/main/java/ru/serega6531/packmate/model/Stream.java index 0bb6477..1dd18a0 100644 --- a/src/main/java/ru/serega6531/packmate/model/Stream.java +++ b/src/main/java/ru/serega6531/packmate/model/Stream.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import lombok.ToString; import org.hibernate.annotations.GenericGenerator; +import ru.serega6531.packmate.model.enums.Protocol; import javax.persistence.*; import java.util.List; diff --git a/src/main/java/ru/serega6531/packmate/model/PatternType.java b/src/main/java/ru/serega6531/packmate/model/enums/PatternType.java similarity index 54% rename from src/main/java/ru/serega6531/packmate/model/PatternType.java rename to src/main/java/ru/serega6531/packmate/model/enums/PatternType.java index e22505f..8a2e1f5 100644 --- a/src/main/java/ru/serega6531/packmate/model/PatternType.java +++ b/src/main/java/ru/serega6531/packmate/model/enums/PatternType.java @@ -1,4 +1,4 @@ -package ru.serega6531.packmate.model; +package ru.serega6531.packmate.model.enums; public enum PatternType { INPUT, OUTPUT, BOTH diff --git a/src/main/java/ru/serega6531/packmate/model/enums/Protocol.java b/src/main/java/ru/serega6531/packmate/model/enums/Protocol.java new file mode 100644 index 0000000..c9d2f7f --- /dev/null +++ b/src/main/java/ru/serega6531/packmate/model/enums/Protocol.java @@ -0,0 +1,5 @@ +package ru.serega6531.packmate.model.enums; + +public enum Protocol { + TCP, UDP +} diff --git a/src/main/java/ru/serega6531/packmate/model/enums/SubscriptionMessageType.java b/src/main/java/ru/serega6531/packmate/model/enums/SubscriptionMessageType.java new file mode 100644 index 0000000..62c286b --- /dev/null +++ b/src/main/java/ru/serega6531/packmate/model/enums/SubscriptionMessageType.java @@ -0,0 +1,7 @@ +package ru.serega6531.packmate.model.enums; + +public enum SubscriptionMessageType { + + SAVE_SERVICE, SAVE_PATTERN, DELETE_SERVICE, DELETE_PATTERN, NEW_STREAM + +} diff --git a/src/main/java/ru/serega6531/packmate/model/Pagination.java b/src/main/java/ru/serega6531/packmate/model/pojo/Pagination.java similarity index 85% rename from src/main/java/ru/serega6531/packmate/model/Pagination.java rename to src/main/java/ru/serega6531/packmate/model/pojo/Pagination.java index 91e8384..0b2baec 100644 --- a/src/main/java/ru/serega6531/packmate/model/Pagination.java +++ b/src/main/java/ru/serega6531/packmate/model/pojo/Pagination.java @@ -1,7 +1,8 @@ -package ru.serega6531.packmate.model; +package ru.serega6531.packmate.model.pojo; import lombok.Data; import org.springframework.data.domain.Sort; +import ru.serega6531.packmate.model.Pattern; @Data public class Pagination { diff --git a/src/main/java/ru/serega6531/packmate/model/pojo/SubscriptionMessage.java b/src/main/java/ru/serega6531/packmate/model/pojo/SubscriptionMessage.java new file mode 100644 index 0000000..7842d1b --- /dev/null +++ b/src/main/java/ru/serega6531/packmate/model/pojo/SubscriptionMessage.java @@ -0,0 +1,14 @@ +package ru.serega6531.packmate.model.pojo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import ru.serega6531.packmate.model.enums.SubscriptionMessageType; + +@Data +@AllArgsConstructor +public class SubscriptionMessage { + + private SubscriptionMessageType type; + private Object value; + +} diff --git a/src/main/java/ru/serega6531/packmate/model/UnfinishedStream.java b/src/main/java/ru/serega6531/packmate/model/pojo/UnfinishedStream.java similarity index 88% rename from src/main/java/ru/serega6531/packmate/model/UnfinishedStream.java rename to src/main/java/ru/serega6531/packmate/model/pojo/UnfinishedStream.java index 0efe063..c952303 100644 --- a/src/main/java/ru/serega6531/packmate/model/UnfinishedStream.java +++ b/src/main/java/ru/serega6531/packmate/model/pojo/UnfinishedStream.java @@ -1,7 +1,8 @@ -package ru.serega6531.packmate.model; +package ru.serega6531.packmate.model.pojo; import lombok.AllArgsConstructor; import lombok.Getter; +import ru.serega6531.packmate.model.enums.Protocol; import java.net.Inet4Address; @@ -17,7 +18,7 @@ public class UnfinishedStream { @Override public boolean equals(Object obj) { - if(!(obj instanceof UnfinishedStream)) { + if (!(obj instanceof UnfinishedStream)) { return false; } diff --git a/src/main/java/ru/serega6531/packmate/repository/PatternRepository.java b/src/main/java/ru/serega6531/packmate/repository/PatternRepository.java index 076cb08..bab2442 100644 --- a/src/main/java/ru/serega6531/packmate/repository/PatternRepository.java +++ b/src/main/java/ru/serega6531/packmate/repository/PatternRepository.java @@ -2,7 +2,7 @@ package ru.serega6531.packmate.repository; import org.springframework.data.jpa.repository.JpaRepository; import ru.serega6531.packmate.model.Pattern; -import ru.serega6531.packmate.model.PatternType; +import ru.serega6531.packmate.model.enums.PatternType; import java.util.List; diff --git a/src/main/java/ru/serega6531/packmate/service/PatternService.java b/src/main/java/ru/serega6531/packmate/service/PatternService.java index 3b65556..170ecef 100644 --- a/src/main/java/ru/serega6531/packmate/service/PatternService.java +++ b/src/main/java/ru/serega6531/packmate/service/PatternService.java @@ -8,8 +8,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import ru.serega6531.packmate.model.FoundPattern; import ru.serega6531.packmate.model.Pattern; -import ru.serega6531.packmate.model.PatternType; +import ru.serega6531.packmate.model.enums.PatternType; import ru.serega6531.packmate.model.Stream; +import ru.serega6531.packmate.model.enums.SubscriptionMessageType; +import ru.serega6531.packmate.model.pojo.SubscriptionMessage; import ru.serega6531.packmate.repository.PatternRepository; import java.util.*; @@ -22,14 +24,19 @@ public class PatternService { private final PatternRepository repository; private final StreamService streamService; + private final StreamSubscriptionService subscriptionService; private final Map patterns = new HashMap<>(); private final Map compiledPatterns = new HashMap<>(); @Autowired - public PatternService(PatternRepository repository, @Lazy StreamService streamService) { + 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)); log.info("Loaded {} patterns", patterns.size()); } @@ -108,6 +115,7 @@ public class PatternService { patterns.remove(id); compiledPatterns.remove(pattern.getValue()); repository.delete(pattern); + subscriptionService.broadcast(new SubscriptionMessage(SubscriptionMessageType.DELETE_PATTERN, id)); } } @@ -115,6 +123,7 @@ public class PatternService { log.info("Добавлен новый паттерн {} со значением {}", pattern.getName(), pattern.getValue()); final Pattern saved = repository.save(pattern); patterns.put(saved.getId(), pattern); + 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 4b1e942..2c7a024 100644 --- a/src/main/java/ru/serega6531/packmate/service/ServicesService.java +++ b/src/main/java/ru/serega6531/packmate/service/ServicesService.java @@ -4,6 +4,8 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ru.serega6531.packmate.model.CtfService; +import ru.serega6531.packmate.model.enums.SubscriptionMessageType; +import ru.serega6531.packmate.model.pojo.SubscriptionMessage; import ru.serega6531.packmate.repository.ServiceRepository; import java.util.Collection; @@ -16,11 +18,15 @@ import java.util.Optional; public class ServicesService { private final ServiceRepository repository; + private final StreamSubscriptionService subscriptionService; + private final Map services = new HashMap<>(); @Autowired - public ServicesService(ServiceRepository repository) { + public ServicesService(ServiceRepository repository, StreamSubscriptionService subscriptionService) { this.repository = repository; + this.subscriptionService = subscriptionService; + repository.findAll().forEach(s -> services.put(s.getPort(), s)); log.info("Loaded {} services", services.size()); } @@ -47,12 +53,14 @@ public class ServicesService { log.info("Удален сервис на порту {}", port); services.remove(port); repository.deleteById(port); + subscriptionService.broadcast(new SubscriptionMessage(SubscriptionMessageType.DELETE_SERVICE, port)); } public CtfService save(CtfService service) { log.info("Добавлен или изменен сервис {} на порту {}", service.getName(), service.getPort()); final CtfService saved = repository.save(service); services.put(saved.getPort(), service); + 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 39b191d..4b44449 100644 --- a/src/main/java/ru/serega6531/packmate/service/StreamService.java +++ b/src/main/java/ru/serega6531/packmate/service/StreamService.java @@ -11,6 +11,10 @@ import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import ru.serega6531.packmate.model.*; +import ru.serega6531.packmate.model.enums.SubscriptionMessageType; +import ru.serega6531.packmate.model.pojo.Pagination; +import ru.serega6531.packmate.model.pojo.SubscriptionMessage; +import ru.serega6531.packmate.model.pojo.UnfinishedStream; import ru.serega6531.packmate.repository.StreamRepository; import java.io.ByteArrayInputStream; @@ -97,7 +101,7 @@ public class StreamService { } } - if(unpackGzippedHttp) { + if (unpackGzippedHttp) { boolean gzipStarted = false; int gzipStartPacket = 0; int gzipEndPacket; @@ -111,7 +115,7 @@ public class StreamService { List cut = packets.subList(gzipStartPacket, gzipEndPacket + 1); Packet decompressed = decompressGzipPackets(cut); - if(decompressed != null) { + if (decompressed != null) { packets.removeAll(cut); packets.add(gzipStartPacket, decompressed); gzipStarted = false; @@ -128,7 +132,7 @@ public class StreamService { List cut = packets.subList(gzipStartPacket, gzipEndPacket + 1); Packet decompressed = decompressGzipPackets(cut); - if(decompressed != null) { + if (decompressed != null) { packets.removeAll(cut); packets.add(gzipStartPacket, decompressed); gzipStarted = false; @@ -152,7 +156,7 @@ public class StreamService { List cut = packets.subList(gzipStartPacket, gzipEndPacket + 1); Packet decompressed = decompressGzipPackets(cut); - if(decompressed != null) { + if (decompressed != null) { packets.removeAll(cut); packets.add(gzipStartPacket, decompressed); } @@ -163,13 +167,13 @@ public class StreamService { for (Packet packet : packets) { String content = new String(packet.getContent()); final Matcher matcher = userAgentPattern.matcher(content); - if(matcher.find()) { + if (matcher.find()) { ua = matcher.group(1); break; } } - if(ua != null) { + if (ua != null) { stream.setUserAgentHash(calculateUserAgentHash(ua)); } @@ -191,7 +195,7 @@ public class StreamService { savedStream.setPackets(packetService.saveAll(packets)); savedStream = save(savedStream); - subscriptionService.broadcastNewStream(savedStream); + subscriptionService.broadcast(new SubscriptionMessage(SubscriptionMessageType.NEW_STREAM, savedStream)); return true; } diff --git a/src/main/java/ru/serega6531/packmate/service/StreamSubscriptionService.java b/src/main/java/ru/serega6531/packmate/service/StreamSubscriptionService.java index 320d0ff..e661476 100644 --- a/src/main/java/ru/serega6531/packmate/service/StreamSubscriptionService.java +++ b/src/main/java/ru/serega6531/packmate/service/StreamSubscriptionService.java @@ -8,7 +8,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.sockjs.SockJsTransportFailureException; -import ru.serega6531.packmate.model.Stream; +import ru.serega6531.packmate.model.pojo.SubscriptionMessage; import java.io.IOException; import java.util.ArrayList; @@ -28,26 +28,26 @@ public class StreamSubscriptionService { } public void addSubscriber(WebSocketSession session) { - log.info("Подписан пользователь {}", session.getRemoteAddress().getHostName()); subscribers.add(session); + log.info("Подписан пользователь {}", session.getRemoteAddress().getHostName()); } public void removeSubscriber(WebSocketSession session) { - log.info("Отписан пользователь {}", session.getRemoteAddress().getHostName()); subscribers.remove(session); + log.info("Отписан пользователь {}", session.getRemoteAddress().getHostName()); } - public void broadcastNewStream(Stream stream) { + public void broadcast(SubscriptionMessage message) { subscribers.forEach(s -> { try { - s.sendMessage(objectToTextMessage(stream)); + s.sendMessage(objectToTextMessage(message)); } catch (IOException | SockJsTransportFailureException e) { - e.printStackTrace(); + log.warn("WS", e); } }); } - private TextMessage objectToTextMessage(Object object) throws JsonProcessingException { + private TextMessage objectToTextMessage(SubscriptionMessage object) throws JsonProcessingException { return new TextMessage(mapper.writeValueAsString(object)); }