From 7c7303ed9662c2159e3fd59496e213620beec250 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Prante?= Date: Sun, 15 Nov 2020 22:28:56 +0100 Subject: [PATCH] starting work on systemd-journal-jna --- gradle/test/junit5.gradle | 3 +- .../org/xbib/systemd/journal/SdJournal.java | 1 + .../journal/SystemdJournalConsumer.java | 39 ++++++++++++------- .../journal/SystemdJournalReaderTest.java | 5 +-- .../src/test/resources/logging.properties | 8 ++++ 5 files changed, 36 insertions(+), 20 deletions(-) create mode 100644 systemd-journal-jna/src/test/resources/logging.properties diff --git a/gradle/test/junit5.gradle b/gradle/test/junit5.gradle index f994dba..44b1e05 100644 --- a/gradle/test/junit5.gradle +++ b/gradle/test/junit5.gradle @@ -1,5 +1,5 @@ -def junitVersion = project.hasProperty('junit.version')?project.property('junit.version'):'5.6.2' +def junitVersion = project.hasProperty('junit.version')?project.property('junit.version'):'5.7.0' def hamcrestVersion = project.hasProperty('hamcrest.version')?project.property('hamcrest.version'):'2.2' dependencies { @@ -14,6 +14,7 @@ test { systemProperty 'jna.debug_load', 'true' failFast = true testLogging { + showStandardStreams = true events 'STARTED', 'PASSED', 'FAILED', 'SKIPPED' } afterSuite { desc, result -> diff --git a/systemd-journal-jna/src/main/java/org/xbib/systemd/journal/SdJournal.java b/systemd-journal-jna/src/main/java/org/xbib/systemd/journal/SdJournal.java index 2fa2a0e..92d2c0c 100644 --- a/systemd-journal-jna/src/main/java/org/xbib/systemd/journal/SdJournal.java +++ b/systemd-journal-jna/src/main/java/org/xbib/systemd/journal/SdJournal.java @@ -3,4 +3,5 @@ package org.xbib.systemd.journal; import com.sun.jna.Structure; public class SdJournal extends Structure { + public int toplevel_fd; } diff --git a/systemd-journal-jna/src/main/java/org/xbib/systemd/journal/SystemdJournalConsumer.java b/systemd-journal-jna/src/main/java/org/xbib/systemd/journal/SystemdJournalConsumer.java index 6ab9380..ea76a0c 100644 --- a/systemd-journal-jna/src/main/java/org/xbib/systemd/journal/SystemdJournalConsumer.java +++ b/systemd-journal-jna/src/main/java/org/xbib/systemd/journal/SystemdJournalConsumer.java @@ -46,39 +46,47 @@ public class SystemdJournalConsumer implements Runnable { private void loop() throws IOException { SystemdLibraryAPI api = SystemdLibraryAPI.getInstance(); - SdJournal sdJournal = new SdJournal() { - @Override - public int hashCode() { - return super.hashCode(); - } - }; + SdJournal sdJournal = new SdJournal(); + logger.log(Level.INFO, "opening"); int rc = api.sd_journal_open(sdJournal, SD_JOURNAL_LOCAL_ONLY); - if (rc < 0) { + logger.log(Level.INFO, "open: " + rc); + if (rc != 0) { logger.log(Level.WARNING, "error opening journal for read: " + rc); + return; } if (match != null) { rc = api.sd_journal_add_match(sdJournal, match, match.length()); - if (rc < 0) { + logger.log(Level.INFO, "add_match: " + rc); + if (rc != 0) { logger.log(Level.WARNING, "error in add_match: " + rc); + return; } } rc = api.sd_journal_get_fd(sdJournal); + logger.log(Level.INFO, "get_fd: " + rc); rc = api.sd_journal_seek_tail(sdJournal); + logger.log(Level.INFO, "seek_tail: " + rc); rc = api.sd_journal_previous(sdJournal); + logger.log(Level.INFO, "previous: " + rc); rc = api.sd_journal_next(sdJournal); + logger.log(Level.INFO, "next: " + rc); String[] strings = new String[1]; StringArray cursor = new StringArray(strings); - api.sd_journal_get_cursor(sdJournal, cursor); + rc = api.sd_journal_get_cursor(sdJournal, cursor); + logger.log(Level.INFO, "get_cursor: " + rc); while (true) { do { rc = api.sd_journal_wait(sdJournal, -1); + logger.log(Level.INFO, "wait: " + rc); } while (rc == 0); // NOP - while (api.sd_journal_next(sdJournal) > 0) { + while ((rc = api.sd_journal_next(sdJournal)) > 0) { + logger.log(Level.INFO, "next: " + rc); if (field != null) { Pointer dataPointer = new Memory(Native.POINTER_SIZE); Pointer sizePointer = new Memory(Native.POINTER_SIZE); rc = api.sd_journal_get_data(sdJournal, field, dataPointer, sizePointer); - if (rc < 0) { + logger.log(Level.INFO, "get_data: " + rc); + if (rc != 0) { throw new IOException("error in get_data: " + rc); } int size = sizePointer.getInt(0); @@ -90,21 +98,22 @@ public class SystemdJournalConsumer implements Runnable { } else { String[] strings2 = new String[1]; StringArray nextCursor = new StringArray(strings2); - api.sd_journal_get_cursor(sdJournal, nextCursor); + rc = api.sd_journal_get_cursor(sdJournal, nextCursor); + logger.log(Level.INFO, "get_cursor: " + rc); if (!cursor.getString(0).equals(nextCursor.getString(0))) { cursor = nextCursor; Pointer dataPointer = new Memory(Native.POINTER_SIZE); Pointer sizePointer = new Memory(Native.POINTER_SIZE); List list = new ArrayList<>(); - while (api.sd_journal_enumerate_data(sdJournal, dataPointer, sizePointer) > 0) { - //Pointer data = dataPointer.as(Byte.class); - //String line = data.getPointer(Byte.class).getCString(); + while ((rc = api.sd_journal_enumerate_data(sdJournal, dataPointer, sizePointer)) > 0) { + logger.log(Level.INFO, "enumerate_data: " + rc); int size = sizePointer.getInt(0); byte[] b = dataPointer.getByteArray(0, size); String s = new String(b, StandardCharsets.UTF_8); list.add(s); } rc = api.sd_journal_restart_data(sdJournal); + logger.log(Level.INFO, "restart_data: " + rc); if (listener != null) { listener.handleEntry(makeEntry(list)); } diff --git a/systemd-journal-jna/src/test/java/org/xbib/systemd/journal/SystemdJournalReaderTest.java b/systemd-journal-jna/src/test/java/org/xbib/systemd/journal/SystemdJournalReaderTest.java index 1936dd3..4f9717e 100644 --- a/systemd-journal-jna/src/test/java/org/xbib/systemd/journal/SystemdJournalReaderTest.java +++ b/systemd-journal-jna/src/test/java/org/xbib/systemd/journal/SystemdJournalReaderTest.java @@ -20,15 +20,12 @@ public class SystemdJournalReaderTest { private static final Logger logger = Logger.getLogger(SystemdJournalReaderTest.class.getName()); - @Mock - private SystemdLibraryAPI api; - @Test void testConsumer() throws InterruptedException { SystemdJournalConsumer consumer = new SystemdJournalConsumer(null, entry -> logger.log(Level.INFO, entry.toString())); Executors.newSingleThreadExecutor().submit(consumer); // consuming for some seconds - Thread.sleep(10000L); + Thread.sleep(60000L); } } diff --git a/systemd-journal-jna/src/test/resources/logging.properties b/systemd-journal-jna/src/test/resources/logging.properties new file mode 100644 index 0000000..dbab971 --- /dev/null +++ b/systemd-journal-jna/src/test/resources/logging.properties @@ -0,0 +1,8 @@ +handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler +.level=ALL +java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS.%1$tL %4$-7s [%3$s] %5$s %6$s%n +java.util.logging.ConsoleHandler.level=ALL +java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter +java.util.logging.FileHandler.level=ALL +java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter +java.util.logging.FileHandler.pattern=build/test.log