chiark / gitweb /
server: allow user to specify custom s3cfg file (closes #413)
authorHans-Christoph Steiner <hans@eds.org>
Tue, 28 Nov 2017 11:07:51 +0000 (12:07 +0100)
committerHans-Christoph Steiner <hans@eds.org>
Wed, 29 Nov 2017 18:50:57 +0000 (19:50 +0100)
This lets people do advanced S3 setups like CloudFront caching, and
anything else s3cmd lets you do.

examples/config.py
fdroidserver/server.py

index 0551e1c0b6568646d752a89dc3507e70a0e91ebd..f36d51d24a4e75013196e245e9dbd07b5d47d3a8 100644 (file)
@@ -216,11 +216,12 @@ The repository of older versions of applications from the main demo repository.
 # sync_from_local_copy_dir = True
 
 
-# To upload the repo to an Amazon S3 bucket using `fdroid server update`.
-# Warning, this deletes and recreates the whole fdroid/ directory each
-# time. This is based on apache-libcloud, which supports basically all cloud
-# storage services, so it should be easy to port the fdroid server tools to
-# any of them.
+# To upload the repo to an Amazon S3 bucket using `fdroid server
+# update`.  Warning, this deletes and recreates the whole fdroid/
+# directory each time. This prefers s3cmd, but can also use
+# apache-libcloud.  To customize how s3cmd interacts with the cloud
+# provider, create a 's3cfg' file next to this file (config.py), and
+# those settings will be used instead of any 'aws' variable below.
 #
 # awsbucket = 'myawsfdroid'
 # awsaccesskeyid = 'SEE0CHAITHEIMAUR2USA'
index 116c27f8f1a55a788be65b5a4acb996befb8286c..bd5a442680c06c9dfb39205660050183d6aca222 100644 (file)
@@ -38,6 +38,9 @@ options = None
 
 BINARY_TRANSPARENCY_DIR = 'binary_transparency'
 
+AUTO_S3CFG = '.fdroid-server-update-s3cfg'
+USER_S3CFG = 's3cfg'
+
 
 def update_awsbucket(repo_section):
     '''
@@ -72,12 +75,17 @@ def update_awsbucket_s3cmd(repo_section):
     logging.debug(_('Using s3cmd to sync with: {url}')
                   .format(url=config['awsbucket']))
 
-    configfilename = '.s3cfg'
-    fd = os.open(configfilename, os.O_CREAT | os.O_TRUNC | os.O_WRONLY, 0o600)
-    os.write(fd, '[default]\n'.encode('utf-8'))
-    os.write(fd, ('access_key = ' + config['awsaccesskeyid'] + '\n').encode('utf-8'))
-    os.write(fd, ('secret_key = ' + config['awssecretkey'] + '\n').encode('utf-8'))
-    os.close(fd)
+    if os.path.exists(USER_S3CFG):
+        logging.info(_('Using "{path}" for configuring s3cmd.').format(path=USER_S3CFG))
+        configfilename = USER_S3CFG
+    else:
+        fd = os.open(AUTO_S3CFG, os.O_CREAT | os.O_TRUNC | os.O_WRONLY, 0o600)
+        logging.debug(_('Creating "{path}" for configuring s3cmd.').format(path=AUTO_S3CFG))
+        os.write(fd, '[default]\n'.encode('utf-8'))
+        os.write(fd, ('access_key = ' + config['awsaccesskeyid'] + '\n').encode('utf-8'))
+        os.write(fd, ('secret_key = ' + config['awssecretkey'] + '\n').encode('utf-8'))
+        os.close(fd)
+        configfilename = AUTO_S3CFG
 
     s3bucketurl = 's3://' + config['awsbucket']
     s3cmd = [config['s3cmd'], '--config=' + configfilename]
@@ -151,6 +159,10 @@ def update_awsbucket_libcloud(repo_section):
             _('To use awsbucket, awssecretkey and awsaccesskeyid must also be set in config.py!'))
     awsbucket = config['awsbucket']
 
+    if os.path.exists(USER_S3CFG):
+        raise FDroidException(_('"{path}" exists but s3cmd is not installed!')
+                              .format(path=USER_S3CFG))
+
     cls = get_driver(Provider.S3)
     driver = cls(config['awsaccesskeyid'], config['awssecretkey'])
     try: