添加主机配置

This commit is contained in:
lijiahang
2023-09-13 16:37:01 +08:00
parent 973bad39b1
commit a64481582f
17 changed files with 350 additions and 24 deletions

View File

@@ -17,8 +17,12 @@ public interface ErrorMessage {
String INVALID_PARAM = "参数验证失败";
String DATA_MODIFIED = "数据发生变更, 请刷新后重试";
String DATA_ABSENT = "数据不存在";
String CONFIG_ABSENT = "配置不存在";
String DATA_PRESENT = "数据已存在";
String NAME_PRESENT = "名称已存在";

View File

@@ -4,7 +4,6 @@ import com.orion.lang.define.wrapper.DataGrid;
import com.orion.ops.framework.common.annotation.IgnoreLog;
import com.orion.ops.framework.common.annotation.RestWrapper;
import com.orion.ops.framework.common.constant.IgnoreLogMode;
import com.orion.ops.framework.common.valid.group.Id;
import com.orion.ops.framework.common.valid.group.Page;
import ${package.Service}.*;
#foreach($pkg in ${customModuleFilePackages})
@@ -59,7 +58,7 @@ public class ${table.controllerName} {
@PutMapping("/update")
@Operation(summary = "${apiComment.updateById}")
@PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:update')")
public Integer update${type}(@Validated(Id.class) @RequestBody ${type}UpdateRequest request) {
public Integer update${type}(@Validated @RequestBody ${type}UpdateRequest request) {
return ${typeLower}Service.update${type}ById(request);
}

View File

@@ -4,12 +4,14 @@ import com.orion.lang.define.wrapper.DataGrid;
import com.orion.ops.framework.common.annotation.IgnoreLog;
import com.orion.ops.framework.common.annotation.RestWrapper;
import com.orion.ops.framework.common.constant.IgnoreLogMode;
import com.orion.ops.framework.common.valid.group.Id;
import com.orion.ops.framework.common.valid.group.Page;
import com.orion.ops.module.asset.entity.request.host.HostConfigUpdateRequest;
import com.orion.ops.module.asset.entity.request.host.HostCreateRequest;
import com.orion.ops.module.asset.entity.request.host.HostQueryRequest;
import com.orion.ops.module.asset.entity.request.host.HostUpdateRequest;
import com.orion.ops.module.asset.entity.vo.HostConfigVO;
import com.orion.ops.module.asset.entity.vo.HostVO;
import com.orion.ops.module.asset.service.HostConfigService;
import com.orion.ops.module.asset.service.HostService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -41,6 +43,9 @@ public class HostController {
@Resource
private HostService hostService;
@Resource
private HostConfigService hostConfigService;
@PostMapping("/create")
@Operation(summary = "创建主机")
@PreAuthorize("@ss.hasPermission('asset:host:create')")
@@ -51,7 +56,7 @@ public class HostController {
@PutMapping("/update")
@Operation(summary = "通过 id 更新主机")
@PreAuthorize("@ss.hasPermission('asset:host:update')")
public Integer updateHost(@Validated(Id.class) @RequestBody HostUpdateRequest request) {
public Integer updateHost(@Validated @RequestBody HostUpdateRequest request) {
return hostService.updateHostById(request);
}
@@ -96,5 +101,33 @@ public class HostController {
return hostService.deleteHostById(id);
}
@IgnoreLog(IgnoreLogMode.RET)
@GetMapping("/get-config")
@Operation(summary = "查询主机配置")
@Parameter(name = "hostId", description = "hostId", required = true)
@Parameter(name = "type", description = "配置类型", required = true)
@PreAuthorize("@ss.hasPermission('asset:host:query')")
public HostConfigVO getHostConfig(@RequestParam("hostId") Long hostId,
@RequestParam(name = "type") String type) {
return hostConfigService.getHostConfig(hostId, type);
}
@IgnoreLog(IgnoreLogMode.RET)
@GetMapping("/get-config-all")
@Operation(summary = "查询主机配置-全部")
@Parameter(name = "hostId", description = "hostId", required = true)
@PreAuthorize("@ss.hasPermission('asset:host:query')")
public List<HostConfigVO> getHostConfig(@RequestParam("hostId") Long hostId) {
return hostConfigService.getHostConfig(hostId);
}
@PutMapping("/update-config")
@Operation(summary = "更新主机配置")
@PreAuthorize("@ss.hasPermission('asset:host:update-config')")
public boolean updateHostConfig(@Validated @RequestBody HostConfigUpdateRequest request) {
hostConfigService.updateHostConfig(request);
return true;
}
}

View File

@@ -1,8 +1,10 @@
package com.orion.ops.module.asset.convert;
import com.orion.ops.module.asset.entity.domain.HostConfigDO;
import com.orion.ops.module.asset.entity.request.host.HostConfigUpdateRequest;
import com.orion.ops.module.asset.entity.vo.HostConfigVO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
/**
@@ -17,6 +19,9 @@ public interface HostConfigConvert {
HostConfigConvert MAPPER = Mappers.getMapper(HostConfigConvert.class);
@Mapping(target = "config", ignore = true)
HostConfigVO to(HostConfigDO domain);
HostConfigDO to(HostConfigUpdateRequest request);
}

View File

@@ -1,9 +1,6 @@
package com.orion.ops.module.asset.entity.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import com.orion.ops.framework.mybatis.core.domain.BaseDO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
@@ -44,6 +41,7 @@ public class HostConfigDO extends BaseDO {
@Schema(description = "配置版本号")
@TableField("version")
private String version;
@Version
private Integer version;
}

View File

@@ -0,0 +1,13 @@
package com.orion.ops.module.asset.entity.dto.host;
/**
* 主机配置父类
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023/9/13 14:47
*/
public interface HostConfigContent {
}

View File

@@ -0,0 +1,9 @@
package com.orion.ops.module.asset.entity.dto.host;
/**
* @author Jiahang Li
* @version 1.0.0
* @since 2023/9/13 16:26
*/
public class HostSftpConfig implements HostConfigContent {
}

View File

@@ -0,0 +1,17 @@
package com.orion.ops.module.asset.entity.dto.host;
import lombok.Data;
/**
* ssh 连接配置
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023/9/13 16:18
*/
@Data
public class HostSshConnectConfig implements HostConfigContent {
// proxy port username password authType keyId
}

View File

@@ -0,0 +1,19 @@
package com.orion.ops.module.asset.entity.dto.host;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.HashMap;
/**
* ssh 环境变量配置
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023/9/13 16:18
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class HostSshEnvConfig extends HashMap<String, Object> implements HostConfigContent {
}

View File

@@ -0,0 +1,31 @@
package com.orion.ops.module.asset.entity.request.host;
import com.orion.ops.framework.common.entity.PageRequest;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import javax.validation.constraints.Size;
/**
* 主机配置 查询请求对象
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023-9-13 14:31
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Schema(name = "HostConfigQueryRequest", description = "主机配置 查询请求对象")
public class HostConfigQueryRequest extends PageRequest {
@Schema(description = "主机id")
private Long hostId;
@Size(max = 255)
@Schema(description = "连接类型")
private String type;
}

View File

@@ -0,0 +1,43 @@
package com.orion.ops.module.asset.entity.request.host;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* 主机配置 更新请求对象
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023-9-13 14:31
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(name = "HostConfigUpdateRequest", description = "主机配置 更新请求对象")
public class HostConfigUpdateRequest implements Serializable {
@NotNull
@Schema(description = "hostId")
private Long hostId;
@NotNull
@Schema(description = "配置类型")
private String type;
@NotBlank
@Schema(description = "配置详情")
private String config;
@NotNull
@Schema(description = "配置版本号")
private Integer version;
}

View File

@@ -26,7 +26,7 @@ public class HostConfigVO {
private Long id;
@Schema(description = "version")
private String version;
private Integer version;
@Schema(description = "config")
private Map<String, Object> config;

View File

@@ -1,5 +1,12 @@
package com.orion.ops.module.asset.enums;
import com.orion.ops.module.asset.entity.dto.host.HostConfigContent;
import com.orion.ops.module.asset.entity.dto.host.HostSftpConfig;
import com.orion.ops.module.asset.entity.dto.host.HostSshConnectConfig;
import com.orion.ops.module.asset.entity.dto.host.HostSshEnvConfig;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 主机配置类型枚举
*
@@ -7,31 +14,67 @@ package com.orion.ops.module.asset.enums;
* @version 1.0.0
* @since 2023/9/11 14:37
*/
@Getter
@AllArgsConstructor
public enum HostConfigTypeEnum {
/**
* ssh 配置
* SSH 连接配置
*/
SSH,
SSH_CONNECT(HostSshConnectConfig.class) {
},
/**
* SSH 环境变量
*/
SSH_ENV(HostSshEnvConfig.class),
/**
* sftp 配置
*/
SFTP,
SFTP(HostSftpConfig.class),
/**
* rdp 配置
*/
RDP,
/**
* 环境变量
*/
ENV,
RDP(null),
/**
* 普通配置
*/
CONFIG,
CONFIG(null),
;
private final Class<? extends HostConfigContent> type;
public static HostConfigTypeEnum of(String type) {
if (type == null) {
return null;
}
for (HostConfigTypeEnum value : values()) {
if (value.name().equals(type)) {
return value;
}
}
return null;
}
/**
* 插入填充
*
* @param o o
*/
public <T extends HostConfigContent> void insertFill(T o) {
}
/**
* 更新填充
*
* @param before before
* @param after after
*/
public <T extends HostConfigContent> void updateFill(T before, T after) {
}
}

View File

@@ -1,5 +1,11 @@
package com.orion.ops.module.asset.service;
import com.orion.ops.module.asset.entity.dto.host.HostConfigContent;
import com.orion.ops.module.asset.entity.request.host.HostConfigUpdateRequest;
import com.orion.ops.module.asset.entity.vo.HostConfigVO;
import java.util.List;
/**
* 主机配置 服务类
*
@@ -9,4 +15,38 @@ package com.orion.ops.module.asset.service;
*/
public interface HostConfigService {
/**
* 获取配置
*
* @param hostId hostId
* @param type type
* @return 配置
*/
HostConfigVO getHostConfig(Long hostId, String type);
/**
* 获取配置
*
* @param hostId hostId
* @param type type
* @param clazz class
* @return 配置
*/
<T extends HostConfigContent> T getHostConfig(Long hostId, String type, Class<T> clazz);
/**
* 获取配置
*
* @param hostId hostId
* @return 配置
*/
List<HostConfigVO> getHostConfig(Long hostId);
/**
* 更新配置
*
* @param request request
*/
void updateHostConfig(HostConfigUpdateRequest request);
}

View File

@@ -1,11 +1,22 @@
package com.orion.ops.module.asset.service.impl;
import com.alibaba.fastjson.JSON;
import com.orion.ops.framework.common.constant.ErrorMessage;
import com.orion.ops.framework.common.utils.Valid;
import com.orion.ops.module.asset.convert.HostConfigConvert;
import com.orion.ops.module.asset.dao.HostConfigDAO;
import com.orion.ops.module.asset.entity.domain.HostConfigDO;
import com.orion.ops.module.asset.entity.dto.host.HostConfigContent;
import com.orion.ops.module.asset.entity.request.host.HostConfigUpdateRequest;
import com.orion.ops.module.asset.entity.vo.HostConfigVO;
import com.orion.ops.module.asset.enums.HostConfigTypeEnum;
import com.orion.ops.module.asset.service.HostConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
/**
* 主机配置 服务实现类
@@ -21,4 +32,66 @@ public class HostConfigServiceImpl implements HostConfigService {
@Resource
private HostConfigDAO hostConfigDAO;
@Override
public HostConfigVO getHostConfig(Long hostId, String type) {
// 查询配置
HostConfigDO config = hostConfigDAO.getHostConfigByHostId(hostId, type);
Valid.notNull(config, ErrorMessage.CONFIG_ABSENT);
// 转换
HostConfigVO vo = HostConfigConvert.MAPPER.to(config);
vo.setConfig(JSON.parseObject(config.getConfig()));
return vo;
}
@Override
public <T extends HostConfigContent> T getHostConfig(Long hostId, String type, Class<T> clazz) {
// 查询配置
HostConfigDO config = hostConfigDAO.getHostConfigByHostId(hostId, type);
Valid.notNull(config, ErrorMessage.CONFIG_ABSENT);
return JSON.parseObject(config.getConfig(), clazz);
}
@Override
public List<HostConfigVO> getHostConfig(Long hostId) {
List<HostConfigDO> configs = hostConfigDAO.getHostConfigByHostId(hostId);
return configs.stream().map(config -> {
HostConfigVO vo = HostConfigConvert.MAPPER.to(config);
vo.setConfig(JSON.parseObject(config.getConfig()));
return vo;
}).collect(Collectors.toList());
}
@Override
public void updateHostConfig(HostConfigUpdateRequest request) {
String typeValue = request.getType();
HostConfigTypeEnum type = HostConfigTypeEnum.of(typeValue);
HostConfigContent requestConfig = JSON.parseObject(request.getConfig(), type.getType());
// 查询原配置
HostConfigDO record = hostConfigDAO.getHostConfigByHostId(request.getHostId(), typeValue);
if (record == null) {
// 填充
type.insertFill(requestConfig);
// 检查参数
Valid.valid(requestConfig);
// 新增配置
HostConfigDO insert = HostConfigConvert.MAPPER.to(request);
insert.setConfig(JSON.toJSONString(requestConfig));
hostConfigDAO.insert(insert);
} else {
// 检查版本
Valid.eq(record.getVersion(), request.getVersion(), ErrorMessage.DATA_MODIFIED);
// 填充
HostConfigContent beforeConfig = JSON.parseObject(record.getConfig(), type.getType());
type.updateFill(beforeConfig, requestConfig);
// 检查参数
Valid.valid(requestConfig);
// 修改配置
HostConfigDO update = new HostConfigDO();
update.setId(record.getId());
update.setVersion(request.getVersion());
update.setConfig(JSON.toJSONString(requestConfig));
hostConfigDAO.updateById(update);
}
}
}

View File

@@ -4,7 +4,6 @@ import com.orion.lang.define.wrapper.DataGrid;
import com.orion.ops.framework.common.annotation.IgnoreLog;
import com.orion.ops.framework.common.annotation.RestWrapper;
import com.orion.ops.framework.common.constant.IgnoreLogMode;
import com.orion.ops.framework.common.valid.group.Id;
import com.orion.ops.framework.common.valid.group.Page;
import com.orion.ops.module.infra.entity.request.menu.SystemRoleBindMenuRequest;
import com.orion.ops.module.infra.entity.request.role.SystemRoleCreateRequest;
@@ -57,14 +56,14 @@ public class SystemRoleController {
@PutMapping("/update")
@Operation(summary = "通过 id 更新角色")
@PreAuthorize("@ss.hasPermission('infra:system-role:update')")
public Integer updateSystemRole(@Validated(Id.class) @RequestBody SystemRoleUpdateRequest request) {
public Integer updateSystemRole(@Validated @RequestBody SystemRoleUpdateRequest request) {
return systemRoleService.updateSystemRoleById(request);
}
@PutMapping("/update-status")
@Operation(summary = "通过 id 更新角色状态")
@PreAuthorize("@ss.hasPermission('infra:system-role:update-status')")
public Integer updateRoleStatus(@Validated(Id.class) @RequestBody SystemRoleStatusRequest request) {
public Integer updateRoleStatus(@Validated @RequestBody SystemRoleStatusRequest request) {
return systemRoleService.updateRoleStatus(request);
}

View File

@@ -55,7 +55,7 @@ public class SystemUserController {
@PutMapping("/update")
@Operation(summary = "通过 id 更新用户")
@PreAuthorize("@ss.hasPermission('infra:system-user:update')")
public Integer updateSystemUser(@Validated(Id.class) @RequestBody SystemUserUpdateRequest request) {
public Integer updateSystemUser(@Validated @RequestBody SystemUserUpdateRequest request) {
return systemUserService.updateSystemUserById(request);
}