From accdb5834d8be41a5d665efeb11c577ff33f5571 Mon Sep 17 00:00:00 2001 From: Mr Chen Date: Wed, 6 Nov 2024 20:58:22 +0800 Subject: [PATCH] up --- web/admin/setting/temp_login.py | 57 ++---- web/admin/setup/sql/default.sql | 4 +- web/admin/site/__init__.py | 77 ++++---- web/core/mw.py | 31 ++++ web/static/app/site.js | 4 +- web/thisdb/__init__.py | 4 + web/thisdb/binding.py | 37 ++++ web/thisdb/domain.py | 30 ++++ web/thisdb/sites.py | 43 ++++- web/thisdb/temp_login.py | 50 +++++- web/thisdb/user.py | 2 +- web/utils/site.py | 303 +++++++++++++++++++++++++++++++- 12 files changed, 557 insertions(+), 85 deletions(-) create mode 100644 web/thisdb/binding.py create mode 100644 web/thisdb/domain.py 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',