Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
81e2f35
Added recursive, basic version of IOService parser
Aweinhof Sep 12, 2025
2a7131f
IOService parser now recreates the tree in a json format
Aweinhof Sep 12, 2025
333cbda
IOService parser now handles anomalies
Aweinhof Sep 12, 2025
7484620
Fixed an anomaly where a non-ascii byte stands in the IOService.txt file
Aweinhof Sep 15, 2025
5e03cec
Added unit testing for ioservice parser
Aweinhof Sep 15, 2025
25145b8
Fixed codestyling of ioservice and its unit testing
Aweinhof Sep 15, 2025
ebb74a6
Small refactor of the resulting data structure in the ioservice parser
Aweinhof Sep 16, 2025
5d26e31
Merge branch 'EC-DIGIT-CSIRC:main' into main
Aweinhof Sep 17, 2025
2de2208
Added basic value string parsers, used for io* parsers
Aweinhof Sep 17, 2025
858d5b6
Merge branch 'main' of https://github.com/Aweinhof/sysdiagnose
Aweinhof Sep 17, 2025
b5a9188
Added recursive version of string_parser, still rudimentary
Aweinhof Sep 18, 2025
49b1982
Refactor of algo logic in utils/string_parser
Aweinhof Sep 18, 2025
61d386c
Enhanced string_parser + Added solid tests + fixes here and there
Aweinhof Sep 19, 2025
5c81d1c
string_parser now fully working on the testfile, quoted values not op…
Aweinhof Sep 22, 2025
12c566e
Added a line preparation that greatly optimizes the recursion depth +…
Aweinhof Sep 23, 2025
58a0524
Cleaned code releated to ioreg and stringparsers
Aweinhof Sep 23, 2025
4394482
bug fix concerning strings inside <> and cleanup
Aweinhof Sep 24, 2025
e5a9eba
dissociated ioreg parsers + small fixes
Aweinhof Sep 25, 2025
eea716a
Replaced exit calls, renamed class attributes and moved string_parser…
Aweinhof Sep 25, 2025
9020e7e
Merge branch 'EC-DIGIT-CSIRC:main' into main
Aweinhof Sep 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,14 @@
"module": "sysdiagnose.__main__",
"args": "-c public parse swcutil",
"cwd": "${workspaceFolder}/"
},
{
"name": "Python Debugger: parse ioservice",
"type": "debugpy",
"request": "launch",
"module": "sysdiagnose.__main__",
"args": "-c public -l DEBUG parse ioservice",
"cwd": "${workspaceFolder}/"
}
]
}
31 changes: 31 additions & 0 deletions src/sysdiagnose/parsers/ioacpiplane.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#! /usr/bin/env python3

import os
from sysdiagnose.utils.base import BaseParserInterface, SysdiagnoseConfig, logger
from sysdiagnose.utils.ioreg_parsers.structure_parser import IORegStructParser


class IOACPIPlaneParser(BaseParserInterface):
description = "IOACPIPlane.txt file parser"
format = "json"

def __init__(self, config: SysdiagnoseConfig, case_id: str):
super().__init__(__file__, config, case_id)

def get_log_files(self) -> list:
log_file = "ioreg/IOACPIPlane.txt"
return [os.path.join(self.case_data_subfolder, log_file)]

def execute(self) -> list | dict:
log_file = self.get_log_files()[0]
data_tree = {}

try:
logger.info(f"Processing file {log_file}, new entry added", extra={'log_file': log_file})
p = IORegStructParser()
data_tree = p.parse(log_file)

except Exception:
logger.exception("IOACPIPlane parsing crashed")

return data_tree
32 changes: 32 additions & 0 deletions src/sysdiagnose/parsers/iodevicetree.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#! /usr/bin/env python3

import os
from sysdiagnose.utils.base import BaseParserInterface, SysdiagnoseConfig, logger
from sysdiagnose.utils.ioreg_parsers.structure_parser import IORegStructParser


class IODeviceTreeParser(BaseParserInterface):
description = "IODeviceTree.txt file parser"
format = "json"

def __init__(self, config: SysdiagnoseConfig, case_id: str):
super().__init__(__file__, config, case_id)

def get_log_files(self) -> list:
log_file = "ioreg/IODeviceTree.txt"
return [os.path.join(self.case_data_subfolder, log_file)]

def execute(self) -> list | dict:
log_files = self.get_log_files()
data_tree = {}

for log_file in log_files:
try:
logger.info(f"Processing file {log_file}, new entry added", extra={'log_file': log_file})
p = IORegStructParser()
data_tree = p.parse(log_file)

except Exception:
logger.exception("IODeviceTree parsing crashed")

return data_tree
32 changes: 32 additions & 0 deletions src/sysdiagnose/parsers/iofirewire.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#! /usr/bin/env python3

import os
from sysdiagnose.utils.base import BaseParserInterface, SysdiagnoseConfig, logger
from sysdiagnose.utils.ioreg_parsers.structure_parser import IORegStructParser


class IOFireWireParser(BaseParserInterface):
description = "IOFireWire.txt file parser"
format = "json"

def __init__(self, config: SysdiagnoseConfig, case_id: str):
super().__init__(__file__, config, case_id)

def get_log_files(self) -> list:
log_file = "ioreg/IOFireWire.txt"
return [os.path.join(self.case_data_subfolder, log_file)]

def execute(self) -> list | dict:
log_files = self.get_log_files()
data_tree = {}

for log_file in log_files:
try:
logger.info(f"Processing file {log_file}, new entry added", extra={'log_file': log_file})
p = IORegStructParser()
data_tree = p.parse(log_file)

except Exception:
logger.exception("IOFireWire parsing crashed")

return data_tree
32 changes: 32 additions & 0 deletions src/sysdiagnose/parsers/iopower.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#! /usr/bin/env python3

import os
from sysdiagnose.utils.base import BaseParserInterface, SysdiagnoseConfig, logger
from sysdiagnose.utils.ioreg_parsers.structure_parser import IORegStructParser


class IOPowerParser(BaseParserInterface):
description = "IOPower.txt file parser"
format = "json"

def __init__(self, config: SysdiagnoseConfig, case_id: str):
super().__init__(__file__, config, case_id)

def get_log_files(self) -> list:
log_file = "ioreg/IOPower.txt"
return [os.path.join(self.case_data_subfolder, log_file)]

def execute(self) -> list | dict:
log_files = self.get_log_files()
data_tree = {}

for log_file in log_files:
try:
logger.info(f"Processing file {log_file}, new entry added", extra={'log_file': log_file})
p = IORegStructParser()
data_tree = p.parse(log_file)

except Exception:
logger.exception("IOPower parsing crashed")

return data_tree
44 changes: 44 additions & 0 deletions src/sysdiagnose/parsers/ioservice.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#! /usr/bin/env python3

import os
from sysdiagnose.utils.base import BaseParserInterface, SysdiagnoseConfig, logger
from sysdiagnose.utils.ioreg_parsers.structure_parser import IORegStructParser


class IOServiceParser(BaseParserInterface):
description = "IOService.txt file parser"
format = "json"

def __init__(self, config: SysdiagnoseConfig, case_id: str):
super().__init__(__file__, config, case_id)

def get_log_files(self) -> list:
log_file = "ioreg/IOService.txt"
return [os.path.join(self.case_data_subfolder, log_file)]

def execute(self) -> list | dict:
""" IOService file notes

# Regex for +-o starting at start of file -> 1213 results
(\s|\|)*\+-o

# Regex for ALL +-o - 1213 results
\+-o

So we know that the data doesn't contain the node identifier ('+-o')

""" # noqa: W605

log_files = self.get_log_files()
data_tree = {}

for log_file in log_files:
try:
logger.info(f"Processing file {log_file}, new entry added", extra={'log_file': log_file})
p = IORegStructParser()
data_tree = p.parse(log_file)

except Exception:
logger.exception("IOService parsing crashed")

return data_tree
32 changes: 32 additions & 0 deletions src/sysdiagnose/parsers/iousb.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#! /usr/bin/env python3

import os
from sysdiagnose.utils.base import BaseParserInterface, SysdiagnoseConfig, logger
from sysdiagnose.utils.ioreg_parsers.structure_parser import IORegStructParser


class IOUSBParser(BaseParserInterface):
description = "IOUSB.txt file parser"
format = "json"

def __init__(self, config: SysdiagnoseConfig, case_id: str):
super().__init__(__file__, config, case_id)

def get_log_files(self) -> list:
log_file = "ioreg/IOUSB.txt"
return [os.path.join(self.case_data_subfolder, log_file)]

def execute(self) -> list | dict:
log_files = self.get_log_files()
data_tree = {}

for log_file in log_files:
try:
logger.info(f"Processing file {log_file}, new entry added", extra={'log_file': log_file})
p = IORegStructParser()
data_tree = p.parse(log_file)

except Exception:
logger.exception("IOUSB parsing crashed")

return data_tree
Loading