Изменено кэширование
This commit is contained in:
@@ -24,7 +24,6 @@ dependencies {
|
|||||||
implementation 'org.springframework.boot:spring-boot-starter-web'
|
implementation 'org.springframework.boot:spring-boot-starter-web'
|
||||||
implementation "org.springframework.boot:spring-boot-starter-security"
|
implementation "org.springframework.boot:spring-boot-starter-security"
|
||||||
implementation "org.springframework.boot:spring-boot-starter-websocket"
|
implementation "org.springframework.boot:spring-boot-starter-websocket"
|
||||||
implementation 'org.springframework.boot:spring-boot-starter-cache'
|
|
||||||
implementation 'org.springframework.session:spring-session-core'
|
implementation 'org.springframework.session:spring-session-core'
|
||||||
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.7'
|
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.7'
|
||||||
compile group: 'commons-io', name: 'commons-io', version: '2.6'
|
compile group: 'commons-io', name: 'commons-io', version: '2.6'
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import org.springframework.web.bind.annotation.*;
|
|||||||
import ru.serega6531.packmate.model.Pattern;
|
import ru.serega6531.packmate.model.Pattern;
|
||||||
import ru.serega6531.packmate.service.PatternService;
|
import ru.serega6531.packmate.service.PatternService;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.Collection;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/api/pattern/")
|
@RequestMapping("/api/pattern/")
|
||||||
@@ -19,7 +19,7 @@ public class PatternController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping
|
@GetMapping
|
||||||
public List<Pattern> getPatterns() {
|
public Collection<Pattern> getPatterns() {
|
||||||
return service.findAll();
|
return service.findAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import org.springframework.web.bind.annotation.*;
|
|||||||
import ru.serega6531.packmate.model.CtfService;
|
import ru.serega6531.packmate.model.CtfService;
|
||||||
import ru.serega6531.packmate.service.ServicesService;
|
import ru.serega6531.packmate.service.ServicesService;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.Collection;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/api/service/")
|
@RequestMapping("/api/service/")
|
||||||
@@ -19,7 +19,7 @@ public class ServiceController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping
|
@GetMapping
|
||||||
public List<CtfService> getServices() {
|
public Collection<CtfService> getServices() {
|
||||||
return service.findAll();
|
return service.findAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package ru.serega6531.packmate.repository;
|
package ru.serega6531.packmate.repository;
|
||||||
|
|
||||||
import org.springframework.data.domain.Pageable;
|
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import ru.serega6531.packmate.model.Packet;
|
import ru.serega6531.packmate.model.Packet;
|
||||||
import ru.serega6531.packmate.model.Stream;
|
import ru.serega6531.packmate.model.Stream;
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package ru.serega6531.packmate.service;
|
package ru.serega6531.packmate.service;
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.cache.annotation.Cacheable;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import ru.serega6531.packmate.model.Packet;
|
import ru.serega6531.packmate.model.Packet;
|
||||||
import ru.serega6531.packmate.model.Stream;
|
import ru.serega6531.packmate.model.Stream;
|
||||||
@@ -19,13 +18,12 @@ public class PacketService {
|
|||||||
this.repository = repository;
|
this.repository = repository;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Cacheable(value = "packets", key = "#stream.id")
|
|
||||||
public List<Packet> getPacketsForStream(Stream stream) {
|
public List<Packet> getPacketsForStream(Stream stream) {
|
||||||
return repository.findAllByStream(stream);
|
return repository.findAllByStream(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Packet save(Packet packet) {
|
public List<Packet> saveAll(List<Packet> packets) {
|
||||||
return repository.save(packet);
|
return repository.saveAll(packets);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,10 +11,7 @@ import ru.serega6531.packmate.model.PatternType;
|
|||||||
import ru.serega6531.packmate.model.Stream;
|
import ru.serega6531.packmate.model.Stream;
|
||||||
import ru.serega6531.packmate.repository.PatternRepository;
|
import ru.serega6531.packmate.repository.PatternRepository;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@@ -24,22 +21,27 @@ public class PatternService {
|
|||||||
private final PatternRepository repository;
|
private final PatternRepository repository;
|
||||||
private final StreamService streamService;
|
private final StreamService streamService;
|
||||||
|
|
||||||
private Map<String, java.util.regex.Pattern> compiledPatterns = new HashMap<>();
|
private final Map<Integer, Pattern> patterns = new HashMap<>();
|
||||||
|
private final Map<String, java.util.regex.Pattern> compiledPatterns = new HashMap<>();
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public PatternService(PatternRepository repository, @Lazy StreamService streamService) {
|
public PatternService(PatternRepository repository, @Lazy StreamService streamService) {
|
||||||
this.repository = repository;
|
this.repository = repository;
|
||||||
this.streamService = streamService;
|
this.streamService = streamService;
|
||||||
|
repository.findAll().forEach(p -> patterns.put(p.getId(), p));
|
||||||
|
log.info("Loaded {} patterns", patterns.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Pattern> findAll() {
|
public Collection<Pattern> findAll() {
|
||||||
return repository.findAll();
|
return patterns.values();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Pattern> findMatching(byte[] bytes, boolean incoming) {
|
public List<Pattern> findMatching(byte[] bytes, boolean incoming) {
|
||||||
String content = new String(bytes);
|
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))
|
.filter(pattern -> matches(pattern, content))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
@@ -66,12 +68,15 @@ public class PatternService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pattern.getMatchedStreams().clear();
|
pattern.getMatchedStreams().clear();
|
||||||
|
patterns.remove(pattern.getId());
|
||||||
|
compiledPatterns.remove(pattern.getValue());
|
||||||
repository.delete(pattern);
|
repository.delete(pattern);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Pattern save(Pattern pattern) {
|
public Pattern save(Pattern pattern) {
|
||||||
log.info("Добавлен новый паттерн {} со значением {}", pattern.getName(), pattern.getValue());
|
log.info("Добавлен новый паттерн {} со значением {}", pattern.getName(), pattern.getValue());
|
||||||
|
patterns.put(pattern.getId(), pattern);
|
||||||
return repository.save(pattern);
|
return repository.save(pattern);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,14 +2,13 @@ package ru.serega6531.packmate.service;
|
|||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
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 org.springframework.stereotype.Service;
|
||||||
import ru.serega6531.packmate.model.CtfService;
|
import ru.serega6531.packmate.model.CtfService;
|
||||||
import ru.serega6531.packmate.repository.ServiceRepository;
|
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;
|
import java.util.Optional;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@@ -17,10 +16,13 @@ import java.util.Optional;
|
|||||||
public class ServicesService {
|
public class ServicesService {
|
||||||
|
|
||||||
private final ServiceRepository repository;
|
private final ServiceRepository repository;
|
||||||
|
private final Map<Integer, CtfService> services = new HashMap<>();
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public ServicesService(ServiceRepository repository) {
|
public ServicesService(ServiceRepository repository) {
|
||||||
this.repository = repository;
|
this.repository = repository;
|
||||||
|
repository.findAll().forEach(s -> services.put(s.getPort(), s));
|
||||||
|
log.info("Loaded {} services", services.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
public Optional<CtfService> findService(String localIp, String firstIp, int firstPort, String secondIp, int secondPort) {
|
public Optional<CtfService> findService(String localIp, String firstIp, int firstPort, String secondIp, int secondPort) {
|
||||||
@@ -33,24 +35,23 @@ public class ServicesService {
|
|||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Cacheable("services")
|
|
||||||
public Optional<CtfService> findByPort(int port) {
|
public Optional<CtfService> findByPort(int port) {
|
||||||
return repository.findById(port);
|
return Optional.ofNullable(services.get(port));
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<CtfService> findAll() {
|
public Collection<CtfService> findAll() {
|
||||||
return repository.findAll();
|
return services.values();
|
||||||
}
|
}
|
||||||
|
|
||||||
@CacheEvict("services")
|
|
||||||
public void deleteByPort(int port) {
|
public void deleteByPort(int port) {
|
||||||
log.info("Удален сервис на порту {}", port);
|
log.info("Удален сервис на порту {}", port);
|
||||||
|
services.remove(port);
|
||||||
repository.deleteById(port);
|
repository.deleteById(port);
|
||||||
}
|
}
|
||||||
|
|
||||||
@CachePut("services")
|
|
||||||
public CtfService save(CtfService service) {
|
public CtfService save(CtfService service) {
|
||||||
log.info("Добавлен новый сервис {} на порту {}", service.getName(), service.getPort());
|
log.info("Добавлен новый сервис {} на порту {}", service.getName(), service.getPort());
|
||||||
|
services.put(service.getPort(), service);
|
||||||
return repository.save(service);
|
return repository.save(service);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,6 @@ import org.apache.commons.io.IOUtils;
|
|||||||
import org.apache.commons.lang3.ArrayUtils;
|
import org.apache.commons.lang3.ArrayUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
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.PageRequest;
|
||||||
import org.springframework.data.domain.Sort;
|
import org.springframework.data.domain.Sort;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@@ -176,17 +174,15 @@ public class StreamService {
|
|||||||
|
|
||||||
Stream savedStream = save(stream);
|
Stream savedStream = save(stream);
|
||||||
|
|
||||||
List<ru.serega6531.packmate.model.Packet> savedPackets = new ArrayList<>();
|
|
||||||
Set<Pattern> matches = new HashSet<>();
|
Set<Pattern> matches = new HashSet<>();
|
||||||
|
|
||||||
for (ru.serega6531.packmate.model.Packet packet : packets) {
|
for (ru.serega6531.packmate.model.Packet packet : packets) {
|
||||||
packet.setStream(savedStream);
|
packet.setStream(savedStream);
|
||||||
savedPackets.add(packetService.save(packet));
|
|
||||||
matches.addAll(patternService.findMatching(packet.getContent(), packet.isIncoming()));
|
matches.addAll(patternService.findMatching(packet.getContent(), packet.isIncoming()));
|
||||||
}
|
}
|
||||||
|
|
||||||
savedStream.setFoundPatterns(new ArrayList<>(matches));
|
savedStream.setFoundPatterns(new ArrayList<>(matches));
|
||||||
savedStream.setPackets(savedPackets);
|
savedStream.setPackets(packetService.saveAll(packets));
|
||||||
savedStream = save(savedStream);
|
savedStream = save(savedStream);
|
||||||
|
|
||||||
subscriptionService.broadcastNewStream(savedStream);
|
subscriptionService.broadcastNewStream(savedStream);
|
||||||
@@ -227,12 +223,10 @@ public class StreamService {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@CachePut(value = "streams", key = "#stream.id")
|
|
||||||
public Stream save(Stream stream) {
|
public Stream save(Stream stream) {
|
||||||
Stream saved;
|
Stream saved;
|
||||||
if (stream.getId() == null) {
|
if (stream.getId() == null) {
|
||||||
saved = repository.save(stream);
|
saved = repository.save(stream);
|
||||||
cachePackets(saved);
|
|
||||||
log.debug("Создан стрим с id {}", saved.getId());
|
log.debug("Создан стрим с id {}", saved.getId());
|
||||||
} else {
|
} else {
|
||||||
saved = repository.save(stream);
|
saved = repository.save(stream);
|
||||||
@@ -241,13 +235,6 @@ public class StreamService {
|
|||||||
return saved;
|
return saved;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("UnusedReturnValue")
|
|
||||||
@CachePut(value = "packets", key = "#stream.id")
|
|
||||||
public List<Packet> cachePackets(Stream stream) {
|
|
||||||
return stream.getPackets();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Cacheable("streams")
|
|
||||||
public Optional<Stream> find(long id) {
|
public Optional<Stream> find(long id) {
|
||||||
return repository.findById(id);
|
return repository.findById(id);
|
||||||
}
|
}
|
||||||
@@ -261,7 +248,6 @@ public class StreamService {
|
|||||||
|
|
||||||
@SuppressWarnings("UnusedReturnValue")
|
@SuppressWarnings("UnusedReturnValue")
|
||||||
@Transactional
|
@Transactional
|
||||||
@CachePut(value = "streams", key = "#id")
|
|
||||||
public Stream setFavorite(long id, boolean favorite) {
|
public Stream setFavorite(long id, boolean favorite) {
|
||||||
final Optional<Stream> streamOptional = repository.findById(id);
|
final Optional<Stream> streamOptional = repository.findById(id);
|
||||||
if (streamOptional.isPresent()) {
|
if (streamOptional.isPresent()) {
|
||||||
|
|||||||
@@ -9,8 +9,11 @@ spring:
|
|||||||
ddl-auto: update
|
ddl-auto: update
|
||||||
properties:
|
properties:
|
||||||
hibernate:
|
hibernate:
|
||||||
|
format_sql: true
|
||||||
temp:
|
temp:
|
||||||
use_jdbc_metadata_defaults: false
|
use_jdbc_metadata_defaults: false
|
||||||
|
show-sql: true
|
||||||
|
|
||||||
|
|
||||||
enable-capture: true
|
enable-capture: true
|
||||||
interface-name: enp0s31f6
|
interface-name: enp0s31f6
|
||||||
@@ -18,7 +21,7 @@ local-ip: "192.168.0.125"
|
|||||||
account-login: BinaryBears
|
account-login: BinaryBears
|
||||||
account-password: 123456
|
account-password: 123456
|
||||||
udp-stream-timeout: 20 # секунд
|
udp-stream-timeout: 20 # секунд
|
||||||
tcp-stream-timeout: 120 # секунд
|
tcp-stream-timeout: 40 # секунд
|
||||||
timeout-stream-check-interval: 10 # секунд
|
timeout-stream-check-interval: 10 # секунд
|
||||||
ignore-empty-packets: true
|
ignore-empty-packets: true
|
||||||
unpack-gzipped-http: true
|
unpack-gzipped-http: true
|
||||||
Reference in New Issue
Block a user