import asyncio import websockets import sys import json #import importlib #import pathlib import os import subprocess async def hello(websocket): #websocket is a WebSocketServerProtocol message = await websocket.recv() client=websocket.remote_address[0] host=websocket.local_address[0] #delegate parsing to subroutine #assume the message will be #pathToPythonCode:argument #where argument is some sort of a string or a number #pathToPythonCode can have replacementStrings #that reflect local software arrangement, #for example _softwareSrc_ will get replaced by #software/src directory from setup.json parts=message.split(':') message=':'.join([client,message]) print(f"<<< FROM: {host}") print(f"<<< {message}") #greeting = f"Hello {message}!" key=0 try: key=int(parts[1]) except (ValueError,IndexError): #only used for exit checking pass if client==host and parts[0]=="END" and key<0: print("Exit signal") websocket.ws_server.close() return if parts[0]=="TEST": print('Test') return run(message) #await websocket.send(greeting) #don't send anything, just log print(">>>[{}] Done".format(message)) async def main(ip): origins=["merlin","labkey-public","onko-nix","labkey-klimt","labkey-vm"] #server="vangogh.fmf.uni-lj.si" #serverIP="193.2.68.227" #serve IP as argument serverIP=ip print(f"Starting server at {serverIP}") async with websockets.serve(hello, serverIP, 8765,origins=origins) as server: #await asyncio.Future() # run forever await server.wait_closed() def run(message): args=message.split(':') scriptFile=args[1] fsetup=os.path.join(os.path.expanduser('~'),'.labkey','setup.json') with open(fsetup) as f: setup=json.load(f) parts=scriptFile.split('/') scriptDir=parts[-2]#one before last, last is the script name scriptFile=scriptFile.replace('_softwareSrc_',setup['paths']['softwareSrc']) venv=setup['venv'][scriptDir] pCall=os.path.join(venv,'bin','python') argsCall=[pCall,scriptFile,args[0],args[2]] subprocess.Popen(argsCall) #spath=pathlib.Path(scriptFile) #print('script: {} [{}]{}'.format(scriptFile,spath.parent,spath.stem)) #sys.path.append(str(spath.parent)) #print(sys.path) #module=importlib.import_module(spath.stem) #module.main(args[0],args[2]) if __name__ == "__main__": asyncio.run(main(sys.argv[1]))