Changeset - 72962eef0d3a
[Not reviewed]
default
0 2 0
Dennis Fink - 11 years ago 2013-11-18 21:12:48
dennis.fink@c3l.lu
updated ennstatus
2 files changed with 8 insertions and 1 deletions:
0 comments (0 inline, 0 general)
ennstatus/__init__.py
Show inline comments
 
from flask import Flask
 
from flask import Flask, redirect, url_for
 
from flask_bootstrap import Bootstrap
 
from flask.ext.compress import Compress
 
#from flask_sslify import SSLify
 

	
 
from ennstatus.log import init_logging
 

	
 
app = Flask(__name__)
 
app.config.from_envvar('ENNSTATUS_SETTINGS')
 

	
 
Bootstrap(app)
 
Compress(app)
 
#SSLify(app, permanent=True)
 

	
 
from ennstatus.views import root_page
 
from ennstatus.api.views import api_page
 
from ennstatus.donate.views import donate_page
 
from ennstatus.status.views import status_page
 
from ennstatus.stats.views import stats_page
 

	
 
app.register_blueprint(root_page)
 
app.register_blueprint(api_page, url_prefix='/api')
 
app.register_blueprint(donate_page, url_prefix='/donate')
 
app.register_blueprint(status_page, url_prefix='/status')
 
app.register_blueprint(stats_page, url_prefix='/stats')
 

	
 

	
 
@app.errorhandler(404)
 
def page_not_found(e):
 
    return redirect(url_for('donate.index'))
 

	
 
init_logging(app)
 

	
 
application = app
ennstatus/api/views.py
Show inline comments
 
from flask import (Blueprint, request, current_app, jsonify, render_template,
 
                   abort)
 

	
 
from ennstatus.api.functions import check_json_format, update_server
 
from ennstatus.status.functions import (single_server, all_servers,
 
                                        all_servers_by_type)
 

	
 
api_page = Blueprint('api', __name__)
 

	
 

	
 
@api_page.route('/update', methods=('POST',))
 
def update():
 

	
 
    current_app.logger.info('Handling update')
 
    if current_app.debug:
 
        accepted_ips = ['127.0.0.1']
 
    else:
 
        accepted_ips = current_app.config.get('ENNSTATUS_ACCEPTED_IPS', [])
 

	
 
    json = request.get_json()
 
    if json is None:
 
        current_app.logger.info('No JSON data supplied!')
 
        return 'No JSON data supplied!\n', 400, {'Content-Type': 'text/plain'}
 

	
 
    try:
 
        check_json_format(json)
 
    except ValueError as e:
 
        current_app.logger.warning(' '.join([str(e), str(json)]))
 
        return str(e), 409, {'Content-Type': 'text/plain'}
 

	
 
    if 'ip' in json:
 
        ip = json['ip']
 
    else:
 
        ip = request.remote_addr
 

	
 
    if request.remote_addr not in accepted_ips:
 
        current_app.logger.warn("Unallowed IP %s tried to update data!"
 
                                % ip)
 
        return 'IP not allowed!\n', 403, {'Content-Type': 'text/plain'}
 

	
 
    current_app.logger.info(str(json))    
 
    server = update_server(server=json, ip=ip)
 

	
 
    if server:
 
        current_app.logger.info('Return result')
 
        current_app.logger.info(str(server))
 
        return (jsonify(server), 201,
 
                {'Location': '/api/export/json/single?server_name=%s'
 
                 % server['server_name']})
 

	
 
    else:
 
        current_app.logger.error("Unexpected error: %s" % server,
 
                                 exc_info=True)
 
        return abort(500)
 

	
 

	
 
@api_page.route('/export', defaults={'server_type': 'all',
 
                                     'export_format': 'json'})
 
@api_page.route('/export/<any("json", "xml"):export_format>',
 
                defaults={'server_type': 'all'})
 
@api_page.route(('/export/<any("json", "xml"):export_format>'
 
                 '/<any("all", "exit", "bridge", "relay", "single")'
 
                 ':server_type>'))
 
def export(export_format, server_type):
 

	
 
    current_app.logger.info('Handling export')
 
    if server_type == 'single':
 
        server_name = request.args.get('server_name', None)
 
        if server_name is not None:
 
            server = single_server(server_name)
 
            if server:
 
                if export_format == 'json':
 
                    current_app.logger.info('Returning server as json!')
 
                    return jsonify(server)
 
                else:
 
                    current_app.logger.info('Returning server as xml!')
 
                    return (
 
                        render_template(
 
                            'api/extract/xml/single_server.xml',
 
                            server=server),
 
                        200, {'Content-Type': 'text/xml'})
 
            else:
 
                current_app.logger.warning('Server not found!')
 
                return ('Server not found!\n',
 
                        404, {'Content-Type': 'text/plain'})
 
        else:
 
            current_app.logger.warning('No server_name specified!')
 
            return ('No server_name specified!\n',
 
                    400, {'Content-Type': 'text/plain'})
 

	
 
    else:
 
        if server_type == 'all':
 
            current_app.logger.info('Getting all servers!')
 
            servers = list(all_servers())
0 comments (0 inline, 0 general)