Files
mdserver-web/web/utils/system/main.py
T
2026-09-22 15:34:24 +08:00

262 lines
8.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# coding:utf-8
# ---------------------------------------------------------------------------------
# MW-Linux面板
# ---------------------------------------------------------------------------------
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
# ---------------------------------------------------------------------------------
# Author: midoks <midoks@163.com>
# ---------------------------------------------------------------------------------
import os
import sys
import re
import time
import math
import psutil
import core.mw as mw
from threading import Thread
from time import sleep
def mw_async(f):
def wrapper(*args, **kwargs):
thr = Thread(target=f, args=args, kwargs=kwargs)
thr.start()
return wrapper
@mw_async
def restartServer():
if not mw.isRestart():
return mw.returnData(False, '请等待所有安装任务完成再执行!')
mw.execShell("sync && init 6 &")
return mw.returnData(True, '命令发送成功!')
def getPid(self, pname):
try:
pids = psutil.pids()
for pid in pids:
if psutil.Process(pid).name() == pname:
return True
return False
except:
return False
def getEnvInfo():
data = {}
data['status'] = True
sdir = mw.getServerDir()
data['webserver'] = '未安装'
if os.path.exists(sdir + '/openresty/nginx/sbin/nginx'):
data['webserver'] = 'OpenResty'
data['php'] = []
phpversions = ['52', '53', '54', '55', '56',
'70', '71', '72', '73', '74',
'80', '81', '82', '83', '84', '85']
phpPath = sdir + '/php/'
for pv in phpversions:
if not os.path.exists(phpPath + pv + '/bin/php'):
continue
data['php'].append(pv)
data['mysql'] = False
if os.path.exists(sdir + '/mysql/bin/mysql'):
data['mysql'] = True
try:
diskInfo = psutil.disk_usage('/www')
except:
diskInfo = psutil.disk_usage('/')
data['disk'] = diskInfo[2]
return mw.returnData(True, 'ok', data)
def getMacDiskType():
content = mw.execShell('diskutil info disk0 | grep "Solid State" | grep "Yes"')[0]
if content[0] != "":
return "SSD"
return 'HHD'
def getDiskType(dev_path):
# 识别磁盘类型: hdd/ssd/ssd nvme
try:
if not dev_path.startswith('/dev/'):
return 'HDD'
name = dev_path.replace('/dev/', '')
# Linux: NVMe SSD
if name.startswith('nvme'):
return 'NVME'
# 去掉分区号得到基础设备名: vda1 -> vda; 已是基础名(dm-0/md0)则保留
base = name
if not os.path.exists('/sys/block/' + name):
base = re.sub(r'p?\d+$', '', name)
rotational_path = f"/sys/block/{base}/queue/rotational"
try:
with open(rotational_path, 'r') as f:
# 0 表示 SSD,1 表示 HDD
return "HDD" if f.read().strip() == '1' else "SSD"
except FileNotFoundError:
return "unknown"
except:
return 'unknown'
def getDiskInfo():
# 取磁盘分区信息
temp = mw.execShell("df -h -P|grep '/'|grep -v tmpfs | grep -v devfs")[0]
tempInodes = mw.execShell("df -i -P|grep '/'|grep -v tmpfs | grep -v devfs")[0]
temp1 = temp.split('\n')
tempInodes1 = tempInodes.split('\n')
diskInfo = []
n = 0
cuts = ['/mnt/cdrom', '/boot', '/boot/efi', '/dev',
'/dev/shm', '/zroot', '/run/lock', '/run', '/run/shm', '/run/user']
current_os = mw.getOs()
tmp_disk_type = "none"
if current_os == 'darwin':
tmp_disk_type = getMacDiskType()
for tmp in temp1:
n += 1
inodes = tempInodes1[n - 1].split()
disk = tmp.split()
if len(disk) < 5:
continue
if disk[1].find('M') != -1:
continue
if disk[1].find('K') != -1:
continue
if len(disk[5].split('/')) > 4:
continue
if disk[5] in cuts:
continue
arr = {}
arr['path'] = disk[5]
tmp1 = [disk[1], disk[2], disk[3], disk[4]]
arr['size'] = tmp1
arr['inodes'] = [inodes[1], inodes[2], inodes[3], inodes[4]]
if current_os == 'darwin':
arr['type'] = tmp_disk_type
else:
arr['type'] = getDiskType(disk[0])
diskInfo.append(arr)
return diskInfo
def getLoadAverage():
c = os.getloadavg()
data = {}
data['one'] = round(float(c[0]), 2)
data['five'] = round(float(c[1]), 2)
data['fifteen'] = round(float(c[2]), 2)
data['max'] = psutil.cpu_count() * 2
data['limit'] = data['max']
data['safe'] = data['max'] * 0.75
return data
def getSystemVersion():
# 取操作系统版本
current_os = mw.getOs()
# sys_temper = self.getSystemDeviceTemperature()
# print(sys_temper)
# mac
if current_os == 'darwin':
data = mw.execShell('sw_vers')[0]
data_list = data.strip().split("\n")
mac_version = ''
for x in data_list:
xlist = x.split("\t")
mac_version += xlist[len(xlist)-1] + ' '
arch_ver = mw.execShell("arch")
return mac_version + " (" + arch_ver[0].strip() + ")"
# freebsd
if current_os.startswith('freebsd'):
version = mw.execShell(
"cat /etc/*-release | grep PRETTY_NAME | awk -F = '{print $2}' | awk -F '\"' '{print $2}'")
arch_ver = mw.execShell(
"sysctl -a | egrep -i 'hw.machine_arch' | awk -F ':' '{print $2}'")
return version[0].strip() + " (" + arch_ver[0].strip() + ")"
redhat_series = '/etc/redhat-release'
if os.path.exists(redhat_series):
version = mw.readFile('/etc/redhat-release')
version = version.replace('release ', '').strip()
arch_ver = mw.execShell("arch")
return version + " (" + arch_ver[0].strip() + ")"
os_series = '/etc/os-release'
if os.path.exists(os_series):
version = mw.execShell(
"cat /etc/*-release | grep PRETTY_NAME | awk -F = '{print $2}' | awk -F '\"' '{print $2}'")
arch_ver = mw.execShell("arch")
return version[0].strip() + " (" + arch_ver[0].strip() + ")"
def getBootTime():
# 取系统启动时间
if os.path.exists('/proc/uptime'):
uptime = mw.readFile('/proc/uptime')
run_time = uptime.split()[0]
else:
start_time = psutil.boot_time()
run_time = time.time() - start_time
tStr = float(run_time)
min = tStr / 60
hours = min / 60
days = math.floor(hours / 24)
hours = math.floor(hours - (days * 24))
min = math.floor(min - (days * 60 * 24) - (hours * 60))
return mw.getInfo('已不间断运行: {1}天{2}小时{3}分钟', (str(int(days)), str(int(hours)), str(int(min))))
def getCpuInfo(interval=1):
# 取CPU信息
cpuCount = psutil.cpu_count()
cpuLogicalNum = psutil.cpu_count(logical=False)
used = psutil.cpu_percent(interval=interval)
cpuLogicalNum = 0
if os.path.exists('/proc/cpuinfo'):
c_tmp = mw.readFile('/proc/cpuinfo')
d_tmp = re.findall("physical id.+", c_tmp)
cpuLogicalNum = len(set(d_tmp))
used_all = psutil.cpu_percent(percpu=True)
cpu_name = mw.getCpuType() + " * {}".format(cpuLogicalNum)
return used, cpuCount, used_all, cpu_name, cpuCount, cpuLogicalNum
def getMemInfo():
# 取内存信息
mem = psutil.virtual_memory()
if sys.platform == 'darwin':
memInfo = {'memTotal': mem.total}
memInfo['memRealUsed'] = memInfo['memTotal'] * (mem.percent / 100)
else:
memInfo = {
'memTotal': mem.total,
'memFree': mem.free,
'memBuffers': mem.buffers,
'memCached': mem.cached
}
memInfo['memRealUsed'] = memInfo['memTotal'] - memInfo['memFree'] - memInfo['memBuffers'] - memInfo['memCached']
return memInfo
def getMemUsed():
# 取内存使用率
try:
import psutil
mem = psutil.virtual_memory()
if mw.getOs() == 'darwin':
return mem.percent
memInfo = {'memTotal': mem.total / 1024 / 1024, 'memFree': mem.free / 1024 / 1024,
'memBuffers': mem.buffers / 1024 / 1024, 'memCached': mem.cached / 1024 / 1024}
tmp = memInfo['memTotal'] - memInfo['memFree'] - \
memInfo['memBuffers'] - memInfo['memCached']
tmp1 = memInfo['memTotal'] / 100
return (tmp / tmp1)
except Exception as ex:
return 1