Simple Linux Panel
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mdserver-web/class/core/mw.py

1312 lines
33 KiB

3 years ago
# coding:utf-8
# ---------------------------------------------------------------------------------
# MW-Linux面板
# ---------------------------------------------------------------------------------
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
# ---------------------------------------------------------------------------------
# Author: midoks <midoks@163.com>
# ---------------------------------------------------------------------------------
# ---------------------------------------------------------------------------------
# 核心方法库
# ---------------------------------------------------------------------------------
7 years ago
import os
import sys
import time
import string
import json
import hashlib
import shlex
import datetime
import subprocess
import re
import db
from random import Random
7 years ago
def execShell(cmdstring, cwd=None, timeout=None, shell=True):
if shell:
cmdstring_list = cmdstring
else:
cmdstring_list = shlex.split(cmdstring)
if timeout:
end_time = datetime.datetime.now() + datetime.timedelta(seconds=timeout)
sub = subprocess.Popen(cmdstring_list, cwd=cwd, stdin=subprocess.PIPE,
shell=shell, bufsize=4096, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while sub.poll() is None:
time.sleep(0.1)
if timeout:
if end_time <= datetime.datetime.now():
raise Exception("Timeout:%s" % cmdstring)
4 years ago
if sys.version_info[0] == 2:
return sub.communicate()
4 years ago
data = sub.communicate()
# python3 fix 返回byte数据
if isinstance(data[0], bytes):
t1 = str(data[0], encoding='utf-8')
if isinstance(data[1], bytes):
t2 = str(data[1], encoding='utf-8')
return (t1, t2)
7 years ago
3 years ago
def getTracebackInfo():
import traceback
errorMsg = traceback.format_exc()
return errorMsg
7 years ago
def getRunDir():
return os.getcwd()
7 years ago
def getRootDir():
return os.path.dirname(os.path.dirname(getRunDir()))
7 years ago
7 years ago
def getPluginDir():
return getRunDir() + '/plugins'
def getPanelDataDir():
return getRunDir() + '/data'
7 years ago
def getServerDir():
return getRootDir() + '/server'
def getLogsDir():
return getRootDir() + '/wwwlogs'
6 years ago
def getWwwDir():
6 years ago
file = getRunDir() + '/data/site.pl'
if os.path.exists(file):
return readFile(file).strip()
6 years ago
return getRootDir() + '/wwwroot'
6 years ago
def setWwwDir(wdir):
file = getRunDir() + '/data/site.pl'
return writeFile(file, wdir)
3 years ago
def getBackupDir():
file = getRunDir() + '/data/backup.pl'
if os.path.exists(file):
return readFile(file).strip()
return getRootDir() + '/backup'
6 years ago
def setBackupDir(bdir):
file = getRunDir() + '/data/backup.pl'
6 years ago
return writeFile(file, bdir)
6 years ago
3 years ago
def getAcmeDir():
acme = '/root/.acme.sh'
if isAppleSystem():
cmd = "who | sed -n '2, 1p' |awk '{print $1}'"
user = execShell(cmd)[0].strip()
acme = '/Users/' + user + '/.acme.sh'
if not os.path.exists(acme):
acme = '/.acme.sh'
return acme
3 years ago
def triggerTask():
3 years ago
isTask = getRunDir() + '/tmp/panelTask.pl'
writeFile(isTask, 'True')
3 years ago
3 years ago
def systemdCfgDir():
3 years ago
# ubuntu
3 years ago
cfg_dir = '/lib/systemd/system'
3 years ago
if os.path.exists(cfg_dir):
return cfg_dir
3 years ago
# debian,centos
3 years ago
cfg_dir = '/usr/lib/systemd/system'
if os.path.exists(cfg_dir):
return cfg_dir
# local test
return "/tmp"
3 years ago
3 years ago
def getSslCrt():
if os.path.exists('/etc/ssl/certs/ca-certificates.crt'):
return '/etc/ssl/certs/ca-certificates.crt'
if os.path.exists('/etc/pki/tls/certs/ca-bundle.crt'):
return '/etc/pki/tls/certs/ca-bundle.crt'
return ''
7 years ago
def getOs():
6 years ago
return sys.platform
7 years ago
3 years ago
def getOsName():
cmd = "cat /etc/*-release | grep PRETTY_NAME |awk -F = '{print $2}' | awk -F '\"' '{print $2}'| awk '{print $1}'"
3 years ago
data = execShell(cmd)
3 years ago
return data[0].strip().lower()
3 years ago
def getOsID():
cmd = "cat /etc/*-release | grep VERSION_ID | awk -F = '{print $2}' | awk -F '\"' '{print $2}'"
3 years ago
data = execShell(cmd)
return data[0].strip()
3 years ago
3 years ago
def getFileSuffix(file):
tmp = file.split('.')
ext = tmp[len(tmp) - 1]
return ext
6 years ago
def isAppleSystem():
if getOs() == 'darwin':
return True
return False
def isDebugMode():
if isAppleSystem():
return True
debugPath = getRunDir() + "/data/debug.pl"
if os.path.exists(debugPath):
return True
return False
3 years ago
def isNumber(s):
try:
float(s)
return True
except ValueError:
pass
try:
import unicodedata
unicodedata.numeric(s)
return True
except (TypeError, ValueError):
pass
return False
6 years ago
def deleteFile(file):
if os.path.exists(file):
os.remove(file)
6 years ago
def isInstalledWeb():
path = getServerDir() + '/openresty/nginx/sbin/nginx'
if os.path.exists(path):
return True
return False
6 years ago
def restartWeb():
3 years ago
return opWeb("reload")
def opWeb(method):
if not isInstalledWeb():
return False
# systemd
systemd = '/lib/systemd/system/openresty.service'
if os.path.exists(systemd):
3 years ago
execShell('systemctl ' + method + ' openresty')
return True
# initd
initd = getServerDir() + '/openresty/init.d/openresty'
3 years ago
if os.path.exists(initd):
3 years ago
execShell(initd + ' ' + method)
return True
return False
6 years ago
6 years ago
def restartMw():
import system_api
system_api.system_api().restartMw()
6 years ago
def checkWebConfig():
3 years ago
op_dir = getServerDir() + '/openresty/nginx'
6 years ago
cmd = "ulimit -n 10240 && " + op_dir + \
3 years ago
"/sbin/nginx -t -c " + op_dir + "/conf/nginx.conf"
6 years ago
result = execShell(cmd)
searchStr = 'test is successful'
6 years ago
if result[1].find(searchStr) == -1:
6 years ago
msg = getInfo('配置文件错误: {1}', (result[1],))
writeLog("软件管理", msg)
6 years ago
return result[1]
return True
7 years ago
def M(table):
sql = db.Sql()
return sql.table(table)
7 years ago
def getPage(args, result='1,2,3,4,5,8'):
7 years ago
data = getPageObject(args, result)
return data[0]
def getPageObject(args, result='1,2,3,4,5,8'):
7 years ago
# 取分页
import page
# 实例化分页类
page = page.Page()
info = {}
7 years ago
info['count'] = 0
4 years ago
if 'count' in args:
7 years ago
info['count'] = int(args['count'])
7 years ago
info['row'] = 10
4 years ago
if 'row' in args:
7 years ago
info['row'] = int(args['row'])
7 years ago
info['p'] = 1
4 years ago
if 'p' in args:
7 years ago
info['p'] = int(args['p'])
7 years ago
info['uri'] = {}
info['return_js'] = ''
4 years ago
if 'tojs' in args:
7 years ago
info['return_js'] = args['tojs']
7 years ago
7 years ago
return (page.GetPage(info, result), page)
7 years ago
3 years ago
def md5(content):
7 years ago
# 生成MD5
try:
m = hashlib.md5()
3 years ago
m.update(content.encode("utf-8"))
7 years ago
return m.hexdigest()
4 years ago
except Exception as ex:
7 years ago
return False
7 years ago
def getFileMd5(filename):
7 years ago
# 文件的MD5值
if not os.path.isfile(filename):
return False
myhash = hashlib.md5()
f = file(filename, 'rb')
while True:
b = f.read(8096)
if not b:
break
myhash.update(b)
f.close()
return myhash.hexdigest()
7 years ago
def getRandomString(length):
7 years ago
# 取随机字符串
str = ''
chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
chrlen = len(chars) - 1
random = Random()
for i in range(length):
str += chars[random.randint(0, chrlen)]
return str
3 years ago
def getUniqueId():
"""
根据时间生成唯一ID
:return:
"""
current_time = datetime.datetime.now()
str_time = current_time.strftime('%Y%m%d%H%M%S%f')[:-3]
unique_id = "{0}".format(str_time)
return unique_id
7 years ago
def getJson(data):
import json
return json.dumps(data)
6 years ago
def returnData(status, msg, data=None):
6 years ago
return {'status': status, 'msg': msg, 'data': data}
6 years ago
6 years ago
def returnJson(status, msg, data=None):
6 years ago
# if data == None:
# return {'status': status, 'msg': msg}
# return {'status': status, 'msg': msg, 'data': data}
6 years ago
if data == None:
6 years ago
return getJson({'status': status, 'msg': msg})
return getJson({'status': status, 'msg': msg, 'data': data})
7 years ago
3 years ago
def getLanguage():
path = 'data/language.pl'
if not os.path.exists(path):
return 'Simplified_Chinese'
return readFile(path).strip()
def getStaticJson(name="public"):
file = 'static/language/' + getLanguage() + '/' + name + '.json'
if not os.path.exists(file):
file = 'route/static/language/' + getLanguage() + '/' + name + '.json'
return file
7 years ago
def returnMsg(status, msg, args=()):
# 取通用字曲返回
3 years ago
pjson = getStaticJson('public')
6 years ago
logMessage = json.loads(readFile(pjson))
7 years ago
keys = logMessage.keys()
7 years ago
7 years ago
if msg in keys:
msg = logMessage[msg]
for i in range(len(args)):
rep = '{' + str(i + 1) + '}'
msg = msg.replace(rep, args[i])
7 years ago
return {'status': status, 'msg': msg, 'data': args}
7 years ago
7 years ago
def getInfo(msg, args=()):
# 取提示消息
for i in range(len(args)):
rep = '{' + str(i + 1) + '}'
msg = msg.replace(rep, args[i])
return msg
7 years ago
def getMsg(key, args=()):
# 取提示消息
try:
3 years ago
pjson = getStaticJson('public')
logMessage = json.loads(pjson)
7 years ago
keys = logMessage.keys()
msg = None
if key in keys:
msg = logMessage[key]
for i in range(len(args)):
rep = '{' + str(i + 1) + '}'
msg = msg.replace(rep, args[i])
return msg
except:
return key
def getLan(key):
# 取提示消息
3 years ago
pjson = getStaticJson('public')
logMessage = json.loads(pjson)
7 years ago
keys = logMessage.keys()
msg = None
if key in keys:
msg = logMessage[key]
return msg
def readFile(filename):
# 读文件内容
try:
fp = open(filename, 'r')
fBody = fp.read()
fp.close()
return fBody
4 years ago
except Exception as e:
3 years ago
# print(e)
7 years ago
return False
def getDate():
# 取格式时间
import time
return time.strftime('%Y-%m-%d %X', time.localtime())
3 years ago
def writeLog(stype, msg, args=()):
7 years ago
# 写日志
try:
import time
import db
import json
from flask import session
uid = 1
if 'uid' in session:
uid = session['uid']
7 years ago
sql = db.Sql()
3 years ago
mdate = time.strftime('%Y-%m-%d %X', time.localtime())
wmsg = getInfo(msg, args)
data = (stype, wmsg, uid, mdate)
result = sql.table('logs').add('type,log,uid,addtime', data)
return True
6 years ago
except Exception as e:
3 years ago
return False
7 years ago
3 years ago
def writeFile(filename, content, mode='w+'):
7 years ago
# 写文件内容
try:
3 years ago
fp = open(filename, mode)
3 years ago
fp.write(content)
7 years ago
fp.close()
return True
3 years ago
except Exception as e:
7 years ago
return False
def backFile(file, act=None):
3 years ago
"""
@name 备份配置文件
@param file 需要备份的文件
@param act 如果存在则备份一份作为默认配置
"""
file_type = "_bak"
if act:
file_type = "_def"
# print("cp -p {0} {1}".format(file, file + file_type))
execShell("cp -p {0} {1}".format(file, file + file_type))
3 years ago
def restoreFile(file, act=None):
3 years ago
"""
@name 还原配置文件
@param file 需要还原的文件
@param act 如果存在则还原默认配置
"""
file_type = "_bak"
if act:
file_type = "_def"
execShell("cp -p {1} {0}".format(file, file + file_type))
3 years ago
3 years ago
def enPunycode(domain):
if sys.version_info[0] == 2:
domain = domain.encode('utf8')
tmp = domain.split('.')
newdomain = ''
for dkey in tmp:
if dkey == '*':
continue
# 匹配非ascii字符
match = re.search(u"[\x80-\xff]+", dkey)
if not match:
match = re.search(u"[\u4e00-\u9fa5]+", dkey)
if not match:
newdomain += dkey + '.'
else:
if sys.version_info[0] == 2:
newdomain += 'xn--' + \
dkey.decode('utf-8').encode('punycode') + '.'
else:
newdomain += 'xn--' + \
dkey.encode('punycode').decode('utf-8') + '.'
if tmp[0] == '*':
newdomain = "*." + newdomain
return newdomain[0:-1]
def dePunycode(domain):
# punycode 转中文
tmp = domain.split('.')
newdomain = ''
for dkey in tmp:
if dkey.find('xn--') >= 0:
newdomain += dkey.replace('xn--',
'').encode('utf-8').decode('punycode') + '.'
else:
newdomain += dkey + '.'
return newdomain[0:-1]
def enCrypt(key, strings):
# 加密字符串
try:
if type(strings) != bytes:
strings = strings.encode('utf-8')
from cryptography.fernet import Fernet
f = Fernet(key)
result = f.encrypt(strings)
return result.decode('utf-8')
except:
# print(get_error_info())
return strings
def deCrypt(key, strings):
# 解密字符串
try:
if type(strings) != bytes:
strings = strings.decode('utf-8')
from cryptography.fernet import Fernet
f = Fernet(key)
result = f.decrypt(strings).decode('utf-8')
return result
except:
# print(get_error_info())
return strings
3 years ago
def buildSoftLink(src, dst, force=False):
'''
建立软连接
'''
if not os.path.exists(src):
return False
if os.path.exists(dst) and force:
os.remove(dst)
if not os.path.exists(dst):
3 years ago
execShell('ln -sf "' + src + '" "' + dst + '"')
3 years ago
return True
return False
6 years ago
def HttpGet(url, timeout=10):
"""
发送GET请求
@url 被请求的URL地址(必需)
@timeout 超时时间默认60秒
return string
"""
if sys.version_info[0] == 2:
7 years ago
try:
6 years ago
import urllib2
import ssl
if sys.version_info[0] == 2:
reload(urllib2)
reload(ssl)
try:
ssl._create_default_https_context = ssl._create_unverified_context
except:
pass
response = urllib2.urlopen(url, timeout=timeout)
return response.read()
except Exception as ex:
return str(ex)
else:
try:
import urllib.request
import ssl
try:
ssl._create_default_https_context = ssl._create_unverified_context
except:
pass
response = urllib.request.urlopen(url, timeout=timeout)
result = response.read()
if type(result) == bytes:
result = result.decode('utf-8')
return result
except Exception as ex:
return str(ex)
6 years ago
def HttpGet2(url, timeout):
4 years ago
import urllib.request
6 years ago
try:
3 years ago
import ssl
try:
ssl._create_default_https_context = ssl._create_unverified_context
except:
pass
4 years ago
req = urllib.request.urlopen(url, timeout=timeout)
result = req.read().decode('utf-8')
return result
except Exception as e:
return str(e)
6 years ago
6 years ago
def httpGet(url, timeout=10):
6 years ago
return HttpGet2(url, timeout)
6 years ago
def HttpPost(url, data, timeout=10):
"""
发送POST请求
@url 被请求的URL地址(必需)
@data POST参数可以是字符串或字典(必需)
@timeout 超时时间默认60秒
return string
"""
if sys.version_info[0] == 2:
7 years ago
try:
6 years ago
import urllib
import urllib2
import ssl
7 years ago
ssl._create_default_https_context = ssl._create_unverified_context
6 years ago
data = urllib.urlencode(data)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req, timeout=timeout)
return response.read()
except Exception as ex:
return str(ex)
else:
try:
import urllib.request
import ssl
try:
ssl._create_default_https_context = ssl._create_unverified_context
except:
pass
data = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.Request(url, data)
response = urllib.request.urlopen(req, timeout=timeout)
result = response.read()
if type(result) == bytes:
result = result.decode('utf-8')
return result
except Exception as ex:
return str(ex)
def httpPost(url, data, timeout=10):
return HttpPost(url, data, timeout)
7 years ago
def writeSpeed(title, used, total, speed=0):
# 写进度
if not title:
data = {'title': None, 'progress': 0,
'total': 0, 'used': 0, 'speed': 0}
else:
progress = int((100.0 * used / total))
data = {'title': title, 'progress': progress,
'total': total, 'used': used, 'speed': speed}
writeFile('/tmp/panelSpeed.pl', json.dumps(data))
return True
def getSpeed():
# 取进度
path = getRootDir()
6 years ago
data = readFile(path + '/tmp/panelSpeed.pl')
7 years ago
if not data:
data = json.dumps({'title': None, 'progress': 0,
'total': 0, 'used': 0, 'speed': 0})
6 years ago
writeFile(path + '/tmp/panelSpeed.pl', data)
7 years ago
return json.loads(data)
3 years ago
def getLastLineBk(inputfile, lineNum):
7 years ago
# 读文件指定倒数行数
try:
fp = open(inputfile, 'rb')
7 years ago
lastLine = ""
lines = fp.readlines()
count = len(lines)
if count > lineNum:
num = lineNum
else:
num = count
i = 1
lastre = []
for i in range(1, (num + 1)):
n = -i
try:
lastLine = lines[n].decode("utf-8", "ignore").strip()
except Exception as e:
lastLine = ""
lastre.append(lastLine)
7 years ago
fp.close()
7 years ago
result = ''
num -= 1
while num >= 0:
result += lastre[num] + "\n"
num -= 1
return result
3 years ago
except Exception as e:
return str(e)
# return getMsg('TASK_SLEEP')
7 years ago
3 years ago
def getLastLine(path, num, p=1):
6 years ago
pyVersion = sys.version_info[0]
try:
4 years ago
import html
6 years ago
if not os.path.exists(path):
return ""
start_line = (p - 1) * num
count = start_line + num
fp = open(path, 'rb')
buf = ""
3 years ago
fp.seek(0, 2)
6 years ago
if fp.read(1) == "\n":
3 years ago
fp.seek(0, 2)
6 years ago
data = []
b = True
n = 0
3 years ago
6 years ago
for i in range(count):
while True:
newline_pos = str.rfind(str(buf), "\n")
pos = fp.tell()
if newline_pos != -1:
if n >= start_line:
line = buf[newline_pos + 1:]
try:
4 years ago
data.insert(0, html.escape(line))
except Exception as e:
6 years ago
pass
buf = buf[:newline_pos]
n += 1
break
else:
if pos == 0:
b = False
break
to_read = min(4096, pos)
fp.seek(-to_read, 1)
t_buf = fp.read(to_read)
if pyVersion == 3:
if type(t_buf) == bytes:
3 years ago
t_buf = t_buf.decode("utf-8", "ignore").strip()
6 years ago
buf = t_buf + buf
fp.seek(-to_read, 1)
if pos - to_read == 0:
buf = "\n" + buf
if not b:
break
fp.close()
except Exception as e:
3 years ago
return str(e)
6 years ago
return "\n".join(data)
7 years ago
def downloadFile(url, filename):
import urllib
urllib.urlretrieve(url, filename=filename, reporthook=downloadHook)
def downloadHook(count, blockSize, totalSize):
speed = {'total': totalSize, 'block': blockSize, 'count': count}
4 years ago
print('%02d%%' % (100.0 * count * blockSize / totalSize))
7 years ago
3 years ago
def getLocalIpBack():
7 years ago
# 取本地外网IP
try:
import re
filename = 'data/iplist.txt'
ipaddress = readFile(filename)
3 years ago
if not ipaddress or ipaddress == '127.0.0.1':
import urllib
7 years ago
url = 'http://pv.sohu.com/cityjson?ie=utf-8'
3 years ago
req = urllib.request.urlopen(url, timeout=10)
content = req.read().decode('utf-8')
4 years ago
ipaddress = re.search('\d+.\d+.\d+.\d+', content).group(0)
7 years ago
writeFile(filename, ipaddress)
ipaddress = re.search('\d+.\d+.\d+.\d+', ipaddress).group(0)
return ipaddress
3 years ago
except Exception as ex:
# print(ex)
7 years ago
return '127.0.0.1'
7 years ago
3 years ago
def getClientIp():
from flask import request
return request.remote_addr.replace('::ffff:', '')
3 years ago
def getLocalIp():
filename = 'data/iplist.txt'
3 years ago
try:
ipaddress = readFile(filename)
if not ipaddress or ipaddress == '127.0.0.1':
cmd = "curl -4 -sS --connect-timeout 5 -m 60 https://v6r.ipip.net/?format=text"
ip = execShell(cmd)
result = ip[0].strip()
if result == '':
raise Exception("ipv4 is empty!")
writeFile(filename, result)
return result
3 years ago
return ipaddress
except Exception as e:
cmd = "curl -6 -sS --connect-timeout 5 -m 60 https://v6r.ipip.net/?format=text"
ip = execShell(cmd)
result = ip[0].strip()
if result == '':
return '127.0.0.1'
writeFile(filename, result)
return result
finally:
pass
return '127.0.0.1'
3 years ago
7 years ago
def inArray(arrays, searchStr):
# 搜索数据中是否存在
for key in arrays:
if key == searchStr:
return True
return False
3 years ago
def formatDate(format="%Y-%m-%d %H:%M:%S", times=None):
# 格式化指定时间戳
if not times:
times = int(time.time())
time_local = time.localtime(times)
return time.strftime(format, time_local)
7 years ago
def checkIp(ip):
# 检查是否为IPv4地址
import re
p = re.compile(
'^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$')
if p.match(ip):
return True
else:
return False
3 years ago
def createLinuxUser(user, group):
execShell("groupadd {}".format(group))
execShell('useradd -s /sbin/nologin -g {} {}'.format(user, group))
return True
def setOwn(filename, user, group=None):
if isAppleSystem():
return True
# 设置用户组
if not os.path.exists(filename):
return False
from pwd import getpwnam
try:
user_info = getpwnam(user)
user = user_info.pw_uid
if group:
user_info = getpwnam(group)
group = user_info.pw_gid
except:
if user == 'www':
createLinuxUser(user)
# 如果指定用户或组不存在,则使用www
try:
user_info = getpwnam('www')
except:
createLinuxUser(user)
user_info = getpwnam('www')
user = user_info.pw_uid
group = user_info.pw_gid
os.chown(filename, user, group)
return True
7 years ago
def checkPort(port):
# 检查端口是否合法
3 years ago
ports = ['21', '25', '443', '888']
7 years ago
if port in ports:
return False
intport = int(port)
if intport < 1 or intport > 65535:
return False
return True
def getStrBetween(startStr, endStr, srcStr):
# 字符串取中间
start = srcStr.find(startStr)
if start == -1:
return None
end = srcStr.find(endStr)
if end == -1:
return None
return srcStr[start + 1:end]
def getCpuType():
cpuType = ''
if isAppleSystem():
cmd = "system_profiler SPHardwareDataType | grep 'Processor Name' | awk -F ':' '{print $2}'"
cpuinfo = execShell(cmd)
return cpuinfo[0].strip()
7 years ago
# 取CPU类型
cpuinfo = open('/proc/cpuinfo', 'r').read()
rep = "model\s+name\s+:\s+(.+)"
tmp = re.search(rep, cpuinfo, re.I)
7 years ago
if tmp:
cpuType = tmp.groups()[0]
else:
cpuinfo = execShell('LANG="en_US.UTF-8" && lscpu')[0]
rep = "Model\s+name:\s+(.+)"
tmp = re.search(rep, cpuinfo, re.I)
if tmp:
cpuType = tmp.groups()[0]
7 years ago
return cpuType
7 years ago
def isRestart():
7 years ago
# 检查是否允许重启
num = M('tasks').where('status!=?', ('1',)).count()
if num > 0:
return False
return True
7 years ago
def isUpdateLocalSoft():
num = M('tasks').where('status!=?', ('1',)).count()
7 years ago
if os.path.exists('mdserver-web.zip'):
7 years ago
return True
7 years ago
if num > 0:
data = M('tasks').where('status!=?', ('1',)).field(
'id,type,execstr').limit('1').select()
argv = data[0]['execstr'].split('|dl|')
if data[0]['type'] == 'download' and argv[1] == 'mdserver-web.zip':
return True
7 years ago
return False
7 years ago
def hasPwd(password):
# 加密密码字符
import crypt
return crypt.crypt(password, password)
6 years ago
def getTimeout(url):
7 years ago
start = time.time()
result = httpGet(url)
if result != 'True':
return False
return int((time.time() - start) * 1000)
6 years ago
def makeConf():
file = getRunDir() + '/data/json/config.json'
if not os.path.exists(file):
c = {}
3 years ago
c['title'] = '猫王面板'
6 years ago
c['home'] = 'http://github/midoks/mdserver-web'
c['recycle_bin'] = True
c['template'] = 'default'
writeFile(file, json.dumps(c))
return c
c = readFile(file)
return json.loads(c)
def getConfig(k):
c = makeConf()
return c[k]
def setConfig(k, v):
c = makeConf()
c[k] = v
file = getRunDir() + '/data/json/config.json'
return writeFile(file, json.dumps(c))
def getHostAddr():
if os.path.exists('data/iplist.txt'):
return readFile('data/iplist.txt').strip()
return '127.0.0.1'
def setHostAddr(addr):
file = getRunDir() + '/data/iplist.txt'
return writeFile(file, addr)
def getHostPort():
if os.path.exists('data/port.pl'):
return readFile('data/port.pl').strip()
return '7200'
def setHostPort(port):
file = getRunDir() + '/data/port.pl'
return writeFile(file, port)
7 years ago
def auth_decode(data):
7 years ago
# 解密数据
7 years ago
token = GetToken()
# 是否有生成Token
if not token:
return returnMsg(False, 'REQUEST_ERR')
# 校验access_key是否正确
if token['access_key'] != data['btauth_key']:
return returnMsg(False, 'REQUEST_ERR')
# 解码数据
import binascii
import hashlib
import urllib
import hmac
import json
tdata = binascii.unhexlify(data['data'])
# 校验signature是否正确
signature = binascii.hexlify(
hmac.new(token['secret_key'], tdata, digestmod=hashlib.sha256).digest())
if signature != data['signature']:
return returnMsg(False, 'REQUEST_ERR')
# 返回
return json.loads(urllib.unquote(tdata))
# 数据加密
def auth_encode(data):
token = GetToken()
pdata = {}
# 是否有生成Token
if not token:
return returnMsg(False, 'REQUEST_ERR')
# 生成signature
import binascii
import hashlib
import urllib
import hmac
import json
tdata = urllib.quote(json.dumps(data))
# 公式 hex(hmac_sha256(data))
pdata['signature'] = binascii.hexlify(
hmac.new(token['secret_key'], tdata, digestmod=hashlib.sha256).digest())
# 加密数据
pdata['btauth_key'] = token['access_key']
pdata['data'] = binascii.hexlify(tdata)
pdata['timestamp'] = time.time()
# 返回
return pdata
def checkToken(get):
7 years ago
# 检查Token
7 years ago
tempFile = 'data/tempToken.json'
if not os.path.exists(tempFile):
return False
import json
import time
tempToken = json.loads(readFile(tempFile))
if time.time() > tempToken['timeout']:
return False
if get.token != tempToken['token']:
return False
return True
def checkInput(data):
# 过滤输入
if not data:
return data
if type(data) != str:
return data
checkList = [
{'d': '<', 'r': ''},
{'d': '>', 'r': ''},
{'d': '\'', 'r': ''},
{'d': '"', 'r': ''},
{'d': '&', 'r': ''},
{'d': '#', 'r': ''},
{'d': '<', 'r': ''}
]
for v in checkList:
data = data.replace(v['d'], v['r'])
return data
7 years ago
def checkCert(certPath='ssl/certificate.pem'):
7 years ago
# 验证证书
openssl = '/usr/local/openssl/bin/openssl'
if not os.path.exists(openssl):
openssl = 'openssl'
certPem = readFile(certPath)
s = "\n-----BEGIN CERTIFICATE-----"
tmp = certPem.strip().split(s)
for tmp1 in tmp:
if tmp1.find('-----BEGIN CERTIFICATE-----') == -1:
tmp1 = s + tmp1
writeFile(certPath, tmp1)
7 years ago
result = execShell(openssl + " x509 -in " +
7 years ago
certPath + " -noout -subject")
if result[1].find('-bash:') != -1:
return True
if len(result[1]) > 2:
return False
if result[0].find('error:') != -1:
return False
return True
6 years ago
def getPathSize(path):
# 取文件或目录大小
if not os.path.exists(path):
return 0
if not os.path.isdir(path):
return os.path.getsize(path)
size_total = 0
for nf in os.walk(path):
for f in nf[2]:
filename = nf[0] + '/' + f
size_total += os.path.getsize(filename)
return size_total
7 years ago
7 years ago
def toSize(size):
7 years ago
# 字节单位转换
d = ('b', 'KB', 'MB', 'GB', 'TB')
s = d[0]
for b in d:
if size < 1024:
6 years ago
return str(round(size, 2)) + ' ' + b
6 years ago
size = float(size) / 1024.0
7 years ago
s = b
6 years ago
return str(round(size, 2)) + ' ' + b
7 years ago
7 years ago
def getMacAddress():
# 获取mac
import uuid
mac = uuid.UUID(int=uuid.getnode()).hex[-12:]
return ":".join([mac[e:e + 2] for e in range(0, 11, 2)])
7 years ago
def get_string(t):
if t != -1:
max = 126
m_types = [{'m': 122, 'n': 97}, {'m': 90, 'n': 65}, {'m': 57, 'n': 48}, {
'm': 47, 'n': 32}, {'m': 64, 'n': 58}, {'m': 96, 'n': 91}, {'m': 125, 'n': 123}]
else:
max = 256
t = 0
m_types = [{'m': 255, 'n': 0}]
arr = []
for i in range(max):
if i < m_types[t]['n'] or i > m_types[t]['m']:
continue
arr.append(chr(i))
return arr
def get_string_find(t):
if type(t) != list:
t = [t]
return_str = ''
for s1 in t:
return_str += get_string(int(s1[0]))[int(s1[1:])]
return return_str
def get_string_arr(t):
s_arr = {}
t_arr = []
for s1 in t:
for i in range(6):
if not i in s_arr:
s_arr[i] = get_string(i)
for j in range(len(s_arr[i])):
if s1 == s_arr[i][j]:
t_arr.append(str(i) + str(j))
return t_arr
6 years ago
def getSSHPort():
try:
file = '/etc/ssh/sshd_config'
4 years ago
conf = readFile(file)
6 years ago
rep = "#*Port\s+([0-9]+)\s*\n"
port = re.search(rep, conf).groups(0)[0]
return int(port)
except:
return 22
def getSSHStatus():
if os.path.exists('/usr/bin/apt-get'):
status = execShell("service ssh status | grep -P '(dead|stop)'")
else:
import system_api
version = system_api.system_api().getSystemVersion()
if version.find(' Mac ') != -1:
return True
if version.find(' 7.') != -1:
status = execShell("systemctl status sshd.service | grep 'dead'")
else:
status = execShell(
"/etc/init.d/sshd status | grep -e 'stopped' -e '已停'")
if len(status[0]) > 3:
status = False
else:
status = True
return status
3 years ago
def requestFcgiPHP(sock, uri, document_root='/tmp', method='GET', pdata=b''):
# 直接请求到PHP-FPM
# version php版本
# uri 请求uri
# filename 要执行的php文件
# args 请求参数
# method 请求方式
sys.path.append(os.getcwd() + "/class/plugin")
import fpm
p = fpm.fpm(sock, document_root)
if type(pdata) == dict:
pdata = url_encode(pdata)
result = p.load_url_public(uri, pdata, method)
return result
3 years ago
def getMyORM():
'''
获取MySQL资源的ORM
'''
sys.path.append(os.getcwd() + "/class/plugin")
import orm
o = orm.ORM()
return o
3 years ago
def getMyORMDb():
'''
获取MySQL资源的ORM pip install mysqlclient==2.0.3 | pip install mysql-python
'''
sys.path.append(os.getcwd() + "/class/plugin")
import ormDb
o = ormDb.ORM()
return o