The officially official Devuan Forum!

You are not logged in.

#1 2018-10-07 15:14:02

aitor
Member
From: basque country
Registered: 2016-12-03
Posts: 27  
Website

Como crear tu propio repositorio con Amprolla

1.- Configurar un repositorio local de APT con Apache

En esta sección vamos a ver cómo construir nuestro propio repositorio de paquetes debian, el cual será utilizado posteriormente por debootstrap en el live-sdk.

He ahí un ejemplo de repositorio construído con amprolla:


deb http://packages.gnuinos.org/merged jessie main
deb-src http://packages.gnuinos.org/merged jessie main

Lo primero de todo, vamos a instalar el servidor HTTP Apache (otra opción será Nginx, ver más abajo):


# apt-get install apache2

El documento raíz por defecto en debian es /var/www/html. Podemos generar nuestros propios alojamientos virtuales en /var/www. Si abrimos el navegador y teclamos "localhost" o "127.0.0.1", nos aparecerá la página por defecto de apache2 en debian:


FluxBB bbcode test


Ya tenemos apache instalado y funcionando en el sistema. Supongamos ahora que tenemos un conjunto de paquetes que queremos añadir a nuestro proyecto de repositorio. Algunos serán trabajos nuestros o ajenos no incluídos en el repositorio de devuan; otros, por el contrario, serán paquetes ya existentes en devuan. Se tratará de paquetes que han sufrido modificaciones y cuyo objetivo es sustituir a los propios de devuan, tal y como devuan hace con debian.

Para fijar ideas y poder poner un ejemplo práctico, he colgado un archivo comprimido conteniendo algunos paquetes ya preparados.
Lo descargamos y descomprimimos:


$ wget http://gnuinos.org/packages.tar.gz
$ tar -xzvf packages.tar.gz

Como podréis ver, la carpeta contiene dos proyectos distintos: por un lado está el kernel linux-libre-4.9.103 descargado del repositorio de la ::[FSFLA]:: y empaquetado para devuan; por otro, el intramfs-tools con algunos cambios que lo hacen compatible con vdev.

Instalemos la herramienta reprepro:


# apt-get install reprepro

Antes de utilizar esta herramienta, vamos a generar una llave gpg con la que poder firmar el repositorio. Para ello instalamos el siguiente paquete:


# apt-get install gnupg2

y generamos la llave (también podemos hacer gpg2 --key-gen):


# gpg --gen-key
gpg (GnuPG) 1.4.18; Copyright (C) 2014 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gpg: directory `/root/.gnupg' created
gpg: new configuration file `/root/.gnupg/gpg.conf' created
gpg: WARNING: options in `/root/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring `/root/.gnupg/secring.gpg' created
gpg: keyring `/root/.gnupg/pubring.gpg' created
Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection?

Hay opciones que sólo permiten firmar y opciones que permiten firmar y cifrar. Elegiremos la opción por defecto RSA.


RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)

Las llaves RSA pueden medir entre 1024 y 4096 bits, y nos pide el tamaño. Esto es de libre elección. Escogeremos el tamaño por defecto 2048.

Lo siguientes pasos son triviales. Nos pregunta si queremos que la validez de la clave expire pasado un tiempo y cuándo:


Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0)

También nos pide el nombre, una dirección de correo, un comentario y la contraseña. En el momento de generar la clave nos pedirá también que hagamos cosas para aumentar la entropía (desorden) del sistema.

Ahora debemos exportar la parte privada de la llave:


# gpg --output private_key.asc --armor --export-secret-key email@email.com

y también la parte pública:


# gpg -a --export email@email.com > public_key.asc

usando el email proporcionado durante la generación de la llave.

Para poder firmar, importamos la clave secreta:


# gpg --allow-secret-key-import --import private_key.asc

Hecho lo cual, y ubicados en el directorio de trabajo en el que hemos descomprimido la carpeta "packages", ejecutamos el siguiente script (sustituid ascii por la rama en cuestión para el caso de jessie o beowulf, y 64CF1949 por la parte pública de vuestra llave gpg):


#!/bin/sh

  rm -rf conf
  rm -rf db
  rm -rf dists
  rm -rf pool

  mkdir confl

  echo \
"Origin: Devuan
Label: Devuan Ascii packages
Codename: ascii
Architectures: i386 amd64 source
Components: main
UDebComponents: main
Description: Additional packages for Devuan
DebIndices: Packages Release . .gz
UDebIndices: Packages Release . .gz
DscIndices: Sources Release .gz .bz2
Contents: . .gz .bz2" > ./conf/distributions

  find ./packages -name "*.deb" -exec reprepro --ask-passphrase -b . -V -C main includedeb ascii {} \;
  find ./packages -name "*.udeb" -exec reprepro --ask-passphrase -b . -V -C main includeudeb ascii {} \;

  echo \
"SignWith: 64CF1949" >> ./conf/distributions
 
  find ./packages -name "*.dsc" -exec reprepro --ask-passphrase -b . -V -C main includedsc ascii {} \;

  exit 0

Llegados  a este punto, hay que aclarar que reprepro no es compatible con el formato fuente git, frecuentemente utilizado en devuan, pero no aprobado oficialmente en debian.

El script de arriba generará las carpetas ./dist y ./pool del repositorio. Al finalizar nos pedirá la contraseña de nuestra firma gpg. Posteriormente copiaremos las dos carpetas generadas (y también la parte pública de nuestra llave gpg) en el directorio /var/www/html/packages, al que previamente damos permisos (www-data es el usuario por defecto para servidores webs):


# mkdir -p /var/www/html/packages
# mkdir -p /var/www/html/packages/gnuinos 
# chown www-data:www-data /var/www/html/packages
# chmod 0700 /var/www/html/packages
# mv ./dists /var/www/html/packages/gnuinos/
# mv ./pool /var/www/html/packages/gnuinos/
# mv public_key.asc /var/www/html/packages/

Ya tenemos un pequeño repositorio local de paquetes debian conteniendo el kernel y las herramientas initramfs, algo que podemos comprobar añadiendo las siguientes líneas en el /etc/apt/sources.list :


deb http://localhost/packages/gnuinos ascii main
deb-src http://localhost/packages/gnuinos ascii main

Ahora lo que pretendemos es fusionarlo (merge) con el repositorio de devuan, y es aquí donde entra en juego amprolla.

Es importante entender que, así como el  initramfs-tools sustituirá al ya existente en el repositorio de devuan, no ocurrirá lo mismo con el kernel. Esto se debe al hecho de que APT (y, por ende, también amprolla) considerará los paquetes linux-image-4.9.0-6-686 y linux-image-4.9.0-7-686 por separado, ya que tienen diferentes nombres. Lo mismo sucederá con las cabeceras y demás. Así pues, si queremos eliminar aquellos paquetes del kernel provenientes de debian/devuan deberemos hacer pinning de APT. Más adelante nos ocuparemos de esto.


2.- Configurar un repositorio local de APT con Nginx

Antes de empezar a trabajar con amprolla veremos como configurar nginx -pronunciado en inglés engine X-, el servidor web ligero de alto rendimiento utilizardo por devuan en sus repositorios. Instalamos su paquete .deb:


# apt-get install nginx

Paramos el servicio de apache:


# service apache2 stop

Ahora abrimos el navegador y tecleamos "localhost" viendo la página por defecto de nginx:

FluxBB bbcode test

En el archivo de configuración de nginx /etcv/nginx/sites-available/default hay una línea:


root /var/www/html;

que indica que la página que solicita nginx por defecto es también la solicitada por apache, por lo que el pequeño repositorio apt ubicado ahí va a seguir siendo reconocido.

Para terminar con nginx, vamos a dejar su archivo de configuración como sigue:


server {
	listen 80 default_server;gpg2 --key-gen
	listen [::]:80 default_server;

	root /var/www/html;
	
	index index.html index.htm index.nginx-debian.html;

	server_name _;

        server_tokens off;
    
        access_log  /var/log/nginx/repository.votre-serveur.com_access.log;
        error_log   /var/log/nginx/repository.votre-serveur.com_error.log;    

        default_type "text/plain";                                                                                                    
        try_files $uri/ $uri /index.html;                                                                                                                              

	location / {
		autoindex on;
	}
}

y recargamos el servicio:


# /etc/init.d/nginx reload

El módulo Autoindex permite a nginx listar/ocultar el contenido de los directorios:

FluxBB bbcode test

Es el análogo a:


<Directory /var/www/html>
  Options +Indexes
</Directory>

del htaccess de apache. Y nada más por el momento en cuanto a nginx...

Sin más preámbulos, pasemos ya al asunto que nos ocupa en este apartado: amprolla !


3.- Usando Amprolla por primera vez.

Amprolla es una herramienta que fusiona distintos repositorios apt en un único repositorio. Básicamente consiste en un ordenador intermedio o proxy que contiene un repositorio local y que concentra al vuelo (es decir, en tiempo real) el contenido de este repositorio local con otros repositorios externos.

Escrita en python, su primera versión fue desarrollada por Franco Lanza "Nextime", y, a pesar de que no se comportara del todo bien en términos de velocidad, jugó un papel fundamental dentro de la infraestructura de devuan jessie. En cuanto a su segunda versión, ésta nunca vio la luz. Es por ello que Iván J. "Parazyd" reescribió amprolla con miras a devuan ascii y posteriores:

https://github.com/parazyd/amprolla

Creamos nuestro directorio de trabajo y entramos en él:


$ mkdir amprolla
$cd amprolla

Para simplificar las cosas, en lugar del repositorio de parazyd clonaremos esta otra versión modificada:


$ git clone https://git.devuan.org/aitor_czr/amprolla.git

Luego hablaremos de las pequeñas diferencias entre ambas. Entramos en el repositorio local:


$ cd amprolla

Estamos ubicados en /home/user/amprolla/amprolla. Prestad atención al archivo de configuración lib/config.py y dejádlo de la siguiente manera:


# See LICENSE file for copyright and license details.

"""
amprolla configuration file
"""

from hashlib import sha256

cpunm = 2  # number of cpus you want to use for multiprocessing

logdir = '/home/aitor/amprolla/log'
spooldir = '/home/aitor/amprolla/spool'
gpgdir = '/home/aitor/amprolla/gnupg'
mergedir = '/home/aitor/amprolla/merged-volatile'

signingkey = '720BBF6B51F3883F847066E665BB7901DAB59DE1'
signrelease = False

mergesubdir = 'dists'
lockpath = '/run/lock/amprolla.lock'
banpkgs = {'systemd', 'systemd-sysv', 'file-rc'}

checksums = [
    {'name': 'SHA256', 'f': sha256},
]

distrolabel = 'Gnuinos'
repo_order = ['gnuinos', 'devuan', 'debian-security', 'debian']

# used for a hacky way to skip certain suites when crawling Debian
skips = ['ascii-security']

repos = {
    'gnuinos': {
        'name': 'GNUINOS',
        'host': 'http://localhost/packages',
        'dists': 'gnuinos/dists',
        'pool': 'pool',
        'aliases': False,
        'skipmissing': False,
    },    
    'devuan': {
        'name': 'DEVUAN',
        'host': 'http://deb.devuan.org',
        'dists': 'devuan/dists',
        'pool': 'devuan/pool',
        'aliases': False,
        'skipmissing': False,
    },
    'debian-security': {
        'name': 'DEBIAN-SECURITY',
        'host': 'http://security.debian.org',
        'dists': 'dists',
        'pool': 'pool',
        'aliases': True,
        'skipmissing': True,
    },
    'debian': {
        'name': 'DEBIAN',
        'host': 'http://deb.debian.org',
        'dists': 'debian/dists',
        'pool': 'debian/pool',
        'aliases': True,
        'skipmissing': False,
    },
}

suites = {
    'ascii': [
        'ascii',
    ],
}

aliases = {
    'DEBIAN-SECURITY': {
        'ascii-security': 'stretch/updates',
    },
    'DEBIAN': {
        'ascii': 'stretch',
        'ascii-backports': 'stretch-backports',
        'ascii-proposed-updates': 'stretch-proposed-updates',
        'ascii-updates': 'stretch-updates',
    },
}

release_aliases = {
    'ascii': {
        'Suite': 'testing',
        'Codename': 'ascii',
        'Version': '2.0',
    },
    'ascii-backports': {
        'Suite': 'testing-backports',
        'Codename': 'ascii-backports',
        'Origin': 'Devuan Backports',
        'Label': 'Devuan Backports',
    },
    'ascii-proposed-updates': {
        'Suite': 'testing-proposed-updates',
        'Codename': 'ascii-proposed-updates',
    },
    'ascii-security': {
        'Suite': 'testing-security',
        'Codename': 'ascii-security',
        'Label': 'Devuan-Security',
    },
    'ascii-updates': {
        'Suite': 'testing-updates',
        'Codename': 'ascii-updates',
    },
}

categories = ['main']

arches = [
    'source',
    'binary-all',
    'binary-amd64',
    'binary-i386',
]
mainrepofiles = [
    'InRelease',
    'Release',
    'Release.gpg',
]

pkgfiles = [
    'Packages',
    'Packages.gz',
    'Packages.xz',
    'Release',
]

srcfiles = [
    'Sources',
    'Sources.gz',
    'Sources.xz',
    'Release',
]

release_keys = [
    'Label',
    'Suite',
    'Version',
    'Codename',
    'Date',
    'Valid-Until',
    'Architectures',
    'Components',
    'Description',
    'NotAutomatic',
    'ButAutomaticUpgrades',
]

packages_keys = [
    'Package',
    'Version',
    'Kernel-Version',
    'Installer-Menu-Item',
    'Essential',
    'Installed-Size',
    'Maintainer',
    'Architecture',
    'Replaces',
    'Provides',
    'Depends',
    'Conflicts',
    'Pre-Depends',
    'Breaks',
    'Homepage',
    'Apport',
    'Auto-Built-Package',
    'Build-Ids',
    'Origin',
    'Bugs',
    'Built-Using',
    'Enhances',
    'Recommends',
    'Description',
    'Description-md5',
    'Ghc-Package',
    'Gstreamer-Decoders',
    'Gstreamer-Elements',
    'Gstreamer-Encoders',
    'Gstreamer-Uri-Sinks',
    'Gstreamer-Uri-Sources',
    'Gstreamer-Version',
    'Lua-Versions',
    'Modaliases',
    'Npp-Applications',
    'Npp-Description',
    'Npp-File',
    'Npp-Mimetype',
    'Npp-Name',
    'Original-Maintainer',
    'Original-Source-Maintainer',
    'Package-Type',
    'Postgresql-Version',
    'Python-Version',
    'Python-Versions',
    'Ruby-Versions',
    'Source',
    'Suggests',
    'Xul-Appid',
    'Multi-Arch',
    'Build-Essential',
    'Tag',
    'Section',
    'Priority',
    'Filename',
    'Size',
    'MD5sum',
    'SHA1',
    'SHA256',
]

sources_keys = [
    'Package',
    'Binary',
    'Version',
    'Maintainer',
    'Uploaders',
    'Build-Depends',
    'Architecture',
    'Standards-Version',
    'Format',
    'Files',
    'Vcs-Browser',
    'Vcs-Svn',
    'Checksums-Sha1',
    'Checksums-Sha256',
    'Homepage',
    'Package-List',
    'Directory',
    'Priority',
    'Section',
    'Vcs-Git',
    'Dm-Upload-Allowed',
    'Build-Conflicts',
    'Testsuite',
    'Build-Depends-Indep',
    'Vcs-Bzr',
    'Vcs-Mtn',
    'Vcs-Hg',
    'Ruby-Versions',
    'Dgit',
    'Vcs-Darcs',
    'Extra-Source-Only',
    'Python-Version',
    'Testsuite-Triggers',
    'Autobuild',
    'Build-Conflicts-Indep',
    'Vcs-Cvs',
    'Comment',
    'Origin',
    'Vcs-Arch',
    'Original-Maintainer',
    'Python3-Version',
]

Analicemos su contenido por partes. En la líneas:


logdir = '/home/aitor/amprolla/log'
spooldir = '/home/aitor/amprolla/spool'
gpgdir = '/home/aitor/amprolla/gnupg'
mergedir = '/home/aitor/amprolla/merged-volatile'

debéis cambiar la ubicación y dejarla acorde a vuestro directorio personal. He eliminado la opción de firma:


signingkey = '720BBF6B51F3883F847066E665BB7901DAB59DE1'
signrelease = False

De momento lo dejaremos así y firmaremos el repositorio manualmente en una operación aparte. Me ha pasado que APT no reconocía la firma del repositorio usando gpg en lugar de gpg2. ¿Tal vez dependa también de cuál de las dos hayamos utilizado a la hora de generarla? Le dedicaré mi tiempo.

El resto de las opciones podéis configurarlas a vuestro gusto. Cambiar el distrolabel por otro e incluso añadir un nombre más en el repo_order si queréis basarla gnuinos.

Ejecutamos el script:


$ python3 amprolla_init.py

Esto genera una carpeta /home/aitor/amprolla/spool con los índices del repositorio agrupados en tres categorías: debian, devuan y gnuinos. Así será como lo obtendremos si utilizamos debmirror con el repositorio generado por amprolla. Ante cualquier intento fallido habrá que borrar el /var/lock/amprolla.lock, antes de intentarlo de nuevo.

El siguiente paso será fusionar el triple repositorio en un único repositorio:


$ python3 amprolla_merge.py

lo que generará una carpeta /home/aitor/amprolla/merged-volatile. Dado que no hemos incluído paquetes de las secciones contrib y non-free, sustituiremos la línea:


Components: main contrib non-free

por esta otra:


Components: main

y, a continuación, firmamos el repositorio:


$ cd ../merged-volatile/dists/ascii
$ gpg2 -q --default-key 64CF1949 --yes --clearsign -a -o InRelease Release

y generar el Release.gpg para que la genta pueda comprobar la veracidad de la firma:


$ gpg2 -sb -o Release.gpg InRelease

Copiamos la carpeta dists en nuestro repositorio local:


# mkdir /var/www/html/packages/merged
# cp -a /home/aitor/amprolla/merged-volatile/dists /var/www/html/packages/merged

y modificamos el /etc/apt/sources.list:


deb http:://localhost/packages/merged ascii main
deb-src http:://localhost/packages/merged ascii main

Nos queda un último paso: redirigir las solicitudes del inexistente directorio /var/www/html/packages/merged/pool a sus sitios correspondientes. Para ello, configuramos el location del archivo de configuración de nginx /etc/nginx/sites-available/default tal que:


location / {
	autoindex on;                
	rewrite /packages/merged/pool/DEVUAN/(.*)          http://deb.devuan.org/devuan/pool/$1;
	rewrite /packages/merged/pool/main/(.*)            http://deb.devuan.org/merged/pool/DEBIAN/main/$1;
	rewrite /packages/merged/pool/GNUINOS/(.*)         http://localhost/packages/gnuinos/pool/$1;
}

Esto explica el pequeño misterio de amprolla de por qué el directorio merged/pool está vacío. Y en realidad, así es: ocurre es que los rewrite redireccionan las solicitudes del servidor a otros repositorios, ya sea debian, devuan o gnuinos.

Todo esto que hemos hecho en local, puede aplicarse a un hosting remoto cambiando el localhost por la url correspondiente. Si disponéis de un hosting compartido en el que no disponéis de permisos root, entonces no os será posible configurar nginx y tendréis que recurrir al servidor apache. Ése es mi caso en el repositorio de gnuinos.

La configuración del htaccess que ha funcionado con mi proveedor de hosting ha sido recurriendo a redireccionamientos 302, esto es:


RewriteEngine on

Redirect 302 /merged/pool/DEVUAN http://deb.devuan.org/devuan/pool   
Redirect 302 /merged/pool/main http://deb.devuan.org/merged/pool/DEBIAN/main
Redirect 302 /merged/pool/GNUINOS http://packages.gnuinos.org/gnuinos/pool

Aunque puede que no sirva como regla general.

Y aquí finaliza mi pequeño tutorial de amprolla. Esto es todo, amigos :)

NOTA IMPORTANTE:

Al escribir esta guía he notado un bug en el "amprolla_init.py", y es que los paquetes del initramfs-tools, siendo de arquitectura "all" aparecen en ambos "binary-i386/Packages.gz" y "binary-amd64/Packages.gz" mientras que el binary-all no existe en "spool/gnuinos/dists/ascii/main/"

Le echaré un vistazo y trataré de corregirlo.

Last edited by aitor (2018-10-13 18:18:55)

Offline

#2 2018-10-08 15:10:46

HextorBRX
Member
Registered: 2017-08-20
Posts: 80  

Re: Como crear tu propio repositorio con Amprolla

I don't understand a single word son. This looks useful so I guess we need to find someone who can read Spanish to translate your guide?

Offline

#3 2018-10-08 15:29:12

g4570n
Member
Registered: 2017-12-29
Posts: 1  

Re: Como crear tu propio repositorio con Amprolla

HextorBRX wrote:

I don't understand a single word son. This looks useful so I guess we need to find someone who can read Spanish to translate your guide?

[DNG] How to build your own distro: https://www.mail-archive.com/dng@lists. … 22608.html

Offline

#4 2018-10-08 15:37:01

golinux
Administrator
Registered: 2016-11-25
Posts: 1,264  

Re: Como crear tu propio repositorio con Amprolla

@HextorBRX . . . see how useful the DNG mailing list is?

Online

#5 2018-10-08 18:50:16

aitor
Member
From: basque country
Registered: 2016-12-03
Posts: 27  
Website

Re: Como crear tu propio repositorio con Amprolla

Hi HextorBRX,

HextorBRX wrote:

I don't understand a single word son. This looks useful so I guess we need to find someone who can read Spanish to translate your guide?

which word? i'll write the improvements above onto the same post, comments will be written bellow. When i finish the tutorial, i'll try to translate it to english my best. But i'll need your help.

I started the tutorial with an example using Apache2 because it's the common solution in the case of shared hosting where no root permissions are available, but i'll also explain how to do the same using the nginx webserver.

Last edited by aitor (2018-10-08 18:51:35)

Offline

#6 2018-10-09 12:15:47

HextorBRX
Member
Registered: 2017-08-20
Posts: 80  

Re: Como crear tu propio repositorio con Amprolla

which word?

Don't mind me. I did not read your message in the DNG mailing list so I was wondering why you wrote the tutorial in Spanish.

I hope someone will help you with the translation. Your tutorial will give us a head start for sure.

Offline

#7 2018-10-10 12:30:00

aitor
Member
From: basque country
Registered: 2016-12-03
Posts: 27  
Website

Re: Como crear tu propio repositorio con Amprolla

I hope to finish my guide about amprolla today.

Offline

#8 2018-10-13 18:19:50

aitor
Member
From: basque country
Registered: 2016-12-03
Posts: 27  
Website

Re: Como crear tu propio repositorio con Amprolla

I finished it.

It only remains how to patch other git repositories using the git-format-patch, and also how to do the pinning of apt in favour of linux-libre.

Last edited by aitor (2018-10-13 18:33:01)

Offline

Board footer