Verteilte_Systeme/src/main/java/vs/SyslogServer.java

84 lines
3.4 KiB
Java

package vs;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.nio.charset.StandardCharsets;
public class SyslogServer {
private static final int SYSLOG_PORT = 514;
private static final int DISCOVERY_PORT = 8888;
private static final int MAX_MESSAGE_LENGTH = 1024;
public static void main(String[] args) {
System.out.println("=== Syslog Server Management ===");
// Startet den Syslog-Server
new Thread(() -> runSyslogServer()).start();
// Startet den Discovery-Server
new Thread(() -> runDiscoveryServer()).start();
}
private static void runSyslogServer() {
try (DatagramSocket socket = new DatagramSocket(SYSLOG_PORT)) {
byte[] buffer = new byte[2048];
System.out.println("[INFO] Syslog-Dienst aktiv auf Port " + SYSLOG_PORT);
while (true) {
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
int length = packet.getLength();
if (length > MAX_MESSAGE_LENGTH) {
System.err.println("[WARN] Nachricht von " + packet.getAddress() + " zu lang. Ignoriert.");
continue;
}
String raw = new String(packet.getData(), 0, length, StandardCharsets.UTF_8);
String clean = raw.replace("\uFEFF", "").replace("", "");
// Trennung von Metadaten und Inhalt
int splitIndex = clean.lastIndexOf("]") + 1;
String metadata = "Unbekannt";
String messageContent = clean;
if (splitIndex > 0 && splitIndex < clean.length()) {
metadata = clean.substring(0, splitIndex).trim();
messageContent = clean.substring(splitIndex).trim();
}
String separator = "==================================================";
System.out.println("\n" + separator);
System.out.println("NEUE SYSLOG-NACHRICHT");
System.out.println("Quelle: " + packet.getAddress().getHostAddress() + ":" + packet.getPort());
System.out.println("Metadaten: " + metadata);
System.out.println("Inhalt: " + messageContent);
System.out.println(separator);
}
} catch (IOException e) {
System.err.println("[ERROR] Syslog-Server Fehler: " + e.getMessage());
}
}
private static void runDiscoveryServer() {
try (DatagramSocket socket = new DatagramSocket(DISCOVERY_PORT)) {
byte[] buffer = new byte[256];
System.out.println("[INFO] Discovery-Service aktiv auf Port " + DISCOVERY_PORT);
while (true) {
DatagramPacket request = new DatagramPacket(buffer, buffer.length);
socket.receive(request);
DatagramPacket response = new DatagramPacket(
new byte[0], 0, request.getAddress(), request.getPort()
);
socket.send(response);
System.out.println("[DISCOVERY] Server-IP an Client mit der IP [" + request.getAddress().getHostAddress() + "] gemeldet.");
}
} catch (IOException e) {
System.err.println("[ERROR] Discovery-Fehler: " + e.getMessage());
}
}
}