diff --git a/agent/pom.xml b/agent/pom.xml index fa1068d..36215b7 100644 --- a/agent/pom.xml +++ b/agent/pom.xml @@ -37,6 +37,16 @@ de.codecentric spring-boot-admin-starter-client + + + + + com.github.oshi + oshi-core-java11 + 6.4.0 + + + diff --git a/agent/src/test/java/io/wdd/agent/OSHITest.java b/agent/src/test/java/io/wdd/agent/OSHITest.java new file mode 100644 index 0000000..fb53452 --- /dev/null +++ b/agent/src/test/java/io/wdd/agent/OSHITest.java @@ -0,0 +1,117 @@ +package io.wdd.agent; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import oshi.SystemInfo; +import oshi.hardware.*; +import oshi.software.os.OSFileStore; +import oshi.software.os.OperatingSystem; +import oshi.util.tuples.Pair; + +import java.io.File; +import java.net.URISyntaxException; +import java.util.List; + +@SpringBootTest +public class OSHITest { + + @Test + void getSystemHardwareInfo(){ + + // Jackson ObjectMapper + ObjectMapper mapper = new ObjectMapper(); + + + // https://www.oshi.ooo/oshi-core-java11/apidocs/com.github.oshi/module-summary.html + // Fetch some OSHI objects + SystemInfo si = new SystemInfo(); + HardwareAbstractionLayer hal = si.getHardware(); + + try { + // print all + System.out.println("JSON for All info:"); + System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(hal)); + + // Pretty print computer system + System.out.println("JSON for CPU:"); + CentralProcessor cpu = hal.getProcessor(); + System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(cpu)); + + System.out.println(); + // Print memory + System.out.println("JSON for Memory:"); + GlobalMemory mem = hal.getMemory(); + System.out.println(mapper.writeValueAsString(mem)); + + } catch (JsonProcessingException e) { + System.out.println("Exception encountered: " + e.getMessage()); + } + + } + + + + @Test + void DiskStoreForPath() throws URISyntaxException { + // Use the arg as a file path or get this class's path + String filePath = new File(OSHITest.class.getProtectionDomain().getCodeSource().getLocation().toURI()) + .getPath(); + System.out.println("Searching stores for path: " + filePath); + + SystemInfo si = new SystemInfo(); + HardwareAbstractionLayer hal = si.getHardware(); + List diskStores = hal.getDiskStores(); + Pair dsPartIdx = getDiskStoreAndPartitionForPath(filePath, diskStores); + int dsIndex = dsPartIdx.getA(); + int partIndex = dsPartIdx.getB(); + + System.out.println(); + System.out.println("DiskStore index " + dsIndex + " and Partition index " + partIndex); + if (dsIndex >= 0 && partIndex >= 0) { + System.out.println(diskStores.get(dsIndex)); + System.out.println(" |-- " + diskStores.get(dsIndex).getPartitions().get(partIndex)); + } else { + System.out.println("Couldn't find that path on a partition."); + } + + OperatingSystem os = si.getOperatingSystem(); + List fileStores = os.getFileSystem().getFileStores(); + int fsIndex = getFileStoreForPath(filePath, fileStores); + + System.out.println(); + System.out.println("FileStore index " + fsIndex); + if (fsIndex >= 0) { + System.out.println(fileStores.get(fsIndex)); + } else { + System.out.println("Couldn't find that path on a filestore."); + } + } + + private static Pair getDiskStoreAndPartitionForPath(String path, List diskStores) { + for (int ds = 0; ds < diskStores.size(); ds++) { + HWDiskStore store = diskStores.get(ds); + List parts = store.getPartitions(); + for (int part = 0; part < parts.size(); part++) { + String mount = parts.get(part).getMountPoint(); + if (!mount.isEmpty() && path.substring(0, mount.length()).equalsIgnoreCase(mount)) { + return new Pair<>(ds, part); + } + } + } + return new Pair<>(-1, -1); + } + + private static int getFileStoreForPath(String path, List fileStores) { + for (int fs = 0; fs < fileStores.size(); fs++) { + String mount = fileStores.get(fs).getMount(); + if (!mount.isEmpty() && path.substring(0, mount.length()).equalsIgnoreCase(mount)) { + return fs; + } + } + return -1; + } + + +}