diff options
author | Vasilii Chernov <vchernov@inr.ru> | 2016-03-01 16:42:48 +0100 |
---|---|---|
committer | Vasilii Chernov <vchernov@inr.ru> | 2016-03-01 16:42:48 +0100 |
commit | 9b947f32c3db96c3022afad401b1349205d22259 (patch) | |
tree | 1bc5fbc5c82752d1808a240964317c6813ad19c3 /html_server/html_server.py | |
parent | 5d775d64bdec554b9842823bd1c46263210425fd (diff) | |
download | pcitool-9b947f32c3db96c3022afad401b1349205d22259.tar.gz pcitool-9b947f32c3db96c3022afad401b1349205d22259.tar.bz2 pcitool-9b947f32c3db96c3022afad401b1349205d22259.tar.xz pcitool-9b947f32c3db96c3022afad401b1349205d22259.zip |
1. api-serer:
- change multiprosessing work mechanism
- add new pywrap functions handling
2. html-server:
- now works through api-server
Diffstat (limited to 'html_server/html_server.py')
-rw-r--r-- | html_server/html_server.py | 257 |
1 files changed, 137 insertions, 120 deletions
diff --git a/html_server/html_server.py b/html_server/html_server.py index 0d4bca8..22194cd 100644 --- a/html_server/html_server.py +++ b/html_server/html_server.py @@ -1,6 +1,10 @@ -import pcipywrap import json -from optparse import OptionParser + +from optparse import OptionParser, OptionGroup +from multiprocessing import Process + +import requests +from api_server import ApiServer #import flask elements from flask import render_template @@ -9,140 +13,107 @@ from flask import request from flask import url_for from flask import redirect from flask import send_from_directory +from flask import make_response app = Flask(__name__) -pcilib = 0; -device = '/dev/fpga0' -model = '' +api_server_port = 9000 +api_server_host = '0.0.0.0' -# property json api -@app.route("/property_info_json") -def get_property_list_json(): - branch = request.args.get('branch') - if not branch is None: - branch = str(branch) +@app.route("/json/<command>") +def process_json_command(command): + headers = {'content-type': 'application/json'} + message = {'command': command} - prop_info = 0 - try: - prop_info = pcilib.get_property_list(branch) - return json.dumps(prop_info) - except Exception as e: - return json.dumps({'error': str(e)}) - -@app.route('/get_property_json') -def get_property_json(): - prop = request.args.get('prop') - - try: - val = pcilib.get_property(str(prop)) - return json.dumps({'value': val}) - except Exception as e: - return json.dumps({'error': str(e)}) - -@app.route('/set_property_json') -def set_property_json(): - val = request.args.get('val') - prop = request.args.get('prop') - - try: - pcilib.set_property(float(val), str(prop)) - return json.dumps({'status': 'ok'}) - except Exception as e: - return json.dumps({'error': str(e)}) + for arg in request.args: + message[arg] = request.args[arg] -# register json api -@app.route("/registers_list_json") -def get_registers_list_json(): - reg_list = 0 + r = 0; try: - reg_list = pcilib.get_registers_list() - return json.dumps(reg_list) + r = requests.get('http://' + api_server_host + ':' + str(api_server_port), + data=json.dumps(message), + headers=headers) except Exception as e: - return json.dumps({'error': str(e)}) - -@app.route('/read_register_json') -def read_register_json(): - name = request.args.get('name') - bank = request.args.get('bank') + return str(json.dumps({'status':'error', 'description': e})) - try: - value = pcilib.read_register(str(name), str(bank)) - return json.dumps({'value': value}) - except Exception as e: - return json.dumps({'error': str(e)}) - -@app.route('/write_register_json') -def write_register_json(): - val = request.args.get('val') - name = request.args.get('name') - bank = request.args.get('bank') - - try: - pcilib.write_register(float(val), str(name), str(bank)) - return json.dumps({'status': 'ok'}) - except Exception as e: - return json.dumps({'error': str(e)}) + #application/octet-stream + response = make_response(r.content) + for header in r.headers: + response.headers[header] = r.headers[header] + + return response #html api -@app.route('/set_property') -def set_property(): - val = request.args.get('val') - prop = request.args.get('prop') - - try: - pcilib.set_property(float(val), str(prop)) - return redirect(url_for('get_property_list', branch=prop)) - except Exception as e: - return str(e) - -@app.route('/write_register') -def write_register(): - val = request.args.get('val') - name = request.args.get('name') - bank = request.args.get('bank') - - try: - pcilib.write_register(float(val), str(name), str(bank)) - return redirect(url_for('get_register_info', name=name, bank=bank)) - except Exception as e: - return str(e) - @app.route('/register_info') def get_register_info(): + #get parameters name = request.args.get('name') bank = request.args.get('bank') + #load register info reg_info = 0 value = dict() try: - reg_info = pcilib.get_register_info(str(name), str(bank)) - value[name] = pcilib.read_register(str(name), str(bank)) + r = requests.get(url_for('process_json_command', + command = 'get_register_info', + bank = bank, + reg = name, _external = True)) + if(r.json().get('status') == 'error'): + return 'Error: ' + r.json()['description'] + + reg_info = r.json()['register'] + + #get register value + r = requests.get(url_for('process_json_command', + command = 'read_register', + bank = bank, + reg = name, _external = True)) + if(r.json().get('status') == 'error'): + return 'Error: ' + r.json()['description'] + + value[name] = r.json()['value'] except Exception as e: return str(e) + return render_template('register_info.html', register=reg_info, value=value) @app.route("/registers_list") def get_registers_list(): + #get parameters bank = request.args.get('bank') if not bank is None: bank = str(bank) - - reg_list = 0 + + #load registers list + reg_list = [] try: - reg_list = pcilib.get_registers_list(bank) + r = requests.get(url_for('process_json_command', + command = 'get_registers_list', + bank = bank, _external = True)) + if(r.json().get('status') == 'error'): + return 'Error: ' + r.json()['description'] + reg_list = r.json()['registers'] except Exception as e: return str(e) + #get register values value = dict() for reg in reg_list: try: - value[reg['name']] = pcilib.read_register(str(reg['name']), - str(reg['bank'])) + r = requests.get(url_for('process_json_command', + command = 'read_register', + bank = str(reg['bank']), + reg = str(reg['name']), _external = True)) + if(r.json().get('status') == 'error'): + value[reg['name']] = 'Error: ' + r.json()['description'] + else: + value[reg['name']] = r.json()['value'] + except Exception as e: - value[reg['name']] = str(e) + value[reg['name']] = 'Error: ' + str(e) + #render result return render_template('registers_list.html', registers = reg_list, render_template = render_template, @@ -151,30 +122,40 @@ def get_registers_list(): @app.route("/property_info") def get_property_list(): + #get parameters branch = request.args.get('branch') if not branch is None: branch = str(branch) - prop_info = 0 + #get properties info + prop_info = 0 try: - prop_info = pcilib.get_property_list(branch) + r = requests.get(url_for('process_json_command', + command = 'get_property_list', + branch = branch, _external = True)) + + if(r.json().get('status') == 'error'): + return 'Error: ' + r.json()['description'] + + prop_info = r.json()['properties'] + except Exception as e: return str(e) value = dict() - if (len(prop_info) == 1) and not ('childs' in (prop_info[0])['flags']): + for prop in prop_info: try: - branch = (prop_info[0])['path'] - value[branch] = pcilib.get_property(branch) + path = prop['path'] + r = requests.get(url_for('process_json_command', + command = 'get_property', + prop = path, _external = True)) + if(r.json().get('status') == 'error'): + value[path] = 'Error: ' + r.json()['description'] + else: + value[path] = r.json()['value'] + except Exception as e: - return str(e) - else: - for prop in prop_info: - try: - path = prop['path'] - value[path] = pcilib.get_property(path) - except Exception as e: - value[path] = str(e) + value[path] = str(e) return render_template('property_info.html', value = value, @@ -195,12 +176,32 @@ if __name__ == "__main__": parser.add_option("-p", "--port", action="store", type="int", dest="port", default=5000, help="Set server port (5000)") - parser.add_option("-d", "--device", action="store", - type="string", dest="device", default=str('/dev/fpga0'), - help="FPGA device (/dev/fpga0)") - parser.add_option("-m", "--model", action="store", - type="string", dest="model", default=None, - help="Memory model (autodetected)") + + pcilib_group = OptionGroup(parser, "Api server", + "Api server options group") + pcilib_group.add_option("-e", "--external", action="store_true", + dest="external_api_server", + default=False, + help="Dont start own api server. Use external" + " server instead"); + pcilib_group.add_option("--api-server-host", action="store", + type="string", dest="api_server_host", + default='0.0.0.0', + help="Api server ip adress (0.0.0.0)") + pcilib_group.add_option("--api-server-port", action="store", + type="int", dest="api_server_port", + default=9000, + help="Api server port (9000)") + pcilib_group.add_option("-d", "--device", action="store", + type="string", dest="device", + default=str('/dev/fpga0'), + help="FPGA device (/dev/fpga0)") + pcilib_group.add_option("-m", "--model", action="store", + type="string", dest="model", default=None, + help="Memory model (autodetected)") + + parser.add_option_group(pcilib_group) + opts = parser.parse_args()[0] HOST_NAME = '0.0.0.0' @@ -209,6 +210,22 @@ if __name__ == "__main__": device = opts.device model = opts.model - pcilib = pcipywrap.Pcipywrap(device, model) - pcipywrap.__redirect_logs_to_exeption() - app.run(host = HOST_NAME, port = PORT_NUMBER, threaded=True) + #start api server in separate process + api_server_host = opts.api_server_host + api_server_port = opts.api_server_port + if(not opts.external_api_server): + api_server = ApiServer(device, model, (api_server_host, api_server_port)) + def serve_forever(server): + try: + server.serve_forever() + except KeyboardInterrupt: + pass + + Process(target=serve_forever, args=(api_server,)).start() + + #start Flask html server + app.run(host = HOST_NAME, + port = PORT_NUMBER, + threaded=True, + #debug=True + ) |