diff --git a/class/core/cert_request.py b/class/core/cert_request.py index 1b7addb34..b84bb91e0 100644 --- a/class/core/cert_request.py +++ b/class/core/cert_request.py @@ -1046,12 +1046,12 @@ fullchain.pem 粘贴到证书输入框 self.saveCert(cert, index) return cert - def applyCert(self, domains, auth_type='dns', auth_to='Dns_com|None|None', args={}): + def applyCert(self, domains, auth_type='http', auth_to='Dns_com|None|None', args={}): writeLog("", "wb+") try: self.getApis() index = None - if args.index: + if 'index' in args and args.index: index = args.index if not index: # 判断是否只想验证域名 @@ -1084,7 +1084,11 @@ fullchain.pem 粘贴到证书输入框 else: msg = ex writeLog(mw.getTracebackInfo()) - return mw.returnJson(False, msg) + + cert = {} + cert['status'] = False + cert['msg'] = msg + return cert # 取根域名和记录值 def extractZone(self, domain_name): @@ -1218,47 +1222,13 @@ fullchain.pem 粘贴到证书输入框 except: write_log("|-[{}]续签失败".format(siteName)) - def apply_cert_api(self, args): + # 外部API - START ---------------------------------------------------------- + def applyCertApi(self, args): ''' 申请证书 - api ''' - if not 'id' in args: - return mw.returnJson(False, '网站id不能为空!') - # 是否为指定站点 - if mw.M('sites').where('id=?', (args.id,)).count(): - project_info = public.M('sites').where( - 'id=?', (args.id,)).getField('project_config') - try: - project_info = json.loads(project_info) - if not os.path.exists(project_info['ssl_path']): - os.makedirs(project_info['ssl_path']) - path = project_info['ssl_path'] - args.auth_to = path - if args.auto_wildcard == '1': - self._auto_wildcard = True - return self.applyCert(json.loads(args.domains), args.auth_type, args.auth_to) - except: - return mw.returnJson(False, '当前Java项目配置文件存在问题,请重新建立') - else: - if re.match(r"^\d+$", args.auth_to): - import panelSite - path = mw.M('sites').where( - 'id=?', (args.id,)).getField('path') - args.auth_to = path + '/' + panelSite.panelSite().GetRunPath(args) - args.auth_to = args.auth_to.replace("//", "/") - if args.auth_to[-1] == '/': - args.auth_to = args.auth_to[:-1] - - if not os.path.exists(args.auth_to): - return mw.returnJson(False, '无效的站点目录,请检查指定站点是否存在!') - - check_result = self.checkAuthEnv(args) - if check_result: - return check_result - - if args.auto_wildcard == '1': - self._auto_wildcard = True - return self.apply_cert(json.loads(args.domains), args.auth_type, args.auth_to) + return self.applyCert(args['domains'], args['auth_type'], args['auth_to']) + # 外部API - END ---------------------------------------------------------- def renewCert(self, index): writeLog("", "wb+") diff --git a/class/core/files_api.py b/class/core/files_api.py index 3791b395b..b273803fd 100755 --- a/class/core/files_api.py +++ b/class/core/files_api.py @@ -39,7 +39,7 @@ class files_api: data = mw.getLastLine(path, int(line)) return mw.returnJson(True, 'OK', data) except Exception as ex: - return mw.returnJson(False, u'无法正确读取文件!' + str(ex)) + return mw.returnJson(False, '无法正确读取文件!' + str(ex)) def saveBodyApi(self): path = request.form.get('path', '') diff --git a/class/core/site_api.py b/class/core/site_api.py index 6b4f654ed..e2e9e9fc4 100755 --- a/class/core/site_api.py +++ b/class/core/site_api.py @@ -611,6 +611,12 @@ class site_api: mw.restartWeb() return mw.returnJson(True, 'SSL已关闭!') + def getLetLogsApi(self): + log_file = mw.getRunDir() + '/logs/letsencrypt.log' + if not os.path.exists(log_file): + mw.execShell('touch ' + log_file) + return mw.returnJson(True, 'OK', log_file) + def createLetApi(self): siteName = request.form.get('siteName', '') updateOf = request.form.get('updateOf', '') @@ -648,28 +654,30 @@ class site_api: if os.path.exists(proxy_dir_file): return mw.returnJson(False, '检测到您的站点做了反向代理设置,请先关闭反向代理!') - letpath = self.sslDir + siteName - csrpath = letpath + "/fullchain.pem" # 生成证书路径 - keypath = letpath + "/privkey.pem" # 密钥文件路径 + auth_to = self.getSitePath(siteName) + to_args = { + 'domains': domains, + 'auth_type': 'http', + 'auth_to': auth_to, + } - siteInfo = mw.M('sites').where( - 'name=?', (siteName,)).field('id,name,path').find() - path = self.getSitePath(siteName) - srcPath = siteInfo['path'] + # print(to_args) + import cert_request + data = cert_request.cert_request().applyCertApi(to_args) - # print(domains) - # print(cmd) - result = mw.execShell(cmd) + # letpath = self.sslDir + siteName + # csrpath = letpath + "/fullchain.pem" # 生成证书路径 + # keypath = letpath + "/privkey.pem" # 密钥文件路径 - # 写入配置文件 - result = self.setSslConf(siteName) - if not result['status']: - return mw.getJson(result) - result['csr'] = mw.readFile(csrpath) - result['key'] = mw.readFile(keypath) - mw.restartWeb() + # # 写入配置文件 + # result = self.setSslConf(siteName) + # if not result['status']: + # return mw.getJson(result) + # result['csr'] = mw.readFile(csrpath) + # result['key'] = mw.readFile(keypath) - return mw.returnJson(True, 'OK', result) + # mw.restartWeb() + return mw.returnJson(data['status'], '', data['msg']) def createAcmeApi(self): siteName = request.form.get('siteName', '') @@ -1092,10 +1100,10 @@ class site_api: mw.M('binding').add('pid,domain,port,path,addtime', (pid, domain, port, dirName, mw.getDate())) - mw.restartWeb() msg = mw.getInfo('网站[{1}]子目录[{2}]绑定到[{3}]', (siteInfo['name'], dirName, domain)) mw.writeLog('网站管理', msg) + mw.restartWeb() return mw.returnJson(True, '添加成功!') def delDirBindApi(self): diff --git a/route/static/app/public.js b/route/static/app/public.js index 18238915d..8da7993fd 100755 --- a/route/static/app/public.js +++ b/route/static/app/public.js @@ -1607,6 +1607,49 @@ function remove_ssh_menu() { $(".contextmenu").remove(); } +//显示进度 +function showSpeed(filename) { + $.post('/files/get_last_body', { num: 10,path: filename}, function (rdata) { + if ($("#speed_log_lst").text() == ''){ + return; + } + if (rdata.status) { + $("#speed_log_lst").text(rdata.data); + $("#speed_log_lst").scrollTop($("#speed_log_lst")[0].scrollHeight); + } + setTimeout(function () { showSpeed(filename); }, 1000); + },'json'); +} +/** + * 显示进度窗口 + */ +function showSpeedWindow(msg, speed_log_func_name, callback){ + var speed_msg = "
[MSG]
"; + var showSpeedKey = layer.open({ + title: false, + type: 1, + closeBtn: 0, + shade: 0.3, + area: "500px", + offset: "30%", + content: speed_msg.replace('[MSG]', msg), + success: function (layers, index) { + var url = speed_log_func_name.replace('.','/'); + $.post('/'+url, {}, function(rdata){ + if (rdata.status){ + setTimeout(function () { + showSpeed(rdata.data); + }, 1000); + } else { + layer.msg("缺少指定文件!"); + } + },'json'); + if (callback) {callback(layers,index,showSpeedKey);} + } + }); +} + + /*** 其中功能,针对插件通过库使用 start ***/ //字符串转数组对象 diff --git a/route/static/app/site.js b/route/static/app/site.js index 6aa808243..fdb92fe14 100755 --- a/route/static/app/site.js +++ b/route/static/app/site.js @@ -1031,31 +1031,35 @@ function webEdit(id,website,endTime,addtime){ +" "+eMenu+"" +"" +"
" - +"" - }); - domainEdit(id,website); - //域名输入提示 - var placeholder = "
每行填写一个域名,默认为80端口
泛解析添加方法 *.domain.com
如另加端口格式为 www.domain.com:88
"; - $('#newdomain').after(placeholder); - $(".placeholder").click(function(){ - $(this).hide(); - $('#newdomain').focus(); - }); + +"", - $('#newdomain').focus(function() { - $(".placeholder").hide(); - }); - - $('#newdomain').blur(function() { - if($(this).val().length == 0){ - $(".placeholder").show(); - } - }); + success:function(){ + //域名输入提示 + var placeholder = "
每行填写一个域名,默认为80端口
泛解析添加方法 *.domain.com
如另加端口格式为 www.domain.com:88
"; + $('#newdomain').after(placeholder); + $(".placeholder").click(function(){ + $(this).hide(); + $('#newdomain').focus(); + }); - //切换 - $(".bt-w-menu p").click(function(){ - $(this).addClass("bgw").siblings().removeClass("bgw"); - }); + $('#newdomain').focus(function() { + $(".placeholder").hide(); + }); + + $('#newdomain').blur(function() { + if($(this).val().length == 0){ + $(".placeholder").show(); + } + }); + + //切换 + $(".bt-w-menu p").click(function(){ + $(this).addClass("bgw").siblings().removeClass("bgw"); + }); + + domainEdit(id,website); + } + }); } //取网站日志 @@ -1685,7 +1689,6 @@ function toProxy(siteName, type, obj) { layer.msg(res.msg, {icon: 2}); } },'json'); - } }); } @@ -1983,7 +1986,7 @@ function opSSL(type, id, siteName, callback){
  • 如果浏览器提示证书链不完整,请检查是否正确拼接PEM证书
  • PEM格式证书 = 域名证书.crt + 根证书(root_bundle).crt
  • \
  • 在未指定SSL默认站点时,未开启SSL的站点使用HTTPS会直接访问到已开启SSL的站点
  • '; - var lets = '
    ' + var lets = '
    ' + '
    验证方式
    \
    ' + '
    ' @@ -1996,7 +1999,7 @@ function opSSL(type, id, siteName, callback){
  • 在未指定SSL默认站点时,未开启SSL的站点使用HTTPS会直接访问到已开启SSL的站点
  • ' + '
    '; - var acme = '
    ' + var acme = '
    ' + '
    验证方式
    \
    ' + '
    ' @@ -2137,7 +2140,7 @@ function opSSL(type, id, siteName, callback){ },'json'); break; case 'now': - $(".tab-con").html(other); + $(".tab-con").html(now); var key = ''; var csr = ''; var loadT = layer.msg('正在提交任务...',{icon:16,time:0,shade: [0.3, '#000']}); @@ -2166,35 +2169,6 @@ function opSSL(type, id, siteName, callback){ } -//一键部署证书 -function onekeySSl(partnerOrderId,siteName){ - var loadT = layer.msg(lan.site.ssl_apply_3,{icon:16,time:0,shade:0.3}); - $.post("/ssl?action=GetSSLInfo","partnerOrderId="+partnerOrderId+"&siteName="+siteName,function(zdata){ - layer.close(loadT); - layer.msg(zdata.msg,{icon:zdata.status?1:2}); - getSSLlist(siteName); - }) -} - -//验证域名 -function verifyDomain(partnerOrderId,siteName){ - var loadT = layer.msg(lan.site.ssl_apply_2,{icon:16,time:0,shade:0.3}); - $.post("/ssl?action=Completed","partnerOrderId="+partnerOrderId+'&siteName='+siteName,function(ydata){ - layer.close(loadT); - if(!ydata.status){ - layer.msg(ydata.msg,{icon:2}); - return; - } - //第三步 - var loadT = layer.msg(lan.site.ssl_apply_3,{icon:16,time:0,shade:0.3}); - $.post("/ssl?action=GetSSLInfo","partnerOrderId="+partnerOrderId+"&siteName="+siteName,function(zdata){ - layer.close(loadT); - if(zdata.status) getSSLlist(); - layer.msg(zdata.msg,{icon:zdata.status?1:2}); - }); - }); -} - //开启与关闭SSL function ocSSL(action,siteName){ var loadT = layer.msg('正在获取证书列表,请稍后..',{icon:16,time:0,shade: [0.3, '#000']}); @@ -2228,29 +2202,29 @@ function ocSSL(action,siteName){ } //生成SSL -function newSSL(siteName,domains){ - var loadT = layer.msg('正在校验域名,请稍后...',{icon:16,time:0,shade: [0.3, '#000']}); - var force = ''; - if($("#checkDomain").prop("checked")) force = '&force=true'; - var email = $("input[name='admin_email']").val(); - $.post('/site/create_let','siteName='+siteName+'&domains='+domains+'&updateOf=1&email='+email + force,function(rdata){ - layer.close(loadT); - if(rdata.status){ - var mykeyhtml = '
    密钥(KEY)
    ' - + '
    证书(PEM格式)
    ' - + '
    ' - + '
    • 已为您自动生成Let\'s Encrypt免费证书;
    • \ -
    • 如需使用其他SSL,请切换其他证书后粘贴您的KEY以及PEM内容,然后保存即可。
    '; - $(".btssl").html(mykeyhtml); - layer.msg(rdata.data.msg,{icon:rdata.status?1:2}); - setCookie('letssl',1); - return; - } - - setCookie('letssl',0); - layer.msg(rdata.msg,{icon:2,area:'500px',time:0,shade:0.3,shadeClose:true}); - - },'json'); +function newSSL(siteName, domains){ + showSpeedWindow('正在申请...', 'site.get_let_logs', function(layers,index){ + var force = ''; + if ($("#checkDomain").prop("checked")) force = '&force=true'; + var email = $("input[name='admin_email']").val(); + $.post('/site/create_let','siteName='+siteName+'&domains='+domains+'&updateOf=1&email='+email + force,function(rdata){ + layer.close(index); + if(rdata.status){ + var key = '
    \ +
    密钥(KEY)
    \ +
    证书(PEM格式)
    \ +
    \ +
    • 已为您自动生成Let\'s Encrypt免费证书;
    • \ +
    • 如需使用其他SSL,请切换其他证书后粘贴您的KEY以及PEM内容,然后保存即可。
    • \ +
    '; + $(".apply_ssl").html(key); + layer.msg(rdata.data.msg,{icon:rdata.status?1:2}); + return; + } + layer.msg(rdata.data[0],{icon:2,area:'500px',time:0,shade:0.3,shadeClose:true}); + },'json'); + }); + } function newAcmeSSL(siteName,domains){ @@ -2266,7 +2240,7 @@ function newAcmeSSL(siteName,domains){ + '
    ' + '
    • 已为您自动生成Let\'s Encrypt免费证书;
    • \
    • 如需使用其他SSL,请切换其他证书后粘贴您的KEY以及PEM内容,然后保存即可。
    '; - $(".btssl").html(mykeyhtml); + $(".apply_ssl").html(mykeyhtml); layer.msg(rdata.data.msg,{icon:rdata.status?1:2}); setCookie('letssl',1); return;