repositorios de paquetes locales y pequeños, un binario, sin demonio

↓ Descargar para Linux x86-64, estático, sin dependencias · ARM, macOS, Windows y checksums

qué es

tinyrepo es una herramienta de línea de comandos escrita en Go que construye repositorios locales pequeños para Debian y sus derivadas, y para Arch Linux / Manjaro. El formato se elige con type en config.toml; los comandos son los mismos para ambos.

Nombras los paquetes que quieres, resuelve sus dependencias contra el índice real del mirror, descarga sólo lo que hace falta y publica el resultado por HTTP. Sin base de datos, sin demonio, sin dependencias en tiempo de ejecución.

inicio rápido

$ ./tinyrepo -gc > config.toml   # config de ejemplo para Debian (-ga para Arch)
$ nano config.toml               # define el mirror, la ruta y los paquetes

$ ./tinyrepo -di -ci -dp         # descarga índices, construye el repo, descarga paquetes
$ ./tinyrepo -ws                 # publícalo por HTTP

opciones

opciónqué hace
-didescarga los índices de paquetes desde el mirror
-ciresuelve los paquetes pedidos y construye el repositorio
-dpdescarga los paquetes
-wspublica el repositorio por HTTP, hasta Ctrl+C
-clelimina los paquetes que config.toml no pide
-vpcomprueba que cada paquete pedido existe en el mirror
-gc / -gaimprime un config.toml de ejemplo para Debian / Arch
-eclista los códigos de salida
-pwgenera el hash de una contraseña para el panel web y lo imprime
-sppide una contraseña y la escribe en config.toml
-gs / -grimprime una unidad de systemd / un servicio de OpenRC (Alpine)
-helpmuestra la ayuda

bajo demanda

Por defecto el repositorio es cerrado: contiene exactamente los paquetes que pide config.toml. Activando onDemand el índice publicado pasa a ser el archivo completo del mirror, mientras que en disco sólo se acumula lo que alguien instaló de verdad — la primera petición de un paquete lo transmite del mirror al cliente y al disco a la vez, y sus dependencias se precargan en segundo plano.

comprobar la lista de paquetes

-vp responde a lo que provoca una errata: ¿tiene el mirror ese nombre de verdad? Lee el índice que -di ya cacheó, así que no cuesta nada, y sale con 18 si falta alguno — directo a un job de CI. La misma comprobación es un botón en el panel web.

$ ./tinyrepo -di -vp
  MISSING nanoo                  no hay nada en el mirror con ese nombre
  ok      astrometry-data-2mass  en el índice

encontrar paquetes que añadir

La pestaña disponibles del panel es el catálogo completo del mirror — unos 64.000 paquetes en una suite de Debian — con búsqueda por nombre o descripción, paginado, y un botón en cada fila que añade el nombre a [destination].packages. El índice se parsea una vez y se conserva hasta que cambia, así que la página va rápida. La pestaña descargados responde a la otra pregunta: qué hay en disco.

panel de configuración web

-ws puede publicar además /admin: un formulario que edita config.toml, botones que ejecutan las cuatro acciones con el registro de la que esté en curso, y la comprobación de paquetes de arriba. Desactivado por defecto y tras un inicio de sesión — la contraseña se guarda con PBKDF2-SHA256, las sesiones son HttpOnly y SameSite=Strict, cada escritura lleva un token CSRF, y el panel no sirve nada de JavaScript.

$ ./tinyrepo -sp                 # pide la contraseña y la escribe en config.toml
$ ./tinyrepo -pw                 # ...o sólo imprime el hash, para pegarlo a mano

-sp reescribe la única línea de passwordHash y deja todos los comentarios tal cual. Rechaza un campo comentado — los config de ejemplo lo traen así — e indica qué línea hay que descomentar.

la lista de paquetes en el panel

/admin/packages lista todos los ficheros de paquete que hay realmente en el repositorio — nombre, versión, arquitectura, tamaño y fecha — paginados, con filtro, y cada nombre enlaza al fichero. Bajo demanda el repositorio se llena de paquetes que nadie declaró, así que un interruptor muestra sólo esos: justo lo que eliminaría -cl. Un botón en cada fila adopta un nombre en [destination].packages o lo quita — lo que cambia lo que hará la próxima ejecución, no lo que hay en disco ahora.

apuntar un cliente

Debian — añádelo a sources.list:

deb [trusted=yes] http://<host>/ tinyrepo main

Arch / Manjaro — añádelo a /etc/pacman.conf:

[tinyrepo]
SigLevel = Optional TrustAll
Server = http://<host>/

Ninguno de los repositorios generados va firmado, así que hay que confiar en ellos explícitamente. Publícalo en una red que controles, o detrás de TLS: sobre HTTP en claro estas líneas le dicen al gestor de paquetes que instale lo que le responda. Los paquetes de pacman conservan su firma original.

ejecutarlo como servicio

Ambos ficheros se rellenan con las rutas reales del binario y de su config.toml, así que no queda nada que editar. La unidad de systemd va aislada — ProtectSystem=strict, capacidades vacías y ReadWritePaths apuntando sólo al directorio del repositorio.

$ ./tinyrepo -gs | sudo tee /etc/systemd/system/tinyrepo.service
$ ./tinyrepo -gr > /etc/init.d/tinyrepo   # alpine

obtenerlo

$ git clone https://github.com/osniel/tinyrepo
$ cd tinyrepo
$ go build -ldflags="-s -w" -o tinyrepo ./cmd/tinyrepo