#!/usr/bin/env python3 """ archivebox process [--filters] Manage Process records (system-managed, mostly read-only). Process records track executions of binaries during extraction. They are created automatically by the system and are primarily for debugging. Actions: list - List Processes as JSONL (with optional filters) Examples: # List all processes archivebox process list # List processes by binary archivebox process list --binary-name=chrome # List recent processes archivebox process list --limit=10 """ __package__ = "archivebox.cli" __command__ = "archivebox process" import sys import rich_click as click from rich import print as rprint from archivebox.cli.cli_utils import apply_filters # ============================================================================= # LIST # ============================================================================= def list_processes( binary_name: str | None = None, machine_id: str | None = None, limit: int | None = None, ) -> int: """ List Processes as JSONL with optional filters. Exit codes: 0: Success (even if no results) """ from archivebox.misc.jsonl import write_record from archivebox.machine.models import Process is_tty = sys.stdout.isatty() queryset = Process.objects.all().select_related("binary", "machine").order_by("-start_ts") # Apply filters filter_kwargs = {} if binary_name: filter_kwargs["binary__name"] = binary_name if machine_id: filter_kwargs["machine_id"] = machine_id queryset = apply_filters(queryset, filter_kwargs, limit=limit) count = 0 for process in queryset: if is_tty: binary_name_str = process.binary.name if process.binary else "unknown" exit_code = process.exit_code if process.exit_code is not None else "?" status_color = "green" if process.exit_code == 0 else "red" if process.exit_code else "yellow" rprint(f"[{status_color}]exit={exit_code:3}[/{status_color}] [cyan]{binary_name_str:15}[/cyan] [dim]{process.id}[/dim]") else: write_record(process.to_json()) count += 1 rprint(f"[dim]Listed {count} processes[/dim]", file=sys.stderr) return 0 # ============================================================================= # CLI Commands # ============================================================================= @click.group() def main(): """Manage Process records (read-only, system-managed).""" pass @main.command("list") @click.option("--binary-name", "-b", help="Filter by binary name") @click.option("--machine-id", "-m", help="Filter by machine ID") @click.option("--limit", "-n", type=int, help="Limit number of results") def list_cmd(binary_name: str | None, machine_id: str | None, limit: int | None): """List Processes as JSONL.""" sys.exit( list_processes( binary_name=binary_name, machine_id=machine_id, limit=limit, ), ) if __name__ == "__main__": main()