From 9398f0f4fde941b8aebd4a88c6b2384691c76585 Mon Sep 17 00:00:00 2001 From: lijiahang Date: Fri, 22 Sep 2023 11:48:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=BB=E6=9C=BA=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/ErrorMessage.java | 8 +- ...on-vue-views-components-form-drawer.vue.vm | 4 +- ...ion-vue-views-components-form-modal.vue.vm | 4 +- .../orion-vue-views-components-table.vue.vm | 3 + .../asset/controller/HostKeyController.java | 2 +- .../module/asset/enums/HostAuthTypeEnum.java | 41 +++++++++ .../asset/enums/HostConfigTypeEnum.java | 7 +- .../host/config/model/HostSshConfigModel.java | 25 +++++- .../config/strategy/HostConfigStrategy.java | 14 ++++ .../strategy/HostSshConfigStrategy.java | 84 +++++++++++++++++-- .../service/impl/HostConfigServiceImpl.java | 10 ++- 11 files changed, 183 insertions(+), 19 deletions(-) create mode 100644 orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostAuthTypeEnum.java diff --git a/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/constant/ErrorMessage.java b/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/constant/ErrorMessage.java index c2031568..033974d3 100644 --- a/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/constant/ErrorMessage.java +++ b/orion-ops-framework/orion-ops-common/src/main/java/com/orion/ops/framework/common/constant/ErrorMessage.java @@ -21,7 +21,9 @@ public interface ErrorMessage { String DATA_ABSENT = "数据不存在"; - String KEY_ABSENT = "秘钥不存在"; + String KEY_ABSENT = "主机秘钥不存在"; + + String IDENTITY_ABSENT = "主机身份不存在"; String CONFIG_ABSENT = "配置不存在"; @@ -51,4 +53,8 @@ public interface ErrorMessage { String UNABLE_OPERATE_ADMIN_ROLE = "无法操作管理员账号"; + String UNSUPPORTED_CHARSET = "不支持的编码 [{}]"; + + String PASSWORD_MISSING = "请输入密码"; + } diff --git a/orion-ops-launch/src/main/resources/templates/orion-vue-views-components-form-drawer.vue.vm b/orion-ops-launch/src/main/resources/templates/orion-vue-views-components-form-drawer.vue.vm index cec32cf3..675cd416 100644 --- a/orion-ops-launch/src/main/resources/templates/orion-vue-views-components-form-drawer.vue.vm +++ b/orion-ops-launch/src/main/resources/templates/orion-vue-views-components-form-drawer.vue.vm @@ -93,7 +93,9 @@ // 渲染表单 const renderForm = (record: any) => { Object.keys(formModel).forEach(k => { - formModel[k] = record[k]; + if (record.hasOwnProperty(k)) { + formModel[k] = record[k]; + } }); }; diff --git a/orion-ops-launch/src/main/resources/templates/orion-vue-views-components-form-modal.vue.vm b/orion-ops-launch/src/main/resources/templates/orion-vue-views-components-form-modal.vue.vm index 8eee5f28..15f0d0a6 100644 --- a/orion-ops-launch/src/main/resources/templates/orion-vue-views-components-form-modal.vue.vm +++ b/orion-ops-launch/src/main/resources/templates/orion-vue-views-components-form-modal.vue.vm @@ -97,7 +97,9 @@ // 渲染表单 const renderForm = (record: any) => { Object.keys(formModel).forEach(k => { - formModel[k] = record[k]; + if (record.hasOwnProperty(k)) { + formModel[k] = record[k]; + } }); }; diff --git a/orion-ops-launch/src/main/resources/templates/orion-vue-views-components-table.vue.vm b/orion-ops-launch/src/main/resources/templates/orion-vue-views-components-table.vue.vm index 589d607c..4d296531 100644 --- a/orion-ops-launch/src/main/resources/templates/orion-vue-views-components-table.vue.vm +++ b/orion-ops-launch/src/main/resources/templates/orion-vue-views-components-table.vue.vm @@ -143,6 +143,7 @@ selectedKeys.value = []; // 重新加载数据 await fetchTableData(); + } catch (e) { } finally { setLoading(false); } @@ -157,6 +158,7 @@ Message.success('删除成功'); // 重新加载数据 await fetchTableData(); + } catch (e) { } finally { setLoading(false); } @@ -185,6 +187,7 @@ pagination.total = data.total; pagination.current = request.page; pagination.pageSize = request.limit; + } catch (e) { } finally { setLoading(false); } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/HostKeyController.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/HostKeyController.java index b8f176da..d578475b 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/HostKeyController.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/HostKeyController.java @@ -64,7 +64,7 @@ public class HostKeyController { } @IgnoreLog(IgnoreLogMode.RET) - @PostMapping("/list") + @GetMapping("/list") @Operation(summary = "查询主机秘钥") @PreAuthorize("@ss.hasPermission('asset:host-key:query')") public List getHostKeyList() { diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostAuthTypeEnum.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostAuthTypeEnum.java new file mode 100644 index 00000000..76f30a09 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostAuthTypeEnum.java @@ -0,0 +1,41 @@ +package com.orion.ops.module.asset.enums; + +/** + * 主机验证类型 + * + * @author Jiahang Li + * @version 1.0.0 + * @since 2023/9/21 19:01 + */ +public enum HostAuthTypeEnum { + + /** + * 密码验证 + */ + PASSWORD, + + /** + * 秘钥验证 + */ + KEY, + + /** + * 身份验证 + */ + IDENTITY, + + ; + + public static HostAuthTypeEnum of(String type) { + if (type == null) { + return null; + } + for (HostAuthTypeEnum value : values()) { + if (value.name().equals(type)) { + return value; + } + } + return null; + } + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostConfigTypeEnum.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostConfigTypeEnum.java index c6ac5944..81e3bdf4 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostConfigTypeEnum.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/enums/HostConfigTypeEnum.java @@ -5,6 +5,7 @@ import com.orion.ops.module.asset.handler.host.config.model.HostConfigModel; import com.orion.ops.module.asset.handler.host.config.model.HostSshConfigModel; import com.orion.ops.module.asset.handler.host.config.strategy.HostConfigStrategy; import com.orion.ops.module.asset.handler.host.config.strategy.HostSshConfigStrategy; +import com.orion.spring.SpringHolder; import lombok.AllArgsConstructor; /** @@ -20,13 +21,13 @@ public enum HostConfigTypeEnum { /** * SSH 配置 */ - SSH(HostSshConfigModel.class, new HostSshConfigStrategy(), BooleanBit.TRUE.getValue()), + SSH(HostSshConfigModel.class, HostSshConfigStrategy.class, BooleanBit.TRUE.getValue()), ; private final Class type; - private final HostConfigStrategy strategy; + private final Class> strategy; private final Integer defaultStatus; @@ -48,7 +49,7 @@ public enum HostConfigTypeEnum { @SuppressWarnings("unchecked") public > T getStrategy() { - return (T) strategy; + return (T) SpringHolder.getBean(strategy); } public Integer getDefaultStatus() { diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/model/HostSshConfigModel.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/model/HostSshConfigModel.java index 669ef483..9ff51e07 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/model/HostSshConfigModel.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/model/HostSshConfigModel.java @@ -1,13 +1,16 @@ package com.orion.ops.module.asset.handler.host.config.model; +import com.orion.ops.framework.common.security.UpdatePasswordAction; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Range; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; /** * 主机 SSH 配置 @@ -21,36 +24,54 @@ import javax.validation.constraints.NotNull; @NoArgsConstructor @AllArgsConstructor @Schema(name = "HostSftpConfig", description = "主机 SSH 配置") -public class HostSshConfigModel implements HostConfigModel { +public class HostSshConfigModel implements HostConfigModel, UpdatePasswordAction { @NotNull + @Range(min = 1, max = 65535) @Schema(description = "ssh 端口") private Integer port; - @NotNull + @Size(max = 128) @Schema(description = "用户名") private String username; + @NotBlank + @Size(max = 12) + private String authType; + @Schema(description = "密码") private String password; @Schema(description = "身份id") private Long identityId; + @Schema(description = "秘钥id") + private Long keyId; + @NotNull + @Range(min = 0, max = 100000) @Schema(description = "连接超时时间") private Integer connectTimeout; @NotBlank + @Size(max = 12) @Schema(description = "SSH输出编码") private String charset; @NotBlank + @Size(max = 12) @Schema(description = "文件名称编码") private String fileNameCharset; @NotBlank + @Size(max = 12) @Schema(description = "文件内容编码") private String fileContentCharset; + @Schema(description = "是否使用新密码 仅参数") + private Boolean useNewPassword; + + @Schema(description = "是否已设置密码 仅返回") + private Boolean hasPassword; + } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostConfigStrategy.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostConfigStrategy.java index ca370f0d..3becbc24 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostConfigStrategy.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostConfigStrategy.java @@ -28,6 +28,20 @@ public interface HostConfigStrategy { */ void updateFill(Config before, Config after); + /** + * 预校验参数 + * + * @param config config + */ + void preValidConfig(Config config); + + /** + * 校验参数 + * + * @param config config + */ + void validConfig(Config config); + /** * 转为视图配置 * diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostSshConfigStrategy.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostSshConfigStrategy.java index c1f5386f..d8f5383d 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostSshConfigStrategy.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/handler/host/config/strategy/HostSshConfigStrategy.java @@ -1,11 +1,21 @@ package com.orion.ops.module.asset.handler.host.config.strategy; import com.alibaba.fastjson.JSON; +import com.orion.lang.utils.Booleans; +import com.orion.lang.utils.Charsets; +import com.orion.lang.utils.Exceptions; import com.orion.lang.utils.Strings; import com.orion.ops.framework.common.constant.Const; -import com.orion.ops.framework.common.utils.CryptoUtils; +import com.orion.ops.framework.common.constant.ErrorMessage; +import com.orion.ops.framework.common.security.PasswordModifier; +import com.orion.ops.framework.common.utils.Valid; +import com.orion.ops.module.asset.dao.HostIdentityDAO; +import com.orion.ops.module.asset.dao.HostKeyDAO; +import com.orion.ops.module.asset.enums.HostAuthTypeEnum; import com.orion.ops.module.asset.handler.host.config.model.HostSshConfigModel; +import org.springframework.stereotype.Component; +import javax.annotation.Resource; import java.util.Map; /** @@ -15,8 +25,15 @@ import java.util.Map; * @version 1.0.0 * @since 2023/9/19 14:26 */ +@Component public class HostSshConfigStrategy implements HostConfigStrategy { + @Resource + private HostKeyDAO hostKeyDAO; + + @Resource + private HostIdentityDAO hostIdentityDAO; + private static final int SSH_PORT = 22; @Override @@ -30,10 +47,38 @@ public class HostSshConfigStrategy implements HostConfigStrategy strategy = type.getStrategy(); + // 预校验参数 + strategy.preValidConfig(config); + // 更新填充 HostConfigModel beforeConfig = JSON.parseObject(record.getConfig(), type.getType()); - type.getStrategy().updateFill(beforeConfig, config); + strategy.updateFill(beforeConfig, config); // 检查参数 - Valid.valid(config); + strategy.validConfig(config); // 修改配置 HostConfigDO update = new HostConfigDO(); update.setId(id);