diff --git a/config.py.example b/config.py.example index 767ec61fbf69cec53dd3f272e53d0470234a72e7..9cc66982d10f6a2621d72e94ac1082372dbe50e6 100644 --- a/config.py.example +++ b/config.py.example @@ -40,3 +40,8 @@ MAIL_DEFAULT = 'Video AG <videoag@fsmpi.rwth-aachen.de>' MAIL_ADMINS = 'videoag-it@lists.fsmpi.rwth-aachen.de' STREAMING_SERVER = 'rtmp://video-web-0.fsmpi.rwth-aachen.de/src/' BACKUP_STREAMING_SERVER = 'rtmp://video-web-1.fsmpi.rwth-aachen.de/src/' + +S3_ACCESS_KEY = None +S3_SECRET_KEY = None +S3_ENDPOINT = "http://rgw.fsmpi.rwth-aachen.de:7480" +S3_BUCKET_NAME = "VIDEO.rgw.fsmpi.rwth-aachen.de" diff --git a/requirements.txt b/requirements.txt index d0976ac7f10b75380710ede32a39ca2c3647306f..f27bc384fbddb34280a7ba023eebf226733defc4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,7 @@ # required flask requests +boto3 # optional lxml diff --git a/server.py b/server.py index a07832d3881e5cc75865538842487e6d8094b3bb..8600c2b78d02ef6287aeb5c3ef069504e104396a 100644 --- a/server.py +++ b/server.py @@ -7,6 +7,7 @@ import traceback import string import locale import urllib +import boto3 from flask import Flask, request, url_for, redirect, session, render_template, flash, Response, make_response from werkzeug.routing import Rule @@ -39,6 +40,10 @@ if config['DEBUG']: if not config.get('SECRET_KEY', None): config['SECRET_KEY'] = os.urandom(24) +if config.get("S3_ACCESS_KEY") and config.get("S3_SECRET_KEY"): + b3_session = boto3.Session(aws_access_key_id=config["S3_ACCESS_KEY"], + aws_secret_access_key=config["S3_SECRET_KEY"]) + mod_endpoints = [] #pylint: disable=invalid-name def mod_required(func): mod_endpoints.append(func.__name__) @@ -539,7 +544,19 @@ def auth(): #pylint: disable=too-many-branches @app.route('/files/<filename>') def files(filename): - return redirect(config['VIDEOPREFIX']+'/'+filename) + if config.get("S3_ACCESS_KEY") and config.get("S3_SECRET_KEY"): + s3_client = b3_session.client('s3', endpoint_url=config["S3_ENDPOINT"]) + # creates a presigned url, doesn't check wether the object exists though + try: + generated_url = s3_client.generate_presigned_url('get_object', + Params={"Bucket":config["S3_BUCKET_NAME"], "Key": filename}, + ExpiresIn=3600) + except: + notify_admins('s3 error', traceback="creating presigned url failed!") + return None + return redirect(generated_url) + else: + return redirect(config['VIDEOPREFIX']+'/'+filename) @app.route('/sitemap.xml') def sitemap():