summaryrefslogtreecommitdiffstats
path: root/pywrap
diff options
context:
space:
mode:
authorVasilii Chernov <vchernov@inr.ru>2016-03-02 08:48:24 +0100
committerVasilii Chernov <vchernov@inr.ru>2016-03-02 08:48:24 +0100
commit8eca0564a1dd6aac125086a244687b4813a1fd86 (patch)
tree462919b3c3a3ebe833b3b7215c5a9399e5da7f60 /pywrap
parent269b0985bd5830e27f6dedb04a05d76f52acb68c (diff)
parentadc657ebcd01ecc2cc5f110453ef00dffde2d5c0 (diff)
downloadpcitool-8eca0564a1dd6aac125086a244687b4813a1fd86.tar.gz
pcitool-8eca0564a1dd6aac125086a244687b4813a1fd86.tar.bz2
pcitool-8eca0564a1dd6aac125086a244687b4813a1fd86.tar.xz
pcitool-8eca0564a1dd6aac125086a244687b4813a1fd86.zip
1. Merge with http://ufo.kit.edu/ufo/log/csa/pcitool 359 revision
2. Move api_server to html server
Diffstat (limited to 'pywrap')
-rw-r--r--pywrap/CMakeLists.txt9
-rw-r--r--pywrap/api_server.py546
2 files changed, 2 insertions, 553 deletions
diff --git a/pywrap/CMakeLists.txt b/pywrap/CMakeLists.txt
index 4f38354..8f14e4f 100644
--- a/pywrap/CMakeLists.txt
+++ b/pywrap/CMakeLists.txt
@@ -17,14 +17,9 @@ set(CMAKE_SWIG_FLAGS "")
swig_add_module(pcipywrap python pcipywrap.i pcipywrap.c)
swig_link_libraries(pcipywrap ${PYTHON_LIBRARIES} pcilib)
-
-#install pcilib python wrapper into Python site packages folder
-execute_process ( COMMAND python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE)
-
-install(TARGETS ${SWIG_MODULE_pcipywrap_REAL_NAME} DESTINATION ${PYTHON_SITE_PACKAGES})
-install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pcipywrap.py DESTINATION ${PYTHON_SITE_PACKAGES})
+install(TARGETS ${SWIG_MODULE_pcipywrap_REAL_NAME} DESTINATION ${PYTHON_INSTALL_DIR})
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pcipywrap.py DESTINATION ${PYTHON_INSTALL_DIR})
if (NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
- file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/api_server.py DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/test_pcipywrap.py DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
endif(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
diff --git a/pywrap/api_server.py b/pywrap/api_server.py
deleted file mode 100644
index 18ee1f8..0000000
--- a/pywrap/api_server.py
+++ /dev/null
@@ -1,546 +0,0 @@
-import os
-import sys
-
-import pcipywrap
-
-import time
-import json
-from optparse import OptionParser
-
-from multiprocessing import Process
-from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
-from SocketServer import ThreadingMixIn
-
-class MultiThreadedHTTPServer(ThreadingMixIn, HTTPServer):
- pass
-
-class PcilibServerHandler(BaseHTTPRequestHandler):
-
- def __init__(s, pcilib, *args):
- s.pcilib = pcilib
- BaseHTTPRequestHandler.__init__(s, *args)
-
- def do_HEAD(s):
- s.send_response(200)
- s.send_header('content-type', 'application/json')
- s.end_headers()
-
- def do_GET(s):
- #run request in separate process
- p = Process(target=s.do_GET_worker, args=())
- p.start()
- p.join()
-
- def do_GET_worker(s):
- length = int(s.headers['Content-Length'])
-
- #deserialize input data
- data = json.loads(s.rfile.read(length).decode('utf-8'))
-
- if 'command' in data:
- command = data['command']
- if(command == 'help'):
- s.help(data)
-
-
-
- #elif(command == 'open'):
- # #check required arguments
- # if not 'device' in data:
- # s.error('message doesnt contains "device" field, '
- # 'which is required for "open" command', data)
- # return
- # #parse command arguments and convert them to string
- # device = str(data.get('device', None))
- # model = data.get('model', None)
- # if not model is None:
- # model = str(model)
- #
- # try:
- # s.openPcilibInstance(device, model)
- # except Exception as e:
- # s.error(str(e), data)
- # return
- #
- # #Success! Create and send reply
- # out = dict()
- # out['status'] = 'ok'
- # s.wrapMessageAndSend(out, data)
-
-
-
- elif(command == 'get_registers_list'):
- #parse command arguments and convert them to string
- bank = data.get('bank', None)
- if not bank is None:
- bank = str(bank)
-
- registers = dict()
- try:
- registers = s.pcilib.get_registers_list(bank)
- except Exception as e:
- s.error(str(e), data)
- return
-
- #Success! Create and send reply
- out = dict()
- out['status'] = 'ok'
- out['registers'] = registers
- s.wrapMessageAndSend(out, data)
-
-
-
- elif(command == 'get_register_info'):
- #check required arguments
- if not 'reg' in data:
- s.error('message doesnt contains "reg" field, '
- 'which is required for "get_register_info" command', data)
- return
-
- #parse command arguments and convert them to string
- reg = str(data.get('reg', None))
- bank = data.get('bank', None)
- if not bank is None:
- bank = str(bank)
-
- register = dict()
- try:
- register = s.pcilib.get_register_info(reg, bank)
- except Exception as e:
- s.error(str(e), data)
- return
-
- #Success! Create and send reply
- s.wrapMessageAndSend({'status': 'ok', 'register': register}, data)
-
-
-
- elif(command == 'get_property_list'):
- #parse command arguments and convert them to string
- branch = data.get('branch', None)
- if not branch is None:
- branch = str(branch)
-
- properties = dict()
- try:
- properties = s.pcilib.get_property_list(branch)
- except Exception as e:
- s.error(str(e), data)
- return
-
- #Success! Create and send reply
- out = dict()
- out['status'] = 'ok'
- out['properties'] = properties
- s.wrapMessageAndSend(out, data)
-
-
-
- elif(command == 'read_register'):
- #check required arguments
- if not 'reg' in data:
- s.error('message doesnt contains "reg" field, '
- 'which is required for "read_register" command', data)
- return
-
- #parse command arguments and convert them to string
- reg = str(data.get('reg', None))
- bank = data.get('bank', None)
- if not bank is None:
- bank = str(bank)
-
- value = 0
- try:
- value = s.pcilib.read_register(reg, bank)
- except Exception as e:
- s.error(str(e), data)
- return
-
- #Success! Create and send reply
- out = dict()
- out['status'] = 'ok'
- out['value'] = value
- s.wrapMessageAndSend(out, data)
-
-
-
- elif(command == 'write_register'):
- #check required arguments
- if not 'reg' in data:
- s.error('message doesnt contains "reg" field, '
- 'which is required for "write_register" command', data)
- return
-
- if not 'value' in data:
- s.error('message doesnt contains "value" field, '
- 'which is required for "write_register" command', data)
- return
-
- #parse command arguments and convert them to string
- reg = str(data.get('reg', None))
- value = str(data.get('value', None))
- bank = data.get('bank', None)
- if not bank is None:
- bank = str(bank)
-
- try:
- s.pcilib.write_register(value, reg, bank)
- except Exception as e:
- s.error(str(e), data)
- return
-
- #Success! Create and send reply
- s.wrapMessageAndSend({'status': 'ok'}, data)
-
-
-
- elif(command == 'get_property'):
- #check required arguments
- if not 'prop' in data:
- s.error('message doesnt contains "prop" field, '
- 'which is required for "get_property" command', data)
- return
-
- #parse command arguments and convert them to string
- prop = str(data.get('prop', None))
-
- value = 0
- try:
- value = s.pcilib.get_property(prop)
- except Exception as e:
- s.error(str(e), data)
- return
-
- #Success! Create and send reply
- out = dict()
- out['status'] = 'ok'
- out['value'] = value
- s.wrapMessageAndSend(out, data)
-
-
-
- elif(command == 'set_property'):
- #check required arguments
- if not 'prop' in data:
- s.error('message doesnt contains "prop" field, '
- 'which is required for "set_property" command', data)
- return
-
- if not 'value' in data:
- s.error('message doesnt contains "value" field, '
- 'which is required for "set_property" command', data)
- return
-
- #parse command arguments and convert them to string
- prop = str(data.get('prop', None))
- value = str(data.get('value', None))
-
- try:
- s.pcilib.set_property(value, prop)
- except Exception as e:
- s.error(str(e), data)
- return
-
- #Success! Create and send reply
- s.wrapMessageAndSend({'status': 'ok'}, data)
-
-
-
- elif(command == 'lock'):
- #check required arguments
- if not 'lock_id' in data:
- s.error('message doesnt contains "lock_id" field, '
- 'which is required for "lock" command', data)
- return
-
- #parse command arguments and convert them to string
- lock_id = str(data.get('lock_id'))
-
- try:
- s.pcilib.lock(lock_id)
- except Exception as e:
- s.error(str(e), data)
- return
-
- #Success! Create and send reply
- s.wrapMessageAndSend({'status': 'ok'}, data)
-
-
-
- elif(command == 'try_lock'):
- #check required arguments
- if not 'lock_id' in data:
- s.error('message doesnt contains "lock_id" field, '
- 'which is required for "try_lock" command', data)
- return
-
- #parse command arguments and convert them to string
- lock_id = str(data.get('lock_id'))
-
- try:
- s.pcilib.try_lock(lock_id)
- except Exception as e:
- s.error(str(e), data)
- return
-
- #Success! Create and send reply
- s.wrapMessageAndSend({'status': 'ok'}, data)
-
-
-
- elif(command == 'unlock'):
- #check required arguments
- if not 'lock_id' in data:
- s.error('message doesnt contains "lock_id" field, '
- 'which is required for "unlock" command', data)
- return
-
- #parse command arguments and convert them to string
- lock_id = str(data.get('lock_id'))
-
- try:
- s.pcilib.unlock(lock_id)
- except Exception as e:
- s.error(str(e), data)
- return
-
- #Success! Create and send reply
- s.wrapMessageAndSend({'status': 'ok'}, data)
-
-
-
- elif(command == 'get_scripts_list'):
- scripts = list()
- try:
- scripts = s.pcilib.get_scripts_list()
- except Exception as e:
- s.error(str(e), data)
- return
-
- #Success! Create and send reply
- s.wrapMessageAndSend({'status': 'ok', 'scripts': scripts}, data)
-
-
-
- elif(command == 'run_script'):
- #check required arguments
- if not 'script_name' in data:
- s.error('message doesnt contains "script_name" field, '
- 'which is required for "run_script" command', data)
- return
- #parse command arguments and convert them to string
- script_name = str(data.get('script_name'))
- value = data.get('value', None)
-
- out = None
- try:
- out = s.pcilib.run_script(script_name, value)
- except Exception as e:
- s.error(str(e), data)
- return
-
- #Success! Create and send reply
- if(type(out) == bytearray):
- s.send_response(200)
- s.send_header('content-disposition', 'inline; filename=value')
- s.send_header('content-type', 'application/octet-stream')
- s.end_headers()
- s.wfile.write(out)
- else:
- s.wrapMessageAndSend({'status': 'ok', 'value': out}, data)
-
-
-
- #elif(command == 'lock_global'):
- # #check if global_lock already setted by server
- # try:
- # s.pcilib.lock_global()
- # except Exception as e:
- # s.error(str(e), data)
- # return
- #
- # #Success! Create and send reply
- # s.wrapMessageAndSend({'status': 'ok'}, data)
-
-
-
- #elif(command == 'unlock_global'):
- # try:
- # s.pcilib.unlock_global()
- # except Exception as e:
- # s.error(str(e), data)
- # return
- #
- # #Success! Create and send reply
- # s.wrapMessageAndSend({'status': 'ok'}, data)
-
-
- else:
- s.error('command "' + command + '" undefined', data)
- return
- else:
- s.error('message doesnt contains "command" field, which is required', data)
- return
-
-
-
- #open device context
- #def openPcilibInstance(s, device, model):
- # s.pcilib = pcipywrap.create_pcilib_instance(device, model)
-
- #Send help message
- def help(s, received_message = None):
- usage = str('Usage:\n'
- ' Server receive commands via http GET with json packet.\n'
- ' content-type should have value "application/json"\n'
- ' Server could handle only commands. to set command, you\n'
- ' should specify field "command" in packet with command name\n'
- ' List of commands:\n'
- '\n'
- ' command: help - Get help. This will return usage\n'
- '\n'
-
- ' command: open - Opens context of device. It will be reopened if already open.\n'
- ' required fields\n'
- ' device: - path to the device file [/dev/fpga0]\n'
- ' optional fields\n'
- ' model: - specifies the model of hardware, autodetected if doesnt exists\n'
- '\n'
-
- ' command: get_registers_list - Returns the list of registers provided by the hardware model.\n'
- ' optional fields\n'
- ' bank: - if set, only register within the specified bank will be returned\n'
- '\n'
-
- ' command: get_register_info - Returns the information about the specified register.\n'
- ' required fields\n'
- ' reg: - the name of the register\n'
- ' optional fields\n'
- ' bank: - if set, only register within the specified bank will be returned\n'
- '\n'
-
- ' command: get_property_list - Returns the list of properties available under the specified path.\n'
- ' optional fields\n'
- ' branch: - Path. If not set, will return the top-level properties\n'
- '\n'
-
- ' command: read_register - Reads the specified register.\n'
- ' required fields\n'
- ' reg: - the name of the register\n'
- ' optional fields\n'
- ' bank: - if set, only register within the specified bank will be processed\n'
- '\n'
-
- ' command: write_register - Writes to specified register.\n'
- ' required fields\n'
- ' reg: - the name of the register\n'
- ' value: - the register value to write. Should be int, float or string (with number)\n'
- ' optional fields\n'
- ' bank: - if set, only register within the specified bank will be processed\n'
- '\n'
-
- ' command: get_property - Reads / computes the property value.\n'
- ' required fields\n'
- ' prop: - full name including path\n'
- '\n'
-
- ' command: set_property - Writes the property value or executes the code associated with property.\n'
- ' required fields\n'
- ' prop: - full name including path\n'
- ' value: - the property value to write. Should be int, float or string (with number)\n'
- '\n'
-
- ' command: lock - function to acquire a lock, and wait till the lock can be acquire.\n'
- ' required fields\n'
- ' lock_id: - lock id\n'
- '\n'
-
- ' command: try_lock - this function will try to take a lock for the mutex pointed by \n'
- ' lockfunction to acquire a lock, but that returns immediatly if the\n'
- ' lock can\'t be acquired on first try\n'
- ' lock_id: - lock id\n'
- '\n'
-
- ' command: unlock - this function unlocks the lock.\n'
- ' required fields\n'
- ' lock_id: - lock id\n'
- '\n'
-
- ' command: get_scripts_list - Get aviable scripts with description\n'
- '\n'
-
- ' command: run_script - Run specified script\n'
- ' required fields\n'
- ' script_name: - script name (with extension)\n'
- ' value: - input value in json format\n'
- '\n'
-
- '\n')
-
- #send help as plain text
- s.send_response(200)
- s.send_header('content-type', 'text/plain')
- s.end_headers()
- s.wfile.write(usage)
-
- #Send error message with text description
- def error(s, info, received_message = None):
- out = dict()
-
- out['status'] = 'error'
- out['description'] = info
- out['note'] = 'send {"command" : "help"} to get help'
- s.wrapMessageAndSend(out, received_message, 400)
-
- def wrapMessageAndSend(s, message, received_message = None, response = 200):
- s.send_response(response)
- s.send_header('content-type', 'application/json')
- s.end_headers()
- if not received_message is None:
- message['received_message'] = received_message
- s.wfile.write(json.dumps(message))
-
-class ApiServer(MultiThreadedHTTPServer):
- def __init__(self, device='/dev/fpga0', model=None, adress=('0.0.0.0', 9000)):
- #redirect logs to exeption
- pcipywrap.redirect_logs_to_exeption()
- #pass Pcipywrap to to server handler
- self.lib = pcipywrap.Pcipywrap(device, model)
- def handler(*args):
- PcilibServerHandler(self.lib, *args)
- MultiThreadedHTTPServer.__init__(self, adress, handler)
-
-if __name__ == '__main__':
-
- #parce command line options
- parser = OptionParser()
- parser.add_option("-p", "--port", action="store",
- type="int", dest="port", default=9000,
- help="Set server port (9000)")
- 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)")
-
- opts = parser.parse_args()[0]
-
- HOST_NAME = '0.0.0.0'
- PORT_NUMBER = opts.port
- MODEL = opts.model
- DEVICE = opts.device
-
- #start server
- httpd = ApiServer(DEVICE, MODEL, (HOST_NAME, PORT_NUMBER))
-
- print time.asctime(), "Server Starts - %s:%s" % (HOST_NAME, PORT_NUMBER)
-
- try:
- httpd.serve_forever()
- except KeyboardInterrupt:
- pass
-
- httpd.server_close()
-
- print time.asctime(), "Server Stops - %s:%s" % (HOST_NAME, PORT_NUMBER)