from flask import (Flask, request, abort, ) import os # Flask app app = Flask(__name__, static_folder='static', static_url_path='', instance_relative_config=True) CONFIG = os.environ.get('CONFIG') or 'config.Development' app.config.from_object('config.Default') app.config.from_object(CONFIG) # logging import logging from log.config import LoggingConfiguration LoggingConfiguration.set( logging.DEBUG if os.getenv('DEBUG') else logging.INFO, 'lightop.log', name='Web') import json from functools import wraps import subprocess import time FIRST = True def exception_to_json(func): @wraps(func) def wrapper(*args, **kwargs): try: result = func(*args, **kwargs) return result except (BadRequest, KeyError, ValueError, ) as e: result = {'error': {'code': 400, 'message': str(e)}} except PermissionDenied as e: result = {'error': {'code': 403, 'message': ', '.join(e.args)}} except (NotImplementedError, RuntimeError, AttributeError) as e: result = {'error': {'code': 500, 'message': ', '.join(e.args)}} return json.dumps(result) return wrapper class PermissionDenied(Exception): pass class BadRequest(Exception): pass HTML_INDEX = ''' Page Redirection ''' HTML_REDIRECT = ''' Page Redirection ''' @app.route('/') def index(): return HTML_INDEX @app.route('/redirect.html') def redirectme(): global FIRST if not FIRST: return HTML_REDIRECT env = {'width': 1024, 'height': 768} if 'width' in request.args: env['width'] = request.args['width'] if 'height' in request.args: env['height'] = request.args['height'] # sed subprocess.check_call(r"sed -i 's#^command=/usr/bin/Xvfb.*$#command=/usr/bin/Xvfb :1 -screen 0 {width}x{height}x16#' /etc/supervisor/conf.d/supervisord.conf".format(**env), shell=True) # supervisorctrl reload subprocess.check_call(r"supervisorctl reload", shell=True) # check all running for i in xrange(20): output = subprocess.check_output(r"supervisorctl status | grep RUNNING | wc -l", shell=True) if output.strip() == "6": FIRST = False return HTML_REDIRECT time.sleep(2) abort(500, 'service is not ready, please restart container') if __name__ == '__main__': app.run(host=app.config['ADDRESS'], port=app.config['PORT'])