#!/usr/bin/env bash # start_mitm_capture — Arranca mitmdump en segundo plano como proxy de interceptación # con rotación de capturas cada N minutos vía addon Python del registry. start_mitm_capture() { local port=8080 local out_dir="$HOME/captures" local rotate_min=20 local addon_path="" local mitmdump_bin="" local log_path="" # Parseo de argumentos while [[ $# -gt 0 ]]; do case "$1" in --port) port="$2"; shift 2 ;; --out) out_dir="$2"; shift 2 ;; --rotate-min) rotate_min="$2"; shift 2 ;; --addon) addon_path="$2"; shift 2 ;; --mitmdump) mitmdump_bin="$2"; shift 2 ;; --log) log_path="$2"; shift 2 ;; *) echo "ERROR: argumento desconocido: $1" >&2 echo "Uso: start_mitm_capture [--port N] [--out DIR] [--rotate-min N] [--addon PATH] [--mitmdump BIN] [--log PATH]" >&2 return 1 ;; esac done # Derivar raíz del registry cuando FN_REGISTRY_ROOT no está seteado local registry_root if [[ -n "${FN_REGISTRY_ROOT:-}" ]]; then registry_root="$FN_REGISTRY_ROOT" else # bash/functions/cybersecurity/ -> 3 niveles arriba = raíz del registry registry_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../.." && pwd)" fi # Default addon usando la raíz derivada if [[ -z "$addon_path" ]]; then addon_path="${registry_root}/python/functions/cybersecurity/rotate_capture_flows.py" fi # Default log path (depende de out_dir, se resuelve después de crear el dir) # Se asigna más abajo si sigue vacío # Crear directorio de capturas si no existe if [[ ! -d "$out_dir" ]]; then mkdir -p "$out_dir" || { echo "ERROR: no se pudo crear el directorio de capturas: $out_dir" >&2 return 1 } fi # Asignar log por defecto ahora que out_dir existe if [[ -z "$log_path" ]]; then log_path="${out_dir}/mitmdump.log" fi # Resolver binario mitmdump if [[ -z "$mitmdump_bin" ]]; then if command -v mitmdump &>/dev/null; then mitmdump_bin="$(command -v mitmdump)" elif [[ -x "$HOME/.local/bin/mitmdump" ]]; then mitmdump_bin="$HOME/.local/bin/mitmdump" else echo "ERROR: mitmdump no encontrado; instala con: uv tool install mitmproxy" >&2 return 1 fi else if [[ ! -x "$mitmdump_bin" ]]; then echo "ERROR: el binario indicado no existe o no es ejecutable: $mitmdump_bin" >&2 return 1 fi fi # Verificar que el addon existe if [[ ! -f "$addon_path" ]]; then echo "ERROR: addon no encontrado: $addon_path" >&2 echo " Asegúrate de que FN_REGISTRY_ROOT apunta a la raíz del registry" >&2 echo " o pasa --addon con la ruta correcta a rotate_capture_flows.py" >&2 return 1 fi # Arrancar mitmdump en background con setsid (sobrevive al cierre de la shell). # El redirect > "$log_path" 2>&1 & local pid=$! disown "$pid" 2>/dev/null || true # Esperar ~1s y verificar que el proceso sigue vivo sleep 1 if ! kill -0 "$pid" 2>/dev/null; then echo "ERROR: mitmdump murió al arrancar. Últimas líneas del log:" >&2 tail -20 "$log_path" >&2 return 1 fi # Emitir JSON con información del proceso arrancado printf '{"pid": %d, "port": %d, "out_dir": "%s", "rotate_min": %d, "log": "%s"}\n' \ "$pid" "$port" "$out_dir" "$rotate_min" "$log_path" } # Ejecutar si se llama directamente (fn run / bash ) if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then start_mitm_capture "$@" fi