|
2 | 2 | from collections import defaultdict |
3 | 3 | import re |
4 | 4 | import os |
5 | | -from typing import Dict, List, Optional, Any, NamedTuple, Iterator, Set, Tuple |
| 5 | +from typing import Dict, List, Optional, Any, NamedTuple, Iterator, Set, Tuple, Union |
6 | 6 | from apscheduler.schedulers.background import BackgroundScheduler |
7 | 7 | from .trace import TraceReader |
8 | 8 | from .aggregator import Aggregator |
|
11 | 11 | from .config import Config |
12 | 12 | from .report_manager import ReportManager |
13 | 13 | from .models import Cell |
| 14 | +from .domain.models.events import BaseSyscallEvent, ExecveEvent |
14 | 15 |
|
15 | 16 |
|
16 | 17 | def setup_logging(debug: bool = False) -> None: |
@@ -316,62 +317,35 @@ def _summarize(self) -> None: |
316 | 317 |
|
317 | 318 | logging.info(f"Created cell report {cell.report_id} with {cell.total} events") |
318 | 319 |
|
319 | | - def _process_event(self, evt: str) -> None: |
| 320 | + def _process_event(self, evt: BaseSyscallEvent) -> None: |
320 | 321 | """ |
321 | 322 | Process a single event from the trace reader. |
322 | 323 |
|
323 | 324 | Args: |
324 | 325 | evt: Raw event string from trace_pipe |
325 | 326 | """ |
326 | | - # Log raw event in debug mode |
327 | | - if self.debug: |
328 | | - # Always log basic event info |
329 | | - logging.debug(f"Raw event: {evt}") |
330 | | - |
331 | | - # Log detailed parsed info if verbose debug is enabled |
332 | | - if self.verbose_debug: |
333 | | - self._log_parsed_event(evt) |
334 | | - |
335 | | - # If event is already a dict (e.g., when injected by tests or future extensions), |
336 | | - # we assume it's been validated and directly buffer it. |
337 | | - if isinstance(evt, dict): |
338 | | - self.agg.add(evt) |
339 | | - return |
340 | | - |
341 | | - # Otherwise, treat it as raw text from trace_pipe and try to parse/validate. |
342 | | - parsed = parse_execve(evt) |
| 327 | + if self.verbose_debug: |
| 328 | + self._log_debug_event(evt) |
343 | 329 |
|
344 | | - if not parsed: |
345 | | - # Not an execve line – skip buffering |
| 330 | + # If the trace reader already produced a validated ExecveEvent model, buffer it directly. |
| 331 | + if isinstance(evt, BaseSyscallEvent): |
| 332 | + self.agg.add(evt.model_dump() if hasattr(evt, "model_dump") else evt.dict()) |
346 | 333 | return |
| 334 | + else: |
| 335 | + logging.warning(f"Invalid event type: {type(evt)}") |
347 | 336 |
|
348 | | - # Validate with Pydantic schema (ensures correct types/structure) |
349 | | - try: |
350 | | - from .domain.models.event_models import ExecveEvent as ExecveEventModel # Local import to avoid cycles |
351 | | - |
352 | | - model_event = ExecveEventModel.from_namedtuple(parsed) |
353 | | - |
354 | | - # Buffer as plain dict (safer for serialization & downstream processing) |
355 | | - self.agg.add(model_event.model_dump()) |
356 | | - except Exception as e: |
357 | | - # Any validation or conversion error – log and drop the event |
358 | | - logging.warning("Invalid event skipped: %s", e) |
359 | | - |
360 | | - def _log_parsed_event(self, evt: str) -> None: |
| 337 | + def _log_debug_event(self, evt: BaseSyscallEvent) -> None: |
361 | 338 | """ |
362 | 339 | Parse and log detailed event information. |
363 | 340 |
|
364 | 341 | Args: |
365 | 342 | evt: Raw event string from trace_pipe |
366 | 343 | """ |
| 344 | + if not self.debug or not self.verbose_debug: |
| 345 | + return |
| 346 | + |
367 | 347 | try: |
368 | | - parsed_evt = parse_execve(evt) |
369 | | - if parsed_evt: |
370 | | - logging.debug( |
371 | | - f"Parsed execve: timestamp={parsed_evt.timestamp}, " |
372 | | - f"pid={parsed_evt.pid}, command={parsed_evt.command}, " |
373 | | - f"args={parsed_evt.args}" |
374 | | - ) |
| 348 | + logging.debug(f"{evt}") |
375 | 349 | except Exception as e: |
376 | 350 | logging.debug(f"Parse error: {str(e)}") |
377 | 351 |
|
|
0 commit comments