websocketServer.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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,IndexError):
  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. if parts[0]=="TEST":
  38. print('Test')
  39. return
  40. run(message)
  41. #await websocket.send(greeting)
  42. #don't send anything, just log
  43. print(">>>[{}] Done".format(message))
  44. async def main(ip):
  45. origins=["merlin","labkey-public","onko-nix","labkey-klimt","labkey-vm"]
  46. #server="vangogh.fmf.uni-lj.si"
  47. #serverIP="193.2.68.227"
  48. #serve IP as argument
  49. serverIP=ip
  50. print(f"Starting server at {serverIP}")
  51. async with websockets.serve(hello, serverIP, 8765,origins=origins) as server:
  52. #await asyncio.Future() # run forever
  53. await server.wait_closed()
  54. def run(message):
  55. args=message.split(':')
  56. scriptFile=args[1]
  57. fsetup=os.path.join(os.path.expanduser('~'),'.labkey','setup.json')
  58. with open(fsetup) as f:
  59. setup=json.load(f)
  60. parts=scriptFile.split('/')
  61. scriptDir=parts[-2]#one before last, last is the script name
  62. scriptFile=scriptFile.replace('_softwareSrc_',setup['paths']['softwareSrc'])
  63. venv=setup['venv'][scriptDir]
  64. pCall=os.path.join(venv,'bin','python')
  65. argsCall=[pCall,scriptFile,args[0],args[2]]
  66. subprocess.Popen(argsCall)
  67. #spath=pathlib.Path(scriptFile)
  68. #print('script: {} [{}]{}'.format(scriptFile,spath.parent,spath.stem))
  69. #sys.path.append(str(spath.parent))
  70. #print(sys.path)
  71. #module=importlib.import_module(spath.stem)
  72. #module.main(args[0],args[2])
  73. if __name__ == "__main__":
  74. asyncio.run(main(sys.argv[1]))