bzr branch
http://suren.me/webbzr/alps/pcitool
346.1.21
by Vasilii Chernov
Add device html server |
1 |
import json |
346.1.30
by Vasilii Chernov
1. api-serer: |
2 |
|
3 |
from optparse import OptionParser, OptionGroup |
|
4 |
from multiprocessing import Process |
|
5 |
||
6 |
import requests |
|
346.1.39
by Vasilii Chernov
Add python servers instalation step. Add systemd config files generation for python servers. |
7 |
from pcilib_api_server import ApiServer |
346.1.21
by Vasilii Chernov
Add device html server |
8 |
|
9 |
#import flask elements
|
|
10 |
from flask import render_template |
|
11 |
from flask import Flask |
|
12 |
from flask import request |
|
13 |
from flask import url_for |
|
14 |
from flask import redirect |
|
346.1.22
by Vasilii Chernov
1. Http server add tree view |
15 |
from flask import send_from_directory |
346.1.30
by Vasilii Chernov
1. api-serer: |
16 |
from flask import make_response |
346.1.21
by Vasilii Chernov
Add device html server |
17 |
|
18 |
app = Flask(__name__) |
|
346.1.30
by Vasilii Chernov
1. api-serer: |
19 |
api_server_port = 9000 |
20 |
api_server_host = '0.0.0.0' |
|
21 |
||
22 |
@app.route("/json/<command>") |
|
23 |
def process_json_command(command): |
|
24 |
headers = {'content-type': 'application/json'} |
|
25 |
message = {'command': command} |
|
26 |
||
27 |
for arg in request.args: |
|
28 |
message[arg] = request.args[arg] |
|
29 |
||
30 |
r = 0; |
|
31 |
try: |
|
32 |
r = requests.get('http://' + api_server_host + ':' + str(api_server_port), |
|
33 |
data=json.dumps(message), |
|
34 |
headers=headers) |
|
35 |
except Exception as e: |
|
36 |
return str(json.dumps({'status':'error', 'description': e})) |
|
37 |
||
38 |
#application/octet-stream
|
|
39 |
response = make_response(r.content) |
|
40 |
for header in r.headers: |
|
41 |
response.headers[header] = r.headers[header] |
|
42 |
||
43 |
return response |
|
346.1.22
by Vasilii Chernov
1. Http server add tree view |
44 |
|
45 |
#html api
|
|
346.1.21
by Vasilii Chernov
Add device html server |
46 |
@app.route('/register_info') |
47 |
def get_register_info(): |
|
346.1.30
by Vasilii Chernov
1. api-serer: |
48 |
#get parameters
|
346.1.21
by Vasilii Chernov
Add device html server |
49 |
name = request.args.get('name') |
50 |
bank = request.args.get('bank') |
|
51 |
||
346.1.30
by Vasilii Chernov
1. api-serer: |
52 |
#load register info
|
346.1.21
by Vasilii Chernov
Add device html server |
53 |
reg_info = 0 |
346.1.27
by Vasilii Chernov
1. pywrap: |
54 |
value = dict() |
346.1.21
by Vasilii Chernov
Add device html server |
55 |
try: |
346.1.30
by Vasilii Chernov
1. api-serer: |
56 |
r = requests.get(url_for('process_json_command', |
57 |
command = 'get_register_info', |
|
58 |
bank = bank, |
|
59 |
reg = name, _external = True)) |
|
60 |
if(r.json().get('status') == 'error'): |
|
61 |
return 'Error: ' + r.json()['description'] |
|
62 |
||
63 |
reg_info = r.json()['register'] |
|
64 |
||
65 |
#get register value
|
|
66 |
r = requests.get(url_for('process_json_command', |
|
67 |
command = 'read_register', |
|
68 |
bank = bank, |
|
69 |
reg = name, _external = True)) |
|
70 |
if(r.json().get('status') == 'error'): |
|
71 |
return 'Error: ' + r.json()['description'] |
|
72 |
||
73 |
value[name] = r.json()['value'] |
|
346.1.21
by Vasilii Chernov
Add device html server |
74 |
except Exception as e: |
75 |
return str(e) |
|
346.1.30
by Vasilii Chernov
1. api-serer: |
76 |
|
346.1.21
by Vasilii Chernov
Add device html server |
77 |
return render_template('register_info.html', |
78 |
register=reg_info, |
|
79 |
value=value) |
|
80 |
||
81 |
@app.route("/registers_list") |
|
82 |
def get_registers_list(): |
|
346.1.30
by Vasilii Chernov
1. api-serer: |
83 |
#get parameters
|
346.1.27
by Vasilii Chernov
1. pywrap: |
84 |
bank = request.args.get('bank') |
85 |
if not bank is None: |
|
86 |
bank = str(bank) |
|
346.1.30
by Vasilii Chernov
1. api-serer: |
87 |
|
88 |
#load registers list
|
|
89 |
reg_list = [] |
|
346.1.21
by Vasilii Chernov
Add device html server |
90 |
try: |
346.1.30
by Vasilii Chernov
1. api-serer: |
91 |
r = requests.get(url_for('process_json_command', |
92 |
command = 'get_registers_list', |
|
93 |
bank = bank, _external = True)) |
|
94 |
if(r.json().get('status') == 'error'): |
|
95 |
return 'Error: ' + r.json()['description'] |
|
96 |
reg_list = r.json()['registers'] |
|
346.1.21
by Vasilii Chernov
Add device html server |
97 |
except Exception as e: |
98 |
return str(e) |
|
346.1.27
by Vasilii Chernov
1. pywrap: |
99 |
|
346.1.30
by Vasilii Chernov
1. api-serer: |
100 |
#get register values
|
346.1.27
by Vasilii Chernov
1. pywrap: |
101 |
value = dict() |
102 |
for reg in reg_list: |
|
103 |
try: |
|
346.1.30
by Vasilii Chernov
1. api-serer: |
104 |
r = requests.get(url_for('process_json_command', |
105 |
command = 'read_register', |
|
106 |
bank = str(reg['bank']), |
|
107 |
reg = str(reg['name']), _external = True)) |
|
108 |
if(r.json().get('status') == 'error'): |
|
109 |
value[reg['name']] = 'Error: ' + r.json()['description'] |
|
110 |
else: |
|
111 |
value[reg['name']] = r.json()['value'] |
|
112 |
||
346.1.27
by Vasilii Chernov
1. pywrap: |
113 |
except Exception as e: |
346.1.30
by Vasilii Chernov
1. api-serer: |
114 |
value[reg['name']] = 'Error: ' + str(e) |
346.1.21
by Vasilii Chernov
Add device html server |
115 |
|
346.1.30
by Vasilii Chernov
1. api-serer: |
116 |
#render result
|
346.1.21
by Vasilii Chernov
Add device html server |
117 |
return render_template('registers_list.html', |
346.1.27
by Vasilii Chernov
1. pywrap: |
118 |
registers = reg_list, |
119 |
render_template = render_template, |
|
120 |
value = value |
|
346.1.21
by Vasilii Chernov
Add device html server |
121 |
)
|
122 |
||
123 |
@app.route("/property_info") |
|
124 |
def get_property_list(): |
|
346.1.30
by Vasilii Chernov
1. api-serer: |
125 |
#get parameters
|
346.1.21
by Vasilii Chernov
Add device html server |
126 |
branch = request.args.get('branch') |
127 |
if not branch is None: |
|
128 |
branch = str(branch) |
|
129 |
||
346.1.30
by Vasilii Chernov
1. api-serer: |
130 |
#get properties info
|
131 |
prop_info = 0 |
|
346.1.21
by Vasilii Chernov
Add device html server |
132 |
try: |
346.1.30
by Vasilii Chernov
1. api-serer: |
133 |
r = requests.get(url_for('process_json_command', |
134 |
command = 'get_property_list', |
|
135 |
branch = branch, _external = True)) |
|
136 |
||
137 |
if(r.json().get('status') == 'error'): |
|
138 |
return 'Error: ' + r.json()['description'] |
|
139 |
||
140 |
prop_info = r.json()['properties'] |
|
141 |
||
346.1.21
by Vasilii Chernov
Add device html server |
142 |
except Exception as e: |
143 |
return str(e) |
|
144 |
||
346.1.27
by Vasilii Chernov
1. pywrap: |
145 |
value = dict() |
346.1.30
by Vasilii Chernov
1. api-serer: |
146 |
for prop in prop_info: |
346.1.21
by Vasilii Chernov
Add device html server |
147 |
try: |
346.1.30
by Vasilii Chernov
1. api-serer: |
148 |
path = prop['path'] |
149 |
r = requests.get(url_for('process_json_command', |
|
150 |
command = 'get_property', |
|
151 |
prop = path, _external = True)) |
|
152 |
if(r.json().get('status') == 'error'): |
|
153 |
value[path] = 'Error: ' + r.json()['description'] |
|
154 |
else: |
|
155 |
value[path] = r.json()['value'] |
|
156 |
||
346.1.21
by Vasilii Chernov
Add device html server |
157 |
except Exception as e: |
346.1.30
by Vasilii Chernov
1. api-serer: |
158 |
value[path] = str(e) |
346.1.21
by Vasilii Chernov
Add device html server |
159 |
|
160 |
return render_template('property_info.html', |
|
161 |
value = value, |
|
162 |
branch = branch, |
|
346.1.37
by Vasilii Chernov
1. Pcipywrap: add persistent locking wrappings |
163 |
properties = prop_info |
164 |
)
|
|
165 |
||
166 |
@app.route("/scripts_info") |
|
167 |
def get_scripts_list(): |
|
168 |
#get properties info
|
|
169 |
prop_info = 0 |
|
170 |
try: |
|
171 |
r = requests.get(url_for('process_json_command', |
|
172 |
command = 'get_scripts_list', |
|
173 |
_external = True)) |
|
174 |
||
175 |
if(r.json().get('status') == 'error'): |
|
176 |
return 'Error: ' + r.json()['description'] |
|
177 |
||
178 |
scripts_info = r.json()['scripts'] |
|
179 |
||
180 |
except Exception as e: |
|
181 |
return str(e) |
|
182 |
||
183 |
return render_template('scripts_info.html', |
|
184 |
scripts = scripts_info |
|
346.1.21
by Vasilii Chernov
Add device html server |
185 |
)
|
186 |
||
187 |
@app.route("/") |
|
188 |
def greet(): |
|
189 |
return render_template('base.html', |
|
190 |
device = device, |
|
191 |
model = model) |
|
192 |
||
193 |
if __name__ == "__main__": |
|
346.1.26
by Vasilii Chernov
Move html_server to separate folder. Update html server templates. |
194 |
#parse command line options
|
346.1.22
by Vasilii Chernov
1. Http server add tree view |
195 |
parser = OptionParser() |
196 |
parser.add_option("-p", "--port", action="store", |
|
197 |
type="int", dest="port", default=5000, |
|
198 |
help="Set server port (5000)") |
|
346.1.30
by Vasilii Chernov
1. api-serer: |
199 |
|
200 |
pcilib_group = OptionGroup(parser, "Api server", |
|
201 |
"Api server options group") |
|
202 |
pcilib_group.add_option("-e", "--external", action="store_true", |
|
203 |
dest="external_api_server", |
|
204 |
default=False, |
|
205 |
help="Dont start own api server. Use external" |
|
206 |
" server instead"); |
|
207 |
pcilib_group.add_option("--api-server-host", action="store", |
|
208 |
type="string", dest="api_server_host", |
|
209 |
default='0.0.0.0', |
|
210 |
help="Api server ip adress (0.0.0.0)") |
|
211 |
pcilib_group.add_option("--api-server-port", action="store", |
|
212 |
type="int", dest="api_server_port", |
|
213 |
default=9000, |
|
214 |
help="Api server port (9000)") |
|
215 |
pcilib_group.add_option("-d", "--device", action="store", |
|
216 |
type="string", dest="device", |
|
217 |
default=str('/dev/fpga0'), |
|
218 |
help="FPGA device (/dev/fpga0)") |
|
219 |
pcilib_group.add_option("-m", "--model", action="store", |
|
220 |
type="string", dest="model", default=None, |
|
221 |
help="Memory model (autodetected)") |
|
222 |
||
223 |
parser.add_option_group(pcilib_group) |
|
224 |
||
346.1.22
by Vasilii Chernov
1. Http server add tree view |
225 |
opts = parser.parse_args()[0] |
226 |
||
227 |
HOST_NAME = '0.0.0.0' |
|
228 |
PORT_NUMBER = opts.port |
|
229 |
||
230 |
device = opts.device |
|
231 |
model = opts.model |
|
232 |
||
346.1.30
by Vasilii Chernov
1. api-serer: |
233 |
#start api server in separate process
|
234 |
api_server_host = opts.api_server_host |
|
235 |
api_server_port = opts.api_server_port |
|
236 |
if(not opts.external_api_server): |
|
237 |
api_server = ApiServer(device, model, (api_server_host, api_server_port)) |
|
238 |
def serve_forever(server): |
|
239 |
try: |
|
240 |
server.serve_forever() |
|
241 |
except KeyboardInterrupt: |
|
242 |
pass
|
|
243 |
||
244 |
Process(target=serve_forever, args=(api_server,)).start() |
|
245 |
||
246 |
#start Flask html server
|
|
247 |
app.run(host = HOST_NAME, |
|
248 |
port = PORT_NUMBER, |
|
249 |
threaded=True, |
|
250 |
#debug=True
|
|
251 |
)
|