Configuracion inicial completa del entorno personal
Modulos de restauracion: - bootstrap: instala yq, age y dependencias base (curl, wget, git, nano, gpg) - ssh: descifra e instala claves SSH desde secrets/sshKeys.tar.gz.age - registry: aplica paquetes apt/snap/flatpak, dotfiles, servicios y configs Docker - thunderbird: instala Thunderbird snap y restaura perfil desde ZIP - claudeCode: configura repositorio apt de Anthropic e instala claude-code - easyEffects: restaura configuracion y presets desde ZIP - wireplumber: restaura dispositivo Bluetooth por defecto y perfiles de audio - cups: restaura impresoras y drivers PPD desde ZIP Scripts de captura (correr antes de push): - scripts/encryptSsh.sh: cifra ~/.ssh con age - scripts/thunderbird/capture.sh: captura perfil de Thunderbird snap - scripts/easyEffects/capture.sh: captura config de EasyEffects flatpak - scripts/wireplumber/capture.sh: captura estado de WirePlumber - scripts/cups/capture.sh: captura impresoras CUPS y PPDs (requiere sudo) Registro de aplicaciones (config/registry.yaml): - 9 paquetes apt, 1 snap (dbeaver-ce), 22 flatpaks incluyendo VSCodium, Bitwarden, Inkscape, LibreOffice, OBS Studio, Nextcloud Desktop, entre otros Secretos incluidos: - secrets/sshKeys.tar.gz.age: claves SSH cifradas con age - secrets/thunderbirdProfile.zip: perfil de Thunderbird sin emails ni cache - secrets/easyEffectsConfig.zip: ajustes y presets de salida de audio - secrets/wireplumberState.zip: estado de audio incluyendo auriculares Bluetooth - secrets/cupsConfig.zip: 5 impresoras configuradas con sus drivers Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
stpRoot="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
source "$stpRoot/lib/log.sh"
|
||||
source "$stpRoot/lib/utils.sh"
|
||||
|
||||
readonly outputFile="$stpRoot/secrets/cupsConfig.zip"
|
||||
|
||||
cupsIsInstalled() {
|
||||
util::cmdExists lpstat
|
||||
}
|
||||
|
||||
printersAreConfigured() {
|
||||
sudo test -s /etc/cups/printers.conf
|
||||
}
|
||||
|
||||
copyFilesToTemporaryDirectory() {
|
||||
local temporaryDirectory="$1"
|
||||
sudo cp /etc/cups/printers.conf "$temporaryDirectory/printers.conf"
|
||||
if sudo test -d /etc/cups/ppd && sudo test -n "$(sudo ls /etc/cups/ppd/)"; then
|
||||
sudo cp -r /etc/cups/ppd "$temporaryDirectory/ppd"
|
||||
fi
|
||||
sudo chown -R "$USER" "$temporaryDirectory"
|
||||
}
|
||||
|
||||
if ! cupsIsInstalled; then
|
||||
log::warn "CUPS no instalado"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
util::requireSudo
|
||||
|
||||
if ! printersAreConfigured; then
|
||||
log::warn "No hay impresoras configuradas en /etc/cups/printers.conf"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
log::step "Capturando configuración de CUPS"
|
||||
mkdir -p "$stpRoot/secrets"
|
||||
rm -f "$outputFile"
|
||||
|
||||
temporaryDirectory="$(mktemp -d)"
|
||||
trap 'rm -rf "$temporaryDirectory"' EXIT
|
||||
|
||||
copyFilesToTemporaryDirectory "$temporaryDirectory"
|
||||
|
||||
(
|
||||
cd "$temporaryDirectory"
|
||||
find . -not -type d | sed 's|^\./||' | zip -q "$outputFile" -@
|
||||
)
|
||||
|
||||
log::ok "Guardado: secrets/cupsConfig.zip ($(du -sh "$outputFile" | cut -f1))"
|
||||
log::info "Impresoras respaldadas: $(lpstat -a | awk '{print $1}' | tr '\n' ' ')"
|
||||
log::info "Commiteá secrets/cupsConfig.zip antes de hacer push"
|
||||
@@ -0,0 +1,30 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
stpRoot="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
source "$stpRoot/lib/log.sh"
|
||||
|
||||
readonly easyEffectsApplicationDirectory="$HOME/.var/app/com.github.wwmm.easyeffects"
|
||||
readonly outputFile="$stpRoot/secrets/easyEffectsConfig.zip"
|
||||
|
||||
easyEffectsDataExists() {
|
||||
[[ -d "$easyEffectsApplicationDirectory/config/easyeffects" ]] || [[ -d "$easyEffectsApplicationDirectory/data/easyeffects" ]]
|
||||
}
|
||||
|
||||
if ! easyEffectsDataExists; then
|
||||
log::warn "Datos de EasyEffects no encontrados en: $easyEffectsApplicationDirectory"
|
||||
log::info "Asegurate de haber abierto EasyEffects al menos una vez antes de capturar"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
log::step "Capturando configuración de EasyEffects"
|
||||
mkdir -p "$stpRoot/secrets"
|
||||
rm -f "$outputFile"
|
||||
|
||||
(
|
||||
cd "$easyEffectsApplicationDirectory"
|
||||
find "config/easyeffects" "data/easyeffects" -not -type d 2>/dev/null \
|
||||
| zip -q "$outputFile" -@
|
||||
)
|
||||
|
||||
log::ok "Guardado: secrets/easyEffectsConfig.zip ($(du -sh "$outputFile" | cut -f1))"
|
||||
log::info "Commiteá secrets/easyEffectsConfig.zip antes de hacer push"
|
||||
Executable
+38
@@ -0,0 +1,38 @@
|
||||
#!/usr/bin/env bash
|
||||
# Cifra ~/.ssh con age y guarda el resultado en secrets/sshKeys.tar.gz.age.
|
||||
# Corré esto en tu máquina actual ANTES de hacer push del repo.
|
||||
#
|
||||
# Uso: ./scripts/encryptSsh.sh [ruta-a-.ssh]
|
||||
set -euo pipefail
|
||||
|
||||
stpRoot="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
sshSource="${1:-$HOME/.ssh}"
|
||||
|
||||
if [[ ! -d "$sshSource" ]]; then
|
||||
echo "Error: directorio no encontrado: $sshSource"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v age &>/dev/null; then
|
||||
echo "Error: age no está instalado. Instalalo con: sudo apt install age"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p "$stpRoot/secrets"
|
||||
readonly outputFile="$stpRoot/secrets/sshKeys.tar.gz.age"
|
||||
|
||||
workingDirectory="$(mktemp -d)"
|
||||
trap 'rm -rf "$workingDirectory"' EXIT
|
||||
|
||||
echo "Empaquetando $sshSource..."
|
||||
tar -czf "$workingDirectory/sshKeys.tar.gz" -C "$(dirname "$sshSource")" "$(basename "$sshSource")"
|
||||
|
||||
echo "Cifrando con age (usá una passphrase segura que puedas recordar)..."
|
||||
age --passphrase --output "$outputFile" "$workingDirectory/sshKeys.tar.gz"
|
||||
|
||||
echo ""
|
||||
echo "✓ Claves cifradas guardadas en: secrets/sshKeys.tar.gz.age"
|
||||
echo " Este archivo es seguro para commitear — está cifrado simétricamente."
|
||||
echo ""
|
||||
echo "Para verificar que el cifrado funciona:"
|
||||
echo " age --decrypt secrets/sshKeys.tar.gz.age | tar -tzv"
|
||||
@@ -0,0 +1,36 @@
|
||||
#!/usr/bin/env bash
|
||||
# Excluye emails, caché, crash dumps y archivos de bloqueo.
|
||||
# Replica lo que hace el export integrado de Thunderbird (Ajustes → Exportar perfil).
|
||||
set -euo pipefail
|
||||
stpRoot="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
source "$stpRoot/lib/log.sh"
|
||||
|
||||
readonly thunderbirdApplicationDirectory="$HOME/snap/thunderbird/common"
|
||||
readonly thunderbirdProfileDirectory="$thunderbirdApplicationDirectory/.thunderbird"
|
||||
readonly outputFile="$stpRoot/secrets/thunderbirdProfile.zip"
|
||||
|
||||
thunderbirdDataExists() {
|
||||
[[ -d "$thunderbirdProfileDirectory" ]]
|
||||
}
|
||||
|
||||
if ! thunderbirdDataExists; then
|
||||
log::warn "Datos de Thunderbird Snap no encontrados en: $thunderbirdProfileDirectory"
|
||||
log::info "Asegurate de haber abierto Thunderbird al menos una vez antes de capturar"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
log::step "Capturando configuración de Thunderbird"
|
||||
mkdir -p "$stpRoot/secrets"
|
||||
rm -f "$outputFile"
|
||||
|
||||
(
|
||||
cd "$thunderbirdApplicationDirectory"
|
||||
find ".thunderbird" \
|
||||
| grep -Ev "/(Mail|ImapMail|News|cache|cache2|startupCache|minidumps|crashes|storage|Crash Reports)(/|$)" \
|
||||
| grep -Ev "\.(msf|sqlite-wal|sqlite-shm)$" \
|
||||
| grep -Ev "/(parent\.lock|lock)$" \
|
||||
| zip -q "$outputFile" -@
|
||||
)
|
||||
|
||||
log::ok "Guardado: secrets/thunderbirdProfile.zip ($(du -sh "$outputFile" | cut -f1))"
|
||||
log::info "Commiteá secrets/thunderbirdProfile.zip antes de hacer push"
|
||||
@@ -0,0 +1,29 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
stpRoot="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
source "$stpRoot/lib/log.sh"
|
||||
|
||||
readonly wireplumberStateDirectory="$HOME/.local/state/wireplumber"
|
||||
readonly outputFile="$stpRoot/secrets/wireplumberState.zip"
|
||||
|
||||
wireplumberStateExists() {
|
||||
[[ -d "$wireplumberStateDirectory" ]]
|
||||
}
|
||||
|
||||
if ! wireplumberStateExists; then
|
||||
log::warn "Estado de WirePlumber no encontrado en: $wireplumberStateDirectory"
|
||||
log::info "Asegurate de haber conectado los auriculares bluetooth al menos una vez"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
log::step "Capturando estado de WirePlumber"
|
||||
mkdir -p "$stpRoot/secrets"
|
||||
rm -f "$outputFile"
|
||||
|
||||
(
|
||||
cd "$HOME/.local/state"
|
||||
find "wireplumber" -not -type d | zip -q "$outputFile" -@
|
||||
)
|
||||
|
||||
log::ok "Guardado: secrets/wireplumberState.zip ($(du -sh "$outputFile" | cut -f1))"
|
||||
log::info "Commiteá secrets/wireplumberState.zip antes de hacer push"
|
||||
Reference in New Issue
Block a user