Merge branch 'pr/114' (ref #114).
This commit is contained in:
1
AUTHORS
1
AUTHORS
@@ -2,6 +2,7 @@ Sigal is written and maintained by Simon Conseil and contributors (in
|
||||
alphabetical order):
|
||||
|
||||
- Christophe-Marie Duquesne
|
||||
- Jonas Kaufmann
|
||||
- Antoine Pitrou
|
||||
- Matthias Vogelgesang
|
||||
- Vikram Shirgur
|
||||
|
||||
@@ -93,3 +93,8 @@ Copyright plugin
|
||||
================
|
||||
|
||||
.. automodule:: sigal.plugins.copyright
|
||||
|
||||
Upload to S3 plugin
|
||||
===================
|
||||
|
||||
.. automodule:: sigal.plugins.upload_s3
|
||||
|
||||
73
sigal/plugins/upload_s3.py
Normal file
73
sigal/plugins/upload_s3.py
Normal file
@@ -0,0 +1,73 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""Plugin to upload generated files to Amazon S3.
|
||||
|
||||
This plugin requires boto_. All generated files are uploaded to a specified S3 bucket.
|
||||
When using this plugin you have to make sure that the bucket already exists and the
|
||||
you have access to the S3 bucket. The access credentials are managed by boto_ and
|
||||
can be given as environment variables, configuration files etc. More information
|
||||
can be found on the boto_ documentation.
|
||||
|
||||
.. _boto: https://pypi.python.org/pypi/boto
|
||||
|
||||
Settings (all settings are wrapped in ``upload_s3_options`` dict):
|
||||
|
||||
- ``bucket``: The to-be-used bucket for uploading.
|
||||
- ``policy``: Specifying access control to the uploaded files. Possible values:
|
||||
private, public-read, public-read-write, authenticated-read
|
||||
- ``overwrite``: Boolean indicating if all files should be uploaded and overwritten
|
||||
or if already uploaded files should be skipped.
|
||||
|
||||
"""
|
||||
|
||||
import logging
|
||||
import os
|
||||
from sigal import signals
|
||||
import boto
|
||||
from boto.s3.key import Key
|
||||
from click import progressbar
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def upload_s3(gallery, settings=None):
|
||||
upload_files = []
|
||||
|
||||
# Get local files
|
||||
for root, dirs, files in os.walk(gallery.settings['destination']):
|
||||
for f in files:
|
||||
path = os.path.join(root[len(gallery.settings['destination'])+1:], f)
|
||||
size = os.path.getsize(os.path.join(root, f))
|
||||
upload_files += [ (path, size) ]
|
||||
|
||||
# Connect to specified bucket
|
||||
conn = boto.connect_s3()
|
||||
bucket = conn.get_bucket(gallery.settings['upload_s3_options']['bucket'])
|
||||
|
||||
# Upload the files
|
||||
with progressbar(upload_files, label="Uploading files to S3") as progress_upload:
|
||||
for (f, size) in progress_upload:
|
||||
if gallery.settings['upload_s3_options']['overwrite'] == False:
|
||||
# Check if file was uploaded before
|
||||
key = bucket.get_key(f)
|
||||
if key != None and key.size == size:
|
||||
logger.debug("Skipping file %s" % (f))
|
||||
else:
|
||||
upload_file(gallery, bucket, f)
|
||||
else:
|
||||
# File is not available on S3 yet
|
||||
upload_file(gallery, bucket, f)
|
||||
|
||||
def upload_file(gallery, bucket, f):
|
||||
logger.debug("Uploading file %s" % (f))
|
||||
key = Key(bucket)
|
||||
key.key = f
|
||||
key.set_contents_from_filename(
|
||||
os.path.join(gallery.settings['destination'], f),
|
||||
policy = gallery.settings['upload_s3_options']['policy'])
|
||||
|
||||
def register(settings):
|
||||
if settings.get('upload_s3_options'):
|
||||
signals.gallery_build.connect(upload_s3)
|
||||
else:
|
||||
logger.warning('Upload to S3 is not configured.')
|
||||
@@ -171,7 +171,8 @@ ignore_files = []
|
||||
# Another option is to import the plugin and put the module in the list, but
|
||||
# this will break with the multiprocessing feature (the settings dict obtained
|
||||
# from this file must be serializable).
|
||||
# plugins = ['sigal.plugins.adjust', 'sigal.plugins.copyright']
|
||||
# plugins = ['sigal.plugins.adjust', 'sigal.plugins.copyright',
|
||||
# 'sigal.plugins.upload_s3']
|
||||
|
||||
# Add a copyright text on the image (default: '')
|
||||
# copyright = "© An example copyright message"
|
||||
@@ -182,3 +183,10 @@ ignore_files = []
|
||||
# 'brightness': 1.0,
|
||||
# 'contrast': 1.0,
|
||||
# 'sharpness': 1.0}
|
||||
|
||||
# Settings for upload to s3 plugin
|
||||
# upload_s3_options = {
|
||||
# 'bucket': 'my-bucket',
|
||||
# 'policy': 'public-read',
|
||||
# 'overwrite': False
|
||||
# }
|
||||
Reference in New Issue
Block a user