Download bt-source/panel/class/apache.py from SZFSPC/apple: direct link, hf CLI and curl.
- Browser
- Download file 10.6 kB
-
https://huggingface.co/spaces/SZFSPC/apple/resolve/main/bt-source/panel/class/apache.py
- Command line
-
hf download hf://spaces/SZFSPC/apple/bt-source/panel/class/apache.py
-
curl -L -o apache.py https://huggingface.co/spaces/SZFSPC/apple/resolve/main/bt-source/panel/class/apache.py
10.6 kB
| # coding: utf-8 | |
| # ------------------------------------------------------------------- | |
| # 宝塔Linux面板 | |
| # ------------------------------------------------------------------- | |
| # Copyright (c) 2015-2018 宝塔软件(http:#bt.cn) All rights reserved. | |
| # ------------------------------------------------------------------- | |
| # Author: hwliang <hwl@bt.cn> | |
| # ------------------------------------------------------------------- | |
| # ------------------------------ | |
| # 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) | |
| apachedefaultfile_backup = '/tmp/apdefault_file_bk.conf' | |
| apachempmfile_backup = '/tmp/apmpm_file_bk.conf' | |
| 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) | |
| if not confcontent: | |
| return public.returnMsg(False, "获取配置文件错误") | |
| 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') | |
| try: | |
| workermen = int( | |
| public.ExecShell("ps aux|grep httpd|grep 'start'|awk '{memsum+=$6};END {print memsum}'")[0]) / 1024 | |
| except: | |
| return public.returnMsg(False, "获取内存错误") | |
| for proc in psutil.process_iter(): | |
| if proc.name() == "httpd": | |
| self.GetProcessCpuPercent(proc.pid, process_cpu) | |
| time.sleep(0.5) | |
| data = {} | |
| # 计算启动时间 | |
| try: | |
| Uptime = re.search("ServerUptimeSeconds:\s+(.*)", result) | |
| except TypeError: | |
| return public.returnMsg(False, "获取启动时间错误") | |
| if not Uptime: | |
| return public.returnMsg(False, "获取启动时间错误") | |
| Uptime = int(Uptime.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) | |
| if not restarttime: | |
| return public.returnMsg(False, "获取重启时间错误") | |
| restarttime = restarttime.group(1) | |
| rep = "\w+,\s([\w-]+)\s([\d\:]+)\s\w+" | |
| date = re.search(rep, restarttime) | |
| if not date: | |
| return public.returnMsg(False, "获取日期错误") | |
| date = date.group(1) | |
| timedetail = re.search(rep, restarttime) | |
| if not timedetail: | |
| return public.returnMsg(False, "获取时间详情错误") | |
| timedetail = timedetail.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) | |
| if not reqpersec: | |
| return public.returnMsg(False, "获取 reqpersec 错误") | |
| reqpersec = reqpersec.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))) | |
| total_acc = re.search("Total Accesses:\s+(\d+)", result) | |
| if not total_acc: | |
| return public.returnMsg(False, "获取 TotalAccesses 错误") | |
| data["TotalAccesses"] = total_acc.group(1) | |
| total_kb = re.search("Total kBytes:\s+(\d+)", result) | |
| if not total_kb: | |
| return public.returnMsg(False, "获取 TotalKBytes 错误") | |
| data["TotalKBytes"] = total_kb.group(1) | |
| data["ReqPerSec"] = round(float(reqpersec), 2) | |
| busywork = re.search("BusyWorkers:\s+(\d+)", result) | |
| if not busywork: | |
| return public.returnMsg(False, "获取 BusyWorkers 错误") | |
| data["BusyWorkers"] = busywork.group(1) | |
| idlework = re.search("IdleWorkers:\s+(\d+)", result) | |
| if not idlework: | |
| return public.returnMsg(False, "获取 IdleWorkers 错误") | |
| data["IdleWorkers"] = idlework.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) | |
| if not apachempmcontent: | |
| return public.returnMsg(False, "没有找到 /www/server/apache/conf/extra/httpd-mpm.conf 配置") | |
| if not "mpm_event_module" in apachempmcontent: | |
| return public.returnMsg(False, | |
| "没有找到 mpm_event_module 配置或 /www/server/apache/conf/extra/httpd-mpm.conf 配置为空") | |
| apachempmcontent = re.search("\<IfModule mpm_event_module\>(\n|.)+?\</IfModule\>", apachempmcontent).group() | |
| ps = ["秒,请求超时时间", "保持连接", "秒,连接超时时间", "单次连接最大请求数"] | |
| gets = ["Timeout", "KeepAlive", "KeepAliveTimeout", "MaxKeepAliveRequests"] | |
| if public.get_webserver() == 'apache': | |
| shutil.copyfile(self.apachedefaultfile, self.apachedefaultfile_backup) | |
| shutil.copyfile(self.apachempmfile, self.apachempmfile_backup) | |
| conflist = [] | |
| n = 0 | |
| for i in gets: | |
| rep = "(%s)\s+(\w+)" % i | |
| k = re.search(rep, apachedefaultcontent) | |
| if not k: | |
| return public.returnMsg(False,"获取 key {} 失败,请检查配置文件中/www/server/apache/conf/extra/httpd-mpm.conf的{}配置是否正常".format(k,i)) | |
| k = k.group(1) | |
| v = re.search(rep, apachedefaultcontent) | |
| if not v: | |
| return public.returnMsg(False,"获取 value {} 失败,请检查配置文件中/www/server/apache/conf/extra/httpd-mpm.conf的{}配置是否正常".format(v,i)) | |
| v = v.group(2) | |
| psstr = ps[n] | |
| kv = {"name": k, "value": v, "ps": psstr} | |
| conflist.append(kv) | |
| n += 1 | |
| ps = ["启动时默认进程数", "最大空闲线程数", "可用于处理请求峰值的最小空闲线程数", "每个子进程创建的线程数", | |
| "将同时处理的最大连接数", "限制单个子服务在生命周期内处理的连接数"] | |
| gets = ["StartServers", "MaxSpareThreads", "MinSpareThreads", "ThreadsPerChild", "MaxRequestWorkers", | |
| "MaxConnectionsPerChild"] | |
| n = 0 | |
| for i in gets: | |
| rep = "(%s)\s+(\w+)" % i | |
| k = re.search(rep, apachempmcontent) | |
| if not k: | |
| return public.returnMsg(False,"获取 key {} 失败,请检查配置文件中/www/server/apache/conf/extra/httpd-mpm.conf的{}配置是否正常".format(k,i)) | |
| k = k.group(1) | |
| v = re.search(rep, apachempmcontent) | |
| if not v: | |
| return public.returnMsg(False,"获取 value {} 失败,请检查配置文件中/www/server/apache/conf/extra/httpd-mpm.conf的{}配置是否正常".format(v,i)) | |
| v = v.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) | |
| if not "mpm_event_module" in apachempmcontent: | |
| return public.returnMsg(False, | |
| "没有找到 mpm_event_module 配置或 /www/server/apache/conf/extra/httpd-mpm.conf 配置为空") | |
| allow_fields = ["Timeout", "KeepAlive", "KeepAliveTimeout", "MaxKeepAliveRequests", "StartServers", | |
| "MaxSpareThreads", "MinSpareThreads", "ThreadsPerChild", "MaxRequestWorkers", | |
| "MaxConnectionsPerChild"] | |
| for _k in allow_fields: | |
| val = get.get(_k) | |
| if _k == "KeepAlive": | |
| if not val in ['On', 'Off']: | |
| return public.returnMsg(False, f'参数值错误({_k})') | |
| if _k != "KeepAlive": | |
| try: | |
| val = int(float(val)) | |
| if val < 0: raise ValueError() | |
| val = str(val) | |
| except Exception as e: | |
| return public.returnMsg(False, f'{_k} 参数值错误,请输入正整数。') | |
| _kv = (_k, val) | |
| rep = f"{_k}\s+\w+" | |
| if re.search(rep, apachedefaultcontent): | |
| newconf = "%s %s" % _kv | |
| apachedefaultcontent = re.sub(rep, newconf, apachedefaultcontent) | |
| elif re.search(rep, apachempmcontent): | |
| newconf = "%s\t\t\t%s" % _kv | |
| apachempmcontent = re.sub(rep, newconf, apachempmcontent) | |
| public.writeFile(self.apachedefaultfile, apachedefaultcontent) | |
| public.writeFile(self.apachempmfile, apachempmcontent) | |
| isError = public.checkWebConfig() | |
| if (isError != True): | |
| shutil.copyfile(self.apachedefaultfile_backup, self.apachedefaultfile) | |
| shutil.copyfile(self.apachempmfile_backup, self.apachempmfile) | |
| return public.returnMsg(False, 'ERROR: 配置出错<br><a style="color:red;">' + isError.replace("\n", | |
| '<br>') + '</a>') | |
| public.serviceReload() | |
| return public.returnMsg(True, '设置成功') | |