From: Hans-Christoph Steiner Date: Tue, 16 Feb 2016 22:43:23 +0000 (+0100) Subject: added 'mirrors' option to config for giving official mirror URLs X-Git-Tag: 0.6.0~4^2~1 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=fdroidserver.git;a=commitdiff_plain;h=3967a0068be79efa77db90e80224049a4bada712 added 'mirrors' option to config for giving official mirror URLs serverwebroot has long supported uploading to multiple servers, this bit of metadata communicates those official mirrors to the client so that it can automatically do something useful with that information. closes #14 https://gitlab.com/fdroid/fdroidserver/issues/14 --- diff --git a/examples/config.py b/examples/config.py index 339e9960..54c326fe 100644 --- a/examples/config.py +++ b/examples/config.py @@ -149,6 +149,18 @@ The repository of older versions of applications from the main demo repository. # 'bar.info:/var/www/fdroid', # } +# Any mirrors of this repo, for example all of the servers declared in +# serverwebroot, will automatically be used by the client. If one +# mirror is not working, then the client will try another. If the +# client has Tor enabled, then the client will prefer mirrors with +# .onion addresses. This base URL will be used for both the main repo +# and the archive, if it is enabled. So these URLs should end in the +# 'fdroid' base of the F-Droid part of the web server like serverwebroot. +# +# mirrors = { +# 'https://foo.bar/fdroid', +# 'http://foobarfoobarfoobar.onion/fdroid', +# } # optionally specific which identity file to use when using rsync over SSH # diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 6bbf0fae..bf264121 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -27,6 +27,7 @@ import socket import zipfile import hashlib import pickle +import urlparse from datetime import datetime, timedelta from xml.dom.minidom import Document from argparse import ArgumentParser @@ -760,6 +761,15 @@ def make_index(apps, sortedids, apks, repodir, archive, categories): repoel = doc.createElement("repo") + mirrorcheckfailed = False + for mirror in config.get('mirrors', []): + base = os.path.basename(urlparse.urlparse(mirror).path.rstrip('/')) + if config.get('nonstandardwebroot') is not True and base != 'fdroid': + logging.error("mirror '" + mirror + "' does not end with 'fdroid'!") + mirrorcheckfailed = True + if mirrorcheckfailed: + sys.exit(1) + if archive: repoel.setAttribute("name", config['archive_name']) if config['repo_maxage'] != 0: @@ -767,6 +777,9 @@ def make_index(apps, sortedids, apks, repodir, archive, categories): repoel.setAttribute("icon", os.path.basename(config['archive_icon'])) repoel.setAttribute("url", config['archive_url']) addElement('description', config['archive_description'], doc, repoel) + urlbasepath = os.path.basename(urlparse.urlparse(config['archive_url']).path) + for mirror in config.get('mirrors', []): + addElement('mirror', urlparse.urljoin(mirror, urlbasepath), doc, repoel) else: repoel.setAttribute("name", config['repo_name']) @@ -775,8 +788,11 @@ def make_index(apps, sortedids, apks, repodir, archive, categories): repoel.setAttribute("icon", os.path.basename(config['repo_icon'])) repoel.setAttribute("url", config['repo_url']) addElement('description', config['repo_description'], doc, repoel) + urlbasepath = os.path.basename(urlparse.urlparse(config['repo_url']).path) + for mirror in config.get('mirrors', []): + addElement('mirror', urlparse.urljoin(mirror, urlbasepath), doc, repoel) - repoel.setAttribute("version", "14") + repoel.setAttribute("version", "15") repoel.setAttribute("timestamp", str(int(time.time()))) nosigningkey = False diff --git a/tests/run-tests b/tests/run-tests index dfdda5ad..de9c9a15 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -129,6 +129,7 @@ cd $REPOROOT $fdroid init sed -i.tmp 's,^ *repo_description.*,repo_description = """获取已安装在您的设备上的应用的,' config.py +echo "mirrors = {'https://foo.bar/fdroid', 'http://secret.onion/fdroid'}" >> config.py mkdir metadata cp $WORKSPACE/tests/urzip.apk repo/ cp $WORKSPACE/tests/metadata/info.guardianproject.urzip.txt metadata/