Files
CyberPanel/WebTerminal/CPWebSocket.py

105 lines
2.9 KiB
Python
Raw Normal View History

2019-11-04 23:05:13 +05:00
import signal
import sys
import ssl
from SimpleWebSocketServer import WebSocket, SimpleSSLWebSocketServer
2019-11-02 19:29:02 +05:00
import paramiko
2019-11-04 23:05:13 +05:00
import os
2019-11-02 19:29:02 +05:00
import json
2019-11-04 23:05:13 +05:00
import threading as multi
import time
2019-11-02 19:29:02 +05:00
2019-11-04 23:05:13 +05:00
class SSHServer(multi.Thread):
2019-11-02 19:29:02 +05:00
def loadPublicKey(self):
pubkey = '/root/.ssh/cyberpanel.pub'
data = open(pubkey, 'r').read()
authFile = '/root/.ssh/authorized_keys'
checker = 1
2019-11-03 19:31:21 +05:00
try:
authData = open(authFile, 'r').read()
if authData.find(data) > -1:
checker = 0
except:
pass
2019-11-02 19:29:02 +05:00
if checker:
writeToFile = open(authFile, 'a')
writeToFile.writelines(data)
writeToFile.close()
2019-11-04 23:05:13 +05:00
def __init__(self, websocket):
multi.Thread.__init__(self)
2019-11-02 19:29:02 +05:00
self.sshclient = paramiko.SSHClient()
self.sshclient.load_system_host_keys()
self.sshclient.set_missing_host_key_policy(paramiko.AutoAddPolicy())
k = paramiko.RSAKey.from_private_key_file('/root/.ssh/cyberpanel')
## Load Public Key
self.loadPublicKey()
self.sshclient.connect('127.0.0.1', 22, username='root', pkey=k)
self.shell = self.sshclient.invoke_shell(term='xterm')
self.shell.settimeout(0)
2019-11-04 23:05:13 +05:00
self.websocket = websocket
2019-11-02 19:29:02 +05:00
2019-11-04 23:05:13 +05:00
def recvData(self):
while True:
2019-11-02 19:29:02 +05:00
try:
2019-11-04 23:05:13 +05:00
if os.path.exists(self.websocket.verifyPath):
2019-11-02 19:29:02 +05:00
if self.shell.recv_ready():
2019-11-04 23:05:13 +05:00
self.websocket.sendMessage(self.shell.recv(9000).decode("utf-8"))
2019-11-02 19:29:02 +05:00
else:
2019-11-04 23:05:13 +05:00
time.sleep(0.1)
except BaseException, msg:
time.sleep(2)
2019-11-02 19:29:02 +05:00
2019-11-04 23:05:13 +05:00
def run(self):
2019-11-02 19:29:02 +05:00
try:
2019-11-04 23:05:13 +05:00
self.recvData()
except BaseException, msg:
print(str(msg))
2019-11-02 19:29:02 +05:00
2019-11-04 23:05:13 +05:00
class WebTerminalServer(WebSocket):
2019-11-02 19:29:02 +05:00
2019-11-04 23:05:13 +05:00
def handleMessage(self):
try:
data = json.loads(self.data)
if str(self.data).find('"tp":"init"') > -1:
self.verifyPath = str(data['data']['verifyPath'])
else:
if os.path.exists(self.verifyPath):
self.shell.send(str(data['data']))
except:
pass
2019-11-03 19:31:21 +05:00
2019-11-04 23:05:13 +05:00
def handleConnected(self):
self.sh = SSHServer(self)
self.shell = self.sh.shell
self.sh.start()
2019-11-03 19:31:21 +05:00
2019-11-04 23:05:13 +05:00
def handleClose(self):
try:
os.remove(self.verifyPath)
except:
pass
2019-11-02 19:29:02 +05:00
2019-11-04 23:05:13 +05:00
if __name__ == "__main__":
pidfile = '/usr/local/CyberCP/WebTerminal/pid'
2019-11-02 19:29:02 +05:00
2019-11-04 23:05:13 +05:00
writeToFile = open(pidfile, 'w')
writeToFile.write(str(os.getpid()))
writeToFile.close()
2019-11-02 19:29:02 +05:00
2019-11-04 23:05:13 +05:00
server = SimpleSSLWebSocketServer('0.0.0.0', '5678', WebTerminalServer, '/usr/local/lscp/conf/cert.pem', '/usr/local/lscp/conf/key.pem', version=ssl.PROTOCOL_TLSv1)
def close_sig_handler(signal, frame):
server.close()
sys.exit()
signal.signal(signal.SIGINT, close_sig_handler)
server.serveforever()