* mirrors:// support added.
---- mirrors.conf example: faik@iago ~ $ cat /etc/pisi/mirrors.conf # Sourceforge mirrors sourceforge http://pardus.dl.sourceforge.net/sourceforge sourceforge http://easynews.dl.sourceforge.net/sourceforge # Gnu mirrors gnu ftp://mirrors.hbi.co.jp/gnu gnu ftp://core.ring.gr.jp/pub/GNU gnu ftp://mirror.aarnet.edu.au/pub/gnu # Local mirrors local http://192.168.3.8 ---- pspec.xml line example: <Archive ... >mirrors://sourceforge/cracklib/cracklib-2.8.9.tar.gz</Archive> ---- Output example: Kaynak system.base bileşeninin parçası Kaynak mirrors://sourceforge/cracklib/cracklib-2.8.9.tar.gz adresinden indiriliyor Fetching source from mirror: http://pardus.dl.sourceforge.net/sourceforge/cracklib/cracklib-2.8.9.tar.gz Fetching source from mirror: http://easynews.dl.sourceforge.net/sourceforge/cracklib/cracklib-2.8.9.tar.gz cracklib-2.8.9.tar.gz (562.0 KB)100% 72.42 KB/s [00:00:00] [bitti] Kaynak arşivi saklandı: /var/cache/pisi/archives/cracklib-2.8.9.tar.gz Arşiv açılıyor... açıldı (/var/tmp/pisi/cracklib-2.8.9-3/work)
This commit is contained in:
@@ -78,6 +78,7 @@ class Constants:
|
|||||||
self.__c.metadata_xml = "metadata.xml"
|
self.__c.metadata_xml = "metadata.xml"
|
||||||
self.__c.install_tar = "install.tar"
|
self.__c.install_tar = "install.tar"
|
||||||
self.__c.install_tar_lzma = "install.tar.lzma"
|
self.__c.install_tar_lzma = "install.tar.lzma"
|
||||||
|
self.__c.mirrors_conf = "/etc/pisi/mirrors.conf"
|
||||||
|
|
||||||
#file/directory permissions
|
#file/directory permissions
|
||||||
self.__c.umask = 0022
|
self.__c.umask = 0022
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# Copyright (C) 2006, TUBITAK/UEKAE
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
# Please read the COPYING file.
|
||||||
|
|
||||||
|
import os.path
|
||||||
|
import pisi.context as ctx
|
||||||
|
from pisi import Error
|
||||||
|
|
||||||
|
import gettext
|
||||||
|
__trans = gettext.translation('pisi', fallback=True)
|
||||||
|
_ = __trans.ugettext
|
||||||
|
|
||||||
|
class Mirrors:
|
||||||
|
def __init__(self, config=ctx.const.mirrors_conf):
|
||||||
|
self.mirrors = {}
|
||||||
|
self._parse(config)
|
||||||
|
|
||||||
|
def get_mirrors(self, name):
|
||||||
|
if self.mirrors.has_key(name):
|
||||||
|
return list(self.mirrors[name])
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _add_mirror(self, name, url):
|
||||||
|
if self.mirrors.has_key(name):
|
||||||
|
self.mirrors[name].append(url)
|
||||||
|
else:
|
||||||
|
self.mirrors[name] = [url]
|
||||||
|
|
||||||
|
def _parse(self, config):
|
||||||
|
if os.path.exists(config):
|
||||||
|
for line in open(config, "r").readlines():
|
||||||
|
if not line.startswith('#') and not line == '\n':
|
||||||
|
mirror = line.strip().split()
|
||||||
|
if len(mirror) == 2:
|
||||||
|
(name, url) = mirror
|
||||||
|
self._add_mirror(name, url)
|
||||||
|
else:
|
||||||
|
raise Error(_('Mirrors file %s does not exist. Could not resolve mirrors://') % config)
|
||||||
|
|
||||||
+36
-8
@@ -28,6 +28,7 @@ import pisi.context as ctx
|
|||||||
from pisi.archive import Archive
|
from pisi.archive import Archive
|
||||||
from pisi.uri import URI
|
from pisi.uri import URI
|
||||||
from pisi.fetcher import fetch_url
|
from pisi.fetcher import fetch_url
|
||||||
|
from pisi.mirrors import Mirrors
|
||||||
|
|
||||||
class Error(pisi.Error):
|
class Error(pisi.Error):
|
||||||
pass
|
pass
|
||||||
@@ -44,21 +45,48 @@ class SourceArchive:
|
|||||||
def fetch(self, interactive=True):
|
def fetch(self, interactive=True):
|
||||||
if not self.is_cached(interactive):
|
if not self.is_cached(interactive):
|
||||||
if interactive:
|
if interactive:
|
||||||
progress = ctx.ui.Progress
|
self.progress = ctx.ui.Progress
|
||||||
else:
|
else:
|
||||||
progress = None
|
self.progress = None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
fetch_url(self.url, ctx.config.archives_dir(), progress)
|
if self.url.get_uri().startswith("mirrors://"):
|
||||||
|
self.fetch_from_mirror()
|
||||||
|
else:
|
||||||
|
fetch_url(self.url, ctx.config.archives_dir(), self.progress)
|
||||||
except pisi.fetcher.FetchError:
|
except pisi.fetcher.FetchError:
|
||||||
# if archive can not be reached from the url, try the fallback
|
|
||||||
# address.
|
|
||||||
if ctx.config.values.build.fallback:
|
if ctx.config.values.build.fallback:
|
||||||
archive = basename(self.url.get_uri())
|
self.fetch_from_fallback()
|
||||||
src = join(ctx.config.values.build.fallback, archive)
|
|
||||||
fetch_url(src, ctx.config.archives_dir(), progress)
|
|
||||||
else:
|
else:
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
def fetch_from_fallback(self):
|
||||||
|
archive = basename(self.url.get_uri())
|
||||||
|
src = join(ctx.config.values.build.fallback, archive)
|
||||||
|
ctx.ui.warning(_('Trying fallback address: %s') % src)
|
||||||
|
fetch_url(src, ctx.config.archives_dir(), self.progress)
|
||||||
|
|
||||||
|
def fetch_from_mirror(self):
|
||||||
|
uri = self.url.get_uri()
|
||||||
|
sep = uri[len("mirrors://"):].split("/")
|
||||||
|
name = sep.pop(0)
|
||||||
|
archive = "/".join(sep)
|
||||||
|
|
||||||
|
mirrors = Mirrors().get_mirrors(name)
|
||||||
|
if not mirrors:
|
||||||
|
raise Error(_("%s mirrors are not defined.") % name)
|
||||||
|
|
||||||
|
for mirror in mirrors:
|
||||||
|
try:
|
||||||
|
url = join(mirror, archive)
|
||||||
|
ctx.ui.warning(_('Fetching source from mirror: %s') % url)
|
||||||
|
fetch_url(url, ctx.config.archives_dir(), self.progress)
|
||||||
|
return
|
||||||
|
except pisi.fetcher.FetchError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
raise pisi.fetcher.FetchError(_('Could not fetch source from %s mirrors.') % name);
|
||||||
|
|
||||||
def is_cached(self, interactive=True):
|
def is_cached(self, interactive=True):
|
||||||
if not access(self.archiveFile, R_OK):
|
if not access(self.archiveFile, R_OK):
|
||||||
return False
|
return False
|
||||||
|
|||||||
Reference in New Issue
Block a user