mirror of
https://github.com/aaPanel/aaPanel.git
synced 2026-08-17 21:25:47 +02:00
162 lines
7.3 KiB
Python
162 lines
7.3 KiB
Python
#coding: utf-8
|
||
#-------------------------------------------------------------------
|
||
# 宝塔Linux面板
|
||
#-------------------------------------------------------------------
|
||
# Copyright (c) 2015-2018 宝塔软件(http:#bt.cn) All rights reserved.
|
||
#-------------------------------------------------------------------
|
||
# Author: 黄文良 <287962566@qq.com>
|
||
#-------------------------------------------------------------------
|
||
|
||
#------------------------------
|
||
# Apache管理模块
|
||
#------------------------------
|
||
import public,os,re,shutil,math,psutil,time
|
||
os.chdir("/www/server/panel")
|
||
|
||
class apache:
|
||
setupPath = '/www/server'
|
||
apachedefaultfile = "%s/apache/conf/extra/httpd-default.conf" % (setupPath)
|
||
apachempmfile = "%s/apache/conf/extra/httpd-mpm.conf" % (setupPath)
|
||
|
||
def GetProcessCpuPercent(self,i,process_cpu):
|
||
try:
|
||
pp = psutil.Process(i)
|
||
if pp.name() not in process_cpu.keys():
|
||
process_cpu[pp.name()] = float(pp.cpu_percent(interval=0.1))
|
||
process_cpu[pp.name()] += float(pp.cpu_percent(interval=0.1))
|
||
except:
|
||
pass
|
||
|
||
def GetApacheStatus(self):
|
||
process_cpu = {}
|
||
apacheconf = "%s/apache/conf/httpd.conf" % (self.setupPath)
|
||
confcontent = public.readFile(apacheconf)
|
||
rep = "#Include conf/extra/httpd-info.conf"
|
||
if re.search(rep,confcontent):
|
||
confcontent = re.sub(rep,"Include conf/extra/httpd-info.conf",confcontent)
|
||
public.writeFile(apacheconf,confcontent)
|
||
public.serviceReload()
|
||
result = public.HttpGet('http://127.0.0.1/server-status?auto')
|
||
workermen = int(public.ExecShell("ps aux|grep httpd|grep 'start'|awk '{memsum+=$6};END {print memsum}'")[0]) / 1024
|
||
for proc in psutil.process_iter():
|
||
if proc.name() == "httpd":
|
||
self.GetProcessCpuPercent(proc.pid,process_cpu)
|
||
time.sleep(0.5)
|
||
|
||
data = {}
|
||
|
||
# 计算启动时间
|
||
Uptime = int(re.search("ServerUptimeSeconds:\s+(.*)",result).group(1))
|
||
min = Uptime / 60
|
||
hours = min / 60
|
||
days = math.floor(hours / 24)
|
||
hours = math.floor(hours - (days * 24))
|
||
min = math.floor(min - (days * 60 * 24) - (hours * 60))
|
||
|
||
#格式化重启时间
|
||
restarttime = re.search("RestartTime:\s+(.*)",result).group(1)
|
||
rep = "\w+,\s([\w-]+)\s([\d\:]+)\sCST"
|
||
date = re.search(rep,restarttime).group(1)
|
||
timedetail = re.search(rep,restarttime).group(2)
|
||
monthen = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
|
||
n = 0
|
||
for m in monthen:
|
||
if m in date:
|
||
date = re.sub(m,str(n+1),date)
|
||
n+=1
|
||
date = date.split("-")
|
||
date = "%s-%s-%s" % (date[2],date[1],date[0])
|
||
|
||
reqpersec = re.search("ReqPerSec:\s+(.*)", result).group(1)
|
||
if re.match("^\.", reqpersec):
|
||
reqpersec = "%s%s" % (0,reqpersec)
|
||
data["RestartTime"] = "%s %s" % (date,timedetail)
|
||
data["UpTime"] = "%s day %s hour %s minute" % (str(int(days)),str(int(hours)),str(int(min)))
|
||
data["TotalAccesses"] = re.search("Total Accesses:\s+(\d+)",result).group(1)
|
||
data["TotalKBytes"] = re.search("Total kBytes:\s+(\d+)",result).group(1)
|
||
data["ReqPerSec"] = round(float(reqpersec), 2)
|
||
data["BusyWorkers"] = re.search("BusyWorkers:\s+(\d+)",result).group(1)
|
||
data["IdleWorkers"] = re.search("IdleWorkers:\s+(\d+)",result).group(1)
|
||
data["workercpu"] = round(float(process_cpu["httpd"]),2)
|
||
data["workermem"] = "%s%s" % (int(workermen),"MB")
|
||
return data
|
||
|
||
def GetApacheValue(self):
|
||
apachedefaultcontent = public.readFile(self.apachedefaultfile)
|
||
apachempmcontent = public.readFile(self.apachempmfile)
|
||
ps = ["%s,%s" % (public.GetMsg("SECOND"),public.GetMsg("REQUEST_TIMEOUT_TIME")),
|
||
public.GetMsg("KEEP_ALIVE"),
|
||
"%s,%s" % (public.GetMsg("SECOND"),public.GetMsg("CONNECT_TIMEOUT_TIME")),
|
||
public.GetMsg("MAX_KEEP_ALIVE_REQUESTS")]
|
||
gets = ["Timeout","KeepAlive","KeepAliveTimeout","MaxKeepAliveRequests"]
|
||
if public.get_webserver() == 'apache':
|
||
shutil.copyfile(self.apachedefaultfile, '/tmp/apdefault_file_bk.conf')
|
||
shutil.copyfile(self.apachempmfile, '/tmp/apmpm_file_bk.conf')
|
||
conflist = []
|
||
n = 0
|
||
for i in gets:
|
||
rep = "(%s)\s+(\w+)" % i
|
||
k = re.search(rep, apachedefaultcontent).group(1)
|
||
v = re.search(rep, apachedefaultcontent).group(2)
|
||
psstr = ps[n]
|
||
kv = {"name":k,"value":v,"ps":psstr}
|
||
conflist.append(kv)
|
||
n += 1
|
||
|
||
ps = [public.GetMsg("DEFUALT_PROCESSES"),
|
||
public.GetMsg("MAX_SPARE_SERVERS"),
|
||
"%s,%s" % (public.GetMsg("MAX_CONNECTIONS"),public.GetMsg("NOT_LIMITED_BY_0")),
|
||
public.GetMsg("MAX_PROCESSES")]
|
||
gets = ["StartServers","MaxSpareServers","MaxConnectionsPerChild","MaxRequestWorkers"]
|
||
n = 0
|
||
for i in gets:
|
||
rep = "(%s)\s+(\w+)" % i
|
||
k = re.search(rep, apachempmcontent).group(1)
|
||
v = re.search(rep, apachempmcontent).group(2)
|
||
psstr = ps[n]
|
||
kv = {"name": k, "value": v, "ps": psstr}
|
||
conflist.append(kv)
|
||
n += 1
|
||
return(conflist)
|
||
|
||
def SetApacheValue(self,get):
|
||
apachedefaultcontent = public.readFile(self.apachedefaultfile)
|
||
apachempmcontent = public.readFile(self.apachempmfile)
|
||
conflist = []
|
||
getdict = get.__dict__
|
||
for i in getdict.keys():
|
||
if i != "__module__" and i != "__doc__" and i != "data" and i != "args" and i != "action":
|
||
getpost = {
|
||
"name": i,
|
||
"value": str(getdict[i])
|
||
}
|
||
conflist.append(getpost)
|
||
public.writeFile("/tmp/list",str(conflist))
|
||
for c in conflist:
|
||
if c["name"] == "KeepAlive":
|
||
if not re.search("on|off", c["value"]):
|
||
return public.returnMsg(False, "INIT_ARGS_ERR")
|
||
else:
|
||
print(c["value"])
|
||
if not re.search("\d+", c["value"]):
|
||
print(c["name"],c["value"])
|
||
return public.returnMsg(False, 'INIT_ARGS_ERR')
|
||
|
||
rep = "%s\s+\w+" % c["name"]
|
||
if re.search(rep,apachedefaultcontent):
|
||
newconf = "%s %s" % (c["name"],c["value"])
|
||
apachedefaultcontent = re.sub(rep,newconf,apachedefaultcontent)
|
||
elif re.search(rep,apachempmcontent):
|
||
newconf = "%s\t\t\t%s" % (c["name"], c["value"])
|
||
apachempmcontent = re.sub(rep, newconf , apachempmcontent,count = 1)
|
||
public.writeFile(self.apachedefaultfile,apachedefaultcontent)
|
||
public.writeFile(self.apachempmfile, apachempmcontent)
|
||
isError = public.checkWebConfig()
|
||
if (isError != True):
|
||
shutil.copyfile('/tmp/_file_bk.conf', self.apachedefaultfile)
|
||
shutil.copyfile('/tmp/proxyfile_bk.conf', self.apachempmfile)
|
||
return public.returnMsg(False, 'ERROR: %s<br><a style="color:red;">' % public.GetMsg("CONFIG_ERROR") + isError.replace("\n",
|
||
'<br>') + '</a>')
|
||
public.serviceReload()
|
||
return public.returnMsg(True, 'SET_SUCCESS')
|