diff --git a/web/admin/setting/temp_login.py b/web/admin/setting/temp_login.py
index 51f12a268..95156b579 100644
--- a/web/admin/setting/temp_login.py
+++ b/web/admin/setting/temp_login.py
@@ -23,6 +23,7 @@ from admin.user_login_check import panel_login_required
import core.mw as mw
import utils.config as utils_config
+import thisdb
from .setting import blueprint
@@ -34,24 +35,11 @@ def get_temp_login():
p = request.form.get('page', '1').strip()
tojs = request.form.get('tojs', '').strip()
- count = TempLogin.query.filter_by().count()
- pagination = TempLogin.query.filter_by().order_by(TempLogin.expire.desc()).paginate(page=int(p), per_page=int(limit))
-
- rows = []
- for item in pagination.items:
- t = {}
- t['id'] = item.id
- t['salt'] = item.salt
- t['state'] = item.state
- t['expire'] = item.expire
- t['login_time'] = item.login_time
- t['login_addr'] = item.login_addr
- t['add_time'] = item.add_time
- rows.append(t)
+ info = thisdb.getTempLoginPage(int(p), int(limit))
data = {}
- data['data'] = rows
- data['page'] = mw.getPage({'count':count,'tojs':'setTempAccessReq','p':p,'row':limit})
+ data['data'] = info['list']
+ data['page'] = mw.getPage({'count':info['count'],'tojs':'setTempAccessReq','p':p,'row':limit})
return data
@blueprint.route('/set_temp_login', endpoint='set_temp_login', methods=['POST'])
@@ -59,38 +47,27 @@ def get_temp_login():
def set_temp_login():
# if 'tmp_login_expire' in session:
# return mw.returnData(False, '没有权限')
+
+
+ thisdb.clearTempLogin()
+
start_time = int(time.time())
- model.clearTempLogin()
-
-
- token = mw.getRandomString(48)
- salt = mw.getRandomString(12)
-
- expire=start_time+3600
- make_token = mw.md5(token + salt)
- add_tl = TempLogin(
- token=make_token,
- salt=salt,
- state=0,
- login_time=0,
- login_addr='',
- expire=expire,
- add_time=start_time)
- r = db.session.add(add_tl)
- db.session.commit()
-
- if r is None:
+ expire = start_time+3600
+
+ rand_str = mw.getRandomString(48)
+ token = mw.md5(rand_str)
+
+ r = thisdb.addTempLogin(token, expire)
+ if r > 0:
mw.writeLog('面板设置', '生成临时连接,过期时间:{}'.format(mw.formatDate(times=expire)))
- return {'status': True, 'msg': "临时连接已生成", 'token': make_token, 'expire': expire}
+ return {'status': True, 'msg': "临时连接已生成", 'token': token, 'expire': expire}
return mw.returnData(False, '连接生成失败')
@blueprint.route('/remove_temp_login', endpoint='remove_temp_login', methods=['POST'])
@panel_login_required
def remove_temp_login():
tl_id = request.form.get('id', '10').strip()
-
- r = TempLogin.query.filter(TempLogin.id == tl_id).delete()
- db.session.commit()
+ r = thisdb.deleteTempLoginById(tl_id)
if r > 0:
mw.writeLog('面板设置', '删除临时登录连接')
return mw.returnData(True, '删除成功')
diff --git a/web/admin/setup/sql/default.sql b/web/admin/setup/sql/default.sql
index ec3bc47d0..794ede180 100755
--- a/web/admin/setup/sql/default.sql
+++ b/web/admin/setup/sql/default.sql
@@ -12,9 +12,9 @@ CREATE TABLE IF NOT EXISTS `backup` (
CREATE TABLE IF NOT EXISTS `binding` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`pid` INTEGER,
+ `port` INTEGER,
`domain` TEXT,
`path` TEXT,
- `port` INTEGER,
`add_time` TEXT
);
@@ -49,7 +49,7 @@ CREATE TABLE IF NOT EXISTS `firewall` (
ALTER TABLE `firewall` ADD COLUMN `protocol` TEXT DEFAULT 'tcp';
-INSERT INTO `firewall` (`id`, `port`, `protocol`, `ps`, `add_time`) VALUES
+INSERT INTO `firewall` (`id`, `port`, `protocol`, `ps`, `add_time`, `update_time`) VALUES
(1, '80', 'tcp','网站默认端口', '0000-00-00 00:00:00','0000-00-00 00:00:00'),
(2, '443', 'tcp/udp', 'HTTPS', '0000-00-00 00:00:00','0000-00-00 00:00:00');
diff --git a/web/admin/site/__init__.py b/web/admin/site/__init__.py
index 3bdf5979d..7752645d5 100644
--- a/web/admin/site/__init__.py
+++ b/web/admin/site/__init__.py
@@ -17,6 +17,7 @@ from admin.model import Sites
from admin.user_login_check import panel_login_required
from utils.plugin import plugin as MwPlugin
+from utils.site import sites as MwSites
import utils.site as site
import core.mw as mw
import thisdb
@@ -42,7 +43,7 @@ def list():
data['page'] = mw.getPage({'count':info['count'],'tojs':'getWeb','p':p, 'row':limit})
return data
-#添加站点
+# 添加站点
@blueprint.route('/add', endpoint='add',methods=['POST'])
@panel_login_required
def add():
@@ -51,7 +52,15 @@ def add():
path = request.form.get('path', '')
version = request.form.get('version', '')
port = request.form.get('port', '')
- return []
+ return MwSites.instance().add(webname, port, ps, path, version)
+
+# 站点删除
+@blueprint.route('/delete', endpoint='delete',methods=['POST'])
+@panel_login_required
+def delete():
+ site_id = request.form.get('id', '')
+ path = request.form.get('path', '')
+ return MwSites.instance().delete(site_id, path)
# 获取站点类型
@blueprint.route('/get_site_types', endpoint='get_site_types',methods=['POST'])
@@ -87,9 +96,39 @@ def check_web_status():
@blueprint.route('/get_php_version', endpoint='get_php_version',methods=['POST'])
@panel_login_required
def get_php_version():
- return site.getPhpVersion()
+ return MwSites.instance().getPhpVersion()
+
+
+# 设置网站到期
+@blueprint.route('/set_end_date', endpoint='set_end_date',methods=['POST'])
+@panel_login_required
+def set_end_date():
+ site_id = request.form.get('id', '')
+ edate = request.form.get('edate', '')
+ return MwSites.instance().setEndDate(site_id, edate)
+
+
+# 设置网站备注
+@blueprint.route('/set_ps', endpoint='set_ps',methods=['POST'])
+@panel_login_required
+def set_ps():
+ site_id = request.form.get('id', '')
+ ps = request.form.get('ps', '')
+ return MwSites.instance().setPs(site_id, ps)
+# 设置默认网站信息
+@blueprint.route('/get_default_site', endpoint='get_default_site',methods=['POST'])
+@panel_login_required
+def get_default_site():
+ return MwSites.instance().getDefaultSite()
+
+@blueprint.route('/set_default_site', endpoint='set_default_site',methods=['POST'])
+@panel_login_required
+def set_default_site():
+ name = request.form.get('name', '')
+ return MwSites.instance().setDefaultSite(name)
+
@blueprint.route('/get_cli_php_version', endpoint='get_cli_php_version',methods=['POST'])
@panel_login_required
def get_cli_php_version():
@@ -98,7 +137,7 @@ def get_cli_php_version():
return mw.returnData(False, '未安装PHP,无法设置')
php_bin = '/usr/bin/php'
- php_versions = site.getPhpVersion()
+ php_versions = MwSites.instance().getPhpVersion()
php_versions = php_versions[1:]
if len(php_versions) < 1:
@@ -117,35 +156,7 @@ def get_cli_php_version():
def set_cli_php_version():
if mw.isAppleSystem():
return mw.returnData(False, "开发机不可设置!")
-
version = request.form.get('version', '')
-
- php_bin = '/usr/bin/php'
- php_bin_src = "/www/server/php/%s/bin/php" % version
- php_ize = '/usr/bin/phpize'
- php_ize_src = "/www/server/php/%s/bin/phpize" % version
- php_fpm = '/usr/bin/php-fpm'
- php_fpm_src = "/www/server/php/%s/sbin/php-fpm" % version
- php_pecl = '/usr/bin/pecl'
- php_pecl_src = "/www/server/php/%s/bin/pecl" % version
- php_pear = '/usr/bin/pear'
- php_pear_src = "/www/server/php/%s/bin/pear" % version
- if not os.path.exists(php_bin_src):
- return mw.returnData(False, '指定PHP版本未安装!')
-
- is_chattr = mw.execShell('lsattr /usr|grep /usr/bin')[0].find('-i-')
- if is_chattr != -1:
- mw.execShell('chattr -i /usr/bin')
- mw.execShell("rm -f " + php_bin + ' ' + php_ize + ' ' +
- php_fpm + ' ' + php_pecl + ' ' + php_pear)
- mw.execShell("ln -sf %s %s" % (php_bin_src, php_bin))
- mw.execShell("ln -sf %s %s" % (php_ize_src, php_ize))
- mw.execShell("ln -sf %s %s" % (php_fpm_src, php_fpm))
- mw.execShell("ln -sf %s %s" % (php_pecl_src, php_pecl))
- mw.execShell("ln -sf %s %s" % (php_pear_src, php_pear))
- if is_chattr != -1:
- mw.execShell('chattr +i /usr/bin')
- mw.writeLog('面板设置', '设置PHP-CLI版本为: %s' % version)
- return mw.returnData(True, '设置成功!')
+ return MwSites.instance().setCliPhpVersion(version)
diff --git a/web/core/mw.py b/web/core/mw.py
index 603456371..c4c3e2450 100644
--- a/web/core/mw.py
+++ b/web/core/mw.py
@@ -879,6 +879,33 @@ def isRestart():
return False
return True
+def getAcmeDir():
+ acme = '/root/.acme.sh'
+ if isAppleSystem():
+ cmd = "who | sed -n '2, 1p' |awk '{print $1}'"
+ user = execShell(cmd)[0].strip()
+ acme = '/Users/' + user + '/.acme.sh'
+ if not os.path.exists(acme):
+ acme = '/.acme.sh'
+ return acme
+
+
+def getAcmeDomainDir(domain):
+ acme_dir = getAcmeDir()
+ acme_domain = acme_dir + '/' + domain
+ acme_domain_ecc = acme_domain + '_ecc'
+ if os.path.exists(acme_domain_ecc):
+ acme_domain = acme_domain_ecc
+ return acme_domain
+
+
+def fileNameCheck(filename):
+ f_strs = [';', '&', '<', '>']
+ for fs in f_strs:
+ if filename.find(fs) != -1:
+ return False
+ return True
+
def triggerTask():
isTask = getPanelDir() + '/logs/panel_task.lock'
writeFile(isTask, 'True')
@@ -925,6 +952,10 @@ def checkWebConfig():
def restartWeb():
return opWeb("reload")
+def deleteFile(file):
+ if os.path.exists(file):
+ os.remove(file)
+
def isInstalledWeb():
path = getServerDir() + '/openresty/nginx/sbin/nginx'
if os.path.exists(path):
diff --git a/web/static/app/site.js b/web/static/app/site.js
index 815774ad8..cf7e05ae7 100755
--- a/web/static/app/site.js
+++ b/web/static/app/site.js
@@ -72,14 +72,14 @@ $('#site_search').click(function(){
var idname = data.data[i].name.replace(/\./g,'_');
body = "
| \
- " + shortwebname + " | \
+ " + shortwebname + " | \
" + status + " | \
" + backup + " | \
" + shortpath + " | \
" + web_end_time + " | \
" + data.data[i].ps + " | \
\
- 设置\
+ 设置\
| 删除\
|
"
diff --git a/web/thisdb/__init__.py b/web/thisdb/__init__.py
index 8958fa60f..3b6f2b8a4 100644
--- a/web/thisdb/__init__.py
+++ b/web/thisdb/__init__.py
@@ -11,8 +11,12 @@
from .init import *
from .option import *
from .user import *
+
from .sites import *
+from .domain import *
+
from .tasks import *
from .logs import *
from .crontab import *
from .firewall import *
+from .temp_login import *
diff --git a/web/thisdb/binding.py b/web/thisdb/binding.py
new file mode 100644
index 000000000..5b536b465
--- /dev/null
+++ b/web/thisdb/binding.py
@@ -0,0 +1,37 @@
+# coding:utf-8
+
+# ---------------------------------------------------------------------------------
+# MW-Linux面板
+# ---------------------------------------------------------------------------------
+# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
+# ---------------------------------------------------------------------------------
+# Author: midoks
+# ---------------------------------------------------------------------------------
+
+import core.mw as mw
+
+__FIELD = 'id,pid,domain,port,path,add_time'
+
+def addBinding(pid, domain, port, path):
+ now_time = mw.getDateFromNow()
+ insert_data = {
+ 'pid': pid,
+ 'domain': domain,
+ 'port':port,
+ 'path':path,
+ 'add_time': now_time,
+ }
+ return mw.M('binding').insert(insert_data)
+
+
+def getBindingListBySiteId(site_id):
+ task_list = mw.M('binding').where('pid=?', (site_id,)).field(__FIELD).select()
+ return task_list
+
+
+
+def deleteBindingId(domain_id):
+ return mw.M('binding').where("id=?", (domain_id,)).delete()
+
+def deleteBindingBySiteId(site_id):
+ return mw.M('binding').where("pid=?", (site_id,)).delete()
diff --git a/web/thisdb/domain.py b/web/thisdb/domain.py
new file mode 100644
index 000000000..ec7d40115
--- /dev/null
+++ b/web/thisdb/domain.py
@@ -0,0 +1,30 @@
+# coding:utf-8
+
+# ---------------------------------------------------------------------------------
+# MW-Linux面板
+# ---------------------------------------------------------------------------------
+# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
+# ---------------------------------------------------------------------------------
+# Author: midoks
+# ---------------------------------------------------------------------------------
+
+import core.mw as mw
+
+__FIELD = 'id,pid,name,port,add_time'
+
+def addDomain(pid, name, port):
+ now_time = mw.getDateFromNow()
+ insert_data = {
+ 'pid': pid,
+ 'name': name,
+ 'port':port,
+ 'add_time': now_time,
+ }
+ return mw.M('domain').insert(insert_data)
+
+
+def deleteDomainId(domain_id):
+ return mw.M('domain').where("id=?", (domain_id,)).delete()
+
+def deleteDomainBySiteId(site_id):
+ return mw.M('domain').where("pid=?", (site_id,)).delete()
diff --git a/web/thisdb/sites.py b/web/thisdb/sites.py
index e20f30071..332f6b1a5 100644
--- a/web/thisdb/sites.py
+++ b/web/thisdb/sites.py
@@ -10,10 +10,35 @@
import core.mw as mw
+__FIELD = 'id,name,path,status,ps,edate,type_id,add_time,update_time'
+
def getSitesCount():
return mw.M('sites').count()
+def getSitesById(site_id):
+ return mw.M('sites').field(__FIELD).where("id=?", (site_id,)).find()
+
+def addSites(name, path):
+ now_time = mw.getDateFromNow()
+ insert_data = {
+ 'name': name,
+ 'path': path,
+ 'status': 1,
+ 'ps':name,
+ 'type_id':0,
+ 'edate':'0000-00-00',
+ 'add_time': now_time,
+ 'update_time': now_time
+ }
+ return mw.M('sites').insert(insert_data)
+
+
+def isSitesExist(name):
+ if mw.M('sites').where("name=?", (name,)).count() > 0:
+ return True
+ return False
+
def getSitesList(
page:int | None = 1,
size:int | None = 10,
@@ -29,7 +54,7 @@ def getSitesList(
sql_where = " type_id=" + str(type_id)
- dbM = dbC = mw.M('sites').field('id,name,path,status,ps,edate,type_id,add_time,update_time')
+ dbM = dbC = mw.M('sites').field(__FIELD)
if sql_where != '':
count = dbC.where(sql_where).count()
@@ -46,3 +71,19 @@ def getSitesList(
data['count'] = count
return data
+
+def deleteSitesById(site_id):
+ return mw.M('sites').where("id=?", (site_id,)).delete()
+
+def setSitesData(site_id,
+ edate: str | None = None,
+ ps: str | None = None,
+):
+ update_data = {}
+ if edate is not None:
+ update_data['edate'] = edate
+ if ps is not None:
+ update_data['ps'] = ps
+
+ return mw.M('sites').where('id=?',(site_id,)).update(update_data)
+
diff --git a/web/thisdb/temp_login.py b/web/thisdb/temp_login.py
index ab75c3923..b6ac4e840 100644
--- a/web/thisdb/temp_login.py
+++ b/web/thisdb/temp_login.py
@@ -10,19 +10,61 @@
import time
-from admin.model import db, TempLogin
-
import core.mw as mw
+__FIELD = 'id,token,salt,state,login_time,login_addr,logout_time,expire,add_time'
+
+def addTempLogin(
+ token:str | None = None,
+ expire:int | None = None
+):
+ if expire is None:
+ start_time = int(time.time())
+ expire=start_time+3600
+
+ if token is None:
+ salt = mw.getRandomString(12)
+ r = mw.getRandomString(48)
+ token = mw.md5(r + salt)
+
+ now_time = mw.formatDate()
+ insert_data = {
+ 'token':token,
+ 'salt':'0',
+ 'state':0,
+ 'login_time':0,
+ 'login_addr':'',
+ 'expire':expire,
+ 'add_time':now_time,
+ }
+
+ return mw.M('temp_login').insert(insert_data)
+
+def getTempLoginPage(
+ page: int | None = 1,
+ size: int | None = 10,
+):
+ start = (page - 1) * size
+ limit = str(start) + ',' + str(size)
+ tl_list = mw.M('temp_login').where('', ()).field(__FIELD).limit(limit).order('id desc').select()
+ count = mw.M('temp_login').where('', ()).count()
+
+ rdata = {}
+ rdata['list'] = tl_list
+ rdata['count'] = count
+ return rdata
+
def getTempLoginByToken(token,
) -> None:
'''
获取用户信息通过用户名
'''
- field = 'id,addtime,expire,login_time,login_addr,state,add_time'
- data = mw.M('temp_login').where('token=?', (token,)).field(field).order('id asc').select()
+ data = mw.M('temp_login').where('token=?', (token,)).field(__FIELD).order('id asc').find()
return data
+def deleteTempLoginById(id) :
+ return mw.M('temp_login').where('id=?', (id,)).delete()
+
def clearTempLogin()->bool:
'''
清空过期数据
diff --git a/web/thisdb/user.py b/web/thisdb/user.py
index ac94b222b..3cbaa4bc2 100644
--- a/web/thisdb/user.py
+++ b/web/thisdb/user.py
@@ -85,7 +85,7 @@ def getUserByRoot() -> None:
def updateUserLoginTime():
now_time = mw.formatDate()
- mw.M('users').field(__field).where('id=?', (1,)).update({'login_time',now_time})
+ mw.M('users').field(__field).where('id=?', (1,)).update({'login_time':now_time})
return True
def setUserByRoot(
diff --git a/web/utils/site.py b/web/utils/site.py
index 0d76ec0ff..c8562459a 100644
--- a/web/utils/site.py
+++ b/web/utils/site.py
@@ -10,13 +10,14 @@
import os
import sys
+import re
import json
+import time
import threading
import multiprocessing
-from admin import model
-
import core.mw as mw
+import thisdb
class sites(object):
@@ -31,6 +32,304 @@ class sites(object):
sites._instance = sites(*args, **kwargs)
return sites._instance
+ def __init__(self):
+ # nginx conf
+ self.setupPath = mw.getServerDir() + '/web_conf'
+ self.logsPath = mw.getLogsDir()
+
+ self.vhostPath = vhost = self.setupPath + '/nginx/vhost'
+ if not os.path.exists(vhost):
+ mw.execShell("mkdir -p " + vhost + " && chmod -R 755 " + vhost)
+ self.rewritePath = rewrite = self.setupPath + '/nginx/rewrite'
+ if not os.path.exists(rewrite):
+ mw.execShell("mkdir -p " + rewrite + " && chmod -R 755 " + rewrite)
+
+ self.passPath = passwd = self.setupPath + '/nginx/pass'
+ if not os.path.exists(passwd):
+ mw.execShell("mkdir -p " + passwd + " && chmod -R 755 " + passwd)
+
+ self.redirectPath = redirect = self.setupPath + '/nginx/redirect'
+ if not os.path.exists(redirect):
+ mw.execShell("mkdir -p " + redirect +" && chmod -R 755 " + redirect)
+
+ self.proxyPath = proxy = self.setupPath + '/nginx/proxy'
+ if not os.path.exists(proxy):
+ mw.execShell("mkdir -p " + proxy + " && chmod -R 755 " + proxy)
+
+ # ssl conf
+ self.sslDir = self.setupPath + '/ssl'
+ self.sslLetsDir = self.setupPath + '/letsencrypt'
+ if not os.path.exists(self.sslLetsDir):
+ mw.execShell("mkdir -p " + self.sslLetsDir +" && chmod -R 755 " + self.sslLetsDir)
+
+ # 域名编码转换
+ def toPunycode(self, domain):
+ if sys.version_info[0] == 2:
+ domain = domain.encode('utf8')
+ tmp = domain.split('.')
+ newdomain = ''
+ for dkey in tmp:
+ # 匹配非ascii字符
+ match = re.search(u"[\x80-\xff]+", dkey)
+ if not match:
+ newdomain += dkey + '.'
+ else:
+ newdomain += 'xn--' + dkey.decode('utf-8').encode('punycode') + '.'
+ return newdomain[0:-1]
+
+ # 中文路径处理
+ def toPunycodePath(self, path):
+ if sys.version_info[0] == 2:
+ path = path.encode('utf-8')
+ if os.path.exists(path):
+ return path
+ match = re.search(u"[\x80-\xff]+", path)
+ if not match:
+ return path
+ npath = ''
+ for ph in path.split('/'):
+ npath += '/' + self.toPunycode(ph)
+ return npath.replace('//', '/')
+
+ def getHostConf(self, siteName):
+ return self.vhostPath + '/' + siteName + '.conf'
+
+ def getRewriteConf(self, siteName):
+ return self.rewritePath + '/' + siteName + '.conf'
+
+ def getRedirectDataPath(self, siteName):
+ return "{}/{}/data.json".format(self.redirectPath, siteName)
+
+ def getRedirectPath(self, siteName):
+ return "{}/{}".format(self.redirectPath, siteName)
+
+ def getProxyDataPath(self, siteName):
+ return "{}/{}/data.json".format(self.proxyPath, siteName)
+
+ def getProxyPath(self, siteName):
+ return "{}/{}".format(self.proxyPath, siteName)
+
+ def getDirBindRewrite(self, siteName, dirname):
+ return self.rewritePath + '/' + siteName + '_' + dirname + '.conf'
+
+ def getIndexConf(self):
+ return mw.getServerDir() + '/openresty/nginx/conf/nginx.conf'
+
+ # 路径处理
+ def getPath(self, path):
+ if path[-1] == '/':
+ return path[0:-1]
+ return path
+
+ def createRootDir(self, path):
+ autoInit = False
+ if not os.path.exists(path):
+ autoInit = True
+ os.makedirs(path)
+ if not mw.isAppleSystem():
+ mw.execShell('chown -R www:www ' + path)
+
+ if autoInit:
+ mw.writeFile(path + '/index.html', 'Work has started!!!')
+ mw.execShell('chmod -R 755 ' + path)
+
+ def add(self, webname, port, ps, path, version):
+ site_root_dir = mw.getWwwDir()
+ if site_root_dir == path.rstrip('/'):
+ return mw.returnData(False, '不要以网站根目录创建站点!')
+
+ print(webname, port, ps, path, version)
+ siteMenu = json.loads(webname)
+
+ self.siteName = self.toPunycode(siteMenu['domain'].strip().split(':')[0]).strip()
+ self.sitePath = self.toPunycodePath(self.getPath(path.replace(' ', '')))
+ self.sitePort = port.strip().replace(' ', '')
+ self.phpVersion = version
+
+ if thisdb.isSitesExist(self.siteName):
+ return mw.returnData(False, '您添加的站点[%s]已存在!' % self.siteName)
+
+ pid = thisdb.addSites(self.siteName, self.sitePath)
+ if pid < 1:
+ return mw.returnData(False, '添加失败!')
+
+
+ self.createRootDir(self.sitePath)
+ self.nginxAddConf()
+
+ # 主域名配置
+ thisdb.addDomain(pid, self.siteName, self.sitePort)
+
+ # 绑定域名配置
+
+ # 添加更多域名
+ # for domain in siteMenu['domainlist']:
+ # thisdb.addDomain(pid, self.siteName, self.sitePort)
+
+ mw.restartWeb()
+ # return mw.returnData(False, '开发中!')
+ return mw.returnData(True, '添加成功')
+
+
+ def deleteWSLogs(self, webname):
+ assLogPath = mw.getLogsDir() + '/' + webname + '.log'
+ errLogPath = mw.getLogsDir() + '/' + webname + '.error.log'
+ confFile = self.setupPath + '/nginx/vhost/' + webname + '.conf'
+ rewriteFile = self.setupPath + '/nginx/rewrite/' + webname + '.conf'
+ passFile = self.setupPath + '/nginx/pass/' + webname + '.conf'
+ keyPath = self.sslDir + webname + '/privkey.pem'
+ certPath = self.sslDir + webname + '/fullchain.pem'
+ logs = [assLogPath,
+ errLogPath,
+ confFile,
+ rewriteFile,
+ passFile,
+ keyPath,
+ certPath]
+ for i in logs:
+ mw.deleteFile(i)
+
+ # 重定向目录
+ redirectDir = self.setupPath + '/nginx/redirect/' + webname
+ if os.path.exists(redirectDir):
+ mw.execShell('rm -rf ' + redirectDir)
+ # 代理目录
+ proxyDir = self.setupPath + '/nginx/proxy/' + webname
+ if os.path.exists(proxyDir):
+ mw.execShell('rm -rf ' + proxyDir)
+
+ def delete(self, site_id, path):
+ info = thisdb.getSitesById(site_id)
+ webname = info['name']
+ self.deleteWSLogs(webname)
+
+ if path == '1':
+ rootPath = mw.getWwwDir() + '/' + webname
+ mw.execShell('rm -rf ' + rootPath)
+
+ # ssl
+ ssl_dir = self.sslDir + '/' + webname
+ if os.path.exists(ssl_dir):
+ mw.execShell('rm -rf ' + ssl_dir)
+
+ ssl_lets_dir = self.sslLetsDir + '/' + webname
+ if os.path.exists(ssl_lets_dir):
+ mw.execShell('rm -rf ' + ssl_lets_dir)
+
+ ssl_acme_dir = mw.getAcmeDir() + '/' + webname
+ if os.path.exists(ssl_acme_dir):
+ mw.execShell('rm -rf ' + ssl_acme_dir)
+
+ thisdb.deleteSitesById(site_id)
+ thisdb.deleteDomainBySiteId(site_id)
+
+ binding_list = thisdb.getBindingListBySiteId(site_id)
+ for x in binding_list:
+ tag = mw.getLogsDir() + "/" + webname + "_" + x['domain']
+ wlog = tag + ".log"
+ wlog_error = tag + ".error.log"
+
+ if os.path.exists(wlog):
+ mw.execShell('rm -rf ' + wlog)
+ if os.path.exists(wlog_error):
+ mw.execShell('rm -rf ' + wlog_error)
+
+ thisdb.deleteBindingBySiteId(site_id)
+ mw.restartWeb()
+ return mw.returnData(True, '站点【%s】删除成功!' % webname)
+
+ def nginxAddConf(self):
+ source_tpl = mw.getRunDir() + '/data/tpl/nginx.conf'
+ vhost_file = self.vhostPath + '/' + self.siteName + '.conf'
+ content = mw.readFile(source_tpl)
+
+ content = content.replace('{$PORT}', self.sitePort)
+ content = content.replace('{$SERVER_NAME}', self.siteName)
+ content = content.replace('{$ROOT_DIR}', self.sitePath)
+ content = content.replace('{$PHP_DIR}', self.setupPath + '/php')
+ content = content.replace('{$PHPVER}', self.phpVersion)
+ content = content.replace('{$OR_REWRITE}', self.rewritePath)
+ # content = content.replace('{$OR_REDIRECT}', self.redirectPath)
+ # content = content.replace('{$OR_PROXY}', self.proxyPath)
+
+ logsPath = mw.getLogsDir()
+ content = content.replace('{$LOGPATH}', logsPath)
+ mw.writeFile(vhost_file, content)
+
+ # 设置网站过期
+ def setEndDate(self, site_id, end_date):
+ info = thisdb.getSitesById(site_id)
+ thisdb.setSitesData(site_id, edate=end_date)
+ mw.writeLog('网站', '设置成功,站点【{1}】到期【{2}】后将自动停止!', (info['name'], end_date,))
+ return mw.returnData(True, '设置成功,站点到期后将自动停止!')
+
+ # 设置网站备注
+ def setPs(self, site_id, ps):
+ if thisdb.setSitesData(site_id, ps=ps):
+ return mw.returnData(True, '修改成功!')
+ return mw.returnData(False, '修改失败!')
+
+ # 获取默认站点
+ def getDefaultSite(self):
+ data = {}
+ data['sites'] = mw.M('sites').field('name').order('id desc').select()
+ data['default_site'] = thisdb.getOption('default_site', default='')
+ return mw.getJson(data)
+
+ def setDefaultSite(self, name):
+ # 清理旧的
+ default_site = thisdb.getOption('default_site', default='')
+ if default_site:
+ path = self.getHostConf(default_site)
+ if os.path.exists(path):
+ conf = mw.readFile(path)
+ rep = r"listen\s+80.+;"
+ conf = re.sub(rep, 'listen 80;', conf, 1)
+ rep = r"listen\s+443.+;"
+ conf = re.sub(rep, 'listen 443 ssl;', conf, 1)
+ mw.writeFile(path, conf)
+
+ path = self.getHostConf(name)
+ if os.path.exists(path):
+ conf = mw.readFile(path)
+ rep = r"listen\s+80\s*;"
+ conf = re.sub(rep, 'listen 80 default_server;', conf, 1)
+ rep = r"listen\s+443\s*ssl\s*\w*\s*;"
+ conf = re.sub(rep, 'listen 443 ssl default_server;', conf, 1)
+ mw.writeFile(path, conf)
+
+ thisdb.setOption('default_site', name)
+ mw.restartWeb()
+ return mw.returnJson(True, '设置成功!')
+
+ def setCliPhpVersion(self, version):
+ php_bin = '/usr/bin/php'
+ php_bin_src = "/www/server/php/%s/bin/php" % version
+ php_ize = '/usr/bin/phpize'
+ php_ize_src = "/www/server/php/%s/bin/phpize" % version
+ php_fpm = '/usr/bin/php-fpm'
+ php_fpm_src = "/www/server/php/%s/sbin/php-fpm" % version
+ php_pecl = '/usr/bin/pecl'
+ php_pecl_src = "/www/server/php/%s/bin/pecl" % version
+ php_pear = '/usr/bin/pear'
+ php_pear_src = "/www/server/php/%s/bin/pear" % version
+ if not os.path.exists(php_bin_src):
+ return mw.returnData(False, '指定PHP版本未安装!')
+
+ is_chattr = mw.execShell('lsattr /usr|grep /usr/bin')[0].find('-i-')
+ if is_chattr != -1:
+ mw.execShell('chattr -i /usr/bin')
+ mw.execShell("rm -f " + php_bin + ' ' + php_ize + ' ' + php_fpm + ' ' + php_pecl + ' ' + php_pear)
+ mw.execShell("ln -sf %s %s" % (php_bin_src, php_bin))
+ mw.execShell("ln -sf %s %s" % (php_ize_src, php_ize))
+ mw.execShell("ln -sf %s %s" % (php_fpm_src, php_fpm))
+ mw.execShell("ln -sf %s %s" % (php_pecl_src, php_pecl))
+ mw.execShell("ln -sf %s %s" % (php_pear_src, php_pear))
+ if is_chattr != -1:
+ mw.execShell('chattr +i /usr/bin')
+ mw.writeLog('面板设置', '设置PHP-CLI版本为: %s' % version)
+ return mw.returnData(True, '设置成功!')
+
def getPhpVersion(self):
phpVersions = ('00', '52', '53', '54', '55',