|
|
|
@ -10,6 +10,7 @@ import uuid |
|
|
|
|
reload(sys) |
|
|
|
|
sys.setdefaultencoding('utf8') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from datetime import timedelta |
|
|
|
|
|
|
|
|
|
from flask import Flask |
|
|
|
@ -23,18 +24,25 @@ from flask import url_for |
|
|
|
|
|
|
|
|
|
from flask_session import Session |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sys.path.append(os.getcwd() + "/class/core") |
|
|
|
|
import db |
|
|
|
|
import public |
|
|
|
|
import config_api |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app = Flask(__name__, template_folder='templates/default') |
|
|
|
|
app.config.version = config_api.config_api().getVersion() |
|
|
|
|
# app.config['SECRET_KEY'] = os.urandom(24) |
|
|
|
|
# app.secret_key = uuid.UUID(int=uuid.getnode()).hex[-12:] |
|
|
|
|
app.config['SECRET_KEY'] = uuid.UUID(int=uuid.getnode()).hex[-12:] |
|
|
|
|
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7) |
|
|
|
|
|
|
|
|
|
# socketio |
|
|
|
|
sys.path.append("/usr/local/lib/python2.7/site-packages") |
|
|
|
|
from flask_socketio import SocketIO, emit, send |
|
|
|
|
socketio = SocketIO() |
|
|
|
|
socketio.init_app(app) |
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
from flask_sqlalchemy import SQLAlchemy |
|
|
|
|
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/py_mw_session.db' |
|
|
|
@ -195,3 +203,111 @@ def index(reqClass=None, reqAction=None, reqData=None): |
|
|
|
|
eval_str = "__import__('" + className + "')." + className + '()' |
|
|
|
|
newInstance = eval(eval_str) |
|
|
|
|
return publicObject(newInstance, reqAction) |
|
|
|
|
|
|
|
|
|
ssh = None |
|
|
|
|
shell = None |
|
|
|
|
try: |
|
|
|
|
import paramiko |
|
|
|
|
ssh = paramiko.SSHClient() |
|
|
|
|
except: |
|
|
|
|
public.execShell('pip install paramiko==2.0.2 &') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def connect_ssh(): |
|
|
|
|
global shell, ssh |
|
|
|
|
print 'connect_ssh' |
|
|
|
|
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) |
|
|
|
|
try: |
|
|
|
|
ssh.connect('127.0.0.1', public.getSSHPort()) |
|
|
|
|
except Exception as e: |
|
|
|
|
print 'connect_ssh:', str(e) |
|
|
|
|
if public.getSSHStatus(): |
|
|
|
|
try: |
|
|
|
|
ssh.connect('localhost', public.getSSHPort()) |
|
|
|
|
except: |
|
|
|
|
return False |
|
|
|
|
import firewalls |
|
|
|
|
fw = firewalls.firewalls() |
|
|
|
|
get = common.dict_obj() |
|
|
|
|
get.status = '0' |
|
|
|
|
fw.SetSshStatus(get) |
|
|
|
|
ssh.connect('127.0.0.1', public.GetSSHPort()) |
|
|
|
|
get.status = '1' |
|
|
|
|
fw.SetSshStatus(get) |
|
|
|
|
shell = ssh.invoke_shell(term='xterm', width=100, height=29) |
|
|
|
|
shell.setblocking(0) |
|
|
|
|
return True |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 取数据对象 |
|
|
|
|
def get_input_data(data): |
|
|
|
|
pdata = common.dict_obj() |
|
|
|
|
for key in data.keys(): |
|
|
|
|
pdata[key] = str(data[key]) |
|
|
|
|
return pdata |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@socketio.on('webssh') |
|
|
|
|
def webssh(msg): |
|
|
|
|
emit('server_response', {'data': '会话丢失,请重新登陆面板!\r\n'}) |
|
|
|
|
print 'webssh', msg |
|
|
|
|
if not isLogined(): |
|
|
|
|
emit('server_response', {'data': '会话丢失,请重新登陆面板!\r\n'}) |
|
|
|
|
return None |
|
|
|
|
global shell, ssh |
|
|
|
|
ssh_success = True |
|
|
|
|
if not shell: |
|
|
|
|
ssh_success = connect_ssh() |
|
|
|
|
if not shell: |
|
|
|
|
emit('server_response', { |
|
|
|
|
'data': public.getMsg('INIT_WEBSSH_CONN_ERR')}) |
|
|
|
|
return |
|
|
|
|
if shell.exit_status_ready(): |
|
|
|
|
ssh_success = connect_ssh() |
|
|
|
|
if not ssh_success: |
|
|
|
|
emit('server_response', { |
|
|
|
|
'data': public.getMsg('INIT_WEBSSH_CONN_ERR')}) |
|
|
|
|
return |
|
|
|
|
shell.send(msg) |
|
|
|
|
try: |
|
|
|
|
time.sleep(0.005) |
|
|
|
|
recv = shell.recv(4096) |
|
|
|
|
emit('server_response', {'data': recv.decode("utf-8")}) |
|
|
|
|
except Exception as ex: |
|
|
|
|
pass |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@socketio.on('connect_event') |
|
|
|
|
def connected_msg(msg): |
|
|
|
|
connect_ssh() |
|
|
|
|
if not isLogined(): |
|
|
|
|
print 'not login' |
|
|
|
|
emit(pdata.s_response, {'data': public.getMsg('INIT_WEBSSH_LOGOUT')}) |
|
|
|
|
return None |
|
|
|
|
global shell, ssh |
|
|
|
|
print 'connect_event:connected_msg', msg |
|
|
|
|
try: |
|
|
|
|
recv = shell.recv(8192) |
|
|
|
|
print recv |
|
|
|
|
print recv.decode("utf-8") |
|
|
|
|
emit('server_response', {'data': recv.decode("utf-8")}) |
|
|
|
|
except Exception as e: |
|
|
|
|
print 'connect_event:' + str(e) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@socketio.on('panel') |
|
|
|
|
def websocket_test(data): |
|
|
|
|
pdata = get_input_data(data) |
|
|
|
|
if not isLogined(): |
|
|
|
|
emit(pdata.s_response, { |
|
|
|
|
'data': public.returnData(-1, '会话丢失,请重新登陆面板!\r\n')}) |
|
|
|
|
return None |
|
|
|
|
mods = ['site', 'ftp', 'database', 'ajax', 'system', 'crontab', 'files', |
|
|
|
|
'config', 'panel_data', 'plugin', 'ssl', 'auth', 'firewall', 'panel_wxapp'] |
|
|
|
|
if not pdata['s_module'] in mods: |
|
|
|
|
result = public.returnMsg(False, "INIT_WEBSOCKET_ERR") |
|
|
|
|
else: |
|
|
|
|
result = eval("%s(pdata)" % pdata['s_module']) |
|
|
|
|
if not hasattr(pdata, 's_response'): |
|
|
|
|
pdata.s_response = 'response' |
|
|
|
|
emit(pdata.s_response, {'data': result}) |
|
|
|
|