html_server.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. import json
  2. from optparse import OptionParser, OptionGroup
  3. from multiprocessing import Process
  4. import requests
  5. from api_server import ApiServer
  6. #import flask elements
  7. from flask import render_template
  8. from flask import Flask
  9. from flask import request
  10. from flask import url_for
  11. from flask import redirect
  12. from flask import send_from_directory
  13. from flask import make_response
  14. app = Flask(__name__)
  15. api_server_port = 9000
  16. api_server_host = '0.0.0.0'
  17. @app.route("/json/<command>")
  18. def process_json_command(command):
  19. headers = {'content-type': 'application/json'}
  20. message = {'command': command}
  21. for arg in request.args:
  22. message[arg] = request.args[arg]
  23. r = 0;
  24. try:
  25. r = requests.get('http://' + api_server_host + ':' + str(api_server_port),
  26. data=json.dumps(message),
  27. headers=headers)
  28. except Exception as e:
  29. return str(json.dumps({'status':'error', 'description': e}))
  30. #application/octet-stream
  31. response = make_response(r.content)
  32. for header in r.headers:
  33. response.headers[header] = r.headers[header]
  34. return response
  35. #html api
  36. @app.route('/register_info')
  37. def get_register_info():
  38. #get parameters
  39. name = request.args.get('name')
  40. bank = request.args.get('bank')
  41. #load register info
  42. reg_info = 0
  43. value = dict()
  44. try:
  45. r = requests.get(url_for('process_json_command',
  46. command = 'get_register_info',
  47. bank = bank,
  48. reg = name, _external = True))
  49. if(r.json().get('status') == 'error'):
  50. return 'Error: ' + r.json()['description']
  51. reg_info = r.json()['register']
  52. #get register value
  53. r = requests.get(url_for('process_json_command',
  54. command = 'read_register',
  55. bank = bank,
  56. reg = name, _external = True))
  57. if(r.json().get('status') == 'error'):
  58. return 'Error: ' + r.json()['description']
  59. value[name] = r.json()['value']
  60. except Exception as e:
  61. return str(e)
  62. return render_template('register_info.html',
  63. register=reg_info,
  64. value=value)
  65. @app.route("/registers_list")
  66. def get_registers_list():
  67. #get parameters
  68. bank = request.args.get('bank')
  69. if not bank is None:
  70. bank = str(bank)
  71. #load registers list
  72. reg_list = []
  73. try:
  74. r = requests.get(url_for('process_json_command',
  75. command = 'get_registers_list',
  76. bank = bank, _external = True))
  77. if(r.json().get('status') == 'error'):
  78. return 'Error: ' + r.json()['description']
  79. reg_list = r.json()['registers']
  80. except Exception as e:
  81. return str(e)
  82. #get register values
  83. value = dict()
  84. for reg in reg_list:
  85. try:
  86. r = requests.get(url_for('process_json_command',
  87. command = 'read_register',
  88. bank = str(reg['bank']),
  89. reg = str(reg['name']), _external = True))
  90. if(r.json().get('status') == 'error'):
  91. value[reg['name']] = 'Error: ' + r.json()['description']
  92. else:
  93. value[reg['name']] = r.json()['value']
  94. except Exception as e:
  95. value[reg['name']] = 'Error: ' + str(e)
  96. #render result
  97. return render_template('registers_list.html',
  98. registers = reg_list,
  99. render_template = render_template,
  100. value = value
  101. )
  102. @app.route("/property_info")
  103. def get_property_list():
  104. #get parameters
  105. branch = request.args.get('branch')
  106. if not branch is None:
  107. branch = str(branch)
  108. #get properties info
  109. prop_info = 0
  110. try:
  111. r = requests.get(url_for('process_json_command',
  112. command = 'get_property_list',
  113. branch = branch, _external = True))
  114. if(r.json().get('status') == 'error'):
  115. return 'Error: ' + r.json()['description']
  116. prop_info = r.json()['properties']
  117. except Exception as e:
  118. return str(e)
  119. value = dict()
  120. for prop in prop_info:
  121. try:
  122. path = prop['path']
  123. r = requests.get(url_for('process_json_command',
  124. command = 'get_property',
  125. prop = path, _external = True))
  126. if(r.json().get('status') == 'error'):
  127. value[path] = 'Error: ' + r.json()['description']
  128. else:
  129. value[path] = r.json()['value']
  130. except Exception as e:
  131. value[path] = str(e)
  132. return render_template('property_info.html',
  133. value = value,
  134. branch = branch,
  135. properties = prop_info,
  136. json = json
  137. )
  138. @app.route("/")
  139. def greet():
  140. return render_template('base.html',
  141. device = device,
  142. model = model)
  143. if __name__ == "__main__":
  144. #parse command line options
  145. parser = OptionParser()
  146. parser.add_option("-p", "--port", action="store",
  147. type="int", dest="port", default=5000,
  148. help="Set server port (5000)")
  149. pcilib_group = OptionGroup(parser, "Api server",
  150. "Api server options group")
  151. pcilib_group.add_option("-e", "--external", action="store_true",
  152. dest="external_api_server",
  153. default=False,
  154. help="Dont start own api server. Use external"
  155. " server instead");
  156. pcilib_group.add_option("--api-server-host", action="store",
  157. type="string", dest="api_server_host",
  158. default='0.0.0.0',
  159. help="Api server ip adress (0.0.0.0)")
  160. pcilib_group.add_option("--api-server-port", action="store",
  161. type="int", dest="api_server_port",
  162. default=9000,
  163. help="Api server port (9000)")
  164. pcilib_group.add_option("-d", "--device", action="store",
  165. type="string", dest="device",
  166. default=str('/dev/fpga0'),
  167. help="FPGA device (/dev/fpga0)")
  168. pcilib_group.add_option("-m", "--model", action="store",
  169. type="string", dest="model", default=None,
  170. help="Memory model (autodetected)")
  171. parser.add_option_group(pcilib_group)
  172. opts = parser.parse_args()[0]
  173. HOST_NAME = '0.0.0.0'
  174. PORT_NUMBER = opts.port
  175. device = opts.device
  176. model = opts.model
  177. #start api server in separate process
  178. api_server_host = opts.api_server_host
  179. api_server_port = opts.api_server_port
  180. if(not opts.external_api_server):
  181. api_server = ApiServer(device, model, (api_server_host, api_server_port))
  182. def serve_forever(server):
  183. try:
  184. server.serve_forever()
  185. except KeyboardInterrupt:
  186. pass
  187. Process(target=serve_forever, args=(api_server,)).start()
  188. #start Flask html server
  189. app.run(host = HOST_NAME,
  190. port = PORT_NUMBER,
  191. threaded=True,
  192. #debug=True
  193. )