Ce week-end, après avoir vu un commit aur, j'ai décidé de perdre une heure de mon temps à jouer aux apprentis sorcier
Attention : Comme le Docteur F. je ne suis arrivé qu'a un monstre fait de bout de ficelles et aucunement à un résultat "viable" Mais il ne coûte rien de partager mes élucubrations ?
Aur fournit depuis quelques jours un fichier avec la liste des paquets disponibles avec un peu plus de détails que l'unique nom du paquet ...
Idée FOLLE : transformer ce fichier en base de donnée pacman ... Si cela est possible alors je vais pouvoir consulter aur depuis pacman !!!
Big spoiler (pour éviter de vous faire perdre du temps à lire le reste): au final, certainement pas possible d'installer avec cette technique : donc on ne remplace pas un aur helpeur et la consultation ? pas génial - même pas passable
--------------------------------
Le nouveau fichier disponible par aur est un fichier json au format:
{
"warning": "This is a experimental! It can be removed or modified without warning!",
"columns": ["ID", "Name", "Version", "Description", "URL", "PackageBaseID"],
"data": [
[182473, "mkinitcpio-welcomemessage", "0.0.0-1", "mkinitcpio hook to show some message on boot", "https://aur.archlinux.org/packages/mkinitcpio-welcomemessage/", 93686],
[182745, "dvbsky-firmware", "20141128-1", "Firmware for DVBSky cards/boxes", "http://www.dvbsky.net/Support_linux.html", 67834],
...
]
}
Au moins c'est clairexperimental! It can be removed or modified without warning!
Donc ici, l'idée démoniaque est de convertir ce fichier en base de donnée pacman ; une base de donnée pacman est une archive (.db) qui contient un répertoire par paquet et dans chaque répertoire un fichier texte `desc` (la même chose que notre base de donnée locale pacman d nos paquets installés)
Le fichier json comporte 77 000 enregistrements, il faut donc créer autant de répertoires et fichiers puis intégrer tout cela dans une archive.
ici, j'utilise un script python : c'est très lent mais pour un test cela suffit amplement (dans la vrai vie, il faudrait re-générer cette archive toutes les 10 minutes (avec 4Mo à télécharger)... donc choisir un autre language)
Le script (aurtodb.py):
#!/usr/bin/env python
import sys
import requests
import tarfile
from pathlib import Path
url = "https://aur.archlinux.org/packages-teapot.json.gz"
'''
{
"warning": "This is a experimental! It can be removed or modified without warning!",
"columns": ["ID", "Name", "Version", "Description", "URL", "PackageBaseID"],
"data": [ ... ]
}
'''
req = requests.get(url, allow_redirects=True)
pkgs = req.json()['data']
print(f"{len(pkgs)} aur packages")
Path("/tmp/aur.db").mkdir()
for pkg in pkgs:
pkg[1] = pkg[1].strip()
pkg[2] = pkg[2].strip()
if pkg[2].count('-') > 1: # fix 7 files in 77000 ...
print(f'Error in version "{pkg[1]}" : {pkg[2]}', file = sys.stderr)
pkg[2] = pkg[2].replace('-', '.', 1)
dir = f"/tmp/aur.db/{pkg[1]}-{pkg[2]}"
Path(dir).mkdir()
fdesc = Path(f"{dir}/desc")
fdesc.write_text(f"%NAME%\n{pkg[1]}\n\n%VERSION%\n{pkg[2]}\n\n%DESC%\n{pkg[3]}\n\n%URL%\n{pkg[4]}")
Path("aur.db").unlink()
with tarfile.open("aur.db", "w:gz") as tar:
for fn in Path("/tmp/aur.db").glob('*/desc'):
print(fn)
tar.add(fn, arcname=fn.relative_to("/tmp/aur.db"))
Path(fn).unlink()
Path(fn.parent).rmdir()
Path("/tmp/aur.db").rmdir()
print(f"{len(pkgs)} aur packages")
print('sudo pacman -Sy ; pacman -Sl aur')
Clairement trop lent pour petite machine ?
Configurer pacman :
Ajouter un nouveau dépôt "aur" et simplement le faire pointer vers le répertoire qui contient notre archive générée aur.db (et donc aussi notre script)
ps: attention, le répertoire ne doit pas avoir d'espace
par exemple, copier notre script dans:
~/aur/
On ajoute donc à la fin de
/etc/pacman.conf
[aur]
# changer "MON_LOGIN" pour un autre ;)
Server = file:///home/MON_LOGIN/aur/
aur.db
qui est disponible dans /home/MON_LOGIN/aur/
Dans ce répertoire:
- on génère la base de donnée:
python aurtodb.py
- on update la base de donnée pacman:
sudo pacman -Sy
Maintenant nous avons un dépôt 'aur' dans pacman ! donc il est disponible pour consultation comme les autres dépôts officiels
pacman -Sl aur
(liste tous les paquets de ce dépôt : 77000)pacman -Ss pamac
: va lister aussi les paquets aur dans la réponse (ok aussi avec pamac gui)
pour pacman 'aur' est un dépôt donc il va essayer d'installer via notre miroir et ... il est clair que aur n'est pas un miroir de paquets. Donc il va y avoir erreur pour toute tentative d'installation
---------------------
Nous avons donc ajouté à pacman un dépôt fictif juste pour de la recherche dans aur.
cela est super pratique puisqu'il faut le régénérer plusieurs fois par jour et que dans pamac.conf, il faut l'activer uniquement lorsque nous faisons une recherche et ne pas oublier de le dé-activer (mettre en commentaires) dès que nous désirons faire un update ou une installation.