[TIC-CORE] Initial Import
[archive/20170607/tools/tic-core.git] / tic / server / tic_server.py
1 import collections
2 from flask import Flask
3 from flask import Response
4 from flask.globals import request
5 from flask.helpers import url_for
6 import json
7 import os
8 from tic import command
9 from tic.utils import error
10
11
12 app = Flask(__name__)
13
14 @app.route('/')
15 def index():
16     return '''
17         <title>TIC-Core web server</title>
18         <h1> TIC-Core web server is working<h1>
19     '''
20
21 @app.route('/analysis', methods=['GET', 'POST'])
22 def anlayze():
23     try:
24         repo_list = []
25         recipe_list = []
26         if request.method == 'GET':
27             repo_list = request.args.getlist('repos')
28             recipe_list = request.args.getlist('recipes')
29         else:
30             repo_info = json.loads(request.data)
31             if 'repos' in repo_info:
32                 repo_list = repo_info['repos']
33             if 'recipes' in repo_info:
34                 recipe_list = repo_info['recipes']
35         view_data = command.analyze(repo_list, recipe_list)
36         resp = makeresponse(view_data, None)
37     except error.TICError as err:
38         resp = makeresponse(str(err), err)
39     except ValueError as ve:
40         resp = makeresponse(str(ve), ve)
41     except Exception as ex:
42         resp = makeresponse(str(ex), ex)
43     
44     return resp
45
46 def start(port_num=59001):
47     # cryptographic random generator
48     app.secret_key = os.urandom(24) 
49     
50     with app.test_request_context():
51         print(url_for('index'))
52         print(url_for('anlayze'))
53     app.run(host='0.0.0.0', port=port_num)
54
55
56 def makeresponse(data, err):
57     status = 200
58     if err:
59         if isinstance(err, error.TICError) or isinstance(err, ValueError):
60             status = 400 # Bad Request
61         elif isinstance(err, Exception):
62             status = 500 # Internal Server Error
63         res_body = json.dumps(ResultInfo('false', None, data)._asdict())
64     else:
65         res_body = json.dumps(ResultInfo('true', data, None)._asdict())
66     
67     resp = Response(status=status, 
68                     mimetype='application/json',
69                     response= res_body)
70     return resp
71
72
73 ResultInfoType = collections.namedtuple('ResultInfo', 'result, data, message')
74 def ResultInfo(result='false', data=None, message=None):
75     return ResultInfoType(result, data, message)
76
77 if __name__ == '__main__':
78     start()