Тип паттерна IGNORE

This commit is contained in:
serega6531
2020-12-29 21:45:58 +03:00
parent 9e1a01fe51
commit 2026f370ee
11 changed files with 68 additions and 24 deletions

View File

@@ -3,9 +3,7 @@ package ru.serega6531.packmate.model;
import lombok.*;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.*;
@Entity
@GenericGenerator(
@@ -22,13 +20,18 @@ import javax.persistence.Id;
@Builder
@Getter
@ToString
@EqualsAndHashCode
@EqualsAndHashCode(exclude = "packet")
public class FoundPattern {
@Id
@GeneratedValue(generator = "found_pattern_generator")
private int id;
@ManyToOne
@JoinColumn(name = "packet_id", nullable = false)
@Setter
private Packet packet;
private int patternId;
private int startPosition;

View File

@@ -1,9 +1,6 @@
package ru.serega6531.packmate.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.*;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
@@ -24,6 +21,7 @@ import java.util.Set;
@AllArgsConstructor
@Builder
@Table(indexes = { @Index(name = "stream_id_index", columnList = "stream_id") })
@EqualsAndHashCode(exclude = "stream")
public class Packet {
@Id
@@ -40,7 +38,7 @@ public class Packet {
@JoinColumn(name = "stream_id", nullable = false)
private Stream stream;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@OneToMany(mappedBy = "packet", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<FoundPattern> matches;
private long timestamp;

View File

@@ -3,6 +3,7 @@ package ru.serega6531.packmate.model;
import lombok.Data;
import lombok.ToString;
import org.hibernate.annotations.GenericGenerator;
import ru.serega6531.packmate.model.enums.PatternActionType;
import ru.serega6531.packmate.model.enums.PatternDirectionType;
import ru.serega6531.packmate.model.enums.PatternSearchType;
@@ -39,6 +40,8 @@ public class Pattern {
private PatternDirectionType directionType;
private PatternActionType actionType;
@ManyToMany(mappedBy = "foundPatterns", fetch = FetchType.LAZY)
private List<Stream> matchedStreams;

View File

@@ -0,0 +1,5 @@
package ru.serega6531.packmate.model.enums;
public enum PatternActionType {
FIND, IGNORE
}

View File

@@ -1,6 +1,7 @@
package ru.serega6531.packmate.model.pojo;
import lombok.Data;
import ru.serega6531.packmate.model.enums.PatternActionType;
import ru.serega6531.packmate.model.enums.PatternDirectionType;
import ru.serega6531.packmate.model.enums.PatternSearchType;
@@ -11,8 +12,9 @@ public class PatternDto {
private boolean enabled;
private String name;
private String value;
private String color; // для вставки в css
private String color;
private PatternSearchType searchType;
private PatternDirectionType directionType;
private PatternActionType actionType;
}

View File

@@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ru.serega6531.packmate.model.FoundPattern;
import ru.serega6531.packmate.model.Pattern;
import ru.serega6531.packmate.model.enums.PatternActionType;
import ru.serega6531.packmate.model.enums.PatternDirectionType;
import ru.serega6531.packmate.model.enums.PatternSearchType;
import ru.serega6531.packmate.model.enums.SubscriptionMessageType;
@@ -45,11 +46,11 @@ public class PatternService {
return patterns.values();
}
public Set<FoundPattern> findMatches(byte[] bytes, boolean incoming) {
public Set<FoundPattern> findMatches(byte[] bytes, PatternDirectionType directionType, PatternActionType actionType) {
final List<Pattern> list = patterns.values().stream()
.filter(Pattern::isEnabled)
.filter(p -> p.getDirectionType() == (incoming ? PatternDirectionType.INPUT : PatternDirectionType.OUTPUT)
|| p.getDirectionType() == PatternDirectionType.BOTH)
.filter(p -> p.getActionType() == actionType)
.filter(p -> p.getDirectionType() == directionType || p.getDirectionType() == PatternDirectionType.BOTH)
.collect(Collectors.toList());
return new PatternMatcher(bytes, list).findMatches();
}

View File

@@ -11,6 +11,8 @@ 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.PatternActionType;
import ru.serega6531.packmate.model.enums.PatternDirectionType;
import ru.serega6531.packmate.model.enums.SubscriptionMessageType;
import ru.serega6531.packmate.model.pojo.*;
import ru.serega6531.packmate.repository.StreamRepository;
@@ -99,11 +101,20 @@ public class StreamService {
countingService.countStream(service.getPort(), packets.size());
packets = new StreamOptimizer(keysHolder, service, packets).optimizeStream();
processUserAgent(packets, stream);
if (isStreamIgnored(packets)) {
log.debug("New stream is ignored");
return false;
}
processUserAgent(packets, stream);
Stream savedStream = save(stream);
Set<Pattern> foundPatterns = getFoundPatterns(packets, savedStream);
for (Packet packet : packets) {
packet.setStream(savedStream);
}
Set<Pattern> foundPatterns = matchPatterns(packets);
savedStream.setFoundPatterns(foundPatterns);
savedStream.setPackets(packets);
savedStream = save(savedStream);
@@ -139,13 +150,16 @@ public class StreamService {
return "" + alphabet[hash % l] + alphabet[(hash / l) % l] + alphabet[(hash / (l * l)) % l];
}
private Set<Pattern> getFoundPatterns(List<Packet> packets, Stream savedStream) {
private Set<Pattern> matchPatterns(List<Packet> packets) {
Set<Pattern> foundPatterns = new HashSet<>();
for (Packet packet : packets) {
packet.setStream(savedStream);
final Set<FoundPattern> matches = patternService.findMatches(packet.getContent(), packet.isIncoming());
PatternDirectionType direction = packet.isIncoming() ? PatternDirectionType.INPUT : PatternDirectionType.OUTPUT;
final Set<FoundPattern> matches = patternService.findMatches(packet.getContent(), direction, PatternActionType.FIND);
packet.setMatches(matches);
matches.forEach(m -> m.setPacket(packet));
foundPatterns.addAll(matches.stream()
.map(FoundPattern::getPatternId)
.map(patternService::find)
@@ -155,6 +169,18 @@ public class StreamService {
return foundPatterns;
}
private boolean isStreamIgnored(List<Packet> packets) {
for (Packet packet : packets) {
PatternDirectionType direction = packet.isIncoming() ? PatternDirectionType.INPUT : PatternDirectionType.OUTPUT;
final Set<FoundPattern> matches = patternService.findMatches(packet.getContent(), direction, PatternActionType.IGNORE);
if (!matches.isEmpty()) {
return true;
}
}
return false;
}
private Stream save(Stream stream) {
Stream saved;
if (stream.getId() == null) {