override fun extract()

in src/main/kotlin/com/github/mkartashev/hserr/miner/artifact/System.kt [54:119]


    override fun extract(log: HsErrLog): SystemArtifact {
        val locations = mutableSetOf<TextRange>()
        val systemSelection = log.start
            .moveToLineWith("---------------  S Y S T E M").moveToNextLine()
            .selectUpToLineWith("END.")
        if (systemSelection.isEmpty()) fail("Couldn't find SYSTEM marker")

        val unameSelection = systemSelection.start.moveToLineStartsWithString("OS:")
            .moveToNextLine().selectUpToEOL()
        val uname = unameSelection.toString()
        if (!unameSelection.isEmpty()) locations.add(unameSelection)

        val cpuCountSelection = systemSelection.start.moveToString("CPU: total", false)
            .moveToNextWord().selectCurrentWord()
        val cpuCount = cpuCountSelection.toString().toIntOrNull() ?: 0
        if (!cpuCountSelection.isEmpty()) locations.add(cpuCountSelection)

        val loadAverageSelection = systemSelection.start.moveToString("load average: ", false)
            .selectUpToEOL()
        val loadAverage =
            if (loadAverageSelection.isEmpty()) emptyList() else loadAverageSelection.toString().split(" ")
                .map { (it.replace(',', '.').toFloatOrNull() ?: -1f) }
        if (!loadAverageSelection.isEmpty()) locations.add(loadAverageSelection)


        //     Memory: 16k page, physical 33554432k(903568k free), swap 2097152k(888640k free)
        val memorySelection = systemSelection.start.moveToLineStartsWithString("Memory: ")
            .moveToString("physical ", false).selectUpToEOL()
        val memoryTokens = memorySelection.toString().split(" ", "(", ")").filterNot { it.isBlank() }
        if (!memorySelection.isEmpty()) locations.add(memorySelection)

        val physMemoryTotalStr = memoryTokens.getOrElse(0) { "0" }
        val physMemoryFreeStr = memoryTokens.getOrElse(1) { "0" }

        val swapSelection = systemSelection.start.moveToLineStartsWithString("Memory: ")
            .moveToString(", swap ", false).selectUpToEOL()
        val swapTokens = swapSelection.toString().split(" ", "(", ")").filterNot { it.isBlank() }
        val swapTotalStr = swapTokens.getOrElse(0) { "-1" }
        val swapFreeStr = swapTokens.getOrElse(1) { "-1" }
        if (!swapSelection.isEmpty()) locations.add(swapSelection)

        val physMemoryTotal = parseMemorySize(physMemoryTotalStr) ?: Artifact.DEFAULT_ULONG
        val physMemoryFree = parseMemorySize(physMemoryFreeStr) ?: Artifact.DEFAULT_ULONG
        val swapTotal = parseMemorySize(swapTotalStr) ?: Artifact.DEFAULT_ULONG
        val swapFree = parseMemorySize(swapFreeStr) ?: Artifact.DEFAULT_ULONG

        val system = systemSelection.toString()
        val isVirtual = system.contains("Xen hardware-assisted virtualization detected")
                || system.contains("Xen optimized paravirtualization detected")
                || system.contains("KVM virtualization detected")
                || system.contains("VMWare virtualization detected")
                || system.contains("Hyper-V virtualization detected")

        return SystemArtifact(
            log,
            locations,
            uname,
            cpuCount,
            isVirtual,
            physMemoryTotal,
            physMemoryFree,
            swapTotal,
            swapFree,
            loadAverage
        )
    }