|
|
|
# coding:utf-8
|
|
|
|
|
|
|
|
import sys
|
|
|
|
import io
|
|
|
|
import os
|
|
|
|
import time
|
|
|
|
import re
|
|
|
|
import hashlib
|
|
|
|
import json
|
|
|
|
|
|
|
|
sys.path.append(os.getcwd() + "/class/core")
|
|
|
|
import mw
|
|
|
|
|
|
|
|
app_debug = False
|
|
|
|
if mw.isAppleSystem():
|
|
|
|
app_debug = True
|
|
|
|
|
|
|
|
|
|
|
|
class classApi:
|
|
|
|
__MW_KEY = 'app'
|
|
|
|
__MW_PANEL = 'http://127.0.0.1:7200'
|
|
|
|
|
|
|
|
_REQUESTS = None
|
|
|
|
|
|
|
|
# 如果希望多台面板,可以在实例化对象时,将面板地址与密钥传入
|
|
|
|
def __init__(self, mw_panel=None, mw_key=None):
|
|
|
|
if mw_panel:
|
|
|
|
self.__MW_PANEL = mw_panel
|
|
|
|
self.__MW_KEY = mw_key
|
|
|
|
|
|
|
|
import requests
|
|
|
|
if not self._REQUESTS:
|
|
|
|
self._REQUESTS = requests.session()
|
|
|
|
|
|
|
|
# 计算MD5
|
|
|
|
def __get_md5(self, s):
|
|
|
|
m = hashlib.md5()
|
|
|
|
m.update(s.encode('utf-8'))
|
|
|
|
return m.hexdigest()
|
|
|
|
|
|
|
|
# 构造带有签名的关联数组
|
|
|
|
def __get_key_data(self):
|
|
|
|
now_time = int(time.time())
|
|
|
|
ready_data = {
|
|
|
|
'request_token': self.__get_md5(str(now_time) + '' + self.__get_md5(self.__MW_KEY)),
|
|
|
|
'request_time': now_time
|
|
|
|
}
|
|
|
|
return ready_data
|
|
|
|
|
|
|
|
def __http_post_cookie(self, url, p_data, timeout=1800):
|
|
|
|
try:
|
|
|
|
# print(url)
|
|
|
|
res = self._REQUESTS.post(url, p_data, timeout=timeout)
|
|
|
|
return res.text
|
|
|
|
except Exception as ex:
|
|
|
|
ex = str(ex)
|
|
|
|
if ex.find('Max retries exceeded with') != -1:
|
|
|
|
return mw.returnJson(False, '连接服务器失败!')
|
|
|
|
if ex.find('Read timed out') != -1 or ex.find('Connection aborted') != -1:
|
|
|
|
return mw.returnJson(False, '连接超时!')
|
|
|
|
return mw.returnJson(False, '连接服务器失败!')
|
|
|
|
|
|
|
|
def send(self, url, args, timeout=600):
|
|
|
|
url = self.__MW_PANEL + '/api' + url
|
|
|
|
post_data = self.__get_key_data() # 取签名
|
|
|
|
post_data.update(args)
|
|
|
|
result = self.__http_post_cookie(url, post_data, timeout)
|
|
|
|
try:
|
|
|
|
return json.loads(result)
|
|
|
|
except Exception as e:
|
|
|
|
return result
|
|
|
|
|
|
|
|
# 取面板日志
|
|
|
|
def getLogs(self):
|
|
|
|
# 拼接URL地址
|
|
|
|
url = self.__MW_PANEL + '/firewall/get_log_list'
|
|
|
|
|
|
|
|
# 准备POST数据
|
|
|
|
post_data = self.__get_key_data() # 取签名
|
|
|
|
post_data['limit'] = 10
|
|
|
|
post_data['p'] = '1'
|
|
|
|
|
|
|
|
# 请求面板接口
|
|
|
|
result = self.__http_post_cookie(url, post_data)
|
|
|
|
|
|
|
|
# 解析JSON数据
|
|
|
|
return json.loads(result)
|
|
|
|
|
|
|
|
|
|
|
|
def getPluginName():
|
|
|
|
return 'migration_api'
|
|
|
|
|
|
|
|
|
|
|
|
def getPluginDir():
|
|
|
|
return mw.getPluginDir() + '/' + getPluginName()
|
|
|
|
|
|
|
|
|
|
|
|
def getServerDir():
|
|
|
|
return mw.getServerDir() + '/' + getPluginName()
|
|
|
|
|
|
|
|
|
|
|
|
def getInitDFile():
|
|
|
|
if app_debug:
|
|
|
|
return '/tmp/' + getPluginName()
|
|
|
|
return '/etc/init.d/' + getPluginName()
|
|
|
|
|
|
|
|
|
|
|
|
def getConf():
|
|
|
|
path = getServerDir() + "/ma.cfg"
|
|
|
|
return path
|
|
|
|
|
|
|
|
|
|
|
|
def getCfgData():
|
|
|
|
path = getConf()
|
|
|
|
if not os.path.exists(path):
|
|
|
|
mw.writeFile(path, '{}')
|
|
|
|
|
|
|
|
t = mw.readFile(path)
|
|
|
|
return json.loads(t)
|
|
|
|
|
|
|
|
|
|
|
|
def writeConf(data):
|
|
|
|
path = getConf()
|
|
|
|
mw.writeFile(path, json.dumps(data))
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
def getArgs():
|
|
|
|
args = sys.argv[2:]
|
|
|
|
tmp = {}
|
|
|
|
args_len = len(args)
|
|
|
|
if args_len == 1:
|
|
|
|
t = args[0].strip('{').strip('}')
|
|
|
|
if t.strip() == '':
|
|
|
|
tmp = []
|
|
|
|
else:
|
|
|
|
t = t.split(':', 1)
|
|
|
|
tmp[t[0]] = t[1]
|
|
|
|
tmp[t[0]] = t[1]
|
|
|
|
elif args_len > 1:
|
|
|
|
for i in range(len(args)):
|
|
|
|
t = args[i].split(':', 1)
|
|
|
|
tmp[t[0]] = t[1]
|
|
|
|
return tmp
|
|
|
|
|
|
|
|
|
|
|
|
def checkArgs(data, ck=[]):
|
|
|
|
for i in range(len(ck)):
|
|
|
|
if not ck[i] in data:
|
|
|
|
return (False, mw.returnJson(False, '参数:(' + ck[i] + ')没有!'))
|
|
|
|
return (True, mw.returnJson(True, 'ok'))
|
|
|
|
|
|
|
|
|
|
|
|
def status():
|
|
|
|
return 'start'
|
|
|
|
|
|
|
|
|
|
|
|
def initDreplace():
|
|
|
|
return 'ok'
|
|
|
|
|
|
|
|
|
|
|
|
def getStepOneData():
|
|
|
|
data = getCfgData()
|
|
|
|
return mw.returnJson(True, 'ok', data)
|
|
|
|
|
|
|
|
|
|
|
|
def stepOne():
|
|
|
|
args = getArgs()
|
|
|
|
data = checkArgs(args, ['url', 'token'])
|
|
|
|
if not data[0]:
|
|
|
|
return data[1]
|
|
|
|
|
|
|
|
url = args['url']
|
|
|
|
token = args['token']
|
|
|
|
|
|
|
|
api = classApi(url, token)
|
|
|
|
# api = classApi('http://127.0.0.1:7200','HfJNKGP5RPqGvhIOyrwpXG4A2fTjSh9B')
|
|
|
|
rdata = api.send('/task/count', {})
|
|
|
|
if type(rdata) != int:
|
|
|
|
return mw.returnJson(False, rdata['msg'])
|
|
|
|
data = getCfgData()
|
|
|
|
|
|
|
|
data['url'] = url
|
|
|
|
data['token'] = token
|
|
|
|
writeConf(data)
|
|
|
|
|
|
|
|
return mw.returnJson(True, '验证成功')
|
|
|
|
|
|
|
|
|
|
|
|
# 获取本地服务器和环境配置
|
|
|
|
def get_src_config(args):
|
|
|
|
serverInfo = {}
|
|
|
|
serverInfo['status'] = True
|
|
|
|
sdir = mw.getServerDir()
|
|
|
|
|
|
|
|
serverInfo['webserver'] = '未安装'
|
|
|
|
if os.path.exists(sdir + '/openresty/nginx/sbin/nginx'):
|
|
|
|
serverInfo['webserver'] = 'OpenResty'
|
|
|
|
serverInfo['php'] = []
|
|
|
|
phpversions = ['52', '53', '54', '55', '56', '70', '71',
|
|
|
|
'72', '73', '74', '80', '81', '82', '83', '84']
|
|
|
|
phpPath = sdir + '/php/'
|
|
|
|
for pv in phpversions:
|
|
|
|
if not os.path.exists(phpPath + pv + '/bin/php'):
|
|
|
|
continue
|
|
|
|
serverInfo['php'].append(pv)
|
|
|
|
serverInfo['mysql'] = False
|
|
|
|
if os.path.exists(sdir + '/mysql/bin/mysql'):
|
|
|
|
serverInfo['mysql'] = True
|
|
|
|
import psutil
|
|
|
|
try:
|
|
|
|
diskInfo = psutil.disk_usage('/www')
|
|
|
|
except:
|
|
|
|
diskInfo = psutil.disk_usage('/')
|
|
|
|
|
|
|
|
serverInfo['disk'] = mw.toSize(diskInfo[2])
|
|
|
|
return serverInfo
|
|
|
|
|
|
|
|
|
|
|
|
def get_dst_config(args):
|
|
|
|
|
|
|
|
data = getCfgData()
|
|
|
|
api = classApi(data['url'], data['token'])
|
|
|
|
disk = api.send('/system/disk_info', {})
|
|
|
|
info = api.send('/system/get_env_info', {})
|
|
|
|
|
|
|
|
result = info['data']
|
|
|
|
|
|
|
|
result['disk'] = disk
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
def stepTwo():
|
|
|
|
data = {}
|
|
|
|
data['local'] = get_src_config(None)
|
|
|
|
data['remote'] = get_dst_config(None)
|
|
|
|
return mw.returnJson(True, 'ok', data)
|
|
|
|
|
|
|
|
|
|
|
|
def get_src_info(args):
|
|
|
|
# 获取本地服务器网站、数据库.
|
|
|
|
data = {}
|
|
|
|
data['sites'] = mw.M('sites').field(
|
|
|
|
"id,name,path,ps,status,addtime").order("id desc").select()
|
|
|
|
data['databases'] = mw.M('databases').field(
|
|
|
|
'id,name,ps').order("id desc").select()
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
|
|
def stepThree():
|
|
|
|
data = get_src_info(None)
|
|
|
|
return mw.returnJson(True, 'ok', data)
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
func = sys.argv[1]
|
|
|
|
if func == 'status':
|
|
|
|
print(status())
|
|
|
|
elif func == 'start':
|
|
|
|
print(start())
|
|
|
|
elif func == 'stop':
|
|
|
|
print(stop())
|
|
|
|
elif func == 'get_conf':
|
|
|
|
print(getStepOneData())
|
|
|
|
elif func == 'step_one':
|
|
|
|
print(stepOne())
|
|
|
|
elif func == 'step_two':
|
|
|
|
print(stepTwo())
|
|
|
|
elif func == 'step_three':
|
|
|
|
print(stepThree())
|
|
|
|
else:
|
|
|
|
print('error')
|