ForkedHulk2 / core /msg_server.py
tuandunghcmut's picture
Upload folder using huggingface_hub
345ee20 verified
raw
history blame
4.32 kB
import argparse
import socket
import itchat
import errno
import time
import threading
import os
import subprocess
parser = argparse.ArgumentParser(description="simple server!")
parser.add_argument('--mode', type=str)
parser.add_argument('--ip', type=str)
parser.add_argument('--port', type=int)
parser.add_argument('--timeout', type=int)
class MsgServer(object):
def __init__(self, server_ip, server_port):
self.init_chat()
self.send('server chat logged in!')
self.start_server(server_ip, server_port)
def init_chat(self):
itchat.auto_login(enableCmdQR=2)
def send(self, msg, echo=True):
if echo:
print(msg)
itchat.send(msg, toUserName='filehelper')
def worker_thread(self, conn, addr):
conn.settimeout(args.timeout)
if conn is not None:
self.send('job connected! [{}]'.format(addr))
else:
self.send('none connection!')
return -1
while(True):
try:
recv_data = conn.recv(1024)
except socket.timeout as e:
print('no msg...')
else:
msg_len = len(recv_data)
if msg_len == 0:
self.send('connection break, waiting for other connections..')
break
self.send(str(recv_data, encoding = 'utf-8'))
conn.close()
def start_server(self, server_ip, server_port):
ip_port = (server_ip, server_port)
s = socket.socket()
s.bind(ip_port)
# dump ip/port info to file
with open('server.txt', 'w') as f:
f.write('{} {}\n'.format(server_ip, server_port))
s.listen()
self.send('server listening on {}, waiting for job connection...'.format(server_ip))
while(True):
conn, addr = s.accept()
threading.Thread(target=self.worker_thread, args=(conn, addr)).start()
class MsgClient(object):
def __init__(self, server_ip, server_port):
self._init_client(server_ip, server_port)
self.send('I\'m client!\n')
def send(self, msg, echo=True):
self.s.send(bytes(msg, encoding = 'utf-8'))
if echo:
print(msg)
def _init_client(self, server_ip, server_port):
ip_port = (server_ip, server_port)
self.s = socket.socket()
self.s.connect(ip_port)
def close(self):
self.s.close()
def itchat_manager():
def run_and_get(cmd, screen=False):
process = subprocess.Popen(
cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
output = ''
for line in process.stdout:
line = line.decode('utf-8')
if screen:
print(line, end='', flush=True)
output += line.strip(' ')
return output
@itchat.msg_register(itchat.content.TEXT)
def text_reply(msg):
res_txt = None
cmd_dict = {
'sq' : 'squeue -p VI_Face_V100',
'sq1': 'squeue -p VI_Face_1080TI'
}
if msg.text in cmd_dict:
cmd = cmd_dict[msg.text]
res_txt = run_and_get(cmd)
elif msg.text.startswith('exec:'):
cmd = msg.text.replace('exec:', '')
if os.system(cmd) == 0:
res_txt = 'exec successed!'
else:
res_txt = 'exec failed!'
elif msg.text.startswith('getinfo:'):
cmd = msg.text.replace('getinfo:', '')
res_txt = run_and_get(cmd)
if res_txt is not None:
itchat.send(res_txt, toUserName='filehelper')
itchat.auto_login(enableCmdQR=2, hotReload=True)
itchat.run(True)
if __name__ == '__main__':
args = parser.parse_args()
if args.mode == 'server':
if args.ip is None or args.port is None:
with open('server.txt', 'r') as f:
line = f.read().strip().split()
args.ip = line[0]
args.port = int(line[1])
print('reading ip & port from server.txt, {}:{}'.format(args.ip, args.port))
s = MsgServer(args.ip, args.port)
elif args.mode == 'manager':
itchat_manager()
else:
s = MsgClient(args.ip, args.port)
time.sleep(5)
s.close()