# Instalación y preparación manual del servicio FTP

**Pendiente de autorización y validación en el Compaq.** Las pruebas realizadas
solo usan namespaces privados y una VM. Estos comandos no se han ejecutado en el
notebook. No se necesita retirar la CompactFlash, reiniciar o cambiar la red.

## Revisar el paquete

Archivo: `armada-ftp-0.1.0-i586.apkg`, con su `.apkg.sha256`. En el servidor:

```sh
cd /home/cgpt/armada_distro/artifacts/armada-ftp
sha256sum -c armada-ftp-0.1.0-i586.apkg.sha256
```

Un SHA-256 comprueba integridad; no es una firma del proveedor. Utilizar la
entrega conocida y la conexión SSH habitual, con su identidad verificada.
Transferir a una ruta persistente ext4, no al tmpfs /tmp. No se requiere SFTP:

```sh
ssh -o StrictHostKeyChecking=yes root@IP_DEL_ARMADA \
  'mkdir -p /var/lib/apkg/incoming'
ssh -o StrictHostKeyChecking=yes root@IP_DEL_ARMADA \
  'cat > /var/lib/apkg/incoming/armada-ftp-0.1.0-i586.apkg' \
  < armada-ftp-0.1.0-i586.apkg
ssh -o StrictHostKeyChecking=yes root@IP_DEL_ARMADA \
  'cat > /var/lib/apkg/incoming/armada-ftp-0.1.0-i586.apkg.sha256' \
  < armada-ftp-0.1.0-i586.apkg.sha256
```

En el Compaq, primero solo validar:

```sh
cd /var/lib/apkg/incoming
sha256sum -c armada-ftp-0.1.0-i586.apkg.sha256
apkg --version
apkg install --dry-run /var/lib/apkg/incoming/armada-ftp-0.1.0-i586.apkg
```

Se requiere apkg con el proveedor verificado de musl base (0.1.1 o rama 0.2.1),
o una adopción legítima de musl ya existente. Con apkg 0.1.0 y DB vacía no se debe
omitir la dependencia ni registrar un paquete ficticio; usar la
[corrección independiente](../apkg/base-dependencies.md).

APKG/1 puede crear directorios 0700 por su umask. Antes de instalar, crear solo
los padres públicos que falten; no cambiar permisos de directorios existentes
sin revisar su propósito, ni los de la DB privada:

```sh
for d in /usr/local /usr/local/libexec /usr/local/libexec/armada-ftp \
         /usr/local/share /usr/local/share/armada-ftp; do
    if [ ! -e "$d" ]; then mkdir -m 0755 "$d" || exit 1; fi
done
apkg install /var/lib/apkg/incoming/armada-ftp-0.1.0-i586.apkg
apkg verify armada-ftp
/usr/local/libexec/armada-ftp/busybox --list
```

La lista debe mostrar exactamente ftpd, ls, tcpsvd. Instalar el paquete no inicia
procesos ni modifica `/etc/sv/ftp/run`, BusyBox base, SSH, tinc o runit.

## Cuenta y datos existentes

Antes de habilitar FTP, revisar sin mostrar secretos:

```sh
id cgpt
ls -ld /home /home/cgpt /home/cgpt/ftp
ip -4 addr show dev tun0
```

La cuenta `cgpt` debe tener UID/GID no nulos y una contraseña local válida y no
vacía. Se soportan los hashes de BusyBox, incluido SHA-512 `$6$` usado por la
configuración del proyecto; yescrypt no está soportado. Si falta una contraseña,
el administrador decide establecerla con `passwd cgpt`; el paquete no la cambia.
Nunca copiar passwd/shadow al chroot ni mostrarlos en informes.

Si no existe `/home/cgpt/ftp`, crearlo deliberadamente como directorio real,
propiedad de cgpt/grupo primario y permisos 0700. Si existe, preservar su contenido
y revisar propietario/permisos; no aplicar chown/chmod recursivos. Los componentes
/home, /home/cgpt y ftp no pueden ser enlaces simbólicos. No se necesitan dentro
de la jaula `/bin`, libc, claves, passwd/shadow, procfs ni otros montajes.
Los archivos nuevos usan umask 077 y pertenecen a cgpt.

## Revisar y sustituir únicamente el run existente

No se encontró una copia de `/etc/sv/ftp/run` en el repositorio. Se preparó una
plantilla para esa misma ubicación; **la comparación con el archivo físico sigue
pendiente**. No se añadirá otro servicio ni otro enlace de supervisión.

Después de revisar el archivo y autorizar la activación, guardar una copia
preservando permisos antes de sustituirlo. La siguiente secuencia es manual y
solo afecta al servicio FTP:

```sh
sv status ftp
sv down ftp
mkdir -p /var/lib/armada-ftp-backup
cp -p /etc/sv/ftp/run /var/lib/armada-ftp-backup/run.before-0.1.0
cp /usr/local/share/armada-ftp/run /etc/sv/ftp/run.new
chown 0:0 /etc/sv/ftp/run.new
chmod 0755 /etc/sv/ftp/run.new
sh -n /etc/sv/ftp/run.new
mv /etc/sv/ftp/run.new /etc/sv/ftp/run
```

No sobrescribir un respaldo anterior. Registrar también si FTP estaba up/down.
El archivo preparado ejecuta:

```sh
/usr/local/libexec/armada-ftp/busybox tcpsvd -E -c 2 -b 2 \
  10.0.0.50 21 /usr/local/libexec/armada-ftp/busybox ftpd \
  -w -t 120 -T 3600 /home/cgpt/ftp
```

Cuando se autorice iniciar únicamente FTP:

```sh
sv up ftp
sv status ftp
```

El proceso duerme esperando eventos hasta que tun0 está UP y tiene 10.0.0.50.
No levanta la interfaz ni interviene en tinc. Si se borra/recrea tun0 con un
ifindex nuevo, programar `sv restart ftp`: los sockets antiguos no se reasocian
silenciosamente. Un máximo de dos sesiones incluye las que esperan autenticación;
el tercer TCP puede quedar en backlog sin recibir banner. Timeouts: 120 s
inactivo, 3600 s absoluto. La prueba de hardware debe validar estos tiempos.

## Restricción de entrada y firewall

Los sockets se ligan tanto a la dirección VPN como al dispositivo tun0 y solo
admiten pares de 10.0.0.0/24. Eso se comprueba en el programa y en las pruebas de
entrada por interfaz incorrecta. FTP no aporta TLS: las credenciales y archivos
se transportan exclusivamente dentro de la VPN tinc existente.

La configuración kernel v3 inspeccionada tiene Netfilter deshabilitado. No se
incluyen iptables/nftables ni un cambio de kernel para este paquete. Si el
firewall real del equipo ya existe y es operativo, revisar reglas y orden para:

1. Permitir TCP a 10.0.0.50:21 y 40000–40015 solo por tun0 y desde 10.0.0.0/24.
2. Rechazar esos destinos/puertos por cualquier otra interfaz, también conexiones
   ya establecidas que lleguen por una interfaz incorrecta.
3. Conservar las reglas de SSH/tinc/Wi-Fi y la política existente; no vaciar tablas.

No se pueden proporcionar reglas listas para aplicar sin conocer el firewall
real; tampoco se instalarán automáticamente. No abrir rangos efímeros amplios:
esta compilación usa solamente el rango pasivo indicado. No hacer port-forward
FTP desde Internet o Wi-Fi hacia la VPN.

## Prueba física posterior

Desde un equipo autorizado en la VPN, usar un cliente FTP con modo pasivo:

```sh
ftp 10.0.0.50
```

Introducir cgpt y contraseña mediante el diálogo, nunca como argumento visible
ni URL guardada. Probar listado, subida de archivo pequeño, descarga con SHA-256,
eliminación, cierre/reconexión y dos sesiones simultáneas. Comprobar también
contraseña incorrecta, vacía, root y anonymous: no deben obtener sesión ni archivos.
Para clientes que no activan PASV por defecto, habilitarlo expresamente.

Conservar SSH abierto y verificar desde el Compaq los sockets sin cambiar redes:
`netstat -ltn` si ese applet está disponible, o `/proc/net/tcp`. Debe verse
10.0.0.50:21, nunca 0.0.0.0:21 ni la dirección Wi-Fi; el rango pasivo aparece
cuando se solicita PASV/EPSV. Probar además entrada dirigida a la IP VPN pero
recibida por Wi-Fi, cuando la topología de ensayo permita enrutarla.

Para RSS/PSS/CPU puede compilarse en Debian la herramienta puntual de pruebas
`tests/armada-ftp/measure.c` con el mismo SDK, transferirla a ext4 y ejecutarla
como root contra el PID del listener. No es parte del paquete ni un daemon:

```sh
./measure PID_DEL_TCPSVD
```

Devuelve JSON con HZ, reloj monotónico, RSS/PSS, ticks user/system, UID/GID y raíz
del listener y sus hijos. Kernel v3 no tiene PROC_CHILDREN: usa un recorrido
puntual de /proc para identificar hijos; el observador no se suma al consumo FTP.
Comparar reposo, una sesión y dos, además de antes/después de transferencias.
PSS suma páginas compartidas proporcionalmente; la suma RSS las cuenta varias
veces. CPU=(delta_ticks/HZ)/(delta_tiempo_ms/1000). Cero ticks significa ausencia
de CPU observada a esa resolución, no uso estrictamente cero a toda escala.

## Reversión y desinstalación

Una vez autorizado, detener solo FTP, restaurar el run anterior con sus permisos
y recuperar su estado up/down original. No arrancar un run anterior que use
applets ausentes o modo anónimo inseguro sin revisarlo:

```sh
sv down ftp
cp -p /var/lib/armada-ftp-backup/run.before-0.1.0 /etc/sv/ftp/run
apkg remove armada-ftp
```

Cerrar primero las sesiones FTP activas y comprobar que no queden hijos ftpd:
sv down detiene el listener, pero tcpsvd puede dejar sesiones existentes hasta
su cierre/timeout. No usar killall busybox: también afectaría al sistema base.

La DB apkg protege archivos modificados; seguir su recuperación documentada ante
interrupciones. El directorio `/home/cgpt/ftp` y sus datos no pertenecen al paquete
y no se eliminan. No reiniciar ni detener SSH, tinc, Wi-Fi o runit.
