113 lines
4.1 KiB
Python
113 lines
4.1 KiB
Python
# _*_ coding : UTF-8 _*_
|
||
# @Time : 2025/02/04 15:25
|
||
# @UpdateTime : 2025/02/04 15:25
|
||
# @Author : sonder
|
||
# @File : server.py
|
||
# @Software : PyCharm
|
||
# @Comment : 本程序
|
||
import os
|
||
import platform
|
||
import socket
|
||
import time
|
||
|
||
import psutil
|
||
from fastapi import APIRouter, Depends, Request
|
||
from fastapi.responses import JSONResponse
|
||
|
||
from annotation.log import Log
|
||
from config.constant import BusinessType
|
||
from controller.login import LoginController
|
||
from schemas.server import GetServerInfoResponse, CpuInfo, MemoryInfo, SystemInfo, PythonInfo, SystemFiles, \
|
||
GetSystemInfoResult
|
||
from utils.common import bytes2human
|
||
from utils.response import Response
|
||
|
||
serverAPI = APIRouter(
|
||
prefix="/server",
|
||
dependencies=[Depends(LoginController.get_current_user)]
|
||
)
|
||
|
||
|
||
@serverAPI.get("", response_class=JSONResponse, response_model=GetServerInfoResponse, summary="获取服务器信息")
|
||
@Log(title="获取服务器信息", business_type=BusinessType.SELECT)
|
||
async def get_server_info(request: Request):
|
||
# CPU信息
|
||
# 获取CPU总核心数
|
||
cpu_num = psutil.cpu_count(logical=True)
|
||
cpu_usage_percent = psutil.cpu_times_percent()
|
||
cpu_used = cpu_usage_percent.user
|
||
cpu_sys = cpu_usage_percent.system
|
||
cpu_free = cpu_usage_percent.idle
|
||
cpu = CpuInfo(cpuNum=cpu_num, used=cpu_used, sys=cpu_sys, free=cpu_free)
|
||
|
||
# 内存信息
|
||
memory_info = psutil.virtual_memory()
|
||
memory_total = bytes2human(memory_info.total)
|
||
memory_used = bytes2human(memory_info.used)
|
||
memory_free = bytes2human(memory_info.free)
|
||
memory_usage = memory_info.percent
|
||
mem = MemoryInfo(total=memory_total, used=memory_used, free=memory_free, usage=memory_usage)
|
||
|
||
# 主机信息
|
||
# 获取主机名
|
||
hostname = socket.gethostname()
|
||
# 获取IP
|
||
computer_ip = socket.gethostbyname(hostname)
|
||
os_name = platform.platform()
|
||
computer_name = platform.node()
|
||
os_arch = platform.machine()
|
||
user_dir = os.path.abspath(os.getcwd())
|
||
sys = SystemInfo(
|
||
computerIp=computer_ip, computerName=computer_name, osArch=os_arch, osName=os_name, userDir=user_dir
|
||
)
|
||
|
||
# python解释器信息
|
||
current_pid = os.getpid()
|
||
current_process = psutil.Process(current_pid)
|
||
python_name = current_process.name()
|
||
python_version = platform.python_version()
|
||
python_home = current_process.exe()
|
||
start_time_stamp = current_process.create_time()
|
||
start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(start_time_stamp))
|
||
current_time_stamp = time.time()
|
||
difference = current_time_stamp - start_time_stamp
|
||
# 将时间差转换为天、小时和分钟数
|
||
days = int(difference // (24 * 60 * 60)) # 每天的秒数
|
||
hours = int((difference % (24 * 60 * 60)) // (60 * 60)) # 每小时的秒数
|
||
minutes = int((difference % (60 * 60)) // 60) # 每分钟的秒数
|
||
run_time = f'{days}天{hours}小时{minutes}分钟'
|
||
# 获取当前Python程序的pid
|
||
pid = os.getpid()
|
||
# 获取该进程的内存信息
|
||
current_process_memory_info = psutil.Process(pid).memory_info()
|
||
py = PythonInfo(
|
||
name=python_name,
|
||
version=python_version,
|
||
startTime=start_time,
|
||
runTime=run_time,
|
||
home=python_home,
|
||
total=bytes2human(memory_info.available),
|
||
used=bytes2human(current_process_memory_info.rss),
|
||
free=bytes2human(memory_info.available - current_process_memory_info.rss),
|
||
usage=round((current_process_memory_info.rss / memory_info.available) * 100, 2),
|
||
)
|
||
|
||
# 磁盘信息
|
||
io = psutil.disk_partitions()
|
||
sys_files = []
|
||
for i in io:
|
||
o = psutil.disk_usage(i.device)
|
||
disk_data = SystemFiles(
|
||
dirName=i.device,
|
||
sysTypeName=i.fstype,
|
||
typeName='本地固定磁盘(' + i.mountpoint.replace('\\', '') + ')',
|
||
total=bytes2human(o.total),
|
||
used=bytes2human(o.used),
|
||
free=bytes2human(o.free),
|
||
usage=f'{psutil.disk_usage(i.device).percent}%',
|
||
)
|
||
sys_files.append(disk_data)
|
||
|
||
result = GetSystemInfoResult(cpu=cpu, memory=mem, system=sys, python=py, systemFiles=sys_files)
|
||
return Response.success(data=result)
|