generate_grub_entry() ahora:
- Detecta el nombre real del initrd en /casper (initrd.lz, initrd.img, initrd)
y lo pasa a generate_grub_entry_fallback() como parámetro.
- Valida que loopback.cfg tenga contenido útil: si solo contiene "source ..."
(como Linux Mint) lo descarta y usa el fallback con paths reales.
Corrige la entrada rota de Linux Mint que usaba initrd=/casper/initrd
en lugar de initrd=/casper/initrd.lz.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Agrega regla específica para *netinst*/*netinstall* en generate_grub_entry_fallback
con paths /install.amd/vmlinuz + /install.amd/initrd.gz. Debe evaluarse antes
de la regla genérica *debian* que usa rutas de ISO live (/live/vmlinuz).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
download_from_catalog() refactorizada en 4 funciones:
_catalog_load() — parsea isos.conf agrupando por sección # ──
_catalog_menu_categorias() — muestra las categorías con conteo de ISOs
_catalog_menu_isos(cat) — muestra solo las ISOs de la categoría elegida
_catalog_do_download() — ejecuta la descarga (sin cambios funcionales)
El usuario elige primero la categoría (rm-ISOs, Debian, Ubuntu, etc.)
y luego ve solo las ISOs de esa categoría, evitando la lista larga.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
El hook 41_multiboot ahora envuelve todas las ISOs dentro de un submenu
de GRUB con título 'rm-MULTIBOOT [N ISOs]'. Si no hay ISOs, no aparece
ninguna entrada en el menú. Esto da una entrada fija y ordenada en el
menú de arranque en lugar de mezclar las ISOs con las entradas del SO.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- _complete_setup_if_needed(): completa fstab + grub hook cuando MULTIBOOT
existe pero el script se corre por primera vez post-reboot (Escenario 4).
También limpia hooks residuales del initramfs si el local-bottom falló y
regenera el initramfs. Se llama desde menu_principal al detectar MULTIBOOT.
- local-bottom: robustecer el script de cleanup para buscar el mountpoint
correcto cuando rootmnt no está en el entorno. Agrega logging detallado.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Reemplaza el script de rescue manual (que requería Live CD) por un
mecanismo que instala hooks en initramfs para reducir la partición
raíz y crear MULTIBOOT en el próximo arranque, sin ningún medio externo.
Cambios técnicos:
- _wizard_rescue_root: genera local-premount y local-bottom en initramfs
- Hook de herramientas: copia resize2fs, parted, mkfs.ext4, mke2fs, e2fsck
- parted ---pretend-input-tty con doble Yes: acepta warnings interactivos
- +1 MiB en new_root_end_mib: corrige descalce de alineamiento de parted
- mkpart con Yes: acepta "closest location" cuando hay partición extendida adyacente
- local-bottom cleanup: elimina hooks de la raíz vía ${rootmnt} post-resize
- Condición idempotente: no actúa si el dispositivo destino ya existe
- Plan actualizado: tareas 2.4 y 2.5 completadas, versiones registradas
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Implementa 4 escenarios de disco reales:
Escenario 1: espacio libre sin particionar en cualquier disco (anterior)
Escenario 2: disco secundario vacío disponible
Escenario 3: partición no-raíz con espacio libre (resize en caliente)
Escenario 4: solo espacio en filesystem raíz → genera script rescue para live CD
- Agrega sistema de log en /var/log/rm-multiboot.log con timestamps
- El script rescue generado automatiza e2fsck + resize2fs + parted + mkfs
- Plan de pruebas actualizado: Fase 2 ampliada, Fase 5 ajustada
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Calcula el tiempo estimado restante usando velocidad promedio desde el
inicio de la descarga (más estable que velocidad instantánea para ETA).
Formato mm:ss para descargas < 1 hora, h:mm:ss para descargas largas.
Muestra "--:--" mientras no hay datos suficientes para estimar.
ETA solo aparece cuando el servidor informa Content-Length.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Calcula delta de bytes entre cada tick del loop (0.3 s) y lo convierte
a MB/s con un decimal via awk. Se muestra en la misma línea de progreso:
→ [########------------] 42% (1823 de 4340 MB) 23.5 MB/s
Sin Content-Length: "1247 MB 23.5 MB/s"
Al completar: muestra tamaño final sin velocidad (limpia la línea).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Nueva función get_remote_size: obtiene Content-Length via HEAD request
- Nueva función download_with_progress: descarga en background y muestra
barra [####----] + porcentaje + MB actuales / MB totales en tiempo real
- gdrive_download simplificada: delega en download_with_progress
- download_from_catalog usa un único punto de descarga para Drive y URLs directas
- Fallback a "X MB descargados..." cuando el servidor no informa Content-Length
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Nuevas funciones: is_gdrive_url, gdrive_file_id, gdrive_real_filename,
gdrive_download — detectan y descargan desde URLs de Google Drive
usando drive.usercontent.google.com con confirm=t (sin redirección)
- El nombre del archivo se obtiene del header Content-Disposition;
si falla, se genera desde el nombre del catálogo
- Agrega ChromeOS Flex (stable) al catálogo con nota de que es imagen
de disco para flashear, no ISO booteable por GRUB loopback
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
El catálogo se obtiene en tiempo de ejecución desde:
raw.githubusercontent.com/ricardomonla/rm-MULTIBOOT/main/isos.conf
Flujo: intenta GitHub primero → fallback al archivo local si no hay red.
El archivo temporal se limpia automáticamente tras leer las entradas.
Actualizar el catálogo ahora solo requiere editar isos.conf en GitHub.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Script renombrado a rm-multiboot.sh con header de autor y versión
- Nuevo archivo isos.conf: catálogo NOMBRE|URL con 30+ distros populares
- Nuevo flujo "Agregar ISO": elegir entre descargar del catálogo o ruta local
- Descarga con wget (con fallback a curl) y retoma descargas incompletas (-c)
- El nombre del catálogo se usa como etiqueta GRUB cuando la detección es genérica
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>