[TIC-CORE] supports new recipe
[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 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=['POST'])
22 def analysis():
23     try:
24         logger = logging.getLogger(__name__)
25         logger.info('%s - %s %s : data=%s' % (request.remote_addr, request.method, request.path, request.data))
26         target_info = json.loads(request.data)
27         view_data = command.analyze(target_info.get('recipes'))
28         #view_data = command.analyze(None)
29         resp = makeresponse(view_data, None)
30     except error.TICError as err:
31         logger.error(err)
32         resp = makeresponse(str(err), err)
33     except ValueError as ve:
34         logger.error(ve)
35         resp = makeresponse(str(ve), ve)
36 #     except Exception as ex:
37 #         logger.error(ex)
38 #         resp = makeresponse(str(ex), ex)
39     
40     return resp
41
42 @app.route('/imports', methods=['POST'])
43 def imports():
44     try:
45         logger = logging.getLogger(__name__)
46         logger.info('%s - %s %s : data=%s' % (request.remote_addr, request.method, request.path, request.data))
47         repo_info = json.loads(request.data)
48         view_data = command.imports(repo_info.get('recipes'))
49         resp = makeresponse(view_data, None)
50     except error.TICError as err:
51         logger.error(err)
52         resp = makeresponse(str(err), err)
53     except Exception as ex:
54         logger.error(ex)
55         resp = makeresponse(str(ex), ex)
56     
57     return resp
58
59 @app.route('/exports', methods=['POST'])
60 def exports():
61     try:
62         logger = logging.getLogger(__name__)
63         logger.info('%s - %s %s : data=%s' % (request.remote_addr, request.method, request.path, request.data))
64         exportInfo = json.loads(request.data)
65         export_type = request.args.get('format')
66         output = command.exports(export_type, exportInfo.get('recipes'), exportInfo.get('packages'), exportInfo.get('outdir'), exportInfo.get('filename'))
67         resp = makeresponse(output, None)
68     except error.TICError as err:
69         logger.error(err)
70         resp = makeresponse(str(err), err)
71     except ValueError as ve:
72         logger.error(ve)
73         resp = makeresponse(str(ve), ve)
74 #     except Exception as ex:
75 #         logger.error(ex)
76 #         resp = makeresponse(str(ex), ex)
77     return resp
78
79
80 def start(port_num=8082):
81     # cryptographic random generator
82     app.secret_key = os.urandom(24) 
83     
84     with app.test_request_context():
85         print(url_for('index'))
86         print(url_for('analysis'))
87         print(url_for('imports'))
88         print(url_for('exports'))
89     if isinstance(port_num, (str, unicode)):
90         port_num = int(port_num)
91     app.run(host='0.0.0.0', threaded=True, port=port_num)
92
93 def makeresponse(data, err):
94     status = 200
95     if err:
96         if isinstance(err, error.TICError) or isinstance(err, ValueError):
97             status = 400 # Bad Request
98         elif isinstance(err, Exception):
99             status = 500 # Internal Server Error
100             data='Internal Server Error'
101         res_body = json.dumps(ResultInfo('false', None, data)._asdict())
102     else:
103         res_body = json.dumps(ResultInfo('true', data, None)._asdict())
104     
105     resp = Response(status=status, 
106                     mimetype='application/json',
107                     response=res_body)
108     return resp
109
110
111 ResultInfoType = collections.namedtuple('ResultInfo', 'result, data, message')
112 def ResultInfo(result='false', data=None, message=None):
113     return ResultInfoType(result, data, message)
114
115 if __name__ == '__main__':
116     start(8082)