This commit is contained in:
parent
bcfdd22161
commit
accdb5834d
|
|
@ -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()
|
||||
expire = start_time+3600
|
||||
|
||||
rand_str = mw.getRandomString(48)
|
||||
token = mw.md5(rand_str)
|
||||
|
||||
|
||||
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:
|
||||
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, '删除成功')
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -72,14 +72,14 @@ $('#site_search').click(function(){
|
|||
var idname = data.data[i].name.replace(/\./g,'_');
|
||||
|
||||
body = "<tr><td><input type='checkbox' name='id' title='"+data.data[i].name+"' onclick='checkSelect();' value='" + data.data[i].id + "'></td>\
|
||||
<td><a class='btlink webtips' href='javascript:;' onclick=\"webEdit(" + data.data[i].id + ",'" + data.data[i].name + "','" + data.data[i].edate + "','" + data.data[i].addtime + "')\" title='"+data.data[i].name+"'>" + shortwebname + "</td>\
|
||||
<td><a class='btlink webtips' href='javascript:;' onclick=\"webEdit(" + data.data[i].id + ",'" + data.data[i].name + "','" + data.data[i].edate + "','" + data.data[i].add_time + "')\" title='"+data.data[i].name+"'>" + shortwebname + "</td>\
|
||||
<td>" + status + "</td>\
|
||||
<td>" + backup + "</td>\
|
||||
<td><a class='btlink' title='打开目录"+data.data[i].path+"' href=\"javascript:openPath('"+data.data[i].path+"');\">" + shortpath + "</a></td>\
|
||||
<td><a class='btlink setTimes' id='site_"+data.data[i].id+"' data-ids='"+data.data[i].id+"'>" + web_end_time + "</a></td>\
|
||||
<td><a class='btlinkbed' href='javascript:;' data-id='"+data.data[i].id+"'>" + data.data[i].ps + "</a></td>\
|
||||
<td style='text-align:right; color:#bbb'>\
|
||||
<a href='javascript:;' class='btlink' onclick=\"webEdit(" + data.data[i].id + ",'" + data.data[i].name + "','" + data.data[i].edate + "','" + data.data[i].addtime + "')\">设置</a>\
|
||||
<a href='javascript:;' class='btlink' onclick=\"webEdit(" + data.data[i].id + ",'" + data.data[i].name + "','" + data.data[i].edate + "','" + data.data[i].add_time + "')\">设置</a>\
|
||||
| <a href='javascript:;' class='btlink' onclick=\"webDelete('" + data.data[i].id + "','" + data.data[i].name + "')\" title='删除站点'>删除</a>\
|
||||
</td></tr>"
|
||||
|
||||
|
|
|
|||
|
|
@ -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 *
|
||||
|
|
|
|||
|
|
@ -0,0 +1,37 @@
|
|||
# coding:utf-8
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# MW-Linux面板
|
||||
# ---------------------------------------------------------------------------------
|
||||
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Author: midoks <midoks@163.com>
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
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()
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
# coding:utf-8
|
||||
|
||||
# ---------------------------------------------------------------------------------
|
||||
# MW-Linux面板
|
||||
# ---------------------------------------------------------------------------------
|
||||
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved.
|
||||
# ---------------------------------------------------------------------------------
|
||||
# Author: midoks <midoks@163.com>
|
||||
# ---------------------------------------------------------------------------------
|
||||
|
||||
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()
|
||||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
'''
|
||||
清空过期数据
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
|
|
|
|||
Loading…
Reference in New Issue