diff --git a/.gitignore b/.gitignore index 9c7c6565e..e3c1e6bf4 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,5 @@ test/**/*.js /packages/ui/certd-server/data/keys.yaml /packages/pro/ test.js -.history \ No newline at end of file +.history +/logs \ No newline at end of file diff --git a/packages/core/basic/src/utils/util.request.ts b/packages/core/basic/src/utils/util.request.ts index e64d59591..7fdc45097 100644 --- a/packages/core/basic/src/utils/util.request.ts +++ b/packages/core/basic/src/utils/util.request.ts @@ -7,7 +7,7 @@ import * as https from "node:https"; import { merge } from "lodash-es"; import { safePromise } from "./util.promise.js"; import fs from "fs"; - +import sleep from "./util.sleep.js"; const errorMap: Record = { "ssl3_get_record:wrong version number": "http协议错误,服务端要求http协议,请检查是否使用了https请求", "getaddrinfo EAI_AGAIN": "无法解析域名,请检查网络连接或dns配置,更换docker-compose.yaml中dns配置", @@ -148,6 +148,16 @@ export function createAxiosService({ logger }: { logger: ILogger }) { // }); // config.httpsAgent = agent; config.proxy = false; //必须 否则还会走一层代理, + + config.retry = merge( + { + status: [421], + count: 0, + max: 3, + delay: 1000, + }, + config.retry + ); return config; }, (error: Error) => { @@ -175,7 +185,7 @@ export function createAxiosService({ logger }: { logger: ILogger }) { } return response.data; }, - (error: any) => { + async (error: any) => { const status = error.response?.status; let message = ""; switch (status) { @@ -215,6 +225,9 @@ export function createAxiosService({ logger }: { logger: ILogger }) { case 302: //重定向 return Promise.resolve(error.response); + case 421: + message = "源站请求超时"; + break; default: break; } @@ -256,6 +269,22 @@ export function createAxiosService({ logger }: { logger: ILogger }) { if (error instanceof AggregateError) { 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); if (error.response?.config?.logParams === false) { delete err.request?.params; diff --git a/packages/core/basic/test.mjs b/packages/core/basic/test.mjs index c8889c56e..1a679ce2c 100644 --- a/packages/core/basic/test.mjs +++ b/packages/core/basic/test.mjs @@ -13,6 +13,19 @@ // 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); +// }); diff --git a/packages/ui/certd-server/src/plugins/plugin-jdcloud/dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-jdcloud/dns-provider.ts index a7f4bc4e0..8572833d6 100644 --- a/packages/ui/certd-server/src/plugins/plugin-jdcloud/dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-jdcloud/dns-provider.ts @@ -63,7 +63,10 @@ export class JDCloudDnsProvider extends AbstractDnsProvider { domainId: domainId }; }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 } diff --git a/packages/ui/certd-server/src/plugins/plugin-plus/safeline/plugins/deploy-to-website.ts b/packages/ui/certd-server/src/plugins/plugin-plus/safeline/plugins/deploy-to-website.ts index f8679e3be..63aeaf3d0 100644 --- a/packages/ui/certd-server/src/plugins/plugin-plus/safeline/plugins/deploy-to-website.ts +++ b/packages/ui/certd-server/src/plugins/plugin-plus/safeline/plugins/deploy-to-website.ts @@ -7,9 +7,9 @@ import { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from @IsTaskPlugin({ name: "SafelineDeployToWebsitePlugin", - title: "雷池-更新证书", + title: "雷池-更新证书(支持控制台和防护应用)", icon: "svg:icon-safeline", - desc: "更新长亭雷池WAF的证书", + desc: "更新长亭雷池WAF的证书,支持更新控制台和防护应用的证书。", group: pluginGroups.panel.key, default: { strategy: { @@ -51,7 +51,7 @@ export class SafelineDeployToWebsitePlugin extends AbstractTaskPlugin { title: "雷池证书", typeName: "SafelineDeployToWebsitePlugin", action: SafelineDeployToWebsitePlugin.prototype.onGetCertIds.name, - helper: "请选择要更新的雷池的证书Id,需要先手动到雷池控制台上传一次", + helper: "请选择要更新的雷池的证书Id,需要先手动到雷池控制台上传一次\n如果输入0,则表示新增证书,运行一次之后可以在雷池中使用该证书,最后记得在此处选择新上传的这个证书id,后续将进行自动更新", required: true, }) ) @@ -69,19 +69,26 @@ export class SafelineDeployToWebsitePlugin extends AbstractTaskPlugin { } 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", method: "post", - data: { - id: certId, - manual: { - crt: this.cert.crt, - key: this.cert.key, - }, - type: 2, - }, + data:data }); - this.logger.info(`证书<${certId}>更新成功`); + this.logger.info(`证书<${certId}>${type}成功,ID:${res}`); } async doRequest(config: HttpRequestConfig) { @@ -109,7 +116,7 @@ export class SafelineDeployToWebsitePlugin extends AbstractTaskPlugin { }); const nodes = res?.nodes; if (!nodes || nodes.length === 0) { - throw new Error("没有找到证书,请先在雷池控制台中手动上传证书,并关联防护站点,后续才可以自动更新"); + throw new Error("没有找到证书,请先在雷池控制台中手动上传证书,并关联防护站点或控制台面板使用该证书,后续才可以自动更新"); } const options = nodes.map(item => { return {