websocketServer.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import asyncio
  2. import websockets
  3. import sys
  4. import json
  5. #import importlib
  6. #import pathlib
  7. import os
  8. import subprocess
  9. async def hello(websocket):
  10. #websocket is a WebSocketServerProtocol
  11. message = await websocket.recv()
  12. client=websocket.remote_address[0]
  13. host=websocket.local_address[0]
  14. #delegate parsing to subroutine
  15. #assume the message will be
  16. #pathToPythonCode:argument
  17. #where argument is some sort of a string or a number
  18. #pathToPythonCode can have replacementStrings
  19. #that reflect local software arrangement,
  20. #for example _softwareSrc_ will get replaced by
  21. #software/src directory from setup.json
  22. parts=message.split(':')
  23. message=':'.join([client,message])
  24. print(f"<<< FROM: {host}")
  25. print(f"<<< {message}")
  26. greeting = f"Hello {message}!"
  27. key=0
  28. try:
  29. key=int(parts[1])
  30. except ValueError:
  31. #only used for exit checking
  32. pass
  33. if client==host and parts[0]=="END" and key<0:
  34. print("Exit signal")
  35. websocket.ws_server.close()
  36. return
  37. run(message)
  38. #await websocket.send(greeting)
  39. #don't send anything, just log
  40. print(f">>> {greeting}")
  41. async def main():
  42. origins=["merlin","labkey-public","onko-nix",None]
  43. #server="vangogh.fmf.uni-lj.si"
  44. serverIP="193.2.68.227"
  45. print(f"Starting server at {serverIP}")
  46. async with websockets.serve(hello, serverIP, 8765,origins=origins) as server:
  47. #await asyncio.Future() # run forever
  48. await server.wait_closed()
  49. def run(message):
  50. args=message.split(':')
  51. scriptFile=args[1]
  52. fsetup=os.path.join(os.path.expanduser('~'),'.labkey','setup.json')
  53. with open(fsetup) as f:
  54. setup=json.load(f)
  55. parts=scriptFile.split('/')
  56. scriptDir=parts[-2]#one before last, last is the script name
  57. scriptFile=scriptFile.replace('_softwareSrc_',setup['paths']['softwareSrc'])
  58. venv=setup['venv'][scriptDir]
  59. pCall=os.path.join(venv,'bin','python')
  60. argsCall=[pCall,scriptFile,args[0],args[2]]
  61. subprocess.run(argsCall)
  62. #spath=pathlib.Path(scriptFile)
  63. #print('script: {} [{}]{}'.format(scriptFile,spath.parent,spath.stem))
  64. #sys.path.append(str(spath.parent))
  65. #print(sys.path)
  66. #module=importlib.import_module(spath.stem)
  67. #module.main(args[0],args[2])
  68. if __name__ == "__main__":
  69. asyncio.run(main())