mirror of https://github.com/certd/certd
Merge branch 'v2-dev' into v2-dev-auto
# Conflicts: # packages/ui/certd-client/src/locales/langs/en-US/certd.ts # packages/ui/certd-client/src/locales/langs/zh-CN/certd.tsv2-dev-auto
commit
4bef527ebb
23
CHANGELOG.md
23
CHANGELOG.md
|
@ -3,6 +3,29 @@
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 某些插件找不到的bug ([4b3f4a8](https://github.com/certd/certd/commit/4b3f4a868a8b0800c5c59de9d0f47bddc079e7b3))
|
||||||
|
|
||||||
|
## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复查看证书对话框翻译错误的bug ([8626b6d](https://github.com/certd/certd/commit/8626b6d9f235c511766f2ae98e0a37f6cebb621c))
|
||||||
|
* 修复translation后分组编辑打不开的bug ([46a1b74](https://github.com/certd/certd/commit/46a1b7479923d2feb2dece202a5932b99981b2cd))
|
||||||
|
* 执行windows nginx命令时,改为return code判断是否执行成功 ([b37cffd](https://github.com/certd/certd/commit/b37cffd704cd08b8bdd68a6e284706eabe59e78d))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 优化证书进度条颜色 ([2af91db](https://github.com/certd/certd/commit/2af91dbf2ae36a4ed17c6788bc2a2a79a3bb29f8))
|
||||||
|
* 站点证书即将过期通知标题颜色优化为红色 ([80c5331](https://github.com/certd/certd/commit/80c5331a5d4c320323d9b9b800e4ea3b72577b33))
|
||||||
|
* 支持部署到阿里云vod ([98da4e1](https://github.com/certd/certd/commit/98da4e1791ed8bb21daf2a9914fda875d14633c9))
|
||||||
|
* 支持部署证书到网宿CDN ([c3da026](https://github.com/certd/certd/commit/c3da026b33106f5195959825a68cadbe49efef00))
|
||||||
|
* 重置管理员密码同时可以清除管理员的2FA设置 ([1ece091](https://github.com/certd/certd/commit/1ece0915f172d5f8b8adb866434e7efcc5c8c46d))
|
||||||
|
* output-selector from参数支持更丰富的过滤规则 ([87853a2](https://github.com/certd/certd/commit/87853a201535f3bfe8505c40f8f5229d82ffcc73))
|
||||||
|
|
||||||
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
22:21
|
10:51
|
||||||
|
|
|
@ -3,6 +3,29 @@
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 某些插件找不到的bug ([4b3f4a8](https://github.com/certd/certd/commit/4b3f4a868a8b0800c5c59de9d0f47bddc079e7b3))
|
||||||
|
|
||||||
|
## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复查看证书对话框翻译错误的bug ([8626b6d](https://github.com/certd/certd/commit/8626b6d9f235c511766f2ae98e0a37f6cebb621c))
|
||||||
|
* 修复translation后分组编辑打不开的bug ([46a1b74](https://github.com/certd/certd/commit/46a1b7479923d2feb2dece202a5932b99981b2cd))
|
||||||
|
* 执行windows nginx命令时,改为return code判断是否执行成功 ([b37cffd](https://github.com/certd/certd/commit/b37cffd704cd08b8bdd68a6e284706eabe59e78d))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 优化证书进度条颜色 ([2af91db](https://github.com/certd/certd/commit/2af91dbf2ae36a4ed17c6788bc2a2a79a3bb29f8))
|
||||||
|
* 站点证书即将过期通知标题颜色优化为红色 ([80c5331](https://github.com/certd/certd/commit/80c5331a5d4c320323d9b9b800e4ea3b72577b33))
|
||||||
|
* 支持部署到阿里云vod ([98da4e1](https://github.com/certd/certd/commit/98da4e1791ed8bb21daf2a9914fda875d14633c9))
|
||||||
|
* 支持部署证书到网宿CDN ([c3da026](https://github.com/certd/certd/commit/c3da026b33106f5195959825a68cadbe49efef00))
|
||||||
|
* 重置管理员密码同时可以清除管理员的2FA设置 ([1ece091](https://github.com/certd/certd/commit/1ece0915f172d5f8b8adb866434e7efcc5c8c46d))
|
||||||
|
* output-selector from参数支持更丰富的过滤规则 ([87853a2](https://github.com/certd/certd/commit/87853a201535f3bfe8505c40f8f5229d82ffcc73))
|
||||||
|
|
||||||
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
|
@ -13,4 +13,54 @@
|
||||||
:::
|
:::
|
||||||
|
|
||||||
## 升级日志
|
## 升级日志
|
||||||
|
可以查看最新版本号,以及所有版本的更新日志
|
||||||
[CHANGELOG](../changelogs/CHANGELOG.md)
|
[CHANGELOG](../changelogs/CHANGELOG.md)
|
||||||
|
|
||||||
|
|
||||||
|
## 自动升级配置
|
||||||
|
|
||||||
|
### 1. 方法一:使用watchtower监控
|
||||||
|
|
||||||
|
修改docker-compose.yaml文件增加如下配置, 使用watchtower监控自动升级
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
certd:
|
||||||
|
...
|
||||||
|
labels:
|
||||||
|
com.centurylinklabs.watchtower.enable: "true"
|
||||||
|
|
||||||
|
# ↓↓↓↓ --------------------------------------------------------- 自动升级,上面certd的版本号要保持为latest
|
||||||
|
certd-updater: # 添加 Watchtower 服务
|
||||||
|
image: containrrr/watchtower:latest
|
||||||
|
container_name: certd-updater
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
# 配置 自动更新
|
||||||
|
environment:
|
||||||
|
- WATCHTOWER_CLEANUP=true # 自动清理旧版本容器
|
||||||
|
- WATCHTOWER_INCLUDE_STOPPED=false # 不更新已停止的容器
|
||||||
|
- WATCHTOWER_LABEL_ENABLE=true # 根据容器标签进行更新
|
||||||
|
- WATCHTOWER_POLL_INTERVAL=600 # 每 10 分钟检查一次更新
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### 2. 方法二:使用Certd版本监控功能
|
||||||
|
|
||||||
|
选择Github-检查Release版本插件
|
||||||
|

|
||||||
|
按如下图填写配置
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
检测到新版本后执行宿主机升级命令:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# 拉取最新镜像
|
||||||
|
docker pull registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest
|
||||||
|
# 升级容器命令, 替换成你自己的certd更新命令
|
||||||
|
export RESTART_CERT='sleep 10; cd ~/deploy/certd/ ; docker compose down; docker compose up -d'
|
||||||
|
# 构造一个脚本10s后在后台执行,避免容器销毁时执行太快,导致流水线任务无法结束
|
||||||
|
nohup sh -c '$RESTART_CERT' >/dev/null 2>&1 & echo '10秒后重启' && exit
|
||||||
|
```
|
|
@ -9,5 +9,5 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"npmClient": "pnpm",
|
"npmClient": "pnpm",
|
||||||
"version": "1.36.3"
|
"version": "1.36.5"
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,14 @@
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.36.5](https://github.com/publishlab/node-acme-client/compare/v1.36.4...v1.36.5) (2025-07-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/acme-client
|
||||||
|
|
||||||
|
## [1.36.4](https://github.com/publishlab/node-acme-client/compare/v1.36.3...v1.36.4) (2025-07-10)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/acme-client
|
||||||
|
|
||||||
## [1.36.3](https://github.com/publishlab/node-acme-client/compare/v1.36.2...v1.36.3) (2025-07-07)
|
## [1.36.3](https://github.com/publishlab/node-acme-client/compare/v1.36.2...v1.36.3) (2025-07-07)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/acme-client
|
**Note:** Version bump only for package @certd/acme-client
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
"description": "Simple and unopinionated ACME client",
|
"description": "Simple and unopinionated ACME client",
|
||||||
"private": false,
|
"private": false,
|
||||||
"author": "nmorsman",
|
"author": "nmorsman",
|
||||||
"version": "1.36.3",
|
"version": "1.36.5",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"module": "scr/index.js",
|
"module": "scr/index.js",
|
||||||
"main": "src/index.js",
|
"main": "src/index.js",
|
||||||
|
@ -18,7 +18,7 @@
|
||||||
"types"
|
"types"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/basic": "^1.36.3",
|
"@certd/basic": "^1.36.5",
|
||||||
"@peculiar/x509": "^1.11.0",
|
"@peculiar/x509": "^1.11.0",
|
||||||
"asn1js": "^3.0.5",
|
"asn1js": "^3.0.5",
|
||||||
"axios": "^1.7.2",
|
"axios": "^1.7.2",
|
||||||
|
@ -69,5 +69,5 @@
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/publishlab/node-acme-client/issues"
|
"url": "https://github.com/publishlab/node-acme-client/issues"
|
||||||
},
|
},
|
||||||
"gitHead": "1bde777beead9dd23b8d3d98479d616170b8bb69"
|
"gitHead": "c2a95a13fe6edf05ea0f72f5f7c76f9eea3ab0bd"
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,14 @@
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/basic
|
||||||
|
|
||||||
|
## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/basic
|
||||||
|
|
||||||
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/basic
|
**Note:** Version bump only for package @certd/basic
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
22:18
|
10:46
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "@certd/basic",
|
"name": "@certd/basic",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.36.3",
|
"version": "1.36.5",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.js",
|
"module": "./dist/index.js",
|
||||||
|
@ -45,5 +45,5 @@
|
||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "1bde777beead9dd23b8d3d98479d616170b8bb69"
|
"gitHead": "c2a95a13fe6edf05ea0f72f5f7c76f9eea3ab0bd"
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,14 @@
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/pipeline
|
||||||
|
|
||||||
|
## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/pipeline
|
||||||
|
|
||||||
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/pipeline
|
**Note:** Version bump only for package @certd/pipeline
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "@certd/pipeline",
|
"name": "@certd/pipeline",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.36.3",
|
"version": "1.36.5",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.js",
|
"module": "./dist/index.js",
|
||||||
|
@ -17,8 +17,8 @@
|
||||||
"pub": "npm publish"
|
"pub": "npm publish"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/basic": "^1.36.3",
|
"@certd/basic": "^1.36.5",
|
||||||
"@certd/plus-core": "^1.36.3",
|
"@certd/plus-core": "^1.36.5",
|
||||||
"dayjs": "^1.11.7",
|
"dayjs": "^1.11.7",
|
||||||
"lodash-es": "^4.17.21",
|
"lodash-es": "^4.17.21",
|
||||||
"reflect-metadata": "^0.1.13"
|
"reflect-metadata": "^0.1.13"
|
||||||
|
@ -44,5 +44,5 @@
|
||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "1bde777beead9dd23b8d3d98479d616170b8bb69"
|
"gitHead": "c2a95a13fe6edf05ea0f72f5f7c76f9eea3ab0bd"
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,14 @@
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-huawei
|
||||||
|
|
||||||
|
## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-huawei
|
||||||
|
|
||||||
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/lib-huawei
|
**Note:** Version bump only for package @certd/lib-huawei
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "@certd/lib-huawei",
|
"name": "@certd/lib-huawei",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.36.3",
|
"version": "1.36.5",
|
||||||
"main": "./dist/bundle.js",
|
"main": "./dist/bundle.js",
|
||||||
"module": "./dist/bundle.js",
|
"module": "./dist/bundle.js",
|
||||||
"types": "./dist/d/index.d.ts",
|
"types": "./dist/d/index.d.ts",
|
||||||
|
@ -24,5 +24,5 @@
|
||||||
"prettier": "^2.8.8",
|
"prettier": "^2.8.8",
|
||||||
"tslib": "^2.8.1"
|
"tslib": "^2.8.1"
|
||||||
},
|
},
|
||||||
"gitHead": "1bde777beead9dd23b8d3d98479d616170b8bb69"
|
"gitHead": "c2a95a13fe6edf05ea0f72f5f7c76f9eea3ab0bd"
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,14 @@
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-iframe
|
||||||
|
|
||||||
|
## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-iframe
|
||||||
|
|
||||||
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/lib-iframe
|
**Note:** Version bump only for package @certd/lib-iframe
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "@certd/lib-iframe",
|
"name": "@certd/lib-iframe",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.36.3",
|
"version": "1.36.5",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.js",
|
"module": "./dist/index.js",
|
||||||
|
@ -31,5 +31,5 @@
|
||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "1bde777beead9dd23b8d3d98479d616170b8bb69"
|
"gitHead": "c2a95a13fe6edf05ea0f72f5f7c76f9eea3ab0bd"
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,14 @@
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/jdcloud
|
||||||
|
|
||||||
|
## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/jdcloud
|
||||||
|
|
||||||
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/jdcloud
|
**Note:** Version bump only for package @certd/jdcloud
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@certd/jdcloud",
|
"name": "@certd/jdcloud",
|
||||||
"version": "1.36.3",
|
"version": "1.36.5",
|
||||||
"description": "jdcloud openApi sdk",
|
"description": "jdcloud openApi sdk",
|
||||||
"main": "./dist/bundle.js",
|
"main": "./dist/bundle.js",
|
||||||
"module": "./dist/bundle.js",
|
"module": "./dist/bundle.js",
|
||||||
|
@ -61,5 +61,5 @@
|
||||||
"fetch"
|
"fetch"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"gitHead": "1bde777beead9dd23b8d3d98479d616170b8bb69"
|
"gitHead": "c2a95a13fe6edf05ea0f72f5f7c76f9eea3ab0bd"
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,14 @@
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|
||||||
|
## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|
||||||
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/lib-k8s
|
**Note:** Version bump only for package @certd/lib-k8s
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "@certd/lib-k8s",
|
"name": "@certd/lib-k8s",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.36.3",
|
"version": "1.36.5",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.js",
|
"module": "./dist/index.js",
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
"pub": "npm publish"
|
"pub": "npm publish"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/basic": "^1.36.3",
|
"@certd/basic": "^1.36.5",
|
||||||
"@kubernetes/client-node": "0.21.0"
|
"@kubernetes/client-node": "0.21.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
@ -32,5 +32,5 @@
|
||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "1bde777beead9dd23b8d3d98479d616170b8bb69"
|
"gitHead": "c2a95a13fe6edf05ea0f72f5f7c76f9eea3ab0bd"
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,14 @@
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-server
|
||||||
|
|
||||||
|
## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/lib-server
|
||||||
|
|
||||||
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/lib-server
|
**Note:** Version bump only for package @certd/lib-server
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@certd/lib-server",
|
"name": "@certd/lib-server",
|
||||||
"version": "1.36.3",
|
"version": "1.36.5",
|
||||||
"description": "midway with flyway, sql upgrade way ",
|
"description": "midway with flyway, sql upgrade way ",
|
||||||
"private": false,
|
"private": false,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
@ -27,10 +27,10 @@
|
||||||
],
|
],
|
||||||
"license": "AGPL",
|
"license": "AGPL",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/acme-client": "^1.36.3",
|
"@certd/acme-client": "^1.36.5",
|
||||||
"@certd/basic": "^1.36.3",
|
"@certd/basic": "^1.36.5",
|
||||||
"@certd/pipeline": "^1.36.3",
|
"@certd/pipeline": "^1.36.5",
|
||||||
"@certd/plus-core": "^1.36.3",
|
"@certd/plus-core": "^1.36.5",
|
||||||
"@midwayjs/cache": "~3.14.0",
|
"@midwayjs/cache": "~3.14.0",
|
||||||
"@midwayjs/core": "~3.20.3",
|
"@midwayjs/core": "~3.20.3",
|
||||||
"@midwayjs/i18n": "~3.20.3",
|
"@midwayjs/i18n": "~3.20.3",
|
||||||
|
@ -61,5 +61,5 @@
|
||||||
"typeorm": "^0.3.11",
|
"typeorm": "^0.3.11",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "1bde777beead9dd23b8d3d98479d616170b8bb69"
|
"gitHead": "c2a95a13fe6edf05ea0f72f5f7c76f9eea3ab0bd"
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,14 @@
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||||
|
|
||||||
|
## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||||
|
|
||||||
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/midway-flyway-js
|
**Note:** Version bump only for package @certd/midway-flyway-js
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@certd/midway-flyway-js",
|
"name": "@certd/midway-flyway-js",
|
||||||
"version": "1.36.3",
|
"version": "1.36.5",
|
||||||
"description": "midway with flyway, sql upgrade way ",
|
"description": "midway with flyway, sql upgrade way ",
|
||||||
"private": false,
|
"private": false,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
@ -46,5 +46,5 @@
|
||||||
"typeorm": "^0.3.11",
|
"typeorm": "^0.3.11",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "1bde777beead9dd23b8d3d98479d616170b8bb69"
|
"gitHead": "c2a95a13fe6edf05ea0f72f5f7c76f9eea3ab0bd"
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,18 @@
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-cert
|
||||||
|
|
||||||
|
## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 优化证书进度条颜色 ([2af91db](https://github.com/certd/certd/commit/2af91dbf2ae36a4ed17c6788bc2a2a79a3bb29f8))
|
||||||
|
* 支持部署到阿里云vod ([98da4e1](https://github.com/certd/certd/commit/98da4e1791ed8bb21daf2a9914fda875d14633c9))
|
||||||
|
* output-selector from参数支持更丰富的过滤规则 ([87853a2](https://github.com/certd/certd/commit/87853a201535f3bfe8505c40f8f5229d82ffcc73))
|
||||||
|
|
||||||
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/plugin-cert
|
**Note:** Version bump only for package @certd/plugin-cert
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "@certd/plugin-cert",
|
"name": "@certd/plugin-cert",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.36.3",
|
"version": "1.36.5",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"types": "./dist/index.d.ts",
|
"types": "./dist/index.d.ts",
|
||||||
|
@ -16,10 +16,10 @@
|
||||||
"pub": "npm publish"
|
"pub": "npm publish"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@certd/acme-client": "^1.36.3",
|
"@certd/acme-client": "^1.36.5",
|
||||||
"@certd/basic": "^1.36.3",
|
"@certd/basic": "^1.36.5",
|
||||||
"@certd/pipeline": "^1.36.3",
|
"@certd/pipeline": "^1.36.5",
|
||||||
"@certd/plugin-lib": "^1.36.3",
|
"@certd/plugin-lib": "^1.36.5",
|
||||||
"@google-cloud/publicca": "^1.3.0",
|
"@google-cloud/publicca": "^1.3.0",
|
||||||
"dayjs": "^1.11.7",
|
"dayjs": "^1.11.7",
|
||||||
"jszip": "^3.10.1",
|
"jszip": "^3.10.1",
|
||||||
|
@ -43,5 +43,5 @@
|
||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "1bde777beead9dd23b8d3d98479d616170b8bb69"
|
"gitHead": "c2a95a13fe6edf05ea0f72f5f7c76f9eea3ab0bd"
|
||||||
}
|
}
|
||||||
|
|
|
@ -204,4 +204,11 @@ export class CertReader {
|
||||||
domain = domain.replaceAll(".", "_").replaceAll("*", "_");
|
domain = domain.replaceAll(".", "_").replaceAll("*", "_");
|
||||||
return `${domain}_${dayjs().format("YYYYMMDDHHmmssSSS")}`;
|
return `${domain}_${dayjs().format("YYYYMMDDHHmmssSSS")}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static appendTimeSuffix(name?: string) {
|
||||||
|
if (name == null) {
|
||||||
|
name = "certd";
|
||||||
|
}
|
||||||
|
return name + "_" + dayjs().format("YYYYMMDDHHmmssSSS");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,20 @@
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/plugin-lib
|
||||||
|
|
||||||
|
## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 执行windows nginx命令时,改为return code判断是否执行成功 ([b37cffd](https://github.com/certd/certd/commit/b37cffd704cd08b8bdd68a6e284706eabe59e78d))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 支持部署到阿里云vod ([98da4e1](https://github.com/certd/certd/commit/98da4e1791ed8bb21daf2a9914fda875d14633c9))
|
||||||
|
|
||||||
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
||||||
|
|
||||||
**Note:** Version bump only for package @certd/plugin-lib
|
**Note:** Version bump only for package @certd/plugin-lib
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "@certd/plugin-lib",
|
"name": "@certd/plugin-lib",
|
||||||
"private": false,
|
"private": false,
|
||||||
"version": "1.36.3",
|
"version": "1.36.5",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"types": "./dist/index.d.ts",
|
"types": "./dist/index.d.ts",
|
||||||
|
@ -21,8 +21,8 @@
|
||||||
"@alicloud/pop-core": "^1.7.10",
|
"@alicloud/pop-core": "^1.7.10",
|
||||||
"@alicloud/tea-util": "^1.4.10",
|
"@alicloud/tea-util": "^1.4.10",
|
||||||
"@aws-sdk/client-s3": "^3.787.0",
|
"@aws-sdk/client-s3": "^3.787.0",
|
||||||
"@certd/basic": "^1.36.3",
|
"@certd/basic": "^1.36.5",
|
||||||
"@certd/pipeline": "^1.36.3",
|
"@certd/pipeline": "^1.36.5",
|
||||||
"@kubernetes/client-node": "0.21.0",
|
"@kubernetes/client-node": "0.21.0",
|
||||||
"ali-oss": "^6.22.0",
|
"ali-oss": "^6.22.0",
|
||||||
"basic-ftp": "^5.0.5",
|
"basic-ftp": "^5.0.5",
|
||||||
|
@ -53,5 +53,5 @@
|
||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
},
|
},
|
||||||
"gitHead": "1bde777beead9dd23b8d3d98479d616170b8bb69"
|
"gitHead": "c2a95a13fe6edf05ea0f72f5f7c76f9eea3ab0bd"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import { IsAccess, AccessInput, BaseAccess } from "@certd/pipeline";
|
import { AccessInput, BaseAccess, IsAccess } from "@certd/pipeline";
|
||||||
import { ILogger } from "@certd/basic";
|
import { ILogger } from "@certd/basic";
|
||||||
|
|
||||||
export type AliyunClientV2Req = {
|
export type AliyunClientV2Req = {
|
||||||
action: string;
|
action: string;
|
||||||
version: string;
|
version: string;
|
||||||
|
|
|
@ -33,8 +33,10 @@ export type CasCertInfo = { certId: number; certName: string; certIdentifier: st
|
||||||
|
|
||||||
export class AliyunSslClient {
|
export class AliyunSslClient {
|
||||||
opts: AliyunSslClientOpts;
|
opts: AliyunSslClientOpts;
|
||||||
|
logger: ILogger;
|
||||||
constructor(opts: AliyunSslClientOpts) {
|
constructor(opts: AliyunSslClientOpts) {
|
||||||
this.opts = opts;
|
this.opts = opts;
|
||||||
|
this.logger = opts.logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
checkRet(ret: any) {
|
checkRet(ret: any) {
|
||||||
|
|
|
@ -491,7 +491,7 @@ export class SshClient {
|
||||||
* Set-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\cmd.exe"
|
* Set-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\cmd.exe"
|
||||||
* @param options
|
* @param options
|
||||||
*/
|
*/
|
||||||
async exec(options: { connectConf: SshAccess; script: string | Array<string>; env?: any; throwOnStdErr?: boolean }): Promise<string> {
|
async exec(options: { connectConf: SshAccess; script: string | Array<string>; env?: any; throwOnStdErr?: boolean; stopOnError?: boolean }): Promise<string> {
|
||||||
let { script } = options;
|
let { script } = options;
|
||||||
const { connectConf, throwOnStdErr } = options;
|
const { connectConf, throwOnStdErr } = options;
|
||||||
|
|
||||||
|
@ -506,6 +506,10 @@ export class SshClient {
|
||||||
isWinCmd = await this.isCmd(conn);
|
isWinCmd = await this.isCmd(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isLinux && options.stopOnError !== false) {
|
||||||
|
script = "set -e\n" + script;
|
||||||
|
}
|
||||||
|
|
||||||
if (options.env) {
|
if (options.env) {
|
||||||
for (const key in options.env) {
|
for (const key in options.env) {
|
||||||
if (isLinux) {
|
if (isLinux) {
|
||||||
|
@ -538,6 +542,7 @@ export class SshClient {
|
||||||
script = envScripts.join(newLine) + newLine + script;
|
script = envScripts.join(newLine) + newLine + script;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return await conn.exec(script as string, { throwOnStdErr });
|
return await conn.exec(script as string, { throwOnStdErr });
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -3,6 +3,22 @@
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)
|
||||||
|
|
||||||
|
**Note:** Version bump only for package @certd/ui-client
|
||||||
|
|
||||||
|
## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 修复查看证书对话框翻译错误的bug ([8626b6d](https://github.com/certd/certd/commit/8626b6d9f235c511766f2ae98e0a37f6cebb621c))
|
||||||
|
* 修复translation后分组编辑打不开的bug ([46a1b74](https://github.com/certd/certd/commit/46a1b7479923d2feb2dece202a5932b99981b2cd))
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 优化证书进度条颜色 ([2af91db](https://github.com/certd/certd/commit/2af91dbf2ae36a4ed17c6788bc2a2a79a3bb29f8))
|
||||||
|
* output-selector from参数支持更丰富的过滤规则 ([87853a2](https://github.com/certd/certd/commit/87853a201535f3bfe8505c40f8f5229d82ffcc73))
|
||||||
|
|
||||||
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@certd/ui-client",
|
"name": "@certd/ui-client",
|
||||||
"version": "1.36.3",
|
"version": "1.36.5",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite --open",
|
"dev": "vite --open",
|
||||||
|
@ -103,8 +103,8 @@
|
||||||
"zod-defaults": "^0.1.3"
|
"zod-defaults": "^0.1.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@certd/lib-iframe": "^1.36.3",
|
"@certd/lib-iframe": "^1.36.5",
|
||||||
"@certd/pipeline": "^1.36.3",
|
"@certd/pipeline": "^1.36.5",
|
||||||
"@rollup/plugin-commonjs": "^25.0.7",
|
"@rollup/plugin-commonjs": "^25.0.7",
|
||||||
"@rollup/plugin-node-resolve": "^15.2.3",
|
"@rollup/plugin-node-resolve": "^15.2.3",
|
||||||
"@types/chai": "^4.3.12",
|
"@types/chai": "^4.3.12",
|
||||||
|
|
|
@ -471,7 +471,7 @@ export default {
|
||||||
statusError: "Error",
|
statusError: "Error",
|
||||||
actionImportBatch: "Batch Import",
|
actionImportBatch: "Batch Import",
|
||||||
actionSyncIp: "Sync IP",
|
actionSyncIp: "Sync IP",
|
||||||
modalTitleSyncIp: "Sync IP",
|
TitleSyncIp: "Sync IP",
|
||||||
modalContentSyncIp: "Are you sure to sync IP?",
|
modalContentSyncIp: "Are you sure to sync IP?",
|
||||||
notificationSyncComplete: "Sync Complete",
|
notificationSyncComplete: "Sync Complete",
|
||||||
actionCheckAll: "Check All",
|
actionCheckAll: "Check All",
|
||||||
|
@ -708,6 +708,10 @@ export default {
|
||||||
showRunStrategyHelper: "Allow modify the run strategy of the task",
|
showRunStrategyHelper: "Allow modify the run strategy of the task",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
modal: {
|
||||||
|
close: "Close",
|
||||||
|
viewCertificateTitle: "View Certificate",
|
||||||
|
},
|
||||||
domain: {
|
domain: {
|
||||||
domainManager: "Domain Manager",
|
domainManager: "Domain Manager",
|
||||||
domain: "Domain",
|
domain: "Domain",
|
||||||
|
|
|
@ -711,6 +711,10 @@ export default {
|
||||||
showRunStrategyHelper: "任务设置中是否允许选择运行策略",
|
showRunStrategyHelper: "任务设置中是否允许选择运行策略",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
modal: {
|
||||||
|
close: "关闭",
|
||||||
|
viewCertificateTitle: "查看证书",
|
||||||
|
},
|
||||||
domain: {
|
domain: {
|
||||||
domainManager: "域名管理",
|
domainManager: "域名管理",
|
||||||
domain: "域名",
|
domain: "域名",
|
||||||
|
|
|
@ -3,6 +3,22 @@
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.36.5](https://github.com/certd/certd/compare/v1.36.4...v1.36.5) (2025-07-11)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 某些插件找不到的bug ([4b3f4a8](https://github.com/certd/certd/commit/4b3f4a868a8b0800c5c59de9d0f47bddc079e7b3))
|
||||||
|
|
||||||
|
## [1.36.4](https://github.com/certd/certd/compare/v1.36.3...v1.36.4) (2025-07-10)
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* 站点证书即将过期通知标题颜色优化为红色 ([80c5331](https://github.com/certd/certd/commit/80c5331a5d4c320323d9b9b800e4ea3b72577b33))
|
||||||
|
* 支持部署到阿里云vod ([98da4e1](https://github.com/certd/certd/commit/98da4e1791ed8bb21daf2a9914fda875d14633c9))
|
||||||
|
* 支持部署证书到网宿CDN ([c3da026](https://github.com/certd/certd/commit/c3da026b33106f5195959825a68cadbe49efef00))
|
||||||
|
* 重置管理员密码同时可以清除管理员的2FA设置 ([1ece091](https://github.com/certd/certd/commit/1ece0915f172d5f8b8adb866434e7efcc5c8c46d))
|
||||||
|
* output-selector from参数支持更丰富的过滤规则 ([87853a2](https://github.com/certd/certd/commit/87853a201535f3bfe8505c40f8f5229d82ffcc73))
|
||||||
|
|
||||||
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
## [1.36.3](https://github.com/certd/certd/compare/v1.36.2...v1.36.3) (2025-07-07)
|
||||||
|
|
||||||
### Performance Improvements
|
### Performance Improvements
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@certd/ui-server",
|
"name": "@certd/ui-server",
|
||||||
"version": "1.36.3",
|
"version": "1.36.5",
|
||||||
"description": "fast-server base midway",
|
"description": "fast-server base midway",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
@ -42,20 +42,20 @@
|
||||||
"@aws-sdk/client-cloudfront": "^3.699.0",
|
"@aws-sdk/client-cloudfront": "^3.699.0",
|
||||||
"@aws-sdk/client-iam": "^3.699.0",
|
"@aws-sdk/client-iam": "^3.699.0",
|
||||||
"@aws-sdk/client-s3": "^3.705.0",
|
"@aws-sdk/client-s3": "^3.705.0",
|
||||||
"@certd/acme-client": "^1.36.3",
|
"@certd/acme-client": "^1.36.5",
|
||||||
"@certd/basic": "^1.36.3",
|
"@certd/basic": "^1.36.5",
|
||||||
"@certd/commercial-core": "^1.36.3",
|
"@certd/commercial-core": "^1.36.5",
|
||||||
"@certd/cv4pve-api-javascript": "^8.4.1",
|
"@certd/cv4pve-api-javascript": "^8.4.1",
|
||||||
"@certd/jdcloud": "^1.36.3",
|
"@certd/jdcloud": "^1.36.5",
|
||||||
"@certd/lib-huawei": "^1.36.3",
|
"@certd/lib-huawei": "^1.36.5",
|
||||||
"@certd/lib-k8s": "^1.36.3",
|
"@certd/lib-k8s": "^1.36.5",
|
||||||
"@certd/lib-server": "^1.36.3",
|
"@certd/lib-server": "^1.36.5",
|
||||||
"@certd/midway-flyway-js": "^1.36.3",
|
"@certd/midway-flyway-js": "^1.36.5",
|
||||||
"@certd/pipeline": "^1.36.3",
|
"@certd/pipeline": "^1.36.5",
|
||||||
"@certd/plugin-cert": "^1.36.3",
|
"@certd/plugin-cert": "^1.36.5",
|
||||||
"@certd/plugin-lib": "^1.36.3",
|
"@certd/plugin-lib": "^1.36.5",
|
||||||
"@certd/plugin-plus": "^1.36.3",
|
"@certd/plugin-plus": "^1.36.5",
|
||||||
"@certd/plus-core": "^1.36.3",
|
"@certd/plus-core": "^1.36.5",
|
||||||
"@huaweicloud/huaweicloud-sdk-cdn": "^3.1.120",
|
"@huaweicloud/huaweicloud-sdk-cdn": "^3.1.120",
|
||||||
"@huaweicloud/huaweicloud-sdk-core": "^3.1.120",
|
"@huaweicloud/huaweicloud-sdk-core": "^3.1.120",
|
||||||
"@koa/cors": "^5.0.0",
|
"@koa/cors": "^5.0.0",
|
||||||
|
|
|
@ -26,11 +26,11 @@ process.on('uncaughtException', error => {
|
||||||
});
|
});
|
||||||
|
|
||||||
@Configuration({
|
@Configuration({
|
||||||
// detectorOptions: {
|
detectorOptions: {
|
||||||
// ignore: [
|
ignore: [
|
||||||
// '**/plugins/**'
|
'**/plugins/**'
|
||||||
// ]
|
]
|
||||||
// },
|
},
|
||||||
imports: [
|
imports: [
|
||||||
koa,
|
koa,
|
||||||
orm,
|
orm,
|
||||||
|
|
|
@ -291,7 +291,8 @@ export class SiteInfoService extends BaseService<SiteInfoEntity> {
|
||||||
body: {
|
body: {
|
||||||
title: `站点证书即将过期,剩余${validDays}天,<${site.name}>`,
|
title: `站点证书即将过期,剩余${validDays}天,<${site.name}>`,
|
||||||
content,
|
content,
|
||||||
url
|
url,
|
||||||
|
errorMessage: "站点证书即将过期"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
site.userId
|
site.userId
|
||||||
|
|
|
@ -25,3 +25,8 @@ export * from './plugin-flex/index.js'
|
||||||
export * from './plugin-farcdn/index.js'
|
export * from './plugin-farcdn/index.js'
|
||||||
export * from './plugin-fnos/index.js'
|
export * from './plugin-fnos/index.js'
|
||||||
export * from './plugin-rainyun/index.js'
|
export * from './plugin-rainyun/index.js'
|
||||||
|
export * from './plugin-cloudflare/index.js'
|
||||||
|
export * from './plugin-github/index.js'
|
||||||
|
export * from './plugin-namesilo/index.js'
|
||||||
|
export * from './plugin-proxmox/index.js'
|
||||||
|
export * from './plugin-wangsu/index.js'
|
||||||
|
|
|
@ -0,0 +1,185 @@
|
||||||
|
import { AbstractTaskPlugin, IsTaskPlugin, PageSearch, pluginGroups, RunStrategy, TaskInput } from "@certd/pipeline";
|
||||||
|
import { CertApplyPluginNames, CertInfo } from "@certd/plugin-cert";
|
||||||
|
import { AliyunAccess, createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from "@certd/plugin-lib";
|
||||||
|
|
||||||
|
@IsTaskPlugin({
|
||||||
|
name: "AliyunDeployCertToVod",
|
||||||
|
title: "阿里云-部署至VOD",
|
||||||
|
icon: "svg:icon-aliyun",
|
||||||
|
group: pluginGroups.aliyun.key,
|
||||||
|
desc: "部署证书到阿里云视频点播(vod)",
|
||||||
|
needPlus: false,
|
||||||
|
default: {
|
||||||
|
strategy: {
|
||||||
|
runStrategy: RunStrategy.SkipWhenSucceed
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
export class AliyunDeployCertToVod extends AbstractTaskPlugin {
|
||||||
|
@TaskInput({
|
||||||
|
title: "域名证书",
|
||||||
|
helper: "请选择证书申请任务输出的域名证书",
|
||||||
|
component: {
|
||||||
|
name: "output-selector",
|
||||||
|
from: [...CertApplyPluginNames]
|
||||||
|
},
|
||||||
|
required: true
|
||||||
|
})
|
||||||
|
cert!: CertInfo;
|
||||||
|
|
||||||
|
@TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))
|
||||||
|
certDomains!: string[];
|
||||||
|
|
||||||
|
// @TaskInput({
|
||||||
|
// title: "大区",
|
||||||
|
// value: "cn-hangzhou",
|
||||||
|
// component: {
|
||||||
|
// name: "a-auto-complete",
|
||||||
|
// vModel: "value",
|
||||||
|
// options: [
|
||||||
|
// { value: "cn-hangzhou", label: "华东1(杭州)" },
|
||||||
|
// { value: "ap-southeast-1", label: "新加坡" }
|
||||||
|
// ]
|
||||||
|
// },
|
||||||
|
// required: true
|
||||||
|
// })
|
||||||
|
// regionId!: string;
|
||||||
|
|
||||||
|
@TaskInput({
|
||||||
|
title: "证书接入点",
|
||||||
|
helper: "不会选就保持默认即可",
|
||||||
|
value: "cas.aliyuncs.com",
|
||||||
|
component: {
|
||||||
|
name: "a-select",
|
||||||
|
options: [
|
||||||
|
{ value: "cas.aliyuncs.com", label: "中国大陆" },
|
||||||
|
{ value: "cas.ap-southeast-1.aliyuncs.com", label: "新加坡" },
|
||||||
|
{ value: "cas.eu-central-1.aliyuncs.com", label: "德国(法兰克福)" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
required: true
|
||||||
|
})
|
||||||
|
casEndpoint!: string;
|
||||||
|
|
||||||
|
|
||||||
|
@TaskInput({
|
||||||
|
title: "Access授权",
|
||||||
|
helper: "阿里云授权AccessKeyId、AccessKeySecret",
|
||||||
|
component: {
|
||||||
|
name: "access-selector",
|
||||||
|
type: "aliyun"
|
||||||
|
},
|
||||||
|
required: true
|
||||||
|
})
|
||||||
|
accessId!: string;
|
||||||
|
|
||||||
|
@TaskInput(
|
||||||
|
createRemoteSelectInputDefine({
|
||||||
|
title: "加速域名",
|
||||||
|
helper: "请选择要部署证书的域名",
|
||||||
|
action: AliyunDeployCertToVod.prototype.onGetDomainList.name,
|
||||||
|
watches: ["accessId"],
|
||||||
|
pager: true,
|
||||||
|
search: true
|
||||||
|
})
|
||||||
|
)
|
||||||
|
domainList!: string[];
|
||||||
|
|
||||||
|
|
||||||
|
async onInstance() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async execute(): Promise<void> {
|
||||||
|
this.logger.info("开始部署证书到阿里云VOD");
|
||||||
|
const access = await this.getAccess<AliyunAccess>(this.accessId);
|
||||||
|
|
||||||
|
const client = await this.getClient(access);
|
||||||
|
|
||||||
|
|
||||||
|
for (const siteId of this.domainList) {
|
||||||
|
/**
|
||||||
|
* let queries : {[key: string ]: any} = { };
|
||||||
|
* queries["DomainName"] = "324234234";
|
||||||
|
* queries["CertName"] = "ccccccc";
|
||||||
|
* queries["SSLProtocol"] = "on";
|
||||||
|
* queries["SSLPub"] = "cert";
|
||||||
|
* queries["SSLPri"] = "key";
|
||||||
|
* // runtime options
|
||||||
|
* let runtime = new $Util.RuntimeOptions({ });
|
||||||
|
* let request = new $OpenApi.OpenApiRequest({
|
||||||
|
* query: OpenApiUtil.query(queries),
|
||||||
|
* });
|
||||||
|
*/
|
||||||
|
const res = await client.doRequest({
|
||||||
|
action: "SetVodDomainCertificate",
|
||||||
|
version: "2017-03-21",
|
||||||
|
protocol: "HTTPS",
|
||||||
|
data: {
|
||||||
|
query: {
|
||||||
|
DomainName: siteId,
|
||||||
|
CertName: this.appendTimeSuffix("certd"),
|
||||||
|
SSLProtocol: "on",
|
||||||
|
SSLPub: this.cert.crt,
|
||||||
|
SSLPri: this.cert.key
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.logger.info(`部署站点[${siteId}]证书成功:${JSON.stringify(res)}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async getClient(access: AliyunAccess) {
|
||||||
|
const endpoint = `vod.cn-shanghai.aliyuncs.com`;
|
||||||
|
return access.getClient(endpoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
async onGetDomainList(data: PageSearch) {
|
||||||
|
if (!this.accessId) {
|
||||||
|
throw new Error("请选择Access授权");
|
||||||
|
}
|
||||||
|
const access = await this.getAccess<AliyunAccess>(this.accessId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* let queries : {[key: string ]: any} = { };
|
||||||
|
* queries["PageSize"] = 50;
|
||||||
|
* queries["PageNumber"] = 1;
|
||||||
|
* queries["DomainName"] = "5555";
|
||||||
|
* // runtime options
|
||||||
|
* let runtime = new $Util.RuntimeOptions({ });
|
||||||
|
* let request = new $OpenApi.OpenApiRequest({
|
||||||
|
* query: OpenApiUtil.query(queries),
|
||||||
|
* });
|
||||||
|
*/
|
||||||
|
const client = await this.getClient(access);
|
||||||
|
const res = await client.doRequest({
|
||||||
|
action: "DescribeVodUserDomains",
|
||||||
|
version: "2017-03-21",
|
||||||
|
protocol: "HTTPS",
|
||||||
|
data: {
|
||||||
|
query: {
|
||||||
|
DomainName: data.searchKey,
|
||||||
|
PageNumber: data.pageNo,
|
||||||
|
PageSize: data.pageSize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const list = res?.Domains.PageData;
|
||||||
|
if (!list || list.length === 0) {
|
||||||
|
throw new Error("没有找到加速域名,请先在阿里云添加点播加速域名");
|
||||||
|
}
|
||||||
|
|
||||||
|
const options = list.map((item: any) => {
|
||||||
|
return {
|
||||||
|
label: item.DomainName,
|
||||||
|
value: item.DomainName,
|
||||||
|
domain: item.DomainName
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return this.ctx.utils.options.buildGroupOptions(options, this.certDomains);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
new AliyunDeployCertToVod();
|
|
@ -7,3 +7,5 @@ export * from './deploy-to-alb/index.js';
|
||||||
export * from './deploy-to-nlb/index.js';
|
export * from './deploy-to-nlb/index.js';
|
||||||
export * from './deploy-to-slb/index.js';
|
export * from './deploy-to-slb/index.js';
|
||||||
export * from './deploy-to-fc/index.js';
|
export * from './deploy-to-fc/index.js';
|
||||||
|
export * from './deploy-to-esa/index.js';
|
||||||
|
export * from './deploy-to-vod/index.js';
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
import dayjs from 'dayjs';
|
import dayjs from "dayjs";
|
||||||
|
import { AliyunSslClient } from "@certd/plugin-lib";
|
||||||
|
import { CertInfo, CertReader } from "@certd/plugin-cert";
|
||||||
|
|
||||||
export const ZoneOptions = [{ value: 'cn-hangzhou' }];
|
export const ZoneOptions = [{ value: 'cn-hangzhou' }];
|
||||||
export function appendTimeSuffix(name: string) {
|
export function appendTimeSuffix(name: string) {
|
||||||
|
@ -13,3 +15,27 @@ export function checkRet(ret: any) {
|
||||||
throw new Error('执行失败:' + ret.Message);
|
throw new Error('执行失败:' + ret.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export async function getAliyunCertId(opts:{
|
||||||
|
cert: string | CertInfo,
|
||||||
|
sslClient: AliyunSslClient,
|
||||||
|
}) {
|
||||||
|
const { cert, sslClient } = opts;
|
||||||
|
let certId: any = cert;
|
||||||
|
let certName: any = CertReader.appendTimeSuffix("certd");
|
||||||
|
if (typeof cert === "object") {
|
||||||
|
const certReader = new CertReader(cert)
|
||||||
|
certName = certReader.buildCertName()
|
||||||
|
|
||||||
|
certId = await sslClient.uploadCert({
|
||||||
|
name: certName,
|
||||||
|
cert: cert,
|
||||||
|
});
|
||||||
|
sslClient.logger.info("上传证书成功", certId, certName);
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
certId,
|
||||||
|
certName,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
export * from './plugin-deploy-to-cloudfront.js';
|
export * from './plugin-deploy-to-cloudfront.js';
|
||||||
|
export * from './plugin-upload-to-acm.js'
|
||||||
|
|
|
@ -47,7 +47,7 @@ export class GithubCheckRelease extends AbstractTaskPlugin {
|
||||||
mode:"tags"
|
mode:"tags"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
required:true,
|
required:false,
|
||||||
})
|
})
|
||||||
notificationIds!: number[];
|
notificationIds!: number[];
|
||||||
|
|
||||||
|
@ -74,9 +74,21 @@ export class GithubCheckRelease extends AbstractTaskPlugin {
|
||||||
name: 'a-textarea',
|
name: 'a-textarea',
|
||||||
vModel: 'value',
|
vModel: 'value',
|
||||||
rows: 6,
|
rows: 6,
|
||||||
placeholder: `#拉取最新版镜像\ndocker pull greper/certd:latest \n#重建容器 \nnohup sh -c 'sleep 10; cd ~/deploy/certd/ ; docker compose down; docker compose up -d' >/dev/null & `,
|
placeholder: `
|
||||||
|
# 拉取最新镜像
|
||||||
|
docker pull registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest
|
||||||
|
# 升级容器命令, 替换成你自己的实际部署位置及更新命令
|
||||||
|
export RESTART_CERT='sleep 10; cd ~/deploy/certd/ ; docker compose down; docker compose up -d'
|
||||||
|
# 构造一个脚本10s后在后台执行,避免容器销毁时执行太快,导致流水线任务无法结束
|
||||||
|
nohup sh -c '$RESTART_CERT' >/dev/null 2>&1 & echo '10秒后重启' && exit`,
|
||||||
},
|
},
|
||||||
helper: '有新版本后执行命令,比如:拉取最新版镜像,然后重建容器\n注意:自己升级自己需要使用nobup配合sleep',
|
helper: `有新版本后执行命令,比如:拉取最新版镜像,然后重建容器
|
||||||
|
注意:自己升级自己需要使用nohup配合sleep
|
||||||
|
自动升级命令示例:
|
||||||
|
docker pull registry.cn-shenzhen.aliyuncs.com/handsfree/certd:latest
|
||||||
|
export RESTART_CERT='sleep 10; cd ~/deploy/certd/ ; docker compose down; docker compose up -d'
|
||||||
|
nohup sh -c '$RESTART_CERT' >/dev/null 2>&1 & echo '10秒后重启' && exit
|
||||||
|
`,
|
||||||
required: false,
|
required: false,
|
||||||
})
|
})
|
||||||
script!: string;
|
script!: string;
|
||||||
|
@ -108,9 +120,7 @@ export class GithubCheckRelease extends AbstractTaskPlugin {
|
||||||
//仅每行开头的* 替换成 -, *号前面可以有空格
|
//仅每行开头的* 替换成 -, *号前面可以有空格
|
||||||
const body = res.body.replace(/^(\s*)\* /gm, "$1- ")
|
const body = res.body.replace(/^(\s*)\* /gm, "$1- ")
|
||||||
|
|
||||||
if (this.notificationIds == null){
|
if (this.notificationIds && this.notificationIds.length > 0){
|
||||||
this.notificationIds = [0]
|
|
||||||
}
|
|
||||||
//发送通知
|
//发送通知
|
||||||
for (const notificationId of this.notificationIds) {
|
for (const notificationId of this.notificationIds) {
|
||||||
await this.ctx.notificationService.send({
|
await this.ctx.notificationService.send({
|
||||||
|
@ -125,6 +135,8 @@ export class GithubCheckRelease extends AbstractTaskPlugin {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (this.script != null && this.script.trim() != "") {
|
if (this.script != null && this.script.trim() != "") {
|
||||||
const connectConf = await this.getAccess(this.sshAccessId);
|
const connectConf = await this.getAccess(this.sshAccessId);
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
export * from './host-shell-execute/index.js';
|
export * from './host-shell-execute/index.js';
|
||||||
export * from './upload-to-host/index.js';
|
export * from './upload-to-host/index.js';
|
||||||
|
export * from './copy-to-local/index.js'
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
export * from './access/index.js';
|
export * from './access/index.js';
|
||||||
export * from './dns-provider/index.js';
|
export * from './dns-provider/index.js';
|
||||||
export * from './plugins/deploy-to-cdn/index.js';
|
export * from './plugins/index.js';
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
export * from './deploy-to-cdn/index.js'
|
||||||
|
export * from './upload-to-ccm/index.js'
|
|
@ -7,7 +7,7 @@ import { BaseNotification, IsNotification, NotificationBody, NotificationInput }
|
||||||
needPlus: true,
|
needPlus: true,
|
||||||
})
|
})
|
||||||
// https://open.dingtalk.com/document/orgapp/the-creation-and-installation-of-the-application-robot-in-the?spm=ding_open_doc.document.0.0.242d1563cDgZz3
|
// https://open.dingtalk.com/document/orgapp/the-creation-and-installation-of-the-application-robot-in-the?spm=ding_open_doc.document.0.0.242d1563cDgZz3
|
||||||
export class DingTalkNotification extends BaseNotification {
|
export class FeishuNotification extends BaseNotification {
|
||||||
@NotificationInput({
|
@NotificationInput({
|
||||||
title: 'webhook地址',
|
title: 'webhook地址',
|
||||||
component: {
|
component: {
|
||||||
|
|
|
@ -10,3 +10,5 @@ export * from './discord/index.js';
|
||||||
export * from './slack/index.js';
|
export * from './slack/index.js';
|
||||||
export * from './bark/index.js';
|
export * from './bark/index.js';
|
||||||
export * from './feishu/index.js';
|
export * from './feishu/index.js';
|
||||||
|
export * from './dingtalk/index.js';
|
||||||
|
export * from './vocechat/index.js';
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
export * from './deploy-to-cdn/index.js';
|
export * from './deploy-to-cdn/index.js';
|
||||||
|
export * from './upload-cert/index.js';
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
export * from "./plugins/index.js";
|
export * from "./plugins/index.js";
|
||||||
export * from "./access.js";
|
export * from "./access.js";
|
||||||
|
export * from "./dns-provider.js";
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
export * from './plugin-refresh-cert.js'
|
|
@ -7,3 +7,5 @@ export * from './deploy-to-cos/index.js';
|
||||||
export * from './deploy-to-eo/index.js';
|
export * from './deploy-to-eo/index.js';
|
||||||
export * from './delete-expiring-cert/index.js';
|
export * from './delete-expiring-cert/index.js';
|
||||||
export * from './deploy-to-tke-ingress/index.js';
|
export * from './deploy-to-tke-ingress/index.js';
|
||||||
|
export * from './deploy-to-live/index.js';
|
||||||
|
export * from './start-instances/index.js';
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { VolcengineOpts } from "./dns-client.js";
|
import { VolcengineOpts } from "./ve-client.js";
|
||||||
import { CertInfo } from "@certd/plugin-cert";
|
import { CertInfo } from "@certd/plugin-cert";
|
||||||
|
|
||||||
export class VolcengineCdnClient {
|
export class VolcengineCdnClient {
|
||||||
|
|
|
@ -1,12 +1,7 @@
|
||||||
import { VolcengineAccess } from "./access.js";
|
import {http} from "@certd/basic";
|
||||||
import { http, HttpClient, ILogger } from "@certd/basic";
|
|
||||||
import querystring from "querystring";
|
import querystring from "querystring";
|
||||||
|
import {VolcengineOpts} from "./ve-client.js";
|
||||||
|
|
||||||
export type VolcengineOpts = {
|
|
||||||
access: VolcengineAccess
|
|
||||||
logger: ILogger
|
|
||||||
http: HttpClient
|
|
||||||
}
|
|
||||||
|
|
||||||
export type VolcengineReq = {
|
export type VolcengineReq = {
|
||||||
method?: string;
|
method?: string;
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
export * from './plugins/index.js';
|
export * from './plugins/index.js';
|
||||||
export * from './access.js';
|
export * from './access.js';
|
||||||
export * from './volcengine-dns-provider.js';
|
export * from './volcengine-dns-provider.js';
|
||||||
|
export * from './ve-client.js';
|
||||||
|
export * from './dns-client.js';
|
||||||
|
export * from './cdn-client.js';
|
||||||
|
|
|
@ -3,3 +3,5 @@ export * from './plugin-deploy-to-clb.js'
|
||||||
export * from './plugin-upload-to-cert-center.js'
|
export * from './plugin-upload-to-cert-center.js'
|
||||||
export * from './plugin-deploy-to-alb.js'
|
export * from './plugin-deploy-to-alb.js'
|
||||||
export * from './plugin-deploy-to-live.js'
|
export * from './plugin-deploy-to-live.js'
|
||||||
|
export * from './plugin-deploy-to-dcdn.js'
|
||||||
|
export * from './plugin-deploy-to-vod.js'
|
||||||
|
|
|
@ -0,0 +1,161 @@
|
||||||
|
import { AccessInput, BaseAccess, IsAccess } from "@certd/pipeline";
|
||||||
|
import { HttpRequestConfig } from "@certd/basic";
|
||||||
|
import { CertInfo } from "@certd/plugin-cert";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
@IsAccess({
|
||||||
|
name: "wangsu",
|
||||||
|
title: "网宿授权",
|
||||||
|
desc: "",
|
||||||
|
icon: "svg:icon-lucky"
|
||||||
|
})
|
||||||
|
export class WangsuAccess extends BaseAccess {
|
||||||
|
|
||||||
|
@AccessInput({
|
||||||
|
title: "accessKeyId",
|
||||||
|
component: {
|
||||||
|
placeholder: "accessKeyId",
|
||||||
|
component: {
|
||||||
|
name: "a-input",
|
||||||
|
vModel: "value"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
helper: "[点击前往获取AccessKey](https://console.wangsu.com/account/accessKey?rsr=ws)",
|
||||||
|
encrypt: false,
|
||||||
|
required: true
|
||||||
|
})
|
||||||
|
accessKeyId!: string;
|
||||||
|
|
||||||
|
@AccessInput({
|
||||||
|
title: "accessKeySecret",
|
||||||
|
component: {
|
||||||
|
placeholder: "accessKeySecret",
|
||||||
|
component: {
|
||||||
|
name: "a-input",
|
||||||
|
vModel: "value"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
encrypt: true,
|
||||||
|
required: true
|
||||||
|
})
|
||||||
|
accessKeySecret!: string;
|
||||||
|
|
||||||
|
|
||||||
|
@AccessInput({
|
||||||
|
title: "测试",
|
||||||
|
component: {
|
||||||
|
name: "api-test",
|
||||||
|
action: "TestRequest"
|
||||||
|
},
|
||||||
|
helper: "点击测试接口是否正常"
|
||||||
|
})
|
||||||
|
testRequest = true;
|
||||||
|
|
||||||
|
async onTestRequest() {
|
||||||
|
await this.getCertList({ });
|
||||||
|
return "ok";
|
||||||
|
}
|
||||||
|
|
||||||
|
async getCertList(req: { }) {
|
||||||
|
/**
|
||||||
|
* certificate-id
|
||||||
|
* name
|
||||||
|
* dns-names
|
||||||
|
*/
|
||||||
|
const res = await this.doRequest({
|
||||||
|
url: "/api/ssl/certificate",
|
||||||
|
method: "GET",
|
||||||
|
});
|
||||||
|
|
||||||
|
return res["ssl-certificate"]
|
||||||
|
}
|
||||||
|
|
||||||
|
async getCertInfo(req:{certId:string}){
|
||||||
|
return await this.doRequest({
|
||||||
|
url: `/api/certificate/${req.certId}`,
|
||||||
|
method:"GET",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async updateCert(req: {
|
||||||
|
certId: string,
|
||||||
|
cert: CertInfo,
|
||||||
|
}) {
|
||||||
|
|
||||||
|
const certInfo= await this.getCertInfo({certId:req.certId});
|
||||||
|
|
||||||
|
const name = certInfo.name;
|
||||||
|
const {cert,certId} = req;
|
||||||
|
return await this.doRequest({
|
||||||
|
url: `/api/certificate/${certId}`,
|
||||||
|
method:"PUT",
|
||||||
|
data: {
|
||||||
|
/**
|
||||||
|
* name: string;
|
||||||
|
* certificate?: string;
|
||||||
|
* privateKey?: string;
|
||||||
|
* autoRenew?: string;
|
||||||
|
* isNeedAlarm?: string;
|
||||||
|
* csrId?: number;
|
||||||
|
* comment?: string;
|
||||||
|
*/
|
||||||
|
name:name,
|
||||||
|
certificate: cert.crt,
|
||||||
|
privateKey: cert.key,
|
||||||
|
autoRenew:"false",
|
||||||
|
isNeedAlarm:"false",
|
||||||
|
comment: "certd"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
async doRequest(req: HttpRequestConfig) {
|
||||||
|
|
||||||
|
const data: any = req.data;
|
||||||
|
|
||||||
|
const {AkSkConfig,AkSkAuth} = await import("./lib/index.js");
|
||||||
|
|
||||||
|
const akskConfig = new AkSkConfig();
|
||||||
|
akskConfig.accessKey = this.accessKeyId;
|
||||||
|
akskConfig.secretKey = this.accessKeySecret;
|
||||||
|
akskConfig.endPoint = "open.chinanetcenter.com";
|
||||||
|
akskConfig.uri = req.url;
|
||||||
|
akskConfig.method = req.method;
|
||||||
|
|
||||||
|
const requestMsg = AkSkAuth.transferHttpRequestMsg(akskConfig,data?JSON.stringify(data):"");
|
||||||
|
AkSkAuth.getAuthAndSetHeaders(requestMsg, akskConfig.accessKey, akskConfig.secretKey);
|
||||||
|
|
||||||
|
let response = undefined
|
||||||
|
try{
|
||||||
|
response = await this.ctx.http.request({
|
||||||
|
method: requestMsg.method,
|
||||||
|
url: requestMsg.url,
|
||||||
|
headers: requestMsg.headers,
|
||||||
|
data: requestMsg.body
|
||||||
|
});
|
||||||
|
}catch (e) {
|
||||||
|
if (e.response?.data?.result) {
|
||||||
|
throw new Error(e.response?.data?.result);
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (response.code != null && response.code != 0){
|
||||||
|
throw new Error(response.message);
|
||||||
|
}
|
||||||
|
if (response.data != null && response.code!==null){
|
||||||
|
return response.data;
|
||||||
|
}
|
||||||
|
return response;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
new WangsuAccess();
|
|
@ -0,0 +1,2 @@
|
||||||
|
export * from "./plugins/index.js";
|
||||||
|
export * from "./access.js";
|
|
@ -0,0 +1,87 @@
|
||||||
|
import { HttpRequestMsg } from "../model/HttpRequestMsg.js";
|
||||||
|
import { AkSkConfig } from "../model/AkSkConfig.js";
|
||||||
|
import { CryptoUtils } from "../util/CryptoUtils.js";
|
||||||
|
import { HttpUtils } from "../util/HttpUtils.js";
|
||||||
|
import { Constant } from "../common/Constant.js";
|
||||||
|
|
||||||
|
export class AkSkAuth {
|
||||||
|
|
||||||
|
public static invoke(akSkConfig: AkSkConfig, jsonBody: string): Promise<string | null> {
|
||||||
|
const requestMsg = AkSkAuth.transferHttpRequestMsg(akSkConfig, jsonBody);
|
||||||
|
AkSkAuth.getAuthAndSetHeaders(requestMsg, akSkConfig.accessKey, akSkConfig.secretKey);
|
||||||
|
return HttpUtils.call(requestMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static transferHttpRequestMsg(akSkConfig: AkSkConfig, jsonBody: string): HttpRequestMsg {
|
||||||
|
const requestMsg = new HttpRequestMsg();
|
||||||
|
requestMsg.uri = akSkConfig.uri;
|
||||||
|
if (akSkConfig.endPoint && akSkConfig.endPoint !== Constant.END_POINT) {
|
||||||
|
requestMsg.host = akSkConfig.endPoint;
|
||||||
|
requestMsg.url = `${Constant.HTTPS_REQUEST_PREFIX}${akSkConfig.endPoint}${requestMsg.uri}`;
|
||||||
|
} else {
|
||||||
|
requestMsg.host = Constant.HTTP_DOMAIN;
|
||||||
|
requestMsg.url = `${Constant.HTTP_REQUEST_PREFIX}${requestMsg.uri}`;
|
||||||
|
}
|
||||||
|
requestMsg.method = akSkConfig.method;
|
||||||
|
requestMsg.signedHeaders = AkSkAuth.getSignedHeaders(akSkConfig.signedHeaders);
|
||||||
|
if (['POST', 'PUT', 'PATCH', 'DELETE'].indexOf(akSkConfig.method) !== -1) {
|
||||||
|
requestMsg.body = jsonBody;
|
||||||
|
}
|
||||||
|
return requestMsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
static getAuthAndSetHeaders(requestMsg: HttpRequestMsg, accessKey: string, secretKey: string): void {
|
||||||
|
const timeStamp = (Date.now() / 1000 | 0).toString();
|
||||||
|
requestMsg.headers['Host'] = requestMsg.host;
|
||||||
|
requestMsg.headers[Constant.HEAD_SIGN_ACCESS_KEY] = accessKey;
|
||||||
|
requestMsg.headers[Constant.HEAD_SIGN_TIMESTAMP] = timeStamp;
|
||||||
|
requestMsg.headers["Accept"] = Constant.APPLICATION_JSON;
|
||||||
|
const signature = AkSkAuth.getSignature(requestMsg, secretKey, timeStamp);
|
||||||
|
requestMsg.headers['Authorization'] = AkSkAuth.genAuthorization(accessKey, AkSkAuth.getSignedHeaders(requestMsg.signedHeaders), signature);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static genAuthorization(accessKey: string, signedHeaders: string, signature: string): string {
|
||||||
|
return `${Constant.HEAD_SIGN_ALGORITHM} Credential=${accessKey}, SignedHeaders=${signedHeaders}, Signature=${signature}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static getSignature(requestMsg: HttpRequestMsg, secretKey: string, timestamp: string): string {
|
||||||
|
let bodyStr = requestMsg.body || "";
|
||||||
|
const hashedRequestPayload = CryptoUtils.sha256Hex(bodyStr);
|
||||||
|
const canonicalRequest = `${requestMsg.method}\n${requestMsg.uri.split("?")[0]}\n${decodeURIComponent(requestMsg.getQueryString())}\n${AkSkAuth.getCanonicalHeaders(requestMsg.headers, AkSkAuth.getSignedHeaders(requestMsg.signedHeaders))}\n${AkSkAuth.getSignedHeaders(requestMsg.signedHeaders)}\n${hashedRequestPayload}`;
|
||||||
|
const stringToSign = `${Constant.HEAD_SIGN_ALGORITHM}\n${timestamp}\n${CryptoUtils.sha256Hex(canonicalRequest)}`;
|
||||||
|
return CryptoUtils.hmac256(secretKey, stringToSign).toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static getCanonicalHeaders(headers: Record<string, string>, signedHeaders: string): string {
|
||||||
|
const headerNames = signedHeaders.split(";");
|
||||||
|
let canonicalHeaders = "";
|
||||||
|
for (const headerName of headerNames) {
|
||||||
|
const headerValue = AkSkAuth.getValueByHeader(headerName, headers);
|
||||||
|
if (headerValue !== null) {
|
||||||
|
canonicalHeaders += `${headerName}:${headerValue.toLowerCase()}\n`;
|
||||||
|
} else {
|
||||||
|
// Handle missing headers if necessary, e.g., log a warning or skip
|
||||||
|
console.warn(`Header ${headerName} not found in provided headers.`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return canonicalHeaders;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static getSignedHeaders(signedHeaders: string): string {
|
||||||
|
if (!signedHeaders) {
|
||||||
|
return "content-type;host";
|
||||||
|
}
|
||||||
|
const headers = signedHeaders.split(";");
|
||||||
|
return headers.map(header => header.toLowerCase()).sort().join(";");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static getValueByHeader(name: string, customHeaderMap: { [key: string]: string }): string | null {
|
||||||
|
for (const key in customHeaderMap) {
|
||||||
|
if (key.toLowerCase() === name.toLowerCase()) {
|
||||||
|
return customHeaderMap[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
export class Constant {
|
||||||
|
private constructor() {}
|
||||||
|
|
||||||
|
public static readonly HTTP_REQUEST_PREFIX: string = "https://open.chinanetcenter.com";
|
||||||
|
public static readonly HTTPS_REQUEST_PREFIX: string = "https://";
|
||||||
|
public static readonly HTTP_DOMAIN: string = "open.chinanetcenter.com";
|
||||||
|
|
||||||
|
public static readonly APPLICATION_JSON: string = "application/json";
|
||||||
|
|
||||||
|
public static readonly HEAD_SIGN_ACCESS_KEY: string = "x-cnc-accessKey";
|
||||||
|
public static readonly HEAD_SIGN_TIMESTAMP: string = "x-cnc-timestamp";
|
||||||
|
public static readonly HEAD_SIGN_ALGORITHM: string = "CNC-HMAC-SHA256";
|
||||||
|
|
||||||
|
public static readonly X_CNC_AUTH_METHOD: string = "x-cnc-auth-method";
|
||||||
|
|
||||||
|
public static readonly AUTH_METHOD: string = "AKSK";
|
||||||
|
|
||||||
|
public static readonly END_POINT: string = "{endPoint}";
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
export class ApiAuthException extends Error {
|
||||||
|
public cause?: any;
|
||||||
|
|
||||||
|
constructor(message: string, cause?: any) {
|
||||||
|
super(message);
|
||||||
|
this.cause = cause;
|
||||||
|
this.name = 'ApiAuthException';
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
import { AkSkConfig } from "./model/AkSkConfig.js";
|
||||||
|
import { AkSkAuth } from "./auth/AkSkAuth.js";
|
||||||
|
|
||||||
|
export { AkSkAuth, AkSkConfig}
|
|
@ -0,0 +1,56 @@
|
||||||
|
export class AkSkConfig {
|
||||||
|
private _accessKey: string | undefined;
|
||||||
|
private _secretKey: string | undefined;
|
||||||
|
private _uri: string | undefined;
|
||||||
|
private _endPoint: string | undefined;
|
||||||
|
private _method: string | undefined;
|
||||||
|
private _signedHeaders: string | undefined;
|
||||||
|
|
||||||
|
public get accessKey(): string {
|
||||||
|
return this._accessKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public set accessKey(value: string) {
|
||||||
|
this._accessKey = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get secretKey(): string {
|
||||||
|
return this._secretKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public set secretKey(value: string) {
|
||||||
|
this._secretKey = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get uri(): string {
|
||||||
|
return this._uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
public set uri(value: string) {
|
||||||
|
this._uri = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get endPoint(): string {
|
||||||
|
return this._endPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public set endPoint(value: string) {
|
||||||
|
this._endPoint = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get method(): string {
|
||||||
|
return this._method;
|
||||||
|
}
|
||||||
|
|
||||||
|
public set method(value: string) {
|
||||||
|
this._method = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get signedHeaders(): string {
|
||||||
|
return this._signedHeaders;
|
||||||
|
}
|
||||||
|
|
||||||
|
public set signedHeaders(value: string) {
|
||||||
|
this._signedHeaders = value;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
import { Constant } from '../common/Constant.js'; // Assuming you have a TypeScript version of this
|
||||||
|
|
||||||
|
export class HttpRequestMsg {
|
||||||
|
uri: string ;
|
||||||
|
url: string;
|
||||||
|
host: string;
|
||||||
|
method: string;
|
||||||
|
protocol: string;
|
||||||
|
params: Record<string, string>;
|
||||||
|
headers: Record<string, string>;
|
||||||
|
body: string;
|
||||||
|
signedHeaders: string;
|
||||||
|
msg: any;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.params = {};
|
||||||
|
this.headers = {};
|
||||||
|
this.putHeader('Content-Type', Constant.APPLICATION_JSON);
|
||||||
|
this.putHeader(Constant.X_CNC_AUTH_METHOD, Constant.AUTH_METHOD);
|
||||||
|
}
|
||||||
|
|
||||||
|
putParam(name: string, value: string): void {
|
||||||
|
this.params[name] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
getParam(name: string): string | null {
|
||||||
|
const value = this.params[name];
|
||||||
|
return value && value.trim() !== '' ? value : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
getQueryString(): string {
|
||||||
|
if(this.uri == undefined)
|
||||||
|
return "";
|
||||||
|
const index = this.uri.indexOf("?");
|
||||||
|
if (this.method === 'POST' || index === -1) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return this.uri.substring(index + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
putHeader(name: string, value: string): void {
|
||||||
|
this.headers[name] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
getHeader(name: string): string | null {
|
||||||
|
for (const key in this.headers) {
|
||||||
|
if (key.toLowerCase() === name.toLowerCase()) {
|
||||||
|
return this.headers[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
getHeaderByNames(...names: string[]): string | null {
|
||||||
|
for (const name of names) {
|
||||||
|
const value = this.getHeader(name);
|
||||||
|
if (value) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
removeHeader(name: string): void {
|
||||||
|
for (const key in this.headers) {
|
||||||
|
if (key.toLowerCase() === name.toLowerCase()) {
|
||||||
|
delete this.headers[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setJsonBody(object: any): void {
|
||||||
|
this.body = JSON.stringify(object);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
import CryptoJS from 'crypto-js';
|
||||||
|
|
||||||
|
export class CryptoUtils {
|
||||||
|
private constructor() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hmac+sha256+hex
|
||||||
|
*/
|
||||||
|
public static sha256Hex(s: string): string {
|
||||||
|
const hash = CryptoJS.SHA256(s);
|
||||||
|
return hash.toString(CryptoJS.enc.Hex).toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hmac+sha256
|
||||||
|
*/
|
||||||
|
public static hmac256(secretKey: string, message: string): string {
|
||||||
|
const keyWordArray = CryptoJS.enc.Utf8.parse(secretKey);
|
||||||
|
const messageWordArray = CryptoJS.enc.Utf8.parse(message);
|
||||||
|
const hash = CryptoJS.HmacSHA256(messageWordArray, keyWordArray);
|
||||||
|
return hash.toString(CryptoJS.enc.Hex).toLowerCase();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
import { HttpRequestMsg } from '../model/HttpRequestMsg.js'; // Assuming you have a TypeScript version of this
|
||||||
|
import { ApiAuthException } from '../exception/ApiAuthException.js'; // Assuming you have a TypeScript version of this
|
||||||
|
import axios, { AxiosError } from 'axios';
|
||||||
|
|
||||||
|
export class HttpUtils {
|
||||||
|
private constructor() { }
|
||||||
|
public static async call(requestMsg: HttpRequestMsg): Promise<string | null> {
|
||||||
|
var response;
|
||||||
|
try {
|
||||||
|
response = await axios({
|
||||||
|
method: requestMsg.method,
|
||||||
|
url: requestMsg.url,
|
||||||
|
headers: requestMsg.headers,
|
||||||
|
data: requestMsg.body
|
||||||
|
});
|
||||||
|
console.info("API invoke success. Response:", response.data);
|
||||||
|
return response.data;
|
||||||
|
} catch (error) {
|
||||||
|
if (error instanceof AxiosError) {
|
||||||
|
// Handle AxiosError specifically
|
||||||
|
console.error('API invoke failed. Response:', error.response.data);
|
||||||
|
return error.response.data;
|
||||||
|
} else {
|
||||||
|
// Handle other types of errors
|
||||||
|
console.error('API invoke failed.', error);
|
||||||
|
}
|
||||||
|
throw new ApiAuthException('API invoke failed.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
export * from "./plugin-refresh-cert.js";
|
|
@ -0,0 +1,121 @@
|
||||||
|
import {
|
||||||
|
AbstractTaskPlugin,
|
||||||
|
IsTaskPlugin,
|
||||||
|
PageSearch,
|
||||||
|
pluginGroups,
|
||||||
|
RunStrategy,
|
||||||
|
TaskInput
|
||||||
|
} from "@certd/pipeline";
|
||||||
|
import { CertApplyPluginNames, CertInfo } from "@certd/plugin-cert";
|
||||||
|
import { createCertDomainGetterInputDefine, createRemoteSelectInputDefine } from "@certd/plugin-lib";
|
||||||
|
import { WangsuAccess } from "../access.js";
|
||||||
|
|
||||||
|
@IsTaskPlugin({
|
||||||
|
//命名规范,插件类型+功能(就是目录plugin-demo中的demo),大写字母开头,驼峰命名
|
||||||
|
name: "WangsuRefreshCert",
|
||||||
|
title: "网宿-更新证书",
|
||||||
|
desc: "网宿证书自动更新",
|
||||||
|
icon: "svg:icon-lucky",
|
||||||
|
//插件分组
|
||||||
|
group: pluginGroups.cdn.key,
|
||||||
|
needPlus: false,
|
||||||
|
default: {
|
||||||
|
//默认值配置照抄即可
|
||||||
|
strategy: {
|
||||||
|
runStrategy: RunStrategy.SkipWhenSucceed
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
//类名规范,跟上面插件名称(name)一致
|
||||||
|
export class WangsuRefreshCert extends AbstractTaskPlugin {
|
||||||
|
//证书选择,此项必须要有
|
||||||
|
@TaskInput({
|
||||||
|
title: "域名证书",
|
||||||
|
helper: "请选择前置任务输出的域名证书",
|
||||||
|
component: {
|
||||||
|
name: "output-selector",
|
||||||
|
from: [...CertApplyPluginNames]
|
||||||
|
}
|
||||||
|
// required: true, // 必填
|
||||||
|
})
|
||||||
|
cert!: CertInfo;
|
||||||
|
|
||||||
|
@TaskInput(createCertDomainGetterInputDefine({ props: { required: false } }))
|
||||||
|
certDomains!: string[];
|
||||||
|
|
||||||
|
//授权选择框
|
||||||
|
@TaskInput({
|
||||||
|
title: "网宿授权",
|
||||||
|
component: {
|
||||||
|
name: "access-selector",
|
||||||
|
type: "wangsu" //固定授权类型
|
||||||
|
},
|
||||||
|
required: true //必填
|
||||||
|
})
|
||||||
|
accessId!: string;
|
||||||
|
//
|
||||||
|
|
||||||
|
@TaskInput(
|
||||||
|
createRemoteSelectInputDefine({
|
||||||
|
title: "证书Id",
|
||||||
|
helper: "要更新的网宿证书id",
|
||||||
|
action: WangsuRefreshCert.prototype.onGetCertList.name,
|
||||||
|
pager: false,
|
||||||
|
search: false
|
||||||
|
})
|
||||||
|
)
|
||||||
|
certList!: string[];
|
||||||
|
|
||||||
|
//插件实例化时执行的方法
|
||||||
|
async onInstance() {
|
||||||
|
}
|
||||||
|
|
||||||
|
//插件执行方法
|
||||||
|
async execute(): Promise<void> {
|
||||||
|
const access = await this.getAccess<WangsuAccess>(this.accessId);
|
||||||
|
|
||||||
|
for (const item of this.certList) {
|
||||||
|
this.logger.info(`----------- 开始更新证书:${item}`);
|
||||||
|
await access.updateCert({
|
||||||
|
certId: item,
|
||||||
|
cert: this.cert
|
||||||
|
});
|
||||||
|
this.logger.info(`----------- 更新证书${item}成功`);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.logger.info("部署完成");
|
||||||
|
}
|
||||||
|
|
||||||
|
async onGetCertList(data: PageSearch = {}) {
|
||||||
|
const access = await this.getAccess<WangsuAccess>(this.accessId);
|
||||||
|
|
||||||
|
const list = await access.getCertList({});
|
||||||
|
if (!list || list.length === 0) {
|
||||||
|
throw new Error("没有找到证书,请先在控制台上传一次证书且关联域名");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* certificate-id
|
||||||
|
* name
|
||||||
|
* dns-names
|
||||||
|
*/
|
||||||
|
const options = list.map((item: any) => {
|
||||||
|
const domains = item["dns-names"]
|
||||||
|
const certId = item["certificate-id"];
|
||||||
|
return {
|
||||||
|
label: `${item.name}<${certId}-${domains[0]}>`,
|
||||||
|
value: certId,
|
||||||
|
domain: item["dns-names"]
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return {
|
||||||
|
list: this.ctx.utils.options.buildGroupOptions(options, this.certDomains),
|
||||||
|
total: list.length,
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: list.length
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//实例化一下,注册插件
|
||||||
|
new WangsuRefreshCert();
|
Loading…
Reference in New Issue