当前位置:论坛首页 > BUG提交 > Linux面板

【已奖励200宝塔币】由“取CPU类型”的方式不对

发表在 BUG提交2019-7-11 02:26 [复制链接] 2 6501

从5.x版本的时候就已经有这个问题了,今天有兴趣就研究了一下,如图所示:
(这图片不知道什么原因传不上去,只能用图床了)

6.9.7是我用命令升级的。

我定位到了ajax.py的UpdatePanel函数代码段,Debug了一下,发现了问题:
TypeError: cannot concatenate 'str' and 'NoneType' objects

是这段代码的问题:
  1. data['system'] = panelsys.GetSystemVersion() + '|' + str(mem.total / 1024 / 1024) + 'MB|' + public.getCpuType() + '*' + str(psutil.cpu_count()) + '|' + public.get_webserver() + '|' +session['version'];
复制代码

每个函数都试了试,发现这个函数的返回竟然是空的:
  1. public.getCpuType()
复制代码

定位到public.py的getCpuType函数代码段:
  1. #取CPU类型
  2. def getCpuType():
  3.     cpuinfo = open('/proc/cpuinfo','r').read();
  4.     rep = "model\s+name\s+:\s+(.+)"
  5.     tmp = re.search(rep,cpuinfo);
  6.     cpuType = None
  7.     if tmp:
  8.         cpuType = tmp.groups()[0];
  9.     return cpuType;
复制代码

我不得不吐槽一下data['system']的字符串拼接,明知道有可能返回None,还用这么粗暴的方法,或者判断一下也好啊。
读取/proc/cpuinfo的内容,并正则匹配model name,看着没问题啊,但是当我看了一下/proc/cpuinfo的内容之后,发现信息少得可怜。。。

cpuinfo.jpg
顺便说一下硬件环境是树莓派3B+,Ubuntu Mate 18.04系统,可能是硬件比较特殊,所以cpuinfo的信息很少。
里面并没有model name,正则匹配不到,所以返回了None。
我突然想到有一个命令也可以查看cpu的信息:lscpu
lscpu.jpg
果然可以,而且还能看到model name的信息(原谅我在树莓派上面装宝塔,但我还是折腾成功了)。
lscpu是集成在util-linux工具包里面的,基本上是个发行版都会有这个工具包。
我个人觉得可以把/proc/cpuinfo和lscpu结合在一起,哪边有就取哪边的,都没有的话那就返回个空字符串''呗。

光说不做,来个示例吧:
  1. #取CPU类型
  2. def getCpuType():
  3.     cpuinfo1 = os.popen('lscpu').read()
  4.     cpuinfo2 = open('/proc/cpuinfo','r').read()
  5.     rep = "model\s+name\s+:\s+(.+)"
  6.     tmp1 = re.search(rep, cpuinfo1, re.I)        #这里忽略大小写,因为lscpu取到的是大写Model
  7.     tmp2 = re.search(rep, cpuinfo2, re.I)
  8.     cpuType = ''                                              #返回一个空字符串,这样返回后的字符串拼接就不用改了
  9.     if tmp1:
  10.         cpuType = tmp1.groups()[0]
  11.     elif tmp2:
  12.         cpuType = tmp2.groups()[0]
  13.     return cpuType
复制代码
改好之后重启面板试一试:
success.jpg

有个小问题,关于取面板版本的API:
  1. sUrl = public.GetConfigValue('home') + '/api/panel/updateLinux';
复制代码
我试着用public.HttpGet方法来取,好像也没什么问题啊,具体的接口调用我也不方便过问,但是这取的系统的信息有点多啊......

宝塔面板的兼容性可以说是很不错了,这里的细节可以让它更上一层楼。
另外,关于树莓派装宝塔面板,我主要还是用来做私有云,配合IPv6很舒服,但是安装过程比较折腾,有的地方还要自己修Bug,详细的安装方法可以看我的博客:https://www.flasky.cn/

ps:这链接添加不上很让人恼火啊,这个编辑器真的是shit一样难用......代码频繁丢失

使用道具 举报 只看该作者 回复
发表于 2019-7-11 10:21:04 | 显示全部楼层
刚刚看了一下,示例代码的正则匹配有点问题,改为:

  1. #取CPU类型
  2. def getCpuType():
  3.     cpuinfo1 = os.popen('lscpu').read()
  4.     cpuinfo2 = open('/proc/cpuinfo','r').read()
  5.     rep1 = "model\s+name:\s+(.+)"                #lscpu取到的冒号前面没有空格
  6.     rep2 = "model\s+name\s+:\s+(.+)"
  7.     tmp1 = re.search(rep1, cpuinfo1, re.I)        #这里忽略大小写,因为lscpu取到的是大写Model
  8.     tmp2 = re.search(rep2, cpuinfo2, re.I)
  9.     cpuType = ''                                              #返回一个空字符串,这样返回后的字符串拼接就不用改了
  10.     if tmp1:
  11.         cpuType = tmp1.groups()[0]
  12.     elif tmp2:
  13.         cpuType = tmp2.groups()[0]
  14.     return cpuType
复制代码
使用道具 举报 回复 支持 反对
发表于 2019-7-11 15:11:02 | 显示全部楼层
您好,感谢反馈,已优化获取方法
使用道具 举报 回复 支持 反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

普通问题处理

论坛响应时间:72小时

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

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

紧急运维服务

响应时间:3分钟

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

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

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

点击联系技术免费分析
快速回复 返回顶部 返回列表