复制主机.

This commit is contained in:
lijiahangmax
2025-06-06 15:58:49 +08:00
parent fdd3be5a91
commit 1767079249
9 changed files with 133 additions and 4 deletions

View File

@@ -84,6 +84,17 @@ public class HostController {
return hostService.updateHostById(request);
}
@DemoDisableApi
@OperatorLog(HostOperatorType.CREATE)
@PostMapping("/copy")
@Operation(summary = "复制主机")
@PreAuthorize("@ss.hasPermission('asset:host:create')")
public Long copyHost(@Validated @RequestBody HostUpdateRequest request) {
Long id = request.getId();
request.setId(null);
return hostService.copyHost(id, request);
}
@DemoDisableApi
@OperatorLog(HostOperatorType.UPDATE_STATUS)
@PutMapping("/update-status")

View File

@@ -61,6 +61,8 @@ public interface HostConvert {
HostBaseVO toBase(HostDO domain);
HostCreateRequest toCreate(HostUpdateRequest request);
List<HostVO> toList(List<HostDO> domain);
List<HostBaseVO> toBaseList(List<HostDO> domain);

View File

@@ -57,6 +57,20 @@ public interface HostConfigDAO extends IMapper<HostConfigDO> {
.getOne();
}
/**
* 通过 hostId 查询
*
* @param hostId hostId
* @return config
*/
default List<HostConfigDO> selectByHostId(Long hostId) {
return this.of()
.createWrapper()
.eq(HostConfigDO::getHostId, hostId)
.then()
.list();
}
/**
* 更新配置状态
*

View File

@@ -26,6 +26,8 @@ import org.dromara.visor.common.handler.data.model.GenericsDataModel;
import org.dromara.visor.module.asset.entity.request.host.HostConfigQueryRequest;
import org.dromara.visor.module.asset.entity.request.host.HostConfigUpdateRequest;
import java.util.List;
/**
* 主机配置 服务类
*
@@ -43,6 +45,15 @@ public interface HostConfigService {
*/
Integer updateHostConfig(HostConfigUpdateRequest request);
/**
* 复制主机配置
*
* @param originId originId
* @param newId newId
* @param types types
*/
void copyHostConfig(Long originId, Long newId, List<String> types);
/**
* 获取主机配置
*

View File

@@ -75,4 +75,12 @@ public interface HostExtraService {
*/
Integer updateHostExtra(HostExtraUpdateRequest request);
/**
* 复制主机拓展信息
*
* @param originId originId
* @param newId newId
*/
void copyHostExtra(Long originId, Long newId);
}

View File

@@ -47,6 +47,15 @@ public interface HostService {
*/
Long createHost(HostCreateRequest request);
/**
* 复制主机
*
* @param originId originId
* @param request request
* @return id
*/
Long copyHost(Long originId, HostUpdateRequest request);
/**
* 通过 id 更新主机
*

View File

@@ -22,6 +22,8 @@
*/
package org.dromara.visor.module.asset.service.impl;
import cn.orionsec.kit.lang.function.Functions;
import cn.orionsec.kit.lang.utils.Strings;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.dromara.visor.common.constant.ErrorMessage;
@@ -42,6 +44,10 @@ import org.dromara.visor.module.asset.service.HostConfigService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 主机配置 服务实现类
@@ -102,6 +108,34 @@ public class HostConfigServiceImpl implements HostConfigService {
}
}
@Override
public void copyHostConfig(Long originId, Long newId, List<String> types) {
// 查询原始主机配置
Map<String, String> originHostConfigMap = hostConfigDAO.selectByHostId(originId)
.stream()
.collect(Collectors.toMap(HostConfigDO::getType,
HostConfigDO::getConfig,
Functions.right()));
// 新增
List<HostConfigDO> records = new ArrayList<>();
for (String type : types) {
// 获取原始配置
String configValue = originHostConfigMap.get(type);
if (Strings.isBlank(configValue)) {
// 获取默认值
configValue = HostTypeEnum.of(type).getDefault().serial();
}
HostConfigDO newConfig = HostConfigDO.builder()
.hostId(newId)
.type(type)
.status(EnableStatus.ENABLED.name())
.config(configValue)
.build();
records.add(newConfig);
}
hostConfigDAO.insertBatch(records);
}
@Override
public <T extends GenericsDataModel> T getHostConfig(Long hostId, String type) {
// 查询配置信息

View File

@@ -123,6 +123,29 @@ public class HostExtraServiceImpl implements HostExtraService {
return dataExtraApi.updateExtraValue(beforeExtraItem.getId(), newExtra.serial());
}
@Override
public void copyHostExtra(Long originId, Long newId) {
// 查询原始配置
DataExtraQueryDTO query = DataExtraQueryDTO.builder()
.userId(Const.SYSTEM_USER_ID)
.relId(originId)
.build();
List<DataExtraDTO> items = dataExtraApi.getExtraItems(query, DataExtraTypeEnum.HOST);
if (items.isEmpty()) {
return;
}
// 插入新配置
List<DataExtraSetDTO> newItems = items.stream()
.map(s -> DataExtraSetDTO.builder()
.userId(Const.SYSTEM_USER_ID)
.relId(newId)
.item(s.getItem())
.value(s.getValue())
.build())
.collect(Collectors.toList());
dataExtraApi.addExtraItems(newItems, DataExtraTypeEnum.HOST);
}
/**
* 检查配置项并且转为视图 (不存在则初始化默认值)
*

View File

@@ -49,10 +49,7 @@ import org.dromara.visor.module.asset.entity.vo.HostVO;
import org.dromara.visor.module.asset.enums.HostExtraItemEnum;
import org.dromara.visor.module.asset.enums.HostStatusEnum;
import org.dromara.visor.module.asset.handler.host.extra.model.HostSpecExtraModel;
import org.dromara.visor.module.asset.service.ExecJobHostService;
import org.dromara.visor.module.asset.service.ExecTemplateHostService;
import org.dromara.visor.module.asset.service.HostExtraService;
import org.dromara.visor.module.asset.service.HostService;
import org.dromara.visor.module.asset.service.*;
import org.dromara.visor.module.infra.api.DataExtraApi;
import org.dromara.visor.module.infra.api.DataGroupRelApi;
import org.dromara.visor.module.infra.api.FavoriteApi;
@@ -91,6 +88,9 @@ public class HostServiceImpl implements HostService {
@Resource
private HostConfigDAO hostConfigDAO;
@Resource
private HostConfigService hostConfigService;
@Resource
private HostExtraService hostExtraService;
@@ -138,6 +138,23 @@ public class HostServiceImpl implements HostService {
return id;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Long copyHost(Long originId, HostUpdateRequest request) {
log.info("HostService-copyHost originId: {}, request: {}", originId, JSON.toJSONString(request));
// 查询原始主机
HostDO originHost = hostDAO.selectById(originId);
Valid.notNull(originHost, ErrorMessage.HOST_ABSENT);
// 创建主机
Long newId = SpringHolder.getBean(HostService.class)
.createHost(HostConvert.MAPPER.toCreate(request));
// 复制主机额外信息
hostExtraService.copyHostExtra(originId, newId);
// 复制主机配置信息
hostConfigService.copyHostConfig(originId, newId, request.getTypes());
return newId;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Integer updateHostById(HostUpdateRequest request) {