Files
fn_registry/bash/functions/browser/create_chrome_profile.md
T
Egutierrez ae841ceedb feat(browser): CRUD de perfiles Chromium + pipeline reset_chrome_profiles
Cinco funciones nuevas (dominio browser, grupo navegator) que cierran los gaps
de gestión de perfiles, más un pipeline que las orquesta:

- backup_chrome_bookmarks / restore_chrome_bookmarks: backup y restore de los
  archivos Bookmarks (copia byte a byte verbatim para preservar el checksum
  interno; en Chromium 148 los bookmarks no están bajo el super_mac de Secure
  Preferences). Guard por user-data-dir (no global).
- delete_chrome_profile: borra la carpeta del perfil + limpia su entrada en
  Local State (info_cache, profiles_order, last_active_profiles, last_used).
- create_chrome_profile: lanza chromium headless (vía systemd-run) para que la
  managed policy instale la whitelist de extensiones, y asigna el nombre legible
  en Local State. Mata todo el árbol de chromium del udd antes de editar Local
  State (los hijos zygote/gpu no repiten --user-data-dir pero referencian la ruta).
- list_chrome_profile_extensions (Go): lista extensiones de un perfil con
  ID/name/version/location/enabled/fromPolicy. 7 unit tests.
- reset_chrome_profiles (pipeline): backup -> cerrar chromium -> delete -> create
  -> restore -> verify. Destructivo (--yes), --dry-run seguro.

Validado: unit tests Go verdes, backup/restore byte-idéntico, delete limpia Local
State, create instala la forcelist global (uBlock + web_proxy) en perfiles nuevos.
2026-06-06 01:24:21 +02:00

5.9 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, tested, tests, test_file_path, file_path, params, output
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports tested tests test_file_path file_path params output
create_chrome_profile function bash browser 1.0.0 impure create_chrome_profile --user-data-dir <dir> --profile <dir-name> --name <legible> [--port N] [--chrome-path <path>] [--no-launch] [--timeout-sec N] [--dry-run] Crea un perfil Chrome/Chromium nuevo en un user-data-dir: opcionalmente lanza chromium headless vía systemd-run para que la managed policy instale las extensiones forzadas (uBlock, web_proxy) y luego edita Local State para asignar el nombre legible al perfil. Con --no-launch crea solo la estructura de carpetas y la entrada en Local State sin arrancar Chrome.
navegator
chromium
profile
browser
cdp
headless
scraping
false error_go_core
false
bash/functions/browser/create_chrome_profile.sh
name desc
--user-data-dir Raíz del user-data-dir de Chrome/Chromium. Puede no existir; la función lo crea. Obligatorio.
name desc
--profile Nombre de la carpeta del perfil dentro de user-data-dir, por ejemplo: Default, "Profile 1", Automation. Obligatorio.
name desc
--name Nombre legible visible en el selector de perfil de Chrome, por ejemplo: Work, Aurgi, Bot. Obligatorio.
name desc
--port Puerto CDP para el lanzamiento headless. Default: 9250. Usar un valor distinto al 9222 global para no colisionar.
name desc
--chrome-path Ruta absoluta al binario chromium/chrome. Si se omite, auto-detecta: chromium, chromium-browser, google-chrome, brave-browser.
name desc
--no-launch No lanza chromium. Solo crea la carpeta del perfil y edita Local State con el nombre legible. El perfil no tendrá extensiones instaladas. Útil para tests y CRUD offline.
name desc
--timeout-sec Segundos máximos esperando a que Preferences aparezca tras el lanzamiento headless. Default: 25.
name desc
--dry-run Describe las acciones que se ejecutarían sin lanzar ni escribir nada. Emite el JSON de resultado con dry_run:true.
JSON en stdout: {"profile":"<dir-name>","name":"<legible>","launched":true|false,"preferences_created":true|false}. En dry-run añade "dry_run":true. Exit 0 en éxito.

Ejemplo

source $HOME/fn_registry/bash/functions/browser/create_chrome_profile.sh

# Modo offline (no lanza Chrome, solo CRUD de Local State — seguro para tests)
create_chrome_profile \
  --user-data-dir /tmp/test_udd \
  --profile "Automation" \
  --name "Aurgi Bot" \
  --no-launch
# Salida: {"profile":"Automation","name":"Aurgi Bot","launched":false,"preferences_created":false}

# Modo normal: lanza headless para que la policy instale uBlock y web_proxy,
# luego asigna nombre en Local State
create_chrome_profile \
  --user-data-dir "$HOME/.local/share/web_scraping/profiles" \
  --profile "Profile 1" \
  --name "Work" \
  --port 9250
# Salida: {"profile":"Profile 1","name":"Work","launched":true,"preferences_created":true}

# Dry-run: describe acciones sin ejecutar nada
create_chrome_profile \
  --user-data-dir "$HOME/.local/share/web_scraping/profiles" \
  --profile "Default" \
  --name "Scraping" \
  --dry-run

Cuando usarla

Úsala para aprovisionar perfiles nuevos en un user-data-dir de automatización antes de lanzar sesiones CDP con script-navegador o funciones del grupo navegator. En modo normal (sin --no-launch) la managed policy instala automáticamente uBlock y la extensión web_proxy en el perfil nuevo; en --no-launch sirve para tests unitarios o para crear la entrada de Local State sin depender de Chrome.

Gotchas

  • Lanzar chromium desde Bash tool de Claude da exit-144: la función usa systemd-run --user --collect para aislar el proceso en su propio cgroup, evitando que el harness del agente lo mate. Esto es obligatorio; lanzar con & / setsid daría exit-144 en el contexto del agente.
  • La managed policy instala las extensiones al arrancar el perfil: NO pasar --disable-extensions — rompería la forcelist. Las extensiones force-listed (ExtensionInstallForcelist en /etc/chromium/policies/managed/extensions.json) se instalan en el perfil durante el primer arranque; en el headless inicial puede no completar la descarga si no hay red o si el timeout es corto.
  • Dos chromium NO pueden compartir el mismo user-data-dir: si ya hay un chromium corriendo sobre --user-data-dir, la función detecta SingletonLock y sale con exit 2 antes de lanzar. Para perfiles de automatización paralela, usa un --user-data-dir dedicado por perfil.
  • Local State debe editarse con Chrome muerto: la función para el unit de systemd y espera la desaparición de SingletonLock antes de editar Local State. Si se edita mientras Chrome está vivo, Chrome sobreescribe el archivo desde memoria al salir y los cambios de nombre se pierden.
  • --remote-allow-origins=* necesita comillas en zsh: el glob * se expande si no va entre comillas. La función pasa el flag correctamente internamente, pero si lo pasas tú en otros scripts acuérdate de las comillas.
  • Perfil diario en ~/.config/chromium-cdp: en este equipo el fragmento /etc/chromium.d/cdp redirige el user-data-dir global a ~/.config/chromium-cdp. Para automatización usar siempre un --user-data-dir dedicado fuera de ~/.config/.
  • Timeout corto puede dar preferences_created: false: el perfil headless tarda entre 2-8 segundos en crear Preferences según la carga del sistema. Si se aumenta --timeout-sec a 45-60 en máquinas lentas se evitan falsos timeouts.

Exit codes

Código Significado
0 Éxito
1 Argumento obligatorio faltante o binario no encontrado
2 Lock: ya hay un chromium usando el mismo user-data-dir
3 Timeout esperando a que Preferences se cree
4 Error editando Local State (JSON inválido tras escritura)