pull/632/head
Mr Chen 6 months ago
parent bcfdd22161
commit accdb5834d
  1. 57
      web/admin/setting/temp_login.py
  2. 4
      web/admin/setup/sql/default.sql
  3. 77
      web/admin/site/__init__.py
  4. 31
      web/core/mw.py
  5. 4
      web/static/app/site.js
  6. 4
      web/thisdb/__init__.py
  7. 37
      web/thisdb/binding.py
  8. 30
      web/thisdb/domain.py
  9. 43
      web/thisdb/sites.py
  10. 50
      web/thisdb/temp_login.py
  11. 2
      web/thisdb/user.py
  12. 303
      web/utils/site.py

@ -23,6 +23,7 @@ from admin.user_login_check import panel_login_required
import core.mw as mw import core.mw as mw
import utils.config as utils_config import utils.config as utils_config
import thisdb
from .setting import blueprint from .setting import blueprint
@ -34,24 +35,11 @@ def get_temp_login():
p = request.form.get('page', '1').strip() p = request.form.get('page', '1').strip()
tojs = request.form.get('tojs', '').strip() tojs = request.form.get('tojs', '').strip()
count = TempLogin.query.filter_by().count() info = thisdb.getTempLoginPage(int(p), int(limit))
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)
data = {} data = {}
data['data'] = rows data['data'] = info['list']
data['page'] = mw.getPage({'count':count,'tojs':'setTempAccessReq','p':p,'row':limit}) data['page'] = mw.getPage({'count':info['count'],'tojs':'setTempAccessReq','p':p,'row':limit})
return data return data
@blueprint.route('/set_temp_login', endpoint='set_temp_login', methods=['POST']) @blueprint.route('/set_temp_login', endpoint='set_temp_login', methods=['POST'])
@ -59,38 +47,27 @@ def get_temp_login():
def set_temp_login(): def set_temp_login():
# if 'tmp_login_expire' in session: # if 'tmp_login_expire' in session:
# return mw.returnData(False, '没有权限') # return mw.returnData(False, '没有权限')
thisdb.clearTempLogin()
start_time = int(time.time()) start_time = int(time.time())
model.clearTempLogin() expire = start_time+3600
rand_str = mw.getRandomString(48)
token = mw.getRandomString(48) token = mw.md5(rand_str)
salt = mw.getRandomString(12)
r = thisdb.addTempLogin(token, expire)
expire=start_time+3600 if r > 0:
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:
mw.writeLog('面板设置', '生成临时连接,过期时间:{}'.format(mw.formatDate(times=expire))) 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, '连接生成失败') return mw.returnData(False, '连接生成失败')
@blueprint.route('/remove_temp_login', endpoint='remove_temp_login', methods=['POST']) @blueprint.route('/remove_temp_login', endpoint='remove_temp_login', methods=['POST'])
@panel_login_required @panel_login_required
def remove_temp_login(): def remove_temp_login():
tl_id = request.form.get('id', '10').strip() tl_id = request.form.get('id', '10').strip()
r = thisdb.deleteTempLoginById(tl_id)
r = TempLogin.query.filter(TempLogin.id == tl_id).delete()
db.session.commit()
if r > 0: if r > 0:
mw.writeLog('面板设置', '删除临时登录连接') mw.writeLog('面板设置', '删除临时登录连接')
return mw.returnData(True, '删除成功') return mw.returnData(True, '删除成功')

@ -12,9 +12,9 @@ CREATE TABLE IF NOT EXISTS `backup` (
CREATE TABLE IF NOT EXISTS `binding` ( CREATE TABLE IF NOT EXISTS `binding` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT, `id` INTEGER PRIMARY KEY AUTOINCREMENT,
`pid` INTEGER, `pid` INTEGER,
`port` INTEGER,
`domain` TEXT, `domain` TEXT,
`path` TEXT, `path` TEXT,
`port` INTEGER,
`add_time` TEXT `add_time` TEXT
); );
@ -49,7 +49,7 @@ CREATE TABLE IF NOT EXISTS `firewall` (
ALTER TABLE `firewall` ADD COLUMN `protocol` TEXT DEFAULT 'tcp'; 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'), (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'); (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 admin.user_login_check import panel_login_required
from utils.plugin import plugin as MwPlugin from utils.plugin import plugin as MwPlugin
from utils.site import sites as MwSites
import utils.site as site import utils.site as site
import core.mw as mw import core.mw as mw
import thisdb import thisdb
@ -42,7 +43,7 @@ def list():
data['page'] = mw.getPage({'count':info['count'],'tojs':'getWeb','p':p, 'row':limit}) data['page'] = mw.getPage({'count':info['count'],'tojs':'getWeb','p':p, 'row':limit})
return data return data
#添加站点 # 添加站点
@blueprint.route('/add', endpoint='add',methods=['POST']) @blueprint.route('/add', endpoint='add',methods=['POST'])
@panel_login_required @panel_login_required
def add(): def add():
@ -51,7 +52,15 @@ def add():
path = request.form.get('path', '') path = request.form.get('path', '')
version = request.form.get('version', '') version = request.form.get('version', '')
port = request.form.get('port', '') 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']) @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']) @blueprint.route('/get_php_version', endpoint='get_php_version',methods=['POST'])
@panel_login_required @panel_login_required
def get_php_version(): 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']) @blueprint.route('/get_cli_php_version', endpoint='get_cli_php_version',methods=['POST'])
@panel_login_required @panel_login_required
def get_cli_php_version(): def get_cli_php_version():
@ -98,7 +137,7 @@ def get_cli_php_version():
return mw.returnData(False, '未安装PHP,无法设置') return mw.returnData(False, '未安装PHP,无法设置')
php_bin = '/usr/bin/php' php_bin = '/usr/bin/php'
php_versions = site.getPhpVersion() php_versions = MwSites.instance().getPhpVersion()
php_versions = php_versions[1:] php_versions = php_versions[1:]
if len(php_versions) < 1: if len(php_versions) < 1:
@ -117,35 +156,7 @@ def get_cli_php_version():
def set_cli_php_version(): def set_cli_php_version():
if mw.isAppleSystem(): if mw.isAppleSystem():
return mw.returnData(False, "开发机不可设置!") return mw.returnData(False, "开发机不可设置!")
version = request.form.get('version', '') version = request.form.get('version', '')
return MwSites.instance().setCliPhpVersion(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, '设置成功!')

@ -879,6 +879,33 @@ def isRestart():
return False return False
return True 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(): def triggerTask():
isTask = getPanelDir() + '/logs/panel_task.lock' isTask = getPanelDir() + '/logs/panel_task.lock'
writeFile(isTask, 'True') writeFile(isTask, 'True')
@ -925,6 +952,10 @@ def checkWebConfig():
def restartWeb(): def restartWeb():
return opWeb("reload") return opWeb("reload")
def deleteFile(file):
if os.path.exists(file):
os.remove(file)
def isInstalledWeb(): def isInstalledWeb():
path = getServerDir() + '/openresty/nginx/sbin/nginx' path = getServerDir() + '/openresty/nginx/sbin/nginx'
if os.path.exists(path): if os.path.exists(path):

@ -72,14 +72,14 @@ $('#site_search').click(function(){
var idname = data.data[i].name.replace(/\./g,'_'); 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>\ 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>" + status + "</td>\
<td>" + backup + "</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' 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='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><a class='btlinkbed' href='javascript:;' data-id='"+data.data[i].id+"'>" + data.data[i].ps + "</a></td>\
<td style='text-align:right; color:#bbb'>\ <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>\ | <a href='javascript:;' class='btlink' onclick=\"webDelete('" + data.data[i].id + "','" + data.data[i].name + "')\" title='删除站点'>删除</a>\
</td></tr>" </td></tr>"

@ -11,8 +11,12 @@
from .init import * from .init import *
from .option import * from .option import *
from .user import * from .user import *
from .sites import * from .sites import *
from .domain import *
from .tasks import * from .tasks import *
from .logs import * from .logs import *
from .crontab import * from .crontab import *
from .firewall 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 import core.mw as mw
__FIELD = 'id,name,path,status,ps,edate,type_id,add_time,update_time'
def getSitesCount(): def getSitesCount():
return mw.M('sites').count() 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( def getSitesList(
page:int | None = 1, page:int | None = 1,
size:int | None = 10, size:int | None = 10,
@ -29,7 +54,7 @@ def getSitesList(
sql_where = " type_id=" + str(type_id) 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 != '': if sql_where != '':
count = dbC.where(sql_where).count() count = dbC.where(sql_where).count()
@ -46,3 +71,19 @@ def getSitesList(
data['count'] = count data['count'] = count
return data 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 import time
from admin.model import db, TempLogin
import core.mw as mw 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, def getTempLoginByToken(token,
) -> None: ) -> 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').find()
data = mw.M('temp_login').where('token=?', (token,)).field(field).order('id asc').select()
return data return data
def deleteTempLoginById(id) :
return mw.M('temp_login').where('id=?', (id,)).delete()
def clearTempLogin()->bool: def clearTempLogin()->bool:
''' '''
清空过期数据 清空过期数据

@ -85,7 +85,7 @@ def getUserByRoot() -> None:
def updateUserLoginTime(): def updateUserLoginTime():
now_time = mw.formatDate() 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 return True
def setUserByRoot( def setUserByRoot(

@ -10,13 +10,14 @@
import os import os
import sys import sys
import re
import json import json
import time
import threading import threading
import multiprocessing import multiprocessing
from admin import model
import core.mw as mw import core.mw as mw
import thisdb
class sites(object): class sites(object):
@ -31,6 +32,304 @@ class sites(object):
sites._instance = sites(*args, **kwargs) sites._instance = sites(*args, **kwargs)
return sites._instance 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): def getPhpVersion(self):
phpVersions = ('00', '52', '53', '54', '55', phpVersions = ('00', '52', '53', '54', '55',

Loading…
Cancel
Save