fix: log container is empty after failing to obtain cert #281

This commit is contained in:
Jacky 2024-02-13 12:16:15 +08:00
parent fd519aea5e
commit a095c88fd2
10 changed files with 360 additions and 349 deletions

View file

@ -16,7 +16,7 @@
"@vue/reactivity": "^3.4.13", "@vue/reactivity": "^3.4.13",
"@vue/shared": "^3.4.13", "@vue/shared": "^3.4.13",
"@vueuse/core": "^10.7.2", "@vueuse/core": "^10.7.2",
"ant-design-vue": "4.1.0", "ant-design-vue": "4.1.2",
"apexcharts": "^3.45.1", "apexcharts": "^3.45.1",
"axios": "^1.6.5", "axios": "^1.6.5",
"dayjs": "^1.11.10", "dayjs": "^1.11.10",
@ -29,7 +29,7 @@
"reconnecting-websocket": "^4.4.0", "reconnecting-websocket": "^4.4.0",
"sortablejs": "^1.15.0", "sortablejs": "^1.15.0",
"vite-plugin-build-id": "^0.2.8", "vite-plugin-build-id": "^0.2.8",
"vue": "^3.4.16", "vue": "^3.4.18",
"vue-github-button": "https://github.com/0xJacky/vue-github-button", "vue-github-button": "https://github.com/0xJacky/vue-github-button",
"vue-router": "^4.2.5", "vue-router": "^4.2.5",
"vue3-ace-editor": "2.2.4", "vue3-ace-editor": "2.2.4",
@ -67,7 +67,7 @@
"unplugin-auto-import": "^0.17.3", "unplugin-auto-import": "^0.17.3",
"unplugin-vue-components": "^0.26.0", "unplugin-vue-components": "^0.26.0",
"unplugin-vue-define-options": "^1.4.1", "unplugin-vue-define-options": "^1.4.1",
"vite": "^5.1.0", "vite": "^5.1.1",
"vite-svg-loader": "^5.1.0", "vite-svg-loader": "^5.1.0",
"vue-tsc": "^1.8.27" "vue-tsc": "^1.8.27"
} }

232
app/pnpm-lock.yaml generated
View file

@ -7,7 +7,7 @@ settings:
dependencies: dependencies:
'@ant-design/icons-vue': '@ant-design/icons-vue':
specifier: ^7.0.1 specifier: ^7.0.1
version: 7.0.1(vue@3.4.16) version: 7.0.1(vue@3.4.18)
'@formkit/auto-animate': '@formkit/auto-animate':
specifier: ^0.8.0 specifier: ^0.8.0
version: 0.8.1 version: 0.8.1
@ -19,10 +19,10 @@ dependencies:
version: 3.4.13 version: 3.4.13
'@vueuse/core': '@vueuse/core':
specifier: ^10.7.2 specifier: ^10.7.2
version: 10.7.2(vue@3.4.16) version: 10.7.2(vue@3.4.18)
ant-design-vue: ant-design-vue:
specifier: 4.1.0 specifier: 4.1.2
version: 4.1.0(vue@3.4.16) version: 4.1.2(vue@3.4.18)
apexcharts: apexcharts:
specifier: ^3.45.1 specifier: ^3.45.1
version: 3.45.1 version: 3.45.1
@ -46,7 +46,7 @@ dependencies:
version: 0.2.0 version: 0.2.0
pinia: pinia:
specifier: ^2.1.7 specifier: ^2.1.7
version: 2.1.7(typescript@5.3.3)(vue@3.4.16) version: 2.1.7(typescript@5.3.3)(vue@3.4.18)
pinia-plugin-persistedstate: pinia-plugin-persistedstate:
specifier: ^3.0.2 specifier: ^3.0.2
version: 3.2.0(pinia@2.1.7) version: 3.2.0(pinia@2.1.7)
@ -60,26 +60,26 @@ dependencies:
specifier: ^0.2.8 specifier: ^0.2.8
version: 0.2.8(less@4.2.0) version: 0.2.8(less@4.2.0)
vue: vue:
specifier: ^3.4.16 specifier: ^3.4.18
version: 3.4.16(typescript@5.3.3) version: 3.4.18(typescript@5.3.3)
vue-github-button: vue-github-button:
specifier: https://github.com/0xJacky/vue-github-button specifier: https://github.com/0xJacky/vue-github-button
version: github.com/0xJacky/vue-github-button/fc3c93355a790d3249de6610de3ebe35949ee314 version: github.com/0xJacky/vue-github-button/fc3c93355a790d3249de6610de3ebe35949ee314
vue-router: vue-router:
specifier: ^4.2.5 specifier: ^4.2.5
version: 4.2.5(vue@3.4.16) version: 4.2.5(vue@3.4.18)
vue3-ace-editor: vue3-ace-editor:
specifier: 2.2.4 specifier: 2.2.4
version: 2.2.4(ace-builds@1.32.3)(vue@3.4.16) version: 2.2.4(ace-builds@1.32.3)(vue@3.4.18)
vue3-apexcharts: vue3-apexcharts:
specifier: ^1.4.4 specifier: ^1.4.4
version: 1.4.4(apexcharts@3.45.1)(vue@3.4.16) version: 1.4.4(apexcharts@3.45.1)(vue@3.4.18)
vue3-gettext: vue3-gettext:
specifier: ^3.0.0-beta.3 specifier: ^3.0.0-beta.3
version: 3.0.0-beta.3(@vue/compiler-sfc@3.4.13)(vue@3.4.16) version: 3.0.0-beta.3(@vue/compiler-sfc@3.4.13)(vue@3.4.18)
vuedraggable: vuedraggable:
specifier: ^4.1.0 specifier: ^4.1.0
version: 4.1.0(vue@3.4.16) version: 4.1.0(vue@3.4.18)
xterm: xterm:
specifier: ^5.3.0 specifier: ^5.3.0
version: 5.3.0 version: 5.3.0
@ -111,10 +111,10 @@ devDependencies:
version: 6.18.1(eslint@8.56.0)(typescript@5.3.3) version: 6.18.1(eslint@8.56.0)(typescript@5.3.3)
'@vitejs/plugin-vue': '@vitejs/plugin-vue':
specifier: ^5.0.3 specifier: ^5.0.3
version: 5.0.3(vite@5.1.0)(vue@3.4.16) version: 5.0.3(vite@5.1.1)(vue@3.4.18)
'@vitejs/plugin-vue-jsx': '@vitejs/plugin-vue-jsx':
specifier: ^3.1.0 specifier: ^3.1.0
version: 3.1.0(vite@5.1.0)(vue@3.4.16) version: 3.1.0(vite@5.1.1)(vue@3.4.18)
'@vue/compiler-sfc': '@vue/compiler-sfc':
specifier: ^3.4.13 specifier: ^3.4.13
version: 3.4.13 version: 3.4.13
@ -165,16 +165,16 @@ devDependencies:
version: 0.17.3(@vueuse/core@10.7.2) version: 0.17.3(@vueuse/core@10.7.2)
unplugin-vue-components: unplugin-vue-components:
specifier: ^0.26.0 specifier: ^0.26.0
version: 0.26.0(vue@3.4.16) version: 0.26.0(vue@3.4.18)
unplugin-vue-define-options: unplugin-vue-define-options:
specifier: ^1.4.1 specifier: ^1.4.1
version: 1.4.1(vue@3.4.16) version: 1.4.1(vue@3.4.18)
vite: vite:
specifier: ^5.1.0 specifier: ^5.1.1
version: 5.1.0(@types/node@20.10.2)(less@4.2.0) version: 5.1.1(@types/node@20.10.2)(less@4.2.0)
vite-svg-loader: vite-svg-loader:
specifier: ^5.1.0 specifier: ^5.1.0
version: 5.1.0(vue@3.4.16) version: 5.1.0(vue@3.4.18)
vue-tsc: vue-tsc:
specifier: ^1.8.27 specifier: ^1.8.27
version: 1.8.27(typescript@5.3.3) version: 1.8.27(typescript@5.3.3)
@ -209,14 +209,14 @@ packages:
resolution: {integrity: sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g==} resolution: {integrity: sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g==}
dev: false dev: false
/@ant-design/icons-vue@7.0.1(vue@3.4.16): /@ant-design/icons-vue@7.0.1(vue@3.4.18):
resolution: {integrity: sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==} resolution: {integrity: sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==}
peerDependencies: peerDependencies:
vue: '>=3.0.3' vue: '>=3.0.3'
dependencies: dependencies:
'@ant-design/colors': 6.0.0 '@ant-design/colors': 6.0.0
'@ant-design/icons-svg': 4.3.1 '@ant-design/icons-svg': 4.3.1
vue: 3.4.16(typescript@5.3.3) vue: 3.4.18(typescript@5.3.3)
dev: false dev: false
/@antfu/eslint-config-basic@0.43.1(@typescript-eslint/eslint-plugin@6.18.1)(@typescript-eslint/parser@6.18.1)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0)(typescript@5.3.3): /@antfu/eslint-config-basic@0.43.1(@typescript-eslint/eslint-plugin@6.18.1)(@typescript-eslint/parser@6.18.1)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0)(typescript@5.3.3):
@ -1415,7 +1415,7 @@ packages:
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
dev: true dev: true
/@vitejs/plugin-vue-jsx@3.1.0(vite@5.1.0)(vue@3.4.16): /@vitejs/plugin-vue-jsx@3.1.0(vite@5.1.1)(vue@3.4.18):
resolution: {integrity: sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==} resolution: {integrity: sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==}
engines: {node: ^14.18.0 || >=16.0.0} engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies: peerDependencies:
@ -1425,21 +1425,21 @@ packages:
'@babel/core': 7.23.5 '@babel/core': 7.23.5
'@babel/plugin-transform-typescript': 7.23.5(@babel/core@7.23.5) '@babel/plugin-transform-typescript': 7.23.5(@babel/core@7.23.5)
'@vue/babel-plugin-jsx': 1.1.5(@babel/core@7.23.5) '@vue/babel-plugin-jsx': 1.1.5(@babel/core@7.23.5)
vite: 5.1.0(@types/node@20.10.2)(less@4.2.0) vite: 5.1.1(@types/node@20.10.2)(less@4.2.0)
vue: 3.4.16(typescript@5.3.3) vue: 3.4.18(typescript@5.3.3)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
dev: true dev: true
/@vitejs/plugin-vue@5.0.3(vite@5.1.0)(vue@3.4.16): /@vitejs/plugin-vue@5.0.3(vite@5.1.1)(vue@3.4.18):
resolution: {integrity: sha512-b8S5dVS40rgHdDrw+DQi/xOM9ed+kSRZzfm1T74bMmBDCd8XO87NKlFYInzCtwvtWwXZvo1QxE2OSspTATWrbA==} resolution: {integrity: sha512-b8S5dVS40rgHdDrw+DQi/xOM9ed+kSRZzfm1T74bMmBDCd8XO87NKlFYInzCtwvtWwXZvo1QxE2OSspTATWrbA==}
engines: {node: ^18.0.0 || >=20.0.0} engines: {node: ^18.0.0 || >=20.0.0}
peerDependencies: peerDependencies:
vite: ^5.0.0 vite: ^5.0.0
vue: ^3.2.25 vue: ^3.2.25
dependencies: dependencies:
vite: 5.1.0(@types/node@20.10.2)(less@4.2.0) vite: 5.1.1(@types/node@20.10.2)(less@4.2.0)
vue: 3.4.16(typescript@5.3.3) vue: 3.4.18(typescript@5.3.3)
dev: true dev: true
/@volar/language-core@1.11.1: /@volar/language-core@1.11.1:
@ -1461,7 +1461,7 @@ packages:
path-browserify: 1.0.1 path-browserify: 1.0.1
dev: true dev: true
/@vue-macros/common@1.10.0(vue@3.4.16): /@vue-macros/common@1.10.0(vue@3.4.18):
resolution: {integrity: sha512-4DZsPeQA/nBQDw2RkYAmH7KrFjJVrMdAhJhO1JCl1bbbFXCGeoGjXfkg9wHPppj47s2HpAB3GrqNwqVGbi12NQ==} resolution: {integrity: sha512-4DZsPeQA/nBQDw2RkYAmH7KrFjJVrMdAhJhO1JCl1bbbFXCGeoGjXfkg9wHPppj47s2HpAB3GrqNwqVGbi12NQ==}
engines: {node: '>=16.14.0'} engines: {node: '>=16.14.0'}
peerDependencies: peerDependencies:
@ -1472,11 +1472,11 @@ packages:
dependencies: dependencies:
'@babel/types': 7.23.5 '@babel/types': 7.23.5
'@rollup/pluginutils': 5.1.0 '@rollup/pluginutils': 5.1.0
'@vue/compiler-sfc': 3.4.13 '@vue/compiler-sfc': 3.4.18
ast-kit: 0.11.3 ast-kit: 0.11.3
local-pkg: 0.5.0 local-pkg: 0.5.0
magic-string-ast: 0.3.0 magic-string-ast: 0.3.0
vue: 3.4.16(typescript@5.3.3) vue: 3.4.18(typescript@5.3.3)
transitivePeerDependencies: transitivePeerDependencies:
- rollup - rollup
dev: true dev: true
@ -1513,11 +1513,11 @@ packages:
estree-walker: 2.0.2 estree-walker: 2.0.2
source-map-js: 1.0.2 source-map-js: 1.0.2
/@vue/compiler-core@3.4.16: /@vue/compiler-core@3.4.18:
resolution: {integrity: sha512-HXgyy7gen4FNJS8Hz2q/NNBEdzD3QInhDTWaP2/mS0TlmV9CnjmXip7TZ0ROYiQM4FgXZCCJvh74yDikFkPpkQ==} resolution: {integrity: sha512-F7YK8lMK0iv6b9/Gdk15A67wM0KKZvxDxed0RR60C1z9tIJTKta+urs4j0RTN5XqHISzI3etN3mX0uHhjmoqjQ==}
dependencies: dependencies:
'@babel/parser': 7.23.9 '@babel/parser': 7.23.9
'@vue/shared': 3.4.16 '@vue/shared': 3.4.18
entities: 4.5.0 entities: 4.5.0
estree-walker: 2.0.2 estree-walker: 2.0.2
source-map-js: 1.0.2 source-map-js: 1.0.2
@ -1528,11 +1528,11 @@ packages:
'@vue/compiler-core': 3.4.13 '@vue/compiler-core': 3.4.13
'@vue/shared': 3.4.13 '@vue/shared': 3.4.13
/@vue/compiler-dom@3.4.16: /@vue/compiler-dom@3.4.18:
resolution: {integrity: sha512-lvs9ankPzLEuIC5aB72ntLUcwVGmgY7ASkXDRvo9+lUMWOOCqnAmM/64AZPeVAZ4EnjocCE40OUN+ZboNe4ygA==} resolution: {integrity: sha512-24Eb8lcMfInefvQ6YlEVS18w5Q66f4+uXWVA+yb7praKbyjHRNuKVWGuinfSSjM0ZIiPi++QWukhkgznBaqpEA==}
dependencies: dependencies:
'@vue/compiler-core': 3.4.16 '@vue/compiler-core': 3.4.18
'@vue/shared': 3.4.16 '@vue/shared': 3.4.18
/@vue/compiler-sfc@3.4.13: /@vue/compiler-sfc@3.4.13:
resolution: {integrity: sha512-SkpmQN8xIFBd5onT413DFSDdjxULJf6jmJg/t3w/DZ9I8ZzyNlLIBLO0qFLewVHyHCiAgpPZlWqSRZXYrawk3Q==} resolution: {integrity: sha512-SkpmQN8xIFBd5onT413DFSDdjxULJf6jmJg/t3w/DZ9I8ZzyNlLIBLO0qFLewVHyHCiAgpPZlWqSRZXYrawk3Q==}
@ -1547,17 +1547,17 @@ packages:
postcss: 8.4.33 postcss: 8.4.33
source-map-js: 1.0.2 source-map-js: 1.0.2
/@vue/compiler-sfc@3.4.16: /@vue/compiler-sfc@3.4.18:
resolution: {integrity: sha512-zVYC42Q/NmbB4nigGcQeIvsLpBlq6K9wJP5jTFCqfpXWnkodxfLFQHDu2GntZ7yKOgwAjxuvLwrPx+I6LPL2vg==} resolution: {integrity: sha512-rG5tqtnzwrVpMqAQ7FHtvHaV70G6LLfJIWLYZB/jZ9m/hrnZmIQh+H3ewnC5onwe/ibljm9+ZupxeElzqCkTAw==}
dependencies: dependencies:
'@babel/parser': 7.23.9 '@babel/parser': 7.23.9
'@vue/compiler-core': 3.4.16 '@vue/compiler-core': 3.4.18
'@vue/compiler-dom': 3.4.16 '@vue/compiler-dom': 3.4.18
'@vue/compiler-ssr': 3.4.16 '@vue/compiler-ssr': 3.4.18
'@vue/shared': 3.4.16 '@vue/shared': 3.4.18
estree-walker: 2.0.2 estree-walker: 2.0.2
magic-string: 0.30.7 magic-string: 0.30.7
postcss: 8.4.33 postcss: 8.4.35
source-map-js: 1.0.2 source-map-js: 1.0.2
/@vue/compiler-ssr@3.4.13: /@vue/compiler-ssr@3.4.13:
@ -1566,11 +1566,11 @@ packages:
'@vue/compiler-dom': 3.4.13 '@vue/compiler-dom': 3.4.13
'@vue/shared': 3.4.13 '@vue/shared': 3.4.13
/@vue/compiler-ssr@3.4.16: /@vue/compiler-ssr@3.4.18:
resolution: {integrity: sha512-1kNF+fHdEB+5aTcPZ0hh/gzi9Ezq5IBO4bl/hV4Dg4fub6t12W6VGlsERtvdUaEowL35M3pojv0hOvLaq0FbdQ==} resolution: {integrity: sha512-hSlv20oUhPxo2UYUacHgGaxtqP0tvFo6ixxxD6JlXIkwzwoZ9eKK6PFQN4hNK/R13JlNyldwWt/fqGBKgWJ6nQ==}
dependencies: dependencies:
'@vue/compiler-dom': 3.4.16 '@vue/compiler-dom': 3.4.18
'@vue/shared': 3.4.16 '@vue/shared': 3.4.18
/@vue/devtools-api@6.5.1: /@vue/devtools-api@6.5.1:
resolution: {integrity: sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==} resolution: {integrity: sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==}
@ -1586,8 +1586,8 @@ packages:
dependencies: dependencies:
'@volar/language-core': 1.11.1 '@volar/language-core': 1.11.1
'@volar/source-map': 1.11.1 '@volar/source-map': 1.11.1
'@vue/compiler-dom': 3.4.13 '@vue/compiler-dom': 3.4.18
'@vue/shared': 3.4.13 '@vue/shared': 3.4.18
computeds: 0.0.1 computeds: 0.0.1
minimatch: 9.0.3 minimatch: 9.0.3
muggle-string: 0.3.1 muggle-string: 0.3.1
@ -1602,50 +1602,50 @@ packages:
'@vue/shared': 3.4.13 '@vue/shared': 3.4.13
dev: false dev: false
/@vue/reactivity@3.4.16: /@vue/reactivity@3.4.18:
resolution: {integrity: sha512-XTWRMBG10PGs4MxDoUdBEhMacS5QBUAlGeb5AmQysTQ16tXxQ0lymgbSTmR2h79v5dJDFuULuLWUbwc0uj6zqQ==} resolution: {integrity: sha512-7uda2/I0jpLiRygprDo5Jxs2HJkOVXcOMlyVlY54yRLxoycBpwGJRwJT9EdGB4adnoqJDXVT2BilUAYwI7qvmg==}
dependencies: dependencies:
'@vue/shared': 3.4.16 '@vue/shared': 3.4.18
/@vue/runtime-core@3.4.16: /@vue/runtime-core@3.4.18:
resolution: {integrity: sha512-vgS25M79AOY2EsBWxBcy9yAou10x2WHJhGN0FM/Ii8yum0a+KBfg8ehzq/cuDqfOPrtVrDPW+QkH3WNJNakfRw==} resolution: {integrity: sha512-7mU9diCa+4e+8/wZ7Udw5pwTH10A11sZ1nldmHOUKJnzCwvZxfJqAtw31mIf4T5H2FsLCSBQT3xgioA9vIjyDQ==}
dependencies: dependencies:
'@vue/reactivity': 3.4.16 '@vue/reactivity': 3.4.18
'@vue/shared': 3.4.16 '@vue/shared': 3.4.18
/@vue/runtime-dom@3.4.16: /@vue/runtime-dom@3.4.18:
resolution: {integrity: sha512-X+knHfhefB8tX0rJG3d14U8p1CpeZ/qZxol9rN8ZAD9UalTInIsKXlBTd/xLC8GwO2aXVXxjaSIiTU5th5wj9Q==} resolution: {integrity: sha512-2y1Mkzcw1niSfG7z3Qx+2ir9Gb4hdTkZe5p/I8x1aTIKQE0vY0tPAEUPhZm5tx6183gG3D/KwHG728UR0sIufA==}
dependencies: dependencies:
'@vue/runtime-core': 3.4.16 '@vue/runtime-core': 3.4.18
'@vue/shared': 3.4.16 '@vue/shared': 3.4.18
csstype: 3.1.3 csstype: 3.1.3
/@vue/server-renderer@3.4.16(vue@3.4.16): /@vue/server-renderer@3.4.18(vue@3.4.18):
resolution: {integrity: sha512-e0PZDpk/eZgICYb0DTQ+OeBlgt0FYGo+2DEcUkZxw+pDgF1qL0aYaOqmPcSbL5KK0nizvuSd7k5HZOkSwSaC2g==} resolution: {integrity: sha512-YJd1wa7mzUN3NRqLEsrwEYWyO+PUBSROIGlCc3J/cvn7Zu6CxhNLgXa8Z4zZ5ja5/nviYO79J1InoPeXgwBTZA==}
peerDependencies: peerDependencies:
vue: 3.4.16 vue: 3.4.18
dependencies: dependencies:
'@vue/compiler-ssr': 3.4.16 '@vue/compiler-ssr': 3.4.18
'@vue/shared': 3.4.16 '@vue/shared': 3.4.18
vue: 3.4.16(typescript@5.3.3) vue: 3.4.18(typescript@5.3.3)
/@vue/shared@3.4.13: /@vue/shared@3.4.13:
resolution: {integrity: sha512-56crFKLPpzk85WXX1L1c0QzPOuoapWlPVys8eMG8kkRmqdMjWUqK8KpFdE2d7BQA4CEbXwyyHPq6MpFr8H9rcg==} resolution: {integrity: sha512-56crFKLPpzk85WXX1L1c0QzPOuoapWlPVys8eMG8kkRmqdMjWUqK8KpFdE2d7BQA4CEbXwyyHPq6MpFr8H9rcg==}
/@vue/shared@3.4.16: /@vue/shared@3.4.18:
resolution: {integrity: sha512-HKCjeaxR+R95dCw1BDaytcHdlzZj9lxj7RlFnxWtcKq670t8oSeMsbPlkzkNc2V6IUzHaMtUxdBcdREAhb+7NA==} resolution: {integrity: sha512-CxouGFxxaW5r1WbrSmWwck3No58rApXgRSBxrqgnY1K+jk20F6DrXJkHdH9n4HVT+/B6G2CAn213Uq3npWiy8Q==}
/@vue/tsconfig@0.5.1: /@vue/tsconfig@0.5.1:
resolution: {integrity: sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==} resolution: {integrity: sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==}
dev: true dev: true
/@vueuse/core@10.7.2(vue@3.4.16): /@vueuse/core@10.7.2(vue@3.4.18):
resolution: {integrity: sha512-AOyAL2rK0By62Hm+iqQn6Rbu8bfmbgaIMXcE3TSr7BdQ42wnSFlwIdPjInO62onYsEMK/yDMU8C6oGfDAtZ2qQ==} resolution: {integrity: sha512-AOyAL2rK0By62Hm+iqQn6Rbu8bfmbgaIMXcE3TSr7BdQ42wnSFlwIdPjInO62onYsEMK/yDMU8C6oGfDAtZ2qQ==}
dependencies: dependencies:
'@types/web-bluetooth': 0.0.20 '@types/web-bluetooth': 0.0.20
'@vueuse/metadata': 10.7.2 '@vueuse/metadata': 10.7.2
'@vueuse/shared': 10.7.2(vue@3.4.16) '@vueuse/shared': 10.7.2(vue@3.4.18)
vue-demi: 0.14.6(vue@3.4.16) vue-demi: 0.14.6(vue@3.4.18)
transitivePeerDependencies: transitivePeerDependencies:
- '@vue/composition-api' - '@vue/composition-api'
- vue - vue
@ -1653,10 +1653,10 @@ packages:
/@vueuse/metadata@10.7.2: /@vueuse/metadata@10.7.2:
resolution: {integrity: sha512-kCWPb4J2KGrwLtn1eJwaJD742u1k5h6v/St5wFe8Quih90+k2a0JP8BS4Zp34XUuJqS2AxFYMb1wjUL8HfhWsQ==} resolution: {integrity: sha512-kCWPb4J2KGrwLtn1eJwaJD742u1k5h6v/St5wFe8Quih90+k2a0JP8BS4Zp34XUuJqS2AxFYMb1wjUL8HfhWsQ==}
/@vueuse/shared@10.7.2(vue@3.4.16): /@vueuse/shared@10.7.2(vue@3.4.18):
resolution: {integrity: sha512-qFbXoxS44pi2FkgFjPvF4h7c9oMDutpyBdcJdMYIMg9XyXli2meFMuaKn+UMgsClo//Th6+beeCgqweT/79BVA==} resolution: {integrity: sha512-qFbXoxS44pi2FkgFjPvF4h7c9oMDutpyBdcJdMYIMg9XyXli2meFMuaKn+UMgsClo//Th6+beeCgqweT/79BVA==}
dependencies: dependencies:
vue-demi: 0.14.6(vue@3.4.16) vue-demi: 0.14.6(vue@3.4.18)
transitivePeerDependencies: transitivePeerDependencies:
- '@vue/composition-api' - '@vue/composition-api'
- vue - vue
@ -1717,14 +1717,14 @@ packages:
engines: {node: '>=12'} engines: {node: '>=12'}
dev: false dev: false
/ant-design-vue@4.1.0(vue@3.4.16): /ant-design-vue@4.1.2(vue@3.4.18):
resolution: {integrity: sha512-sVQAfTCxpGRfFykM033/0ZWfNWbsL8EsqhBP9knbP4Ptc52zG57mQsCPWvq6Cj3yqmDJW6ykY05v0KB+5rAPXg==} resolution: {integrity: sha512-ynFkDJLlHgumeK6Hr1UZ7PvQNZ1uBcri/pmejBdS3kRqHeA5VRsxneYDwa8YxA+uYB5YfT2jpYsSHsiMiCjRGg==}
engines: {node: '>=12.22.0'} engines: {node: '>=12.22.0'}
peerDependencies: peerDependencies:
vue: '>=3.2.0' vue: '>=3.2.0'
dependencies: dependencies:
'@ant-design/colors': 6.0.0 '@ant-design/colors': 6.0.0
'@ant-design/icons-vue': 7.0.1(vue@3.4.16) '@ant-design/icons-vue': 7.0.1(vue@3.4.18)
'@babel/runtime': 7.23.5 '@babel/runtime': 7.23.5
'@ctrl/tinycolor': 3.6.1 '@ctrl/tinycolor': 3.6.1
'@emotion/hash': 0.9.1 '@emotion/hash': 0.9.1
@ -1743,8 +1743,8 @@ packages:
shallow-equal: 1.2.1 shallow-equal: 1.2.1
stylis: 4.3.0 stylis: 4.3.0
throttle-debounce: 5.0.0 throttle-debounce: 5.0.0
vue: 3.4.16(typescript@5.3.3) vue: 3.4.18(typescript@5.3.3)
vue-types: 3.0.2(vue@3.4.16) vue-types: 3.0.2(vue@3.4.18)
warning: 4.0.3 warning: 4.0.3
dev: false dev: false
@ -1865,7 +1865,7 @@ packages:
resolution: {integrity: sha512-qdwwKEhckRk0XE22/xDdmU3v/60E8Edu4qFhgTLIhGGDs/PAJwLw9pQn8Rj99PitlbBZbYpx0k/lbir4kg0SuA==} resolution: {integrity: sha512-qdwwKEhckRk0XE22/xDdmU3v/60E8Edu4qFhgTLIhGGDs/PAJwLw9pQn8Rj99PitlbBZbYpx0k/lbir4kg0SuA==}
engines: {node: '>=16.14.0'} engines: {node: '>=16.14.0'}
dependencies: dependencies:
'@babel/parser': 7.23.6 '@babel/parser': 7.23.9
'@rollup/pluginutils': 5.1.0 '@rollup/pluginutils': 5.1.0
pathe: 1.1.1 pathe: 1.1.1
transitivePeerDependencies: transitivePeerDependencies:
@ -3756,7 +3756,7 @@ packages:
resolution: {integrity: sha512-0shqecEPgdFpnI3AP90epXyxZy9g6CRZ+SZ7BcqFwYmtFEnZ1jpevcV5HoyVnlDS9gCnc1UIg3Rsvp3Ci7r8OA==} resolution: {integrity: sha512-0shqecEPgdFpnI3AP90epXyxZy9g6CRZ+SZ7BcqFwYmtFEnZ1jpevcV5HoyVnlDS9gCnc1UIg3Rsvp3Ci7r8OA==}
engines: {node: '>=16.14.0'} engines: {node: '>=16.14.0'}
dependencies: dependencies:
magic-string: 0.30.5 magic-string: 0.30.7
dev: true dev: true
/magic-string@0.30.5: /magic-string@0.30.5:
@ -4170,10 +4170,10 @@ packages:
peerDependencies: peerDependencies:
pinia: ^2.0.0 pinia: ^2.0.0
dependencies: dependencies:
pinia: 2.1.7(typescript@5.3.3)(vue@3.4.16) pinia: 2.1.7(typescript@5.3.3)(vue@3.4.18)
dev: false dev: false
/pinia@2.1.7(typescript@5.3.3)(vue@3.4.16): /pinia@2.1.7(typescript@5.3.3)(vue@3.4.18):
resolution: {integrity: sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==} resolution: {integrity: sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==}
peerDependencies: peerDependencies:
'@vue/composition-api': ^1.4.0 '@vue/composition-api': ^1.4.0
@ -4187,8 +4187,8 @@ packages:
dependencies: dependencies:
'@vue/devtools-api': 6.5.1 '@vue/devtools-api': 6.5.1
typescript: 5.3.3 typescript: 5.3.3
vue: 3.4.16(typescript@5.3.3) vue: 3.4.18(typescript@5.3.3)
vue-demi: 0.14.6(vue@3.4.16) vue-demi: 0.14.6(vue@3.4.18)
dev: false dev: false
/pirates@4.0.6: /pirates@4.0.6:
@ -5010,7 +5010,7 @@ packages:
dependencies: dependencies:
'@antfu/utils': 0.7.7 '@antfu/utils': 0.7.7
'@rollup/pluginutils': 5.1.0 '@rollup/pluginutils': 5.1.0
'@vueuse/core': 10.7.2(vue@3.4.16) '@vueuse/core': 10.7.2(vue@3.4.18)
fast-glob: 3.3.2 fast-glob: 3.3.2
local-pkg: 0.5.0 local-pkg: 0.5.0
magic-string: 0.30.5 magic-string: 0.30.5
@ -5021,7 +5021,7 @@ packages:
- rollup - rollup
dev: true dev: true
/unplugin-vue-components@0.26.0(vue@3.4.16): /unplugin-vue-components@0.26.0(vue@3.4.18):
resolution: {integrity: sha512-s7IdPDlnOvPamjunVxw8kNgKNK8A5KM1YpK5j/p97jEKTjlPNrA0nZBiSfAKKlK1gWZuyWXlKL5dk3EDw874LQ==} resolution: {integrity: sha512-s7IdPDlnOvPamjunVxw8kNgKNK8A5KM1YpK5j/p97jEKTjlPNrA0nZBiSfAKKlK1gWZuyWXlKL5dk3EDw874LQ==}
engines: {node: '>=14'} engines: {node: '>=14'}
peerDependencies: peerDependencies:
@ -5044,17 +5044,17 @@ packages:
minimatch: 9.0.3 minimatch: 9.0.3
resolve: 1.22.8 resolve: 1.22.8
unplugin: 1.5.1 unplugin: 1.5.1
vue: 3.4.16(typescript@5.3.3) vue: 3.4.18(typescript@5.3.3)
transitivePeerDependencies: transitivePeerDependencies:
- rollup - rollup
- supports-color - supports-color
dev: true dev: true
/unplugin-vue-define-options@1.4.1(vue@3.4.16): /unplugin-vue-define-options@1.4.1(vue@3.4.18):
resolution: {integrity: sha512-dsI7JZvzCv6hV0Iq8cUKO70gFlsfEmASZzmebVlPzT2Knb57d4Plqjuf0wpU61G2HGSDZ8gy73Nix4FTmFVOyQ==} resolution: {integrity: sha512-dsI7JZvzCv6hV0Iq8cUKO70gFlsfEmASZzmebVlPzT2Knb57d4Plqjuf0wpU61G2HGSDZ8gy73Nix4FTmFVOyQ==}
engines: {node: '>=16.14.0'} engines: {node: '>=16.14.0'}
dependencies: dependencies:
'@vue-macros/common': 1.10.0(vue@3.4.16) '@vue-macros/common': 1.10.0(vue@3.4.18)
ast-walker-scope: 0.5.0 ast-walker-scope: 0.5.0
unplugin: 1.5.1 unplugin: 1.5.1
transitivePeerDependencies: transitivePeerDependencies:
@ -5114,7 +5114,7 @@ packages:
'@types/node': 20.10.2 '@types/node': 20.10.2
rimraf: 5.0.5 rimraf: 5.0.5
typescript: 5.3.3 typescript: 5.3.3
vite: 5.1.0(@types/node@20.10.2)(less@4.2.0) vite: 5.1.1(@types/node@20.10.2)(less@4.2.0)
transitivePeerDependencies: transitivePeerDependencies:
- less - less
- lightningcss - lightningcss
@ -5124,17 +5124,17 @@ packages:
- terser - terser
dev: false dev: false
/vite-svg-loader@5.1.0(vue@3.4.16): /vite-svg-loader@5.1.0(vue@3.4.18):
resolution: {integrity: sha512-M/wqwtOEjgb956/+m5ZrYT/Iq6Hax0OakWbokj8+9PXOnB7b/4AxESHieEtnNEy7ZpjsjYW1/5nK8fATQMmRxw==} resolution: {integrity: sha512-M/wqwtOEjgb956/+m5ZrYT/Iq6Hax0OakWbokj8+9PXOnB7b/4AxESHieEtnNEy7ZpjsjYW1/5nK8fATQMmRxw==}
peerDependencies: peerDependencies:
vue: '>=3.2.13' vue: '>=3.2.13'
dependencies: dependencies:
svgo: 3.0.5 svgo: 3.0.5
vue: 3.4.16(typescript@5.3.3) vue: 3.4.18(typescript@5.3.3)
dev: true dev: true
/vite@5.1.0(@types/node@20.10.2)(less@4.2.0): /vite@5.1.1(@types/node@20.10.2)(less@4.2.0):
resolution: {integrity: sha512-STmSFzhY4ljuhz14bg9LkMTk3d98IO6DIArnTY6MeBwiD1Za2StcQtz7fzOUnRCqrHSD5+OS2reg4HOz1eoLnw==} resolution: {integrity: sha512-wclpAgY3F1tR7t9LL5CcHC41YPkQIpKUGeIuT8MdNwNZr6OqOTLs7JX5vIHAtzqLWXts0T+GDrh9pN2arneKqg==}
engines: {node: ^18.0.0 || >=20.0.0} engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@ -5169,7 +5169,7 @@ packages:
optionalDependencies: optionalDependencies:
fsevents: 2.3.3 fsevents: 2.3.3
/vue-demi@0.14.6(vue@3.4.16): /vue-demi@0.14.6(vue@3.4.18):
resolution: {integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==} resolution: {integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==}
engines: {node: '>=12'} engines: {node: '>=12'}
hasBin: true hasBin: true
@ -5181,7 +5181,7 @@ packages:
'@vue/composition-api': '@vue/composition-api':
optional: true optional: true
dependencies: dependencies:
vue: 3.4.16(typescript@5.3.3) vue: 3.4.18(typescript@5.3.3)
/vue-eslint-parser@9.4.0(eslint@8.56.0): /vue-eslint-parser@9.4.0(eslint@8.56.0):
resolution: {integrity: sha512-7KsNBb6gHFA75BtneJsoK/dbZ281whUIwFYdQxA68QrCrGMXYzUMbPDHGcOQ0OocIVKrWSKWXZ4mL7tonCXoUw==} resolution: {integrity: sha512-7KsNBb6gHFA75BtneJsoK/dbZ281whUIwFYdQxA68QrCrGMXYzUMbPDHGcOQ0OocIVKrWSKWXZ4mL7tonCXoUw==}
@ -5201,13 +5201,13 @@ packages:
- supports-color - supports-color
dev: true dev: true
/vue-router@4.2.5(vue@3.4.16): /vue-router@4.2.5(vue@3.4.18):
resolution: {integrity: sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==} resolution: {integrity: sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==}
peerDependencies: peerDependencies:
vue: ^3.2.0 vue: ^3.2.0
dependencies: dependencies:
'@vue/devtools-api': 6.5.1 '@vue/devtools-api': 6.5.1
vue: 3.4.16(typescript@5.3.3) vue: 3.4.18(typescript@5.3.3)
dev: false dev: false
/vue-template-compiler@2.7.15: /vue-template-compiler@2.7.15:
@ -5229,17 +5229,17 @@ packages:
typescript: 5.3.3 typescript: 5.3.3
dev: true dev: true
/vue-types@3.0.2(vue@3.4.16): /vue-types@3.0.2(vue@3.4.18):
resolution: {integrity: sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==} resolution: {integrity: sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==}
engines: {node: '>=10.15.0'} engines: {node: '>=10.15.0'}
peerDependencies: peerDependencies:
vue: ^3.0.0 vue: ^3.0.0
dependencies: dependencies:
is-plain-object: 3.0.1 is-plain-object: 3.0.1
vue: 3.4.16(typescript@5.3.3) vue: 3.4.18(typescript@5.3.3)
dev: false dev: false
/vue3-ace-editor@2.2.4(ace-builds@1.32.3)(vue@3.4.16): /vue3-ace-editor@2.2.4(ace-builds@1.32.3)(vue@3.4.18):
resolution: {integrity: sha512-FZkEyfpbH068BwjhMyNROxfEI8135Sc+x8ouxkMdCNkuj/Tuw83VP/gStFQqZHqljyX9/VfMTCdTqtOnJZGN8g==} resolution: {integrity: sha512-FZkEyfpbH068BwjhMyNROxfEI8135Sc+x8ouxkMdCNkuj/Tuw83VP/gStFQqZHqljyX9/VfMTCdTqtOnJZGN8g==}
peerDependencies: peerDependencies:
ace-builds: '*' ace-builds: '*'
@ -5247,20 +5247,20 @@ packages:
dependencies: dependencies:
ace-builds: 1.32.3 ace-builds: 1.32.3
resize-observer-polyfill: 1.5.1 resize-observer-polyfill: 1.5.1
vue: 3.4.16(typescript@5.3.3) vue: 3.4.18(typescript@5.3.3)
dev: false dev: false
/vue3-apexcharts@1.4.4(apexcharts@3.45.1)(vue@3.4.16): /vue3-apexcharts@1.4.4(apexcharts@3.45.1)(vue@3.4.18):
resolution: {integrity: sha512-TH89uZrxGjaDvkaYAISvj8+k6Bf1rUKFillc8oJirs5XZEPiwM1ELKZQ786wz0rfPqkSHHny2lqqUCK7Rw+LcQ==} resolution: {integrity: sha512-TH89uZrxGjaDvkaYAISvj8+k6Bf1rUKFillc8oJirs5XZEPiwM1ELKZQ786wz0rfPqkSHHny2lqqUCK7Rw+LcQ==}
peerDependencies: peerDependencies:
apexcharts: '> 3.0.0' apexcharts: '> 3.0.0'
vue: '> 3.0.0' vue: '> 3.0.0'
dependencies: dependencies:
apexcharts: 3.45.1 apexcharts: 3.45.1
vue: 3.4.16(typescript@5.3.3) vue: 3.4.18(typescript@5.3.3)
dev: false dev: false
/vue3-gettext@3.0.0-beta.3(@vue/compiler-sfc@3.4.13)(vue@3.4.16): /vue3-gettext@3.0.0-beta.3(@vue/compiler-sfc@3.4.13)(vue@3.4.18):
resolution: {integrity: sha512-zE6qKEhzlL4R/El9Z6dSg+tmXjfLorG5/Y2o+Z+DMt7dMxeYF3FQbkHzvU7DKZMXkAkkscwspmwsYAXp5ctGdA==} resolution: {integrity: sha512-zE6qKEhzlL4R/El9Z6dSg+tmXjfLorG5/Y2o+Z+DMt7dMxeYF3FQbkHzvU7DKZMXkAkkscwspmwsYAXp5ctGdA==}
engines: {node: '>= 12.0.0'} engines: {node: '>= 12.0.0'}
hasBin: true hasBin: true
@ -5278,31 +5278,31 @@ packages:
parse5-htmlparser2-tree-adapter: 6.0.1 parse5-htmlparser2-tree-adapter: 6.0.1
pofile: 1.1.4 pofile: 1.1.4
tslib: 2.6.2 tslib: 2.6.2
vue: 3.4.16(typescript@5.3.3) vue: 3.4.18(typescript@5.3.3)
dev: false dev: false
/vue@3.4.16(typescript@5.3.3): /vue@3.4.18(typescript@5.3.3):
resolution: {integrity: sha512-l5/KcZRp3GbsFXQGeCL9ll1JfRU285K/7l8mZM+dEO+CnE1j26MvfBKJi17iCRRwstl+Jz7KSLlzj9L79fB6WA==} resolution: {integrity: sha512-0zLRYamFRe0wF4q2L3O24KQzLyLpL64ye1RUToOgOxuWZsb/FhaNRdGmeozdtVYLz6tl94OXLaK7/WQIrVCw1A==}
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
peerDependenciesMeta: peerDependenciesMeta:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@vue/compiler-dom': 3.4.16 '@vue/compiler-dom': 3.4.18
'@vue/compiler-sfc': 3.4.16 '@vue/compiler-sfc': 3.4.18
'@vue/runtime-dom': 3.4.16 '@vue/runtime-dom': 3.4.18
'@vue/server-renderer': 3.4.16(vue@3.4.16) '@vue/server-renderer': 3.4.18(vue@3.4.18)
'@vue/shared': 3.4.16 '@vue/shared': 3.4.18
typescript: 5.3.3 typescript: 5.3.3
/vuedraggable@4.1.0(vue@3.4.16): /vuedraggable@4.1.0(vue@3.4.18):
resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==} resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==}
peerDependencies: peerDependencies:
vue: ^3.0.1 vue: ^3.0.1
dependencies: dependencies:
sortablejs: 1.14.0 sortablejs: 1.14.0
vue: 3.4.16(typescript@5.3.3) vue: 3.4.18(typescript@5.3.3)
dev: false dev: false
/warning@4.0.3: /warning@4.0.3:

View file

@ -25,6 +25,11 @@ export interface CertificateInfo {
not_before: string not_before: string
} }
export interface CertificateResult {
ssl_certificate: string
ssl_certificate_key: string
}
const cert: Curd<Cert> = new Curd('/cert') const cert: Curd<Cert> = new Curd('/cert')
export default cert export default cert

View file

@ -1 +1 @@
{"version":"2.0.0-beta.14","build_id":114,"total_build":318} {"version":"2.0.0-beta.14","build_id":116,"total_build":320}

View file

@ -21,7 +21,7 @@ const data = inject('data') as Ref<Cert>
const issueCert = () => { const issueCert = () => {
modalVisible.value = true modalVisible.value = true
refObtainCertLive.value.issue_cert(data.value.name, data.value.domains, () => { refObtainCertLive.value.issue_cert(data.value.name, data.value.domains).then(() => {
message.success($gettext('Renew successfully')) message.success($gettext('Renew successfully'))
emit('renewed') emit('renewed')
}) })

View file

@ -20,6 +20,7 @@ provide('data', data)
provide('issuing_cert', issuing_cert) provide('issuing_cert', issuing_cert)
function open() { function open() {
visible.value = true visible.value = true
step.value = 0
data.value = { data.value = {
challenge_method: 'dns01', challenge_method: 'dns01',
} as Cert } as Cert
@ -43,7 +44,7 @@ const issueCert = () => {
step.value++ step.value++
modalVisible.value = true modalVisible.value = true
refObtainCertLive.value.issue_cert(computedDomain.value, [computedDomain.value, domain.value], () => { refObtainCertLive.value.issue_cert(computedDomain.value, [computedDomain.value, domain.value]).then(() => {
message.success($gettext('Renew successfully')) message.success($gettext('Renew successfully'))
emit('issued') emit('issued')
}) })

View file

@ -8,6 +8,7 @@ import type { NgxConfig, NgxDirective } from '@/api/ngx'
import type { Props } from '@/views/domain/cert/IssueCert.vue' import type { Props } from '@/views/domain/cert/IssueCert.vue'
import type { DnsChallenge } from '@/api/auto_cert' import type { DnsChallenge } from '@/api/auto_cert'
import ObtainCertLive from '@/views/domain/cert/components/ObtainCertLive.vue' import ObtainCertLive from '@/views/domain/cert/components/ObtainCertLive.vue'
import type { CertificateResult } from '@/api/cert'
const emit = defineEmits(['update:auto_cert']) const emit = defineEmits(['update:auto_cert'])
@ -47,10 +48,10 @@ const name = computed(() => {
const refObtainCertLive = ref() const refObtainCertLive = ref()
const issue_cert = (config_name: string, server_name: string) => { const issue_cert = (config_name: string, server_name: string) => {
refObtainCertLive.value.issue_cert(config_name, server_name.trim().split(' '), callback) refObtainCertLive.value.issue_cert(config_name, server_name.trim().split(' ')).then(resolveCert)
} }
async function callback(ssl_certificate: string, ssl_certificate_key: string) { async function resolveCert({ ssl_certificate, ssl_certificate_key }: CertificateResult) {
directivesMap.value.ssl_certificate[0].params = ssl_certificate directivesMap.value.ssl_certificate[0].params = ssl_certificate
directivesMap.value.ssl_certificate_key[0].params = ssl_certificate_key directivesMap.value.ssl_certificate_key[0].params = ssl_certificate_key
await save_config() await save_config()

View file

@ -3,6 +3,8 @@ import type { Ref } from 'vue'
import { useGettext } from 'vue3-gettext' import { useGettext } from 'vue3-gettext'
import websocket from '@/lib/websocket' import websocket from '@/lib/websocket'
import type { DnsChallenge } from '@/api/auto_cert' import type { DnsChallenge } from '@/api/auto_cert'
import Error from '@/views/other/Error.vue'
import type { CertificateResult } from '@/api/cert'
const props = defineProps<{ const props = defineProps<{
modalClosable: boolean modalClosable: boolean
@ -57,64 +59,65 @@ function log(msg: string) {
logContainer.value?.scroll({ top: 100000, left: 0, behavior: 'smooth' }) logContainer.value?.scroll({ top: 100000, left: 0, behavior: 'smooth' })
} }
const issue_cert = async (config_name: string, server_name: string[], const issue_cert = async (config_name: string, server_name: string[]) => {
callback?: (ssl_certificate: string, ssl_certificate_key: string) => void) => { return new Promise<CertificateResult>((resolve, reject) => {
progressStatus.value = 'active' progressStatus.value = 'active'
modalClosable.value = false modalClosable.value = false
modalVisible.value = true modalVisible.value = true
progressPercent.value = 0 progressPercent.value = 0
logContainer.value.innerHTML = '' logContainer.value.innerHTML = ''
log($gettext('Getting the certificate, please wait...')) log($gettext('Getting the certificate, please wait...'))
const ws = websocket(`/api/domain/${config_name}/cert`, false) const ws = websocket(`/api/domain/${config_name}/cert`, false)
ws.onopen = () => { ws.onopen = () => {
ws.send(JSON.stringify({ ws.send(JSON.stringify({
server_name, server_name,
...data.value, ...data.value,
})) }))
}
ws.onmessage = async m => {
const r = JSON.parse(m.data)
const regex = /\[Nginx UI\] (.*)/
const matches = r.message.match(regex)
if (matches && matches.length > 1) {
const extractedText = matches[1]
r.message = r.message.replaceAll(extractedText, $gettext(extractedText))
} }
log(r.message) ws.onmessage = async m => {
const r = JSON.parse(m.data)
// eslint-disable-next-line sonarjs/no-small-switch const regex = /\[Nginx UI\] (.*)/
switch (r.status) {
case 'info':
// If it is a nginx ui log, increase the percent.
if (r.message.includes('[Nginx UI]'))
progressPercent.value += 5
break const matches = r.message.match(regex)
default:
modalClosable.value = true
issuing_cert.value = false
if (r.status === 'success' && r.ssl_certificate !== undefined && r.ssl_certificate_key !== undefined) { if (matches && matches.length > 1) {
progressStatus.value = 'success' const extractedText = matches[1]
progressPercent.value = 100
if (callback) r.message = r.message.replaceAll(extractedText, $gettext(extractedText))
callback(r.ssl_certificate, r.ssl_certificate_key) }
}
else { log(r.message)
progressStatus.value = 'exception'
} // eslint-disable-next-line sonarjs/no-small-switch
break switch (r.status) {
case 'info':
// If it is a nginx ui log, increase the percent.
if (r.message.includes('[Nginx UI]'))
progressPercent.value += 8
break
default:
modalClosable.value = true
issuing_cert.value = false
if (r.status === 'success' && r.ssl_certificate !== undefined && r.ssl_certificate_key !== undefined) {
progressStatus.value = 'success'
progressPercent.value = 100
resolve({ ssl_certificate: r.ssl_certificate, ssl_certificate_key: r.ssl_certificate_key })
}
else {
progressStatus.value = 'exception'
reject(new Error($gettext('Fail to obtain certificate')))
}
break
}
} }
} })
} }
defineExpose({ defineExpose({
@ -143,6 +146,7 @@ defineExpose({
background-color: rgba(0, 0, 0, 0.84); background-color: rgba(0, 0, 0, 0.84);
} }
} }
.issue-cert-log-container { .issue-cert-log-container {
height: 320px; height: 320px;
overflow: scroll; overflow: scroll;

View file

@ -1 +1 @@
{"version":"2.0.0-beta.14","build_id":114,"total_build":318} {"version":"2.0.0-beta.14","build_id":116,"total_build":320}

View file

@ -1,216 +1,216 @@
package cert package cert
import ( import (
"crypto/ecdsa" "crypto/ecdsa"
"crypto/elliptic" "crypto/elliptic"
"crypto/rand" "crypto/rand"
"crypto/tls" "crypto/tls"
"github.com/0xJacky/Nginx-UI/internal/cert/dns" "github.com/0xJacky/Nginx-UI/internal/cert/dns"
"github.com/0xJacky/Nginx-UI/internal/logger" "github.com/0xJacky/Nginx-UI/internal/logger"
"github.com/0xJacky/Nginx-UI/internal/nginx" "github.com/0xJacky/Nginx-UI/internal/nginx"
"github.com/0xJacky/Nginx-UI/query" "github.com/0xJacky/Nginx-UI/query"
"github.com/0xJacky/Nginx-UI/settings" "github.com/0xJacky/Nginx-UI/settings"
"github.com/go-acme/lego/v4/certcrypto" "github.com/go-acme/lego/v4/certcrypto"
"github.com/go-acme/lego/v4/certificate" "github.com/go-acme/lego/v4/certificate"
"github.com/go-acme/lego/v4/challenge/http01" "github.com/go-acme/lego/v4/challenge/http01"
"github.com/go-acme/lego/v4/lego" "github.com/go-acme/lego/v4/lego"
legolog "github.com/go-acme/lego/v4/log" legolog "github.com/go-acme/lego/v4/log"
dnsproviders "github.com/go-acme/lego/v4/providers/dns" dnsproviders "github.com/go-acme/lego/v4/providers/dns"
"github.com/go-acme/lego/v4/registration" "github.com/go-acme/lego/v4/registration"
"github.com/pkg/errors" "github.com/pkg/errors"
"log" "log"
"net/http" "net/http"
"os" "os"
"path/filepath" "path/filepath"
"strings" "strings"
"time" "time"
) )
const ( const (
HTTP01 = "http01" HTTP01 = "http01"
DNS01 = "dns01" DNS01 = "dns01"
) )
type ConfigPayload struct { type ConfigPayload struct {
ServerName []string `json:"server_name"` ServerName []string `json:"server_name"`
ChallengeMethod string `json:"challenge_method"` ChallengeMethod string `json:"challenge_method"`
DNSCredentialID int `json:"dns_credential_id"` DNSCredentialID int `json:"dns_credential_id"`
} }
func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error) { func IssueCert(payload *ConfigPayload, logChan chan string, errChan chan error) {
defer func() { defer func() {
if err := recover(); err != nil { if err := recover(); err != nil {
logger.Error(err) logger.Error(err)
} }
}() }()
// initial a channelWriter to receive logs // initial a channelWriter to receive logs
cw := NewChannelWriter() cw := NewChannelWriter()
defer close(errChan) defer close(errChan)
// initial a logger // initial a logger
l := log.New(os.Stderr, "", log.LstdFlags) l := log.New(os.Stderr, "", log.LstdFlags)
l.SetOutput(cw) l.SetOutput(cw)
// Hijack the (logger) of lego // Hijack the (logger) of lego
legolog.Logger = l legolog.Logger = l
domain := payload.ServerName domain := payload.ServerName
// Create a user. New accounts need an email and private key to start. // Create a user. New accounts need an email and private key to start.
l.Println("[INFO] [Nginx UI] Generating private key for registering account") l.Println("[INFO] [Nginx UI] Generating private key for registering account")
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil { if err != nil {
errChan <- errors.Wrap(err, "issue cert generate key error") errChan <- errors.Wrap(err, "issue cert generate key error")
return return
} }
l.Println("[INFO] [Nginx UI] Preparing lego configurations") l.Println("[INFO] [Nginx UI] Preparing lego configurations")
user := User{ user := User{
Email: settings.ServerSettings.Email, Email: settings.ServerSettings.Email,
Key: privateKey, Key: privateKey,
} }
// Start a goroutine to fetch and process logs from channel // Start a goroutine to fetch and process logs from channel
go func() { go func() {
for msg := range cw.Ch { for msg := range cw.Ch {
logChan <- string(msg) logChan <- string(msg)
} }
}() }()
config := lego.NewConfig(&user) config := lego.NewConfig(&user)
if settings.ServerSettings.Demo { if settings.ServerSettings.Demo {
config.CADirURL = "https://acme-staging-v02.api.letsencrypt.org/directory" config.CADirURL = "https://acme-staging-v02.api.letsencrypt.org/directory"
} }
if settings.ServerSettings.CADir != "" { if settings.ServerSettings.CADir != "" {
config.CADirURL = settings.ServerSettings.CADir config.CADirURL = settings.ServerSettings.CADir
if config.HTTPClient != nil { if config.HTTPClient != nil {
config.HTTPClient.Transport = &http.Transport{ config.HTTPClient.Transport = &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
} }
} }
} }
config.Certificate.KeyType = certcrypto.RSA2048 config.Certificate.KeyType = certcrypto.RSA2048
l.Println("[INFO] [Nginx UI] Creating client facilitates communication with the CA server") l.Println("[INFO] [Nginx UI] Creating client facilitates communication with the CA server")
// A client facilitates communication with the CA server. // A client facilitates communication with the CA server.
client, err := lego.NewClient(config) client, err := lego.NewClient(config)
if err != nil { if err != nil {
errChan <- errors.Wrap(err, "issue cert new client error") errChan <- errors.Wrap(err, "issue cert new client error")
return return
} }
switch payload.ChallengeMethod { switch payload.ChallengeMethod {
default: default:
fallthrough fallthrough
case HTTP01: case HTTP01:
l.Println("[INFO] [Nginx UI] Setting HTTP01 challenge provider") l.Println("[INFO] [Nginx UI] Setting HTTP01 challenge provider")
err = client.Challenge.SetHTTP01Provider( err = client.Challenge.SetHTTP01Provider(
http01.NewProviderServer("", http01.NewProviderServer("",
settings.ServerSettings.HTTPChallengePort, settings.ServerSettings.HTTPChallengePort,
), ),
) )
case DNS01: case DNS01:
d := query.DnsCredential d := query.DnsCredential
dnsCredential, err := d.FirstByID(payload.DNSCredentialID) dnsCredential, err := d.FirstByID(payload.DNSCredentialID)
if err != nil { if err != nil {
errChan <- errors.Wrap(err, "get dns credential error") errChan <- errors.Wrap(err, "get dns credential error")
return return
} }
l.Println("[INFO] [Nginx UI] Setting DNS01 challenge provider") l.Println("[INFO] [Nginx UI] Setting DNS01 challenge provider")
code := dnsCredential.Config.Code code := dnsCredential.Config.Code
pConfig, ok := dns.GetProvider(code) pConfig, ok := dns.GetProvider(code)
if !ok { if !ok {
errChan <- errors.Wrap(err, "provider not found") errChan <- errors.Wrap(err, "provider not found")
} }
l.Println("[INFO] [Nginx UI] Setting environment variables") l.Println("[INFO] [Nginx UI] Setting environment variables")
if dnsCredential.Config.Configuration != nil { if dnsCredential.Config.Configuration != nil {
err = pConfig.SetEnv(*dnsCredential.Config.Configuration) err = pConfig.SetEnv(*dnsCredential.Config.Configuration)
if err != nil { if err != nil {
break break
} }
defer func() { defer func() {
pConfig.CleanEnv() pConfig.CleanEnv()
l.Println("[INFO] [Nginx UI] Cleaned environment variables") l.Println("[INFO] [Nginx UI] Cleaned environment variables")
}() }()
provider, err := dnsproviders.NewDNSChallengeProviderByName(code) provider, err := dnsproviders.NewDNSChallengeProviderByName(code)
if err != nil { if err != nil {
break break
} }
err = client.Challenge.SetDNS01Provider(provider) err = client.Challenge.SetDNS01Provider(provider)
} else { } else {
errChan <- errors.Wrap(err, "environment configuration is empty") errChan <- errors.Wrap(err, "environment configuration is empty")
return return
} }
} }
if err != nil { if err != nil {
errChan <- errors.Wrap(err, "challenge error") errChan <- errors.Wrap(err, "challenge error")
return return
} }
// New users will need to register // New users will need to register
l.Println("[INFO] [Nginx UI] Registering user") l.Println("[INFO] [Nginx UI] Registering user")
reg, err := client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true}) reg, err := client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true})
if err != nil { if err != nil {
errChan <- errors.Wrap(err, "register error") errChan <- errors.Wrap(err, "register error")
return return
} }
user.Registration = reg user.Registration = reg
request := certificate.ObtainRequest{ request := certificate.ObtainRequest{
Domains: domain, Domains: domain,
Bundle: true, Bundle: true,
} }
l.Println("[INFO] [Nginx UI] Obtaining certificate") l.Println("[INFO] [Nginx UI] Obtaining certificate")
certificates, err := client.Certificate.Obtain(request) certificates, err := client.Certificate.Obtain(request)
if err != nil { if err != nil {
errChan <- errors.Wrap(err, "obtain certificate error") errChan <- errors.Wrap(err, "obtain certificate error")
return return
} }
name := strings.Join(domain, "_") name := strings.Join(domain, "_")
saveDir := nginx.GetConfPath("ssl/" + name) saveDir := nginx.GetConfPath("ssl/" + name)
if _, err = os.Stat(saveDir); os.IsNotExist(err) { if _, err = os.Stat(saveDir); os.IsNotExist(err) {
err = os.MkdirAll(saveDir, 0755) err = os.MkdirAll(saveDir, 0755)
if err != nil { if err != nil {
errChan <- errors.Wrap(err, "mkdir error") errChan <- errors.Wrap(err, "mkdir error")
return return
} }
} }
// Each certificate comes back with the cert bytes, the bytes of the client's // Each certificate comes back with the cert bytes, the bytes of the client's
// private key, and a certificate URL. SAVE THESE TO DISK. // private key, and a certificate URL. SAVE THESE TO DISK.
l.Println("[INFO] [Nginx UI] Writing certificate to disk") l.Println("[INFO] [Nginx UI] Writing certificate to disk")
err = os.WriteFile(filepath.Join(saveDir, "fullchain.cer"), err = os.WriteFile(filepath.Join(saveDir, "fullchain.cer"),
certificates.Certificate, 0644) certificates.Certificate, 0644)
if err != nil { if err != nil {
errChan <- errors.Wrap(err, "write fullchain.cer error") errChan <- errors.Wrap(err, "write fullchain.cer error")
return return
} }
l.Println("[INFO] [Nginx UI] Writing certificate private key to disk") l.Println("[INFO] [Nginx UI] Writing certificate private key to disk")
err = os.WriteFile(filepath.Join(saveDir, "private.key"), err = os.WriteFile(filepath.Join(saveDir, "private.key"),
certificates.PrivateKey, 0644) certificates.PrivateKey, 0644)
if err != nil { if err != nil {
errChan <- errors.Wrap(err, "write private.key error") errChan <- errors.Wrap(err, "write private.key error")
return return
} }
l.Println("[INFO] [Nginx UI] Reloading nginx") l.Println("[INFO] [Nginx UI] Reloading nginx")
nginx.Reload() nginx.Reload()
l.Println("[INFO] [Nginx UI] Finished") l.Println("[INFO] [Nginx UI] Finished")
// Wait log to be written // Wait log to be written
time.Sleep(5 * time.Second) time.Sleep(2 * time.Second)
} }