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