ahserver/ahserver/websocketProcessor.py
2023-12-18 19:09:47 +08:00

125 lines
3.4 KiB
Python
Executable File

import asyncio
import aiohttp
import aiofiles
import json
import codecs
from aiohttp import web
import aiohttp_cors
from appPublic.sshx import SSHNode
from .baseProcessor import BaseProcessor, PythonScriptProcessor
class XtermProcessor(BaseProcessor):
@classmethod
def isMe(self,name):
return name=='xterm'
async def ws_2_process(self, ws):
async for msg in ws:
if msg.type == aiohttp.WSMsgType.TEXT:
self.p_obj.stdin.write(msg.data)
elif msg.type == aiohttp.WSMsgType.ERROR:
# print('ws connection closed with exception %s' % ws.exception())
return
async def process_2_ws(self, ws):
while self.running:
x = await self.p_obj.stdout.read(1024)
await self.ws_sendstr(ws, x)
async def datahandle(self,request):
await self.path_call(request)
async def path_call(self, request, params={}):
await self.set_run_env(request)
lenv = self.run_ns.copy()
lenv.update(params)
del lenv['request']
ws = web.WebSocketResponse()
await ws.prepare(request)
await self.create_process()
self.ws_sendstr(ws, 'Welcom to sshclient')
r1 = self.ws_2_process(ws)
r2 = self.process_2_ws(ws)
await asyncio.gather(r1,r2)
self.retResponse = ws
return ws
async def get_login_info(self):
async with aiofiles.open(self.real_path, 'r', encoding='utf-8') as f:
txt = await f.read()
self.login_info = json.loads(txt)
# print(f'{self.login_info=}')
async def create_process(self):
# id = lenv['params_kw'].get('termid')
await self.get_login_info()
host = self.login_info['host']
port = self.login_info.get('port', 22)
username = self.login_info.get('username', 'root')
password = self.login_info.get('password',None)
self.sshnode = SSHNode(host, username=username,
password=password,
port=port)
await self.sshnode.connect()
self.p_obj = await self.sshnode._process('bash',
term_type='vt100',
term_size=(80, 24),
encoding='utf-8')
self.running = True
async def ws_sendstr(self, ws:web.WebSocketResponse, s:str):
data = {
"type":1,
"data":s
}
await ws.send_str(json.dumps(data))
def close_process(self):
self.sshnode.close()
self.p_obj.close()
class WebsocketProcessor(PythonScriptProcessor):
@classmethod
def isMe(self,name):
return name=='ws'
async def ws_sendstr(self, ws:web.WebSocketResponse, s:str):
data = {
"type":1,
"data":s
}
await ws.send_str(json.dumps(data))
async def path_call(self, request,params={}):
# print('1----------------------------------')
await self.set_run_env(request)
lenv = self.run_ns.copy()
lenv.update(params)
del lenv['request']
# print('2----------------------------------')
txt = self.loadScript(self.real_path)
exec(txt,lenv,lenv)
func = lenv['myfunc']
# print('3----------------------------------')
ws = web.WebSocketResponse()
await ws.prepare(request)
# print('4----------------------------------', aiohttp.WSMsgType.TEXT)
await self.ws_sendstr(ws, 'Welcome to websock')
async for msg in ws:
if msg.type == aiohttp.WSMsgType.TEXT:
# print('msg=:', msg)
lenv['ws_data'] = msg.data
# resp = await func(request,**lenv)
await self.ws_sendstr(ws, msg.data)
# print('msg.data=', msg.data)
elif msg.type == aiohttp.WSMsgType.ERROR:
# print('ws connection closed with exception %s' % ws.exception())
pass
else:
print('datatype error', msg.type)
# print('5----------------------------------')
self.retResponse = ws
await ws.close()
return ws