pcilib_html_server.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. import json
  2. from optparse import OptionParser, OptionGroup
  3. from multiprocessing import Process
  4. import requests
  5. from pcilib_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. )
  137. @app.route("/scripts_info")
  138. def get_scripts_list():
  139. #get properties info
  140. prop_info = 0
  141. try:
  142. r = requests.get(url_for('process_json_command',
  143. command = 'get_scripts_list',
  144. _external = True))
  145. if(r.json().get('status') == 'error'):
  146. return 'Error: ' + r.json()['description']
  147. scripts_info = r.json()['scripts']
  148. except Exception as e:
  149. return str(e)
  150. return render_template('scripts_info.html',
  151. scripts = scripts_info
  152. )
  153. @app.route("/")
  154. def greet():
  155. return render_template('base.html',
  156. device = device,
  157. model = model)
  158. if __name__ == "__main__":
  159. #parse command line options
  160. parser = OptionParser()
  161. parser.add_option("-p", "--port", action="store",
  162. type="int", dest="port", default=5000,
  163. help="Set server port (5000)")
  164. pcilib_group = OptionGroup(parser, "Api server",
  165. "Api server options group")
  166. pcilib_group.add_option("-e", "--external", action="store_true",
  167. dest="external_api_server",
  168. default=False,
  169. help="Dont start own api server. Use external"
  170. " server instead");
  171. pcilib_group.add_option("--api-server-host", action="store",
  172. type="string", dest="api_server_host",
  173. default='0.0.0.0',
  174. help="Api server ip adress (0.0.0.0)")
  175. pcilib_group.add_option("--api-server-port", action="store",
  176. type="int", dest="api_server_port",
  177. default=9000,
  178. help="Api server port (9000)")
  179. pcilib_group.add_option("-d", "--device", action="store",
  180. type="string", dest="device",
  181. default=str('/dev/fpga0'),
  182. help="FPGA device (/dev/fpga0)")
  183. pcilib_group.add_option("-m", "--model", action="store",
  184. type="string", dest="model", default=None,
  185. help="Memory model (autodetected)")
  186. parser.add_option_group(pcilib_group)
  187. opts = parser.parse_args()[0]
  188. HOST_NAME = '0.0.0.0'
  189. PORT_NUMBER = opts.port
  190. device = opts.device
  191. model = opts.model
  192. #start api server in separate process
  193. api_server_host = opts.api_server_host
  194. api_server_port = opts.api_server_port
  195. if(not opts.external_api_server):
  196. api_server = ApiServer(device, model, (api_server_host, api_server_port))
  197. def serve_forever(server):
  198. try:
  199. server.serve_forever()
  200. except KeyboardInterrupt:
  201. pass
  202. Process(target=serve_forever, args=(api_server,)).start()
  203. #start Flask html server
  204. app.run(host = HOST_NAME,
  205. port = PORT_NUMBER,
  206. threaded=True,
  207. #debug=True
  208. )