Gestion des miroirs pour makepkg et pacman.

Ce qui ne concerne ni le forum ni des problèmes
Répondre
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Gestion des miroirs pour makepkg et pacman.

Message par mimas »

Je viens de coder entre deux siestes un petit script en lua pour télécharger des fichiers sur des miroirs choisis de façon pseudo-aléatoire.

La liste de miroirs est purement pondues à l'arrache et non testée. Vous verrez qu'il est très simple d'ajouter ou modifier des miroirs.

Pour que pacman et makepkg (donc indirectement yaourt) le prenne en compte il faut modifier makepkg.conf et pacman.conf

Modif. pour makepkg.conf

Code : Tout sélectionner

DLAGENTS=('ftp::/etc/pacman.d/download_helper'
          'http::/etc/pacman.d/download_helper'
          'https::/usr/bin/wget -c -t 3 --waitretry=3 --no-check-certificate'
          'rsync::/usr/bin/rsync -z'
          'scp::/usr/bin/scp -C')
Modif. pour pacman.conf

Code : Tout sélectionner

XferCommand = /etc/pacman.d/download_helper %o %u
Le script, download_helper, à placer dans /etc/pacman.d

Code : Tout sélectionner

#!/usr/bin/lua

--      This program is free software; you can redistribute it and/or modify
--      it under the terms of the GNU General Public License as published by
--      the Free Software Foundation; either version 2 of the License, or
--      (at your option) any later version.
--      
--      This program is distributed in the hope that it will be useful,
--      but WITHOUT ANY WARRANTY; without even the implied warranty of
--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--      GNU General Public License for more details.
--      
--      You should have received a copy of the GNU General Public License
--      along with this program; if not, write to the Free Software
--      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
--      MA 02110-1301, USA.

gnu = {
	"ftp://ftp.belnet.be/mirror/ftp.gnu.org",
	"ftp://ftp.cs.tu-berlin.de/pub/gnu/",
	"ftp://ftp.cs.univ-paris8.fr/mirrors/ftp.gnu.org/gnu/",
	"ftp://ftp.easynet.be/gnu/",
	"ftp://ftp.ironie.org/ftp.gnu.org/pub/gnu/",
	"ftp://gd.tuwien.ac.at/gnu/gnusrc/",
	"http://gnuftp.miroir-francais.fr/",
	"ftp://mirror.cict.fr/gnu/"
}

sourceforge = {
	"http://easynews.dl.sourceforge.net/",
	"http://internap.dl.sourceforge.net/",
	"http://jaist.dl.sourceforge.net/",
	"http://kent.dl.sourceforge.net/",
	"http://mesh.dl.sourceforge.net/",
	"http://puzzle.dl.sourceforge.net/",
	"http://osdn.dl.sourceforge.net/",
	"http://ovh.dl.sourceforge.net/",
	"http://superb-east.dl.sourceforge.net/",
	"http://surfnet.dl.sourceforge.net/",
	"http://switch.dl.sourceforge.net/"
}

gnome = {
	"http://fr2.rpmfind.net/linux/gnome.org/",
	"http://ftp.unina.it/pub/linux/GNOME/",
	"ftp://ftp.dit.upm.es/pub/GNOME/",
	"ftp://ftp.no.gnome.org/pub/GNOME/",
	"http://ftp.acc.umu.se/pub/GNOME/",
	"http://ftp.belnet.be/mirror/ftp.gnome.org/"
}

kernel = {
	"http://www.fr.kernel.org/",
	"http://kernel.miroir-francais.fr/"
}

mirrors ={
	{pattern="ftp://ftp\.gnu\.org/gnu/", list=gnu},
	{pattern="http://.*\.sourceforge\.net/", list=sourceforge},
	{pattern=".*\.gnome\.org/pub/.*/", list=gnome},
	{pattern=".*\.kernel\.org/", list=kernel},
}

function download_wget(dest, url)
	if dest == nil then
		return os.execute("wget --passive-ftp -c "..url) 
	else
		return os.execute("wget --passive-ftp -c -O "..dest.." "..url) 
	end	
end

if #arg == 1 then
	source=arg[1]
	dest=nil
elseif #arg == 2 then	
	source=arg[2] 
	dest=arg[1]
else
	print("download_helper arg1 [arg2]")
	os.exit(1)
end

for _,mirror in pairs(mirrors) do
	if string.match(source, mirror.pattern) then
		math.randomseed(os.time())
		for url in string.gmatch(source, mirror.pattern.."(.*)") do
			local try=0
			while try < 5 do
				if download_wget(dest, mirror.list[math.random(#mirror.list)]..url) == 0 then
					os.exit(0)
				end
				try = try + 1
			end
			return 1
		end
	end
end

return download_wget(dest, source)
Voilou. La gestion des erreurs est simple mais si vous arrivez à tomber sur une séquence de 5 fois le même miroir en erreur il faut aller acheter immédiatement un grigri pour conjurer le mauvais œil.

Si vous avez des miroirs à ajouter, je suis preneur.
Dernière modification par mimas le lun. 12 mai 2008, 21:57, modifié 1 fois.
Anarchy for the triple A.
Avatar de l’utilisateur
marc[i1]
Maître du Kyudo
Messages : 1753
Inscription : ven. 27 oct. 2006, 10:48
Localisation : Nantes (44)

Message par marc[i1] »

Mimas président \o/
Ne vous emmerdez plus, emmerdez les autres.
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message par mimas »

marc[i1] a écrit :Mimas président \o/
Ouaip, président des anarchistes \°/. :)

Enfin ce script n'est pas non plus indispensable, mais une possible évolution pour utiliser aria, peut-être générer un fichier metalink, et télécharger plusieurs segments sur différents serveurs peut donner un truc sympa.
Anarchy for the triple A.
Avatar de l’utilisateur
wain
Maître du Kyudo
Messages : 1854
Inscription : ven. 11 août 2006, 19:15
Localisation : Nancy (54)

Message par wain »

formidouble formidouble \o/
C'est vachement bien pensé tout ça :D
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message par mimas »

Il y a des trucs qui m'emm.... dans les scripts de création de paquets, principalement :
- gestion des mirroirs (fait partiellement).
- séparation des étapes (extraction+patch, compilation, empaquetage).
- aucune vision globale du projet. On dirait que c'est fait au coup par coup (quoique la dernière version à l'air moins bidouille).

Comme l'outil de mes rêves nécessite une modification lourde, voire une réécriture, de makepkg et des PKGBUILD, je me contente pour l'instant de petits scripts comme ça.

J'ai fait un semblant de makepkg en lua qui sépare les étapes et n'utilisant fakeroot que pour l'empaquetage (comme recommandé chez debian) mais ce serait trop de boulot à convertir ma base de PKGBUILDs. :(

Dans l'idéal ce serait un croisement avec la solution utilisée par Pardus, en moins bavard et sans être root.
Anarchy for the triple A.
Avatar de l’utilisateur
wain
Maître du Kyudo
Messages : 1854
Inscription : ven. 11 août 2006, 19:15
Localisation : Nancy (54)

Message par wain »

Faut se méfier de ce genre d'idées :lol: ça conduit souvent à créer une nouvelle distro :shock:
Avatar de l’utilisateur
AddiKT1ve
Elfe
Messages : 543
Inscription : sam. 10 mai 2008, 22:46
Localisation : Lève les yeux...

Message par AddiKT1ve »

wain a écrit :ça conduit souvent à créer une nouvelle distro :shock:
ph34r.

Il va falloir que je m'intéresse de près à ces PKGBUILDs...
Devenez colocataire de Rootards.
##hippie irc.freenode.net
Avatar de l’utilisateur
mélodie
Maître du Kyudo
Messages : 2784
Inscription : lun. 30 oct. 2006, 02:06
Localisation : Pyrénées

Message par mélodie »

AddiKT1ve a écrit :
wain a écrit :ça conduit souvent à créer une nouvelle distro :shock:
ph34r.
J'ai vu un wiki où est mené un projet de fork de Archlinux il n'y a pas très longtemps, mais impossible de retrouver l'url (je cherchais autre chose quand je suis tombée dessus).
Il va falloir que je m'intéresse de près à ces PKGBUILDs...
dowantdowant ? :lol:
Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03

Message par tuxce »

suite à une petite discussion sous irc, je me suis dit, je vais voir un peu si on peut pas modifier le script pour qu'il poursuive un téléchargement interrompu, donc, une proposition pour la fonction download_wget(dest, url)

Code : Tout sélectionner

function download_wget(dest, url)
   if dest == nil then
      dest = string.gsub (url, ".*/", "")
   end
   file_tmp = dest.."_tmp"
   if os.execute("wget --passive-ftp -c -O "..file_tmp.." "..url) == 0 then
     return os.rename(file_tmp, dest)
   else
     return 1
   end
end
bien sur, à tester, en plus, c'est mon premier contact avec lua :)
Dernière modification par tuxce le mar. 20 mai 2008, 20:50, modifié 1 fois.
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message par mimas »

Il y a quelques problèmes avec ton code, notamment le os.exit(1) qui ne laisse aucune chance pour récupérer d'un autre miroir, ou l'écriture du fichier temporaire si le nom de destination est du genre /tmp/blabla.tar.gz (qui donnait tmp_/tmp/blabla.tar.gz)

Mon adaptation, que je n'ai pas testé en ligne. :)

Code : Tout sélectionner

function download_wget(dest, url)
  if dest == nil then
    file_tmp = "tmp_" .. string.gsub (url, ".*/", "")
    dest = string.gsub (url, ".*/", "")
  else
    file_tmp = "tmp_" .. string.gsub (dest, ".*/", "") 
  end

  if os.execute("wget --passive-ftp -c -O "..file_tmp.." "..url) == 0 then
    return os.rename(file_tmp, dest)
  end
   
  return 1
end
Bien vu le coup de passer par un nom temporaire, makepkg se fait facilement berner par des téléchargements interrompus.
Anarchy for the triple A.
Avatar de l’utilisateur
mélodie
Maître du Kyudo
Messages : 2784
Inscription : lun. 30 oct. 2006, 02:06
Localisation : Pyrénées

Message par mélodie »

Bien vu le coup de passer par un nom temporaire, makepkg se fait facilement berner par des téléchargements interrompus.
C'est ce qui m'est arrivé avec Vegastrike qui de plus n'est pas très petit. Je cherchais un moyen que je n'ai pas trouvé, pour reprendre ce téléchargement.

Une petite question, le répertoire de téléchargement et compilation est yaourt-tmp-melodie ou autre yaourt-tmp-user. Est-ce que ça compte pour ce script ?
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message par mimas »

mélodie a écrit :Une petite question, le répertoire de téléchargement et compilation est yaourt-tmp-melodie ou autre yaourt-tmp-user. Est-ce que ça compte pour ce script ?
It simply doesn't give a hell of a frackin' care.

Le script télécharge simplement ce qu'on lui demande. Il ne s'occupe pas de l'application qui lui demande de bosser.
Dernière modification par mimas le mar. 20 mai 2008, 20:49, modifié 1 fois.
Anarchy for the triple A.
Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03

Message par tuxce »

mimas a écrit :Il y a quelques problèmes avec ton code, notamment le os.exit(1)
exact, je suis resté sur le fait que c'était la dernière instruction...
mimas a écrit :ou l'écriture du fichier temporaire si le nom de destination est du genre /tmp/blabla.tar.gz (qui donnait tmp_/tmp/blabla.tar.gz)
je l'ai arrangé avant le post :P
par contre, j'ai mis le "_tmp" à la fin parce que si tu enleves le chemin pour une destination comportant des répertoire, tu risques de te retrouver avec le prog lancé depuis un répertoire où on a pas le droit d'écriture.
j'ai pensé au /tmp, mais ca passerait pas un reboot de la machine :)

je réédite pour modifier le exit (1)
Avatar de l’utilisateur
lenglemetz
Chu Ko Nu
Messages : 307
Inscription : dim. 27 mai 2007, 22:26
Localisation : Marmande
Contact :

Message par lenglemetz »

AddiKT1ve a écrit :
Il va falloir que je m'intéresse de près à ces PKGBUILDs...
C'est pas difficile ^^ du moins c'est plus clair qu'un RPM :D
[Thème] Sujet (état) |<
🇨🇵🎮 @donf_me • 🔥 StreaminG • La TeaM à DonF
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message par mimas »

Ai-je rêvé que que "tmp_" se trouvait avant ? :shock:

Ok, je n'ai rien dit là dessus. ;)
Anarchy for the triple A.
Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03

Message par tuxce »

mimas a écrit :Ai-je rêvé que que "tmp_" se trouvait avant ? :shock:
non non, il se trouvait bien avant, c'est juste que j'ai du le modifier pendant que tu écrivais ton post
Avatar de l’utilisateur
mélodie
Maître du Kyudo
Messages : 2784
Inscription : lun. 30 oct. 2006, 02:06
Localisation : Pyrénées

Message par mélodie »

J'ai l'occasion d'essayer pour mettre à jour Firefox 3 qui est disponible en version 3.0rc1-1.

Laquelle de ces deux modifications vous semble la plus aboutie ?
Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03

Message par tuxce »

pour makepkg et donc yaourt, aucune différence, ce dernier se place dans le bon répertoire avant de lancer le téléchargement et ne donne pas de destination
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message par mimas »

mélodie a écrit :Laquelle de ces deux modifications vous semble la plus aboutie ?
Je crois qu'elle sont identiques. Ou semblables, c'est à choisir. :)
Anarchy for the triple A.
Avatar de l’utilisateur
mélodie
Maître du Kyudo
Messages : 2784
Inscription : lun. 30 oct. 2006, 02:06
Localisation : Pyrénées

Message par mélodie »

Gagné ! :D

Image

Youpi tralalaïtou !!!
Répondre