2014-09-11 19:33:10 +00:00
|
|
|
import logging
|
|
|
|
|
|
|
|
from gzip import GzipFile
|
|
|
|
from flask import send_file, abort
|
|
|
|
from cStringIO import StringIO
|
|
|
|
|
2014-09-11 15:18:28 +00:00
|
|
|
from data.userfiles import DelegateUserfiles, UserfilesHandlers
|
2014-09-08 20:43:17 +00:00
|
|
|
|
2014-09-11 19:33:10 +00:00
|
|
|
|
|
|
|
JSON_MIMETYPE = 'application/json'
|
|
|
|
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
class LogArchiveHandlers(UserfilesHandlers):
|
|
|
|
def get(self, file_id):
|
|
|
|
path = self._files.get_file_id_path(file_id)
|
|
|
|
try:
|
|
|
|
with self._storage.stream_read_file(self._locations, path) as gzip_stream:
|
|
|
|
with GzipFile(fileobj=gzip_stream) as unzipped:
|
|
|
|
unzipped_buffer = StringIO(unzipped.read())
|
|
|
|
return send_file(unzipped_buffer, mimetype=JSON_MIMETYPE)
|
|
|
|
except IOError:
|
|
|
|
abort(404)
|
|
|
|
|
|
|
|
|
2014-09-08 20:43:17 +00:00
|
|
|
class LogArchive(object):
|
2014-09-11 15:18:28 +00:00
|
|
|
def __init__(self, app=None, distributed_storage=None):
|
2014-09-08 20:43:17 +00:00
|
|
|
self.app = app
|
|
|
|
if app is not None:
|
2014-09-11 15:18:28 +00:00
|
|
|
self.state = self.init_app(app, distributed_storage)
|
2014-09-08 20:43:17 +00:00
|
|
|
else:
|
|
|
|
self.state = None
|
|
|
|
|
2014-09-11 15:18:28 +00:00
|
|
|
def init_app(self, app, distributed_storage):
|
|
|
|
location = app.config.get('LOG_ARCHIVE_LOCATION')
|
|
|
|
path = app.config.get('LOG_ARCHIVE_PATH', None)
|
2014-09-08 20:43:17 +00:00
|
|
|
|
2014-09-11 15:18:28 +00:00
|
|
|
handler_name = 'logarchive_handlers'
|
2014-09-08 20:43:17 +00:00
|
|
|
|
2014-09-11 15:18:28 +00:00
|
|
|
log_archive = DelegateUserfiles(app, distributed_storage, location, path, handler_name)
|
2014-09-08 20:43:17 +00:00
|
|
|
|
2014-09-11 15:18:28 +00:00
|
|
|
app.add_url_rule('/logarchive/<file_id>',
|
2014-09-11 19:33:10 +00:00
|
|
|
view_func=LogArchiveHandlers.as_view(handler_name,
|
|
|
|
distributed_storage=distributed_storage,
|
|
|
|
location=location,
|
|
|
|
files=log_archive))
|
2014-09-08 20:43:17 +00:00
|
|
|
|
|
|
|
# register extension with app
|
|
|
|
app.extensions = getattr(app, 'extensions', {})
|
2014-09-11 15:18:28 +00:00
|
|
|
app.extensions['log_archive'] = log_archive
|
|
|
|
return log_archive
|
2014-09-08 20:43:17 +00:00
|
|
|
|
|
|
|
def __getattr__(self, name):
|
|
|
|
return getattr(self.state, name, None)
|