280 lines
10 KiB
Python
280 lines
10 KiB
Python
# coding: utf-8
|
|
# -------------------------------------------------------------------
|
|
# YakPanel
|
|
# -------------------------------------------------------------------
|
|
# Copyright (c) 2015-2099 YakPanel(www.yakpanel.com) All rights reserved.
|
|
# -------------------------------------------------------------------
|
|
# Author: zhwwen <zhw@yakpanel.com>
|
|
# -------------------------------------------------------------------
|
|
#
|
|
# ------------------------------
|
|
# OLS管理模块
|
|
# ------------------------------
|
|
import public,re,json,os
|
|
|
|
class ols:
|
|
_main_conf_path = '/usr/local/lsws/conf/httpd_config.conf'
|
|
_detail_conf_path = '/www/server/panel/vhost/openlitespeed/detail/{}.conf'
|
|
|
|
def get_value(self,get):
|
|
"""
|
|
:param get:
|
|
get.sitename
|
|
:return:
|
|
"""
|
|
keys = ["enableGzipCompress","gzipCompressLevel","rollingSize","maxConnections","maxSSLConnections","connTimeout","maxKeepAliveReq"]
|
|
conf = public.readFile(self._main_conf_path)
|
|
if not conf:
|
|
return {}
|
|
data = {}
|
|
for k in keys:
|
|
rep = r'{}\s+(\w+)'.format(k)
|
|
tmp = re.search(rep,conf)
|
|
if tmp:
|
|
data[k] = tmp.groups(1)
|
|
else:
|
|
data[k] = ''
|
|
return data
|
|
|
|
def set_value(self,get):
|
|
"""
|
|
:param get:
|
|
get.array
|
|
:return:
|
|
"""
|
|
conf = public.readFile(self._main_conf_path)
|
|
data = json.loads(get.array)
|
|
for k in data:
|
|
rep = r'{}\s+(\w+)'.format(k)
|
|
tmp = re.search(rep,conf)
|
|
if tmp:
|
|
conf = re.sub('{}.*'.format(k),'{} {}'.format(k,data[k]),conf)
|
|
else:
|
|
conf = conf + '\n{} {}'.format(k,data[k])
|
|
public.writeFile(self._main_conf_path,conf)
|
|
public.serviceReload()
|
|
return public.success_v2("Setup Successfully!")
|
|
|
|
# 获取站点静态文件缓存配置
|
|
def get_static_cache(self,get):
|
|
data = {}
|
|
sitename = public.M('sites').where("id=?", (get.id,)).getField('name')
|
|
conf = public.readFile(self._detail_conf_path.format(sitename))
|
|
rep = r'expiresByType\s+(.*)'
|
|
tmp = re.search(rep,conf)
|
|
|
|
if tmp:
|
|
tmp = tmp.groups(1)[0].split(',')
|
|
for i in tmp:
|
|
if 'image' in i:
|
|
rep = r'image\/\*=A(\d+)'
|
|
data['image'] = re.search(rep,conf).groups(1)[0]
|
|
print(data['image'])
|
|
if 'css' in i:
|
|
rep = r'css=A(\d+)'
|
|
data['css'] = re.search(rep, conf).groups(1)[0]
|
|
if 'javascript' in i:
|
|
rep = r'javascript=A(\d+)'
|
|
data['javascript'] = re.search(rep, conf).groups(1)[0]
|
|
if 'font' in i:
|
|
rep = r'font.*=A(\d+)'
|
|
data['font'] = re.search(rep, conf).groups(1)[0]
|
|
return data
|
|
|
|
def set_static_cache(self,get):
|
|
"""
|
|
:param get:
|
|
get.values
|
|
get.id
|
|
:return:
|
|
"""
|
|
try:
|
|
sitename = public.M('sites').where("id=?", (get.id,)).getField('name')
|
|
conf = public.readFile(self._detail_conf_path.format(sitename))
|
|
print(self._detail_conf_path.format(sitename))
|
|
values = json.loads(get.values)
|
|
for k in values:
|
|
rep = r'{}/[\*\w+=]=A\d+'.format(k)
|
|
old_cache = re.search(rep,conf)
|
|
if not old_cache:
|
|
continue
|
|
old_cache = old_cache.group()
|
|
new_cache = re.sub(r'\d+',values[k],old_cache)
|
|
conf = conf.replace(old_cache,new_cache)
|
|
public.writeFile(self._detail_conf_path.format(sitename),conf)
|
|
public.serviceReload()
|
|
return public.return_msg_gettext(True, public.lang("Setup Successfully!"))
|
|
except Exception as e:
|
|
return e
|
|
|
|
def get_private_cache_conf(self,id):
|
|
sitepath = public.M('sites').where("id=?", (id,)).getField('path')
|
|
# 获取动态缓存配置
|
|
file = "{}/.htaccess".format(sitepath)
|
|
conf = ''
|
|
if os.path.exists(file):
|
|
conf = public.readFile(file)
|
|
return conf,file
|
|
|
|
def get_private_cache(self,get):
|
|
"""
|
|
:param get:
|
|
get.id
|
|
:return:
|
|
"""
|
|
conf = self.get_private_cache_conf(get.id)[0]
|
|
rep = '#*BTLSCACHE(.|\n)+BTLSCACHE_END.*'
|
|
tmp = re.search(rep,conf)
|
|
data = {}
|
|
if tmp:
|
|
# 获取排除文件
|
|
tmp = tmp.group()
|
|
rep = r'#\s*excluding.*\n.*\((.*)\)'
|
|
tmp = re.search(rep,tmp)
|
|
if tmp:
|
|
data['exclude_file'] = [i+'.php' for i in tmp.groups(1)[0].split('|')]
|
|
print(data)
|
|
# 获取缓存时间
|
|
rep = r'max-age=(\d+)'
|
|
tmp = re.search(rep,conf)
|
|
if tmp:
|
|
data['maxage'] = tmp.groups(1)[0]
|
|
return data
|
|
|
|
def get_private_cache_status(self,get):
|
|
conf = self.get_private_cache_conf(get.id)[0]
|
|
if 'BTLSCACHE_BEGIN' not in conf:
|
|
return False
|
|
return True
|
|
|
|
def switch_private_cache(self,get):
|
|
"""
|
|
get.id
|
|
:param get:
|
|
:return:
|
|
"""
|
|
conf = self.get_private_cache_conf(get.id)[0]
|
|
file = self.get_private_cache_conf(get.id)[1]
|
|
if 'BTLSCACHE_BEGIN' not in conf:
|
|
confstr = r"""#######################BTLSCACHE_BEGIN#######################
|
|
|
|
<IfModule LiteSpeed>
|
|
RewriteEngine on
|
|
CacheLookup on
|
|
# for those not met above condition, enable private cache.
|
|
RewriteCond %{REQUEST_METHOD} ^HEAD|GET$
|
|
## select which pages to serve from private cache
|
|
RewriteCond %{HTTP_COOKIE} !page_contain_cachetoken=yes
|
|
# with other condition
|
|
RewriteCond %{QUERY_STRING} !s=[a-fA-F0-9]{32}
|
|
# excluding certain URLs
|
|
RewriteCond %{REQUEST_URI} !/(login|register|usercp|private|profile|cron|image)\.php$
|
|
# private cache for however long set in cache policy for php pages only
|
|
RewriteRule (.*\.php)?$ - [E=Cache-Control:max-age=120]
|
|
RewriteRule (.*\.php)?$ - [E=Cache-Control:private]
|
|
</IfModule>
|
|
|
|
#######################BTLSCACHE_END#######################
|
|
"""
|
|
with open(file, "r+") as f:
|
|
f.seek(0)
|
|
f.write(confstr)
|
|
f.write(conf)
|
|
f.close()
|
|
public.serviceReload()
|
|
return public.return_msg_gettext(True, public.lang("Setup successfully!"))
|
|
else:
|
|
bt_conf_rep = '#.*BTLSCACHE_BEGIN(.|\n)+BTLSCACHE_END#*\n'
|
|
conf = re.sub(bt_conf_rep,'',conf)
|
|
print(conf)
|
|
public.writeFile(file,conf)
|
|
public.serviceReload()
|
|
return public.return_msg_gettext(True, public.lang("Setup successfully!"))
|
|
|
|
def set_private_cache(self,get):
|
|
"""
|
|
get.exclude_file
|
|
get.max_age
|
|
:param get:
|
|
:return:
|
|
"""
|
|
conf = self.get_private_cache_conf(get.id)[0]
|
|
file_name = self.get_private_cache_conf(get.id)[1]
|
|
bt_conf_rep = '#.*BTLSCACHE_BEGIN(.|\n)+BTLSCACHE_END#*\n'
|
|
bt_conf = re.search(bt_conf_rep, conf)
|
|
if bt_conf:
|
|
bt_conf = bt_conf.group()
|
|
exclude_files = []
|
|
for file in get.exclude_file.split('\n'):
|
|
exclude_files.append(file.split('.')[0])
|
|
exclude_file = "|".join(exclude_files)
|
|
old_exc_rep = r'RewriteCond\s+\%\{REQUEST_URI\}\s+\!/\(.*\)\\\.php\$'
|
|
new_exc = 'RewriteCond %{REQUEST_URI} !/(' + exclude_file + r')\.php$'
|
|
bt_conf = re.sub(old_exc_rep,new_exc,bt_conf)
|
|
old_max_age_rep = r'max-age=\d+'
|
|
new_max_age = 'max-age={}'.format(int(get.max_age))
|
|
bt_conf = re.sub(old_max_age_rep,new_max_age,bt_conf)
|
|
conf = re.sub(bt_conf_rep,bt_conf,conf)
|
|
public.writeFile(file_name,conf)
|
|
public.serviceReload()
|
|
return public.return_msg_gettext(True, public.lang("Setup successfully!"))
|
|
|
|
def _get_site_domain(self):
|
|
site = []
|
|
site_list = public.M("sites").field("id,name").select()
|
|
for i in site_list:
|
|
domain_list = public.M("domain").where("pid=?", (i["id"],)).field("name").select()
|
|
l = []
|
|
for domain in domain_list:
|
|
l.append(domain["name"])
|
|
# site[i["name"]] = l
|
|
site.append({'sitename':i["name"],'domainlist':l})
|
|
return site
|
|
|
|
def _get_need_create_site(self):
|
|
siteinfo = self._get_site_domain()
|
|
data = []
|
|
for s in siteinfo:
|
|
path = '/www/server/panel/vhost/openlitespeed/{}.conf'.format(s['sitename'])
|
|
if not os.path.exists(path):
|
|
data.append(s)
|
|
return data
|
|
|
|
def _get_siteconf_info(self):
|
|
siteinfo = self._get_need_create_site()
|
|
phpv_reg = r'enable-php-(\w+)\.conf'
|
|
rundir_reg = r'root\s+(.*);'
|
|
for s in siteinfo:
|
|
path = '/www/server/panel/vhost/nginx/{}.conf'.format(s['sitename'])
|
|
conf = public.readFile(path)
|
|
ap_path = '/www/server/panel/vhost/apache/{}.conf'.format(s['sitename'])
|
|
ap_conf = public.readFile(ap_path)
|
|
tmp = re.search(r'ServerName\s+SSL\.(.*)',ap_conf)
|
|
s['phpv'] = re.search(phpv_reg,conf).groups(1)[0]
|
|
s['rundir'] = re.search(rundir_reg.format(s),conf).groups(1)[0]
|
|
s['ssl_domain'] =tmp.groups(1)[0] if tmp else None
|
|
s['port'] = re.search(r'listen\s+(\d+);',conf).groups(1)[0]
|
|
return siteinfo
|
|
|
|
def _make_args(self):
|
|
# 获取没有ols配置的域名
|
|
|
|
# 获取php版本和执行目录和是否开启ssl
|
|
siteinfo = self._get_siteconf_info()
|
|
return siteinfo
|
|
|
|
def init_ols(self,get):
|
|
# 构造需要传入的参数
|
|
import panelSite
|
|
ps = panelSite.panelSite()
|
|
siteinfo = self._make_args()
|
|
for s in siteinfo:
|
|
# 创建配置文件
|
|
get.port = s['port']
|
|
get.webname = {'domain':s['sitename'],'domainlist':s['domainlist']}
|
|
ps.openlitespeed_add_site(get,siteinfo)
|
|
# 处理证书
|
|
if s['ssl_domain']:
|
|
get.first_domain = s['ssl_domain']
|
|
ps.set_ols_ssl(get,s['ssl_domain'])
|