mirror of
https://github.com/certd/certd.git
synced 2026-04-07 16:40:54 +08:00
Compare commits
38 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2acaa66635 | ||
|
|
ee5eecbec1 | ||
|
|
687bb8a237 | ||
|
|
e51123a951 | ||
|
|
92bb12e2e3 | ||
|
|
fd0536bd4b | ||
|
|
57389a79a1 | ||
|
|
6cd7bddc37 | ||
|
|
c3c5006daa | ||
|
|
27a8a57cf5 | ||
|
|
3bded6fdcc | ||
|
|
c7f31337ce | ||
|
|
fd507f2692 | ||
|
|
96a39ef9c3 | ||
|
|
81a8d6c3bf | ||
|
|
d4719208f0 | ||
|
|
c36dce6464 | ||
|
|
2da4474bb1 | ||
|
|
cab11202c7 | ||
|
|
21d7d35bb1 | ||
|
|
0725c663c4 | ||
|
|
ce82239c8b | ||
|
|
2523008cb6 | ||
|
|
69212b9ad1 | ||
|
|
636cb3399b | ||
|
|
86ca35ce33 | ||
|
|
675ab31305 | ||
|
|
83c2d743bc | ||
|
|
2c87b3d906 | ||
|
|
05b6159802 | ||
|
|
c56f48c1e3 | ||
|
|
e18e399ce6 | ||
|
|
d66ade4e47 | ||
|
|
90b045af6d | ||
|
|
5cccb21175 | ||
|
|
1a71969403 | ||
|
|
389a1fbd04 | ||
|
|
ca02ae6183 |
34
CHANGELOG.md
34
CHANGELOG.md
@@ -3,6 +3,40 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 修复编辑通知勾选默认,导致出现多个默认通知的bug ([6cd7bdd](https://github.com/certd/certd/commit/6cd7bddc37da8b0d7b9860fd9a26ddfe84c869a7))
|
||||
* 修复网站监控无法设置端口的bug ([27a8a57](https://github.com/certd/certd/commit/27a8a57cf52b4bf83d628aa3049be1efaa74f29c))
|
||||
* 修复lego模式无法创建流水线的bug ([687bb8a](https://github.com/certd/certd/commit/687bb8a2376d0de7b72739a174e4a9560581f866))
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 优化通知格式 ([c3c5006](https://github.com/certd/certd/commit/c3c5006daa39c20624cb58864f2b92b230a38a7a))
|
||||
* 优化scp上传 ([e51123a](https://github.com/certd/certd/commit/e51123a95131cc76d655937488caf08956a67020))
|
||||
* 优化txt本地校验效率 ([fd507f2](https://github.com/certd/certd/commit/fd507f269253607e68c5c099c99e0de11636f229))
|
||||
* 支持又拍云cdn ([fd0536b](https://github.com/certd/certd/commit/fd0536bd4b41f15b6b5d42e0b447f0dcbf73b8a8))
|
||||
* 支持又拍云cdn ([57389a7](https://github.com/certd/certd/commit/57389a79a1a61c45d081712562f8b33c9633158e))
|
||||
|
||||
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 增加服务器时间警告 ([d66ade4](https://github.com/certd/certd/commit/d66ade4e4783850b6c7625c6f164a5a0fc0aa509))
|
||||
* 支持部署到lucky ([e18e399](https://github.com/certd/certd/commit/e18e399ce6529e8c7e36b56c5f674cfdbbd3d3d1))
|
||||
|
||||
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 修复dns.la无法申请证书的bug ([90b045a](https://github.com/certd/certd/commit/90b045af6d1a4f46986e4b118885c1f050df067c))
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 上传到主机支持scp方式 ([05b6159](https://github.com/certd/certd/commit/05b6159802b9e85b6a410361b60b5c28875b48e7))
|
||||
* 优化图标 ([c56f48c](https://github.com/certd/certd/commit/c56f48c1e3c54c4e203fafb380d9091d75681b7e))
|
||||
|
||||
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
@@ -1 +1 @@
|
||||
02:10
|
||||
00:05
|
||||
|
||||
@@ -5,6 +5,7 @@ import lightbox from "vitepress-plugin-lightbox";
|
||||
// https://vitepress.dev/reference/site-config
|
||||
export default defineConfig({
|
||||
title: "Certd",
|
||||
titleTemplate: "开源SSL证书管理工具,证书自动化申请部署,让你的网站证书永不过期",
|
||||
description: "Certd帮助文档,Certd是一款开源免费的全自动SSL证书管理工具;证书自动化申请部署流水线;自动证书申请、更新、续期;通配符证书,泛域名证书申请;证书自动化部署到阿里云、腾讯云、主机、群晖、宝塔。",
|
||||
markdown: {
|
||||
config: (md) => {
|
||||
|
||||
@@ -3,6 +3,31 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 增加服务器时间警告 ([d66ade4](https://github.com/certd/certd/commit/d66ade4e4783850b6c7625c6f164a5a0fc0aa509))
|
||||
* 支持部署到lucky ([e18e399](https://github.com/certd/certd/commit/e18e399ce6529e8c7e36b56c5f674cfdbbd3d3d1))
|
||||
|
||||
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 修复dns.la无法申请证书的bug ([90b045a](https://github.com/certd/certd/commit/90b045af6d1a4f46986e4b118885c1f050df067c))
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 上传到主机支持scp方式 ([05b6159](https://github.com/certd/certd/commit/05b6159802b9e85b6a410361b60b5c28875b48e7))
|
||||
* 优化图标 ([c56f48c](https://github.com/certd/certd/commit/c56f48c1e3c54c4e203fafb380d9091d75681b7e))
|
||||
|
||||
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 修复通知选择器无法选择的bug ([f7b88f9](https://github.com/certd/certd/commit/f7b88f9e3b7d9d9122e4fd2003a20c555bd50c7d))
|
||||
* 修复证书流水线创建失败的bug ([736fe03](https://github.com/certd/certd/commit/736fe038ebda56648bcc4c12884a700341d2c049))
|
||||
|
||||
## [1.31.4](https://github.com/certd/certd/compare/v1.31.3...v1.31.4) (2025-03-21)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
@@ -9,5 +9,5 @@
|
||||
}
|
||||
},
|
||||
"npmClient": "pnpm",
|
||||
"version": "1.31.5"
|
||||
"version": "1.31.8"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,20 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.31.8](https://github.com/publishlab/node-acme-client/compare/v1.31.7...v1.31.8) (2025-03-26)
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 优化txt本地校验效率 ([fd507f2](https://github.com/publishlab/node-acme-client/commit/fd507f269253607e68c5c099c99e0de11636f229))
|
||||
|
||||
## [1.31.7](https://github.com/publishlab/node-acme-client/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||
|
||||
**Note:** Version bump only for package @certd/acme-client
|
||||
|
||||
## [1.31.6](https://github.com/publishlab/node-acme-client/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||
|
||||
**Note:** Version bump only for package @certd/acme-client
|
||||
|
||||
## [1.31.5](https://github.com/publishlab/node-acme-client/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||
|
||||
**Note:** Version bump only for package @certd/acme-client
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"description": "Simple and unopinionated ACME client",
|
||||
"private": false,
|
||||
"author": "nmorsman",
|
||||
"version": "1.31.5",
|
||||
"version": "1.31.8",
|
||||
"type": "module",
|
||||
"module": "scr/index.js",
|
||||
"main": "src/index.js",
|
||||
@@ -18,7 +18,7 @@
|
||||
"types"
|
||||
],
|
||||
"dependencies": {
|
||||
"@certd/basic": "^1.31.5",
|
||||
"@certd/basic": "^1.31.8",
|
||||
"@peculiar/x509": "^1.11.0",
|
||||
"asn1js": "^3.0.5",
|
||||
"axios": "^1.7.2",
|
||||
@@ -67,5 +67,5 @@
|
||||
"bugs": {
|
||||
"url": "https://github.com/publishlab/node-acme-client/issues"
|
||||
},
|
||||
"gitHead": "b649617e0457b4e177bacb173dc1aa67eb84d7cf"
|
||||
"gitHead": "0725c663c49d72226c9fb55e2c0c5d134c93ba58"
|
||||
}
|
||||
|
||||
@@ -53,10 +53,10 @@ export default async (client, userOpts) => {
|
||||
|
||||
try {
|
||||
client.getAccountUrl();
|
||||
log('[auto] Account URL already exists, skipping account registration');
|
||||
log('[auto] Account URL already exists, skipping account registration( 证书申请账户已存在,跳过注册 )');
|
||||
}
|
||||
catch (e) {
|
||||
log('[auto] Registering account');
|
||||
log('[auto] Registering account (注册证书申请账户)');
|
||||
await client.createAccount(accountPayload);
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ export default async (client, userOpts) => {
|
||||
* Parse domains from CSR
|
||||
*/
|
||||
|
||||
log('[auto] Parsing domains from Certificate Signing Request');
|
||||
log('[auto] Parsing domains from Certificate Signing Request ');
|
||||
const { commonName, altNames } = readCsrDomains(opts.csr);
|
||||
const uniqueDomains = Array.from(new Set([commonName].concat(altNames).filter((d) => d)));
|
||||
|
||||
@@ -120,20 +120,20 @@ export default async (client, userOpts) => {
|
||||
// throw new Error('测试异常');
|
||||
/* Challenge verification */
|
||||
if (opts.skipChallengeVerification === true) {
|
||||
log(`[auto] [${d}] Skipping challenge verification since skipChallengeVerification=true,wait 60s`);
|
||||
log(`[auto] [${d}] 跳过本地验证(skipChallengeVerification=true),等待 60s`);
|
||||
await wait(60 * 1000);
|
||||
}
|
||||
else {
|
||||
log(`[auto] [${d}] Running challenge verification, type = ${challenge.type}`);
|
||||
log(`[auto] [${d}] 开始本地验证, type = ${challenge.type}`);
|
||||
try {
|
||||
await client.verifyChallenge(authz, challenge);
|
||||
}
|
||||
catch (e) {
|
||||
log(`[auto] [${d}] challenge verification threw error: ${e.message}`);
|
||||
log(`[auto] [${d}] 本地验证失败,尝试请求ACME提供商获取状态: ${e.message}`);
|
||||
}
|
||||
}
|
||||
/* Complete challenge and wait for valid status */
|
||||
log(`[auto] [${d}] Completing challenge with ACME provider and waiting for valid status`);
|
||||
log(`[auto] [${d}] 请求ACME提供商完成验证,等待返回valid状态`);
|
||||
await client.completeChallenge(challenge);
|
||||
challengeCompleted = true;
|
||||
|
||||
|
||||
@@ -500,7 +500,7 @@ class AcmeClient {
|
||||
await verify[challenge.type](authz, challenge, keyAuthorization);
|
||||
};
|
||||
|
||||
log('Waiting for ACME challenge verification', this.backoffOpts);
|
||||
log('Waiting for ACME challenge verification(等待ACME挑战验证)', this.backoffOpts);
|
||||
return util.retry(verifyFn, this.backoffOpts);
|
||||
}
|
||||
|
||||
@@ -568,14 +568,14 @@ class AcmeClient {
|
||||
const resp = await this.api.apiRequest(item.url, null, [200]);
|
||||
|
||||
/* Verify status */
|
||||
log(`Item has status: ${resp.data.status}`);
|
||||
log(`Item has status(挑战状态): ${resp.data.status}`);
|
||||
|
||||
if (invalidStates.includes(resp.data.status)) {
|
||||
abort();
|
||||
throw new Error(util.formatResponseError(resp));
|
||||
}
|
||||
else if (pendingStates.includes(resp.data.status)) {
|
||||
throw new Error('Operation is pending or processing');
|
||||
throw new Error('Operation is pending or processing(当前仍然在等待状态)');
|
||||
}
|
||||
else if (validStates.includes(resp.data.status)) {
|
||||
return resp.data;
|
||||
@@ -584,7 +584,7 @@ class AcmeClient {
|
||||
throw new Error(`Unexpected item status: ${resp.data.status}`);
|
||||
};
|
||||
|
||||
log(`Waiting for valid status from: ${item.url}`, this.backoffOpts);
|
||||
log(`Waiting for valid status (等待valid状态): ${item.url}`, this.backoffOpts);
|
||||
return util.retry(verifyFn, this.backoffOpts);
|
||||
}
|
||||
|
||||
|
||||
@@ -60,8 +60,9 @@ async function retryPromise(fn, attempts, backoff) {
|
||||
throw e;
|
||||
}
|
||||
|
||||
log(`Promise rejected: ${e.message}`);
|
||||
const duration = backoff.duration();
|
||||
log(`Promise rejected attempt #${backoff.attempts}, retrying in ${duration}ms: ${e.message}`);
|
||||
log(`Promise rejected attempt #${backoff.attempts}, ${duration}ms 后重试: ${e.message}`);
|
||||
|
||||
await new Promise((resolve) => { setTimeout(resolve, duration); });
|
||||
return retryPromise(fn, attempts, backoff);
|
||||
@@ -241,7 +242,7 @@ async function resolveDomainBySoaRecord(recordName) {
|
||||
*/
|
||||
|
||||
async function getAuthoritativeDnsResolver(recordName) {
|
||||
log(`Locating authoritative NS records for name: ${recordName}`);
|
||||
log(`Locating authoritative NS records for name: ${recordName} (获取域名的权威NS服务器)`);
|
||||
const resolver = new dns.Resolver();
|
||||
|
||||
try {
|
||||
@@ -249,13 +250,14 @@ async function getAuthoritativeDnsResolver(recordName) {
|
||||
const domain = await resolveDomainBySoaRecord(recordName);
|
||||
|
||||
/* Resolve authoritative NS addresses */
|
||||
log(`Looking up authoritative NS records for domain: ${domain}`);
|
||||
log(`Looking up authoritative NS records for domain(获取域名的权威NS服务器): ${domain}`);
|
||||
const nsRecords = await dns.resolveNs(domain);
|
||||
log(`域名权威NS服务器:${nsRecords}`);
|
||||
const nsAddrArray = await Promise.all(nsRecords.map(async (r) => dns.resolve4(r)));
|
||||
const nsAddresses = [].concat(...nsAddrArray).filter((a) => a);
|
||||
|
||||
if (!nsAddresses.length) {
|
||||
throw new Error(`Unable to locate any valid authoritative NS addresses for domain: ${domain}`);
|
||||
throw new Error(`Unable to locate any valid authoritative NS addresses for domain(获取权威服务器IP失败): ${domain}`);
|
||||
}
|
||||
|
||||
/* Authoritative NS success */
|
||||
@@ -263,12 +265,12 @@ async function getAuthoritativeDnsResolver(recordName) {
|
||||
resolver.setServers(nsAddresses);
|
||||
}
|
||||
catch (e) {
|
||||
log(`Authoritative NS lookup error: ${e.message}`);
|
||||
log(`Authoritative NS lookup error(获取权威NS服务器地址失败): ${e.message}`);
|
||||
}
|
||||
|
||||
/* Return resolver */
|
||||
const addresses = resolver.getServers();
|
||||
log(`DNS resolver addresses: ${addresses.join(', ')}`);
|
||||
log(`DNS resolver addresses(域名的权威NS服务器地址): ${addresses.join(', ')}`);
|
||||
|
||||
return resolver;
|
||||
}
|
||||
|
||||
@@ -82,21 +82,40 @@ async function walkDnsChallengeRecord(recordName, resolver = dns) {
|
||||
}
|
||||
|
||||
export async function walkTxtRecord(recordName) {
|
||||
|
||||
const txtRecords = []
|
||||
try {
|
||||
/* Default DNS resolver first */
|
||||
log('Attempting to resolve TXT with default DNS resolver first');
|
||||
log('从本地DNS服务器获取TXT解析记录');
|
||||
const res = await walkDnsChallengeRecord(recordName);
|
||||
if (res && res.length > 0) {
|
||||
return res;
|
||||
for (const item of res) {
|
||||
txtRecords.push(item)
|
||||
}
|
||||
}
|
||||
throw new Error('No TXT records found');
|
||||
|
||||
} catch (e) {
|
||||
log(`本地获取TXT解析记录失败:${e.message}`)
|
||||
}
|
||||
catch (e) {
|
||||
|
||||
try{
|
||||
/* Authoritative DNS resolver */
|
||||
log(`Error using default resolver, attempting to resolve TXT with authoritative NS: ${e.message}`);
|
||||
log(`从域名权威服务器获取TXT解析记录`);
|
||||
const authoritativeResolver = await util.getAuthoritativeDnsResolver(recordName);
|
||||
return await walkDnsChallengeRecord(recordName, authoritativeResolver);
|
||||
const res = await walkDnsChallengeRecord(recordName, authoritativeResolver);
|
||||
if (res && res.length > 0) {
|
||||
for (const item of res) {
|
||||
txtRecords.push(item)
|
||||
}
|
||||
}
|
||||
}catch (e) {
|
||||
log(`权威服务器获取TXT解析记录失败:${e.message}`)
|
||||
}
|
||||
|
||||
if (txtRecords.length === 0) {
|
||||
throw new Error(`没有找到TXT解析记录(${recordName})`);
|
||||
}
|
||||
return txtRecords;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -113,14 +132,14 @@ export async function walkTxtRecord(recordName) {
|
||||
|
||||
async function verifyDnsChallenge(authz, challenge, keyAuthorization, prefix = '_acme-challenge.') {
|
||||
const recordName = `${prefix}${authz.identifier.value}`;
|
||||
log(`Resolving DNS TXT from record: ${recordName}`);
|
||||
log(`本地校验TXT记录): ${recordName}`);
|
||||
const recordValues = await walkTxtRecord(recordName);
|
||||
log(`DNS query finished successfully, found ${recordValues.length} TXT records`);
|
||||
log(`DNS查询成功, 找到 ${recordValues.length} 条TXT记录`);
|
||||
if (!recordValues.length || !recordValues.includes(keyAuthorization)) {
|
||||
throw new Error(`Authorization not found in DNS TXT record: ${recordName},need:${keyAuthorization},found:${recordValues}`);
|
||||
throw new Error(`没有找到需要的DNS TXT记录: ${recordName},期望:${keyAuthorization},结果:${recordValues}`);
|
||||
}
|
||||
|
||||
log(`Key authorization match for ${challenge.type}/${recordName}, ACME challenge verified`);
|
||||
log(`关键授权匹配成功(${challenge.type}/${recordName}),校验成功, ACME challenge verified`);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,20 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 支持又拍云cdn ([fd0536b](https://github.com/certd/certd/commit/fd0536bd4b41f15b6b5d42e0b447f0dcbf73b8a8))
|
||||
|
||||
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||
|
||||
**Note:** Version bump only for package @certd/basic
|
||||
|
||||
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||
|
||||
**Note:** Version bump only for package @certd/basic
|
||||
|
||||
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||
|
||||
**Note:** Version bump only for package @certd/basic
|
||||
|
||||
@@ -1 +1 @@
|
||||
15:01
|
||||
21:57
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/basic",
|
||||
"private": false,
|
||||
"version": "1.31.5",
|
||||
"version": "1.31.8",
|
||||
"type": "module",
|
||||
"main": "./dist/index.js",
|
||||
"module": "./dist/index.js",
|
||||
@@ -44,5 +44,5 @@
|
||||
"tslib": "^2.8.1",
|
||||
"typescript": "^5.4.2"
|
||||
},
|
||||
"gitHead": "b649617e0457b4e177bacb173dc1aa67eb84d7cf"
|
||||
"gitHead": "0725c663c49d72226c9fb55e2c0c5d134c93ba58"
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { customAlphabet } from 'nanoid';
|
||||
import { customAlphabet } from "nanoid";
|
||||
|
||||
export const randomNumber = customAlphabet('1234567890', 4);
|
||||
export const simpleNanoId = customAlphabet('1234567890abcdefghijklmopqrstuvwxyz', 12);
|
||||
export const randomNumber = customAlphabet("1234567890", 4);
|
||||
export const simpleNanoId = customAlphabet("1234567890abcdefghijklmopqrstuvwxyz", 12);
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
|
||||
|
||||
**Note:** Version bump only for package @certd/pipeline
|
||||
|
||||
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||
|
||||
**Note:** Version bump only for package @certd/pipeline
|
||||
|
||||
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||
|
||||
**Note:** Version bump only for package @certd/pipeline
|
||||
|
||||
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||
|
||||
**Note:** Version bump only for package @certd/pipeline
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/pipeline",
|
||||
"private": false,
|
||||
"version": "1.31.5",
|
||||
"version": "1.31.8",
|
||||
"type": "module",
|
||||
"main": "./dist/index.js",
|
||||
"module": "./dist/index.js",
|
||||
@@ -16,8 +16,8 @@
|
||||
"test": "mocha --loader=ts-node/esm"
|
||||
},
|
||||
"dependencies": {
|
||||
"@certd/basic": "^1.31.5",
|
||||
"@certd/plus-core": "^1.31.5",
|
||||
"@certd/basic": "^1.31.8",
|
||||
"@certd/plus-core": "^1.31.8",
|
||||
"dayjs": "^1.11.7",
|
||||
"lodash-es": "^4.17.21",
|
||||
"reflect-metadata": "^0.1.13"
|
||||
@@ -43,5 +43,5 @@
|
||||
"tslib": "^2.8.1",
|
||||
"typescript": "^5.4.2"
|
||||
},
|
||||
"gitHead": "b649617e0457b4e177bacb173dc1aa67eb84d7cf"
|
||||
"gitHead": "0725c663c49d72226c9fb55e2c0c5d134c93ba58"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-huawei
|
||||
|
||||
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-huawei
|
||||
|
||||
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-huawei
|
||||
|
||||
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-huawei
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/lib-huawei",
|
||||
"private": false,
|
||||
"version": "1.31.5",
|
||||
"version": "1.31.8",
|
||||
"main": "./dist/bundle.js",
|
||||
"module": "./dist/bundle.js",
|
||||
"types": "./dist/d/index.d.ts",
|
||||
@@ -23,5 +23,5 @@
|
||||
"prettier": "^2.8.8",
|
||||
"tslib": "^2.8.1"
|
||||
},
|
||||
"gitHead": "b649617e0457b4e177bacb173dc1aa67eb84d7cf"
|
||||
"gitHead": "0725c663c49d72226c9fb55e2c0c5d134c93ba58"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-iframe
|
||||
|
||||
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-iframe
|
||||
|
||||
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-iframe
|
||||
|
||||
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-iframe
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/lib-iframe",
|
||||
"private": false,
|
||||
"version": "1.31.5",
|
||||
"version": "1.31.8",
|
||||
"type": "module",
|
||||
"main": "./dist/index.js",
|
||||
"module": "./dist/index.js",
|
||||
@@ -30,5 +30,5 @@
|
||||
"tslib": "^2.8.1",
|
||||
"typescript": "^5.4.2"
|
||||
},
|
||||
"gitHead": "b649617e0457b4e177bacb173dc1aa67eb84d7cf"
|
||||
"gitHead": "0725c663c49d72226c9fb55e2c0c5d134c93ba58"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-k8s
|
||||
|
||||
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-k8s
|
||||
|
||||
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-k8s
|
||||
|
||||
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-k8s
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/lib-k8s",
|
||||
"private": false,
|
||||
"version": "1.31.5",
|
||||
"version": "1.31.8",
|
||||
"type": "module",
|
||||
"main": "./dist/index.js",
|
||||
"module": "./dist/index.js",
|
||||
@@ -16,7 +16,7 @@
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"@certd/basic": "^1.31.5",
|
||||
"@certd/basic": "^1.31.8",
|
||||
"@kubernetes/client-node": "0.21.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -31,5 +31,5 @@
|
||||
"tslib": "^2.8.1",
|
||||
"typescript": "^5.4.2"
|
||||
},
|
||||
"gitHead": "b649617e0457b4e177bacb173dc1aa67eb84d7cf"
|
||||
"gitHead": "0725c663c49d72226c9fb55e2c0c5d134c93ba58"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-server
|
||||
|
||||
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-server
|
||||
|
||||
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-server
|
||||
|
||||
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||
|
||||
**Note:** Version bump only for package @certd/lib-server
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@certd/lib-server",
|
||||
"version": "1.31.5",
|
||||
"version": "1.31.8",
|
||||
"description": "midway with flyway, sql upgrade way ",
|
||||
"private": false,
|
||||
"type": "module",
|
||||
@@ -27,10 +27,10 @@
|
||||
],
|
||||
"license": "AGPL",
|
||||
"dependencies": {
|
||||
"@certd/acme-client": "^1.31.5",
|
||||
"@certd/basic": "^1.31.5",
|
||||
"@certd/pipeline": "^1.31.5",
|
||||
"@certd/plus-core": "^1.31.5",
|
||||
"@certd/acme-client": "^1.31.8",
|
||||
"@certd/basic": "^1.31.8",
|
||||
"@certd/pipeline": "^1.31.8",
|
||||
"@certd/plus-core": "^1.31.8",
|
||||
"@midwayjs/cache": "~3.14.0",
|
||||
"@midwayjs/core": "~3.20.3",
|
||||
"@midwayjs/i18n": "~3.20.3",
|
||||
@@ -61,5 +61,5 @@
|
||||
"typeorm": "^0.3.11",
|
||||
"typescript": "^5.4.2"
|
||||
},
|
||||
"gitHead": "b649617e0457b4e177bacb173dc1aa67eb84d7cf"
|
||||
"gitHead": "0725c663c49d72226c9fb55e2c0c5d134c93ba58"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
|
||||
|
||||
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||
|
||||
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||
|
||||
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||
|
||||
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||
|
||||
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||
|
||||
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||
|
||||
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@certd/midway-flyway-js",
|
||||
"version": "1.31.5",
|
||||
"version": "1.31.8",
|
||||
"description": "midway with flyway, sql upgrade way ",
|
||||
"private": false,
|
||||
"type": "module",
|
||||
@@ -46,5 +46,5 @@
|
||||
"typeorm": "^0.3.11",
|
||||
"typescript": "^5.4.2"
|
||||
},
|
||||
"gitHead": "b649617e0457b4e177bacb173dc1aa67eb84d7cf"
|
||||
"gitHead": "0725c663c49d72226c9fb55e2c0c5d134c93ba58"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,20 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 修复lego模式无法创建流水线的bug ([687bb8a](https://github.com/certd/certd/commit/687bb8a2376d0de7b72739a174e4a9560581f866))
|
||||
|
||||
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||
|
||||
**Note:** Version bump only for package @certd/plugin-cert
|
||||
|
||||
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||
|
||||
**Note:** Version bump only for package @certd/plugin-cert
|
||||
|
||||
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||
|
||||
**Note:** Version bump only for package @certd/plugin-cert
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/plugin-cert",
|
||||
"private": false,
|
||||
"version": "1.31.5",
|
||||
"version": "1.31.8",
|
||||
"type": "module",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -15,10 +15,10 @@
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"@certd/acme-client": "^1.31.5",
|
||||
"@certd/basic": "^1.31.5",
|
||||
"@certd/pipeline": "^1.31.5",
|
||||
"@certd/plugin-lib": "^1.31.5",
|
||||
"@certd/acme-client": "^1.31.8",
|
||||
"@certd/basic": "^1.31.8",
|
||||
"@certd/pipeline": "^1.31.8",
|
||||
"@certd/plugin-lib": "^1.31.8",
|
||||
"@google-cloud/publicca": "^1.3.0",
|
||||
"dayjs": "^1.11.7",
|
||||
"jszip": "^3.10.1",
|
||||
@@ -41,5 +41,5 @@
|
||||
"tslib": "^2.8.1",
|
||||
"typescript": "^5.4.2"
|
||||
},
|
||||
"gitHead": "b649617e0457b4e177bacb173dc1aa67eb84d7cf"
|
||||
"gitHead": "0725c663c49d72226c9fb55e2c0c5d134c93ba58"
|
||||
}
|
||||
|
||||
@@ -269,14 +269,14 @@ HTTP文件验证:不支持泛域名,需要配置网站文件上传`,
|
||||
|
||||
@TaskInput({
|
||||
title: "检查解析重试次数",
|
||||
value: 35,
|
||||
value: 20,
|
||||
component: {
|
||||
name: "a-input-number",
|
||||
vModel: "value",
|
||||
},
|
||||
helper: "检查域名验证解析记录重试次数,如果你的域名服务商解析生效速度慢,可以适当增加此值",
|
||||
})
|
||||
maxCheckRetryCount = 35;
|
||||
maxCheckRetryCount = 20;
|
||||
|
||||
acme!: AcmeService;
|
||||
|
||||
|
||||
@@ -179,11 +179,7 @@ export class CertApplyLegoPlugin extends CertApplyBasePlugin {
|
||||
if (this.acmeServer) {
|
||||
serverArgs = ` --server ${this.acmeServer}`;
|
||||
}
|
||||
const cmds = [
|
||||
`${legoPath} -a --email "${this.email}" --dns ${this.dnsType} ${keyType} ${domainArgs} ${serverArgs} ${eabArgs} ${savePathArgs} ${
|
||||
this.customArgs || ""
|
||||
} run`,
|
||||
];
|
||||
const cmds = [`${legoPath} -a --email "${this.email}" --dns ${this.dnsType} ${keyType} ${domainArgs} ${serverArgs} ${eabArgs} ${savePathArgs} ${this.customArgs || ""} run`];
|
||||
|
||||
await this.ctx.utils.sp.spawn({
|
||||
cmd: cmds,
|
||||
|
||||
@@ -3,6 +3,22 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 优化scp上传 ([e51123a](https://github.com/certd/certd/commit/e51123a95131cc76d655937488caf08956a67020))
|
||||
|
||||
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||
|
||||
**Note:** Version bump only for package @certd/plugin-lib
|
||||
|
||||
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 上传到主机支持scp方式 ([05b6159](https://github.com/certd/certd/commit/05b6159802b9e85b6a410361b60b5c28875b48e7))
|
||||
|
||||
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||
|
||||
**Note:** Version bump only for package @certd/plugin-lib
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@certd/plugin-lib",
|
||||
"private": false,
|
||||
"version": "1.31.5",
|
||||
"version": "1.31.8",
|
||||
"type": "module",
|
||||
"main": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -16,8 +16,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@alicloud/pop-core": "^1.7.10",
|
||||
"@certd/basic": "^1.31.5",
|
||||
"@certd/pipeline": "^1.31.5",
|
||||
"@certd/basic": "^1.31.8",
|
||||
"@certd/pipeline": "^1.31.8",
|
||||
"@kubernetes/client-node": "0.21.0",
|
||||
"ali-oss": "^6.21.0",
|
||||
"basic-ftp": "^5.0.5",
|
||||
@@ -48,5 +48,5 @@
|
||||
"tslib": "^2.8.1",
|
||||
"typescript": "^5.4.2"
|
||||
},
|
||||
"gitHead": "b649617e0457b4e177bacb173dc1aa67eb84d7cf"
|
||||
"gitHead": "0725c663c49d72226c9fb55e2c0c5d134c93ba58"
|
||||
}
|
||||
|
||||
@@ -7,6 +7,8 @@ import { SshAccess } from "./ssh-access.js";
|
||||
import stripAnsi from "strip-ansi";
|
||||
import { SocksClient } from "socks";
|
||||
import { SocksProxy, SocksProxyType } from "socks/typings/common/constants.js";
|
||||
import fs from "fs";
|
||||
|
||||
export type TransportItem = { localPath: string; remotePath: string };
|
||||
|
||||
export class AsyncSsh2Client {
|
||||
@@ -265,15 +267,15 @@ export class SshClient {
|
||||
}
|
||||
* @param options
|
||||
*/
|
||||
async uploadFiles(options: { connectConf: SshAccess; transports: TransportItem[]; mkdirs: boolean; opts?: { mode?: string } }) {
|
||||
async uploadFiles(options: { connectConf: SshAccess; transports: TransportItem[]; mkdirs: boolean; opts?: { mode?: string }; uploadType?: string }) {
|
||||
const { connectConf, transports, mkdirs, opts } = options;
|
||||
await this._call({
|
||||
connectConf,
|
||||
callable: async (conn: AsyncSsh2Client) => {
|
||||
const sftp = await conn.getSftp();
|
||||
this.logger.info("开始上传");
|
||||
for (const transport of transports) {
|
||||
if (mkdirs !== false) {
|
||||
if (mkdirs !== false) {
|
||||
this.logger.info("初始化父目录");
|
||||
for (const transport of transports) {
|
||||
const filePath = path.dirname(transport.remotePath);
|
||||
let mkdirCmd = `mkdir -p ${filePath} `;
|
||||
if (conn.windows) {
|
||||
@@ -291,13 +293,65 @@ export class SshClient {
|
||||
}
|
||||
await conn.exec(mkdirCmd);
|
||||
}
|
||||
await conn.fastPut({ sftp, ...transport, opts });
|
||||
}
|
||||
|
||||
if (options.uploadType === "sftp") {
|
||||
const sftp = await conn.getSftp();
|
||||
for (const transport of transports) {
|
||||
await conn.fastPut({ sftp, ...transport, opts });
|
||||
}
|
||||
} else {
|
||||
//scp
|
||||
for (const transport of transports) {
|
||||
await this.scpUpload({ conn, ...transport, opts });
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
}
|
||||
}
|
||||
|
||||
this.logger.info("文件全部上传成功");
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
async scpUpload(options: { conn: any; localPath: string; remotePath: string; opts?: { mode?: string } }) {
|
||||
const { conn, localPath, remotePath } = options;
|
||||
return new Promise((resolve, reject) => {
|
||||
// 关键步骤:构造 SCP 命令
|
||||
try {
|
||||
this.logger.info(`开始上传:${localPath} => ${remotePath}`);
|
||||
conn.conn.exec(
|
||||
`scp -t ${remotePath}`, // -t 表示目标模式
|
||||
(err, stream) => {
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
// 准备 SCP 协议头
|
||||
const fileStats = fs.statSync(localPath);
|
||||
const fileName = path.basename(localPath);
|
||||
|
||||
// SCP 协议格式:C[权限] [文件大小] [文件名]\n
|
||||
stream.write(`C0644 ${fileStats.size} ${fileName}\n`);
|
||||
|
||||
// 通过管道传输文件
|
||||
fs.createReadStream(localPath)
|
||||
.on("error", e => {
|
||||
this.logger.info("read stream error", e);
|
||||
reject(e);
|
||||
})
|
||||
.pipe(stream)
|
||||
.on("finish", async () => {
|
||||
this.logger.info(`上传完成:${localPath} => ${remotePath}`);
|
||||
resolve(true);
|
||||
})
|
||||
.on("error", reject);
|
||||
}
|
||||
);
|
||||
} catch (e) {
|
||||
reject(e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async removeFiles(opts: { connectConf: SshAccess; files: string[] }) {
|
||||
const { connectConf, files } = opts;
|
||||
await this._call({
|
||||
|
||||
@@ -3,6 +3,31 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 修复网站监控无法设置端口的bug ([27a8a57](https://github.com/certd/certd/commit/27a8a57cf52b4bf83d628aa3049be1efaa74f29c))
|
||||
* 修复lego模式无法创建流水线的bug ([687bb8a](https://github.com/certd/certd/commit/687bb8a2376d0de7b72739a174e4a9560581f866))
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 优化通知格式 ([c3c5006](https://github.com/certd/certd/commit/c3c5006daa39c20624cb58864f2b92b230a38a7a))
|
||||
* 支持又拍云cdn ([fd0536b](https://github.com/certd/certd/commit/fd0536bd4b41f15b6b5d42e0b447f0dcbf73b8a8))
|
||||
|
||||
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 增加服务器时间警告 ([d66ade4](https://github.com/certd/certd/commit/d66ade4e4783850b6c7625c6f164a5a0fc0aa509))
|
||||
* 支持部署到lucky ([e18e399](https://github.com/certd/certd/commit/e18e399ce6529e8c7e36b56c5f674cfdbbd3d3d1))
|
||||
|
||||
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 优化图标 ([c56f48c](https://github.com/certd/certd/commit/c56f48c1e3c54c4e203fafb380d9091d75681b7e))
|
||||
|
||||
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@certd/ui-client",
|
||||
"version": "1.31.5",
|
||||
"version": "1.31.8",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "vite --open",
|
||||
@@ -96,8 +96,8 @@
|
||||
"zod-defaults": "^0.1.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@certd/lib-iframe": "^1.31.5",
|
||||
"@certd/pipeline": "^1.31.5",
|
||||
"@certd/lib-iframe": "^1.31.8",
|
||||
"@certd/pipeline": "^1.31.8",
|
||||
"@rollup/plugin-commonjs": "^25.0.7",
|
||||
"@rollup/plugin-node-resolve": "^15.2.3",
|
||||
"@types/chai": "^4.3.12",
|
||||
|
||||
@@ -55,9 +55,63 @@
|
||||
<ul class="icon_lists dib-box">
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">WAF-长亭-雷池</div>
|
||||
<div class="code-name">&#xe61d;</div>
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">upyun</div>
|
||||
<div class="code-name">&#xe62f;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">plesk_</div>
|
||||
<div class="code-name">&#xecc0;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">易支付-01</div>
|
||||
<div class="code-name">&#xe741;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">1Panel</div>
|
||||
<div class="code-name">&#xe606;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">西部数码</div>
|
||||
<div class="code-name">&#xe73c;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">qnap</div>
|
||||
<div class="code-name">&#xe607;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">proxmox</div>
|
||||
<div class="code-name">&#xe9cc;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">aws</div>
|
||||
<div class="code-name">&#xe604;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">uni-app</div>
|
||||
<div class="code-name">&#xe602;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">lucky</div>
|
||||
<div class="code-name">&#xe752;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
@@ -66,6 +120,12 @@
|
||||
<div class="code-name">&#xe719;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">雷池</div>
|
||||
<div class="code-name">&#xe748;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">华为</div>
|
||||
@@ -120,7 +180,7 @@
|
||||
<pre><code class="language-css"
|
||||
>@font-face {
|
||||
font-family: 'iconfont';
|
||||
src: url('iconfont.svg?t=1741879397012#iconfont') format('svg');
|
||||
src: url('iconfont.svg?t=1742952318857#iconfont') format('svg');
|
||||
}
|
||||
</code></pre>
|
||||
<h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
|
||||
@@ -147,11 +207,92 @@
|
||||
<ul class="icon_lists dib-box">
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-WAF-changting-leichi"></span>
|
||||
<span class="icon iconfont icon-upyun"></span>
|
||||
<div class="name">
|
||||
WAF-长亭-雷池
|
||||
upyun
|
||||
</div>
|
||||
<div class="code-name">.icon-WAF-changting-leichi
|
||||
<div class="code-name">.icon-upyun
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-plesk"></span>
|
||||
<div class="name">
|
||||
plesk_
|
||||
</div>
|
||||
<div class="code-name">.icon-plesk
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-yizhifu"></span>
|
||||
<div class="name">
|
||||
易支付-01
|
||||
</div>
|
||||
<div class="code-name">.icon-yizhifu
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-onepanel"></span>
|
||||
<div class="name">
|
||||
1Panel
|
||||
</div>
|
||||
<div class="code-name">.icon-onepanel
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-xibushuma"></span>
|
||||
<div class="name">
|
||||
西部数码
|
||||
</div>
|
||||
<div class="code-name">.icon-xibushuma
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-qnap"></span>
|
||||
<div class="name">
|
||||
qnap
|
||||
</div>
|
||||
<div class="code-name">.icon-qnap
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-proxmox"></span>
|
||||
<div class="name">
|
||||
proxmox
|
||||
</div>
|
||||
<div class="code-name">.icon-proxmox
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-aws"></span>
|
||||
<div class="name">
|
||||
aws
|
||||
</div>
|
||||
<div class="code-name">.icon-aws
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-uniapp"></span>
|
||||
<div class="name">
|
||||
uni-app
|
||||
</div>
|
||||
<div class="code-name">.icon-uniapp
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-lucky"></span>
|
||||
<div class="name">
|
||||
lucky
|
||||
</div>
|
||||
<div class="code-name">.icon-lucky
|
||||
</div>
|
||||
</li>
|
||||
|
||||
@@ -164,6 +305,15 @@
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-safeline"></span>
|
||||
<div class="name">
|
||||
雷池
|
||||
</div>
|
||||
<div class="code-name">.icon-safeline
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-huawei"></span>
|
||||
<div class="name">
|
||||
@@ -247,10 +397,82 @@
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-WAF-changting-leichi"></use>
|
||||
<use xlink:href="#icon-upyun"></use>
|
||||
</svg>
|
||||
<div class="name">WAF-长亭-雷池</div>
|
||||
<div class="code-name">#icon-WAF-changting-leichi</div>
|
||||
<div class="name">upyun</div>
|
||||
<div class="code-name">#icon-upyun</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-plesk"></use>
|
||||
</svg>
|
||||
<div class="name">plesk_</div>
|
||||
<div class="code-name">#icon-plesk</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-yizhifu"></use>
|
||||
</svg>
|
||||
<div class="name">易支付-01</div>
|
||||
<div class="code-name">#icon-yizhifu</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-onepanel"></use>
|
||||
</svg>
|
||||
<div class="name">1Panel</div>
|
||||
<div class="code-name">#icon-onepanel</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-xibushuma"></use>
|
||||
</svg>
|
||||
<div class="name">西部数码</div>
|
||||
<div class="code-name">#icon-xibushuma</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-qnap"></use>
|
||||
</svg>
|
||||
<div class="name">qnap</div>
|
||||
<div class="code-name">#icon-qnap</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-proxmox"></use>
|
||||
</svg>
|
||||
<div class="name">proxmox</div>
|
||||
<div class="code-name">#icon-proxmox</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-aws"></use>
|
||||
</svg>
|
||||
<div class="name">aws</div>
|
||||
<div class="code-name">#icon-aws</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-uniapp"></use>
|
||||
</svg>
|
||||
<div class="name">uni-app</div>
|
||||
<div class="code-name">#icon-uniapp</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-lucky"></use>
|
||||
</svg>
|
||||
<div class="name">lucky</div>
|
||||
<div class="code-name">#icon-lucky</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
@@ -261,6 +483,14 @@
|
||||
<div class="code-name">#icon-ctyun</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-safeline"></use>
|
||||
</svg>
|
||||
<div class="name">雷池</div>
|
||||
<div class="code-name">#icon-safeline</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-huawei"></use>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
@font-face {
|
||||
font-family: "iconfont"; /* Project id 4688792 */
|
||||
src: url('iconfont.svg?t=1741879397012#iconfont') format('svg');
|
||||
src: url('iconfont.svg?t=1742952318857#iconfont') format('svg');
|
||||
}
|
||||
|
||||
.iconfont {
|
||||
@@ -11,14 +11,54 @@
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.icon-WAF-changting-leichi:before {
|
||||
content: "\e61d";
|
||||
.icon-upyun:before {
|
||||
content: "\e62f";
|
||||
}
|
||||
|
||||
.icon-plesk:before {
|
||||
content: "\ecc0";
|
||||
}
|
||||
|
||||
.icon-yizhifu:before {
|
||||
content: "\e741";
|
||||
}
|
||||
|
||||
.icon-onepanel:before {
|
||||
content: "\e606";
|
||||
}
|
||||
|
||||
.icon-xibushuma:before {
|
||||
content: "\e73c";
|
||||
}
|
||||
|
||||
.icon-qnap:before {
|
||||
content: "\e607";
|
||||
}
|
||||
|
||||
.icon-proxmox:before {
|
||||
content: "\e9cc";
|
||||
}
|
||||
|
||||
.icon-aws:before {
|
||||
content: "\e604";
|
||||
}
|
||||
|
||||
.icon-uniapp:before {
|
||||
content: "\e602";
|
||||
}
|
||||
|
||||
.icon-lucky:before {
|
||||
content: "\e752";
|
||||
}
|
||||
|
||||
.icon-ctyun:before {
|
||||
content: "\e719";
|
||||
}
|
||||
|
||||
.icon-safeline:before {
|
||||
content: "\e748";
|
||||
}
|
||||
|
||||
.icon-huawei:before {
|
||||
content: "\e610";
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -6,11 +6,74 @@
|
||||
"description": "",
|
||||
"glyphs": [
|
||||
{
|
||||
"icon_id": "35327761",
|
||||
"name": "WAF-长亭-雷池",
|
||||
"font_class": "WAF-changting-leichi",
|
||||
"unicode": "e61d",
|
||||
"unicode_decimal": 58909
|
||||
"icon_id": "5771134",
|
||||
"name": "upyun",
|
||||
"font_class": "upyun",
|
||||
"unicode": "e62f",
|
||||
"unicode_decimal": 58927
|
||||
},
|
||||
{
|
||||
"icon_id": "27272666",
|
||||
"name": "plesk_",
|
||||
"font_class": "plesk",
|
||||
"unicode": "ecc0",
|
||||
"unicode_decimal": 60608
|
||||
},
|
||||
{
|
||||
"icon_id": "23930871",
|
||||
"name": "易支付-01",
|
||||
"font_class": "yizhifu",
|
||||
"unicode": "e741",
|
||||
"unicode_decimal": 59201
|
||||
},
|
||||
{
|
||||
"icon_id": "40476533",
|
||||
"name": "1Panel",
|
||||
"font_class": "onepanel",
|
||||
"unicode": "e606",
|
||||
"unicode_decimal": 58886
|
||||
},
|
||||
{
|
||||
"icon_id": "26435508",
|
||||
"name": "西部数码",
|
||||
"font_class": "xibushuma",
|
||||
"unicode": "e73c",
|
||||
"unicode_decimal": 59196
|
||||
},
|
||||
{
|
||||
"icon_id": "27487624",
|
||||
"name": "qnap",
|
||||
"font_class": "qnap",
|
||||
"unicode": "e607",
|
||||
"unicode_decimal": 58887
|
||||
},
|
||||
{
|
||||
"icon_id": "27268231",
|
||||
"name": "proxmox",
|
||||
"font_class": "proxmox",
|
||||
"unicode": "e9cc",
|
||||
"unicode_decimal": 59852
|
||||
},
|
||||
{
|
||||
"icon_id": "31636255",
|
||||
"name": "aws",
|
||||
"font_class": "aws",
|
||||
"unicode": "e604",
|
||||
"unicode_decimal": 58884
|
||||
},
|
||||
{
|
||||
"icon_id": "34071209",
|
||||
"name": "uni-app",
|
||||
"font_class": "uniapp",
|
||||
"unicode": "e602",
|
||||
"unicode_decimal": 58882
|
||||
},
|
||||
{
|
||||
"icon_id": "3467975",
|
||||
"name": "lucky",
|
||||
"font_class": "lucky",
|
||||
"unicode": "e752",
|
||||
"unicode_decimal": 59218
|
||||
},
|
||||
{
|
||||
"icon_id": "41854563",
|
||||
@@ -19,6 +82,13 @@
|
||||
"unicode": "e719",
|
||||
"unicode_decimal": 59161
|
||||
},
|
||||
{
|
||||
"icon_id": "43757703",
|
||||
"name": "雷池",
|
||||
"font_class": "safeline",
|
||||
"unicode": "e748",
|
||||
"unicode_decimal": 59208
|
||||
},
|
||||
{
|
||||
"icon_id": "24164616",
|
||||
"name": "华为",
|
||||
|
||||
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 40 KiB |
@@ -7,6 +7,11 @@ export type SiteEnv = {
|
||||
contactLink?: string;
|
||||
};
|
||||
};
|
||||
export type AppInfo = {
|
||||
version?: string;
|
||||
time?: number;
|
||||
deltaTime?: number;
|
||||
};
|
||||
export type SiteInfo = {
|
||||
title?: string;
|
||||
slogan?: string;
|
||||
@@ -71,12 +76,13 @@ export type AllSettings = {
|
||||
siteEnv: SiteEnv;
|
||||
headerMenus: HeaderMenus;
|
||||
suiteSetting: SuiteSetting;
|
||||
app: AppInfo;
|
||||
};
|
||||
|
||||
export async function loadAllSettings(): Promise<AllSettings> {
|
||||
return await request({
|
||||
url: "/basic/settings/all",
|
||||
method: "get"
|
||||
method: "get",
|
||||
});
|
||||
}
|
||||
|
||||
@@ -84,7 +90,7 @@ export async function bindUrl(data: any): Promise<any> {
|
||||
return await request({
|
||||
url: "/sys/plus/bindUrl",
|
||||
method: "post",
|
||||
data
|
||||
data,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -92,7 +98,7 @@ export async function sendSmsCode(data: any): Promise<any> {
|
||||
return await request({
|
||||
url: "/basic/code/sendSmsCode",
|
||||
method: "post",
|
||||
data
|
||||
data,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -100,6 +106,6 @@ export async function sendEmailCode(data: any): Promise<any> {
|
||||
return await request({
|
||||
url: "/basic/code/sendEmailCode",
|
||||
method: "post",
|
||||
data
|
||||
data,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
<template>
|
||||
<div class="remote-input">
|
||||
<a-input v-bind="attrs" :value="modelValue" @update:value="onInputChange"></a-input>
|
||||
<fs-button class="ml-1" v-bind="button" :text="button?.text || title" @click="openDialog"></fs-button>
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { doRequest } from "/@/components/plugins/lib";
|
||||
import { inject, ref, useAttrs } from "vue";
|
||||
import { useFormWrapper } from "@fast-crud/fast-crud";
|
||||
import { notification } from "ant-design-vue";
|
||||
|
||||
defineOptions({
|
||||
name: "RemoteInput",
|
||||
});
|
||||
const { openCrudFormDialog } = useFormWrapper();
|
||||
const props = defineProps<{
|
||||
modelValue: string;
|
||||
title: string;
|
||||
action: string;
|
||||
form: any;
|
||||
button?: any;
|
||||
}>();
|
||||
|
||||
const emit = defineEmits<{
|
||||
"update:modelValue": any;
|
||||
}>();
|
||||
|
||||
const getScope: any = inject("get:scope");
|
||||
const getPluginType: any = inject("get:plugin:type");
|
||||
|
||||
const attrs = useAttrs();
|
||||
|
||||
const loading = ref(false);
|
||||
|
||||
function onInputChange(value: string) {
|
||||
emit("update:modelValue", value);
|
||||
}
|
||||
|
||||
async function openDialog() {
|
||||
function createCrudOptions() {
|
||||
return {
|
||||
crudOptions: {
|
||||
columns: {
|
||||
...props.form.columns,
|
||||
},
|
||||
form: {
|
||||
wrapper: {
|
||||
title: props.title,
|
||||
saveRemind: false,
|
||||
},
|
||||
afterSubmit() {
|
||||
notification.success({ message: "操作成功" });
|
||||
},
|
||||
async doSubmit({ form }: any) {
|
||||
return await doPluginFormSubmit(form);
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
const { crudOptions } = createCrudOptions();
|
||||
await openCrudFormDialog({ crudOptions });
|
||||
}
|
||||
|
||||
const doPluginFormSubmit = async (data: any) => {
|
||||
if (loading.value) {
|
||||
return;
|
||||
}
|
||||
|
||||
loading.value = true;
|
||||
try {
|
||||
const pluginType = getPluginType();
|
||||
const { form } = getScope();
|
||||
const res = await doRequest({
|
||||
type: pluginType,
|
||||
typeName: form.type,
|
||||
action: props.action,
|
||||
input: pluginType === "plugin" ? form.input : form,
|
||||
data: data,
|
||||
});
|
||||
//获取返回值 填入到input中
|
||||
emit("update:modelValue", res);
|
||||
return res;
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
};
|
||||
</script>
|
||||
<style lang="less">
|
||||
.remote-input {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.a-input {
|
||||
flex: 1;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -1,16 +1,7 @@
|
||||
<template>
|
||||
<div class="remote-select">
|
||||
<div class="flex flex-row">
|
||||
<a-select
|
||||
class="remote-select-input"
|
||||
show-search
|
||||
:filter-option="filterOption"
|
||||
:options="optionsRef"
|
||||
:value="value"
|
||||
v-bind="attrs"
|
||||
@click="onClick"
|
||||
@update:value="emit('update:value', $event)"
|
||||
/>
|
||||
<a-select class="remote-select-input" show-search :filter-option="filterOption" :options="optionsRef" :value="value" v-bind="attrs" @click="onClick" @update:value="emit('update:value', $event)" />
|
||||
<div class="ml-5">
|
||||
<fs-button :loading="loading" title="刷新选项" icon="ion:refresh-outline" @click="refreshOptions"></fs-button>
|
||||
</div>
|
||||
@@ -26,7 +17,7 @@ import { inject, ref, useAttrs, watch } from "vue";
|
||||
import { PluginDefine } from "@certd/pipeline";
|
||||
|
||||
defineOptions({
|
||||
name: "RemoteSelect"
|
||||
name: "RemoteSelect",
|
||||
});
|
||||
|
||||
const props = defineProps<
|
||||
@@ -87,14 +78,14 @@ const getOptions = async () => {
|
||||
type: pluginType,
|
||||
typeName: form.type,
|
||||
action: props.action,
|
||||
input: pluginType === "plugin" ? form.input : form
|
||||
input: pluginType === "plugin" ? form.input : form,
|
||||
},
|
||||
{
|
||||
onError(err: any) {
|
||||
hasError.value = true;
|
||||
message.value = `获取选项出错:${err.message}`;
|
||||
},
|
||||
showErrorNotify: false
|
||||
showErrorNotify: false,
|
||||
}
|
||||
);
|
||||
if (res && res.length > 0) {
|
||||
@@ -129,14 +120,14 @@ watch(
|
||||
}
|
||||
return {
|
||||
form: props.form,
|
||||
watched: values
|
||||
watched: values,
|
||||
};
|
||||
},
|
||||
async () => {
|
||||
await getOptions();
|
||||
},
|
||||
{
|
||||
immediate: true
|
||||
immediate: true,
|
||||
}
|
||||
);
|
||||
</script>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import SynologyIdDeviceGetter from "./synology/device-id-getter.vue";
|
||||
import RemoteSelect from "./common/remote-select.vue";
|
||||
import RemoteInput from "./common/remote-input.vue";
|
||||
import CertDomainsGetter from "./common/cert-domains-getter.vue";
|
||||
import OutputSelector from "/@/components/plugins/common/output-selector/index.vue";
|
||||
import DnsProviderSelector from "/@/components/plugins/cert/dns-provider-selector/index.vue";
|
||||
@@ -21,6 +22,7 @@ export default {
|
||||
|
||||
app.component("SynologyDeviceIdGetter", SynologyIdDeviceGetter);
|
||||
app.component("RemoteSelect", RemoteSelect);
|
||||
app.component("RemoteInput", RemoteInput);
|
||||
app.component("CertDomainsGetter", CertDomainsGetter);
|
||||
app.component("InputPassword", InputPassword);
|
||||
},
|
||||
|
||||
@@ -15,7 +15,7 @@ import { Modal } from "ant-design-vue";
|
||||
import { ComponentPropsType, doRequest } from "/@/components/plugins/lib";
|
||||
|
||||
defineOptions({
|
||||
name: "DeviceIdGetter"
|
||||
name: "DeviceIdGetter",
|
||||
});
|
||||
|
||||
const props = defineProps<ComponentPropsType>();
|
||||
@@ -38,9 +38,9 @@ async function loginWithOTPCode(otpCode: string) {
|
||||
typeName: form.type,
|
||||
action: "LoginWithOPTCode",
|
||||
data: {
|
||||
otpCode
|
||||
otpCode,
|
||||
},
|
||||
input: form
|
||||
input: form,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ async function getDeviceId() {
|
||||
const res = await loginWithOTPCode(otpCodeRef.value);
|
||||
console.log("did返回", res);
|
||||
emit("update:value", res.did);
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
import { defineStore } from "pinia";
|
||||
import { Modal, notification } from "ant-design-vue";
|
||||
import * as _ from "lodash-es";
|
||||
// @ts-ignore
|
||||
import { LocalStorage } from "/src/utils/util.storage";
|
||||
|
||||
import * as basicApi from "/@/api/modules/api.basic";
|
||||
import { HeaderMenus, PlusInfo, SiteEnv, SiteInfo, SuiteSetting, SysInstallInfo, SysPublicSetting } from "/@/api/modules/api.basic";
|
||||
import { AppInfo, HeaderMenus, PlusInfo, SiteEnv, SiteInfo, SuiteSetting, SysInstallInfo, SysPublicSetting } from "/@/api/modules/api.basic";
|
||||
import { useUserStore } from "/@/store/modules/user";
|
||||
import { mitter } from "/@/utils/util.mitt";
|
||||
import { env } from "/@/utils/util.env";
|
||||
@@ -29,6 +26,11 @@ export interface SettingState {
|
||||
headerMenus?: HeaderMenus;
|
||||
inited?: boolean;
|
||||
suiteSetting?: SuiteSetting;
|
||||
app: {
|
||||
version?: string;
|
||||
time?: number;
|
||||
deltaTime?: number;
|
||||
};
|
||||
}
|
||||
|
||||
const defaultSiteInfo: SiteInfo = {
|
||||
@@ -37,7 +39,7 @@ const defaultSiteInfo: SiteInfo = {
|
||||
logo: env.LOGO || "/static/images/logo/logo.svg",
|
||||
loginLogo: env.LOGIN_LOGO || "/static/images/logo/rect-block.svg",
|
||||
licenseTo: "",
|
||||
licenseToUrl: ""
|
||||
licenseToUrl: "",
|
||||
};
|
||||
export const useSettingStore = defineStore({
|
||||
id: "app.setting",
|
||||
@@ -45,33 +47,38 @@ export const useSettingStore = defineStore({
|
||||
plusInfo: {
|
||||
isPlus: false,
|
||||
vipType: "free",
|
||||
isComm: false
|
||||
isComm: false,
|
||||
},
|
||||
sysPublic: {
|
||||
registerEnabled: false,
|
||||
managerOtherUserPipeline: false,
|
||||
icpNo: env.ICP_NO || ""
|
||||
icpNo: env.ICP_NO || "",
|
||||
},
|
||||
installInfo: {
|
||||
siteId: "",
|
||||
bindUserId: null,
|
||||
bindUrl: "",
|
||||
accountServerBaseUrl: "",
|
||||
appKey: ""
|
||||
appKey: "",
|
||||
},
|
||||
siteInfo: defaultSiteInfo,
|
||||
siteEnv: {
|
||||
agent: {
|
||||
enabled: undefined,
|
||||
contactText: "",
|
||||
contactLink: ""
|
||||
}
|
||||
contactLink: "",
|
||||
},
|
||||
},
|
||||
headerMenus: {
|
||||
menus: []
|
||||
menus: [],
|
||||
},
|
||||
suiteSetting: { enabled: false },
|
||||
inited: false
|
||||
inited: false,
|
||||
app: {
|
||||
version: "",
|
||||
time: 0,
|
||||
deltaTime: 0,
|
||||
},
|
||||
}),
|
||||
getters: {
|
||||
getSysPublic(): SysPublicSetting {
|
||||
@@ -96,7 +103,7 @@ export const useSettingStore = defineStore({
|
||||
const vipLabelMap: any = {
|
||||
free: "基础版",
|
||||
plus: "专业版",
|
||||
comm: "商业版"
|
||||
comm: "商业版",
|
||||
};
|
||||
return vipLabelMap[this.plusInfo?.vipType || "free"];
|
||||
},
|
||||
@@ -113,21 +120,21 @@ export const useSettingStore = defineStore({
|
||||
title: menu.title,
|
||||
icon: menu.icon,
|
||||
link: menu.path,
|
||||
order: 99999
|
||||
}
|
||||
order: 99999,
|
||||
},
|
||||
};
|
||||
});
|
||||
},
|
||||
isSuiteEnabled(): boolean {
|
||||
// @ts-ignore
|
||||
return this.suiteSetting?.enabled === true;
|
||||
}
|
||||
},
|
||||
},
|
||||
actions: {
|
||||
checkPlus() {
|
||||
if (!this.isPlus) {
|
||||
notification.warn({
|
||||
message: "此为专业版功能,请先升级到专业版"
|
||||
message: "此为专业版功能,请先升级到专业版",
|
||||
});
|
||||
throw new Error("此为专业版功能,请升级到专业版");
|
||||
}
|
||||
@@ -142,6 +149,12 @@ export const useSettingStore = defineStore({
|
||||
_.merge(this.suiteSetting, allSettings.suiteSetting || {});
|
||||
//@ts-ignore
|
||||
this.initSiteInfo(allSettings.siteInfo || {});
|
||||
this.initAppInfo(allSettings.app || {});
|
||||
},
|
||||
initAppInfo(appInfo: AppInfo) {
|
||||
this.app.time = appInfo.time;
|
||||
this.app.version = appInfo.version;
|
||||
this.app.deltaTime = new Date().getTime() - this.app.time;
|
||||
},
|
||||
initSiteInfo(siteInfo: SiteInfo) {
|
||||
//@ts-ignore
|
||||
@@ -158,15 +171,15 @@ export const useSettingStore = defineStore({
|
||||
if (this.siteInfo.logo) {
|
||||
updatePreferences({
|
||||
logo: {
|
||||
source: this.siteInfo.logo
|
||||
}
|
||||
source: this.siteInfo.logo,
|
||||
},
|
||||
});
|
||||
}
|
||||
if (this.siteInfo.title) {
|
||||
updatePreferences({
|
||||
app: {
|
||||
name: this.siteInfo.title
|
||||
}
|
||||
name: this.siteInfo.title,
|
||||
},
|
||||
});
|
||||
useTitle(this.siteInfo.title);
|
||||
}
|
||||
@@ -210,7 +223,7 @@ export const useSettingStore = defineStore({
|
||||
cancelText: "不是,回到原来的地址",
|
||||
onCancel: () => {
|
||||
window.location.href = bindUrl;
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -224,8 +237,8 @@ export const useSettingStore = defineStore({
|
||||
}
|
||||
await this.init();
|
||||
this.inited = true;
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
mitter.on("app.login", async () => {
|
||||
|
||||
@@ -177,6 +177,21 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat
|
||||
},
|
||||
},
|
||||
},
|
||||
port: {
|
||||
title: "HTTPS端口",
|
||||
search: {
|
||||
show: false,
|
||||
},
|
||||
type: "number",
|
||||
form: {
|
||||
value: 443,
|
||||
rules: [{ required: true, message: "请输入端口" }],
|
||||
},
|
||||
column: {
|
||||
width: 100,
|
||||
show: false,
|
||||
},
|
||||
},
|
||||
certDomains: {
|
||||
title: "证书域名",
|
||||
search: {
|
||||
|
||||
@@ -14,7 +14,8 @@ export default function (certPlugins: any[], formWrapperRef: any): CreateCrudOpt
|
||||
for (const plugin of certPlugins) {
|
||||
for (const inputKey in plugin.input) {
|
||||
if (inputs[inputKey]) {
|
||||
// inputs[inputKey].form.show = true;
|
||||
//如果两个插件有的字段,直接显示
|
||||
inputs[inputKey].form.show = true;
|
||||
continue;
|
||||
}
|
||||
const inputDefine = _.cloneDeep(plugin.input[inputKey]);
|
||||
|
||||
@@ -82,9 +82,9 @@
|
||||
key: 'title',
|
||||
component: {
|
||||
name: 'a-input',
|
||||
vModel: 'value'
|
||||
vModel: 'value',
|
||||
},
|
||||
rules: [{ required: true, message: '此项必填' }]
|
||||
rules: [{ required: true, message: '此项必填' }],
|
||||
}"
|
||||
:get-context-fn="getScopeFunc"
|
||||
/>
|
||||
@@ -126,8 +126,8 @@ export default {
|
||||
props: {
|
||||
editMode: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
}
|
||||
default: true,
|
||||
},
|
||||
},
|
||||
emits: ["update"],
|
||||
setup(props: any, context: any) {
|
||||
@@ -154,9 +154,9 @@ export default {
|
||||
{
|
||||
type: "string",
|
||||
required: true,
|
||||
message: "请输入名称"
|
||||
}
|
||||
]
|
||||
message: "请输入名称",
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
const stepTypeSelected = (item: any) => {
|
||||
@@ -209,7 +209,7 @@ export default {
|
||||
type: undefined,
|
||||
_isAdd: true,
|
||||
input: {},
|
||||
status: null
|
||||
status: null,
|
||||
};
|
||||
_.merge(step, stepDef);
|
||||
stepOpen(step, emit);
|
||||
@@ -235,7 +235,7 @@ export default {
|
||||
|
||||
function getContext() {
|
||||
return {
|
||||
form: currentStep.value.input
|
||||
form: currentStep.value.input,
|
||||
};
|
||||
}
|
||||
const { doComputed } = useCompute();
|
||||
@@ -300,7 +300,7 @@ export default {
|
||||
async onOk() {
|
||||
callback.value("delete");
|
||||
stepDrawerClose();
|
||||
}
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
@@ -314,24 +314,24 @@ export default {
|
||||
|
||||
const getScopeFunc = () => {
|
||||
return {
|
||||
form: currentStep.value
|
||||
form: currentStep.value,
|
||||
};
|
||||
};
|
||||
|
||||
const pluginSearch = ref({
|
||||
keyword: "",
|
||||
result: []
|
||||
result: [],
|
||||
});
|
||||
const pluginGroupActive = ref("all");
|
||||
const computedPluginGroups: any = computed(() => {
|
||||
const groups = pluginGroups.groups;
|
||||
if (pluginSearch.value.keyword) {
|
||||
const keyword = pluginSearch.value.keyword.toLowerCase();
|
||||
const list = groups.all.plugins.filter((plugin) => {
|
||||
const list = groups.all.plugins.filter(plugin => {
|
||||
return plugin.title?.toLowerCase().includes(keyword) || plugin.desc?.toLowerCase().includes(keyword) || plugin.name?.toLowerCase().includes(keyword);
|
||||
});
|
||||
return {
|
||||
search: { key: "search", title: "搜索结果", plugins: list }
|
||||
search: { key: "search", title: "搜索结果", plugins: list },
|
||||
};
|
||||
} else {
|
||||
return groups;
|
||||
@@ -371,7 +371,7 @@ export default {
|
||||
rules,
|
||||
getScopeFunc,
|
||||
stepCopy,
|
||||
fullscreen
|
||||
fullscreen,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -382,22 +382,22 @@ export default {
|
||||
name: "a-select",
|
||||
vModel: "value",
|
||||
options: [
|
||||
{ value: 0, label: "正常运行(证书申请任务请选择它)" },
|
||||
{ value: 1, label: "成功后跳过(非证书任务请选择它)" }
|
||||
]
|
||||
{ value: 0, label: "正常运行(只有证书申请任务需要选择它)" },
|
||||
{ value: 1, label: "成功后跳过(其他任务请选择它)" },
|
||||
],
|
||||
},
|
||||
helper: {
|
||||
render: () => {
|
||||
return (
|
||||
<div>
|
||||
<div>正常运行:每次都运行,证书任务需要每次都运行</div>
|
||||
<div>成功后跳过:在证书没变化时,该任务成功一次之后跳过,不重复部署</div>
|
||||
<div>保持默认即可,如果你想要再次测试部署,可以临时设置为正常运行</div>
|
||||
<div>成功后跳过:该任务成功一次之后跳过,不重复执行(证书变化之后才会再次运行)</div>
|
||||
<div class="green">保持默认即可</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
},
|
||||
},
|
||||
rules: [{ required: true, message: "此项必填" }]
|
||||
rules: [{ required: true, message: "此项必填" }],
|
||||
});
|
||||
|
||||
return {
|
||||
@@ -405,9 +405,9 @@ export default {
|
||||
labelCol: { span: 6 },
|
||||
wrapperCol: { span: 16 },
|
||||
runStrategyProps,
|
||||
transformDesc
|
||||
transformDesc,
|
||||
};
|
||||
}
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
@@ -14,7 +14,12 @@
|
||||
<span>您好,{{ userInfo.nickName || userInfo.username }}, 欢迎使用 【{{ siteInfo.title }}】</span>
|
||||
</div>
|
||||
<div class="flex-o flex-wrap profile-badges">
|
||||
<a-tag color="green" class="flex-inline pointer"> <fs-icon icon="ion:time-outline"></fs-icon> {{ now }}</a-tag>
|
||||
<a-tooltip :title="deltaTimeTip">
|
||||
<a-badge :dot="deltaTimeWarning">
|
||||
<a-tag :color="deltaTimeWarning ? 'red' : 'green'" class="flex-inline pointer"> <fs-icon icon="ion:time-outline"></fs-icon> {{ now }}</a-tag>
|
||||
</a-badge>
|
||||
</a-tooltip>
|
||||
|
||||
<template v-if="userStore.isAdmin">
|
||||
<a-divider type="vertical" />
|
||||
<a-badge :dot="hasNewVersion">
|
||||
@@ -138,11 +143,11 @@ import { GetStatisticCount } from "/@/views/framework/home/dashboard/api";
|
||||
import { useRouter } from "vue-router";
|
||||
import * as api from "./api";
|
||||
defineOptions({
|
||||
name: "DashboardUser"
|
||||
name: "DashboardUser",
|
||||
});
|
||||
|
||||
const version = ref(import.meta.env.VITE_APP_VERSION);
|
||||
const latestVersion = ref();
|
||||
const latestVersion = ref("");
|
||||
const hasNewVersion = computed(() => {
|
||||
if (!latestVersion.value) {
|
||||
return false;
|
||||
@@ -174,7 +179,16 @@ const userInfo: ComputedRef<UserInfoRes> = computed(() => {
|
||||
return userStore.getUserInfo;
|
||||
});
|
||||
const now = computed(() => {
|
||||
return dayjs().format("YYYY-MM-DD HH:mm:ss");
|
||||
const serverTime = settingStore.app.deltaTime + Date.now();
|
||||
return dayjs(serverTime).format("YYYY-MM-DD HH:mm:ss");
|
||||
});
|
||||
|
||||
const deltaTimeWarning = computed(() => {
|
||||
return Math.abs(settingStore.app.deltaTime) > 1000 * 60 * 4;
|
||||
});
|
||||
const deltaTimeTip = computed(() => {
|
||||
const deltaMin = (Math.abs(settingStore.app.deltaTime) / 1000 / 60).toFixed(2);
|
||||
return `服务器时间相差:${deltaMin}分钟${deltaTimeWarning.value ? ",请检查服务器时间是否正确" : ""}`;
|
||||
});
|
||||
const router = useRouter();
|
||||
function goPipeline() {
|
||||
@@ -189,7 +203,7 @@ function transformStatusCount() {
|
||||
{ name: "start", label: "运行中" },
|
||||
{ name: "error", label: "失败" },
|
||||
{ name: "canceled", label: "已取消" },
|
||||
{ name: null, label: "未执行" }
|
||||
{ name: null, label: "未执行" },
|
||||
];
|
||||
const result = [];
|
||||
for (const item of sorted) {
|
||||
@@ -208,7 +222,7 @@ async function loadCount() {
|
||||
count.value.historyCountPerDay = count.value.historyCountPerDay.map((item: any) => {
|
||||
return {
|
||||
name: item.date,
|
||||
value: item.count
|
||||
value: item.count,
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
@@ -22,10 +22,10 @@ onMounted(() => {
|
||||
content: "为了您的账户安全,请立即修改密码",
|
||||
onOk: () => {
|
||||
changePasswordButtonRef.value.open({
|
||||
password: "123456"
|
||||
password: "123456",
|
||||
});
|
||||
},
|
||||
okText: "立即修改"
|
||||
okText: "立即修改",
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -3,6 +3,35 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.31.8](https://github.com/certd/certd/compare/v1.31.7...v1.31.8) (2025-03-26)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 修复编辑通知勾选默认,导致出现多个默认通知的bug ([6cd7bdd](https://github.com/certd/certd/commit/6cd7bddc37da8b0d7b9860fd9a26ddfe84c869a7))
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 优化scp上传 ([e51123a](https://github.com/certd/certd/commit/e51123a95131cc76d655937488caf08956a67020))
|
||||
* 支持又拍云cdn ([fd0536b](https://github.com/certd/certd/commit/fd0536bd4b41f15b6b5d42e0b447f0dcbf73b8a8))
|
||||
* 支持又拍云cdn ([57389a7](https://github.com/certd/certd/commit/57389a79a1a61c45d081712562f8b33c9633158e))
|
||||
|
||||
## [1.31.7](https://github.com/certd/certd/compare/v1.31.6...v1.31.7) (2025-03-24)
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 支持部署到lucky ([e18e399](https://github.com/certd/certd/commit/e18e399ce6529e8c7e36b56c5f674cfdbbd3d3d1))
|
||||
|
||||
## [1.31.6](https://github.com/certd/certd/compare/v1.31.5...v1.31.6) (2025-03-24)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 修复dns.la无法申请证书的bug ([90b045a](https://github.com/certd/certd/commit/90b045af6d1a4f46986e4b118885c1f050df067c))
|
||||
|
||||
### Performance Improvements
|
||||
|
||||
* 上传到主机支持scp方式 ([05b6159](https://github.com/certd/certd/commit/05b6159802b9e85b6a410361b60b5c28875b48e7))
|
||||
* 优化图标 ([c56f48c](https://github.com/certd/certd/commit/c56f48c1e3c54c4e203fafb380d9091d75681b7e))
|
||||
|
||||
## [1.31.5](https://github.com/certd/certd/compare/v1.31.4...v1.31.5) (2025-03-22)
|
||||
|
||||
**Note:** Version bump only for package @certd/ui-server
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@certd/ui-server",
|
||||
"version": "1.31.5",
|
||||
"version": "1.31.8",
|
||||
"description": "fast-server base midway",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
@@ -38,18 +38,18 @@
|
||||
"@aws-sdk/client-acm": "^3.699.0",
|
||||
"@aws-sdk/client-cloudfront": "^3.699.0",
|
||||
"@aws-sdk/client-s3": "^3.705.0",
|
||||
"@certd/acme-client": "^1.31.5",
|
||||
"@certd/basic": "^1.31.5",
|
||||
"@certd/commercial-core": "^1.31.5",
|
||||
"@certd/lib-huawei": "^1.31.5",
|
||||
"@certd/lib-k8s": "^1.31.5",
|
||||
"@certd/lib-server": "^1.31.5",
|
||||
"@certd/midway-flyway-js": "^1.31.5",
|
||||
"@certd/pipeline": "^1.31.5",
|
||||
"@certd/plugin-cert": "^1.31.5",
|
||||
"@certd/plugin-lib": "^1.31.5",
|
||||
"@certd/plugin-plus": "^1.31.5",
|
||||
"@certd/plus-core": "^1.31.5",
|
||||
"@certd/acme-client": "^1.31.8",
|
||||
"@certd/basic": "^1.31.8",
|
||||
"@certd/commercial-core": "^1.31.8",
|
||||
"@certd/lib-huawei": "^1.31.8",
|
||||
"@certd/lib-k8s": "^1.31.8",
|
||||
"@certd/lib-server": "^1.31.8",
|
||||
"@certd/midway-flyway-js": "^1.31.8",
|
||||
"@certd/pipeline": "^1.31.8",
|
||||
"@certd/plugin-cert": "^1.31.8",
|
||||
"@certd/plugin-lib": "^1.31.8",
|
||||
"@certd/plugin-plus": "^1.31.8",
|
||||
"@certd/plus-core": "^1.31.8",
|
||||
"@corsinvest/cv4pve-api-javascript": "^8.3.0",
|
||||
"@huaweicloud/huaweicloud-sdk-cdn": "^3.1.120",
|
||||
"@huaweicloud/huaweicloud-sdk-core": "^3.1.120",
|
||||
|
||||
@@ -12,6 +12,7 @@ import {
|
||||
} from '@certd/lib-server';
|
||||
import { AppKey, getPlusInfo, isComm } from '@certd/plus-core';
|
||||
import { cloneDeep } from 'lodash-es';
|
||||
import {getVersion} from "../../utils/version.js";
|
||||
|
||||
/**
|
||||
*/
|
||||
@@ -81,6 +82,8 @@ export class BasicSettingsController extends BaseController {
|
||||
const plusInfo = await this.plusInfo();
|
||||
const headerMenus = await this.getHeaderMenus();
|
||||
const suiteSetting = await this.getSuiteSetting();
|
||||
|
||||
const version = await getVersion()
|
||||
return this.ok({
|
||||
sysPublic,
|
||||
installInfo,
|
||||
@@ -89,6 +92,10 @@ export class BasicSettingsController extends BaseController {
|
||||
plusInfo,
|
||||
headerMenus,
|
||||
suiteSetting,
|
||||
app:{
|
||||
time: new Date().getTime(),
|
||||
version,
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,6 +45,23 @@ export class NotificationService extends BaseService<NotificationEntity> {
|
||||
return notificationRegistry.getDefine(type);
|
||||
}
|
||||
|
||||
async add(bean: NotificationEntity) {
|
||||
const res = await super.add(bean);
|
||||
if(bean.isDefault){
|
||||
await this.setDefault(res.id, bean.userId);
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
async update(bean: NotificationEntity) {
|
||||
const res = await super.update(bean);
|
||||
if(bean.isDefault){
|
||||
const old = await this.info(bean.id);
|
||||
await this.setDefault(bean.id, old.userId);
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
async getById(id: number, userId: number): Promise<NotificationInstanceConfig> {
|
||||
if (!id) {
|
||||
throw new ValidateException('id不能为空');
|
||||
|
||||
@@ -15,3 +15,4 @@ export * from './plugin-gcore/index.js';
|
||||
export * from './plugin-qnap/index.js';
|
||||
export * from './plugin-aws/index.js';
|
||||
export * from './plugin-dnsla/index.js';
|
||||
export * from './plugin-upyun/index.js';
|
||||
|
||||
@@ -8,7 +8,7 @@ import { AliyunAccess, AliyunClient } from '@certd/plugin-lib';
|
||||
title: '阿里云',
|
||||
desc: '阿里云DNS解析提供商',
|
||||
accessType: 'aliyun',
|
||||
icon: 'ant-design:aliyun-outlined',
|
||||
icon: 'svg:icon-aliyun',
|
||||
})
|
||||
export class AliyunDnsProvider extends AbstractDnsProvider {
|
||||
client: any;
|
||||
|
||||
@@ -5,7 +5,7 @@ import { AliyunAccess, AliyunClient, AliyunSslClient, createCertDomainGetterInpu
|
||||
@IsTaskPlugin({
|
||||
name: 'AliyunDeployCertToALB',
|
||||
title: '阿里云-部署至ALB(应用负载均衡)',
|
||||
icon: 'ant-design:aliyun-outlined',
|
||||
icon: 'svg:icon-aliyun',
|
||||
group: pluginGroups.aliyun.key,
|
||||
desc: 'ALB,更新监听器的默认证书',
|
||||
needPlus: false,
|
||||
|
||||
@@ -5,7 +5,7 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
|
||||
@IsTaskPlugin({
|
||||
name: 'DeployCertToAliyunCDN',
|
||||
title: '阿里云-部署证书至CDN',
|
||||
icon: 'ant-design:aliyun-outlined',
|
||||
icon: 'svg:icon-aliyun',
|
||||
group: pluginGroups.aliyun.key,
|
||||
desc: '自动部署域名证书至阿里云CDN',
|
||||
default: {
|
||||
|
||||
@@ -6,7 +6,7 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
|
||||
@IsTaskPlugin({
|
||||
name: 'DeployCertToAliyunDCDN',
|
||||
title: '阿里云-部署证书至DCDN',
|
||||
icon: 'ant-design:aliyun-outlined',
|
||||
icon: 'svg:icon-aliyun',
|
||||
group: pluginGroups.aliyun.key,
|
||||
desc: '依赖证书申请前置任务,自动部署域名证书至阿里云DCDN',
|
||||
default: {
|
||||
|
||||
@@ -6,7 +6,7 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
|
||||
@IsTaskPlugin({
|
||||
name: 'AliyunDeployCertToFC',
|
||||
title: '阿里云-部署至阿里云FC(3.0)',
|
||||
icon: 'ant-design:aliyun-outlined',
|
||||
icon: 'svg:icon-aliyun',
|
||||
group: pluginGroups.aliyun.key,
|
||||
desc: '部署证书到阿里云函数计算(FC3.0),【注意】证书的加密算法必须选择【pkcs1旧版】',
|
||||
needPlus: true,
|
||||
|
||||
@@ -5,7 +5,7 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
|
||||
@IsTaskPlugin({
|
||||
name: 'AliyunDeployCertToNLB',
|
||||
title: '阿里云-部署至NLB(网络负载均衡)',
|
||||
icon: 'ant-design:aliyun-outlined',
|
||||
icon: 'svg:icon-aliyun',
|
||||
group: pluginGroups.aliyun.key,
|
||||
desc: 'NLB,网络负载均衡,更新监听器的默认证书',
|
||||
needPlus: false,
|
||||
|
||||
@@ -5,7 +5,7 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
|
||||
@IsTaskPlugin({
|
||||
name: 'DeployCertToAliyunOSS',
|
||||
title: '阿里云-部署证书至OSS',
|
||||
icon: 'ant-design:aliyun-outlined',
|
||||
icon: 'svg:icon-aliyun',
|
||||
group: pluginGroups.aliyun.key,
|
||||
desc: '自动部署域名证书至阿里云OSS',
|
||||
default: {
|
||||
|
||||
@@ -5,7 +5,7 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
|
||||
@IsTaskPlugin({
|
||||
name: 'AliyunDeployCertToSLB',
|
||||
title: '阿里云-部署至SLB(传统负载均衡)',
|
||||
icon: 'ant-design:aliyun-outlined',
|
||||
icon: 'svg:icon-aliyun',
|
||||
group: pluginGroups.aliyun.key,
|
||||
desc: '部署证书到阿里云SLB(传统负载均衡)',
|
||||
needPlus: false,
|
||||
|
||||
@@ -6,7 +6,7 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
|
||||
@IsTaskPlugin({
|
||||
name: 'AliyunDeployCertToWaf',
|
||||
title: '阿里云-部署至阿里云WAF',
|
||||
icon: 'ant-design:aliyun-outlined',
|
||||
icon: 'svg:icon-aliyun',
|
||||
group: pluginGroups.aliyun.key,
|
||||
desc: '部署证书到阿里云WAF',
|
||||
needPlus: true,
|
||||
|
||||
@@ -24,7 +24,7 @@ const regionDict = [
|
||||
@IsTaskPlugin({
|
||||
name: 'uploadCertToAliyun',
|
||||
title: '阿里云-上传证书到阿里云',
|
||||
icon: 'ant-design:aliyun-outlined',
|
||||
icon: 'svg:icon-aliyun',
|
||||
group: pluginGroups.aliyun.key,
|
||||
desc: '如果不想在阿里云上同一份证书上传多次,可以把此任务作为前置任务,其他阿里云任务证书那一项选择此任务的输出',
|
||||
default: {
|
||||
|
||||
@@ -37,7 +37,7 @@ export const AwsRegions = [
|
||||
name: 'aws',
|
||||
title: '亚马逊云aws授权',
|
||||
desc: '',
|
||||
icon: 'ant-design:aws-outlined',
|
||||
icon: 'svg:icon-aws',
|
||||
})
|
||||
export class AwsAccess extends BaseAccess {
|
||||
@AccessInput({
|
||||
|
||||
@@ -10,7 +10,7 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
|
||||
name: 'AwsDeployToCloudFront',
|
||||
title: 'AWS-部署证书到CloudFront',
|
||||
desc: '部署证书到 AWS CloudFront',
|
||||
icon: 'clarity:plugin-line',
|
||||
icon: 'svg:icon-aws',
|
||||
group: pluginGroups.aws.key,
|
||||
needPlus: true,
|
||||
default: {
|
||||
|
||||
@@ -7,7 +7,7 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
|
||||
name: 'AwsUploadToACM',
|
||||
title: 'AWS-上传证书到ACM',
|
||||
desc: '上传证书 AWS ACM',
|
||||
icon: 'clarity:plugin-line',
|
||||
icon: 'svg:icon-aws',
|
||||
group: pluginGroups.aws.key,
|
||||
default: {
|
||||
strategy: {
|
||||
|
||||
@@ -4,7 +4,7 @@ import { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from
|
||||
import { optionsUtils } from '@certd/basic/dist/utils/util.options.js';
|
||||
import { CertApplyPluginNames} from '@certd/plugin-cert';
|
||||
@IsTaskPlugin({
|
||||
//命名规范,插件名称+功能(就是目录plugin-demo中的demo),大写字母开头,驼峰命名
|
||||
//命名规范,插件类型+功能(就是目录plugin-demo中的demo),大写字母开头,驼峰命名
|
||||
name: 'DemoTest',
|
||||
title: 'Demo-测试插件',
|
||||
icon: 'clarity:plugin-line',
|
||||
|
||||
@@ -144,9 +144,9 @@ export class DnslaDnsProvider extends AbstractDnsProvider<DnslaRecord> {
|
||||
const res = await this.doRequestApi(url, {
|
||||
domainId: domainId,
|
||||
type: 16,
|
||||
host: fullRecord,
|
||||
host: fullRecord.replace(`.${domain}`, ''),
|
||||
data: value,
|
||||
ttl: 1,
|
||||
ttl: 60,
|
||||
});
|
||||
|
||||
return res.data;
|
||||
|
||||
@@ -179,6 +179,21 @@ export class UploadCertToHostPlugin extends AbstractTaskPlugin {
|
||||
})
|
||||
accessId!: string;
|
||||
|
||||
@TaskInput({
|
||||
title: '上传方式',
|
||||
helper: '选择上传方式,sftp或者scp',
|
||||
value:"sftp",
|
||||
component: {
|
||||
name: 'a-select',
|
||||
options: [
|
||||
{ value: 'sftp', label: 'sftp' },
|
||||
{ value: 'scp', label: 'scp' },
|
||||
],
|
||||
},
|
||||
required: true,
|
||||
})
|
||||
uploadType: string = 'sftp';
|
||||
|
||||
@TaskInput({
|
||||
title: '自动创建远程目录',
|
||||
helper: '是否自动创建远程目录,如果关闭则你需要自己确保远程目录存在',
|
||||
@@ -249,18 +264,7 @@ export class UploadCertToHostPlugin extends AbstractTaskPlugin {
|
||||
|
||||
async onInstance() {}
|
||||
|
||||
// copyFile(srcFile: string, destFile: string) {
|
||||
// if (!srcFile || !destFile) {
|
||||
// this.logger.warn(`srcFile:${srcFile} 或 destFile:${destFile} 为空,不复制`);
|
||||
// return;
|
||||
// }
|
||||
// const dir = destFile.substring(0, destFile.lastIndexOf('/'));
|
||||
// if (!fs.existsSync(dir)) {
|
||||
// fs.mkdirSync(dir, { recursive: true });
|
||||
// }
|
||||
// fs.copyFileSync(srcFile, destFile);
|
||||
// this.logger.info(`复制文件:${srcFile} => ${destFile}`);
|
||||
// }
|
||||
|
||||
async execute(): Promise<void> {
|
||||
const { cert, accessId } = this;
|
||||
let { crtPath, keyPath, icPath, pfxPath, derPath, jksPath, onePath } = this;
|
||||
@@ -268,16 +272,6 @@ export class UploadCertToHostPlugin extends AbstractTaskPlugin {
|
||||
|
||||
const handle = async (opts: CertReaderHandleContext) => {
|
||||
const { tmpCrtPath, tmpKeyPath, tmpDerPath, tmpJksPath, tmpPfxPath, tmpIcPath, tmpOnePath } = opts;
|
||||
// if (this.copyToThisHost) {
|
||||
// this.logger.info('复制到目标路径');
|
||||
// this.copyFile(tmpCrtPath, crtPath);
|
||||
// this.copyFile(tmpKeyPath, keyPath);
|
||||
// this.copyFile(tmpIcPath, this.icPath);
|
||||
// this.copyFile(tmpPfxPath, this.pfxPath);
|
||||
// this.copyFile(tmpDerPath, this.derPath);
|
||||
// this.logger.warn('复制到当前主机功能已迁移到 “复制到本机”插件,请尽快换成复制到本机插件');
|
||||
// return;
|
||||
// }
|
||||
|
||||
if (accessId == null) {
|
||||
this.logger.error('复制到当前主机功能已迁移到 “复制到本机”插件,请换成复制到本机插件');
|
||||
@@ -355,7 +349,9 @@ export class UploadCertToHostPlugin extends AbstractTaskPlugin {
|
||||
connectConf,
|
||||
transports,
|
||||
mkdirs: this.mkdirs,
|
||||
uploadType: this.uploadType,
|
||||
});
|
||||
|
||||
this.logger.info('上传文件到服务器成功');
|
||||
//输出
|
||||
this.hostCrtPath = crtPath;
|
||||
|
||||
@@ -131,7 +131,7 @@ export class DingTalkNotification extends BaseNotification {
|
||||
data: {
|
||||
at: at,
|
||||
text: {
|
||||
content: `· ${body.title}\n· ${body.content}\n· 查看详情: ${body.url}`,
|
||||
content: `${body.title}\n${body.content}\n查看详情: ${body.url}`,
|
||||
},
|
||||
msgtype:"text"
|
||||
},
|
||||
|
||||
@@ -106,7 +106,7 @@ export class DingTalkNotification extends BaseNotification {
|
||||
}
|
||||
|
||||
if (atText){
|
||||
atText = `\n· ${atText}`
|
||||
atText = `\n${atText}`
|
||||
}
|
||||
|
||||
let sign:any = {}
|
||||
@@ -125,7 +125,7 @@ export class DingTalkNotification extends BaseNotification {
|
||||
data: {
|
||||
...sign,
|
||||
content: {
|
||||
text: `· ${body.title}\n· ${body.content}\n· 查看详情: ${body.url}${atText}`,
|
||||
text: `${body.title}\n${body.content}\n查看详情: ${body.url}${atText}`,
|
||||
},
|
||||
msg_type:"text"
|
||||
},
|
||||
|
||||
@@ -62,7 +62,7 @@ export class QywxNotification extends BaseNotification {
|
||||
data: {
|
||||
msgtype: 'text',
|
||||
text: {
|
||||
content: `· ${body.title}\n· ${body.content}\n· 查看详情: ${body.url}`,
|
||||
content: `${body.title}\n${body.content}\n查看详情: ${body.url}`,
|
||||
mentioned_list: this.mentionedList,
|
||||
mentioned_mobile_list: this.mentionedMobileList,
|
||||
},
|
||||
|
||||
@@ -8,7 +8,7 @@ import { IsAccess, AccessInput, BaseAccess } from '@certd/pipeline';
|
||||
name: 'proxmox',
|
||||
title: 'proxmox',
|
||||
desc: '',
|
||||
icon: 'svg:icon-dogecloud',
|
||||
icon: 'svg:icon-proxmox',
|
||||
})
|
||||
export class ProxmoxAccess extends BaseAccess {
|
||||
/**
|
||||
|
||||
@@ -7,8 +7,8 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
|
||||
@IsTaskPlugin({
|
||||
//命名规范,插件名称+功能(就是目录plugin-demo中的demo),大写字母开头,驼峰命名
|
||||
name: 'ProxmoxUploadCert',
|
||||
title: '上传证书到Proxmox',
|
||||
icon: 'clarity:plugin-line',
|
||||
title: 'Proxmox-上传证书到Proxmox',
|
||||
icon: 'svg:icon-proxmox',
|
||||
//插件分组
|
||||
group: pluginGroups.other.key,
|
||||
needPlus: true,
|
||||
|
||||
@@ -8,7 +8,7 @@ import { CertApplyPluginNames} from '@certd/plugin-cert';
|
||||
@IsTaskPlugin({
|
||||
name: 'QnapDeploy',
|
||||
title: '威联通-部署证书到威联通',
|
||||
icon: 'simple-icons:qnap',
|
||||
icon: 'svg:icon-qnap',
|
||||
group: pluginGroups.panel.key,
|
||||
desc: '部署证书到qnap',
|
||||
default: {
|
||||
|
||||
35
packages/ui/certd-server/src/plugins/plugin-upyun/access.ts
Normal file
35
packages/ui/certd-server/src/plugins/plugin-upyun/access.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
import {AccessInput, BaseAccess, IsAccess} from '@certd/pipeline';
|
||||
|
||||
/**
|
||||
* 这个注解将注册一个授权配置
|
||||
* 在certd的后台管理系统中,用户可以选择添加此类型的授权
|
||||
*/
|
||||
@IsAccess({
|
||||
name: 'upyun',
|
||||
title: '又拍云',
|
||||
desc: '',
|
||||
icon: 'svg:icon-upyun',
|
||||
})
|
||||
export class UpyunAccess extends BaseAccess {
|
||||
|
||||
@AccessInput({
|
||||
title: '账号',
|
||||
component: {
|
||||
placeholder: '又拍云账号',
|
||||
},
|
||||
required: true,
|
||||
})
|
||||
username = '';
|
||||
@AccessInput({
|
||||
title: '密码',
|
||||
component: {
|
||||
placeholder: '又拍云密码',
|
||||
},
|
||||
required: true,
|
||||
encrypt: true,
|
||||
})
|
||||
password = '';
|
||||
|
||||
}
|
||||
|
||||
new UpyunAccess();
|
||||
@@ -0,0 +1,2 @@
|
||||
export * from './plugins/index.js';
|
||||
export * from './access.js';
|
||||
@@ -0,0 +1 @@
|
||||
export * from './plugin-depoy-to-cdn.js';
|
||||
@@ -0,0 +1,185 @@
|
||||
import { IsTaskPlugin, pluginGroups, RunStrategy, TaskInput } from '@certd/pipeline';
|
||||
import { CertInfo } from '@certd/plugin-cert';
|
||||
import { AbstractPlusTaskPlugin } from '@certd/plugin-plus';
|
||||
import { UpyunAccess } from '../access.js';
|
||||
import {createCertDomainGetterInputDefine, createRemoteSelectInputDefine} from '@certd/plugin-lib';
|
||||
import { CertApplyPluginNames} from '@certd/plugin-cert';
|
||||
import {optionsUtils} from "@certd/basic/dist/utils/util.options.js";
|
||||
@IsTaskPlugin({
|
||||
//命名规范,插件名称+功能(就是目录plugin-demo中的demo),大写字母开头,驼峰命名
|
||||
name: 'UpyunDeployToCdn',
|
||||
title: '又拍云-部署证书到CDN',
|
||||
icon: 'svg:icon-upyun',
|
||||
//插件分组
|
||||
group: pluginGroups.cdn.key,
|
||||
needPlus: true,
|
||||
default: {
|
||||
//默认值配置照抄即可
|
||||
strategy: {
|
||||
runStrategy: RunStrategy.SkipWhenSucceed,
|
||||
},
|
||||
},
|
||||
})
|
||||
//类名规范,跟上面插件名称(name)一致
|
||||
export class UpyunDeployToCdn extends AbstractPlusTaskPlugin {
|
||||
//证书选择,此项必须要有
|
||||
@TaskInput({
|
||||
title: '域名证书',
|
||||
helper: '请选择前置任务输出的域名证书',
|
||||
component: {
|
||||
name: 'output-selector',
|
||||
from: [...CertApplyPluginNames],
|
||||
},
|
||||
// required: true, // 必填
|
||||
})
|
||||
cert!: CertInfo;
|
||||
|
||||
@TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))
|
||||
certDomains!: string[];
|
||||
//授权选择框
|
||||
@TaskInput({
|
||||
title: 'Upyun授权',
|
||||
component: {
|
||||
name: 'access-selector',
|
||||
type: 'upyun', //固定授权类型
|
||||
},
|
||||
required: true, //必填
|
||||
})
|
||||
accessId!: string;
|
||||
//
|
||||
|
||||
@TaskInput(
|
||||
createRemoteSelectInputDefine({
|
||||
title: 'CDN加速域名',
|
||||
helper: '选择CDN加速域名,可以手动输入',
|
||||
typeName: 'UpyunDeployToCdn',
|
||||
action: UpyunDeployToCdn.prototype.onGetCdnList.name,
|
||||
watches: ['accessId'],
|
||||
})
|
||||
)
|
||||
cdnList!: string[];
|
||||
|
||||
//插件实例化时执行的方法
|
||||
async onInstance() {}
|
||||
|
||||
//插件执行方法
|
||||
async execute(): Promise<void> {
|
||||
|
||||
const cookie = await this.getLoginToken();
|
||||
this.logger.info(`登录成功`);
|
||||
const certId = await this.uploadCert(cookie);
|
||||
this.logger.info(`上传证书成功:${certId}`);
|
||||
for (const item of this.cdnList) {
|
||||
this.logger.info(`开始部署证书:${item}`);
|
||||
const res = await this.doRequest({
|
||||
cookie:cookie,
|
||||
url: 'https://console.upyun.com/api/https/migrate/domain',
|
||||
method: 'POST',
|
||||
data:{
|
||||
crt_id: certId,
|
||||
domain_name : item
|
||||
}
|
||||
})
|
||||
this.logger.info(`部署成功:${JSON.stringify(res)}`);
|
||||
}
|
||||
|
||||
this.logger.info('部署成功');
|
||||
}
|
||||
|
||||
async uploadCert(cookie:string){
|
||||
// https://console.upyun.com/api/https/certificate/
|
||||
const res = await this.doRequest({
|
||||
cookie:cookie,
|
||||
url: 'https://console.upyun.com/api/https/certificate/',
|
||||
method: 'POST',
|
||||
data:{
|
||||
certificate: this.cert.crt,
|
||||
private_key: this.cert.key
|
||||
}
|
||||
})
|
||||
|
||||
return res.data.result.certificate_id
|
||||
}
|
||||
|
||||
async getLoginToken(){
|
||||
const access = await this.accessService.getById<UpyunAccess>(this.accessId)
|
||||
const res = await this.http.request({
|
||||
url: 'https://console.upyun.com/accounts/signin/',
|
||||
method: 'POST',
|
||||
data:{
|
||||
username: access.username,
|
||||
password: access.password
|
||||
},
|
||||
logRes:false,
|
||||
returnResponse:true
|
||||
});
|
||||
if (res.data?.errors?.length>0) {
|
||||
throw new Error(JSON.stringify(res.data.msg));
|
||||
}
|
||||
const cookie = res.headers['set-cookie'];
|
||||
return cookie;
|
||||
}
|
||||
|
||||
async doRequest(req:{
|
||||
cookie:string,
|
||||
url:string,
|
||||
method:string,
|
||||
data:any
|
||||
}){
|
||||
|
||||
const res = await this.http.request({
|
||||
url: req.url,
|
||||
method: req.method,
|
||||
data:req.data,
|
||||
headers:{
|
||||
Cookie: req.cookie
|
||||
}
|
||||
})
|
||||
if (res.msg.errors.length>0) {
|
||||
throw new Error(JSON.stringify(res.msg));
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
async onGetCdnList() {
|
||||
if(!this.accessId){
|
||||
throw new Error('accessId不能为空');
|
||||
}
|
||||
|
||||
const cookie = await this.getLoginToken();
|
||||
const req = {
|
||||
cookie,
|
||||
url: 'https://console.upyun.com/api/v2/buckets/?bucket_name=&with_domains=true&business_type=file&perPage=100&page=1&tag=all&state=all&type=ucdn&security_cdn=false',
|
||||
method: 'GET',
|
||||
data:{}
|
||||
}
|
||||
const res = await this.doRequest(req);
|
||||
|
||||
const buckets = res.data?.buckets;
|
||||
if(!buckets || buckets.length === 0){
|
||||
throw new Error('没有找到CDN加速域名');
|
||||
}
|
||||
const list= []
|
||||
for (const item of buckets) {
|
||||
for (const domain of item.domains) {
|
||||
list.push({
|
||||
domain:domain.domain,
|
||||
bucket:item.bucket_name
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const options = list.map((item: any) => {
|
||||
return {
|
||||
value: item.domain,
|
||||
label: `${item.domain}<${item.bucket}>`,
|
||||
domain: item.domain,
|
||||
};
|
||||
});
|
||||
return optionsUtils.buildGroupOptions(options, this.certDomains);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
//实例化一下,注册插件
|
||||
new UpyunDeployToCdn();
|
||||
@@ -17,7 +17,7 @@ type westRecord = {
|
||||
name: 'west',
|
||||
title: '西部数码',
|
||||
desc: 'west dns provider',
|
||||
icon: 'tabler:map-west',
|
||||
icon: 'svg:icon-xibushuma',
|
||||
// 这里是对应的云平台的access类型名称
|
||||
accessType: 'west',
|
||||
})
|
||||
|
||||
156
pnpm-lock.yaml
generated
156
pnpm-lock.yaml
generated
@@ -46,7 +46,7 @@ importers:
|
||||
packages/core/acme-client:
|
||||
dependencies:
|
||||
'@certd/basic':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../basic
|
||||
'@peculiar/x509':
|
||||
specifier: ^1.11.0
|
||||
@@ -204,10 +204,10 @@ importers:
|
||||
packages/core/pipeline:
|
||||
dependencies:
|
||||
'@certd/basic':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../basic
|
||||
'@certd/plus-core':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../pro/plus-core
|
||||
dayjs:
|
||||
specifier: ^1.11.7
|
||||
@@ -342,7 +342,7 @@ importers:
|
||||
packages/libs/lib-k8s:
|
||||
dependencies:
|
||||
'@certd/basic':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../core/basic
|
||||
'@kubernetes/client-node':
|
||||
specifier: 0.21.0
|
||||
@@ -382,16 +382,16 @@ importers:
|
||||
packages/libs/lib-server:
|
||||
dependencies:
|
||||
'@certd/acme-client':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../core/acme-client
|
||||
'@certd/basic':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../core/basic
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../core/pipeline
|
||||
'@certd/plus-core':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../pro/plus-core
|
||||
'@midwayjs/cache':
|
||||
specifier: ~3.14.0
|
||||
@@ -534,16 +534,16 @@ importers:
|
||||
packages/plugins/plugin-cert:
|
||||
dependencies:
|
||||
'@certd/acme-client':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../core/acme-client
|
||||
'@certd/basic':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../core/basic
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../core/pipeline
|
||||
'@certd/plugin-lib':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../plugin-lib
|
||||
'@google-cloud/publicca':
|
||||
specifier: ^1.3.0
|
||||
@@ -610,10 +610,10 @@ importers:
|
||||
specifier: ^1.7.10
|
||||
version: 1.8.0
|
||||
'@certd/basic':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../core/basic
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../core/pipeline
|
||||
'@kubernetes/client-node':
|
||||
specifier: 0.21.0
|
||||
@@ -701,19 +701,19 @@ importers:
|
||||
packages/pro/commercial-core:
|
||||
dependencies:
|
||||
'@certd/basic':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../core/basic
|
||||
'@certd/lib-server':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../libs/lib-server
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../core/pipeline
|
||||
'@certd/plugin-plus':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../plugin-plus
|
||||
'@certd/plus-core':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../plus-core
|
||||
'@midwayjs/core':
|
||||
specifier: ~3.20.3
|
||||
@@ -798,22 +798,22 @@ importers:
|
||||
specifier: ^1.0.2
|
||||
version: 1.0.2
|
||||
'@certd/basic':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../core/basic
|
||||
'@certd/lib-k8s':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../libs/lib-k8s
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../core/pipeline
|
||||
'@certd/plugin-cert':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../plugins/plugin-cert
|
||||
'@certd/plugin-lib':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../plugins/plugin-lib
|
||||
'@certd/plus-core':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../plus-core
|
||||
ali-oss:
|
||||
specifier: ^6.21.0
|
||||
@@ -910,7 +910,7 @@ importers:
|
||||
packages/pro/plus-core:
|
||||
dependencies:
|
||||
'@certd/basic':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../core/basic
|
||||
dayjs:
|
||||
specifier: ^1.11.7
|
||||
@@ -1072,9 +1072,6 @@ importers:
|
||||
cropperjs:
|
||||
specifier: ^1.6.1
|
||||
version: 1.6.2
|
||||
crypto-js:
|
||||
specifier: ^4.2.0
|
||||
version: 4.2.0
|
||||
cssnano:
|
||||
specifier: ^7.0.6
|
||||
version: 7.0.6(postcss@8.5.3)
|
||||
@@ -1188,10 +1185,10 @@ importers:
|
||||
version: 0.1.3(zod@3.24.2)
|
||||
devDependencies:
|
||||
'@certd/lib-iframe':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../libs/lib-iframe
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../core/pipeline
|
||||
'@rollup/plugin-commonjs':
|
||||
specifier: ^25.0.7
|
||||
@@ -1371,40 +1368,40 @@ importers:
|
||||
specifier: ^3.705.0
|
||||
version: 3.758.0(aws-crt@1.25.3)
|
||||
'@certd/acme-client':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../core/acme-client
|
||||
'@certd/basic':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../core/basic
|
||||
'@certd/commercial-core':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../pro/commercial-core
|
||||
'@certd/lib-huawei':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../libs/lib-huawei
|
||||
'@certd/lib-k8s':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../libs/lib-k8s
|
||||
'@certd/lib-server':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../libs/lib-server
|
||||
'@certd/midway-flyway-js':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../libs/midway-flyway-js
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../core/pipeline
|
||||
'@certd/plugin-cert':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../plugins/plugin-cert
|
||||
'@certd/plugin-lib':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../plugins/plugin-lib
|
||||
'@certd/plugin-plus':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../pro/plugin-plus
|
||||
'@certd/plus-core':
|
||||
specifier: ^1.31.3
|
||||
specifier: ^1.31.7
|
||||
version: link:../../pro/plus-core
|
||||
'@corsinvest/cv4pve-api-javascript':
|
||||
specifier: ^8.3.0
|
||||
@@ -1577,6 +1574,9 @@ importers:
|
||||
typeorm:
|
||||
specifier: ^0.3.20
|
||||
version: 0.3.21(better-sqlite3@11.8.1)(pg@8.13.3)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.80)(typescript@5.8.2))
|
||||
upyun:
|
||||
specifier: ^3.4.6
|
||||
version: 3.4.6
|
||||
uuid:
|
||||
specifier: ^10.0.0
|
||||
version: 10.0.0
|
||||
@@ -5348,6 +5348,9 @@ packages:
|
||||
peerDependencies:
|
||||
axios: '>= 0.17.0'
|
||||
|
||||
axios@0.26.1:
|
||||
resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==}
|
||||
|
||||
axios@1.8.2:
|
||||
resolution: {integrity: sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==}
|
||||
|
||||
@@ -5375,6 +5378,9 @@ packages:
|
||||
balanced-match@2.0.0:
|
||||
resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==}
|
||||
|
||||
base-64@1.0.0:
|
||||
resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==}
|
||||
|
||||
base64-js@1.5.1:
|
||||
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
|
||||
|
||||
@@ -5663,6 +5669,9 @@ packages:
|
||||
chardet@0.7.0:
|
||||
resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
|
||||
|
||||
charenc@0.0.2:
|
||||
resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==}
|
||||
|
||||
check-error@1.0.3:
|
||||
resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
|
||||
|
||||
@@ -6078,6 +6087,9 @@ packages:
|
||||
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
|
||||
engines: {node: '>= 8'}
|
||||
|
||||
crypt@0.0.2:
|
||||
resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==}
|
||||
|
||||
crypto-js@4.2.0:
|
||||
resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==}
|
||||
|
||||
@@ -7441,6 +7453,9 @@ packages:
|
||||
resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==}
|
||||
engines: {node: '>=12.0.0'}
|
||||
|
||||
hmacsha1@1.0.0:
|
||||
resolution: {integrity: sha512-4FP6J0oI8jqb6gLLl9tSwVdosWJ/AKSGJ+HwYf6Ixe4MUcEkst4uWzpVQrNOCin0fzTRQbXV8ePheU8WiiDYBw==}
|
||||
|
||||
hookable@5.5.3:
|
||||
resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
|
||||
|
||||
@@ -7683,6 +7698,9 @@ packages:
|
||||
resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
|
||||
engines: {node: '>= 0.4'}
|
||||
|
||||
is-buffer@1.1.6:
|
||||
resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
|
||||
|
||||
is-buffer@2.0.5:
|
||||
resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==}
|
||||
engines: {node: '>=4'}
|
||||
@@ -7812,6 +7830,9 @@ packages:
|
||||
resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
||||
is-promise@4.0.0:
|
||||
resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
|
||||
|
||||
is-reference@1.2.1:
|
||||
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
|
||||
|
||||
@@ -8532,6 +8553,9 @@ packages:
|
||||
mathml-tag-names@2.1.3:
|
||||
resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
|
||||
|
||||
md5@2.3.0:
|
||||
resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==}
|
||||
|
||||
mdast-util-to-hast@13.2.0:
|
||||
resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==}
|
||||
|
||||
@@ -11567,6 +11591,10 @@ packages:
|
||||
resolution: {integrity: sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==}
|
||||
engines: {node: '>=10'}
|
||||
|
||||
upyun@3.4.6:
|
||||
resolution: {integrity: sha512-ThAI7woGkVE2lsOq8MFYb0Oeg8avOQQbY3XmXmaq1aZVjzcglcMuI/RImBrq+KJw7nX39iNKCJKYs65xiAF53Q==}
|
||||
engines: {node: '>=8.0.0'}
|
||||
|
||||
uri-js@4.4.1:
|
||||
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
|
||||
|
||||
@@ -17349,6 +17377,12 @@ snapshots:
|
||||
fast-deep-equal: 3.1.3
|
||||
is-buffer: 2.0.5
|
||||
|
||||
axios@0.26.1:
|
||||
dependencies:
|
||||
follow-redirects: 1.15.9(debug@4.4.0)
|
||||
transitivePeerDependencies:
|
||||
- debug
|
||||
|
||||
axios@1.8.2(debug@4.4.0):
|
||||
dependencies:
|
||||
follow-redirects: 1.15.9(debug@4.4.0)
|
||||
@@ -17397,6 +17431,8 @@ snapshots:
|
||||
|
||||
balanced-match@2.0.0: {}
|
||||
|
||||
base-64@1.0.0: {}
|
||||
|
||||
base64-js@1.5.1: {}
|
||||
|
||||
base64url@3.0.1: {}
|
||||
@@ -17742,6 +17778,8 @@ snapshots:
|
||||
|
||||
chardet@0.7.0: {}
|
||||
|
||||
charenc@0.0.2: {}
|
||||
|
||||
check-error@1.0.3:
|
||||
dependencies:
|
||||
get-func-name: 2.0.2
|
||||
@@ -18168,6 +18206,8 @@ snapshots:
|
||||
shebang-command: 2.0.0
|
||||
which: 2.0.2
|
||||
|
||||
crypt@0.0.2: {}
|
||||
|
||||
crypto-js@4.2.0: {}
|
||||
|
||||
crypto-random-string@2.0.0: {}
|
||||
@@ -18988,13 +19028,13 @@ snapshots:
|
||||
resolve: 1.22.10
|
||||
semver: 6.3.1
|
||||
|
||||
eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@7.32.0)(prettier@2.8.8):
|
||||
eslint-plugin-prettier@3.4.1(eslint-config-prettier@8.10.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.8.8):
|
||||
dependencies:
|
||||
eslint: 7.32.0
|
||||
prettier: 2.8.8
|
||||
prettier-linter-helpers: 1.0.0
|
||||
optionalDependencies:
|
||||
eslint-config-prettier: 8.10.0(eslint@8.57.0)
|
||||
eslint-config-prettier: 8.10.0(eslint@7.32.0)
|
||||
|
||||
eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8):
|
||||
dependencies:
|
||||
@@ -19857,6 +19897,8 @@ snapshots:
|
||||
|
||||
highlight.js@11.11.1: {}
|
||||
|
||||
hmacsha1@1.0.0: {}
|
||||
|
||||
hookable@5.5.3: {}
|
||||
|
||||
hosted-git-info@2.8.9: {}
|
||||
@@ -20108,6 +20150,8 @@ snapshots:
|
||||
call-bound: 1.0.4
|
||||
has-tostringtag: 1.0.2
|
||||
|
||||
is-buffer@1.1.6: {}
|
||||
|
||||
is-buffer@2.0.5: {}
|
||||
|
||||
is-callable@1.2.7: {}
|
||||
@@ -20207,6 +20251,8 @@ snapshots:
|
||||
|
||||
is-plain-object@5.0.0: {}
|
||||
|
||||
is-promise@4.0.0: {}
|
||||
|
||||
is-reference@1.2.1:
|
||||
dependencies:
|
||||
'@types/estree': 1.0.6
|
||||
@@ -20999,6 +21045,12 @@ snapshots:
|
||||
|
||||
mathml-tag-names@2.1.3: {}
|
||||
|
||||
md5@2.3.0:
|
||||
dependencies:
|
||||
charenc: 0.0.2
|
||||
crypt: 0.0.2
|
||||
is-buffer: 1.1.6
|
||||
|
||||
mdast-util-to-hast@13.2.0:
|
||||
dependencies:
|
||||
'@types/hast': 3.0.4
|
||||
@@ -21330,7 +21382,7 @@ snapshots:
|
||||
eslint: 7.32.0
|
||||
eslint-config-prettier: 8.10.0(eslint@7.32.0)
|
||||
eslint-plugin-node: 11.1.0(eslint@7.32.0)
|
||||
eslint-plugin-prettier: 3.4.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@7.32.0)(prettier@2.8.8)
|
||||
eslint-plugin-prettier: 3.4.1(eslint-config-prettier@8.10.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.8.8)
|
||||
execa: 5.1.1
|
||||
inquirer: 7.3.3
|
||||
json5: 2.2.3
|
||||
@@ -24373,6 +24425,18 @@ snapshots:
|
||||
semver-diff: 3.1.1
|
||||
xdg-basedir: 4.0.0
|
||||
|
||||
upyun@3.4.6:
|
||||
dependencies:
|
||||
axios: 0.26.1
|
||||
base-64: 1.0.0
|
||||
form-data: 4.0.2
|
||||
hmacsha1: 1.0.0
|
||||
is-promise: 4.0.0
|
||||
md5: 2.3.0
|
||||
mime-types: 2.1.35
|
||||
transitivePeerDependencies:
|
||||
- debug
|
||||
|
||||
uri-js@4.4.1:
|
||||
dependencies:
|
||||
punycode: 2.3.1
|
||||
|
||||
Reference in New Issue
Block a user