Page 1 sur 1

Gestion des miroirs pour makepkg et pacman.

Publié : lun. 12 mai 2008, 20:48
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.

Publié : lun. 12 mai 2008, 21:19
par marc[i1]
Mimas président \o/

Publié : lun. 12 mai 2008, 22:04
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.

Publié : mar. 13 mai 2008, 00:49
par wain
formidouble formidouble \o/
C'est vachement bien pensé tout ça :D

Publié : mar. 13 mai 2008, 08:11
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.

Publié : mar. 13 mai 2008, 19:01
par wain
Faut se méfier de ce genre d'idées :lol: ça conduit souvent à créer une nouvelle distro :shock:

Publié : mar. 13 mai 2008, 19:18
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...

Publié : mer. 14 mai 2008, 11:52
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:

Publié : mar. 20 mai 2008, 16:35
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 :)

Publié : mar. 20 mai 2008, 19:48
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.

Publié : mar. 20 mai 2008, 20:02
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 ?

Publié : mar. 20 mai 2008, 20:49
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.

Publié : mar. 20 mai 2008, 20:49
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)

Publié : mar. 20 mai 2008, 20:52
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

Publié : mar. 20 mai 2008, 20:52
par mimas
Ai-je rêvé que que "tmp_" se trouvait avant ? :shock:

Ok, je n'ai rien dit là dessus. ;)

Publié : mar. 20 mai 2008, 20:54
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

Publié : mar. 20 mai 2008, 23:05
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 ?

Publié : mar. 20 mai 2008, 23:46
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

Publié : mer. 21 mai 2008, 08:42
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. :)

Publié : mer. 21 mai 2008, 20:15
par mélodie
Gagné ! :D

Image

Youpi tralalaïtou !!!