diff --git a/src/main/java/vs/SyslogServer.java b/src/main/java/vs/SyslogServer.java index 025443e..6a15ac4 100644 --- a/src/main/java/vs/SyslogServer.java +++ b/src/main/java/vs/SyslogServer.java @@ -6,7 +6,6 @@ import java.net.InetAddress; import java.nio.charset.StandardCharsets; import java.io.IOException; - public class SyslogServer { public static void main(String[] args) { int port = 5514; // Default syslog port: 514, but using 5514 to avoid permission issues @@ -14,53 +13,88 @@ public class SyslogServer { server.start(port); } + private void runDiscoveryListener() { + try { + DatagramSocket discoverySocket = new DatagramSocket(8888); // Port for discovery + + byte[] bufferDiscovery = new byte[256]; + + System.out.println("Discovery Listener started on port 8888"); + + while (true) { + DatagramPacket discoveryRequest = new DatagramPacket(bufferDiscovery, bufferDiscovery.length); + discoverySocket.receive(discoveryRequest); + + InetAddress clientAddress = discoveryRequest.getAddress(); + int clientPort = discoveryRequest.getPort(); + + System.out.println( + "Discovery request received from: " + clientAddress.getHostAddress() + ":" + clientPort); + + // Send a response back to the client + byte[] responseData = "SYSLOG_SERVER".getBytes(StandardCharsets.UTF_8); + DatagramPacket discoveryResponse = new DatagramPacket( + responseData, + responseData.length, + clientAddress, + clientPort); + + discoverySocket.send(discoveryResponse); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + private static final int MAX_MESSAGE_SIZE = 480; - + public void start(int port) { System.out.println("Syslog Server started on port " + port); + // Discovery Listener in a separate thread + new Thread(() -> runDiscoveryListener()).start(); - - try{ + try { // Create a DatagramSocket to listen for incoming messages DatagramSocket socket = new DatagramSocket(port); // Buffer to hold incoming messages byte[] buffer = new byte[1024]; - while(true){ + while (true) { DatagramPacket packet = new DatagramPacket(buffer, buffer.length); - + // Wait for a message to be received (blocking call) socket.receive(packet); - - // Extract the message from the packet + data; how many bytes were actually received + + // Extract the message from the packet + data; how many bytes were actually + // received int length = packet.getLength(); - if (length > MAX_MESSAGE_SIZE) { - System.err.println("Received message exceeds maximum allowed size of " + MAX_MESSAGE_SIZE + " bytes. Message will be ignored."); + System.err.println("Received message exceeds maximum allowed size of " + MAX_MESSAGE_SIZE + + " bytes. Message will be ignored."); continue; // Skip processing this message } - String message = new String( - packet.getData(), // complete byte array be aware: packet.getData() returns the entire buffer, not just the received data - packet.getOffset(), // get the offset where the data starts - length, - StandardCharsets.UTF_8); // Convert the byte array to a string using UTF-8 encoding - - System.out.println("Nachricht received: " + message); + String message = new String( + packet.getData(), // complete byte array be aware: packet.getData() returns the entire buffer, + // not just the received data + packet.getOffset(), // get the offset where the data starts + length, + StandardCharsets.UTF_8); // Convert the byte array to a string using UTF-8 encoding // Show Client IP and Port InetAddress clientAddress = packet.getAddress(); int clientPort = packet.getPort(); System.out.println("From: " + clientAddress.getHostAddress() + ":" + clientPort); - } - + System.out.println("Message received: " + message); + } + } - catch(IOException e){ + catch (IOException e) { System.err.println("Could not start server: " + e.getMessage()); return; } diff --git a/src/test/java/vs/AsciiChars.java b/src/test/java/vs/AsciiChars.java deleted file mode 100644 index bdd005b..0000000 --- a/src/test/java/vs/AsciiChars.java +++ /dev/null @@ -1,87 +0,0 @@ -package vs; - -/** - * helper class for RFC 5424 (https://datatracker.ietf.org/doc/html/rfc5424) - * compliant log messages as immutable Java objects - representation of a subset - * of printable strings of specific length - * - * @author Sandro Leuchter - * - */ -public abstract class AsciiChars { - - private final String value; - - public String value() { - return this.value; - } - - protected AsciiChars(int length, String value) { - if (value != null) { - if (value.length() > length) { - throw new IllegalArgumentException( - "Stringlänge = " + value.length() + " > " + length - ); - } - for (int c : value.getBytes()) { - if (c < 33 || c > 126) { - throw new IllegalArgumentException( - "Stringinhalt nicht printable US-ASCII ohne Space" - ); - } - } - } - this.value = value; - } - - @Override - public String toString() { - if (value() == null || value().length() == 0) { - return "-"; - } else { - return value(); - } - } - - public static final class L004 extends AsciiChars { - - public L004(String value) { - super(4, value); - } - } - - public static final class L012 extends AsciiChars { - - public L012(String value) { - super(12, value); - } - } - - public static final class L032 extends AsciiChars { - - public L032(String value) { - super(32, value); - } - } - - public static final class L048 extends AsciiChars { - - public L048(String value) { - super(48, value); - } - } - - public static final class L128 extends AsciiChars { - - public L128(String value) { - super(128, value); - } - } - - public static final class L255 extends AsciiChars { - - public L255(String value) { - super(255, value); - } - } -}