Skip to content

Commit fe0dbfa

Browse files
authored
Merge pull request #183 from EC-DIGIT-CSIRC/event_dataclass
wip: [datamodel] datamodel has 'data' subkey
2 parents 15f9d31 + 0605a6f commit fe0dbfa

File tree

80 files changed

+1351
-880
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+1351
-880
lines changed

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ dependencies = [
3535
"python-magic==0.4.27",
3636
"jinja2==3.1.6",
3737
"matplotlib==3.10.1",
38+
"orjsonl==1.0.0"
3839
]
3940

4041

src/sysdiagnose/analysers/apps.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# Author: Emiliern Le Jamtel
55

66
import re
7-
from sysdiagnose.utils.base import BaseAnalyserInterface, logger
7+
from sysdiagnose.utils.base import BaseAnalyserInterface, SysdiagnoseConfig, logger
88
from sysdiagnose.parsers.accessibility_tcc import AccessibilityTccParser
99
from sysdiagnose.parsers.brctl import BrctlParser
1010
from sysdiagnose.parsers.itunesstore import iTunesStoreParser
@@ -15,7 +15,7 @@ class AppsAnalyser(BaseAnalyserInterface):
1515
description = 'Get list of Apps installed on the device'
1616
format = 'json'
1717

18-
def __init__(self, config: dict, case_id: str):
18+
def __init__(self, config: SysdiagnoseConfig, case_id: str):
1919
super().__init__(__file__, config, case_id)
2020

2121
# this code is quite slow, but that's due to logarchive.jsonl being slow to parse
@@ -26,7 +26,7 @@ def execute(self):
2626
apps = {}
2727
json_data = AccessibilityTccParser(self.config, self.case_id).get_result()
2828
for entry in json_data:
29-
apps[entry['client']] = {'found': ['accessibility-tcc'], 'services': [entry['service']]}
29+
apps[entry['data']['client']] = {'found': ['accessibility-tcc'], 'services': [entry['data']['service']]}
3030

3131
json_data = BrctlParser(self.config, self.case_id).get_result()
3232
if json_data and not json_data.get('error'):
@@ -55,7 +55,8 @@ def execute(self):
5555
re_bundle_id_pattern = r'(([a-zA-Z0-9-_]+\.)+[a-zA-Z0-9-_]+)'
5656
# list files in here
5757
json_entries = LogarchiveParser(self.config, self.case_id).get_result()
58-
for entry in json_entries:
58+
for events in json_entries:
59+
entry = events['data']
5960
try:
6061
# skip empty entries
6162
if entry['subsystem'] == '':

src/sysdiagnose/analysers/coverage.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
import importlib
44
import os
55
import magic
6-
from sysdiagnose.utils.base import BaseAnalyserInterface, BaseParserInterface, logger
6+
from sysdiagnose.utils.base import BaseAnalyserInterface, BaseParserInterface, SysdiagnoseConfig, logger
77
from sysdiagnose.parsers.remotectl_dumpstate import RemotectlDumpstateParser
88

99

1010
class CoverageAnalyser(BaseAnalyserInterface):
1111
description = "Provides parser coverage information"
1212
format = "html"
1313

14-
def __init__(self, config: dict, case_id: str):
14+
def __init__(self, config: SysdiagnoseConfig, case_id: str):
1515
super().__init__(__file__, config, case_id)
1616

1717
def execute(self):

src/sysdiagnose/analysers/demo_analyser.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
# For Python3
44
# DEMO - Skeleton
55

6-
from sysdiagnose.utils.base import BaseAnalyserInterface, logger
6+
from sysdiagnose.utils.base import BaseAnalyserInterface, SysdiagnoseConfig, logger
77

88

99
class DemoAnalyser(BaseAnalyserInterface):
1010
description = "Do something useful (DEMO)"
1111
# format = "json" # by default json
1212

13-
def __init__(self, config: dict, case_id: str):
13+
def __init__(self, config: SysdiagnoseConfig, case_id: str):
1414
super().__init__(__file__, config, case_id)
1515

1616
def execute(self):

src/sysdiagnose/analysers/file_stats.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import os
22
import magic
33
from sysdiagnose.parsers.remotectl_dumpstate import RemotectlDumpstateParser
4-
from sysdiagnose.utils.base import BaseAnalyserInterface, logger
4+
from sysdiagnose.utils.base import BaseAnalyserInterface, SysdiagnoseConfig, logger
55

66

77
class FileStatisticsAnalyser(BaseAnalyserInterface):
88
description = "Obatins statistics about the files of the sysdiagnose"
99
format = "json" # Output format
1010

11-
def __init__(self, config: dict, case_id: str):
11+
def __init__(self, config: SysdiagnoseConfig, case_id: str):
1212
super().__init__(__file__, config, case_id)
1313

1414
def get_file_type(self, file_path: str) -> str:

src/sysdiagnose/analysers/mcstateshared.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from sysdiagnose.utils.base import BaseAnalyserInterface
1+
from sysdiagnose.utils.base import BaseAnalyserInterface, SysdiagnoseConfig
22
from sysdiagnose.parsers.mcstate_shared_profile import McStateSharedProfileParser
33
from sysdiagnose.utils import misc
44
import csv
@@ -9,7 +9,7 @@ class MCStateSharedProfileAnalyser(BaseAnalyserInterface):
99
description = "Exports MCState Shared Profile stub files to CSV for better analysis."
1010
format = "csv"
1111

12-
def __init__(self, config: dict, case_id: str):
12+
def __init__(self, config: SysdiagnoseConfig, case_id: str):
1313
super().__init__(__file__, config, case_id)
1414

1515
def execute(self):
@@ -19,11 +19,11 @@ def execute(self):
1919

2020
for entry in mcstate_result:
2121
for key in ['SignerCerts', 'datetime', 'timestamp']:
22-
entry.pop(key, None)
22+
entry['data'].pop(key, None)
2323

24-
payload_contents = entry.pop('PayloadContent', None)
24+
payload_contents = entry['data'].pop('PayloadContent', None)
2525

26-
entry_tpl = misc.flatten_dict(entry)
26+
entry_tpl = misc.flatten_dict(entry['data'])
2727

2828
for payload_content in payload_contents:
2929
item = entry_tpl.copy()

src/sysdiagnose/analysers/plist.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
from datetime import datetime
12
import json
23
from typing import Generator
34

4-
from sysdiagnose.utils.base import BaseAnalyserInterface, logger
5+
from sysdiagnose.utils.base import BaseAnalyserInterface, SysdiagnoseConfig, logger, Event
56
from sysdiagnose.parsers.plists import PlistParser
67

78

@@ -14,7 +15,7 @@ class PListAnalyzer(BaseAnalyserInterface):
1415
description = 'Gathers information from a plist file.'
1516
format = 'jsonl'
1617

17-
def __init__(self, config: dict, case_id: str):
18+
def __init__(self, config: SysdiagnoseConfig, case_id: str):
1819
super().__init__(__file__, config, case_id)
1920
self.parser = PlistParser(config, case_id)
2021

@@ -53,14 +54,15 @@ def __extract_plist_mdm_data(self) -> Generator[dict, None, None]:
5354
for line in f:
5455
entry = json.loads(line)
5556

56-
mdm_entry: dict[str, str] = {
57-
'ManagingProfileIdentifier': entry.get('ManagingProfileIdentifier'),
58-
'AccessRights': entry.get('AccessRights'),
59-
'LastPollingAttempt': entry.get('LastPollingAttempt'),
60-
'source': entity_type,
61-
}
57+
mdm_entry = Event(
58+
datetime=datetime.fromisoformat(entry.get('LastPollingAttempt')),
59+
message= f"MDM Profile: {entry.get('ManagingProfileIdentifier')} with access rights {entry.get('AccessRights')}",
60+
timestamp_desc='Last Polling Attempt',
61+
module=self.module_name,
62+
data={'source': entity_type}
63+
)
6264

63-
yield mdm_entry
65+
yield mdm_entry.to_dict()
6466

6567
except FileNotFoundError as e:
6668
logger.warning(f'{entity_type} not found for {self.case_id}. {e}')

0 commit comments

Comments
 (0)