--- name: apply_chromium_extension_policy kind: function lang: bash domain: browser version: "1.0.0" purity: impure signature: "apply_chromium_extension_policy --keep [--keep ]... [--policy-path ] [--update-url ] [--dry-run]" description: "Escribe de forma idempotente la política managed de Chromium (ExtensionInstallForcelist) que fuerza la instalación de un conjunto de extensiones en cualquier perfil del navegador. Crea backup con sufijo de fecha si el archivo preexiste y su contenido difiere. Requiere sudo para escribir en /etc; en modo --dry-run no toca el sistema." tags: [chromium, extensions, policy, browser, navegator, managed-policy, idempotent] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [] params: - name: "--keep " desc: "ID de extensión de Chrome Web Store a force-instalar (repetible, al menos uno obligatorio). Ejemplo: ddkjiahejlhfcafbddmgiahcphecmpfh (uBlock Origin Lite)." - name: "--policy-path " desc: "Ruta del JSON de managed policy. Default: /etc/chromium/policies/managed/extensions.json." - name: "--update-url " desc: "URL del servicio de actualización de extensiones. Default: https://clients2.google.com/service/update2/crx." - name: "--dry-run" desc: "Imprime el JSON que se escribiría sin tocar el sistema (no requiere sudo)." output: "Escribe el JSON de política en policy-path y emite a stdout un resumen: extensiones aplicadas, ruta, backup creado y recordatorio de reinicio de Chromium. Sale 0 si la política se aplicó o ya estaba vigente. Sale != 0 en error." tested: false tests: [] test_file_path: "" file_path: "bash/functions/browser/apply_chromium_extension_policy.sh" --- ## Ejemplo ```bash # Forzar solo uBlock Origin Lite en todos los perfiles (proyecto web_scraping, regla 9) source bash/functions/browser/apply_chromium_extension_policy.sh apply_chromium_extension_policy --keep ddkjiahejlhfcafbddmgiahcphecmpfh # Previsualizar sin tocar el sistema (sin sudo) apply_chromium_extension_policy --keep ddkjiahejlhfcafbddmgiahcphecmpfh --dry-run # Forzar varias extensiones a la vez apply_chromium_extension_policy \ --keep ddkjiahejlhfcafbddmgiahcphecmpfh \ --keep cjpalhdlnbpafiamejdnhcphjbkeiagm \ --policy-path /etc/chromium/policies/managed/extensions.json # Usando pass para el sudo no interactivo (setup de este equipo) # apply_chromium_extension_policy ya usa sudo tee internamente; # si el entorno requiere pass: ejecutar como root o con SUDO_ASKPASS configurado. ``` ## Cuando usarla Al preparar un PC nuevo o cambiar qué extensiones de Chrome Web Store deben estar presentes en cualquier perfil de Chromium del equipo. Reemplaza el paso manual de editar el JSON de policy con sudo. Indispensable tras un fresh install o cuando se añade o retira una extensión del conjunto obligatorio del proyecto `web_scraping`. ## Gotchas - **Requiere sudo** para escribir en `/etc/chromium/policies/managed/`. En este equipo se alimenta con `pass show claude/sudo | sudo -S ` para operaciones autónomas. - **Chrome cachea la política en memoria**: hay que cerrar TODOS los procesos Chromium (`pkill -9 chromium`) y relanzar para que el cambio surta efecto en runtime. Alternativa sin cerrar: `chrome://policy` → botón "Reload policies". - **Idempotente**: si el archivo de policy ya tiene el mismo contenido, la función detecta el no-op y sale 0 sin escribir nada. - **Backup por día**: si el contenido difiere, crea `.bak.YYYYMMDD`. Si el backup del día ya existe, no lo sobreescribe. Los backups no se limpian automáticamente. - **`ExtensionInstallForcelist` solo gestiona las extensiones listadas** — no elimina extensiones que el usuario haya instalado manualmente; solo garantiza que las listadas estén instaladas. - **No aplica a Chrome stable 138+**: en Chrome estable la flag `--load-extension` está desactivada, pero las managed policies siguen siendo el mecanismo correcto para force-install desde Web Store. - Para referencia del sistema completo: `projects/web_scraping/CHROMIUM_SYSTEM.md`.