diff --git a/web/admin/site/ssl.py b/web/admin/site/ssl.py
index 724df7b1e..15b6a129d 100644
--- a/web/admin/site/ssl.py
+++ b/web/admin/site/ssl.py
@@ -39,12 +39,20 @@ def get_cert_list():
return MwSites.instance().getCertList()
-# 获取证书配置
+# 获取DNSAPI
@blueprint.route('/get_dnsapi', endpoint='get_dnsapi', methods=['GET','POST'])
@panel_login_required
def get_dnsapi():
return MwSites.instance().getDnsapi()
+# 设置DNSAPI
+@blueprint.route('/set_dnsapi', endpoint='set_dnsapi', methods=['GET','POST'])
+@panel_login_required
+def set_dnsapi():
+ type = request.form.get('type', '')
+ data = request.form.get('data')
+ return MwSites.instance().setDnsapi(type,data)
+
diff --git a/web/admin/site/ssl_acme.py b/web/admin/site/ssl_acme.py
index 98aa599fc..81938bde1 100644
--- a/web/admin/site/ssl_acme.py
+++ b/web/admin/site/ssl_acme.py
@@ -42,7 +42,9 @@ def create_acme():
force = request.form.get('force', '')
renew = request.form.get('renew', '')
email = request.form.get('email', '')
- return MwSites.instance().createAcme(site_name, domains,force,renew,email)
+ apply_type = request.form.get('apply_type', 'file')
+ dnspai = request.form.get('dnspai','')
+ return MwSites.instance().createAcme(site_name, domains,force,renew,apply_type,dnspai, email)
diff --git a/web/static/app/site.js b/web/static/app/site.js
index c44577a6b..11e432136 100755
--- a/web/static/app/site.js
+++ b/web/static/app/site.js
@@ -2036,16 +2036,20 @@ function renewSSL(type,id,siteName){
});
}
-function fileCheck(){
- $('#dnsapi_option').css('display','none');
-}
-function dnsCheck(){
- $('#dnsapi_option').css('display','block');
-}
function renderDnsapiHtml(data){
- console.log(data);
+
+ var fields = data.data;
+ var fields_html = '';
+
+ for (var d in fields) {
+ fields_html += ""+d+"\
+
\
+ \
+
";
+ }
+
layer.open({
type: 1,
area: '500px',
@@ -2058,20 +2062,13 @@ function renderDnsapiHtml(data){
\
DNSAPI类型\
\
-
\
\
\
-
CF_Key\
-
\
- \
-
\
-
CF_Email\
-
\
- \
-
\
+ "+fields_html+"\
\
\
\
@@ -2081,17 +2078,29 @@ function renderDnsapiHtml(data){
\
\
",
- success:function(){
-
- },
- yes:function(index) {
-
+ yes:function(index,l) {
+ var type_name = $('select[name="type_name"]').val();
+ var data_field = {};
+ for (var d in fields) {
+ data_field[d] = $('input[name="'+d+'"]').val();
+ }
+
+ $.post('/site/set_dnsapi', {'type':type_name,'data':JSON.stringify(data_field)}, function(rdata){
+ showMsg(rdata.msg, function(){
+ if (rdata.status){
+ layer.close(index);
+ renderDnsapi();
+ }
+ },{icon:rdata.status?1:2});
+ },'json');
}
});
}
function renderDnsapi(){
+ $('#dnsapi_set').css('display', 'none');
+
$.post('/site/get_dnsapi', {}, function(data){
var dnsapi_option = '';
for (var i = 0; i < data.length; i++) {
@@ -2099,7 +2108,6 @@ function renderDnsapi(){
}
$('#dnsapi_option select').html(dnsapi_option);
-
$('#dnsapi_option select').on('change',function(){
var val = $(this).val();
var index = $('#dnsapi_option option:selected').attr('index');
@@ -2107,8 +2115,10 @@ function renderDnsapi(){
$('#dnsapi_option button').css('display','none');
} else {
$('#dnsapi_option button').css('display','inline-block');
+ if (!(data[index]['title'].indexOf('[')>0)){
+ renderDnsapiHtml(data[index]);
+ }
}
- renderDnsapiHtml(data[index]);
});
$('#dnsapi_set').on('click', function(){
@@ -2124,21 +2134,27 @@ function opSSLAcme(type, id, siteName, callback){
\
\
-
\
+
选择DNS接口\
\
- \
+ \
\
\
\
\
\
+ \
+
\
+ \
+ \
+
\
+
\
\
\
\
@@ -2167,6 +2183,18 @@ function opSSLAcme(type, id, siteName, callback){
$(".tab-con").html(acme);
+ $('input[name="apply_type"]').on('change', function(){
+ var val = $(this).val();
+ if (val == 'file'){
+ $('#dnsapi_option').css('display','none');
+ $('#wildcard_domain_block').css('display','none');
+ } else {
+ $('#dnsapi_option').css('display','block');
+ $('#wildcard_domain_block').css('display','block');
+ }
+ });
+
+
renderDnsapi();
$.post('/site/get_ssl','site_name='+siteName+'&ssl_type=acme', function(data){
@@ -2346,7 +2374,7 @@ function opSSLLet(type, id, siteName, callback){
\
\
\
- 管理员邮箱\
+ 邮箱\
\
\
\
@@ -2512,19 +2540,31 @@ function newSSL(siteName, id, domains){
function newAcmeSSL(siteName, id, domains){
showSpeedWindow('正在由ACME申请...', 'site.get_acme_logs', function(layers,index){
var force = '';
+ var email = $("input[name='admin_email']").val();
+ var apply_type = $('input[name="apply_type"]:checked').val();
+
+ var pdata = {};
+ pdata['siteName'] = siteName;
+ pdata['domains'] = domains;
+ pdata['email'] = email;
+ pdata['apply_type'] = apply_type;
if($("#checkDomain").prop("checked")){
- force = '&force=true';
+ pdata['force'] = 'true';
}
- var email = $("input[name='admin_email']").val();
- $.post('/site/create_acme','siteName='+siteName+'&domains='+domains+'&email='+email + force,function(rdata){
- layer.close(index);
- if(rdata.status){
- showMsg(rdata.msg, function(){
+
+ if (apply_type == 'dns'){
+ pdata['dnspai'] = $('#dnsapi_option option:selected').val();
+ }
+
+ console.log(pdata);
+ $.post('/site/create_acme',pdata,function(rdata){
+ console.log(rdata);
+ showMsg(rdata.msg, function(){
+ layer.close(index);
+ if(rdata.status){
$(".tab-nav span:first-child").click();
- },{icon:1}, 2000);
- return;
- }
- layer.msg(rdata.msg,{icon:2,area:'500px',time:0,shade:0.3,shadeClose:true});
+ }
+ },{icon:rdata.status?1:2}, 3000);
},'json');
});
}
diff --git a/web/utils/site.py b/web/utils/site.py
index dd865fe7c..54f20ed48 100644
--- a/web/utils/site.py
+++ b/web/utils/site.py
@@ -1490,34 +1490,34 @@ location ^~ {from} {\n\
{"name":"dns_cf", "title":'cloudflare', 'key':'CF_Key:CF_Email'},
{"name":"dns_dp", "title":'dnspod/国内', 'key':'DP_Id:DP_Key'},
{"name":"dns_dpi", "title":'dnspod/国际', 'key':'DPI_Id:DPI_Key'},
- {"name":"dns_gd", "title":'GoDaddy', 'key':'GD_Key:GD_Secret'},
- {"name":"dns_pdns", "title":'PowerDNS', 'key':'PDNS_Url:PDNS_ServerId:PDNS_Token:PDNS_Ttl'},
- {"name":"dns_lua", "title":'LuaDNS', 'key':'LUA_Key:LUA_Email'},
- {"name":"dns_me", "title":'DNSMadeEasy', 'key':'ME_Key:ME_Secret'},
- {"name":"dns_aws", "title":'Amazon Route53', 'key':'AWS_ACCESS_KEY_ID:AWS_SECRET_ACCESS_KEY'},
- {"name":"dns_ispconfig", "title":'ISPConfig', 'key':'ISPC_User:ISPC_Password:ISPC_Api:ISPC_Api_Insecure'},
- {"name":"dns_ad", "title":'Alwaysdata', 'key':'AD_API_KEY'},
- {"name":"dns_linode_v4", "title":'Linode', 'key':'LINODE_V4_API_KEY'},
- {"name":"dns_freedns", "title":'FreeDNS', 'key':'FREEDNS_User:FREEDNS_Password'},
- {"name":"dns_cyon", "title":'cyon.ch', 'key':'CY_Username:CY_Password:CY_OTP_Secret'},
- {"name":"dns_gandi_livedns", "title":'LiveDNS', 'key':'GANDI_LIVEDNS_TOKEN'},
- {"name":"dns_knot", "title":'Knot', 'key':'KNOT_SERVER:KNOT_KEY'},
- {"name":"dns_dgon", "title":'DigitalOcean', 'key':'DO_API_KEY'},
- {"name":"dns_cloudns", "title":'ClouDNS.net', 'key':'CLOUDNS_SUB_AUTH_ID:CLOUDNS_AUTH_PASSWORD'},
- {"name":"dns_namesilo", "title":'Namesilo', 'key':'Namesilo_Key'},
- {"name":"dns_azure", "title":'Azure', 'key':'AZUREDNS_SUBSCRIPTIONID:AZUREDNS_TENANTID:AZUREDNS_APPID:AZUREDNS_CLIENTSECRET'},
- {"name":"dns_selectel", "title":'selectel.com', 'key':'SL_Key'},
- {"name":"dns_zonomi", "title":'zonomi.com', 'key':'ZM_Key'},
- {"name":"dns_kinghost", "title":'KingHost', 'key':'KINGHOST_Username:KINGHOST_Password'},
- {"name":"dns_zilore", "title":'Zilore', 'key':'Zilore_Key'},
- {"name":"dns_gcloud", "title":'Google Cloud DNS', 'key':'CLOUDSDK_ACTIVE_CONFIG_NAME'},
- {"name":"dns_mydnsjp", "title":'MyDNS.JP', 'key':'MYDNSJP_MasterID:MYDNSJP_Password'},
- {"name":"dns_doapi", "title":'do.de', 'key':'DO_LETOKEN'},
- {"name":"dns_online", "title":'Online', 'key':'ONLINE_API_KEY'},
- {"name":"dns_cn", "title":'Core-Networks', 'key':'CN_User:CN_Password'},
- {"name":"dns_ultra", "title":'UltraDNS', 'key':'ULTRA_USR:ULTRA_PWD'},
- {"name":"dns_hetzner", "title":'Hetzner', 'key':'HETZNER_Token'},
- {"name":"dns_ddnss", "title":'DDNSS.de', 'key':'DDNSS_Token'},
+ # {"name":"dns_gd", "title":'GoDaddy', 'key':'GD_Key:GD_Secret'},
+ # {"name":"dns_pdns", "title":'PowerDNS', 'key':'PDNS_Url:PDNS_ServerId:PDNS_Token:PDNS_Ttl'},
+ # {"name":"dns_lua", "title":'LuaDNS', 'key':'LUA_Key:LUA_Email'},
+ # {"name":"dns_me", "title":'DNSMadeEasy', 'key':'ME_Key:ME_Secret'},
+ # {"name":"dns_aws", "title":'Amazon Route53', 'key':'AWS_ACCESS_KEY_ID:AWS_SECRET_ACCESS_KEY'},
+ # {"name":"dns_ispconfig", "title":'ISPConfig', 'key':'ISPC_User:ISPC_Password:ISPC_Api:ISPC_Api_Insecure'},
+ # {"name":"dns_ad", "title":'Alwaysdata', 'key':'AD_API_KEY'},
+ # {"name":"dns_linode_v4", "title":'Linode', 'key':'LINODE_V4_API_KEY'},
+ # {"name":"dns_freedns", "title":'FreeDNS', 'key':'FREEDNS_User:FREEDNS_Password'},
+ # {"name":"dns_cyon", "title":'cyon.ch', 'key':'CY_Username:CY_Password:CY_OTP_Secret'},
+ # {"name":"dns_gandi_livedns", "title":'LiveDNS', 'key':'GANDI_LIVEDNS_TOKEN'},
+ # {"name":"dns_knot", "title":'Knot', 'key':'KNOT_SERVER:KNOT_KEY'},
+ # {"name":"dns_dgon", "title":'DigitalOcean', 'key':'DO_API_KEY'},
+ # {"name":"dns_cloudns", "title":'ClouDNS.net', 'key':'CLOUDNS_SUB_AUTH_ID:CLOUDNS_AUTH_PASSWORD'},
+ # {"name":"dns_namesilo", "title":'Namesilo', 'key':'Namesilo_Key'},
+ # {"name":"dns_azure", "title":'Azure', 'key':'AZUREDNS_SUBSCRIPTIONID:AZUREDNS_TENANTID:AZUREDNS_APPID:AZUREDNS_CLIENTSECRET'},
+ # {"name":"dns_selectel", "title":'selectel.com', 'key':'SL_Key'},
+ # {"name":"dns_zonomi", "title":'zonomi.com', 'key':'ZM_Key'},
+ # {"name":"dns_kinghost", "title":'KingHost', 'key':'KINGHOST_Username:KINGHOST_Password'},
+ # {"name":"dns_zilore", "title":'Zilore', 'key':'Zilore_Key'},
+ # {"name":"dns_gcloud", "title":'Google Cloud DNS', 'key':'CLOUDSDK_ACTIVE_CONFIG_NAME'},
+ # {"name":"dns_mydnsjp", "title":'MyDNS.JP', 'key':'MYDNSJP_MasterID:MYDNSJP_Password'},
+ # {"name":"dns_doapi", "title":'do.de', 'key':'DO_LETOKEN'},
+ # {"name":"dns_online", "title":'Online', 'key':'ONLINE_API_KEY'},
+ # {"name":"dns_cn", "title":'Core-Networks', 'key':'CN_User:CN_Password'},
+ # {"name":"dns_ultra", "title":'UltraDNS', 'key':'ULTRA_USR:ULTRA_PWD'},
+ # {"name":"dns_hetzner", "title":'Hetzner', 'key':'HETZNER_Token'},
+ # {"name":"dns_ddnss", "title":'DDNSS.de', 'key':'DDNSS_Token'},
];
for i in range(len(dnsapi_option)):
@@ -1538,17 +1538,39 @@ location ^~ {from} {\n\
dnsapi_option[i]['data'] = t
return dnsapi_option
- def createAcme(self, site_name, domains, force, renew, input_email):
- domains = json.loads(domains)
+ def setDnsapi(self, type, data):
+ dnsapi_data = thisdb.getOptionByJson('dnsapi', default={})
+ dnsapi_data[type] = json.loads(data)
+ thisdb.setOption('dnsapi',json.dumps(dnsapi_data))
+ return mw.returnData(True, '设置成功!')
+
+
+ def acmeLogFile(self):
+ return mw.getPanelDir() + '/logs/acme.log'
+
+ def writeAcmeLog(self,msg):
+ log_file = self.acmeLogFile()
+ mw.writeFile(log_file, msg+"\n", "wb+")
+ return True
+
+ def createAcmeMultiDomin(self):
+ pass
+
+ def createAcmeFile(self):
+ pass
- print(site_name,domains,input_email,renew,force)
- email = thisdb.getOption('ssl_email', default='')
- if input_email.strip() != '':
- thisdb.setOption('ssl_email', input_email)
- email = input_email
+ def createAcmeDns(self):
+ pass
- if not len(domains):
+ def createAcme(self, site_name, domains,force,renew, apply_type, dnspai, email):
+ domains = json.loads(domains)
+ if len(domains) < 1:
return mw.returnData(False, '请选择域名')
+ if email.strip() != '':
+ thisdb.setOption('ssl_email', email)
+
+ print(site_name, domains,force,renew,apply_type, dnspai, email)
+
file = self.getHostConf(site_name)
if os.path.exists(file):
@@ -1622,11 +1644,12 @@ location ^~ {from} {\n\
if domainCount == 0:
return mw.returnData(False, '请选择域名(不包括IP地址与泛域名)!')
- log_file = mw.getPanelDir() + '/logs/acme.log'
- mw.writeFile(log_file, "开始ACME申请...\n", "wb+")
+ self.writeAcmeLog('开始ACME申请...')
+ log_file = self.acmeLogFile()
cmd = 'export ACCOUNT_EMAIL=' + email + ' && ' + execStr + ' >> ' + log_file
- # print(domains)
- # print(cmd)
+ print(domains)
+ print(cmd)
+ return mw.returnData(False, '测试中!')
result = mw.execShell(cmd)
src_path = mw.getAcmeDomainDir(domains[0])