diff --git a/build.gradle b/build.gradle index 96b42f6..902461f 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,6 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation "org.springframework.boot:spring-boot-starter-security" implementation "org.springframework.boot:spring-boot-starter-websocket" - implementation 'org.springframework.boot:spring-boot-starter-cache' implementation 'org.springframework.session:spring-session-core' compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.7' compile group: 'commons-io', name: 'commons-io', version: '2.6' diff --git a/src/main/java/ru/serega6531/packmate/controller/PatternController.java b/src/main/java/ru/serega6531/packmate/controller/PatternController.java index b9c6be3..6b4075c 100644 --- a/src/main/java/ru/serega6531/packmate/controller/PatternController.java +++ b/src/main/java/ru/serega6531/packmate/controller/PatternController.java @@ -5,7 +5,7 @@ import org.springframework.web.bind.annotation.*; import ru.serega6531.packmate.model.Pattern; import ru.serega6531.packmate.service.PatternService; -import java.util.List; +import java.util.Collection; @RestController @RequestMapping("/api/pattern/") @@ -19,7 +19,7 @@ public class PatternController { } @GetMapping - public List getPatterns() { + public Collection getPatterns() { return service.findAll(); } diff --git a/src/main/java/ru/serega6531/packmate/controller/ServiceController.java b/src/main/java/ru/serega6531/packmate/controller/ServiceController.java index b8480ec..e27f54e 100644 --- a/src/main/java/ru/serega6531/packmate/controller/ServiceController.java +++ b/src/main/java/ru/serega6531/packmate/controller/ServiceController.java @@ -5,7 +5,7 @@ import org.springframework.web.bind.annotation.*; import ru.serega6531.packmate.model.CtfService; import ru.serega6531.packmate.service.ServicesService; -import java.util.List; +import java.util.Collection; @RestController @RequestMapping("/api/service/") @@ -19,7 +19,7 @@ public class ServiceController { } @GetMapping - public List getServices() { + public Collection getServices() { return service.findAll(); } diff --git a/src/main/java/ru/serega6531/packmate/repository/PacketRepository.java b/src/main/java/ru/serega6531/packmate/repository/PacketRepository.java index 2bbb081..b0d88df 100644 --- a/src/main/java/ru/serega6531/packmate/repository/PacketRepository.java +++ b/src/main/java/ru/serega6531/packmate/repository/PacketRepository.java @@ -1,6 +1,5 @@ package ru.serega6531.packmate.repository; -import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import ru.serega6531.packmate.model.Packet; import ru.serega6531.packmate.model.Stream; diff --git a/src/main/java/ru/serega6531/packmate/service/PacketService.java b/src/main/java/ru/serega6531/packmate/service/PacketService.java index ca219a9..9a16b36 100644 --- a/src/main/java/ru/serega6531/packmate/service/PacketService.java +++ b/src/main/java/ru/serega6531/packmate/service/PacketService.java @@ -1,7 +1,6 @@ package ru.serega6531.packmate.service; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import ru.serega6531.packmate.model.Packet; import ru.serega6531.packmate.model.Stream; @@ -19,13 +18,12 @@ public class PacketService { this.repository = repository; } - @Cacheable(value = "packets", key = "#stream.id") public List getPacketsForStream(Stream stream) { return repository.findAllByStream(stream); } - public Packet save(Packet packet) { - return repository.save(packet); + 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 715053d..28512fc 100644 --- a/src/main/java/ru/serega6531/packmate/service/PatternService.java +++ b/src/main/java/ru/serega6531/packmate/service/PatternService.java @@ -11,10 +11,7 @@ import ru.serega6531.packmate.model.PatternType; import ru.serega6531.packmate.model.Stream; import ru.serega6531.packmate.repository.PatternRepository; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; @Service @@ -24,28 +21,33 @@ public class PatternService { private final PatternRepository repository; private final StreamService streamService; - private Map compiledPatterns = new HashMap<>(); + private final Map patterns = new HashMap<>(); + private final Map compiledPatterns = new HashMap<>(); @Autowired public PatternService(PatternRepository repository, @Lazy StreamService streamService) { this.repository = repository; this.streamService = streamService; + repository.findAll().forEach(p -> patterns.put(p.getId(), p)); + log.info("Loaded {} patterns", patterns.size()); } - public List findAll() { - return repository.findAll(); + public Collection findAll() { + return patterns.values(); } public List findMatching(byte[] bytes, boolean incoming) { String content = new String(bytes); - return repository.findAllByTypeEqualsOrTypeEquals(incoming ? PatternType.INPUT : PatternType.OUTPUT, PatternType.BOTH).stream() + return patterns.values().stream() + .filter(p -> p.getType() == (incoming ? PatternType.INPUT : PatternType.OUTPUT) + || p.getType() == PatternType.BOTH) .filter(pattern -> matches(pattern, content)) .collect(Collectors.toList()); } private boolean matches(Pattern pattern, String content) { - if(pattern.isRegex()) { + if (pattern.isRegex()) { final java.util.regex.Pattern regex = compilePattern(pattern); return regex.matcher(content).find(); } else { @@ -56,7 +58,7 @@ public class PatternService { @Transactional public void deleteById(int id) { final Optional optional = repository.findById(id); - if(optional.isPresent()) { + if (optional.isPresent()) { final Pattern pattern = optional.get(); log.info("Удален паттерн {} со значением {}", pattern.getName(), pattern.getValue()); @@ -66,12 +68,15 @@ public class PatternService { } pattern.getMatchedStreams().clear(); + patterns.remove(pattern.getId()); + compiledPatterns.remove(pattern.getValue()); repository.delete(pattern); } } public Pattern save(Pattern pattern) { log.info("Добавлен новый паттерн {} со значением {}", pattern.getName(), pattern.getValue()); + patterns.put(pattern.getId(), pattern); return repository.save(pattern); } diff --git a/src/main/java/ru/serega6531/packmate/service/ServicesService.java b/src/main/java/ru/serega6531/packmate/service/ServicesService.java index f921990..73b5a46 100644 --- a/src/main/java/ru/serega6531/packmate/service/ServicesService.java +++ b/src/main/java/ru/serega6531/packmate/service/ServicesService.java @@ -2,14 +2,13 @@ package ru.serega6531.packmate.service; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.CachePut; -import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import ru.serega6531.packmate.model.CtfService; import ru.serega6531.packmate.repository.ServiceRepository; -import java.util.List; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import java.util.Optional; @Service @@ -17,40 +16,42 @@ import java.util.Optional; public class ServicesService { private final ServiceRepository repository; + private final Map services = new HashMap<>(); @Autowired public ServicesService(ServiceRepository repository) { this.repository = repository; + repository.findAll().forEach(s -> services.put(s.getPort(), s)); + log.info("Loaded {} services", services.size()); } public Optional findService(String localIp, String firstIp, int firstPort, String secondIp, int secondPort) { - if(firstIp.equals(localIp)) { + if (firstIp.equals(localIp)) { return findByPort(firstPort); - } else if(secondIp.equals(localIp)) { + } else if (secondIp.equals(localIp)) { return findByPort(secondPort); } return Optional.empty(); } - @Cacheable("services") public Optional findByPort(int port) { - return repository.findById(port); + return Optional.ofNullable(services.get(port)); } - public List findAll() { - return repository.findAll(); + public Collection findAll() { + return services.values(); } - @CacheEvict("services") public void deleteByPort(int port) { log.info("Удален сервис на порту {}", port); + services.remove(port); repository.deleteById(port); } - @CachePut("services") public CtfService save(CtfService service) { log.info("Добавлен новый сервис {} на порту {}", service.getName(), service.getPort()); + services.put(service.getPort(), service); return repository.save(service); } diff --git a/src/main/java/ru/serega6531/packmate/service/StreamService.java b/src/main/java/ru/serega6531/packmate/service/StreamService.java index 00d73bb..24d3b8a 100644 --- a/src/main/java/ru/serega6531/packmate/service/StreamService.java +++ b/src/main/java/ru/serega6531/packmate/service/StreamService.java @@ -6,8 +6,6 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.cache.annotation.CachePut; -import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; @@ -176,17 +174,15 @@ public class StreamService { Stream savedStream = save(stream); - List savedPackets = new ArrayList<>(); Set matches = new HashSet<>(); for (ru.serega6531.packmate.model.Packet packet : packets) { packet.setStream(savedStream); - savedPackets.add(packetService.save(packet)); matches.addAll(patternService.findMatching(packet.getContent(), packet.isIncoming())); } savedStream.setFoundPatterns(new ArrayList<>(matches)); - savedStream.setPackets(savedPackets); + savedStream.setPackets(packetService.saveAll(packets)); savedStream = save(savedStream); subscriptionService.broadcastNewStream(savedStream); @@ -227,12 +223,10 @@ public class StreamService { return null; } - @CachePut(value = "streams", key = "#stream.id") public Stream save(Stream stream) { Stream saved; if (stream.getId() == null) { saved = repository.save(stream); - cachePackets(saved); log.debug("Создан стрим с id {}", saved.getId()); } else { saved = repository.save(stream); @@ -241,13 +235,6 @@ public class StreamService { return saved; } - @SuppressWarnings("UnusedReturnValue") - @CachePut(value = "packets", key = "#stream.id") - public List cachePackets(Stream stream) { - return stream.getPackets(); - } - - @Cacheable("streams") public Optional find(long id) { return repository.findById(id); } @@ -261,7 +248,6 @@ public class StreamService { @SuppressWarnings("UnusedReturnValue") @Transactional - @CachePut(value = "streams", key = "#id") public Stream setFavorite(long id, boolean favorite) { final Optional streamOptional = repository.findById(id); if (streamOptional.isPresent()) { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 2c7aaad..2137896 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -9,8 +9,11 @@ spring: ddl-auto: update properties: hibernate: + format_sql: true temp: use_jdbc_metadata_defaults: false + show-sql: true + enable-capture: true interface-name: enp0s31f6 @@ -18,7 +21,7 @@ local-ip: "192.168.0.125" account-login: BinaryBears account-password: 123456 udp-stream-timeout: 20 # секунд -tcp-stream-timeout: 120 # секунд +tcp-stream-timeout: 40 # секунд timeout-stream-check-interval: 10 # секунд ignore-empty-packets: true unpack-gzipped-http: true \ No newline at end of file