Merge branch 'v2-dev' into v2_admin_mode

This commit is contained in:
xiaojunnuo
2026-02-13 19:04:09 +08:00
5 changed files with 73 additions and 20 deletions
+2 -1
View File
@@ -30,4 +30,5 @@ test/**/*.js
/packages/ui/certd-server/data/keys.yaml /packages/ui/certd-server/data/keys.yaml
/packages/pro/ /packages/pro/
test.js test.js
.history .history
/logs
+31 -2
View File
@@ -7,7 +7,7 @@ import * as https from "node:https";
import { merge } from "lodash-es"; import { merge } from "lodash-es";
import { safePromise } from "./util.promise.js"; import { safePromise } from "./util.promise.js";
import fs from "fs"; import fs from "fs";
import sleep from "./util.sleep.js";
const errorMap: Record<string, string> = { const errorMap: Record<string, string> = {
"ssl3_get_record:wrong version number": "http协议错误,服务端要求http协议,请检查是否使用了https请求", "ssl3_get_record:wrong version number": "http协议错误,服务端要求http协议,请检查是否使用了https请求",
"getaddrinfo EAI_AGAIN": "无法解析域名,请检查网络连接或dns配置,更换docker-compose.yaml中dns配置", "getaddrinfo EAI_AGAIN": "无法解析域名,请检查网络连接或dns配置,更换docker-compose.yaml中dns配置",
@@ -148,6 +148,16 @@ export function createAxiosService({ logger }: { logger: ILogger }) {
// }); // });
// config.httpsAgent = agent; // config.httpsAgent = agent;
config.proxy = false; //必须 否则还会走一层代理, config.proxy = false; //必须 否则还会走一层代理,
config.retry = merge(
{
status: [421],
count: 0,
max: 3,
delay: 1000,
},
config.retry
);
return config; return config;
}, },
(error: Error) => { (error: Error) => {
@@ -175,7 +185,7 @@ export function createAxiosService({ logger }: { logger: ILogger }) {
} }
return response.data; return response.data;
}, },
(error: any) => { async (error: any) => {
const status = error.response?.status; const status = error.response?.status;
let message = ""; let message = "";
switch (status) { switch (status) {
@@ -215,6 +225,9 @@ export function createAxiosService({ logger }: { logger: ILogger }) {
case 302: case 302:
//重定向 //重定向
return Promise.resolve(error.response); return Promise.resolve(error.response);
case 421:
message = "源站请求超时";
break;
default: default:
break; break;
} }
@@ -256,6 +269,22 @@ export function createAxiosService({ logger }: { logger: ILogger }) {
if (error instanceof AggregateError) { if (error instanceof AggregateError) {
logger.error("AggregateError", error); logger.error("AggregateError", error);
} }
const originalRequest = error.config || {};
logger.info(`config`, originalRequest);
const retry = originalRequest.retry || {};
if (retry.status && retry.status.includes(status)) {
if (retry.max > 0 && retry.count < retry.max) {
// 重试次数增加
retry.count++;
const delay = retry.delay * retry.count;
logger.error(`status=${status},重试次数${retry.count},将在${delay}ms后重试,请求地址:${originalRequest.url}`);
await sleep(delay);
return service.request(originalRequest); // 重试请求
}
logger.error(`重试超过最大次数${retry.max},请求失败:${originalRequest.url}`);
}
const err = new HttpError(error); const err = new HttpError(error);
if (error.response?.config?.logParams === false) { if (error.response?.config?.logParams === false) {
delete err.request?.params; delete err.request?.params;
+15 -2
View File
@@ -13,6 +13,19 @@
// await testLocker(); // await testLocker();
import { domainUtils } from "./dist/utils/util.domain.js"; // import { domainUtils } from "./dist/utils/util.domain.js";
console.log(domainUtils.isIpv6("::0:0:0:FFFF:129.144.52.38")); // console.log(domainUtils.isIpv6("::0:0:0:FFFF:129.144.52.38"));
// import { http } from "./dist/utils/util.request.js";
// http
// .request({
// url: "https://www.baidu.com/234234/3333",
// retry: {
// status: [404],
// },
// })
// .then(res => {
// console.log(res.data);
// });
@@ -63,7 +63,10 @@ export class JDCloudDnsProvider extends AbstractDnsProvider {
domainId: domainId domainId: domainId
}; };
}catch (e) { }catch (e) {
this.logger.error(e) if (e.error){
this.logger.error(JSON.stringify(e.error))
throw new Error(JSON.stringify(e.error))
}
throw e throw e
} }
@@ -7,9 +7,9 @@ import { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from
@IsTaskPlugin({ @IsTaskPlugin({
name: "SafelineDeployToWebsitePlugin", name: "SafelineDeployToWebsitePlugin",
title: "雷池-更新证书", title: "雷池-更新证书(支持控制台和防护应用)",
icon: "svg:icon-safeline", icon: "svg:icon-safeline",
desc: "更新长亭雷池WAF的证书", desc: "更新长亭雷池WAF的证书,支持更新控制台和防护应用的证书。",
group: pluginGroups.panel.key, group: pluginGroups.panel.key,
default: { default: {
strategy: { strategy: {
@@ -51,7 +51,7 @@ export class SafelineDeployToWebsitePlugin extends AbstractTaskPlugin {
title: "雷池证书", title: "雷池证书",
typeName: "SafelineDeployToWebsitePlugin", typeName: "SafelineDeployToWebsitePlugin",
action: SafelineDeployToWebsitePlugin.prototype.onGetCertIds.name, action: SafelineDeployToWebsitePlugin.prototype.onGetCertIds.name,
helper: "请选择要更新的雷池的证书Id,需要先手动到雷池控制台上传一次", helper: "请选择要更新的雷池的证书Id,需要先手动到雷池控制台上传一次\n如果输入0,则表示新增证书,运行一次之后可以在雷池中使用该证书,最后记得在此处选择新上传的这个证书id,后续将进行自动更新",
required: true, required: true,
}) })
) )
@@ -69,19 +69,26 @@ export class SafelineDeployToWebsitePlugin extends AbstractTaskPlugin {
} }
async uploadCert(certId: number) { async uploadCert(certId: number) {
await this.doRequest({ const data:any = {
manual: {
crt: this.cert.crt,
key: this.cert.key,
},
type: 2,
};
let type = "新增"
// @ts-ignore
if (certId !== "0" && certId >0) {
//@ts-ignore
data.id = parseInt(certId)
type = "更新"
}
const res = await this.doRequest({
url: "/api/open/cert", url: "/api/open/cert",
method: "post", method: "post",
data: { data:data
id: certId,
manual: {
crt: this.cert.crt,
key: this.cert.key,
},
type: 2,
},
}); });
this.logger.info(`证书<${certId}>更新成功`); this.logger.info(`证书<${certId}>${type}成功,ID:${res}`);
} }
async doRequest(config: HttpRequestConfig<any>) { async doRequest(config: HttpRequestConfig<any>) {
@@ -109,7 +116,7 @@ export class SafelineDeployToWebsitePlugin extends AbstractTaskPlugin {
}); });
const nodes = res?.nodes; const nodes = res?.nodes;
if (!nodes || nodes.length === 0) { if (!nodes || nodes.length === 0) {
throw new Error("没有找到证书,请先在雷池控制台中手动上传证书,并关联防护站点,后续才可以自动更新"); throw new Error("没有找到证书,请先在雷池控制台中手动上传证书,并关联防护站点或控制台面板使用该证书,后续才可以自动更新");
} }
const options = nodes.map(item => { const options = nodes.map(item => {
return { return {