mirror of https://github.com/midoks/mdserver-web
parent
6e48e0c339
commit
b124aabb7b
@ -0,0 +1,52 @@ |
|||||||
|
# coding:utf-8 |
||||||
|
|
||||||
|
# --------------------------------------------------------------------------------- |
||||||
|
# MW-Linux面板 |
||||||
|
# --------------------------------------------------------------------------------- |
||||||
|
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved. |
||||||
|
# --------------------------------------------------------------------------------- |
||||||
|
# Author: midoks <midoks@163.com> |
||||||
|
# --------------------------------------------------------------------------------- |
||||||
|
|
||||||
|
import re |
||||||
|
import json |
||||||
|
import os |
||||||
|
import time |
||||||
|
|
||||||
|
from flask import Blueprint, render_template |
||||||
|
from flask import request |
||||||
|
|
||||||
|
from admin import session |
||||||
|
from admin.user_login_check import panel_login_required |
||||||
|
|
||||||
|
import core.mw as mw |
||||||
|
import utils.config as utils_config |
||||||
|
|
||||||
|
from utils.setting import setting as MwSetting |
||||||
|
|
||||||
|
from .setting import blueprint |
||||||
|
import thisdb |
||||||
|
|
||||||
|
# 获取面板证书信息 |
||||||
|
@blueprint.route('/get_panel_ssl', endpoint='get_panel_ssl', methods=['POST']) |
||||||
|
@panel_login_required |
||||||
|
def get_panel_ssl(): |
||||||
|
return MwSetting.instance().getPanelSsl() |
||||||
|
|
||||||
|
|
||||||
|
# 获取面板证书信息 |
||||||
|
@blueprint.route('/save_panel_ssl', endpoint='save_panel_ssl', methods=['POST']) |
||||||
|
@panel_login_required |
||||||
|
def save_panel_ssl(): |
||||||
|
choose = request.form.get('choose', '').strip() |
||||||
|
certPem = request.form.get('certPem', '').strip() |
||||||
|
privateKey = request.form.get('privateKey', '').strip() |
||||||
|
return MwSetting.instance().savePanelSsl(choose,certPem,privateKey) |
||||||
|
|
||||||
|
# 获取面板证书信息 |
||||||
|
@blueprint.route('/del_panel_ssl', endpoint='del_panel_ssl', methods=['POST']) |
||||||
|
@panel_login_required |
||||||
|
def del_panel_ssl(): |
||||||
|
choose = request.form.get('choose', '').strip() |
||||||
|
return MwSetting.instance().delPanelSsl(choose) |
||||||
|
|
@ -0,0 +1,259 @@ |
|||||||
|
# coding:utf-8 |
||||||
|
|
||||||
|
# --------------------------------------------------------------------------------- |
||||||
|
# MW-Linux面板 |
||||||
|
# --------------------------------------------------------------------------------- |
||||||
|
# copyright (c) 2018-∞(https://github.com/midoks/mdserver-web) All rights reserved. |
||||||
|
# --------------------------------------------------------------------------------- |
||||||
|
# Author: midoks <midoks@163.com> |
||||||
|
# --------------------------------------------------------------------------------- |
||||||
|
|
||||||
|
import os |
||||||
|
import re |
||||||
|
import threading |
||||||
|
import re |
||||||
|
import time |
||||||
|
|
||||||
|
import core.mw as mw |
||||||
|
import thisdb |
||||||
|
|
||||||
|
class setting(object): |
||||||
|
|
||||||
|
# lock |
||||||
|
_instance_lock = threading.Lock() |
||||||
|
|
||||||
|
@classmethod |
||||||
|
def instance(cls, *args, **kwargs): |
||||||
|
if not hasattr(setting, "_instance"): |
||||||
|
with setting._instance_lock: |
||||||
|
if not hasattr(setting, "_instance"): |
||||||
|
setting._instance = setting(*args, **kwargs) |
||||||
|
return setting._instance |
||||||
|
|
||||||
|
def __init__(self): |
||||||
|
pass |
||||||
|
|
||||||
|
|
||||||
|
# 保存面板证书 |
||||||
|
def savePanelSsl(self, choose, cert_pem, private_key): |
||||||
|
if not mw.inArray(['local','nginx'], choose): |
||||||
|
return mw.returnData(True, '保存错误面板SSL类型!') |
||||||
|
|
||||||
|
pdir = mw.getPanelDir() |
||||||
|
keyPath = pdir+'/ssl/'+choose+'/private.pem' |
||||||
|
certPath = pdir+'/ssl/'+choose+'/cert.pem' |
||||||
|
check_cert_pl = '/tmp/cert.pl' |
||||||
|
|
||||||
|
if not os.path.exists(keyPath): |
||||||
|
return mw.returnData(False, '【'+choose+'】SSL类型不存在,先申请!') |
||||||
|
|
||||||
|
if(private_key.find('KEY') == -1): |
||||||
|
return mw.returnData(False, '秘钥错误,请检查!') |
||||||
|
if(cert_pem.find('CERTIFICATE') == -1): |
||||||
|
return mw.returnData(False, '证书错误,请检查!') |
||||||
|
|
||||||
|
mw.writeFile(check_cert_pl, cert_pem) |
||||||
|
if private_key: |
||||||
|
mw.writeFile(keyPath, private_key) |
||||||
|
if cert_pem: |
||||||
|
mw.writeFile(certPath, cert_pem) |
||||||
|
if not mw.checkCert(check_cert_pl): |
||||||
|
os.remove(check_cert_pl) |
||||||
|
return mw.returnData(False, '证书错误,请检查!') |
||||||
|
os.remove(check_cert_pl) |
||||||
|
return mw.returnData(True, '证书已保存!') |
||||||
|
|
||||||
|
|
||||||
|
def getPanelSsl(self): |
||||||
|
rdata = {} |
||||||
|
rdata['choose'] = 'local' |
||||||
|
|
||||||
|
|
||||||
|
pdir = mw.getPanelDir() |
||||||
|
|
||||||
|
keyPath = pdir+'/ssl/local/private.pem' |
||||||
|
certPath = pdir+'/ssl/local/cert.pem' |
||||||
|
|
||||||
|
if not os.path.exists(certPath): |
||||||
|
mw.createLocalSSL() |
||||||
|
|
||||||
|
cert = {} |
||||||
|
cert['privateKey'] = mw.readFile(keyPath) |
||||||
|
cert['is_https'] = '' |
||||||
|
cert['certPem'] = mw.readFile(certPath) |
||||||
|
cert['info'] = mw.getCertName(certPath) |
||||||
|
rdata['local'] = cert |
||||||
|
|
||||||
|
panel_ssl = mw.getServerDir() + "/web_conf/nginx/vhost/panel.conf" |
||||||
|
if not os.path.exists(panel_ssl): |
||||||
|
cert['is_https'] = '' |
||||||
|
else: |
||||||
|
ssl_data = mw.readFile(panel_ssl) |
||||||
|
if ssl_data.find('$server_port !~ 443') != -1: |
||||||
|
cert['is_https'] = 'checked' |
||||||
|
|
||||||
|
keyPath = pdir+'/ssl/nginx/private.pem' |
||||||
|
certPath = pdir+'/ssl/nginx/cert.pem' |
||||||
|
|
||||||
|
cert = {} |
||||||
|
cert['privateKey'] = '' |
||||||
|
cert['certPem'] = '' |
||||||
|
cert['info'] = {} |
||||||
|
if os.path.exists(keyPath): |
||||||
|
cert['privateKey'] = mw.readFile(keyPath) |
||||||
|
|
||||||
|
if os.path.exists(keyPath): |
||||||
|
cert['certPem'] = mw.readFile(certPath) |
||||||
|
cert['info'] = mw.getCertName(certPath) |
||||||
|
|
||||||
|
rdata['nginx'] = cert |
||||||
|
|
||||||
|
return rdata |
||||||
|
|
||||||
|
# 删除面板证书 |
||||||
|
def delPanelSsl(self, choose): |
||||||
|
ip = mw.getLocalIp() |
||||||
|
if mw.isAppleSystem(): |
||||||
|
ip = '127.0.0.1' |
||||||
|
|
||||||
|
|
||||||
|
if not mw.inArray(['local','nginx'], choose): |
||||||
|
return mw.returnData(True, '删除错误面板SSL类型!') |
||||||
|
|
||||||
|
port_pl = mw.getPanelDir()+'/data/port.pl' |
||||||
|
port = mw.readFile(port_pl).strip() |
||||||
|
|
||||||
|
to_panel_url = 'http://'+ip+":"+port+'/config' |
||||||
|
|
||||||
|
if choose == 'local': |
||||||
|
dst_path = mw.getPanelDir() + '/ssl/local' |
||||||
|
if os.path.exists(dst_path): |
||||||
|
mw.execShell('rm -rf ' + dst_path) |
||||||
|
mw.restartMw(); |
||||||
|
return mw.returnData(True, '删除本地面板SSL成功!',to_panel_url) |
||||||
|
else: |
||||||
|
return mw.returnData(True, '已经删除本地面板SSL!',to_panel_url) |
||||||
|
|
||||||
|
if choose == 'nginx': |
||||||
|
|
||||||
|
bind_domain = self.__file['bind_domain'] |
||||||
|
if not os.path.exists(bind_domain): |
||||||
|
return mw.returnData(False, '未绑定域名!') |
||||||
|
|
||||||
|
siteName = mw.readFile(bind_domain).strip() |
||||||
|
|
||||||
|
src_path = mw.getServerDir() + '/web_conf/letsencrypt/' + siteName |
||||||
|
|
||||||
|
dst_path = mw.getPanelDir() + '/ssl/nginx' |
||||||
|
dst_csrpath = dst_path + '/cert.pem' |
||||||
|
dst_keypath = dst_path + '/private.pem' |
||||||
|
|
||||||
|
if os.path.exists(src_path) or os.path.exists(dst_path): |
||||||
|
if os.path.exists(src_letpath): |
||||||
|
mw.execShell('rm -rf ' + src_letpath) |
||||||
|
if os.path.exists(dst_csrpath): |
||||||
|
mw.execShell('rm -rf ' + dst_csrpath) |
||||||
|
if os.path.exists(dst_keypath): |
||||||
|
mw.execShell('rm -rf ' + dst_keypath) |
||||||
|
mw.restartNginx() |
||||||
|
return mw.returnData(True, '删除面板SSL成功!') |
||||||
|
|
||||||
|
mw.restartNginx() |
||||||
|
mw.restartMw() |
||||||
|
return mw.returnData(False, '已经删除面板SSL!') |
||||||
|
return mw.returnData(False, '未知类型!') |
||||||
|
|
||||||
|
# 面板本地SSL设置 |
||||||
|
def setPanelLocalSsl(self): |
||||||
|
pdir = mw.getPanelDir() |
||||||
|
|
||||||
|
cert = {} |
||||||
|
keyPath = pdir+'/ssl/local/private.pem' |
||||||
|
certPath = pdir+'/ssl/local/cert.pem' |
||||||
|
|
||||||
|
if not os.path.exists(certPath): |
||||||
|
mw.createLocalSSL() |
||||||
|
|
||||||
|
choose_file = self.__file['ssl'] |
||||||
|
mw.writeFile(choose_file, 'local') |
||||||
|
|
||||||
|
mw.restartMw() |
||||||
|
return mw.returnJson(True, '设置成功') |
||||||
|
|
||||||
|
# 申请面板let证书 |
||||||
|
# def applyPanelAcmeSsl(self): |
||||||
|
# bind_domain = self.__file['bind_domain'] |
||||||
|
# if not os.path.exists(bind_domain): |
||||||
|
# return mw.returnJson(False, '先要绑定域名!') |
||||||
|
|
||||||
|
# # 生成nginx配置 |
||||||
|
# domain = mw.readFile(bind_domain) |
||||||
|
# panel_tpl = mw.getRunDir() + "/data/tpl/nginx_panel.conf" |
||||||
|
# dst_panel_path = mw.getServerDir() + "/web_conf/nginx/vhost/panel.conf" |
||||||
|
# if not os.path.exists(dst_panel_path): |
||||||
|
# reg = r"^([\w\-\*]{1,100}\.){1,4}(\w{1,10}|\w{1,10}\.\w{1,10})$" |
||||||
|
# if not re.match(reg, domain): |
||||||
|
# return mw.returnJson(False, '主域名格式不正确') |
||||||
|
|
||||||
|
# op_dir = mw.getServerDir() + "/openresty" |
||||||
|
# if not os.path.exists(op_dir): |
||||||
|
# return mw.returnJson(False, '依赖OpenResty,先安装启动它!') |
||||||
|
|
||||||
|
# content = mw.readFile(panel_tpl) |
||||||
|
# content = content.replace("{$PORT}", "80") |
||||||
|
# content = content.replace("{$SERVER_NAME}", domain) |
||||||
|
# content = content.replace("{$PANAL_PORT}", mw.readFile('data/port.pl')) |
||||||
|
# content = content.replace("{$LOGPATH}", mw.getRunDir() + '/logs') |
||||||
|
# content = content.replace("{$PANAL_ADDR}", mw.getRunDir()) |
||||||
|
# mw.writeFile(dst_panel_path, content) |
||||||
|
# mw.restartNginx() |
||||||
|
|
||||||
|
# siteName = mw.readFile(bind_domain).strip() |
||||||
|
# auth_to = mw.getRunDir() + "/tmp" |
||||||
|
# to_args = { |
||||||
|
# 'domains': [siteName], |
||||||
|
# 'auth_type': 'http', |
||||||
|
# 'auth_to': auth_to, |
||||||
|
# } |
||||||
|
|
||||||
|
# src_path = mw.getServerDir() + '/web_conf/letsencrypt/' + siteName |
||||||
|
# src_csrpath = src_path + "/fullchain.pem" # 生成证书路径 |
||||||
|
# src_keypath = src_path + "/privkey.pem" # 密钥文件路径 |
||||||
|
|
||||||
|
# dst_path = mw.getRunDir() + '/ssl/nginx' |
||||||
|
# dst_csrpath = dst_path + '/cert.pem' |
||||||
|
# dst_keypath = dst_path + '/private.pem' |
||||||
|
|
||||||
|
# is_already_apply = False |
||||||
|
|
||||||
|
# if not os.path.exists(src_path): |
||||||
|
# import cert_api |
||||||
|
# data = cert_api.cert_api().applyCertApi(to_args) |
||||||
|
# if not data['status']: |
||||||
|
# msg = data['msg'] |
||||||
|
# if type(data['msg']) != str: |
||||||
|
# msg = data['msg'][0] |
||||||
|
# emsg = data['msg'][1]['challenges'][0]['error'] |
||||||
|
# msg = msg + '<p><span>响应状态:</span>' + str(emsg['status']) + '</p><p><span>错误类型:</span>' + emsg[ |
||||||
|
# 'type'] + '</p><p><span>错误代码:</span>' + emsg['detail'] + '</p>' |
||||||
|
# return mw.returnJson(data['status'], msg, data['msg']) |
||||||
|
# else: |
||||||
|
# is_already_apply = True |
||||||
|
|
||||||
|
# mw.buildSoftLink(src_csrpath, dst_csrpath, True) |
||||||
|
# mw.buildSoftLink(src_keypath, dst_keypath, True) |
||||||
|
# mw.execShell('echo "acme" > "' + dst_path + '/README"') |
||||||
|
|
||||||
|
# tmp_well_know = auth_to + '/.well-known' |
||||||
|
# if os.path.exists(tmp_well_know): |
||||||
|
# mw.execShell('rm -rf ' + tmp_well_know) |
||||||
|
|
||||||
|
# if os.path.exists(dst_path): |
||||||
|
# choose_file = self.__file['ssl'] |
||||||
|
# mw.writeFile(choose_file, 'nginx') |
||||||
|
|
||||||
|
# data = self.getPanelSslData() |
||||||
|
|
||||||
|
# if is_already_apply: |
||||||
|
# return mw.returnJson(True, '重复申请!', data) |
||||||
|
# return mw.returnJson(True, '申请成功!', data) |
Loading…
Reference in new issue