宝塔618特惠活动,企业版999元/年,宝塔SSL证书买1送1!限时抢购!查看活动
当前位置:论坛首页 > BUG提交 > Linux面板

【已解答】宝塔跑分获取不到CPU型号出错的BUG!

发表在 BUG提交2025-5-31 18:43 [复制链接] 2 154

  1. #coding: utf-8
  2. # +-------------------------------------------------------------------
  3. # | 宝塔Linux面板 x3
  4. # +-------------------------------------------------------------------
  5. # | Copyright (c) 2015-2016 宝塔软件(http://bt.cn) All rights reserved.
  6. # +-------------------------------------------------------------------
  7. # | Author: 黄文良 <2879625666@qq.com>
  8. # +-------------------------------------------------------------------

  9. #+--------------------------------------------------------------------
  10. #|   服务器测试
  11. #+--------------------------------------------------------------------

  12. import time,psutil,random,os,urllib,binascii,json,public,re,sys;
  13. class score_main:
  14.    
  15.     __APIURL = 'http://www.bt.cn/api/Auth';
  16.     __UPATH = 'data/userInfo.json';
  17.     __userInfo = None;
  18.     __PDATA = None;
  19.    
  20.     def CheckToken(self):
  21.         pdata = {}
  22.         data = {}
  23.         if os.path.exists(self.__UPATH):
  24.             self.__userInfo = json.loads(public.readFile(self.__UPATH));
  25.             if self.__userInfo:
  26.                 pdata['access_key'] = self.__userInfo['access_key'];
  27.                 data['secret_key'] = self.__userInfo['secret_key'];
  28.         else:
  29.             pdata['access_key'] = 'test';
  30.             data['secret_key'] = '123456';
  31.         pdata['data'] = data;
  32.         self.__PDATA = pdata;
  33.             
  34.     #修正信息
  35.     def SetScore(self,get):
  36.         if hasattr(get,'ips'):
  37.             return self.SubmitSetScore('ips',get.ips);
  38.         if hasattr(get,'virt'):
  39.             return self.SubmitSetScore('virt',get.virt);
  40.    
  41.     #发送信息修正
  42.     def SubmitSetScore(self,key,value):
  43.         self.CheckToken();
  44.         self.__PDATA['data'][key] = value
  45.         self.__PDATA['data'] = self.De_Code(self.__PDATA['data']);
  46.         result = json.loads(public.httpPost(self.__APIURL+'/SetSocre',self.__PDATA));
  47.         result['data'] = self.En_Code(result['data']);
  48.         return result;
  49.    
  50.     #获取得分列表
  51.     def GetScore(self,get):
  52.         self.CheckToken();
  53.         self.__PDATA['data'] = self.De_Code(self.__PDATA['data']);
  54.         result = json.loads(public.httpPost(self.__APIURL+'/GetSocre',self.__PDATA));
  55.         result['data'] = self.En_Code(result['data']);
  56.         result['last'] = self.GetConfig()
  57.         return result;
  58.    
  59.     #获取配置信息
  60.     def GetConfig(self,get=None):
  61.         virt = '/usr/sbin/virt-what'
  62.         if not os.path.exists(virt):
  63.             if os.path.exists('/etc/yum.repos.d/epel.repo'):
  64.                 os.system('mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo_backup');
  65.             os.system('yum install virt-what -y');
  66.             if os.path.exists('/etc/yum.repos.d/epel.repo_backup'):
  67.                 os.system('mv /etc/yum.repos.d/epel.repo_backup /etc/yum.repos.d/epel.repo');
  68.         
  69.         data = {}
  70.         data['virt'] = public.ExecShell('virt-what')[0].strip();
  71.         
  72.         # 修复CPU信息提取
  73.         try:
  74.             cpuinfo = open('/proc/cpuinfo','r').read()
  75.             
  76.             # 方案1:优先尝试ARM架构字段
  77.             arm_implementer = re.search(r"CPU implementer\s+:\s+(0x[\da-fA-F]+)", cpuinfo)
  78.             arm_part = re.search(r"CPU part\s+:\s+(0x[\da-fA-F]+)", cpuinfo)
  79.             
  80.             if arm_implementer and arm_part:
  81.                 implementer_code = arm_implementer.groups()[0]
  82.                 part_code = arm_part.groups()[0]
  83.                 data['cpu'] = f"ARM {self._decode_arm_cpu(implementer_code, part_code)}"
  84.             else:
  85.                 # 方案2:回退到x86的model name
  86.                 tmp = re.search(r"model\s+name\s+:\s+(.+)", cpuinfo)
  87.                 data['cpu'] = tmp.groups()[0].strip() if tmp else "Unknown CPU"
  88.                
  89.         except Exception as e:
  90.             data['cpu'] = f"Error: {str(e)}"
  91.          # 修复CPU信息结束
  92.          
  93.         data['core'] = psutil.cpu_count();
  94.         data['memory'] = psutil.virtual_memory().total/1024/1024
  95.         data['system'] = self.GetSystemVersion();
  96.         
  97.         scoreInfo = self.readScore();
  98.         data['disk'] = str(scoreInfo['read'])+','+str(scoreInfo['write'])
  99.         data['mem_score'] = scoreInfo['mem'];
  100.         data['cpu_score'] = scoreInfo['cpu1'] + scoreInfo['cpu2'] + scoreInfo['cpu3'] + scoreInfo['cpu4'];
  101.         data['disk_score'] = scoreInfo['disk_score'];
  102.         data['total_score'] = scoreInfo['mem']+data['cpu_score']+scoreInfo['disk_score'];
  103.         return data;
  104. # 修复CPU信息提取
  105. def _decode_arm_cpu(self, implementer, part):
  106.         """将ARM CPU代码转换为可读名称"""
  107.         arm_cpu_db = {
  108.             ("0x41", "0xd03"): "Cortex-A53",
  109.             ("0x41", "0xd04"): "Cortex-A35",
  110.             ("0x41", "0xd05"): "Cortex-A55",  # 您的CPU
  111.             ("0x41", "0xd0a"): "Cortex-A75",
  112.         }
  113.         return arm_cpu_db.get((implementer.lower(), part.lower()), f"Unrecognized ARM CPU ({implementer}/{part})")
  114. # 修复CPU信息提取
  115. #提交到云端
  116.     def SubmitScore(self,get):
  117.         try:
  118.             self.CheckToken();
  119.             pdata = self.GetConfig(get);
  120.             if not pdata['total_score']: return public.returnMsg(False,'请先跑分!');
  121.             pdata['secret_key'] = self.__userInfo['secret_key'];
  122.             self.__PDATA['data'] = self.De_Code(pdata);
  123.             result = json.loads(public.httpPost(self.__APIURL+'/SubmitScore',self.__PDATA));
  124.             result['data'] = self.En_Code(result['data']);
  125.             return result;
  126.         except:
  127.             return None;
  128.         
  129.     #取操作系统版本
  130.     def GetSystemVersion(self):
  131.         version = public.readFile('/etc/redhat-release')
  132.         if not version:
  133.             version = public.readFile('/etc/issue').replace('\\n \\l','').strip();
  134.         else:
  135.             version = version.replace('release ','').strip();
  136.         return version
  137.    
  138.     #写当前得分
  139.     def writeScore(self,type,value):
  140.         scoreFile = 'plugin/score/score.json';
  141.         tmp = public.readFile(scoreFile)
  142.         if not tmp:
  143.             data = {}
  144.             data['cpu1'] = 0;
  145.             data['cpu2'] = 0;
  146.             data['cpu3'] = 0;
  147.             data['cpu4'] = 0;
  148.             data['mem'] = 0;
  149.             data['disk_score'] = 0;
  150.             data['read'] = 0;
  151.             data['write'] = 0;
  152.             public.writeFile(scoreFile,json.dumps(data));
  153.             tmp = public.readFile(scoreFile)
  154.         
  155.         data = json.loads(tmp);
  156.         data[type] = value;
  157.         public.writeFile(scoreFile,json.dumps(data));
  158.    
  159.     #读当前得分
  160.     def readScore(self):
  161.         scoreFile = 'plugin/score/score.json';
  162.         tmp = public.readFile(scoreFile)
  163.         if not tmp:
  164.             data = {}
  165.             data['cpu1'] = 0;
  166.             data['cpu2'] = 0;
  167.             data['cpu3'] = 0;
  168.             data['cpu4'] = 0;
  169.             data['mem'] = 0;
  170.             data['disk_score'] = 0;
  171.             data['read'] = 0;
  172.             data['write'] = 0;
  173.             public.writeFile(scoreFile,json.dumps(data));
  174.             tmp = public.readFile(scoreFile)
  175.         data = json.loads(tmp);
  176.         return data;
  177.                         
  178.    
  179.     #测试CPU
  180.     def testCpu(self,get,n = 1):
  181.         data = {}
  182.         data['cpuCount'] = psutil.cpu_count();
  183.         if not hasattr(get,'type'): get.type = '0';
  184.         import re;
  185.         cpuinfo = open('/proc/cpuinfo','r').read();
  186.         rep = "model\s+name\s+:\s+(.+)"
  187.         tmp = re.search(rep,cpuinfo);
  188.         data['cpuType'] = ""
  189.         if tmp:
  190.             data['cpuType'] = tmp.groups()[0];
  191.         
  192.         import system
  193.         data['system'] = system.system().GetSystemVersion();
  194.         path = 'plugin/score/testcpu';
  195.         if not os.path.exists(path): os.system('gcc '+path+'.c -o ' +path + ' -lpthread');
  196.         start = time.time();
  197.         os.system(path + ' 32 ' + get.type);
  198.         end = time.time();
  199.         data['score'] = int(400 * 10 / (end - start));
  200.         if not os.path.exists(path): data['score'] = 0;
  201.         self.writeScore('cpu'+get.type, data['score'])
  202.         return data;
  203.    
  204.     #测试整数运算
  205.     def testInt(self):
  206.         return self.testIntOrFloat(1);
  207.    
  208.     #测试浮点运行
  209.     def testFloat(self):
  210.         return self.testIntOrFloat(1.01);
  211.         
  212.     #CPU测试体
  213.     def testIntOrFloat(self,n=1):
  214.         start = time.time();
  215.         num  = 10000 * 100;
  216.         for i in range(num):
  217.             if i == 0: continue;
  218.             a = n + i;
  219.             b = n - i;
  220.             c = n * i;
  221.             d = n / i;
  222.             n = n + 1;
  223.             
  224.         end = time.time();
  225.         usetime = end - start;
  226.         return num / 100 / usetime;
  227.    
  228.     #冒泡算法测试
  229.     def testBubble(self):
  230.         start = time.time();
  231.         num  = 10000 * 5;
  232.         xx = 'qwertyuiopasdfghjklzxcvbnm1234567890'
  233.         for c in xrange(num):
  234.             lst = []
  235.             for k in range(10):
  236.                 lst.append(xx[random.randint(0,len(xx)-1)])
  237.             lst = self.bubbleSort(lst)
  238.         end = time.time();
  239.         usetime = end - start;
  240.         return num / 5 / usetime;
  241.    
  242.     #冒泡排序
  243.     def bubbleSort(self,lst):
  244.         length = len(lst)
  245.         for i in xrange(0, length, 1):
  246.             for j in xrange(0, length-1-i, 1):
  247.                 if lst[j] < lst[j+1]:
  248.                     temp = lst[j]
  249.                     lst[j] = lst[j+1]
  250.                     lst[j+1] = temp
  251.         return lst
  252.    
  253.     #二叉树算法测试
  254.     def testTree(self):
  255.         import testTree
  256.         
  257.         start = time.time();
  258.         elems = range(3000)              #生成树节点
  259.         tree = testTree.Tree()           #新建一个树对象
  260.         for elem in elems:                  
  261.             tree.add(elem)               #逐个加入树的节点
  262.    
  263.         tree.level_queue(tree.root)
  264.         tree.front_digui(tree.root)
  265.         tree.middle_digui(tree.root)
  266.         tree.later_digui(tree.root)
  267.         tree.front_stack(tree.root)
  268.         tree.middle_stack(tree.root)
  269.         tree.later_stack(tree.root)
  270.         
  271.         end = time.time();
  272.         usetime = end - start;
  273.         return 3000 / usetime;
  274.    
  275.    
  276.    
  277.     #测试内存
  278.     def testMem(self,get):
  279.         mem = psutil.virtual_memory()
  280.         self.writeScore('mem', mem.total/1024/1024)
  281.         #提交数据
  282.         self.SubmitScore(get)
  283.         return int(mem.total/1024/1024);
  284.    
  285.     #测试磁盘
  286.     def testDisk(self,get):
  287.         import os
  288.         data = {}
  289.         os.system('rm -f testDisk_*');
  290.         filename = "testDisk_" + time.strftime('%Y%m%d%H%M%S',time.localtime());
  291.         data['write'] =  self.testDiskWrite(filename);
  292.         import shutil
  293.         filename2 = "testDisk_" + time.strftime('%Y%m%d%H%M%S',time.localtime());
  294.         shutil.move(filename,filename2);
  295.         data['read'] =  self.testDiskRead(filename2);
  296.         diskIo = psutil.disk_partitions()
  297.         diskInfo = []
  298.         for disk in diskIo:
  299.             tmp = {}
  300.             tmp['path'] = disk[1]
  301.             tmp['size'] = psutil.disk_usage(disk[1])[0]
  302.             diskInfo.append(tmp)
  303.         data['diskInfo'] = diskInfo;
  304.         writeDisk = data['write'];
  305.         if data['write'] > 1000: writeDisk = 1000;
  306.         readDisk = data['read'];
  307.         if data['read'] > 1000: readDisk = 1000;
  308.         
  309.         data['score'] = (writeDisk * 6) + (readDisk * 6)
  310.         os.remove(filename2);
  311.         
  312.         self.writeScore('disk_score', data['score'])
  313.         self.writeScore('write', data['write'])
  314.         self.writeScore('read', data['read'])
  315.         return data;
  316.         pass
  317.    
  318.     #测试磁盘写入速度
  319.     def testDiskWrite(self,filename):
  320.         import random
  321.         start = time.time();
  322.         fp = open(filename,'w+');
  323.         strTest = "";
  324.         strTmp = "";
  325.         for n in range(4):
  326.             strTmp += chr(random.randint(97, 122))
  327.         for n in range(1024):
  328.             strTest += strTmp;
  329.    
  330.         for i in range(1024 * 256):
  331.             fp.write(strTest);
  332.             
  333.         del(strTest);
  334.         del(strTmp);
  335.         fp.close()
  336.         end = time.time();
  337.         usetime = end - start;
  338.         return int(1024/usetime);
  339.         
  340.     #测试磁盘读取速度   
  341.     def testDiskRead(self,filename):
  342.         os.system('echo 3 > /proc/sys/vm/drop_caches');
  343.         import random
  344.         start = time.time();
  345.         fp = open(filename,'r');
  346.         size = 4096;
  347.         while True:
  348.             tmp = fp.read(size);
  349.             if not tmp: break;
  350.             del(tmp);
  351.         fp.close()
  352.         end = time.time();
  353.         usetime = end - start;
  354.         return int(1024/usetime);
  355.    
  356.     def testWorkNet(self):
  357.         pass
  358.    
  359.    
  360.     #加密数据
  361.     def De_Code(self,data):
  362.         if sys.version_info[0] == 2:
  363.             pdata = urllib.urlencode(data);
  364.         else:
  365.             pdata = urllib.parse.urlencode(data);
  366.             if type(pdata) == str: pdata = pdata.encode('utf-8')
  367.         return binascii.hexlify(pdata);
  368.    
  369.     #解密数据
  370.     def En_Code(self,data):
  371.         if sys.version_info[0] == 2:
  372.             result = urllib.unquote(binascii.unhexlify(data));
  373.         else:
  374.             if type(data) == str: data = data.encode('utf-8')
  375.             tmp = binascii.unhexlify(data)
  376.             if type(tmp) != str: tmp = tmp.decode('utf-8')
  377.             result = urllib.parse.unquote(tmp)
  378.         if type(result) != str: result = result.decode('utf-8')
  379.         try:
  380.             return json.loads(result);
  381.         except: return result
  382.    
复制代码



使用道具 举报 只看该作者 回复
发表于 2025-5-31 18:50:07 | 显示全部楼层
我是小盒子刷的linux。安装完宝塔,获取不到CPU型号,就会报错,。

图片传不了。。。提示帖子长度不符合要求

使用道具 举报 回复 支持 反对
发表于 2025-6-4 10:28:49 | 显示全部楼层
感谢反馈,这个问题已经记录过了
另外,面板本身不针对aarch这类机构兼容测试哦
使用道具 举报 回复 支持 反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

普通问题处理

论坛响应时间:72小时

问题处理方式:排队(仅解答)

工作时间:白班:9:00 - 18:00

紧急运维服务

响应时间:3分钟

问题处理方式:宝塔专家1对1服务

工作时间:工作日:9:00 - 18:30

宝塔专业团队为您解决服务器疑难问题

点击联系技术免费分析

工作时间:09:00至18:30

快速回复 返回顶部 返回列表