| @@ -0,0 +1,51 @@ | |||||
| #from: https://gist.github.com/evz/3849704 | |||||
| from hyde.publisher import Publisher | |||||
| from boto.s3.connection import S3Connection | |||||
| from boto.s3.key import Key | |||||
| import os | |||||
| class S3CredentialsError(Exception): | |||||
| def __init__(self, value): | |||||
| self.value = value | |||||
| def __str__(self): | |||||
| return repr(self.value) | |||||
| class S3(Publisher): | |||||
| def initialize(self, settings): | |||||
| self.settings = settings | |||||
| self.key = getattr(settings, 'key', None) | |||||
| self.secret = getattr(settings, 'secret', None) | |||||
| self.bucket = getattr(settings, 'bucket', None) | |||||
| reds = getattr(settings, 'redirects', None) | |||||
| self.redirects = [] | |||||
| if reds: | |||||
| for redirect in reds: | |||||
| f, t = redirect.split(' => ') | |||||
| self.redirects.append({'from': f, 'to': t}) | |||||
| if not self.key or not self.secret: | |||||
| try: | |||||
| self.key = os.environ['AWS_ACCESS_KEY_ID'] | |||||
| self.secret = os.environ['AWS_SECRET_ACCESS_KEY'] | |||||
| except KeyError: | |||||
| raise S3CredentialsError('You need to define both an AWS key and secret in your site.yaml or as environment variables AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY') | |||||
| def publish(self): | |||||
| super(S3, self).publish() | |||||
| conn = S3Connection(self.key, self.secret) | |||||
| bucket = conn.get_bucket(self.bucket) | |||||
| k = Key(bucket) | |||||
| root = self.site.config.deploy_root_path | |||||
| for item in root.walker.walk_files(): | |||||
| redirect_meta = None | |||||
| if self.redirects: | |||||
| for redirect in self.redirects: | |||||
| if redirect['from'] in item.path: | |||||
| redirect_meta = redirect['to'] | |||||
| k.key = item.path.replace(str(root), '') | |||||
| k.set_contents_from_filename(item.path) | |||||
| if redirect_meta: | |||||
| k.set_metadata('website-redirect-location', redirect_meta) | |||||
| k.set_acl('public-read') | |||||