【已奖励200宝塔币】由“取CPU类型”的方式不对
从5.x版本的时候就已经有这个问题了,今天有兴趣就研究了一下,如图所示:(这图片不知道什么原因传不上去,只能用图床了)
https://i.bmp.ovh/imgs/2019/07/ba702c4d6f313293.jpg
6.9.7是我用命令升级的。
我定位到了ajax.py的UpdatePanel函数代码段,Debug了一下,发现了问题:
TypeError: cannot concatenate 'str' and 'NoneType' objects
是这段代码的问题:
data['system'] = panelsys.GetSystemVersion() + '|' + str(mem.total / 1024 / 1024) + 'MB|' + public.getCpuType() + '*' + str(psutil.cpu_count()) + '|' + public.get_webserver() + '|' +session['version'];
每个函数都试了试,发现这个函数的返回竟然是空的:
public.getCpuType()
定位到public.py的getCpuType函数代码段:
#取CPU类型
def getCpuType():
cpuinfo = open('/proc/cpuinfo','r').read();
rep = "model\s+name\s+:\s+(.+)"
tmp = re.search(rep,cpuinfo);
cpuType = None
if tmp:
cpuType = tmp.groups();
return cpuType;
我不得不吐槽一下data['system']的字符串拼接,明知道有可能返回None,还用这么粗暴的方法,或者判断一下也好啊。
读取/proc/cpuinfo的内容,并正则匹配model name,看着没问题啊,但是当我看了一下/proc/cpuinfo的内容之后,发现信息少得可怜。。。
顺便说一下硬件环境是树莓派3B+,Ubuntu Mate 18.04系统,可能是硬件比较特殊,所以cpuinfo的信息很少。
里面并没有model name,正则匹配不到,所以返回了None。
我突然想到有一个命令也可以查看cpu的信息:lscpu
果然可以,而且还能看到model name的信息(原谅我在树莓派上面装宝塔,但我还是折腾成功了)。
lscpu是集成在util-linux工具包里面的,基本上是个发行版都会有这个工具包。
我个人觉得可以把/proc/cpuinfo和lscpu结合在一起,哪边有就取哪边的,都没有的话那就返回个空字符串''呗。
光说不做,来个示例吧:#取CPU类型
def getCpuType():
cpuinfo1 = os.popen('lscpu').read()
cpuinfo2 = open('/proc/cpuinfo','r').read()
rep = "model\s+name\s+:\s+(.+)"
tmp1 = re.search(rep, cpuinfo1, re.I) #这里忽略大小写,因为lscpu取到的是大写Model
tmp2 = re.search(rep, cpuinfo2, re.I)
cpuType = '' #返回一个空字符串,这样返回后的字符串拼接就不用改了
if tmp1:
cpuType = tmp1.groups()
elif tmp2:
cpuType = tmp2.groups()
return cpuType改好之后重启面板试一试:
有个小问题,关于取面板版本的API:
sUrl = public.GetConfigValue('home') + '/api/panel/updateLinux';我试着用public.HttpGet方法来取,好像也没什么问题啊,具体的接口调用我也不方便过问,但是这取的系统的信息有点多啊......
宝塔面板的兼容性可以说是很不错了,这里的细节可以让它更上一层楼。
另外,关于树莓派装宝塔面板,我主要还是用来做私有云,配合IPv6很舒服,但是安装过程比较折腾,有的地方还要自己修Bug,详细的安装方法可以看我的博客:https://www.flasky.cn/
ps:这链接添加不上很让人恼火啊,这个编辑器真的是shit一样难用......代码频繁丢失
刚刚看了一下,示例代码的正则匹配有点问题,改为:
#取CPU类型
def getCpuType():
cpuinfo1 = os.popen('lscpu').read()
cpuinfo2 = open('/proc/cpuinfo','r').read()
rep1 = "model\s+name:\s+(.+)" #lscpu取到的冒号前面没有空格
rep2 = "model\s+name\s+:\s+(.+)"
tmp1 = re.search(rep1, cpuinfo1, re.I) #这里忽略大小写,因为lscpu取到的是大写Model
tmp2 = re.search(rep2, cpuinfo2, re.I)
cpuType = '' #返回一个空字符串,这样返回后的字符串拼接就不用改了
if tmp1:
cpuType = tmp1.groups()
elif tmp2:
cpuType = tmp2.groups()
return cpuType
您好,感谢反馈,已优化获取方法
页:
[1]