/alps/pcitool

To get this branch, use:
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
         )