_ _
| |_(_)_ __ _ _ _ __ ___ _ __ ___
| __| | '_ \| | | | '__/ _ \ '_ \ / _ \
| |_| | | | | |_| | | | __/ |_) | (_) |
\__|_|_| |_|\__, |_| \___| .__/ \___/
|___/ |_|
repositorios de paquetes locales y pequeños, un binario, sin demonio
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ón | qué hace |
|---|---|
-di | descarga los índices de paquetes desde el mirror |
-ci | resuelve los paquetes pedidos y construye el repositorio |
-dp | descarga los paquetes |
-ws | publica el repositorio por HTTP, hasta Ctrl+C |
-cl | elimina los paquetes que config.toml no pide |
-vp | comprueba que cada paquete pedido existe en el mirror |
-gc / -ga | imprime un config.toml de ejemplo para Debian / Arch |
-ec | lista los códigos de salida |
-pw | genera el hash de una contraseña para el panel web y lo imprime |
-sp | pide una contraseña y la escribe en config.toml |
-gs / -gr | imprime una unidad de systemd / un servicio de OpenRC (Alpine) |
-help | muestra 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