# APT Upgrade - Modos Desatendido vs Manual

## Problema común

Por defecto, `apt upgrade -y` se queda **colgado esperando input** cuando hay conflictos en archivos de configuración modificados, rompiendo la automatización en servidores. En situaciones de mantenimiento desatendido, es necesario obviarlo.

## Tipos de preguntas en apt upgrade

### 1. Confirmación inicial (lista de paquetes)

```
The following packages will be upgraded:
  zabbix-agent2 nginx mysql-server (y otros 25 paquetes)
Do you want to continue? [Y/n]
```

### 2. Conflictos de configuración (el problema real)

```
Configuration file '/etc/zabbix/zabbix_agent2.conf'
 ==> Modified (by you or by a script) since installation.
 ==> Package distributor has shipped an updated version.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : start a shell to examine the situation
```

## Soluciones para upgrades desatendidos

### Método 1: Opciones en línea de comandos (puntual)

```bash
# Mantener siempre la configuración actual (recomendado)
sudo apt -o Dpkg::Options::="--force-confold" upgrade -y

# Usar siempre la nueva configuración del paquete
sudo apt -o Dpkg::Options::="--force-confnew" upgrade -y

# Comando más completo (recomendado para scripts)
sudo DEBIAN_FRONTEND=noninteractive apt \
  -o Dpkg::Options::="--force-confold" \
  -o Dpkg::Options::="--force-confdef" \
  upgrade -y
```

> Cada uno de los métodos tiene su necesidad de entenderlo. La opcion **usar la nueva configuración**, puede ser muy problemática, pues por norma general, muchos o simplemenet algunos ficheros de configuración pueden estar modificados y su reseteo a la versión nueva, puede dejar el servicio inconsistente e incluso en algunos casos, perder la accesibilidad al servidor (sshd). El desatendido, en el que queremos conservar el fichero atcual, es lo más común, pero puede hacernos olvidar que a veces hay cambios que hay que aplicarlos. Vivimos tiempos de inmediatez, y de pocos recursos para administración de sistemas, y esto puede ser un problema.

### Método 2: Configuración global permanente (recomendado)

```bash
# Crear archivo de configuración global
sudo tee /etc/apt/apt.conf.d/50unattended-upgrades << 'EOF'
Dpkg::Options {
    "--force-confold";
    "--force-confdef";
}
EOF
```

**Resultado después de crear el archivo:**

- `sudo apt upgrade -y` → Totalmente desatendido
- `sudo apt upgrade` → Solo pregunta confirmación inicial, conflictos automáticos

### Método 3: Variable de entorno (temporal)

```bash
# Para la sesión actual
export DEBIAN_FRONTEND=noninteractive
sudo -E apt upgrade -y

# Para un comando específico
sudo DEBIAN_FRONTEND=noninteractive apt upgrade -y
```

## Opciones de dpkg explicadas

| Opción | Descripción | Equivale a presionar |
|--------|-------------|---------------------|
| `--force-confold` | Mantener configuración actual | **N** (No) |
| `--force-confnew` | Usar nueva configuración del paquete | **Y** (Yes) |
| `--force-confdef` | Usar respuesta por defecto si existe | Automático |
| `--force-confask` | Preguntar siempre (modo interactivo) | Pregunta manual |
| `--force-confmiss` | Instalar archivos de configuración faltantes | Automático |

## Sobreescribir configuración global (uso manual)

### Cuando tienes configuración global pero quieres control manual

```bash
# Desactivar todas las opciones automáticas (preguntará todo)
sudo apt -o Dpkg::Options::="" upgrade

# Forzar modo interactivo completo
sudo apt -o Dpkg::Options::="--force-confask" upgrade

# Usar nuevas configuraciones temporalmente
sudo apt -o Dpkg::Options::="--force-confnew" upgrade

# Modo interactivo con interfaz gráfica
sudo DEBIAN_FRONTEND=dialog apt upgrade
```

### Para casos específicos

```bash
# Solo preguntar en conflictos (recomendado para revisión)
sudo apt -o Dpkg::Options::="--force-confask" -o Dpkg::Options::="--force-confdef" upgrade

# Mostrar diferencias antes de decidir
sudo apt -o Dpkg::Options::="--force-confask" upgrade
# (Luego presionar 'D' para ver diferencias)
```

## Verificar configuración actual

```bash
# Ver toda la configuración de apt
apt-config dump

# Ver solo opciones de dpkg
apt-config dump | grep -i dpkg

# Ver archivos de configuración de apt
ls -la /etc/apt/apt.conf.d/

# Verificar contenido del archivo personalizado
cat /etc/apt/apt.conf.d/50unattended-upgrades
```

## Casos de uso recomendados

### Para servidores de producción

Conservará el fichero original

```bash
# Configuración global permanente (Método 2)
sudo tee /etc/apt/apt.conf.d/50unattended-upgrades << 'EOF'
Dpkg::Options {
    "--force-confold";
    "--force-confdef";
}
EOF

# Uso diario
sudo apt update && sudo apt upgrade -y
```

### Para actualizaciones críticas o manuales

```bash
# Revisar manualmente cada conflicto
sudo apt -o Dpkg::Options::="--force-confask" upgrade

# Ver diferencias antes de decidir
# Presionar 'D' cuando aparezca el conflicto
```

### Para scripts automatizados

```bash
#!/bin/bash
# Script de actualización desatendida
sudo DEBIAN_FRONTEND=noninteractive apt update
sudo DEBIAN_FRONTEND=noninteractive apt \
  -o Dpkg::Options::="--force-confold" \
  -o Dpkg::Options::="--force-confdef" \
  upgrade -y

# Log de cambios
echo "Upgrade completed at $(date)" >> /var/log/auto-upgrade.log
```

### Para desarrollo/testing

```bash
# Aplicar siempre nuevas configuraciones
sudo apt -o Dpkg::Options::="--force-confnew" upgrade -y

# O mantener configuraciones personalizadas
sudo apt -o Dpkg::Options::="--force-confold" upgrade -y
```

## Comandos de emergencia

### Si apt se cuelga durante upgrade

```bash
# En otra terminal/SSH
sudo killall apt apt-get dpkg

# Reparar estado de paquetes
sudo dpkg --configure -a
sudo apt --fix-broken install
```

### Limpiar locks si es necesario

```bash
sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/cache/apt/archives/lock
sudo dpkg --configure -a
```

## Configuración recomendada paso a paso

### Instalación inicial (una sola vez)

```bash
# 1. Crear configuración global
sudo tee /etc/apt/apt.conf.d/50unattended-upgrades << 'EOF'
Dpkg::Options {
    "--force-confold";
    "--force-confdef";
}
EOF

# 2. Verificar que funciona
sudo apt update
apt-config dump | grep -i dpkg
```

### Uso diario

```bash
# Actualización desatendida completa
sudo apt update && sudo apt upgrade -y

# Actualización con revisión manual ocasional
sudo apt update
sudo apt -o Dpkg::Options::="--force-confask" upgrade
```

## Notas importantes

- **`--force-confold`** es la opción más segura para producción (mantiene tus configuraciones)
- **`--force-confnew`** puede sobreescribir configuraciones importantes
- **Siempre hacer backup** de configuraciones críticas antes de upgrades mayores
- **La configuración global** se aplica a todos los usuarios del sistema
- **Puedes combinar opciones** para casos específicos
- **Las opciones de línea de comandos** siempre sobreescriben la configuración global

> Hacer backups regulares de /etc son **altamente reomendables** (como todos los backups o copias de respaldo)

## Troubleshooting común

### Problema: "dpkg was interrupted"

```bash
sudo dpkg --configure -a
sudo apt --fix-broken install
```

### Problema: "Could not get lock"

```bash
sudo lsof /var/lib/dpkg/lock-frontend
sudo killall apt apt-get
sudo rm /var/lib/dpkg/lock-frontend
```

### Problema: Paquetes retenidos (held back)

```bash
# Ver paquetes retenidos
apt list --upgradable

# Forzar actualización
sudo apt full-upgrade
```

Esta configuración te permitirá tener upgrades completamente automatizados por defecto, pero con la flexibilidad de tomar control manual cuando sea necesario.

##### Aviso
Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. 
También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad.
El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de [Castris](https://castris.com)

Si necesitas soporte profesional puedes contratar con Castris [soporte profesional](https://intranet.castris.com/store/soporte-profesional).