Bug descubierto al ejecutar el reset real: los guards y los kills usaban
'pgrep -af [c]hromium | grep -F <udd>'. Como la ruta del user-data-dir contiene
la cadena 'chromium' (~/.config/chromium-cdp), el propio proceso grep/ugrep —cuyo
cmdline incluye <udd>— era capturado por pgrep, dando un falso positivo perpetuo:
el guard creía siempre que había un chromium abierto y delete/restore abortaban
con exit 2, y el lazo de cierre nunca convergía.
Fix en delete_chrome_profile, restore_chrome_bookmarks, create_chrome_profile y el
pipeline reset_chrome_profiles: enumerar por PID con 'pgrep -x chromium' (comm
exactamente 'chromium', nunca grep/pgrep/bash) y leer /proc/PID/cmdline para
comprobar el udd. Validado: reset destructivo real de los 4 perfiles completó OK,
cada perfil quedó con solo uBlock + web_proxy y los bookmarks restaurados.
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.
Permite force-instalar extensiones self-hosted bajo managed policy indicando
un update_url propio (p.ej. file:// a un update.xml local que apunta a un .crx).
Necesario para cargar extensiones propias (como la de captura de web_proxy)
cuando hay una managed policy activa y --load-extension queda desactivado en
Chromium 137+. Forma simple '<id>' sigue usando el update_url por defecto.
Rediseño de apply_chromium_extension_policy y nueva función de purga in-place,
tras resolver por qué las extensiones bloqueadas reaparecían en Chromium 148.
- apply_chromium_extension_policy: añade --block (ExtensionInstallBlocklist).
Reemplaza el modo ExtensionSettings "*": blocked (que rompía las extensiones
unpacked vía --load-extension, p.ej. la de captura de web_proxy con el error
'Loading of unpacked extensions is disabled by the administrator') por una
blocklist específica. FIX RAÍZ: los backups se guardan fuera de policies/managed/
(en policy-backups/), porque Chromium lee TODOS los archivos del directorio
managed/ sin filtrar extensión de nombre — un extensions.json.bak ahí se mergea
con la policy y reinyecta las extensiones del backup (location=7).
- clean_chrome_profile_extensions (nueva): purga in-place de un perfil existente
(borra carpetas de Extensions/ + refs en Preferences/Secure Preferences) dejando
solo la whitelist. Complementa la policy: la policy evita reinstalación, esta
desinstala lo ya presente. Requiere chromium cerrado.
Ambas: dominio browser, grupo navegator, guard de auto-ejecución, dry-run.
Cierra el gap de reproducibilidad entre PCs del proyecto web_scraping:
la organizacion de extensiones y el CDP global dejaban de ser pasos
manuales con sudo documentados en prosa.
- apply_chromium_extension_policy: escribe ExtensionInstallForcelist
(whitelist via --keep) en /etc/chromium/policies/managed/extensions.json
de forma idempotente, con backup automatico y validacion JSON. --dry-run
previsualiza sin tocar el sistema.
- apply_chromium_cdp_flag: gestiona /etc/chromium.d/cdp (CDP global).
Loopback por defecto, --network para bind 0.0.0.0 (con aviso), --remove
para desactivar, --dry-run para previsualizar. Idempotente con backup.
Ambas: dominio browser, grupo navegator, impuras (escriben en /etc via
sudo), guard de auto-ejecucion (ejecutables con fn run y sourceables).
Docs del proyecto (CONVENTIONS.md reglas 8/9, CHROMIUM_SYSTEM.md
inventario + tabla accionable) ahora apuntan a 'fn run apply_chromium_*'
como metodo canonico en vez de editar los archivos de /etc a mano.
Funciones nuevas del dominio browser (grupo navegator):
- cdp_move_mouse_human / cdp_click_human: movimiento de raton con curva
de Bezier cubica, easing y micro-jitter para imitar comportamiento
humano y reducir deteccion de automatizacion.
- cdp_wait_idle: espera network-idle contando requests en vuelo via
eventos CDP Network.*; inmune a extensiones que mutan el DOM
(Dark Reader, uBlock) y a animaciones JS.
- list_chrome_profiles: lista perfiles de un user-data-dir (extensiones,
nombre legible, preferencias).
- prepare_chrome_profile (bash): clona un user-data-dir conservando solo
una whitelist de extensiones (default uBlock Origin Lite).
Modificadas:
- chrome_launch: Linux-first (chromium/google-chrome/brave antes que
chrome.exe), KeepExtensions y Setpgid para matar el arbol con cdp_close.
- cdp_close: kill por grupo de proceso.
Todas con tests verdes (go test ./functions/browser ok).