Добавлен PcapWorker

This commit is contained in:
serega6531
2019-04-28 02:21:13 +03:00
parent 8e2342f181
commit 8cb109ac7d
6 changed files with 106 additions and 6 deletions

View File

@@ -1,7 +1,10 @@
package ru.serega6531.packmate;
import org.pcap4j.core.PcapNativeException;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
@SpringBootApplication
public class PackmateApplication {
@@ -10,4 +13,10 @@ public class PackmateApplication {
SpringApplication.run(PackmateApplication.class, args);
}
@EventListener(ApplicationReadyEvent.class)
public void afterStartup(ApplicationReadyEvent event) throws PcapNativeException {
final PcapWorker pcapWorker = event.getApplicationContext().getBean(PcapWorker.class);
pcapWorker.start();
}
}

View File

@@ -0,0 +1,90 @@
package ru.serega6531.packmate;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.pcap4j.core.PcapHandle;
import org.pcap4j.core.PcapNativeException;
import org.pcap4j.core.PcapNetworkInterface;
import org.pcap4j.core.Pcaps;
import org.pcap4j.packet.Packet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import ru.serega6531.packmate.service.PacketService;
import ru.serega6531.packmate.service.PatternService;
import ru.serega6531.packmate.service.ServicesService;
import ru.serega6531.packmate.service.StreamService;
import javax.annotation.PreDestroy;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeoutException;
@Component
@Slf4j
public class PcapWorker {
private final ServicesService servicesService;
private final StreamService streamService;
private final PacketService packetService;
private final PatternService patternService;
private PcapNetworkInterface device;
private PcapHandle pcap = null;
private ExecutorService executorService;
@Autowired
public PcapWorker(ServicesService servicesService,
StreamService streamService,
PacketService packetService,
PatternService patternService,
@Value("${interface-name}") String interfaceName) throws PcapNativeException {
this.servicesService = servicesService;
this.streamService = streamService;
this.packetService = packetService;
this.patternService = patternService;
BasicThreadFactory factory = new BasicThreadFactory.Builder()
.namingPattern("pcap-worker").build();
executorService = Executors.newSingleThreadExecutor(factory);
device = Pcaps.getDevByName(interfaceName);
}
public void start() throws PcapNativeException {
System.out.println("Using interface " + device.getName());
pcap = device.openLive(65536, PcapNetworkInterface.PromiscuousMode.PROMISCUOUS, 100);
executorService.execute(() -> {
try {
log.info("Intercept started");
while (true) {
if (pcap.isOpen()) {
try {
final Packet packet = pcap.getNextPacketEx();
processPacket(packet);
} catch (TimeoutException ignored) {
}
} else {
break;
}
}
} catch (Exception e) {
log.error("Error while capturing packet", e);
stop();
}
});
}
@PreDestroy
public void stop() {
if (pcap != null && pcap.isOpen()) {
pcap.close();
}
log.info("Intercept stopped");
}
private void processPacket(Packet packet) {
System.out.println(packet);
}
}

View File

@@ -2,14 +2,12 @@ package ru.serega6531.packmate.model;
import lombok.Data;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.*;
import java.util.List;
@Data
@Entity
@Table(name = "service")
public class CtfService {
@Id

View File

@@ -2,7 +2,6 @@ package ru.serega6531.packmate.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.*;
import ru.serega6531.packmate.model.Pattern;
import ru.serega6531.packmate.repository.PatternRepository;