lazybox: add lazybox
parent
d558c77755
commit
7c8e997ef9
@ -0,0 +1,47 @@
|
||||
/*
|
||||
* This file was generated by the Gradle 'init' task.
|
||||
*
|
||||
* This generated file contains a sample Kotlin application project to get you started.
|
||||
* For more details on building Java & JVM projects, please refer to https://docs.gradle.org/8.3/userguide/building_java_projects.html in the Gradle documentation.
|
||||
*/
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||
|
||||
plugins {
|
||||
kotlin("jvm") version "1.9.0"
|
||||
application
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation("org.apache.commons:commons-exec:1.3")
|
||||
implementation("com.fasterxml.jackson.core:jackson-annotations:2.14.0")
|
||||
implementation("com.fasterxml.jackson.core:jackson-databind:2.14.0")
|
||||
implementation("org.slf4j:slf4j-api:2.0.9")
|
||||
implementation("org.apache.commons:commons-compress:1.21")
|
||||
implementation(project(mapOf("path" to ":helper")))
|
||||
// Use the Kotlin JUnit 5 integration.
|
||||
testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")
|
||||
// Use the JUnit 5 integration.
|
||||
testImplementation("org.junit.jupiter:junit-jupiter-engine:5.9.3")
|
||||
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
|
||||
}
|
||||
|
||||
// Apply a specific Java toolchain to ease working on different environments.
|
||||
java {
|
||||
toolchain {
|
||||
languageVersion.set(JavaLanguageVersion.of(11))
|
||||
}
|
||||
}
|
||||
|
||||
application {
|
||||
// Define the main class for the application.
|
||||
mainClass.set("cfig.lazybox.AppKt")
|
||||
}
|
||||
|
||||
tasks.named<Test>("test") {
|
||||
// Use JUnit Platform for unit tests.
|
||||
useJUnitPlatform()
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
package cfig.lazybox
|
||||
|
||||
import cfig.lazybox.sysinfo.CpuInfo
|
||||
import cfig.lazybox.sysinfo.SysInfo
|
||||
import com.fasterxml.jackson.databind.ObjectMapper
|
||||
import org.slf4j.LoggerFactory
|
||||
import java.io.File
|
||||
import kotlin.system.exitProcess
|
||||
|
||||
class App
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val log = LoggerFactory.getLogger(App::class.java)
|
||||
if (args.isEmpty()) {
|
||||
println("Usage: args: (Array<String>) ...")
|
||||
println(" or: function [arguments]...")
|
||||
println("\nCurrently defined functions:")
|
||||
println("\tcpuinfo sysinfo")
|
||||
exitProcess(0)
|
||||
}
|
||||
if (args.get(0) == "cpuinfo") {
|
||||
val ret = CpuInfo.construct()
|
||||
File("cpuinfo.json").writeText(
|
||||
ObjectMapper()
|
||||
.writerWithDefaultPrettyPrinter()
|
||||
.writeValueAsString(ret)
|
||||
)
|
||||
log.info("cpuinfo.json is ready")
|
||||
}
|
||||
if (args.get(0) == "sysinfo") {
|
||||
SysInfo().run()
|
||||
}
|
||||
}
|
@ -0,0 +1,211 @@
|
||||
package cfig.lazybox.sysinfo
|
||||
|
||||
import cfig.helper.Helper
|
||||
import org.apache.commons.exec.ExecuteException
|
||||
import org.slf4j.LoggerFactory
|
||||
|
||||
class CpuInfo(
|
||||
val cpuinfo: RawCores,
|
||||
val policies: List<CpuFreqPolicy>,
|
||||
val onDemandGovernor: OndemandGovernor? = null,
|
||||
val conservativeGovernor: ConservativeGovernor? = null,
|
||||
val schedutilGovernor: SchedutilGovernor? = null,
|
||||
) {
|
||||
companion object {
|
||||
fun construct(): CpuInfo {
|
||||
val rawCores = RawCores.construct()
|
||||
rawCores.toCores()
|
||||
val policies = CpuFreqPolicy.construct()
|
||||
val onDemand = if (policies.any { it.scaling_governor == "ondemand" }) {
|
||||
OndemandGovernor.construct()
|
||||
} else {
|
||||
null
|
||||
}
|
||||
val conservative = if (policies.any { it.scaling_governor == "conservative" }) {
|
||||
try {
|
||||
ConservativeGovernor.construct()
|
||||
} catch (_: ExecuteException) {
|
||||
ConservativeGovernor.construct("/sys/devices/system/cpu/cpu0/cpufreq/conservative")
|
||||
}
|
||||
} else {
|
||||
null
|
||||
}
|
||||
val sched = if (policies.any { it.scaling_governor == "schedutil" }) {
|
||||
SchedutilGovernor.construct()
|
||||
} else {
|
||||
null
|
||||
}
|
||||
return CpuInfo(rawCores, policies, onDemand, conservative, sched)
|
||||
}
|
||||
|
||||
val getAdbCmdResult: (String, Boolean) -> String? = { cmd, check ->
|
||||
Helper.powerRun2(cmd, null).let {
|
||||
if (it[0] as Boolean) {
|
||||
String(it[1] as ByteArray)
|
||||
} else {
|
||||
if (check) {
|
||||
log.warn(String(it[1] as ByteArray))
|
||||
throw RuntimeException(String(it[2] as ByteArray))
|
||||
} else {
|
||||
log.warn(String(it[1] as ByteArray))
|
||||
log.warn(String(it[2] as ByteArray))
|
||||
}
|
||||
null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private val log = LoggerFactory.getLogger(CpuInfo::class.java)
|
||||
}
|
||||
|
||||
data class SchedutilGovernor(
|
||||
var rate_limit_us: Long = 0,
|
||||
) {
|
||||
companion object {
|
||||
fun construct(): SchedutilGovernor {
|
||||
val prefix = "/sys/devices/system/cpu/cpufreq/schedutil"
|
||||
return SchedutilGovernor(Helper.adbCmd("cat $prefix/rate_limit_us").toLong())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data class ConservativeGovernor(
|
||||
var down_threshold: Long = 0,
|
||||
var up_threshold: Long = 0,
|
||||
var ignore_nice_load: Long = 0,
|
||||
var sampling_rate: Long = 0,
|
||||
var sampling_down_factor: Long = 0,
|
||||
var freq_step: Long = 0,
|
||||
) {
|
||||
companion object {
|
||||
fun construct(prefix: String = "/sys/devices/system/cpu/cpufreq/conservative"): ConservativeGovernor {
|
||||
return ConservativeGovernor(
|
||||
Helper.adbCmd("cat $prefix/down_threshold").toLong(),
|
||||
Helper.adbCmd("cat $prefix/up_threshold").toLong(),
|
||||
Helper.adbCmd("cat $prefix/ignore_nice_load").toLong(),
|
||||
Helper.adbCmd("cat $prefix/sampling_rate").toLong(),
|
||||
Helper.adbCmd("cat $prefix/sampling_down_factor").toLong(),
|
||||
Helper.adbCmd("cat $prefix/freq_step").toLong(),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data class OndemandGovernor(
|
||||
var ignore_nice_load: Long? = null,
|
||||
var io_is_busy: Long? = null,
|
||||
var min_sampling_rate: Long? = null,
|
||||
var powersave_bias: Long? = null,
|
||||
var sampling_down_factor: Long? = null,
|
||||
var sampling_rate: Long? = null,
|
||||
var up_threshold: Long? = null,
|
||||
) {
|
||||
companion object {
|
||||
fun construct(): OndemandGovernor {
|
||||
val prefix = "/sys/devices/system/cpu/cpufreq/ondemand"
|
||||
return OndemandGovernor(
|
||||
Helper.adbCmd("cat $prefix/ignore_nice_load").toLong(),
|
||||
Helper.adbCmd("cat $prefix/io_is_busy").toLong(),
|
||||
Helper.adbCmd("cat $prefix/min_sampling_rate").toLong(),
|
||||
Helper.adbCmd("cat $prefix/powersave_bias").toLong(),
|
||||
Helper.adbCmd("cat $prefix/sampling_down_factor").toLong(),
|
||||
Helper.adbCmd("cat $prefix/sampling_rate").toLong(),
|
||||
Helper.adbCmd("cat $prefix/up_threshold").toLong(),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data class RawCores(
|
||||
var possible: String,
|
||||
var present: String,
|
||||
var online: String,
|
||||
var offline: String
|
||||
) {
|
||||
companion object {
|
||||
fun construct(): RawCores {
|
||||
return RawCores(
|
||||
Helper.adbCmd("cat /sys/devices/system/cpu/possible"),
|
||||
Helper.adbCmd("cat /sys/devices/system/cpu/present"),
|
||||
Helper.adbCmd("cat /sys/devices/system/cpu/online"),
|
||||
Helper.adbCmd("cat /sys/devices/system/cpu/offline"),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun toCores(): Cores {
|
||||
return Cores(
|
||||
Helper.str2range(possible).get(0),
|
||||
Helper.str2range(present).get(0),
|
||||
Helper.str2range(online),
|
||||
Helper.str2range(offline),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
data class Cores(
|
||||
var possible: IntRange = 0..0,
|
||||
var present: IntRange = 0..0,
|
||||
var online: List<IntRange> = listOf(),
|
||||
var offline: List<IntRange> = listOf(),
|
||||
)
|
||||
|
||||
class CpuFreqPolicy(
|
||||
var name: String = "policyX",
|
||||
var affected_cpus: String = "",
|
||||
var related_cpus: String = "",
|
||||
|
||||
//cpuinfo
|
||||
var cpuinfo_max_freq: String = "",
|
||||
var cpuinfo_min_freq: String = "",
|
||||
var cpuinfo_cur_freq: String? = null,
|
||||
var cpuinfo_transition_latency: String = "",
|
||||
|
||||
//freq
|
||||
var scaling_available_frequencies: String = "",
|
||||
var scaling_max_freq: String? = null,
|
||||
var scaling_min_freq: String = "",
|
||||
var scaling_cur_freq: String = "",
|
||||
|
||||
//governor
|
||||
var scaling_governor: String? = null,
|
||||
var scaling_driver: String = "",
|
||||
var scaling_available_governors: String = "",
|
||||
var scaling_setspeed: String? = null,
|
||||
) {
|
||||
companion object {
|
||||
fun construct(): List<CpuFreqPolicy> {
|
||||
val ret = mutableListOf<CpuFreqPolicy>()
|
||||
val policies = Helper.adbCmd("ls /sys/devices/system/cpu/cpufreq")
|
||||
policies.split("\n").forEach {
|
||||
if (it.matches("^policy\\d$".toRegex())) {
|
||||
log.info("Found: $it")
|
||||
ret.add(construct(it.trim()))
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
private fun construct(inName: String): CpuFreqPolicy {
|
||||
val prefix = "/sys/devices/system/cpu/cpufreq"
|
||||
return CpuFreqPolicy(
|
||||
name = inName,
|
||||
affected_cpus = Helper.adbCmd("cat $prefix/$inName/affected_cpus"),
|
||||
related_cpus = Helper.adbCmd("cat $prefix/$inName/related_cpus"),
|
||||
scaling_governor = getAdbCmdResult("cat $prefix/$inName/scaling_governor", false), //HMOS
|
||||
cpuinfo_cur_freq = getAdbCmdResult("cat $prefix/$inName/cpuinfo_cur_freq", false),
|
||||
scaling_available_frequencies = Helper.adbCmd("cat $prefix/$inName/scaling_available_frequencies"),
|
||||
scaling_max_freq = getAdbCmdResult("cat $prefix/$inName/scaling_max_freq", false),
|
||||
cpuinfo_max_freq = Helper.adbCmd("cat $prefix/$inName/cpuinfo_max_freq"),
|
||||
scaling_available_governors = Helper.adbCmd("cat $prefix/$inName/scaling_available_governors"),
|
||||
scaling_min_freq = Helper.adbCmd("cat $prefix/$inName/scaling_min_freq"),
|
||||
cpuinfo_min_freq = Helper.adbCmd("cat $prefix/$inName/cpuinfo_min_freq"),
|
||||
scaling_cur_freq = Helper.adbCmd("cat $prefix/$inName/scaling_cur_freq"),
|
||||
scaling_setspeed = getAdbCmdResult("cat $prefix/$inName/scaling_setspeed", false),
|
||||
cpuinfo_transition_latency = Helper.adbCmd("cat $prefix/$inName/cpuinfo_transition_latency"),
|
||||
scaling_driver = Helper.adbCmd("cat $prefix/$inName/scaling_driver")
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,101 @@
|
||||
package cfig.lazybox.sysinfo
|
||||
|
||||
import cfig.helper.Helper
|
||||
import cfig.helper.Helper.Companion.check_call
|
||||
import cfig.helper.Helper.Companion.deleteIfExists
|
||||
import cfig.helper.ZipHelper
|
||||
import org.slf4j.LoggerFactory
|
||||
import java.io.File
|
||||
import java.io.FileOutputStream
|
||||
import java.io.OutputStream
|
||||
import java.nio.file.Files
|
||||
import java.nio.file.Paths
|
||||
import kotlin.io.path.deleteIfExists
|
||||
import kotlin.io.path.writeText
|
||||
|
||||
class SysInfo {
|
||||
private fun runAndWrite(cmd: String, outStream: OutputStream, check: Boolean) {
|
||||
Helper.powerRun2(cmd, null).let {
|
||||
if (it[0] as Boolean) {
|
||||
outStream.write(it[1] as ByteArray)
|
||||
} else {
|
||||
if (check) {
|
||||
log.warn(String(it[1] as ByteArray))
|
||||
throw RuntimeException(String(it[2] as ByteArray))
|
||||
} else {
|
||||
log.warn(String(it[1] as ByteArray))
|
||||
log.warn(String(it[2] as ByteArray))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun makeTar(tarFile: String, srcDir: String) {
|
||||
val pyScript =
|
||||
"""
|
||||
import os, sys, subprocess, gzip, logging, shutil, tarfile, os.path
|
||||
def makeTar(output_filename, source_dir):
|
||||
with tarfile.open(output_filename, "w:xz") as tar:
|
||||
tar.add(source_dir, arcname=os.path.basename(source_dir))
|
||||
makeTar("%s", "%s")
|
||||
""".trim()
|
||||
val tmp = Files.createTempFile(Paths.get("."), "xx.", ".yy")
|
||||
tmp.writeText(String.format(pyScript, tarFile, srcDir))
|
||||
("python " + tmp.fileName).check_call()
|
||||
tmp.deleteIfExists()
|
||||
}
|
||||
|
||||
fun run() {
|
||||
"adb wait-for-device".check_call()
|
||||
"adb root".check_call()
|
||||
"sysinfo.tar".deleteIfExists()
|
||||
val prefix = "sysinfo"
|
||||
File("sysinfo").let {
|
||||
if (it.exists()) {
|
||||
log.info("purging directory sysinfo/ ...")
|
||||
it.deleteRecursively()
|
||||
}
|
||||
}
|
||||
File(prefix).mkdir()
|
||||
FileOutputStream("$prefix/0_prop").use {
|
||||
runAndWrite("adb shell getprop", it, true)
|
||||
}
|
||||
FileOutputStream("$prefix/1_partitions").use { file ->
|
||||
runAndWrite("adb shell cat /proc/partitions", file, false) //HMOS
|
||||
runAndWrite("adb shell ls -l /dev/block/by-name", file, false)
|
||||
}
|
||||
|
||||
FileOutputStream("$prefix/2_mount").use { file ->
|
||||
runAndWrite("adb shell mount", file, true)
|
||||
}
|
||||
FileOutputStream("$prefix/3_kernel_cmdline").use { file ->
|
||||
file.write("[version]\n".toByteArray())
|
||||
runAndWrite("adb shell cat /proc/version", file, true)
|
||||
file.write("\n[cmdline]\n".toByteArray())
|
||||
runAndWrite("adb shell cat /proc/cmdline", file, false)
|
||||
file.write("\n[bootconfig]\n".toByteArray())
|
||||
runAndWrite("adb shell cat /proc/bootconfig", file, false)
|
||||
// cpuinfo
|
||||
file.write("\n[cpuinfo]\n".toByteArray())
|
||||
runAndWrite("adb shell cat /proc/cpuinfo", file, false)
|
||||
// meminfo
|
||||
file.write("\n[meminfo]\n".toByteArray())
|
||||
runAndWrite("adb shell cat /proc/meminfo", file, false)
|
||||
// defconfig
|
||||
file.write("\n[defconfig]\n".toByteArray())
|
||||
"adb pull /proc/config.gz".check_call()
|
||||
ZipHelper.zcat("config.gz", "config")
|
||||
file.write(File("config").readBytes())
|
||||
File("config.gz").deleteOnExit()
|
||||
File("config").deleteOnExit()
|
||||
}
|
||||
"adb pull /proc/device-tree".check_call(prefix)
|
||||
Files.move(Paths.get("$prefix/device-tree"), Paths.get("$prefix/device_tree"))
|
||||
makeTar("sysinfo.tar.xz", "sysinfo")
|
||||
File("sysinfo").deleteRecursively()
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val log = LoggerFactory.getLogger(SysInfo::class.java)
|
||||
}
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
<configuration debug="false">
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<appender name="SOME_ERRORS" class="ch.qos.logback.core.FileAppender">
|
||||
<file>uiderrors</file>
|
||||
<encoder>
|
||||
<pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<logger name="uiderrors" level="DEBUG" additivity="false">
|
||||
<appender-ref ref="SOME_ERRORS"/>
|
||||
</logger>
|
||||
<root level="info">
|
||||
<appender-ref ref="STDOUT" />
|
||||
</root>
|
||||
</configuration>
|
@ -0,0 +1,14 @@
|
||||
package cfig.lazybox.sysinfo
|
||||
|
||||
import org.junit.jupiter.api.Test
|
||||
|
||||
import org.junit.jupiter.api.Assertions.*
|
||||
import java.io.File
|
||||
|
||||
class CpuInfoTest {
|
||||
|
||||
@Test
|
||||
fun probeInfo() {
|
||||
CpuInfo.construct()
|
||||
}
|
||||
}
|
@ -1,71 +0,0 @@
|
||||
import java.io.*
|
||||
import org.apache.commons.exec.CommandLine
|
||||
import org.apache.commons.exec.DefaultExecutor
|
||||
import org.apache.commons.exec.PumpStreamHandler
|
||||
import com.fasterxml.jackson.databind.ObjectMapper
|
||||
|
||||
fun adbCmd(cmd: String): String {
|
||||
val outputStream = ByteArrayOutputStream()
|
||||
val exec = DefaultExecutor()
|
||||
exec.streamHandler = PumpStreamHandler(outputStream)
|
||||
val cmdline = "adb shell $cmd"
|
||||
//println(cmdline)
|
||||
exec.execute(CommandLine.parse(cmdline))
|
||||
//println(outputStream)
|
||||
return outputStream.toString().trim()
|
||||
}
|
||||
|
||||
val cpufreqDir = "/sys/devices/system/cpu/cpufreq/policy0"
|
||||
val interactGov = "/sys/devices/system/cpu/cpufreq/interactive"
|
||||
|
||||
val scaling_governor = adbCmd("cat $cpufreqDir/scaling_governor")
|
||||
val avail_governer = adbCmd("cat $cpufreqDir/scaling_available_governors")
|
||||
val avail_freq = adbCmd("cat $cpufreqDir/scaling_available_frequencies")
|
||||
println("Available governers: " + avail_governer)
|
||||
println("Available frequency: " + avail_freq)
|
||||
|
||||
val scaleMax = adbCmd("cat $cpufreqDir/scaling_max_freq")
|
||||
val scaleMin = adbCmd("cat $cpufreqDir/scaling_min_freq")
|
||||
println("scaling_X_freq: [$scaleMin, $scaleMax]")
|
||||
println("Current governer: $scaling_governor")
|
||||
|
||||
fun getInteractValue(k: String): String {
|
||||
return adbCmd("cat $interactGov/$k")
|
||||
}
|
||||
fun getInteractInt(k: String): Int {
|
||||
return Integer.decode(adbCmd("cat $interactGov/$k"))
|
||||
}
|
||||
|
||||
data class Boost(
|
||||
var boost: Int,
|
||||
var boostpulse_duration_ms: Int)
|
||||
val boostInfo = Boost(getInteractInt("boost"), getInteractInt("boostpulse_duration") / 1000)
|
||||
|
||||
data class HiSpeed(
|
||||
var load: Int,
|
||||
var above_delay_Ms: Int,
|
||||
var freq_GHz: Double)
|
||||
val hiSpeedInfo = HiSpeed(
|
||||
getInteractInt("go_hispeed_load"),
|
||||
getInteractInt("above_hispeed_delay") / 1000,
|
||||
getInteractInt("hispeed_freq") / 1000000.0)
|
||||
|
||||
data class InteractiveGov(
|
||||
var target_loads: Int,
|
||||
var boost: Boost,
|
||||
var hiSpeed: HiSpeed,
|
||||
var minSampleTimeMs: Int,
|
||||
var timerRateMs: Int,
|
||||
var timerSlackMs: Int,
|
||||
var io_is_busy: Int)
|
||||
|
||||
val info = InteractiveGov(
|
||||
getInteractInt("target_loads"),
|
||||
boostInfo,
|
||||
hiSpeedInfo,
|
||||
getInteractInt("min_sample_time") / 1000,
|
||||
getInteractInt("timer_rate") / 1000,
|
||||
getInteractInt("timer_slack") / 1000,
|
||||
getInteractInt("io_is_busy"))
|
||||
|
||||
println(ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(info))
|
@ -1,65 +0,0 @@
|
||||
#! /usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
# vim:fenc=utf-8
|
||||
#
|
||||
import os, sys, subprocess, gzip, logging, shutil, tarfile, os.path
|
||||
|
||||
#########################
|
||||
## globals
|
||||
#########################
|
||||
log = logging.getLogger("|")
|
||||
log.setLevel(logging.DEBUG)
|
||||
consoleHandler = logging.StreamHandler(sys.stdout)
|
||||
consoleHandler.setFormatter(logging.Formatter(fmt='%(asctime)s %(levelname)-8s %(name)s - %(message)s',
|
||||
datefmt='%Y-%m-%d %H:%M:%S'))
|
||||
log.addHandler(consoleHandler)
|
||||
|
||||
#########################
|
||||
## functions
|
||||
#########################
|
||||
def purgeFolder(folderPath):
|
||||
if os.path.exists(folderPath):
|
||||
log.info("cleaning %s" % folderPath)
|
||||
shutil.rmtree(folderPath)
|
||||
|
||||
def makeTar(output_filename, source_dir):
|
||||
with tarfile.open(output_filename, "w:xz") as tar:
|
||||
tar.add(source_dir, arcname=os.path.basename(source_dir))
|
||||
|
||||
#########################
|
||||
## main
|
||||
#########################
|
||||
log.info("adb wait-for-device ...")
|
||||
subprocess.check_call("adb wait-for-device", shell = True)
|
||||
subprocess.check_call("adb root", shell = True)
|
||||
purgeFolder("sysinfo")
|
||||
os.mkdir("sysinfo")
|
||||
with open("sysinfo/0_prop", "wb") as f:
|
||||
f.write(subprocess.check_output("adb shell getprop", shell = True))
|
||||
with open("sysinfo/1_partitions", "wb") as f:
|
||||
f.write(subprocess.check_output("adb shell cat /proc/partitions", shell = True))
|
||||
f.write(subprocess.check_output("adb shell ls -l /dev/block/by-name", shell = True))
|
||||
with open("sysinfo/2_mount", "wb") as f:
|
||||
f.write(subprocess.check_output("adb shell mount", shell = True))
|
||||
with open("sysinfo/3_kernel_cmdline", "wb") as f:
|
||||
f.write(bytes("[version]\n", "utf-8"))
|
||||
f.write(subprocess.check_output("adb shell cat /proc/version", shell = True))
|
||||
f.write(bytes("\n[cmdline]\n", "utf-8"))
|
||||
f.write(subprocess.check_output("adb shell cat /proc/cmdline", shell = True))
|
||||
f.write(bytes("\n[bootconfig]\n", "utf-8"))
|
||||
try:
|
||||
f.write(subprocess.check_output("adb shell cat /proc/bootconfig", shell = True))
|
||||
except subprocess.CalledProcessError as e:
|
||||
log.warning("can not read bootconfig")
|
||||
pass
|
||||
subprocess.check_call("adb pull /proc/config.gz", shell = True)
|
||||
with gzip.open("config.gz", "rb") as gz_file:
|
||||
file_content = gz_file.read()
|
||||
f.write(bytes("\n[defconfig]\n", "utf-8"))
|
||||
f.write(file_content)
|
||||
os.remove("config.gz")
|
||||
subprocess.check_call("adb pull /proc/device-tree", cwd = "sysinfo", shell = True)
|
||||
shutil.move("sysinfo/device-tree", "sysinfo/device_tree")
|
||||
makeTar("sysinfo.py.tar.xz", "sysinfo")
|
||||
shutil.rmtree("sysinfo")
|
||||
log.info("sysinfo.py.tar.xz is ready")
|
Loading…
Reference in New Issue