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