Skip to content

Commit 6007f7f

Browse files
committed
bug fix: update terminal to use tornado
1 parent 55eff1a commit 6007f7f

File tree

3 files changed

+171
-17
lines changed

3 files changed

+171
-17
lines changed

WebTerminal/CPWebSocket.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#!/usr/local/CyberCP/bin/python
22
import sys
33
import os
4-
import django
54
sys.path.append('/usr/local/CyberCP')
65
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings")
76
from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging
@@ -34,7 +33,7 @@ def findSSHPort():
3433
else:
3534
SSHServer.DEFAULT_PORT = int(items.split(' ')[1])
3635
except BaseException as msg:
37-
logging.writeToFile(str(msg))
36+
logging.writeToFile('%s. [SSHServer.findSSHPort]' % (str(msg)))
3837

3938
def loadPublicKey(self):
4039
pubkey = '/root/.ssh/cyberpanel.pub'
@@ -91,20 +90,23 @@ def recvData(self):
9190
else:
9291
return 0
9392
except BaseException as msg:
93+
print(str(msg))
9494
time.sleep(0.1)
9595

9696
def run(self):
9797
try:
9898
self.recvData()
9999
except BaseException as msg:
100-
print((str(msg)))
100+
print('%s. [SSHServer.run]' % (str(msg)))
101101

102102

103103
class WebTerminalServer(WebSocket):
104104

105105
def handleMessage(self):
106106
try:
107+
print('handle message')
107108
data = json.loads(self.data)
109+
print(str(data))
108110
if str(self.data).find('"tp":"init"') > -1:
109111
self.verifyPath = str(data['data']['verifyPath'])
110112
self.password = str(data['data']['password'])
@@ -113,20 +115,26 @@ def handleMessage(self):
113115
if os.path.exists(self.verifyPath):
114116
if self.filePassword == self.password:
115117
self.shell.send(str(data['data']))
116-
except:
117-
pass
118+
except BaseException as msg:
119+
print('%s. [WebTerminalServer.handleMessage]' % (str(msg)))
118120

119121
def handleConnected(self):
122+
print('connected')
120123
self.running = 1
121124
self.sh = SSHServer(self)
122125
self.shell = self.sh.shell
123126
self.sh.start()
127+
print('connect ok')
124128

125129
def handleClose(self):
126130
try:
127-
os.remove(self.verifyPath)
131+
try:
132+
os.remove(self.verifyPath)
133+
except:
134+
pass
128135
self.running = 0
129-
except:
136+
except BaseException as msg:
137+
print('%s. [WebTerminalServer.handleClose]' % (str(msg)))
130138
pass
131139

132140

@@ -147,5 +155,7 @@ def close_sig_handler(signal, frame):
147155
server.close()
148156
sys.exit()
149157

158+
print('server started')
159+
150160
signal.signal(signal.SIGINT, close_sig_handler)
151161
server.serveforever()

WebTerminal/static/WebTerminal/main.js

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -73,16 +73,6 @@ function connect() {
7373
if (remember) {
7474
store(options)
7575
}
76-
// if (check()) {
77-
// openTerminal(options)
78-
// } else {
79-
// for (var key in validResult) {
80-
// if (!validResult[key]) {
81-
// alert(errorMsg[key]);
82-
// break;
83-
// }
84-
// }
85-
// }
8676
openTerminal(options)
8777
}
8878

plogical/test.py

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
import tornado.httpserver
2+
import tornado.websocket
3+
import tornado.ioloop
4+
import tornado.web
5+
import socket#!/usr/local/CyberCP/bin/python
6+
import sys
7+
import os
8+
sys.path.append('/usr/local/CyberCP')
9+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings")
10+
from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging
11+
import paramiko
12+
import os
13+
import json
14+
import threading as multi
15+
import time
16+
import asyncio
17+
'''
18+
This is a simple Websocket Echo server that uses the Tornado websocket handler.
19+
Please run `pip install tornado` with python of version 2.7.9 or greater to install tornado.
20+
This program will echo back the reverse of whatever it recieves.
21+
Messages are output to the terminal for debuggin purposes.
22+
'''
23+
24+
25+
class SSHServer(multi.Thread):
26+
OKGREEN = '\033[92m'
27+
ENDC = '\033[0m'
28+
29+
DEFAULT_PORT = 22
30+
31+
@staticmethod
32+
def findSSHPort():
33+
try:
34+
sshData = open('/etc/ssh/sshd_config', 'r').readlines()
35+
36+
for items in sshData:
37+
if items.find('Port') > -1:
38+
if items[0] == 0:
39+
pass
40+
else:
41+
SSHServer.DEFAULT_PORT = int(items.split(' ')[1])
42+
except BaseException as msg:
43+
logging.writeToFile('%s. [SSHServer.findSSHPort]' % (str(msg)))
44+
45+
def loadPublicKey(self):
46+
pubkey = '/root/.ssh/cyberpanel.pub'
47+
data = open(pubkey, 'r').read()
48+
authFile = '/root/.ssh/authorized_keys'
49+
50+
checker = 1
51+
52+
try:
53+
authData = open(authFile, 'r').read()
54+
if authData.find(data) > -1:
55+
checker = 0
56+
except:
57+
pass
58+
59+
if checker:
60+
writeToFile = open(authFile, 'a')
61+
writeToFile.writelines(data)
62+
writeToFile.close()
63+
64+
def __init__(self, websocket):
65+
multi.Thread.__init__(self)
66+
self.sshclient = paramiko.SSHClient()
67+
self.sshclient.load_system_host_keys()
68+
self.sshclient.set_missing_host_key_policy(paramiko.AutoAddPolicy())
69+
k = paramiko.RSAKey.from_private_key_file('/root/.ssh/cyberpanel')
70+
71+
## Load Public Key
72+
self.loadPublicKey()
73+
74+
self.sshclient.connect('127.0.0.1', SSHServer.DEFAULT_PORT, username='root', pkey=k)
75+
self.shell = self.sshclient.invoke_shell(term='xterm')
76+
self.shell.settimeout(0)
77+
78+
self.websocket = websocket
79+
self.color = 0
80+
81+
def recvData(self):
82+
asyncio.set_event_loop(asyncio.new_event_loop())
83+
while True:
84+
try:
85+
if self.websocket.running:
86+
if os.path.exists(self.verifyPath) and self.filePassword == self.password:
87+
if self.shell.recv_ready():
88+
self.websocket.write_message(self.shell.recv(9000).decode("utf-8"))
89+
else:
90+
time.sleep(0.001)
91+
else:
92+
return 0
93+
else:
94+
return 0
95+
except BaseException as msg:
96+
print('%s. [recvData]' % str(msg))
97+
time.sleep(0.001)
98+
99+
def run(self):
100+
try:
101+
self.recvData()
102+
except BaseException as msg:
103+
print('%s. [SSHServer.run]' % (str(msg)))
104+
105+
106+
class WSHandler(tornado.websocket.WebSocketHandler):
107+
108+
def open(self):
109+
print('connected')
110+
self.running = 1
111+
self.sh = SSHServer(self)
112+
self.shell = self.sh.shell
113+
self.sh.start()
114+
self.init = 1
115+
print('connect ok')
116+
117+
def on_message(self, message):
118+
try:
119+
print('handle message')
120+
data = json.loads(message)
121+
122+
if self.init:
123+
self.sh.verifyPath = str(data['data']['verifyPath'])
124+
self.sh.password = str(data['data']['password'])
125+
self.sh.filePassword = open(self.sh.verifyPath, 'r').read()
126+
self.init = 0
127+
else:
128+
if os.path.exists(self.sh.verifyPath):
129+
if self.sh.filePassword == self.sh.password:
130+
self.shell.send(str(data['data']))
131+
132+
except BaseException as msg:
133+
print('%s. [WebTerminalServer.handleMessage]' % (str(msg)))
134+
135+
def on_close(self):
136+
print('connection closed')
137+
138+
def check_origin(self, origin):
139+
return True
140+
141+
142+
application = tornado.web.Application([
143+
(r'/', WSHandler),
144+
])
145+
146+
if __name__ == "__main__":
147+
http_server = tornado.httpserver.HTTPServer(application, ssl_options={
148+
"certfile": "/usr/local/lscp/conf/cert.pem",
149+
"keyfile": "/usr/local/lscp/conf/key.pem",
150+
}, )
151+
ADDR = '0.0.0.0'
152+
http_server.listen(5678, ADDR)
153+
print('*** Websocket Server Started at %s***' % ADDR)
154+
tornado.ioloop.IOLoop.instance().start()

0 commit comments

Comments
 (0)