瀏覽代碼

Refactored issue certificate

0xJacky 2 年之前
父節點
當前提交
5178d1e808

+ 1 - 0
frontend/components.d.ts

@@ -32,6 +32,7 @@ declare module '@vue/runtime-core' {
     AModal: typeof import('ant-design-vue/es')['Modal']
     APagination: typeof import('ant-design-vue/es')['Pagination']
     APopconfirm: typeof import('ant-design-vue/es')['Popconfirm']
+    AProgress: typeof import('ant-design-vue/es')['Progress']
     AreaChart: typeof import('./src/components/Chart/AreaChart.vue')['default']
     AResult: typeof import('ant-design-vue/es')['Result']
     ARow: typeof import('ant-design-vue/es')['Row']

+ 4 - 0
frontend/src/dark.less

@@ -3,3 +3,7 @@
 .directive-editor-extra {
     background-color: rgba(0, 0, 0, 0.84) !important;
 }
+
+.issue-cert-log-container {
+    background-color: rgba(0, 0, 0, 0.84) !important;
+}

+ 11 - 0
frontend/src/language/constants.ts

@@ -7,4 +7,15 @@ export const msg = [
     $gettext('Prohibit changing root password in demo'),
     $gettext('Prohibit deleting the default user'),
     $gettext('Failed to get certificate information'),
+
+    $gettext('Generating private key for registering account'),
+    $gettext('Preparing lego configurations'),
+    $gettext('Creating client facilitates communication with the CA server'),
+    $gettext('Using HTTP01 challenge provider'),
+    $gettext('Registering user'),
+    $gettext('Obtaining certificate'),
+    $gettext('Writing certificate to disk'),
+    $gettext('Writing certificate private key to disk'),
+    $gettext('Reloading nginx'),
+    $gettext('Finished')
 ]

+ 56 - 20
frontend/src/language/en/app.po

@@ -60,7 +60,7 @@ msgstr "Auto-renewal disabled for %{name}"
 msgid "Auto-renewal enabled for %{name}"
 msgstr "Auto-renewal enabled for %{name}"
 
-#: src/views/domain/DomainEdit.vue:166
+#: src/views/domain/DomainEdit.vue:178
 msgid "Back"
 msgstr "Back"
 
@@ -86,22 +86,22 @@ msgstr "Build with"
 msgid "Cancel"
 msgstr "Cancel"
 
-#: src/views/domain/cert/CertInfo.vue:40
+#: src/views/domain/cert/CertInfo.vue:24
 msgid "Certificate has expired"
 msgstr "Certificate has expired"
 
-#: src/views/domain/cert/CertInfo.vue:44
+#: src/views/domain/cert/CertInfo.vue:28
 msgid "Certificate is valid"
 msgstr "Certificate is valid"
 
-#: src/views/domain/cert/CertInfo.vue:30
+#: src/views/domain/cert/CertInfo.vue:14
 msgid "Certificate Status"
 msgstr "Certificate Status"
 
 #: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:29
 #: src/views/domain/ngx_conf/LocationEditor.vue:21
 #: src/views/domain/ngx_conf/LocationEditor.vue:7
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:154
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:155
 msgid "Comments"
 msgstr "Comments"
 
@@ -138,6 +138,10 @@ msgstr "Create Another"
 msgid "Created at"
 msgstr "Created at"
 
+#: src/language/constants.ts:13
+msgid "Creating client facilitates communication with the CA server"
+msgstr ""
+
 #: src/routes/index.ts:26
 msgid "Dashboard"
 msgstr "Dashboard"
@@ -180,7 +184,7 @@ msgstr "Disable auto-renewal failed for %{name}"
 msgid "Disabled"
 msgstr "Disabled"
 
-#: src/views/domain/DomainEdit.vue:101 src/views/domain/DomainList.vue:64
+#: src/views/domain/DomainEdit.vue:112 src/views/domain/DomainList.vue:64
 msgid "Disabled successfully"
 msgstr "Disabled successfully"
 
@@ -226,7 +230,7 @@ msgstr "Enable TLS"
 msgid "Enabled"
 msgstr "Enabled"
 
-#: src/views/domain/DomainAdd.vue:46 src/views/domain/DomainEdit.vue:92
+#: src/views/domain/DomainAdd.vue:46 src/views/domain/DomainEdit.vue:103
 #: src/views/domain/DomainList.vue:54
 msgid "Enabled successfully"
 msgstr "Enabled successfully"
@@ -235,15 +239,15 @@ msgstr "Enabled successfully"
 msgid "Encrypt website with Let's Encrypt"
 msgstr "Encrypt website with Let's Encrypt"
 
-#: src/views/domain/cert/CertInfo.vue:33
+#: src/views/domain/cert/CertInfo.vue:17
 msgid "Expiration Date: %{date}"
 msgstr "Expiration Date: %{date}"
 
-#: src/views/domain/DomainEdit.vue:104 src/views/domain/DomainList.vue:68
+#: src/views/domain/DomainEdit.vue:115 src/views/domain/DomainList.vue:68
 msgid "Failed to disable %{msg}"
 msgstr "Failed to disable %{msg}"
 
-#: src/views/domain/DomainEdit.vue:95 src/views/domain/DomainList.vue:58
+#: src/views/domain/DomainEdit.vue:106 src/views/domain/DomainList.vue:58
 msgid "Failed to enable %{msg}"
 msgstr "Failed to enable %{msg}"
 
@@ -255,10 +259,14 @@ msgstr ""
 msgid "File Not Found"
 msgstr "File Not Found"
 
-#: src/views/domain/DomainAdd.vue:7
+#: src/language/constants.ts:20 src/views/domain/DomainAdd.vue:7
 msgid "Finished"
 msgstr "Finished"
 
+#: src/language/constants.ts:11
+msgid "Generating private key for registering account"
+msgstr ""
+
 #: src/views/domain/cert/IssueCert.vue:85
 msgid "Getting the certificate, please wait..."
 msgstr "Getting the certificate, please wait..."
@@ -276,7 +284,7 @@ msgstr "Install"
 msgid "Install successfully"
 msgstr "Enabled successfully"
 
-#: src/views/domain/cert/CertInfo.vue:31
+#: src/views/domain/cert/CertInfo.vue:15
 msgid "Intermediate Certification Authorities: %{issuer}"
 msgstr "Intermediate Certification Authorities: %{issuer}"
 
@@ -384,7 +392,7 @@ msgstr "No"
 msgid "Not Found"
 msgstr "Not Found"
 
-#: src/views/domain/cert/CertInfo.vue:35
+#: src/views/domain/cert/CertInfo.vue:19
 msgid "Not Valid Before: %{date}"
 msgstr "Not Valid Before: %{date}"
 
@@ -396,6 +404,10 @@ msgstr ""
 "Note: The server_name in the current configuration must be the domain name "
 "you need to get the certificate."
 
+#: src/language/constants.ts:16
+msgid "Obtaining certificate"
+msgstr ""
+
 #: src/components/StdDataDisplay/StdCurd.vue:27
 #: src/components/StdDataDisplay/StdTable.vue:40
 #: src/views/domain/DomainList.vue:26
@@ -435,6 +447,11 @@ msgstr "Please input your password!"
 msgid "Please input your username!"
 msgstr "Please input your username!"
 
+#: src/language/constants.ts:12
+#, fuzzy
+msgid "Preparing lego configurations"
+msgstr "Configurations"
+
 #: src/language/constants.ts:7
 msgid "Prohibit changing root password in demo"
 msgstr ""
@@ -455,11 +472,19 @@ msgstr "Reads"
 msgid "Receive"
 msgstr "Receive"
 
+#: src/language/constants.ts:15
+msgid "Registering user"
+msgstr ""
+
+#: src/language/constants.ts:19
+msgid "Reloading nginx"
+msgstr ""
+
 #: src/components/StdDataDisplay/StdTable.vue:187
 msgid "Reset"
 msgstr ""
 
-#: src/views/config/ConfigEdit.vue:52 src/views/domain/DomainEdit.vue:169
+#: src/views/config/ConfigEdit.vue:52 src/views/domain/DomainEdit.vue:181
 msgid "Save"
 msgstr "Save"
 
@@ -479,7 +504,7 @@ msgid "Save Successfully"
 msgstr "Saved successfully"
 
 #: src/views/config/ConfigEdit.vue:34 src/views/domain/DomainAdd.vue:43
-#: src/views/domain/DomainEdit.vue:80
+#: src/views/domain/DomainEdit.vue:91
 msgid "Saved successfully"
 msgstr "Saved successfully"
 
@@ -488,10 +513,9 @@ msgid "Send"
 msgstr "Send"
 
 #: src/components/StdDataDisplay/StdTable.vue:112
-#: src/components/StdDataDisplay/StdTable.vue:94
-#: src/views/config/ConfigEdit.vue:22 src/views/domain/DomainEdit.vue:44
-#: src/views/domain/DomainEdit.vue:56 src/views/domain/DomainEdit.vue:65
-#: src/views/domain/DomainEdit.vue:83 src/views/domain/DomainList.vue:78
+#: src/views/config/ConfigEdit.vue:22 src/views/domain/DomainEdit.vue:56
+#: src/views/domain/DomainEdit.vue:68 src/views/domain/DomainEdit.vue:77
+#: src/views/domain/DomainEdit.vue:94 src/views/domain/DomainList.vue:78
 #: src/views/other/Install.vue:71
 msgid "Server error"
 msgstr "Server error"
@@ -529,7 +553,7 @@ msgstr "Status"
 msgid "Storage"
 msgstr "Storage"
 
-#: src/views/domain/cert/CertInfo.vue:32
+#: src/views/domain/cert/CertInfo.vue:16
 msgid "Subject Name: %{name}"
 msgstr "Subject Name: %{name}"
 
@@ -579,6 +603,10 @@ msgstr "Username"
 msgid "Username (*)"
 msgstr "Username (*)"
 
+#: src/language/constants.ts:14
+msgid "Using HTTP01 challenge provider"
+msgstr ""
+
 #: src/views/domain/cert/IssueCert.vue:12 src/views/domain/DomainAdd.vue:24
 msgid "Warning"
 msgstr "Warning"
@@ -588,6 +616,14 @@ msgstr "Warning"
 msgid "Writes"
 msgstr "Writes"
 
+#: src/language/constants.ts:18
+msgid "Writing certificate private key to disk"
+msgstr ""
+
+#: src/language/constants.ts:17
+msgid "Writing certificate to disk"
+msgstr ""
+
 #: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:16
 msgid "Yes"
 msgstr "Yes"

+ 55 - 19
frontend/src/language/messages.pot

@@ -54,7 +54,7 @@ msgstr ""
 msgid "Auto-renewal enabled for %{name}"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:166
+#: src/views/domain/DomainEdit.vue:178
 msgid "Back"
 msgstr ""
 
@@ -79,22 +79,22 @@ msgstr ""
 msgid "Cancel"
 msgstr ""
 
-#: src/views/domain/cert/CertInfo.vue:40
+#: src/views/domain/cert/CertInfo.vue:24
 msgid "Certificate has expired"
 msgstr ""
 
-#: src/views/domain/cert/CertInfo.vue:44
+#: src/views/domain/cert/CertInfo.vue:28
 msgid "Certificate is valid"
 msgstr ""
 
-#: src/views/domain/cert/CertInfo.vue:30
+#: src/views/domain/cert/CertInfo.vue:14
 msgid "Certificate Status"
 msgstr ""
 
 #: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:29
 #: src/views/domain/ngx_conf/LocationEditor.vue:21
 #: src/views/domain/ngx_conf/LocationEditor.vue:7
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:154
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:155
 msgid "Comments"
 msgstr ""
 
@@ -131,6 +131,10 @@ msgstr ""
 msgid "Created at"
 msgstr ""
 
+#: src/language/constants.ts:13
+msgid "Creating client facilitates communication with the CA server"
+msgstr ""
+
 #: src/routes/index.ts:26
 msgid "Dashboard"
 msgstr ""
@@ -175,7 +179,7 @@ msgstr ""
 msgid "Disabled"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:101
+#: src/views/domain/DomainEdit.vue:112
 #: src/views/domain/DomainList.vue:64
 msgid "Disabled successfully"
 msgstr ""
@@ -226,7 +230,7 @@ msgid "Enabled"
 msgstr ""
 
 #: src/views/domain/DomainAdd.vue:46
-#: src/views/domain/DomainEdit.vue:92
+#: src/views/domain/DomainEdit.vue:103
 #: src/views/domain/DomainList.vue:54
 msgid "Enabled successfully"
 msgstr ""
@@ -235,16 +239,16 @@ msgstr ""
 msgid "Encrypt website with Let's Encrypt"
 msgstr ""
 
-#: src/views/domain/cert/CertInfo.vue:33
+#: src/views/domain/cert/CertInfo.vue:17
 msgid "Expiration Date: %{date}"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:104
+#: src/views/domain/DomainEdit.vue:115
 #: src/views/domain/DomainList.vue:68
 msgid "Failed to disable %{msg}"
 msgstr ""
 
-#: src/views/domain/DomainEdit.vue:95
+#: src/views/domain/DomainEdit.vue:106
 #: src/views/domain/DomainList.vue:58
 msgid "Failed to enable %{msg}"
 msgstr ""
@@ -258,10 +262,15 @@ msgstr ""
 msgid "File Not Found"
 msgstr ""
 
+#: src/language/constants.ts:20
 #: src/views/domain/DomainAdd.vue:7
 msgid "Finished"
 msgstr ""
 
+#: src/language/constants.ts:11
+msgid "Generating private key for registering account"
+msgstr ""
+
 #: src/views/domain/cert/IssueCert.vue:85
 msgid "Getting the certificate, please wait..."
 msgstr ""
@@ -279,7 +288,7 @@ msgstr ""
 msgid "Install successfully"
 msgstr ""
 
-#: src/views/domain/cert/CertInfo.vue:31
+#: src/views/domain/cert/CertInfo.vue:15
 msgid "Intermediate Certification Authorities: %{issuer}"
 msgstr ""
 
@@ -387,7 +396,7 @@ msgstr ""
 msgid "Not Found"
 msgstr ""
 
-#: src/views/domain/cert/CertInfo.vue:35
+#: src/views/domain/cert/CertInfo.vue:19
 msgid "Not Valid Before: %{date}"
 msgstr ""
 
@@ -395,6 +404,10 @@ msgstr ""
 msgid "Note: The server_name in the current configuration must be the domain name you need to get the certificate."
 msgstr ""
 
+#: src/language/constants.ts:16
+msgid "Obtaining certificate"
+msgstr ""
+
 #: src/components/StdDataDisplay/StdCurd.vue:27
 #: src/components/StdDataDisplay/StdTable.vue:40
 #: src/views/domain/DomainList.vue:26
@@ -437,6 +450,10 @@ msgstr ""
 msgid "Please input your username!"
 msgstr ""
 
+#: src/language/constants.ts:12
+msgid "Preparing lego configurations"
+msgstr ""
+
 #: src/language/constants.ts:7
 msgid "Prohibit changing root password in demo"
 msgstr ""
@@ -458,12 +475,20 @@ msgstr ""
 msgid "Receive"
 msgstr ""
 
+#: src/language/constants.ts:15
+msgid "Registering user"
+msgstr ""
+
+#: src/language/constants.ts:19
+msgid "Reloading nginx"
+msgstr ""
+
 #: src/components/StdDataDisplay/StdTable.vue:187
 msgid "Reset"
 msgstr ""
 
 #: src/views/config/ConfigEdit.vue:52
-#: src/views/domain/DomainEdit.vue:169
+#: src/views/domain/DomainEdit.vue:181
 msgid "Save"
 msgstr ""
 
@@ -484,7 +509,7 @@ msgstr ""
 
 #: src/views/config/ConfigEdit.vue:34
 #: src/views/domain/DomainAdd.vue:43
-#: src/views/domain/DomainEdit.vue:80
+#: src/views/domain/DomainEdit.vue:91
 msgid "Saved successfully"
 msgstr ""
 
@@ -494,12 +519,11 @@ msgid "Send"
 msgstr ""
 
 #: src/components/StdDataDisplay/StdTable.vue:112
-#: src/components/StdDataDisplay/StdTable.vue:94
 #: src/views/config/ConfigEdit.vue:22
-#: src/views/domain/DomainEdit.vue:44
 #: src/views/domain/DomainEdit.vue:56
-#: src/views/domain/DomainEdit.vue:65
-#: src/views/domain/DomainEdit.vue:83
+#: src/views/domain/DomainEdit.vue:68
+#: src/views/domain/DomainEdit.vue:77
+#: src/views/domain/DomainEdit.vue:94
 #: src/views/domain/DomainList.vue:78
 #: src/views/other/Install.vue:71
 msgid "Server error"
@@ -539,7 +563,7 @@ msgstr ""
 msgid "Storage"
 msgstr ""
 
-#: src/views/domain/cert/CertInfo.vue:32
+#: src/views/domain/cert/CertInfo.vue:16
 msgid "Subject Name: %{name}"
 msgstr ""
 
@@ -587,6 +611,10 @@ msgstr ""
 msgid "Username (*)"
 msgstr ""
 
+#: src/language/constants.ts:14
+msgid "Using HTTP01 challenge provider"
+msgstr ""
+
 #: src/views/domain/cert/IssueCert.vue:12
 #: src/views/domain/DomainAdd.vue:24
 msgid "Warning"
@@ -598,6 +626,14 @@ msgstr ""
 msgid "Writes"
 msgstr ""
 
+#: src/language/constants.ts:18
+msgid "Writing certificate private key to disk"
+msgstr ""
+
+#: src/language/constants.ts:17
+msgid "Writing certificate to disk"
+msgstr ""
+
 #: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:16
 msgid "Yes"
 msgstr ""

File diff suppressed because it is too large
+ 0 - 0
frontend/src/language/translations.json


二進制
frontend/src/language/zh_CN/app.mo


+ 55 - 20
frontend/src/language/zh_CN/app.po

@@ -62,7 +62,7 @@ msgstr "成功关闭 %{name} 自动续签"
 msgid "Auto-renewal enabled for %{name}"
 msgstr "成功启用 %{name} 自动续签"
 
-#: src/views/domain/DomainEdit.vue:166
+#: src/views/domain/DomainEdit.vue:178
 msgid "Back"
 msgstr "返回"
 
@@ -87,22 +87,22 @@ msgstr "构建基于"
 msgid "Cancel"
 msgstr "取消"
 
-#: src/views/domain/cert/CertInfo.vue:40
+#: src/views/domain/cert/CertInfo.vue:24
 msgid "Certificate has expired"
 msgstr "此证书已过期"
 
-#: src/views/domain/cert/CertInfo.vue:44
+#: src/views/domain/cert/CertInfo.vue:28
 msgid "Certificate is valid"
 msgstr "此证书有效"
 
-#: src/views/domain/cert/CertInfo.vue:30
+#: src/views/domain/cert/CertInfo.vue:14
 msgid "Certificate Status"
 msgstr "证书状态"
 
 #: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:29
 #: src/views/domain/ngx_conf/LocationEditor.vue:21
 #: src/views/domain/ngx_conf/LocationEditor.vue:7
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:154
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:155
 msgid "Comments"
 msgstr "注释"
 
@@ -139,6 +139,10 @@ msgstr "再创建一个"
 msgid "Created at"
 msgstr "创建时间"
 
+#: src/language/constants.ts:13
+msgid "Creating client facilitates communication with the CA server"
+msgstr "正在创建客户端用于与 CA 服务器通信"
+
 #: src/routes/index.ts:26
 msgid "Dashboard"
 msgstr "仪表盘"
@@ -181,7 +185,7 @@ msgstr "关闭 %{name} 自动续签失败"
 msgid "Disabled"
 msgstr "禁用"
 
-#: src/views/domain/DomainEdit.vue:101 src/views/domain/DomainList.vue:64
+#: src/views/domain/DomainEdit.vue:112 src/views/domain/DomainList.vue:64
 msgid "Disabled successfully"
 msgstr "禁用成功"
 
@@ -227,7 +231,7 @@ msgstr "启用 TLS"
 msgid "Enabled"
 msgstr "启用"
 
-#: src/views/domain/DomainAdd.vue:46 src/views/domain/DomainEdit.vue:92
+#: src/views/domain/DomainAdd.vue:46 src/views/domain/DomainEdit.vue:103
 #: src/views/domain/DomainList.vue:54
 msgid "Enabled successfully"
 msgstr "启用成功"
@@ -236,15 +240,15 @@ msgstr "启用成功"
 msgid "Encrypt website with Let's Encrypt"
 msgstr "用 Let's Encrypt 对网站进行加密"
 
-#: src/views/domain/cert/CertInfo.vue:33
+#: src/views/domain/cert/CertInfo.vue:17
 msgid "Expiration Date: %{date}"
 msgstr "过期时间: %{date}"
 
-#: src/views/domain/DomainEdit.vue:104 src/views/domain/DomainList.vue:68
+#: src/views/domain/DomainEdit.vue:115 src/views/domain/DomainList.vue:68
 msgid "Failed to disable %{msg}"
 msgstr "禁用失败 %{msg}"
 
-#: src/views/domain/DomainEdit.vue:95 src/views/domain/DomainList.vue:58
+#: src/views/domain/DomainEdit.vue:106 src/views/domain/DomainList.vue:58
 msgid "Failed to enable %{msg}"
 msgstr "启用失败 %{msg}"
 
@@ -256,10 +260,14 @@ msgstr "获取证书信息失败"
 msgid "File Not Found"
 msgstr "未找到文件"
 
-#: src/views/domain/DomainAdd.vue:7
+#: src/language/constants.ts:20 src/views/domain/DomainAdd.vue:7
 msgid "Finished"
 msgstr "完成"
 
+#: src/language/constants.ts:11
+msgid "Generating private key for registering account"
+msgstr "正在生成私钥用于注册账户"
+
 #: src/views/domain/cert/IssueCert.vue:85
 msgid "Getting the certificate, please wait..."
 msgstr "正在获取证书,请稍等..."
@@ -276,7 +284,7 @@ msgstr "安装"
 msgid "Install successfully"
 msgstr "安装成功"
 
-#: src/views/domain/cert/CertInfo.vue:31
+#: src/views/domain/cert/CertInfo.vue:15
 msgid "Intermediate Certification Authorities: %{issuer}"
 msgstr "中级证书颁发机构: %{issuer}"
 
@@ -383,7 +391,7 @@ msgstr "取消"
 msgid "Not Found"
 msgstr "找不到页面"
 
-#: src/views/domain/cert/CertInfo.vue:35
+#: src/views/domain/cert/CertInfo.vue:19
 msgid "Not Valid Before: %{date}"
 msgstr "此前无效: %{date}"
 
@@ -393,6 +401,10 @@ msgid ""
 "you need to get the certificate."
 msgstr "注意:当前配置中的 server_name 必须为需要申请证书的域名。"
 
+#: src/language/constants.ts:16
+msgid "Obtaining certificate"
+msgstr "正在获取证书"
+
 #: src/components/StdDataDisplay/StdCurd.vue:27
 #: src/components/StdDataDisplay/StdTable.vue:40
 #: src/views/domain/DomainList.vue:26
@@ -432,6 +444,10 @@ msgstr "请输入您的密码!"
 msgid "Please input your username!"
 msgstr "请输入您的用户名!"
 
+#: src/language/constants.ts:12
+msgid "Preparing lego configurations"
+msgstr "正在准备 Lego 的配置"
+
 #: src/language/constants.ts:7
 msgid "Prohibit changing root password in demo"
 msgstr "禁止在演示模式下修改 root 账户的密码"
@@ -452,11 +468,19 @@ msgstr "读"
 msgid "Receive"
 msgstr "下载"
 
+#: src/language/constants.ts:15
+msgid "Registering user"
+msgstr "正在注册用户"
+
+#: src/language/constants.ts:19
+msgid "Reloading nginx"
+msgstr "正在重载 Nginx"
+
 #: src/components/StdDataDisplay/StdTable.vue:187
 msgid "Reset"
 msgstr "重置"
 
-#: src/views/config/ConfigEdit.vue:52 src/views/domain/DomainEdit.vue:169
+#: src/views/config/ConfigEdit.vue:52 src/views/domain/DomainEdit.vue:181
 msgid "Save"
 msgstr "保存"
 
@@ -475,7 +499,7 @@ msgid "Save Successfully"
 msgstr "保存成功"
 
 #: src/views/config/ConfigEdit.vue:34 src/views/domain/DomainAdd.vue:43
-#: src/views/domain/DomainEdit.vue:80
+#: src/views/domain/DomainEdit.vue:91
 msgid "Saved successfully"
 msgstr "保存成功"
 
@@ -484,10 +508,9 @@ msgid "Send"
 msgstr "上传"
 
 #: src/components/StdDataDisplay/StdTable.vue:112
-#: src/components/StdDataDisplay/StdTable.vue:94
-#: src/views/config/ConfigEdit.vue:22 src/views/domain/DomainEdit.vue:44
-#: src/views/domain/DomainEdit.vue:56 src/views/domain/DomainEdit.vue:65
-#: src/views/domain/DomainEdit.vue:83 src/views/domain/DomainList.vue:78
+#: src/views/config/ConfigEdit.vue:22 src/views/domain/DomainEdit.vue:56
+#: src/views/domain/DomainEdit.vue:68 src/views/domain/DomainEdit.vue:77
+#: src/views/domain/DomainEdit.vue:94 src/views/domain/DomainList.vue:78
 #: src/views/other/Install.vue:71
 msgid "Server error"
 msgstr "服务器错误"
@@ -525,7 +548,7 @@ msgstr "状态"
 msgid "Storage"
 msgstr "存储"
 
-#: src/views/domain/cert/CertInfo.vue:32
+#: src/views/domain/cert/CertInfo.vue:16
 msgid "Subject Name: %{name}"
 msgstr "主体名称: %{name}"
 
@@ -573,6 +596,10 @@ msgstr "用户名"
 msgid "Username (*)"
 msgstr "用户名 (*)"
 
+#: src/language/constants.ts:14
+msgid "Using HTTP01 challenge provider"
+msgstr "使用 HTTP01 challenge provider"
+
 #: src/views/domain/cert/IssueCert.vue:12 src/views/domain/DomainAdd.vue:24
 msgid "Warning"
 msgstr "警告"
@@ -582,6 +609,14 @@ msgstr "警告"
 msgid "Writes"
 msgstr "写"
 
+#: src/language/constants.ts:18
+msgid "Writing certificate private key to disk"
+msgstr "正在将证书私钥写入磁盘"
+
+#: src/language/constants.ts:17
+msgid "Writing certificate to disk"
+msgstr "正在将证书写入磁盘"
+
 #: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:16
 msgid "Yes"
 msgstr "是的"

+ 56 - 20
frontend/src/language/zh_TW/app.po

@@ -64,7 +64,7 @@ msgstr "已關閉 %{name} 自動續簽"
 msgid "Auto-renewal enabled for %{name}"
 msgstr "已啟用 %{name} 自動續簽"
 
-#: src/views/domain/DomainEdit.vue:166
+#: src/views/domain/DomainEdit.vue:178
 msgid "Back"
 msgstr "返回"
 
@@ -90,22 +90,22 @@ msgstr "構建基於"
 msgid "Cancel"
 msgstr "取消"
 
-#: src/views/domain/cert/CertInfo.vue:40
+#: src/views/domain/cert/CertInfo.vue:24
 msgid "Certificate has expired"
 msgstr "此憑證已過期"
 
-#: src/views/domain/cert/CertInfo.vue:44
+#: src/views/domain/cert/CertInfo.vue:28
 msgid "Certificate is valid"
 msgstr "此憑證有效"
 
-#: src/views/domain/cert/CertInfo.vue:30
+#: src/views/domain/cert/CertInfo.vue:14
 msgid "Certificate Status"
 msgstr "憑證狀態"
 
 #: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:29
 #: src/views/domain/ngx_conf/LocationEditor.vue:21
 #: src/views/domain/ngx_conf/LocationEditor.vue:7
-#: src/views/domain/ngx_conf/NgxConfigEditor.vue:154
+#: src/views/domain/ngx_conf/NgxConfigEditor.vue:155
 msgid "Comments"
 msgstr "註釋"
 
@@ -142,6 +142,10 @@ msgstr "再創建一個"
 msgid "Created at"
 msgstr "建立時間"
 
+#: src/language/constants.ts:13
+msgid "Creating client facilitates communication with the CA server"
+msgstr ""
+
 #: src/routes/index.ts:26
 msgid "Dashboard"
 msgstr "儀表盤"
@@ -185,7 +189,7 @@ msgstr "關閉 %{name} 自動續簽失敗"
 msgid "Disabled"
 msgstr "禁用"
 
-#: src/views/domain/DomainEdit.vue:101 src/views/domain/DomainList.vue:64
+#: src/views/domain/DomainEdit.vue:112 src/views/domain/DomainList.vue:64
 msgid "Disabled successfully"
 msgstr "禁用成功"
 
@@ -231,7 +235,7 @@ msgstr "啟用 TLS"
 msgid "Enabled"
 msgstr "啟用"
 
-#: src/views/domain/DomainAdd.vue:46 src/views/domain/DomainEdit.vue:92
+#: src/views/domain/DomainAdd.vue:46 src/views/domain/DomainEdit.vue:103
 #: src/views/domain/DomainList.vue:54
 msgid "Enabled successfully"
 msgstr "啟用成功"
@@ -240,15 +244,15 @@ msgstr "啟用成功"
 msgid "Encrypt website with Let's Encrypt"
 msgstr "用 Let's Encrypt 對網站進行加密"
 
-#: src/views/domain/cert/CertInfo.vue:33
+#: src/views/domain/cert/CertInfo.vue:17
 msgid "Expiration Date: %{date}"
 msgstr "過期時間: %{date}"
 
-#: src/views/domain/DomainEdit.vue:104 src/views/domain/DomainList.vue:68
+#: src/views/domain/DomainEdit.vue:115 src/views/domain/DomainList.vue:68
 msgid "Failed to disable %{msg}"
 msgstr "禁用失敗 %{msg}"
 
-#: src/views/domain/DomainEdit.vue:95 src/views/domain/DomainList.vue:58
+#: src/views/domain/DomainEdit.vue:106 src/views/domain/DomainList.vue:58
 msgid "Failed to enable %{msg}"
 msgstr "啟用失敗 %{msg}"
 
@@ -260,10 +264,14 @@ msgstr ""
 msgid "File Not Found"
 msgstr "未找到檔案"
 
-#: src/views/domain/DomainAdd.vue:7
+#: src/language/constants.ts:20 src/views/domain/DomainAdd.vue:7
 msgid "Finished"
 msgstr "完成"
 
+#: src/language/constants.ts:11
+msgid "Generating private key for registering account"
+msgstr ""
+
 #: src/views/domain/cert/IssueCert.vue:85
 msgid "Getting the certificate, please wait..."
 msgstr "正在獲取憑證,請稍等..."
@@ -281,7 +289,7 @@ msgstr "安裝"
 msgid "Install successfully"
 msgstr "啟用成功"
 
-#: src/views/domain/cert/CertInfo.vue:31
+#: src/views/domain/cert/CertInfo.vue:15
 msgid "Intermediate Certification Authorities: %{issuer}"
 msgstr "中級憑證頒發機構: %{issuer}"
 
@@ -390,7 +398,7 @@ msgstr "取消"
 msgid "Not Found"
 msgstr "找不到頁面"
 
-#: src/views/domain/cert/CertInfo.vue:35
+#: src/views/domain/cert/CertInfo.vue:19
 msgid "Not Valid Before: %{date}"
 msgstr "此前無效: %{date}"
 
@@ -401,6 +409,10 @@ msgid ""
 "you need to get the certificate."
 msgstr "注意:當前配置中的 server_name 必須為需要申請憑證的域名。"
 
+#: src/language/constants.ts:16
+msgid "Obtaining certificate"
+msgstr ""
+
 #: src/components/StdDataDisplay/StdCurd.vue:27
 #: src/components/StdDataDisplay/StdTable.vue:40
 #: src/views/domain/DomainList.vue:26
@@ -440,6 +452,11 @@ msgstr "請輸入您的密碼!"
 msgid "Please input your username!"
 msgstr "請輸入您的使用者名稱!"
 
+#: src/language/constants.ts:12
+#, fuzzy
+msgid "Preparing lego configurations"
+msgstr "配置"
+
 #: src/language/constants.ts:7
 msgid "Prohibit changing root password in demo"
 msgstr ""
@@ -460,11 +477,19 @@ msgstr "讀"
 msgid "Receive"
 msgstr "下載"
 
+#: src/language/constants.ts:15
+msgid "Registering user"
+msgstr ""
+
+#: src/language/constants.ts:19
+msgid "Reloading nginx"
+msgstr ""
+
 #: src/components/StdDataDisplay/StdTable.vue:187
 msgid "Reset"
 msgstr ""
 
-#: src/views/config/ConfigEdit.vue:52 src/views/domain/DomainEdit.vue:169
+#: src/views/config/ConfigEdit.vue:52 src/views/domain/DomainEdit.vue:181
 msgid "Save"
 msgstr "儲存"
 
@@ -484,7 +509,7 @@ msgid "Save Successfully"
 msgstr "儲存成功"
 
 #: src/views/config/ConfigEdit.vue:34 src/views/domain/DomainAdd.vue:43
-#: src/views/domain/DomainEdit.vue:80
+#: src/views/domain/DomainEdit.vue:91
 msgid "Saved successfully"
 msgstr "儲存成功"
 
@@ -493,10 +518,9 @@ msgid "Send"
 msgstr "上傳"
 
 #: src/components/StdDataDisplay/StdTable.vue:112
-#: src/components/StdDataDisplay/StdTable.vue:94
-#: src/views/config/ConfigEdit.vue:22 src/views/domain/DomainEdit.vue:44
-#: src/views/domain/DomainEdit.vue:56 src/views/domain/DomainEdit.vue:65
-#: src/views/domain/DomainEdit.vue:83 src/views/domain/DomainList.vue:78
+#: src/views/config/ConfigEdit.vue:22 src/views/domain/DomainEdit.vue:56
+#: src/views/domain/DomainEdit.vue:68 src/views/domain/DomainEdit.vue:77
+#: src/views/domain/DomainEdit.vue:94 src/views/domain/DomainList.vue:78
 #: src/views/other/Install.vue:71
 msgid "Server error"
 msgstr "伺服器錯誤"
@@ -534,7 +558,7 @@ msgstr "狀態"
 msgid "Storage"
 msgstr "儲存"
 
-#: src/views/domain/cert/CertInfo.vue:32
+#: src/views/domain/cert/CertInfo.vue:16
 msgid "Subject Name: %{name}"
 msgstr "主體名稱: %{name}"
 
@@ -585,6 +609,10 @@ msgstr "使用者名稱"
 msgid "Username (*)"
 msgstr "使用者名稱 (*)"
 
+#: src/language/constants.ts:14
+msgid "Using HTTP01 challenge provider"
+msgstr ""
+
 #: src/views/domain/cert/IssueCert.vue:12 src/views/domain/DomainAdd.vue:24
 msgid "Warning"
 msgstr "警告"
@@ -594,6 +622,14 @@ msgstr "警告"
 msgid "Writes"
 msgstr "寫"
 
+#: src/language/constants.ts:18
+msgid "Writing certificate private key to disk"
+msgstr ""
+
+#: src/language/constants.ts:17
+msgid "Writing certificate to disk"
+msgstr ""
+
 #: src/views/domain/ngx_conf/directive/DirectiveEditor.vue:16
 msgid "Yes"
 msgstr "是的"

+ 75 - 14
frontend/src/views/domain/cert/IssueCert.vue

@@ -1,6 +1,6 @@
 <script setup lang="ts">
 import {useGettext} from 'vue3-gettext'
-import {computed, nextTick, ref, watch} from 'vue'
+import {computed, h, nextTick, onMounted, ref, VNode, watch} from 'vue'
 import {message} from 'ant-design-vue'
 import domain from '@/api/domain'
 import websocket from '@/lib/websocket'
@@ -12,6 +12,7 @@ const props = defineProps(['directivesMap', 'current_server_directives', 'enable
 const emit = defineEmits(['changeEnabled', 'callback', 'update:enabled'])
 
 const issuing_cert = ref(false)
+const modalVisible = ref(false)
 
 function onchange(r: boolean) {
     emit('changeEnabled', r)
@@ -81,8 +82,25 @@ function change_auto_cert(r: boolean) {
     }
 }
 
+const logContainer = ref(null)
+
+function log(msg: string) {
+    const para = document.createElement('p')
+    para.appendChild(document.createTextNode($gettext(msg)));
+
+    (logContainer.value as any as Node).appendChild(para);
+
+    (logContainer.value as any as Element).scroll({top: 320, left: 0, behavior: 'smooth'})
+}
+
 const issue_cert = async (server_name: string, callback: Function) => {
-    message.info($gettext('Getting the certificate, please wait...'), 15)
+    progressStatus.value = 'active'
+    modalClosable.value = false
+    modalVisible.value = true
+    progressPercent.value = 0;
+    (logContainer.value as any as Element).innerHTML = ''
+
+    log($gettext('Getting the certificate, please wait...'))
 
     const ws = websocket('/api/cert/issue/' + server_name, false)
 
@@ -92,23 +110,25 @@ const issue_cert = async (server_name: string, callback: Function) => {
 
     ws.onmessage = m => {
         const r = JSON.parse(m.data)
+        log(r.message)
+
         switch (r.status) {
-            case 'success':
-                message.success(r.message, 10)
-                break
             case 'info':
-                message.info(r.message, 10)
-                break
-            case 'error':
-                message.error(r.message, 10)
+                progressPercent.value += 5
                 break
-        }
+            default:
+                modalClosable.value = true
+                issuing_cert.value = false
 
-        if (r.status === 'success' && r.ssl_certificate !== undefined && r.ssl_certificate_key !== undefined) {
-            callback(r.ssl_certificate, r.ssl_certificate_key)
+                if (r.status === 'success' && r.ssl_certificate !== undefined && r.ssl_certificate_key !== undefined) {
+                    progressStatus.value = 'success'
+                    progressPercent.value = 100
+                    callback(r.ssl_certificate, r.ssl_certificate_key)
+                } else {
+                    progressStatus.value = 'exception'
+                }
+                break
         }
-
-        issuing_cert.value = false
     }
 }
 
@@ -143,9 +163,34 @@ watch(no_server_name, () => {
     emit('update:enabled', false)
     onchange(false)
 })
+
+const progressStrokeColor = {
+    from: '#108ee9',
+    to: '#87d068',
+}
+
+const progressPercent = ref(0)
+
+const progressStatus = ref('active')
+
+const modalClosable = ref(false)
 </script>
 
 <template>
+    <a-modal
+        :title="$gettext('Obtaining certificate')"
+        v-model:visible="modalVisible"
+        :footer="null" :closable="modalClosable" force-render>
+        <a-progress
+            :stroke-color="progressStrokeColor"
+            :percent="progressPercent"
+            :status="progressStatus"
+        />
+
+        <div class="issue-cert-log-container" ref="logContainer">
+        </div>
+
+    </a-modal>
     <div>
         <a-form-item :label="$gettext('Encrypt website with Let\'s Encrypt')">
             <a-switch
@@ -185,6 +230,22 @@ watch(no_server_name, () => {
     </div>
 </template>
 
+<style lang="less">
+.issue-cert-log-container {
+    height: 320px;
+    overflow: scroll;
+    background-color: #f3f3f3;
+    border-radius: 4px;
+    margin-top: 15px;
+    padding: 10px;
+
+    p {
+        font-size: 12px;
+        line-height: 1.3;
+    }
+}
+</style>
+
 <style lang="less" scoped>
 .switch-wrapper {
     position: relative;

+ 76 - 68
server/api/cert.go

@@ -8,9 +8,43 @@ import (
 	"github.com/gorilla/websocket"
 	"log"
 	"net/http"
-	"os"
 )
 
+const (
+	Success = "success"
+	Info    = "info"
+	Error   = "error"
+)
+
+type IssueCertResponse struct {
+	Status            string `json:"status"`
+	Message           string `json:"message"`
+	SSLCertificate    string `json:"ssl_certificate,omitempty"`
+	SSLCertificateKey string `json:"ssl_certificate_key,omitempty"`
+}
+
+func handleIssueCertLogChan(conn *websocket.Conn, logChan chan string) {
+	defer func() {
+		if err := recover(); err != nil {
+			log.Println("api.handleIssueCertLogChan recover", err)
+		}
+	}()
+
+	for logString := range logChan {
+
+		err := conn.WriteJSON(IssueCertResponse{
+			Status:  Info,
+			Message: logString,
+		})
+
+		if err != nil {
+			log.Println("Error handleIssueCertLogChan", err)
+			return
+		}
+
+	}
+}
+
 func IssueCert(c *gin.Context) {
 	domain := c.Param("domain")
 
@@ -36,45 +70,30 @@ func IssueCert(c *gin.Context) {
 
 	// read
 	mt, message, err := ws.ReadMessage()
+
 	if err != nil {
 		log.Println(err)
 		return
 	}
 
-	if mt == websocket.TextMessage && string(message) == "go" {
-
-		err = cert.IssueCert(domain)
-
-		if err != nil {
-
-			log.Println(err)
+	if mt != websocket.TextMessage || string(message) != "go" {
+		return
+	}
 
-			err = ws.WriteJSON(gin.H{
-				"status":  "error",
-				"message": err.Error(),
-			})
+	logChan := make(chan string, 1)
+	errChan := make(chan error, 1)
 
-			if err != nil {
-				log.Println(err)
-				return
-			}
+	go cert.IssueCert(domain, logChan, errChan)
 
-			return
-		}
+	go handleIssueCertLogChan(ws, logChan)
 
-		sslCertificatePath := nginx.GetNginxConfPath("ssl/" + domain + "/fullchain.cer")
-		_, err = os.Stat(sslCertificatePath)
+	// block, unless errChan closed
+	for err = range errChan {
+		log.Println("Error cert.IssueCert", err)
 
-		if err != nil {
-			log.Println(err)
-			return
-		}
-
-		log.Println("[found]", "fullchain.cer")
-
-		err = ws.WriteJSON(gin.H{
-			"status":  "success",
-			"message": "[found] fullchain.cer",
+		err = ws.WriteJSON(IssueCertResponse{
+			Status:  Error,
+			Message: err.Error(),
 		})
 
 		if err != nil {
@@ -82,51 +101,40 @@ func IssueCert(c *gin.Context) {
 			return
 		}
 
-		sslCertificateKeyPath := nginx.GetNginxConfPath("ssl/" + domain + "/" + domain + ".key")
-		_, err = os.Stat(sslCertificateKeyPath)
-
-		if err != nil {
-			log.Println(err)
-			return
-		}
+		return
+	}
 
-		log.Println("[found]", "cert key")
-		err = ws.WriteJSON(gin.H{
-			"status":  "success",
-			"message": "[found] Certificate Key",
-		})
+	close(logChan)
 
-		if err != nil {
-			log.Println(err)
-			return
-		}
+	sslCertificatePath := nginx.GetNginxConfPath("ssl/" + domain + "/fullchain.cer")
+	sslCertificateKeyPath := nginx.GetNginxConfPath("ssl/" + domain + "/" + domain + ".key")
 
-		certModel, err := model.FirstCert(domain)
+	certModel, err := model.FirstCert(domain)
 
-		if err != nil {
-			log.Println(err)
-			return
-		}
+	if err != nil {
+		log.Println(err)
+		return
+	}
 
-		err = certModel.Updates(&model.Cert{
-			SSLCertificatePath: sslCertificatePath,
-		})
+	err = certModel.Updates(&model.Cert{
+		SSLCertificatePath: sslCertificatePath,
+	})
 
-		if err != nil {
-			log.Println(err)
-			return
-		}
+	if err != nil {
+		log.Println(err)
+		return
+	}
 
-		err = ws.WriteJSON(gin.H{
-			"status":              "success",
-			"message":             "Issued certificate successfully",
-			"ssl_certificate":     sslCertificatePath,
-			"ssl_certificate_key": sslCertificateKeyPath,
-		})
+	err = ws.WriteJSON(IssueCertResponse{
+		Status:            Success,
+		Message:           "Issued certificate successfully",
+		SSLCertificate:    sslCertificatePath,
+		SSLCertificateKey: sslCertificateKeyPath,
+	})
 
-		if err != nil {
-			log.Println(err)
-			return
-		}
+	if err != nil {
+		log.Println(err)
+		return
 	}
+
 }

+ 25 - 4
server/pkg/cert/auto_cert.go

@@ -6,6 +6,18 @@ import (
 	"time"
 )
 
+func handleIssueCertLogChan(logChan chan string) {
+	defer func() {
+		if err := recover(); err != nil {
+			log.Println("[Auto Cert] handleIssueCertLogChan", err)
+		}
+	}()
+
+	for logString := range logChan {
+		log.Println("[Auto Cert] Info", logString)
+	}
+}
+
 func AutoCert() {
 	defer func() {
 		if err := recover(); err != nil {
@@ -24,7 +36,7 @@ func AutoCert() {
 			continue
 		}
 
-		if certModel.SSLCertificatePath != "" {
+		if certModel.SSLCertificatePath == "" {
 			log.Println("[AutoCert] Error ssl_certificate_path is empty, " +
 				"try to reopen auto-cert for this domain:" + domain)
 			continue
@@ -41,9 +53,18 @@ func AutoCert() {
 			continue
 		}
 		// after 1 mo, reissue certificate
-		err = IssueCert(domain)
-		if err != nil {
-			log.Println(err)
+		logChan := make(chan string, 1)
+		errChan := make(chan error, 1)
+
+		go IssueCert(domain, logChan, errChan)
+
+		go handleIssueCertLogChan(logChan)
+
+		// block, unless errChan closed
+		for err = range errChan {
+			log.Println("Error cert.IssueCert", err)
 		}
+
+		close(logChan)
 	}
 }

+ 37 - 13
server/pkg/cert/cert.go

@@ -35,13 +35,22 @@ func (u *MyUser) GetPrivateKey() crypto.PrivateKey {
 	return u.key
 }
 
-func IssueCert(domain string) error {
+func IssueCert(domain string, logChan chan string, errChan chan error) {
+	defer func() {
+		if err := recover(); err != nil {
+			log.Println("Issue Cert recover", err)
+		}
+	}()
+
 	// Create a user. New accounts need an email and private key to start.
+	logChan <- "Generating private key for registering account"
 	privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
 	if err != nil {
-		return errors.Wrap(err, "issue cert generate key error")
+		errChan <- errors.Wrap(err, "issue cert generate key error")
+		return
 	}
 
+	logChan <- "Preparing lego configurations"
 	myUser := MyUser{
 		Email: settings.ServerSettings.Email,
 		key:   privateKey,
@@ -55,26 +64,32 @@ func IssueCert(domain string) error {
 
 	config.Certificate.KeyType = certcrypto.RSA2048
 
+	logChan <- "Creating client facilitates communication with the CA server"
 	// A client facilitates communication with the CA server.
 	client, err := lego.NewClient(config)
 	if err != nil {
-		return errors.Wrap(err, "issue cert new client error")
+		errChan <- errors.Wrap(err, "issue cert new client error")
+		return
 	}
 
+	logChan <- "Using HTTP01 challenge provider"
 	err = client.Challenge.SetHTTP01Provider(
 		http01.NewProviderServer("",
 			settings.ServerSettings.HTTPChallengePort,
 		),
 	)
+
 	if err != nil {
-		return errors.Wrap(err, "issue cert challenge fail")
+		errChan <- errors.Wrap(err, "issue cert challenge fail")
+		return
 	}
 
 	// New users will need to register
+	logChan <- "Registering user"
 	reg, err := client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true})
 	if err != nil {
-		log.Println(err)
-		return errors.Wrap(err, "issue cert register fail")
+		errChan <- errors.Wrap(err, "issue cert register fail")
+		return
 	}
 	myUser.Registration = reg
 
@@ -82,37 +97,46 @@ func IssueCert(domain string) error {
 		Domains: []string{domain},
 		Bundle:  true,
 	}
+
+	logChan <- "Obtaining certificate"
 	certificates, err := client.Certificate.Obtain(request)
 	if err != nil {
-		return errors.Wrap(err, "issue cert fail to obtain")
+		errChan <- errors.Wrap(err, "issue cert fail to obtain")
+		return
 	}
 	saveDir := nginx.GetNginxConfPath("ssl/" + domain)
 	if _, err = os.Stat(saveDir); os.IsNotExist(err) {
 		err = os.Mkdir(saveDir, 0755)
 		if err != nil {
-			return errors.Wrap(err, "issue cert fail to create")
+			errChan <- errors.Wrap(err, "issue cert fail to create")
+			return
 		}
 	}
 
 	// Each certificate comes back with the cert bytes, the bytes of the client's
 	// private key, and a certificate URL. SAVE THESE TO DISK.
+	logChan <- "Writing certificate to disk"
 	err = os.WriteFile(filepath.Join(saveDir, "fullchain.cer"),
 		certificates.Certificate, 0644)
 
 	if err != nil {
-		log.Println(err)
-		return errors.Wrap(err, "issue cert write fullchain.cer fail")
+		errChan <- errors.Wrap(err, "error issue cert write fullchain.cer")
+		return
 	}
 
+	logChan <- "Writing certificate private key to disk"
 	err = os.WriteFile(filepath.Join(saveDir, domain+".key"),
 		certificates.PrivateKey, 0644)
 
 	if err != nil {
-		log.Println(err)
-		return errors.Wrap(err, "issue cert write key fail")
+		errChan <- errors.Wrap(err, "error issue cert write key")
+		return
 	}
 
+	close(errChan)
+	logChan <- "Reloading nginx"
+
 	nginx.ReloadNginx()
 
-	return nil
+	logChan <- "Finished"
 }

Some files were not shown because too many files changed in this diff