diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/MachineInfoController.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/MachineInfoController.java index 1d4a473a..fb38425e 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/MachineInfoController.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/MachineInfoController.java @@ -1,126 +1,126 @@ -package cd.casic.module.machine.controller; - -import cd.casic.framework.commons.pojo.CommonResult; -import cd.casic.module.machine.entity.MachineInfo; -import cd.casic.module.machine.enums.ConnectionStatus; -import cd.casic.module.machine.service.MachineInfoService; -import cd.casic.module.machine.dto.MachineInfoDto; -import cd.casic.module.machine.utils.PageResult; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -import static cd.casic.framework.commons.pojo.CommonResult.success; - -@RestController -@Tag(name = "机器信息管理") -@RequestMapping("/api/machineInfo") -public class MachineInfoController { - @Resource - private MachineInfoService machineInfoService; - - @PostMapping("/add") - @Operation(summary = "新增机器信息") - public CommonResult add(@RequestBody MachineInfoDto machineInfoDto) { - return success(machineInfoService.addMachineInfo(machineInfoDto)); - } - - - @PostMapping("/list") - @Operation(summary = "获取机器信息列表") - public CommonResult> list(@RequestBody MachineInfoDto machineInfoDto) { - return success(machineInfoService.listMachineInfo(machineInfoDto)); - } - - @PutMapping("/update") - @Operation(summary = "编辑机器信息") - public CommonResult update(@RequestBody MachineInfoDto machineInfoDto) { - return success(machineInfoService.updateMachineInfo(machineInfoDto)); - } - - @PutMapping("/updateStatus") - @Operation(summary = "机器启用/停用") - public CommonResult updateStatus(@RequestBody MachineInfoDto machineInfoDto) { - return success(machineInfoService.updateStatus(machineInfoDto)); - } - - @PutMapping("/bindingSecretKey") - @Operation(summary = "绑定密钥") - public CommonResult bindingSecretKey(@RequestBody MachineInfoDto machineInfoDto) { - return success(machineInfoService.bindingSecretKey(machineInfoDto)); - } - - @DeleteMapping("/delete") - @Operation(summary = "机器信息删除") - public CommonResult delete(@RequestParam Long machineInfoId) { - machineInfoService.deleteMachineInfo(machineInfoId); - return success(true); - } - - @DeleteMapping("/deleteList") - @Operation(summary = "批量删除机器信息") - public CommonResult deleteList(@RequestParam String machineInfoIds) { - machineInfoService.deleteList(machineInfoIds); - return success(true); - } - - @PostMapping("/test") - @Operation(summary = "测试机器连接") - public CommonResult testConnection(@RequestParam Long id) { - return success(machineInfoService.testConnection(id)); - } - - @GetMapping("/status/{machineName}") - @Operation(summary = "获取机器连接状态") - public CommonResult getConnectionStatus(@PathVariable String machineName) { - return success(machineInfoService.getConnectionStatus(machineName)); - } - - @GetMapping("/status/all") - @Operation(summary = "获取所有机器连接状态") - public CommonResult> getAllConnectionStatus() { - return success(machineInfoService.getAllConnectionStatus()); - } - - @PostMapping("/connect") - @Operation(summary = "建立机器连接") - public CommonResult connect(@RequestBody MachineInfo machineInfo) { - return success(machineInfoService.connect(machineInfo)); - } - - @PostMapping("/disconnect/{sessionId}") - @Operation(summary = "断开机器连接") - public CommonResult disconnect(@PathVariable String sessionId) { - return success(machineInfoService.disconnect(sessionId)); - } - - @PostMapping("/execute/{sessionId}") - @Operation(summary = "执行远程命令") - public CommonResult executeCommand( - @PathVariable String sessionId, - @RequestBody String command) { - - return success(machineInfoService.executeCommand(sessionId, command)); - } - - @PostMapping("/upload/{sessionId}") - @Operation(summary = "上传文件到远程机器") - public CommonResult uploadFile( - @PathVariable String sessionId, - @RequestParam String localFilePath, - @RequestParam String remoteFilePath) { - return success(machineInfoService.uploadFile(sessionId, localFilePath, remoteFilePath)); - } - - @PostMapping("/download/{sessionId}") - @Operation(summary = "从远程机器下载文件") - public CommonResult downloadFile( - @PathVariable String sessionId, - @RequestParam String remoteFilePath, - @RequestParam String localFilePath) { - return success(machineInfoService.downloadFile(sessionId, remoteFilePath, localFilePath)); - } -} +//package cd.casic.module.machine.controller; +// +//import cd.casic.framework.commons.pojo.CommonResult; +//import cd.casic.framework.commons.pojo.PageResult; +//import cd.casic.module.machine.dal.dataobject.MachineInfo; +//import cd.casic.module.machine.enums.ConnectionStatus; +//import cd.casic.module.machine.service.MachineInfoService; +//import cd.casic.module.machine.controller.vo.MachineInfoDto; +//import io.swagger.v3.oas.annotations.Operation; +//import io.swagger.v3.oas.annotations.tags.Tag; +//import jakarta.annotation.Resource; +//import org.springframework.web.bind.annotation.*; +// +//import java.util.Map; +// +//import static cd.casic.framework.commons.pojo.CommonResult.success; +// +//@RestController +//@Tag(name = "机器信息管理") +//@RequestMapping("/api/machineInfo") +//public class MachineInfoController { +// @Resource +// private MachineInfoService machineInfoService; +// +// @PostMapping("/add") +// @Operation(summary = "新增机器信息") +// public CommonResult add(@RequestBody MachineInfoDto machineInfoDto) { +// return success(machineInfoService.addMachineInfo(machineInfoDto)); +// } +// +// +// @PostMapping("/list") +// @Operation(summary = "获取机器信息列表") +// public CommonResult> list(@RequestBody MachineInfoDto machineInfoDto) { +// return success(machineInfoService.listMachineInfo(machineInfoDto)); +// } +// +// @PutMapping("/update") +// @Operation(summary = "编辑机器信息") +// public CommonResult update(@RequestBody MachineInfoDto machineInfoDto) { +// return success(machineInfoService.updateMachineInfo(machineInfoDto)); +// } +// +// @PutMapping("/updateStatus") +// @Operation(summary = "机器启用/停用") +// public CommonResult updateStatus(@RequestBody MachineInfoDto machineInfoDto) { +// return success(machineInfoService.updateStatus(machineInfoDto)); +// } +// +// @PutMapping("/bindingSecretKey") +// @Operation(summary = "绑定密钥") +// public CommonResult bindingSecretKey(@RequestBody MachineInfoDto machineInfoDto) { +// return success(machineInfoService.bindingSecretKey(machineInfoDto)); +// } +// +// @DeleteMapping("/delete") +// @Operation(summary = "机器信息删除") +// public CommonResult delete(@RequestParam Long machineInfoId) { +// machineInfoService.deleteMachineInfo(machineInfoId); +// return success(true); +// } +// +// @DeleteMapping("/deleteList") +// @Operation(summary = "批量删除机器信息") +// public CommonResult deleteList(@RequestParam String machineInfoIds) { +// machineInfoService.deleteList(machineInfoIds); +// return success(true); +// } +// +// @PostMapping("/test") +// @Operation(summary = "测试机器连接") +// public CommonResult testConnection(@RequestParam Long id) { +// return success(machineInfoService.testConnection(id)); +// } +// +// @GetMapping("/status/{machineName}") +// @Operation(summary = "获取机器连接状态") +// public CommonResult getConnectionStatus(@PathVariable String machineName) { +// return success(machineInfoService.getConnectionStatus(machineName)); +// } +// +// @GetMapping("/status/all") +// @Operation(summary = "获取所有机器连接状态") +// public CommonResult> getAllConnectionStatus() { +// return success(machineInfoService.getAllConnectionStatus()); +// } +// +// @PostMapping("/connect") +// @Operation(summary = "建立机器连接") +// public CommonResult connect(@RequestBody MachineInfo machineInfo) { +// return success(machineInfoService.connect(machineInfo)); +// } +// +// @PostMapping("/disconnect/{sessionId}") +// @Operation(summary = "断开机器连接") +// public CommonResult disconnect(@PathVariable String sessionId) { +// return success(machineInfoService.disconnect(sessionId)); +// } +// +// @PostMapping("/execute/{sessionId}") +// @Operation(summary = "执行远程命令") +// public CommonResult executeCommand( +// @PathVariable String sessionId, +// @RequestBody String command) { +// +// return success(machineInfoService.executeCommand(sessionId, command)); +// } +// +// @PostMapping("/upload/{sessionId}") +// @Operation(summary = "上传文件到远程机器") +// public CommonResult uploadFile( +// @PathVariable String sessionId, +// @RequestParam String localFilePath, +// @RequestParam String remoteFilePath) { +// return success(machineInfoService.uploadFile(sessionId, localFilePath, remoteFilePath)); +// } +// +// @PostMapping("/download/{sessionId}") +// @Operation(summary = "从远程机器下载文件") +// public CommonResult downloadFile( +// @PathVariable String sessionId, +// @RequestParam String remoteFilePath, +// @RequestParam String localFilePath) { +// return success(machineInfoService.downloadFile(sessionId, remoteFilePath, localFilePath)); +// } +//} diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/MachineProxyController.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/MachineProxyController.java index 238c4bc2..16bbedb1 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/MachineProxyController.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/MachineProxyController.java @@ -1,67 +1,67 @@ -package cd.casic.module.machine.controller; - -import cd.casic.framework.commons.pojo.CommonResult; -import cd.casic.module.machine.service.MachineProxyService; -import cd.casic.module.machine.dto.MachineProxyDTO; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import static cd.casic.framework.commons.pojo.CommonResult.success; - -/** - * 机器代理控制器 - */ -@RestController -@RequestMapping("/api/machineProxy") -@Tag(name = "机器代理管理") -@RequiredArgsConstructor -public class MachineProxyController { - - @Resource - private MachineProxyService machineProxyService; - - @PostMapping("/register") - @Operation(summary = "注册新的机器代理") - public CommonResult register(@RequestBody MachineProxyDTO machineProxyDTO) { - machineProxyService.register(machineProxyDTO); - return success(true); - } - - @PostMapping("/list") - @Operation(summary = "获取代理列表") - public CommonResult list(@RequestBody MachineProxyDTO machineProxyDTO) { - return success(machineProxyService.list(machineProxyDTO)); - } - - @PutMapping("/updateStatus") - @Operation(summary = "更新代理状态") - public CommonResult updateStatus(@RequestBody MachineProxyDTO machineProxyDTO) { - machineProxyService.updateStatus(machineProxyDTO); - return success(true); - } - - @GetMapping("/statistics/status") - @Operation(summary = "获取所有代理的状态统计") - public CommonResult getStatusStatistics() { - return success(machineProxyService.getStatusStatistics()); - } - - @PutMapping("/update") - @Operation(summary = "更新代理信息") - public CommonResult updateConfig(@RequestBody MachineProxyDTO machineProxyDTO) { - machineProxyService.update(machineProxyDTO); - return success(true); - } - - @DeleteMapping("/batch") - @Operation(summary = "批量删除代理") - public CommonResult deleteBatch(@RequestParam String ids) { - machineProxyService.delete(ids); - return success(true); - } - -} +//package cd.casic.module.machine.controller; +// +//import cd.casic.framework.commons.pojo.CommonResult; +//import cd.casic.module.machine.service.MachineProxyService; +//import cd.casic.module.machine.controller.vo.MachineProxyDTO; +// +//import io.swagger.v3.oas.annotations.Operation; +//import io.swagger.v3.oas.annotations.tags.Tag; +//import jakarta.annotation.Resource; +//import lombok.RequiredArgsConstructor; +//import org.springframework.web.bind.annotation.*; +// +//import static cd.casic.framework.commons.pojo.CommonResult.success; +// +///** +// * 机器代理控制器 +// */ +//@RestController +//@RequestMapping("/api/machineProxy") +//@Tag(name = "机器代理管理") +//@RequiredArgsConstructor +//public class MachineProxyController { +// +// @Resource +// private MachineProxyService machineProxyService; +// +// @PostMapping("/register") +// @Operation(summary = "注册新的机器代理") +// public CommonResult register(@RequestBody MachineProxyDTO machineProxyDTO) { +// machineProxyService.register(machineProxyDTO); +// return success(true); +// } +// +// @PostMapping("/list") +// @Operation(summary = "获取代理列表") +// public CommonResult list(@RequestBody MachineProxyDTO machineProxyDTO) { +// return success(machineProxyService.list(machineProxyDTO)); +// } +// +// @PutMapping("/updateStatus") +// @Operation(summary = "更新代理状态") +// public CommonResult updateStatus(@RequestBody MachineProxyDTO machineProxyDTO) { +// machineProxyService.updateStatus(machineProxyDTO); +// return success(true); +// } +// +// @GetMapping("/statistics/status") +// @Operation(summary = "获取所有代理的状态统计") +// public CommonResult getStatusStatistics() { +// return success(machineProxyService.getStatusStatistics()); +// } +// +// @PutMapping("/update") +// @Operation(summary = "更新代理信息") +// public CommonResult updateConfig(@RequestBody MachineProxyDTO machineProxyDTO) { +// machineProxyService.update(machineProxyDTO); +// return success(true); +// } +// +// @DeleteMapping("/batch") +// @Operation(summary = "批量删除代理") +// public CommonResult deleteBatch(@RequestParam String ids) { +// machineProxyService.delete(ids); +// return success(true); +// } +// +//} diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/SecretKeyController.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/SecretKeyController.java index e9027d3b..4c204ae1 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/SecretKeyController.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/SecretKeyController.java @@ -1,58 +1,56 @@ -package cd.casic.module.machine.controller; - -import cd.casic.framework.commons.pojo.CommonResult; -import cd.casic.module.machine.entity.SecretKey; -import cd.casic.module.machine.service.SecretKeyService; -import cd.casic.module.machine.dto.SecretKeyDto; -import cd.casic.module.machine.utils.PageResult; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import org.springframework.core.io.InputStreamResource; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import java.util.List; - -import static cd.casic.framework.commons.pojo.CommonResult.success; - -@RestController -@RequestMapping("/api/secretKey") -@Tag(name = "密钥管理") -public class SecretKeyController { - @Resource - private SecretKeyService secretKeyService; - - @PostMapping(value = "/add") - @Operation(summary = "新增密钥") - public CommonResult add(@RequestBody SecretKeyDto secretKeyDto) throws Exception { - return success(secretKeyService.addSecretKey(secretKeyDto)); - } - - @PutMapping("/bindingMachine") - @Operation(summary = "绑定机器") - public CommonResult bindingMachine(@RequestParam("secretKeyId") Long secretKeyId, @RequestParam("machineIds") List machineIds) { - secretKeyService.bindingMachine(secretKeyId, machineIds); - return success(true); - } - - @PutMapping("/update") - @Operation(summary = "编辑密钥信息") - public CommonResult update(@RequestBody SecretKeyDto secretKeyDto) { - return success(secretKeyService.updateSecretKey(secretKeyDto)); - } - - @DeleteMapping("/deleteList") - @Operation(summary = "批量删除密钥") - public CommonResult deleteList(@RequestParam("secretKeyId") List secretKeyIds) { - return success(secretKeyService.deleteList(secretKeyIds)); - } - - @PostMapping("/list") - @Operation(summary = "获取密钥信息列表") - public CommonResult> list(@RequestBody SecretKeyDto secretKeyDto) { - return success(secretKeyService.listSecretKey(secretKeyDto)); - } - - -} +//package cd.casic.module.machine.controller; +// +//import cd.casic.framework.commons.pojo.CommonResult; +//import cd.casic.framework.commons.pojo.PageResult; +//import cd.casic.module.machine.dal.dataobject.SecretKey; +//import cd.casic.module.machine.service.SecretKeyService; +//import cd.casic.module.machine.controller.vo.SecretKeyDto; +//import io.swagger.v3.oas.annotations.Operation; +//import io.swagger.v3.oas.annotations.tags.Tag; +//import jakarta.annotation.Resource; +//import org.springframework.web.bind.annotation.*; +// +//import java.util.List; +// +//import static cd.casic.framework.commons.pojo.CommonResult.success; +// +//@RestController +//@RequestMapping("/api/secretKey") +//@Tag(name = "密钥管理") +//public class SecretKeyController { +// @Resource +// private SecretKeyService secretKeyService; +// +// @PostMapping(value = "/add") +// @Operation(summary = "新增密钥") +// public CommonResult add(@RequestBody SecretKeyDto secretKeyDto) throws Exception { +// return success(secretKeyService.addSecretKey(secretKeyDto)); +// } +// +// @PutMapping("/bindingMachine") +// @Operation(summary = "绑定机器") +// public CommonResult bindingMachine(@RequestParam("secretKeyId") Long secretKeyId, @RequestParam("machineIds") List machineIds) { +// secretKeyService.bindingMachine(secretKeyId, machineIds); +// return success(true); +// } +// +// @PutMapping("/update") +// @Operation(summary = "编辑密钥信息") +// public CommonResult update(@RequestBody SecretKeyDto secretKeyDto) { +// return success(secretKeyService.updateSecretKey(secretKeyDto)); +// } +// +// @DeleteMapping("/deleteList") +// @Operation(summary = "批量删除密钥") +// public CommonResult deleteList(@RequestParam("secretKeyId") List secretKeyIds) { +// return success(secretKeyService.deleteList(secretKeyIds)); +// } +// +// @PostMapping("/list") +// @Operation(summary = "获取密钥信息列表") +// public CommonResult> list(@RequestBody SecretKeyDto secretKeyDto) { +// return success(secretKeyService.listSecretKey(secretKeyDto)); +// } +// +// +//} diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dto/MachineInfoDto.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/vo/MachineInfoDto.java similarity index 94% rename from modules/module-ci-machine/src/main/java/cd/casic/module/machine/dto/MachineInfoDto.java rename to modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/vo/MachineInfoDto.java index 9a2e2efc..81371e4a 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dto/MachineInfoDto.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/vo/MachineInfoDto.java @@ -1,4 +1,4 @@ -package cd.casic.module.machine.dto; +package cd.casic.module.machine.controller.vo; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dto/MachineProxyDTO.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/vo/MachineProxyVO.java similarity index 90% rename from modules/module-ci-machine/src/main/java/cd/casic/module/machine/dto/MachineProxyDTO.java rename to modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/vo/MachineProxyVO.java index f8d78c27..74e3f6cb 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dto/MachineProxyDTO.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/vo/MachineProxyVO.java @@ -1,4 +1,4 @@ -package cd.casic.module.machine.dto; +package cd.casic.module.machine.controller.vo; import cd.casic.module.machine.enums.MachineProxyStatus; import lombok.*; @@ -15,7 +15,7 @@ import java.util.Objects; @Builder @NoArgsConstructor @AllArgsConstructor -public class MachineProxyDTO extends PageDto implements Serializable { +public class MachineProxyVO extends PageDto implements Serializable { private static final long serialVersionUID = 1L; private Long id; diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dto/SecretKeyDto.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/vo/SecretKeyDto.java similarity index 87% rename from modules/module-ci-machine/src/main/java/cd/casic/module/machine/dto/SecretKeyDto.java rename to modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/vo/SecretKeyDto.java index 439a7697..c23b3836 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dto/SecretKeyDto.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/controller/vo/SecretKeyDto.java @@ -1,10 +1,9 @@ -package cd.casic.module.machine.dto; +package cd.casic.module.machine.controller.vo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import org.springframework.web.multipart.MultipartFile; import java.util.Date; import java.util.List; diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/entity/MachineInfo.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dal/dataobject/MachineInfo.java similarity index 97% rename from modules/module-ci-machine/src/main/java/cd/casic/module/machine/entity/MachineInfo.java rename to modules/module-ci-machine/src/main/java/cd/casic/module/machine/dal/dataobject/MachineInfo.java index 6564c264..ab3d1d50 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/entity/MachineInfo.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dal/dataobject/MachineInfo.java @@ -1,4 +1,4 @@ -package cd.casic.module.machine.entity; +package cd.casic.module.machine.dal.dataobject; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/entity/MachineProxy.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dal/dataobject/MachineProxy.java similarity index 91% rename from modules/module-ci-machine/src/main/java/cd/casic/module/machine/entity/MachineProxy.java rename to modules/module-ci-machine/src/main/java/cd/casic/module/machine/dal/dataobject/MachineProxy.java index f17e251a..be056d51 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/entity/MachineProxy.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dal/dataobject/MachineProxy.java @@ -1,10 +1,8 @@ -package cd.casic.module.machine.entity; +package cd.casic.module.machine.dal.dataobject; import cd.casic.module.machine.enums.MachineProxyStatus; import com.baomidou.mybatisplus.annotation.*; -import cd.casic.module.machine.enums.MachineInfoStatus; import cd.casic.module.machine.enums.MachineProxyType; -import jakarta.validation.Valid; import lombok.*; import java.io.Serializable; diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/entity/SecretKey.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dal/dataobject/SecretKey.java similarity index 93% rename from modules/module-ci-machine/src/main/java/cd/casic/module/machine/entity/SecretKey.java rename to modules/module-ci-machine/src/main/java/cd/casic/module/machine/dal/dataobject/SecretKey.java index f747c461..a1d4e820 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/entity/SecretKey.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dal/dataobject/SecretKey.java @@ -1,4 +1,4 @@ -package cd.casic.module.machine.entity; +package cd.casic.module.machine.dal.dataobject; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dal/mysql/MachineInfoMapper.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dal/mysql/MachineInfoMapper.java new file mode 100644 index 00000000..d8a4257b --- /dev/null +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dal/mysql/MachineInfoMapper.java @@ -0,0 +1,11 @@ +package cd.casic.module.machine.dal.mysql; + +import cd.casic.framework.mybatis.core.mapper.BaseMapperX; +import cd.casic.module.machine.dal.dataobject.MachineEnvDO; +import cd.casic.module.machine.dal.dataobject.MachineInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface MachineInfoMapper extends BaseMapperX { +} diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/mapper/MachineProxyMapper.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dal/mysql/MachineProxyMapper.java similarity index 67% rename from modules/module-ci-machine/src/main/java/cd/casic/module/machine/mapper/MachineProxyMapper.java rename to modules/module-ci-machine/src/main/java/cd/casic/module/machine/dal/mysql/MachineProxyMapper.java index f372293f..6bae3e38 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/mapper/MachineProxyMapper.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dal/mysql/MachineProxyMapper.java @@ -1,5 +1,5 @@ -package cd.casic.module.machine.mapper; -import cd.casic.module.machine.entity.MachineProxy; +package cd.casic.module.machine.dal.mysql; +import cd.casic.module.machine.dal.dataobject.MachineProxy; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/mapper/SecretServiceMapper.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dal/mysql/SecretServiceMapper.java similarity index 64% rename from modules/module-ci-machine/src/main/java/cd/casic/module/machine/mapper/SecretServiceMapper.java rename to modules/module-ci-machine/src/main/java/cd/casic/module/machine/dal/mysql/SecretServiceMapper.java index 9f074063..26e92c18 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/mapper/SecretServiceMapper.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/dal/mysql/SecretServiceMapper.java @@ -1,6 +1,6 @@ -package cd.casic.module.machine.mapper; +package cd.casic.module.machine.dal.mysql; -import cd.casic.module.machine.entity.SecretKey; +import cd.casic.module.machine.dal.dataobject.SecretKey; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/handler/ConnectionSession.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/handler/ConnectionSession.java index 8936ab2a..dcbfe7e7 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/handler/ConnectionSession.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/handler/ConnectionSession.java @@ -1,639 +1,639 @@ -package cd.casic.module.machine.handler; -import cd.casic.module.machine.utils.AliYunOssClient; -import cd.casic.module.machine.entity.MachineInfo; -import cd.casic.module.machine.entity.SecretKey; -import cd.casic.module.machine.enums.ConnectionStatus; -import cd.casic.module.machine.service.SecretKeyService; -import com.jcraft.jsch.*; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.util.StreamUtils; -import org.springframework.util.StringUtils; -import java.io.*; -import java.nio.charset.StandardCharsets; -import java.util.Objects; -import java.util.Properties; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * 优化后的SSH连接会话类 - */ -@Slf4j -@Component -public class ConnectionSession implements AutoCloseable { - @Resource - SecretKeyService secretKeyService; - - @Resource - AliYunOssClient aliYunOssClient; - - private MachineInfo machineInfo; - private Session sshSession; - private ConnectionStatus status = ConnectionStatus.DISCONNECTED; - private final AtomicBoolean isExecuting = new AtomicBoolean(false); - - // todo连接配置常量 - private static final int CONNECTION_TIMEOUT = 5000; // 连接超时时间(毫秒) - private static final int COMMAND_TIMEOUT = 30000; // 命令执行超时时间(毫秒) - private static final int RETRY_COUNT = 3; // 重试次数 - private static final int RETRY_DELAY = 1000; // 重试间隔(毫秒) - - public ConnectionSession() { - - } - - // 使用setter注入MachineInfo - public void setMachineInfo(MachineInfo machineInfo) { - this.machineInfo = Objects.requireNonNull(machineInfo, "MachineInfo cannot be null"); - log.debug("MachineInfo 已注入: {}", machineInfo.getHostIp()); - } - - - - /** - * 建立SSH连接,支持重试机制 - */ - public synchronized void connect() throws JSchException { - if (status == ConnectionStatus.CONNECTED) { - log.debug("Already connected to {}", machineInfo.getHostIp()); - return; - } - - status = ConnectionStatus.CONNECTING; - JSchException lastException = null; - - for (int attempt = 1; attempt <= RETRY_COUNT; attempt++) { - try { - doConnect(); - status = ConnectionStatus.CONNECTED; - log.info("SSH connection established successfully to {} (attempt {}/{})", - machineInfo.getHostIp(), attempt, RETRY_COUNT); - return; - } catch (JSchException e) { - lastException = e; - status = ConnectionStatus.CONNECTION_ERROR; - log.error("SSH connection attempt {}/{} failed: {}", - attempt, RETRY_COUNT, e.getMessage()); - - // 认证失败直接退出,无需重试 - if (e.getMessage().contains("Auth fail")) { - status = ConnectionStatus.AUTH_FAILED; - throw e; - } - - // 重试前等待 - if (attempt < RETRY_COUNT) { - try { - Thread.sleep(RETRY_DELAY); - } catch (InterruptedException ie) { - Thread.currentThread().interrupt(); - throw new JSchException("Connection attempt interrupted", ie); - } - } - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - // 所有重试都失败 - throw new JSchException("Failed to connect after " + RETRY_COUNT + " attempts", lastException); - } - - /** - * 实际执行连接逻辑 - */ - private void doConnect() throws JSchException, IOException { - JSch jsch = new JSch(); - - // 配置认证方式 - configureAuthentication(jsch); - - // 创建SSH会话 - sshSession = jsch.getSession( - machineInfo.getUsername(), - machineInfo.getHostIp(), - machineInfo.getSshPort() != null ? machineInfo.getSshPort() : 22 - ); - - // 配置连接参数 - configureSession(sshSession); - - // 建立连接 - sshSession.connect(CONNECTION_TIMEOUT); - } - - /** - * 配置认证方式(密码或密钥) - */ - private void configureAuthentication(JSch jsch) throws JSchException { - if (machineInfo.getAuthenticationTypeCode() == 2) { - // 密钥认证 - if (machineInfo.getSecretKeyId() == null) { - throw new JSchException("Secret key ID is required for key-based authentication"); - } - - String privateKeyContent = getPrivateKeyContent(machineInfo.getSecretKeyId()); - // 验证私钥格式 - if (!privateKeyContent.startsWith("-----BEGIN")) { - throw new JSchException("Invalid private key format. Expected OpenSSH format."); - } - - try { - // 尝试加载私钥 - jsch.addIdentity( - machineInfo.getName(), - privateKeyContent.getBytes(StandardCharsets.UTF_8), - null, - null - ); - log.info("Private key loaded successfully for {}", machineInfo.getHostIp()); - } catch (JSchException e) { - log.error("Failed to load private key: {}", e.getMessage()); - throw e; - } - } else if (machineInfo.getAuthenticationTypeCode() == 1) { - // 密码认证 - if (StringUtils.isEmpty(machineInfo.getPassword())) { - throw new JSchException("Password is required for password-based authentication"); - } - } else { - throw new JSchException("Unsupported authentication type: " + machineInfo.getAuthenticationType()); - } - } - - /** - * 配置SSH会话参数(安全增强) - */ - private void configureSession(Session session) { - Properties config = new Properties(); - - // 安全增强:默认验证主机密钥 - if (isTrustedEnvironment()) { - log.warn("Running in trusted environment - disabling strict host key checking for {}", - machineInfo.getHostIp()); - config.put("StrictHostKeyChecking", "no"); - } else { - config.put("StrictHostKeyChecking", "yes"); - // 可选:配置已知主机文件路径 - //直接配置阿里云密钥地址 - config.put("UserKnownHostsFile", secretKeyService.getById(machineInfo.getSecretKeyId()).getPath()); - } - - // 其他安全配置 - config.put("PreferredAuthentications", "publicKey,password,keyboard-interactive"); - config.put("ServerAliveInterval", "30"); // 每30秒发送一次心跳 - config.put("ServerAliveCountMax", "3"); // 允许3次心跳失败 - - session.setConfig(config); - } - - /** - * 判断是否为可信环境(生产环境应返回false) - */ - private boolean isTrustedEnvironment() { - // todo实际项目中应基于配置或环境变量判断 - return System.getProperty("environment", "production").equalsIgnoreCase("development"); - } - - @Override - public synchronized void close() { - disconnect(); - } - - public synchronized void disconnect() { - if (sshSession != null && sshSession.isConnected()) { - try { - sshSession.disconnect(); - log.info("SSH connection closed: {}", machineInfo.getHostIp()); - } catch (Exception e) { - log.error("Error closing SSH session: {}", e.getMessage()); - } - } - status = ConnectionStatus.DISCONNECTED; - } - - /** - * 执行远程命令,支持超时和中断处理 - */ - public String executeCommand(String command) throws JSchException, IOException { - if (!isConnected()) { - throw new IllegalStateException("Session is not connected"); - } - - if (!isExecuting.compareAndSet(false, true)) { - throw new IllegalStateException("Another command is already executing"); - } - - Channel channel = null; - InputStream inputStream = null; - ByteArrayOutputStream outputStream = null; - - try { - channel = createExecChannel(command); - inputStream = channel.getInputStream(); - outputStream = new ByteArrayOutputStream(); - - // 连接通道并设置超时 - channel.connect(COMMAND_TIMEOUT); - - // 读取命令输出 - return readCommandOutput(inputStream, outputStream, channel); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - throw new IOException("Command execution interrupted", e); - } finally { - // 释放资源 - closeResources(channel, inputStream, outputStream); - isExecuting.set(false); - } - } - - /** - * 创建并配置命令执行通道 - */ - private Channel createExecChannel(String command) throws JSchException { - Channel channel = sshSession.openChannel("exec"); - ((ChannelExec) channel).setCommand(command); - - // 配置通道 - channel.setInputStream(null); - ((ChannelExec) channel).setErrStream(new ByteArrayOutputStream()); // 捕获错误输出 - - return channel; - } - - /** - * 读取命令输出 - */ - private String readCommandOutput(InputStream inputStream, - ByteArrayOutputStream outputStream, - Channel channel) throws IOException, InterruptedException { - byte[] buffer = new byte[1024]; - - - // 使用线程中断机制实现超时控制 - Thread readerThread = new Thread(() -> { - int bytesRead; - try { - while ((bytesRead = inputStream.read(buffer)) != -1) { - outputStream.write(buffer, 0, bytesRead); - } - } catch (IOException e) { - // 通道关闭或读取异常 - if (channel.isConnected()) { - log.warn("Error reading command output: {}", e.getMessage()); - } - } - }); - - readerThread.start(); - - // 等待命令执行完成或超时 - readerThread.join(COMMAND_TIMEOUT); - - // 如果线程仍在运行,中断并关闭通道 - if (readerThread.isAlive()) { - readerThread.interrupt(); - channel.disconnect(); - throw new IOException("Command execution timed out after " + COMMAND_TIMEOUT + "ms"); - } - - // 等待通道完全关闭 - while (channel.isConnected()) { - Thread.sleep(100); - } - - return outputStream.toString(StandardCharsets.UTF_8); - } - - /** - * 关闭资源 - */ - private void closeResources(Channel channel, InputStream inputStream, OutputStream outputStream) { - if (outputStream != null) { - try { - outputStream.close(); - } catch (IOException e) { - log.warn("Error closing output stream: {}", e.getMessage()); - } - } - - if (inputStream != null) { - try { - inputStream.close(); - } catch (IOException e) { - log.warn("Error closing input stream: {}", e.getMessage()); - } - } - - if (channel != null && channel.isConnected()) { - channel.disconnect(); - } - } - - /** - * 上传文件到远程服务器 - */ - public boolean uploadFile(String localFilePath, String remoteFilePath) throws IOException { - if (!isConnected()) { - throw new IllegalStateException("Cannot upload file: SSH session is not connected"); - } - - // 检查本地文件是否存在且可读 - File localFile = new File(localFilePath); - if (!localFile.exists()) { - throw new FileNotFoundException("Local file not found: " + localFilePath); - } - if (!localFile.canRead()) { - throw new IOException("Cannot read local file: " + localFilePath); - } - - ChannelSftp channel = null; - boolean uploadSuccess = false; - - try { - // 创建并连接SFTP通道,设置超时 - channel = (ChannelSftp) sshSession.openChannel("sftp"); - channel.connect(CONNECTION_TIMEOUT); - - // 确保目标目录存在 - createRemoteDirectoryIfNotExists(channel, getParentDirectory(remoteFilePath)); - - // 使用更健壮的上传方式 - channel.put( - new FileInputStream(localFile), - remoteFilePath, - new ProgressMonitorAdapter(localFile.length()), - ChannelSftp.OVERWRITE - ); - - uploadSuccess = true; - log.info("File uploaded successfully: {} -> {}", localFilePath, remoteFilePath); - return true; - - } catch (SftpException e) { - log.error("SFTP error during file upload ({} -> {}): {}", - localFilePath, remoteFilePath, e.getMessage(), e); - throw new IOException("SFTP error: " + e.getMessage(), e); - } catch (FileNotFoundException e) { - log.error("Local file not found during upload: {}", localFilePath, e); - throw e; - } catch (IOException e) { - log.error("IO error during file upload: {}", e.getMessage(), e); - throw e; - } catch (Exception e) { - log.error("Unexpected error during file upload: {}", e.getMessage(), e); - throw new IOException("Unexpected error: " + e.getMessage(), e); - } finally { - // 确保通道始终被关闭 - disconnectChannel(channel); - -// // 如果上传失败,尝试删除不完整的文件 -// if (!uploadSuccess && remoteFilePath != null && !remoteFilePath.isEmpty()) { -// tryDeleteIncompleteFile(remoteFilePath); +//package cd.casic.module.machine.handler; +//import cd.casic.module.machine.utils.AliYunOssClient; +//import cd.casic.module.machine.dal.dataobject.MachineInfo; +//import cd.casic.module.machine.dal.dataobject.SecretKey; +//import cd.casic.module.machine.enums.ConnectionStatus; +//import cd.casic.module.machine.service.SecretKeyService; +//import com.jcraft.jsch.*; +//import jakarta.annotation.Resource; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Component; +//import org.springframework.util.StreamUtils; +//import org.springframework.util.StringUtils; +//import java.io.*; +//import java.nio.charset.StandardCharsets; +//import java.util.Objects; +//import java.util.Properties; +//import java.util.concurrent.atomic.AtomicBoolean; +// +///** +// * 优化后的SSH连接会话类 +// */ +//@Slf4j +//@Component +//public class ConnectionSession implements AutoCloseable { +// @Resource +// SecretKeyService secretKeyService; +// +// @Resource +// AliYunOssClient aliYunOssClient; +// +// private MachineInfo machineInfo; +// private Session sshSession; +// private ConnectionStatus status = ConnectionStatus.DISCONNECTED; +// private final AtomicBoolean isExecuting = new AtomicBoolean(false); +// +// // todo连接配置常量 +// private static final int CONNECTION_TIMEOUT = 5000; // 连接超时时间(毫秒) +// private static final int COMMAND_TIMEOUT = 30000; // 命令执行超时时间(毫秒) +// private static final int RETRY_COUNT = 3; // 重试次数 +// private static final int RETRY_DELAY = 1000; // 重试间隔(毫秒) +// +// public ConnectionSession() { +// +// } +// +// // 使用setter注入MachineInfo +// public void setMachineInfo(MachineInfo machineInfo) { +// this.machineInfo = Objects.requireNonNull(machineInfo, "MachineInfo cannot be null"); +// log.debug("MachineInfo 已注入: {}", machineInfo.getHostIp()); +// } +// +// +// +// /** +// * 建立SSH连接,支持重试机制 +// */ +// public synchronized void connect() throws JSchException { +// if (status == ConnectionStatus.CONNECTED) { +// log.debug("Already connected to {}", machineInfo.getHostIp()); +// return; +// } +// +// status = ConnectionStatus.CONNECTING; +// JSchException lastException = null; +// +// for (int attempt = 1; attempt <= RETRY_COUNT; attempt++) { +// try { +// doConnect(); +// status = ConnectionStatus.CONNECTED; +// log.info("SSH connection established successfully to {} (attempt {}/{})", +// machineInfo.getHostIp(), attempt, RETRY_COUNT); +// return; +// } catch (JSchException e) { +// lastException = e; +// status = ConnectionStatus.CONNECTION_ERROR; +// log.error("SSH connection attempt {}/{} failed: {}", +// attempt, RETRY_COUNT, e.getMessage()); +// +// // 认证失败直接退出,无需重试 +// if (e.getMessage().contains("Auth fail")) { +// status = ConnectionStatus.AUTH_FAILED; +// throw e; +// } +// +// // 重试前等待 +// if (attempt < RETRY_COUNT) { +// try { +// Thread.sleep(RETRY_DELAY); +// } catch (InterruptedException ie) { +// Thread.currentThread().interrupt(); +// throw new JSchException("Connection attempt interrupted", ie); +// } +// } +// } catch (IOException e) { +// throw new RuntimeException(e); // } - } - } - - public boolean downloadFile(String remoteFilePath, String localFilePath) throws IOException { - if (!isConnected()) { - throw new IllegalStateException("Cannot download file: SSH session is not connected"); - } - - // 检查本地目录是否存在且可写 - File localFile = new File(localFilePath); - File parentDir = localFile.getParentFile(); - if (parentDir != null && !parentDir.exists()) { - if (!parentDir.mkdirs()) { - throw new IOException("Failed to create local directory: " + parentDir.getAbsolutePath()); - } - } - if (parentDir != null && !parentDir.canWrite()) { - throw new IOException("Cannot write to local directory: " + parentDir.getAbsolutePath()); - } - - ChannelSftp channel = null; - boolean downloadSuccess = false; - File tempFile = null; - - try { - // 创建并连接SFTP通道,设置超时 - channel = (ChannelSftp) sshSession.openChannel("sftp"); - channel.connect(CONNECTION_TIMEOUT); - - // 检查远程文件是否存在 - SftpATTRS attrs = channel.stat(remoteFilePath); - long fileSize = attrs.getSize(); - - // 使用临时文件避免部分下载覆盖完整文件 - tempFile = new File(localFilePath + ".part"); - - // 执行下载并监控进度 - channel.get( - remoteFilePath, - new FileOutputStream(tempFile).toString(), - new ProgressMonitorAdapter(fileSize), - ChannelSftp.OVERWRITE - ); - - // 验证下载完整性 - if (tempFile.length() != fileSize) { - throw new IOException("Download incomplete: expected " + fileSize + - " bytes, but got " + tempFile.length() + " bytes"); - } - - // 重命名临时文件为目标文件(原子操作) - if (!tempFile.renameTo(localFile)) { - throw new IOException("Failed to rename temporary file to: " + localFilePath); - } - - downloadSuccess = true; - log.info("File downloaded successfully: {} -> {}", remoteFilePath, localFilePath); - return true; - - } catch (SftpException e) { - log.error("SFTP error during file download ({} -> {}): {}", - remoteFilePath, localFilePath, e.getMessage(), e); - if (e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE) { - throw new FileNotFoundException("Remote file not found: " + remoteFilePath); - } - throw new IOException("SFTP error: " + e.getMessage(), e); - } catch (IOException e) { - log.error("IO error during file download: {}", e.getMessage(), e); - throw e; - } catch (Exception e) { - log.error("Unexpected error during file download: {}", e.getMessage(), e); - throw new IOException("Unexpected error: " + e.getMessage(), e); - } finally { - // 确保通道始终被关闭 - disconnectChannel(channel); - - // 如果下载失败,清理临时文件 - if (!downloadSuccess && tempFile != null && tempFile.exists()) { - if (tempFile.delete()) { - log.debug("Deleted incomplete temporary file: {}", tempFile.getAbsolutePath()); - } else { - log.warn("Failed to delete incomplete temporary file: {}", tempFile.getAbsolutePath()); - } - } - } - } - - // 创建远程目录(如果不存在) - private void createRemoteDirectoryIfNotExists(ChannelSftp channel, String directory) throws SftpException { - if (directory == null || directory.isEmpty() || directory.equals("/")) { - return; - } - - try { - channel.stat(directory); - } catch (SftpException e) { - // 目录不存在,尝试创建 - createRemoteDirectoryIfNotExists(channel, getParentDirectory(directory)); - channel.mkdir(directory); - log.debug("Created remote directory: {}", directory); - } - } - - // 获取路径的父目录 - private String getParentDirectory(String path) { - int lastSlash = path.lastIndexOf('/'); - return lastSlash > 0 ? path.substring(0, lastSlash) : ""; - } - - // 断开SFTP通道 - private void disconnectChannel(Channel channel) { - if (channel != null && channel.isConnected()) { - try { - channel.disconnect(); - log.debug("SFTP channel disconnected"); - } catch (Exception e) { - log.warn("Error disconnecting SFTP channel: {}", e.getMessage()); - } - } - } - - // 尝试删除不完整的文件 - private void tryDeleteIncompleteFile(String remoteFilePath) { - ChannelSftp channel = null; - try { - channel = (ChannelSftp) sshSession.openChannel("sftp"); - channel.connect(CONNECTION_TIMEOUT); - channel.rm(remoteFilePath); - log.info("Deleted incomplete file: {}", remoteFilePath); - } catch (Exception e) { - log.warn("Failed to delete incomplete file {}: {}", remoteFilePath, e.getMessage()); - } finally { - disconnectChannel(channel); - } - } - - // 增强的进度监控器 - private static class ProgressMonitorAdapter implements SftpProgressMonitor { - private final long totalBytes; - private long bytesWritten = 0; - private int lastProgress = 0; - private final long startTime = System.currentTimeMillis(); - - public ProgressMonitorAdapter(long totalBytes) { - this.totalBytes = totalBytes; - } - - @Override - public boolean count(long count) { - bytesWritten += count; - - // 计算进度百分比 - int progress = (int) ((bytesWritten * 100) / totalBytes); - - // 每10%或每秒更新一次日志 - long elapsedTime = System.currentTimeMillis() - startTime; - if (progress - lastProgress >= 10 || elapsedTime >= 1000) { - double speed = bytesWritten / (elapsedTime / 1000.0); - String speedStr = formatTransferSpeed(speed); - - log.debug("Upload progress: {}% ({}/{} bytes, {})", - progress, bytesWritten, totalBytes, speedStr); - lastProgress = progress; - } - - return true; // 返回true继续传输,返回false中断传输 - } - - @Override - public void end() { - long elapsedTime = System.currentTimeMillis() - startTime; - double speed = totalBytes / (elapsedTime / 1000.0); - String speedStr = formatTransferSpeed(speed); - - log.info("Upload completed: {} bytes in {} ms (avg speed: {})", - totalBytes, elapsedTime, speedStr); - } - - @Override - public void init(int op, String src, String dest, long max) { - log.info("Starting upload: {} -> {} ({} bytes)", src, dest, max); - } - - // 格式化传输速度 - private String formatTransferSpeed(double bytesPerSecond) { - String[] units = {"B/s", "KB/s", "MB/s", "GB/s"}; - int unitIndex = 0; - - while (bytesPerSecond >= 1024 && unitIndex < units.length - 1) { - bytesPerSecond /= 1024; - unitIndex++; - } - - return String.format("%.2f %s", bytesPerSecond, units[unitIndex]); - } - } - - - /** - * 检查连接状态 - */ - public ConnectionStatus getStatus() { - if (status == ConnectionStatus.CONNECTED && - (sshSession == null || !sshSession.isConnected())) { - status = ConnectionStatus.DISCONNECTED; - } - return status; - } - - /** - * 检查是否已连接 - */ - public boolean isConnected() { - return status == ConnectionStatus.CONNECTED && - sshSession != null && - sshSession.isConnected(); - } - - - private String getPrivateKeyContent(Long secretKeyId) { - if (secretKeyId == null) { - return null; - } - SecretKey secretKey = secretKeyService.getById(secretKeyId); - byte[] content; - try { - content = aliYunOssClient.getContent(secretKey.getPath().substring(secretKey.getPath().lastIndexOf("/") + 1)); - } catch (Exception e) { - throw new RuntimeException(e); - } - - //改为S3FileClient读取 - InputStream read = new ByteArrayInputStream(content); - - try { - return StreamUtils.copyToString(read, StandardCharsets.UTF_8); - } catch (IOException e) { - log.error("读取私钥文件失败", e); - throw new RuntimeException(e); - } - - - } -} +// } +// +// // 所有重试都失败 +// throw new JSchException("Failed to connect after " + RETRY_COUNT + " attempts", lastException); +// } +// +// /** +// * 实际执行连接逻辑 +// */ +// private void doConnect() throws JSchException, IOException { +// JSch jsch = new JSch(); +// +// // 配置认证方式 +// configureAuthentication(jsch); +// +// // 创建SSH会话 +// sshSession = jsch.getSession( +// machineInfo.getUsername(), +// machineInfo.getHostIp(), +// machineInfo.getSshPort() != null ? machineInfo.getSshPort() : 22 +// ); +// +// // 配置连接参数 +// configureSession(sshSession); +// +// // 建立连接 +// sshSession.connect(CONNECTION_TIMEOUT); +// } +// +// /** +// * 配置认证方式(密码或密钥) +// */ +// private void configureAuthentication(JSch jsch) throws JSchException { +// if (machineInfo.getAuthenticationTypeCode() == 2) { +// // 密钥认证 +// if (machineInfo.getSecretKeyId() == null) { +// throw new JSchException("Secret key ID is required for key-based authentication"); +// } +// +// String privateKeyContent = getPrivateKeyContent(machineInfo.getSecretKeyId()); +// // 验证私钥格式 +// if (!privateKeyContent.startsWith("-----BEGIN")) { +// throw new JSchException("Invalid private key format. Expected OpenSSH format."); +// } +// +// try { +// // 尝试加载私钥 +// jsch.addIdentity( +// machineInfo.getName(), +// privateKeyContent.getBytes(StandardCharsets.UTF_8), +// null, +// null +// ); +// log.info("Private key loaded successfully for {}", machineInfo.getHostIp()); +// } catch (JSchException e) { +// log.error("Failed to load private key: {}", e.getMessage()); +// throw e; +// } +// } else if (machineInfo.getAuthenticationTypeCode() == 1) { +// // 密码认证 +// if (StringUtils.isEmpty(machineInfo.getPassword())) { +// throw new JSchException("Password is required for password-based authentication"); +// } +// } else { +// throw new JSchException("Unsupported authentication type: " + machineInfo.getAuthenticationType()); +// } +// } +// +// /** +// * 配置SSH会话参数(安全增强) +// */ +// private void configureSession(Session session) { +// Properties config = new Properties(); +// +// // 安全增强:默认验证主机密钥 +// if (isTrustedEnvironment()) { +// log.warn("Running in trusted environment - disabling strict host key checking for {}", +// machineInfo.getHostIp()); +// config.put("StrictHostKeyChecking", "no"); +// } else { +// config.put("StrictHostKeyChecking", "yes"); +// // 可选:配置已知主机文件路径 +// //直接配置阿里云密钥地址 +// config.put("UserKnownHostsFile", secretKeyService.getById(machineInfo.getSecretKeyId()).getPath()); +// } +// +// // 其他安全配置 +// config.put("PreferredAuthentications", "publicKey,password,keyboard-interactive"); +// config.put("ServerAliveInterval", "30"); // 每30秒发送一次心跳 +// config.put("ServerAliveCountMax", "3"); // 允许3次心跳失败 +// +// session.setConfig(config); +// } +// +// /** +// * 判断是否为可信环境(生产环境应返回false) +// */ +// private boolean isTrustedEnvironment() { +// // todo实际项目中应基于配置或环境变量判断 +// return System.getProperty("environment", "production").equalsIgnoreCase("development"); +// } +// +// @Override +// public synchronized void close() { +// disconnect(); +// } +// +// public synchronized void disconnect() { +// if (sshSession != null && sshSession.isConnected()) { +// try { +// sshSession.disconnect(); +// log.info("SSH connection closed: {}", machineInfo.getHostIp()); +// } catch (Exception e) { +// log.error("Error closing SSH session: {}", e.getMessage()); +// } +// } +// status = ConnectionStatus.DISCONNECTED; +// } +// +// /** +// * 执行远程命令,支持超时和中断处理 +// */ +// public String executeCommand(String command) throws JSchException, IOException { +// if (!isConnected()) { +// throw new IllegalStateException("Session is not connected"); +// } +// +// if (!isExecuting.compareAndSet(false, true)) { +// throw new IllegalStateException("Another command is already executing"); +// } +// +// Channel channel = null; +// InputStream inputStream = null; +// ByteArrayOutputStream outputStream = null; +// +// try { +// channel = createExecChannel(command); +// inputStream = channel.getInputStream(); +// outputStream = new ByteArrayOutputStream(); +// +// // 连接通道并设置超时 +// channel.connect(COMMAND_TIMEOUT); +// +// // 读取命令输出 +// return readCommandOutput(inputStream, outputStream, channel); +// } catch (InterruptedException e) { +// Thread.currentThread().interrupt(); +// throw new IOException("Command execution interrupted", e); +// } finally { +// // 释放资源 +// closeResources(channel, inputStream, outputStream); +// isExecuting.set(false); +// } +// } +// +// /** +// * 创建并配置命令执行通道 +// */ +// private Channel createExecChannel(String command) throws JSchException { +// Channel channel = sshSession.openChannel("exec"); +// ((ChannelExec) channel).setCommand(command); +// +// // 配置通道 +// channel.setInputStream(null); +// ((ChannelExec) channel).setErrStream(new ByteArrayOutputStream()); // 捕获错误输出 +// +// return channel; +// } +// +// /** +// * 读取命令输出 +// */ +// private String readCommandOutput(InputStream inputStream, +// ByteArrayOutputStream outputStream, +// Channel channel) throws IOException, InterruptedException { +// byte[] buffer = new byte[1024]; +// +// +// // 使用线程中断机制实现超时控制 +// Thread readerThread = new Thread(() -> { +// int bytesRead; +// try { +// while ((bytesRead = inputStream.read(buffer)) != -1) { +// outputStream.write(buffer, 0, bytesRead); +// } +// } catch (IOException e) { +// // 通道关闭或读取异常 +// if (channel.isConnected()) { +// log.warn("Error reading command output: {}", e.getMessage()); +// } +// } +// }); +// +// readerThread.start(); +// +// // 等待命令执行完成或超时 +// readerThread.join(COMMAND_TIMEOUT); +// +// // 如果线程仍在运行,中断并关闭通道 +// if (readerThread.isAlive()) { +// readerThread.interrupt(); +// channel.disconnect(); +// throw new IOException("Command execution timed out after " + COMMAND_TIMEOUT + "ms"); +// } +// +// // 等待通道完全关闭 +// while (channel.isConnected()) { +// Thread.sleep(100); +// } +// +// return outputStream.toString(StandardCharsets.UTF_8); +// } +// +// /** +// * 关闭资源 +// */ +// private void closeResources(Channel channel, InputStream inputStream, OutputStream outputStream) { +// if (outputStream != null) { +// try { +// outputStream.close(); +// } catch (IOException e) { +// log.warn("Error closing output stream: {}", e.getMessage()); +// } +// } +// +// if (inputStream != null) { +// try { +// inputStream.close(); +// } catch (IOException e) { +// log.warn("Error closing input stream: {}", e.getMessage()); +// } +// } +// +// if (channel != null && channel.isConnected()) { +// channel.disconnect(); +// } +// } +// +// /** +// * 上传文件到远程服务器 +// */ +// public boolean uploadFile(String localFilePath, String remoteFilePath) throws IOException { +// if (!isConnected()) { +// throw new IllegalStateException("Cannot upload file: SSH session is not connected"); +// } +// +// // 检查本地文件是否存在且可读 +// File localFile = new File(localFilePath); +// if (!localFile.exists()) { +// throw new FileNotFoundException("Local file not found: " + localFilePath); +// } +// if (!localFile.canRead()) { +// throw new IOException("Cannot read local file: " + localFilePath); +// } +// +// ChannelSftp channel = null; +// boolean uploadSuccess = false; +// +// try { +// // 创建并连接SFTP通道,设置超时 +// channel = (ChannelSftp) sshSession.openChannel("sftp"); +// channel.connect(CONNECTION_TIMEOUT); +// +// // 确保目标目录存在 +// createRemoteDirectoryIfNotExists(channel, getParentDirectory(remoteFilePath)); +// +// // 使用更健壮的上传方式 +// channel.put( +// new FileInputStream(localFile), +// remoteFilePath, +// new ProgressMonitorAdapter(localFile.length()), +// ChannelSftp.OVERWRITE +// ); +// +// uploadSuccess = true; +// log.info("File uploaded successfully: {} -> {}", localFilePath, remoteFilePath); +// return true; +// +// } catch (SftpException e) { +// log.error("SFTP error during file upload ({} -> {}): {}", +// localFilePath, remoteFilePath, e.getMessage(), e); +// throw new IOException("SFTP error: " + e.getMessage(), e); +// } catch (FileNotFoundException e) { +// log.error("Local file not found during upload: {}", localFilePath, e); +// throw e; +// } catch (IOException e) { +// log.error("IO error during file upload: {}", e.getMessage(), e); +// throw e; +// } catch (Exception e) { +// log.error("Unexpected error during file upload: {}", e.getMessage(), e); +// throw new IOException("Unexpected error: " + e.getMessage(), e); +// } finally { +// // 确保通道始终被关闭 +// disconnectChannel(channel); +// +//// // 如果上传失败,尝试删除不完整的文件 +//// if (!uploadSuccess && remoteFilePath != null && !remoteFilePath.isEmpty()) { +//// tryDeleteIncompleteFile(remoteFilePath); +//// } +// } +// } +// +// public boolean downloadFile(String remoteFilePath, String localFilePath) throws IOException { +// if (!isConnected()) { +// throw new IllegalStateException("Cannot download file: SSH session is not connected"); +// } +// +// // 检查本地目录是否存在且可写 +// File localFile = new File(localFilePath); +// File parentDir = localFile.getParentFile(); +// if (parentDir != null && !parentDir.exists()) { +// if (!parentDir.mkdirs()) { +// throw new IOException("Failed to create local directory: " + parentDir.getAbsolutePath()); +// } +// } +// if (parentDir != null && !parentDir.canWrite()) { +// throw new IOException("Cannot write to local directory: " + parentDir.getAbsolutePath()); +// } +// +// ChannelSftp channel = null; +// boolean downloadSuccess = false; +// File tempFile = null; +// +// try { +// // 创建并连接SFTP通道,设置超时 +// channel = (ChannelSftp) sshSession.openChannel("sftp"); +// channel.connect(CONNECTION_TIMEOUT); +// +// // 检查远程文件是否存在 +// SftpATTRS attrs = channel.stat(remoteFilePath); +// long fileSize = attrs.getSize(); +// +// // 使用临时文件避免部分下载覆盖完整文件 +// tempFile = new File(localFilePath + ".part"); +// +// // 执行下载并监控进度 +// channel.get( +// remoteFilePath, +// new FileOutputStream(tempFile).toString(), +// new ProgressMonitorAdapter(fileSize), +// ChannelSftp.OVERWRITE +// ); +// +// // 验证下载完整性 +// if (tempFile.length() != fileSize) { +// throw new IOException("Download incomplete: expected " + fileSize + +// " bytes, but got " + tempFile.length() + " bytes"); +// } +// +// // 重命名临时文件为目标文件(原子操作) +// if (!tempFile.renameTo(localFile)) { +// throw new IOException("Failed to rename temporary file to: " + localFilePath); +// } +// +// downloadSuccess = true; +// log.info("File downloaded successfully: {} -> {}", remoteFilePath, localFilePath); +// return true; +// +// } catch (SftpException e) { +// log.error("SFTP error during file download ({} -> {}): {}", +// remoteFilePath, localFilePath, e.getMessage(), e); +// if (e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE) { +// throw new FileNotFoundException("Remote file not found: " + remoteFilePath); +// } +// throw new IOException("SFTP error: " + e.getMessage(), e); +// } catch (IOException e) { +// log.error("IO error during file download: {}", e.getMessage(), e); +// throw e; +// } catch (Exception e) { +// log.error("Unexpected error during file download: {}", e.getMessage(), e); +// throw new IOException("Unexpected error: " + e.getMessage(), e); +// } finally { +// // 确保通道始终被关闭 +// disconnectChannel(channel); +// +// // 如果下载失败,清理临时文件 +// if (!downloadSuccess && tempFile != null && tempFile.exists()) { +// if (tempFile.delete()) { +// log.debug("Deleted incomplete temporary file: {}", tempFile.getAbsolutePath()); +// } else { +// log.warn("Failed to delete incomplete temporary file: {}", tempFile.getAbsolutePath()); +// } +// } +// } +// } +// +// // 创建远程目录(如果不存在) +// private void createRemoteDirectoryIfNotExists(ChannelSftp channel, String directory) throws SftpException { +// if (directory == null || directory.isEmpty() || directory.equals("/")) { +// return; +// } +// +// try { +// channel.stat(directory); +// } catch (SftpException e) { +// // 目录不存在,尝试创建 +// createRemoteDirectoryIfNotExists(channel, getParentDirectory(directory)); +// channel.mkdir(directory); +// log.debug("Created remote directory: {}", directory); +// } +// } +// +// // 获取路径的父目录 +// private String getParentDirectory(String path) { +// int lastSlash = path.lastIndexOf('/'); +// return lastSlash > 0 ? path.substring(0, lastSlash) : ""; +// } +// +// // 断开SFTP通道 +// private void disconnectChannel(Channel channel) { +// if (channel != null && channel.isConnected()) { +// try { +// channel.disconnect(); +// log.debug("SFTP channel disconnected"); +// } catch (Exception e) { +// log.warn("Error disconnecting SFTP channel: {}", e.getMessage()); +// } +// } +// } +// +// // 尝试删除不完整的文件 +// private void tryDeleteIncompleteFile(String remoteFilePath) { +// ChannelSftp channel = null; +// try { +// channel = (ChannelSftp) sshSession.openChannel("sftp"); +// channel.connect(CONNECTION_TIMEOUT); +// channel.rm(remoteFilePath); +// log.info("Deleted incomplete file: {}", remoteFilePath); +// } catch (Exception e) { +// log.warn("Failed to delete incomplete file {}: {}", remoteFilePath, e.getMessage()); +// } finally { +// disconnectChannel(channel); +// } +// } +// +// // 增强的进度监控器 +// private static class ProgressMonitorAdapter implements SftpProgressMonitor { +// private final long totalBytes; +// private long bytesWritten = 0; +// private int lastProgress = 0; +// private final long startTime = System.currentTimeMillis(); +// +// public ProgressMonitorAdapter(long totalBytes) { +// this.totalBytes = totalBytes; +// } +// +// @Override +// public boolean count(long count) { +// bytesWritten += count; +// +// // 计算进度百分比 +// int progress = (int) ((bytesWritten * 100) / totalBytes); +// +// // 每10%或每秒更新一次日志 +// long elapsedTime = System.currentTimeMillis() - startTime; +// if (progress - lastProgress >= 10 || elapsedTime >= 1000) { +// double speed = bytesWritten / (elapsedTime / 1000.0); +// String speedStr = formatTransferSpeed(speed); +// +// log.debug("Upload progress: {}% ({}/{} bytes, {})", +// progress, bytesWritten, totalBytes, speedStr); +// lastProgress = progress; +// } +// +// return true; // 返回true继续传输,返回false中断传输 +// } +// +// @Override +// public void end() { +// long elapsedTime = System.currentTimeMillis() - startTime; +// double speed = totalBytes / (elapsedTime / 1000.0); +// String speedStr = formatTransferSpeed(speed); +// +// log.info("Upload completed: {} bytes in {} ms (avg speed: {})", +// totalBytes, elapsedTime, speedStr); +// } +// +// @Override +// public void init(int op, String src, String dest, long max) { +// log.info("Starting upload: {} -> {} ({} bytes)", src, dest, max); +// } +// +// // 格式化传输速度 +// private String formatTransferSpeed(double bytesPerSecond) { +// String[] units = {"B/s", "KB/s", "MB/s", "GB/s"}; +// int unitIndex = 0; +// +// while (bytesPerSecond >= 1024 && unitIndex < units.length - 1) { +// bytesPerSecond /= 1024; +// unitIndex++; +// } +// +// return String.format("%.2f %s", bytesPerSecond, units[unitIndex]); +// } +// } +// +// +// /** +// * 检查连接状态 +// */ +// public ConnectionStatus getStatus() { +// if (status == ConnectionStatus.CONNECTED && +// (sshSession == null || !sshSession.isConnected())) { +// status = ConnectionStatus.DISCONNECTED; +// } +// return status; +// } +// +// /** +// * 检查是否已连接 +// */ +// public boolean isConnected() { +// return status == ConnectionStatus.CONNECTED && +// sshSession != null && +// sshSession.isConnected(); +// } +// +// +// private String getPrivateKeyContent(Long secretKeyId) { +// if (secretKeyId == null) { +// return null; +// } +// SecretKey secretKey = secretKeyService.getById(secretKeyId); +// byte[] content; +// try { +// content = aliYunOssClient.getContent(secretKey.getPath().substring(secretKey.getPath().lastIndexOf("/") + 1)); +// } catch (Exception e) { +// throw new RuntimeException(e); +// } +// +// //改为S3FileClient读取 +// InputStream read = new ByteArrayInputStream(content); +// +// try { +// return StreamUtils.copyToString(read, StandardCharsets.UTF_8); +// } catch (IOException e) { +// log.error("读取私钥文件失败", e); +// throw new RuntimeException(e); +// } +// +// +// } +//} diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/mapper/MachineInfoMapper.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/mapper/MachineInfoMapper.java deleted file mode 100644 index 088d2760..00000000 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/mapper/MachineInfoMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package cd.casic.module.machine.mapper; - -import cd.casic.module.machine.entity.MachineInfo; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface MachineInfoMapper extends BaseMapper { -} diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/MachineInfoService.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/MachineInfoService.java index 39ee38bf..23591523 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/MachineInfoService.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/MachineInfoService.java @@ -1,15 +1,14 @@ package cd.casic.module.machine.service; -import cd.casic.module.machine.dto.MachineInfoDto; -import cd.casic.module.machine.entity.MachineInfo; +import cd.casic.framework.commons.pojo.PageResult; +import cd.casic.module.machine.controller.vo.MachineInfoDto; +import cd.casic.module.machine.dal.dataobject.MachineInfo; import cd.casic.module.machine.enums.ConnectionStatus; -import cd.casic.module.machine.utils.PageResult; import com.baomidou.mybatisplus.extension.service.IService; -import java.util.List; import java.util.Map; -public interface MachineInfoService extends IService { +public interface MachineInfoService { boolean addMachineInfo(MachineInfoDto MachineInfoDto); PageResult listMachineInfo(MachineInfoDto MachineInfoDto); diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/MachineProxyService.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/MachineProxyService.java index 48185546..df305c5a 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/MachineProxyService.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/MachineProxyService.java @@ -1,11 +1,10 @@ package cd.casic.module.machine.service; -import cd.casic.module.machine.dto.MachineProxyDTO; -import cd.casic.module.machine.entity.MachineProxy; -import cd.casic.module.machine.utils.PageResult; +import cd.casic.framework.commons.pojo.PageResult; +import cd.casic.module.machine.controller.vo.MachineProxyVO; +import cd.casic.module.machine.dal.dataobject.MachineProxy; import com.baomidou.mybatisplus.extension.service.IService; -import java.util.List; import java.util.Map; /** @@ -15,12 +14,12 @@ public interface MachineProxyService extends IService { /** * 注册新的机器代理 */ - boolean register(MachineProxyDTO machineProxyDTO); + boolean register(MachineProxyVO machineProxyVO); /** * 更新代理状态 */ - boolean updateStatus(MachineProxyDTO machineProxyDTO); + boolean updateStatus(MachineProxyVO machineProxyVO); /** @@ -33,7 +32,7 @@ public interface MachineProxyService extends IService { /** * 更新代理配置 */ - void update(MachineProxyDTO machineProxyDTO); + void update(MachineProxyVO machineProxyVO); /** @@ -43,5 +42,5 @@ public interface MachineProxyService extends IService { */ void delete(String proxyIds); - PageResult list(MachineProxyDTO machineProxyDTO); + PageResult list(MachineProxyVO machineProxyVO); } diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/SecretKeyService.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/SecretKeyService.java index b9647850..f9887229 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/SecretKeyService.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/SecretKeyService.java @@ -1,12 +1,9 @@ package cd.casic.module.machine.service; -import cd.casic.module.machine.entity.SecretKey; -import cd.casic.module.machine.dto.SecretKeyDto; -import cd.casic.module.machine.utils.PageResult; +import cd.casic.framework.commons.pojo.PageResult; +import cd.casic.module.machine.dal.dataobject.SecretKey; +import cd.casic.module.machine.controller.vo.SecretKeyDto; import com.baomidou.mybatisplus.extension.service.IService; -import org.springframework.core.io.InputStreamResource; -import org.springframework.http.ResponseEntity; -import org.springframework.web.multipart.MultipartFile; import java.util.List; diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/impl/MachineProxyServiceImpl.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/impl/MachineProxyServiceImpl.java index 6a62fa71..1eca5b9a 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/impl/MachineProxyServiceImpl.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/impl/MachineProxyServiceImpl.java @@ -1,162 +1,161 @@ -package cd.casic.module.machine.service.impl; - -import cd.casic.module.machine.dto.MachineProxyDTO; -import cd.casic.module.machine.entity.MachineProxy; -import cd.casic.module.machine.enums.MachineProxyStatus; -import cd.casic.module.machine.enums.MachineProxyType; -import cd.casic.module.machine.exception.ServiceException; -import cd.casic.module.machine.mapper.MachineProxyMapper; -import cd.casic.module.machine.service.MachineProxyService; -import cd.casic.module.machine.utils.EnumUtils; -import cd.casic.module.machine.utils.PageResult; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; - -import jakarta.annotation.Resource; -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; - -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - -/** - * 机器代理服务实现类 - */ -@Service -public class MachineProxyServiceImpl extends ServiceImpl implements MachineProxyService { - @Resource - private MachineProxyMapper machineProxyMapper; - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean register(MachineProxyDTO machineProxyDTO) { - // 创建代理记录 - MachineProxy proxy = new MachineProxy(); - BeanUtils.copyProperties(machineProxyDTO, proxy); - proxy.setProxyTypeCode(EnumUtils.getEnumByMessage(machineProxyDTO.getProxyType(), MachineProxyType.class).getCode()); - proxy.setVersion("1.0.0"); - proxy.setStatusCode(MachineProxyStatus.ONLINE.getCode()); - return save(proxy); - } - - @Override - public boolean updateStatus(MachineProxyDTO machineProxyDTO) { - // 参数校验 - if (machineProxyDTO == null) { - throw new ServiceException(ServiceException.MACHINE_PROXY_DTO_NULL, "MachineProxyDTO对象为空"); - } - - // 查询代理 - MachineProxy proxy = this.getById(machineProxyDTO.getId()); - - if (proxy == null) { - throw new ServiceException(ServiceException.MACHINE_PROXY_NULL, "代理不存在"); - } - - // 更新状态 - proxy.setStatusCode(EnumUtils.getEnumByMessage(machineProxyDTO.getStatus(), MachineProxyStatus.class).getCode()); - proxy.setUpdateDate(new Date()); - return updateById(proxy); - } - - - @Override - public Map getStatusStatistics() { - List proxyList = list(); - - if (CollectionUtils.isEmpty(proxyList)) { - return Collections.emptyMap(); - } - return proxyList.stream() - .map(proxy -> EnumUtils.getEnumByCode(proxy.getStatusCode(), MachineProxyStatus.class).getMessage()) - .collect(Collectors.groupingBy( - Function.identity(), - Collectors.counting() // 统计每个分组的元素数量 - )); - } - - @Override - public void update(MachineProxyDTO machineProxyDTO) { - // 参数校验 - if (machineProxyDTO == null) { - throw new ServiceException(ServiceException.MACHINE_PROXY_DTO_NULL, "MachineProxyDTO对象为空"); - } - MachineProxy machineProxy = new MachineProxy(); - BeanUtils.copyProperties(machineProxyDTO, machineProxy); - if (machineProxyDTO.getProxyType() != null && !machineProxyDTO.getProxyType().isEmpty()) { - machineProxy.setProxyTypeCode(EnumUtils.getEnumByMessage(machineProxyDTO.getProxyType(), MachineProxyType.class).getCode()); - } - if (machineProxyDTO.getStatus() != null && !machineProxyDTO.getStatus().isEmpty()) { - machineProxy.setStatusCode(EnumUtils.getEnumByMessage(machineProxyDTO.getStatus(), MachineProxyStatus.class).getCode()); - } - this.updateById(machineProxy); - } - - - @Override - @Transactional(rollbackFor = Exception.class) - public void delete(String ids) { - List machineProxyIds = Arrays.stream(ids.split(",")) - .map(String::trim) - .filter(s -> !s.isEmpty()) - .map(Long::parseLong) - .toList(); - // 参数校验 - if (CollectionUtils.isEmpty(machineProxyIds)) { - throw new ServiceException(ServiceException.PARAMETER_ERROR, "参数错误"); - } - // 批量逻辑删除 - remove(new LambdaQueryWrapper() - .in(MachineProxy::getId, machineProxyIds) - .ne(MachineProxy::getStatus, MachineProxyStatus.ONLINE.getCode())); - } - - @Override - public PageResult list(MachineProxyDTO machineProxyDTO) { - QueryWrapper queryWrapper = getMachineProxyQueryWrapper(machineProxyDTO); - Page page = machineProxyMapper.selectPage(new Page<>(machineProxyDTO.getPageIndex(), machineProxyDTO.getPageSize()), queryWrapper); - List machineProxyDtos = page.getRecords().stream().map(machineProxy -> { - MachineProxyDTO dto = new MachineProxyDTO(); - BeanUtils.copyProperties(machineProxy, dto); - dto.setProxyType(EnumUtils.getEnumByCode(machineProxy.getProxyTypeCode(), MachineProxyType.class).getMessage()); - dto.setStatus(EnumUtils.getEnumByCode(machineProxy.getStatusCode(), MachineProxyStatus.class).getMessage()); - return dto; - }).toList(); - return new PageResult<>( - page.getCurrent(), - page.getSize(), - page.getTotal(), - page.getPages(), - machineProxyDtos - ); - } - - private QueryWrapper getMachineProxyQueryWrapper(MachineProxyDTO machineProxyDTO) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - if (machineProxyDTO.getHostIp() != null && !machineProxyDTO.getHostIp().isEmpty()) { - queryWrapper.like("host_ip", machineProxyDTO.getHostIp()); - } - if (machineProxyDTO.getSshPort() != null && !machineProxyDTO.getSshPort().isEmpty()) { - queryWrapper.like("ssh_port", machineProxyDTO.getSshPort()); - } - if (machineProxyDTO.getUsername() != null && !machineProxyDTO.getUsername().isEmpty()) { - queryWrapper.like("username", machineProxyDTO.getUsername()); - } - if (machineProxyDTO.getDescription() != null && !machineProxyDTO.getDescription().isEmpty()) { - queryWrapper.like("description", machineProxyDTO.getDescription()); - } - if (machineProxyDTO.getStatus() != null && !machineProxyDTO.getStatus().isEmpty()) { - queryWrapper.like("status_code", EnumUtils.getEnumByMessage(machineProxyDTO.getStatus(), MachineProxyStatus.class).getCode()); - } - if (machineProxyDTO.getProxyType() != null && !machineProxyDTO.getProxyType().isEmpty()) { - queryWrapper.like("proxy_type_code", EnumUtils.getEnumByMessage(machineProxyDTO.getProxyType(), MachineProxyType.class).getCode()); - } - return queryWrapper.orderByDesc("create_date"); - } - -} +//package cd.casic.module.machine.service.impl; +// +//import cd.casic.module.machine.controller.vo.MachineProxyDTO; +//import cd.casic.module.machine.dal.dataobject.MachineProxy; +//import cd.casic.module.machine.enums.MachineProxyStatus; +//import cd.casic.module.machine.enums.MachineProxyType; +//import cd.casic.module.machine.exception.ServiceException; +//import cd.casic.module.machine.dal.mysql.MachineProxyMapper; +//import cd.casic.module.machine.service.MachineProxyService; +//import cd.casic.module.machine.utils.EnumUtils; +//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +//import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +// +//import jakarta.annotation.Resource; +//import org.springframework.beans.BeanUtils; +//import org.springframework.stereotype.Service; +//import org.springframework.transaction.annotation.Transactional; +//import org.springframework.util.CollectionUtils; +// +//import java.util.*; +//import java.util.function.Function; +//import java.util.stream.Collectors; +// +///** +// * 机器代理服务实现类 +// */ +//@Service +//public class MachineProxyServiceImpl extends ServiceImpl implements MachineProxyService { +// @Resource +// private MachineProxyMapper machineProxyMapper; +// +// @Override +// @Transactional(rollbackFor = Exception.class) +// public boolean register(MachineProxyDTO machineProxyDTO) { +// // 创建代理记录 +// MachineProxy proxy = new MachineProxy(); +// BeanUtils.copyProperties(machineProxyDTO, proxy); +// proxy.setProxyTypeCode(EnumUtils.getEnumByMessage(machineProxyDTO.getProxyType(), MachineProxyType.class).getCode()); +// proxy.setVersion("1.0.0"); +// proxy.setStatusCode(MachineProxyStatus.ONLINE.getCode()); +// return save(proxy); +// } +// +// @Override +// public boolean updateStatus(MachineProxyDTO machineProxyDTO) { +// // 参数校验 +// if (machineProxyDTO == null) { +// throw new ServiceException(ServiceException.MACHINE_PROXY_DTO_NULL, "MachineProxyDTO对象为空"); +// } +// +// // 查询代理 +// MachineProxy proxy = this.getById(machineProxyDTO.getId()); +// +// if (proxy == null) { +// throw new ServiceException(ServiceException.MACHINE_PROXY_NULL, "代理不存在"); +// } +// +// // 更新状态 +// proxy.setStatusCode(EnumUtils.getEnumByMessage(machineProxyDTO.getStatus(), MachineProxyStatus.class).getCode()); +// proxy.setUpdateTime(new Date()); +// return updateById(proxy); +// } +// +// +// @Override +// public Map getStatusStatistics() { +// List proxyList = list(); +// +// if (CollectionUtils.isEmpty(proxyList)) { +// return Collections.emptyMap(); +// } +// return proxyList.stream() +// .map(proxy -> EnumUtils.getEnumByCode(proxy.getStatusCode(), MachineProxyStatus.class).getMessage()) +// .collect(Collectors.groupingBy( +// Function.identity(), +// Collectors.counting() // 统计每个分组的元素数量 +// )); +// } +// +// @Override +// public void update(MachineProxyDTO machineProxyDTO) { +// // 参数校验 +// if (machineProxyDTO == null) { +// throw new ServiceException(ServiceException.MACHINE_PROXY_DTO_NULL, "MachineProxyDTO对象为空"); +// } +// MachineProxy machineProxy = new MachineProxy(); +// BeanUtils.copyProperties(machineProxyDTO, machineProxy); +// if (machineProxyDTO.getProxyType() != null && !machineProxyDTO.getProxyType().isEmpty()) { +// machineProxy.setProxyTypeCode(EnumUtils.getEnumByMessage(machineProxyDTO.getProxyType(), MachineProxyType.class).getCode()); +// } +// if (machineProxyDTO.getStatus() != null && !machineProxyDTO.getStatus().isEmpty()) { +// machineProxy.setStatusCode(EnumUtils.getEnumByMessage(machineProxyDTO.getStatus(), MachineProxyStatus.class).getCode()); +// } +// this.updateById(machineProxy); +// } +// +// +// @Override +// @Transactional(rollbackFor = Exception.class) +// public void delete(String ids) { +// List machineProxyIds = Arrays.stream(ids.split(",")) +// .map(String::trim) +// .filter(s -> !s.isEmpty()) +// .map(Long::parseLong) +// .toList(); +// // 参数校验 +// if (CollectionUtils.isEmpty(machineProxyIds)) { +// throw new ServiceException(ServiceException.PARAMETER_ERROR, "参数错误"); +// } +// // 批量逻辑删除 +// remove(new LambdaQueryWrapper() +// .in(MachineProxy::getId, machineProxyIds) +// .ne(MachineProxy::getStatus, MachineProxyStatus.ONLINE.getCode())); +// } +// +// @Override +// public PageResult list(MachineProxyDTO machineProxyDTO) { +// QueryWrapper queryWrapper = getMachineProxyQueryWrapper(machineProxyDTO); +// Page page = machineProxyMapper.selectPage(new Page<>(machineProxyDTO.getPageIndex(), machineProxyDTO.getPageSize()), queryWrapper); +// List machineProxyDtos = page.getRecords().stream().map(machineProxy -> { +// MachineProxyDTO dto = new MachineProxyDTO(); +// BeanUtils.copyProperties(machineProxy, dto); +// dto.setProxyType(EnumUtils.getEnumByCode(machineProxy.getProxyTypeCode(), MachineProxyType.class).getMessage()); +// dto.setStatus(EnumUtils.getEnumByCode(machineProxy.getStatusCode(), MachineProxyStatus.class).getMessage()); +// return dto; +// }).toList(); +// return new PageResult<>( +// page.getCurrent(), +// page.getSize(), +// page.getTotal(), +// page.getPages(), +// machineProxyDtos +// ); +// } +// +// private QueryWrapper getMachineProxyQueryWrapper(MachineProxyDTO machineProxyDTO) { +// QueryWrapper queryWrapper = new QueryWrapper<>(); +// if (machineProxyDTO.getHostIp() != null && !machineProxyDTO.getHostIp().isEmpty()) { +// queryWrapper.like("host_ip", machineProxyDTO.getHostIp()); +// } +// if (machineProxyDTO.getSshPort() != null && !machineProxyDTO.getSshPort().isEmpty()) { +// queryWrapper.like("ssh_port", machineProxyDTO.getSshPort()); +// } +// if (machineProxyDTO.getUsername() != null && !machineProxyDTO.getUsername().isEmpty()) { +// queryWrapper.like("username", machineProxyDTO.getUsername()); +// } +// if (machineProxyDTO.getDescription() != null && !machineProxyDTO.getDescription().isEmpty()) { +// queryWrapper.like("description", machineProxyDTO.getDescription()); +// } +// if (machineProxyDTO.getStatus() != null && !machineProxyDTO.getStatus().isEmpty()) { +// queryWrapper.like("status_code", EnumUtils.getEnumByMessage(machineProxyDTO.getStatus(), MachineProxyStatus.class).getCode()); +// } +// if (machineProxyDTO.getProxyType() != null && !machineProxyDTO.getProxyType().isEmpty()) { +// queryWrapper.like("proxy_type_code", EnumUtils.getEnumByMessage(machineProxyDTO.getProxyType(), MachineProxyType.class).getCode()); +// } +// return queryWrapper.orderByDesc("create_date"); +// } +// +//} diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/impl/MachineinfoServiceImpl.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/impl/MachineinfoServiceImpl.java index 26916426..4dfa1245 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/impl/MachineinfoServiceImpl.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/impl/MachineinfoServiceImpl.java @@ -1,363 +1,354 @@ -package cd.casic.module.machine.service.impl; - -import cd.casic.module.machine.enums.MachineInfoType; -import cd.casic.module.machine.handler.ConnectionSession; -import cd.casic.module.machine.mapper.MachineInfoMapper; -import cd.casic.module.machine.dto.MachineInfoDto; -import cd.casic.module.machine.entity.MachineInfo; -import cd.casic.module.machine.enums.AuthenticationType; -import cd.casic.module.machine.enums.ConnectionStatus; -import cd.casic.module.machine.enums.MachineInfoStatus; -import cd.casic.module.machine.exception.ServiceException; -import cd.casic.module.machine.service.MachineInfoService; -import cd.casic.module.machine.utils.EnumUtils; -import cd.casic.module.machine.utils.PageResult; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Service; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; - -@Slf4j -@Service -public class MachineinfoServiceImpl extends ServiceImpl implements MachineInfoService { - - int ENABLE = 1; - int UN_ENABLE = 0; - - @Resource - private MachineInfoMapper machineInfoMapper; - @Resource - private ConnectionSession connectionSession; - /** - * 会话ID生成器 - */ - private final AtomicInteger sessionIdGenerator = new AtomicInteger(1000); - - /** - * 会话管理:会话ID -> 连接会话 - */ - private final Map sessions = new ConcurrentHashMap<>(); - - /** - * 机器名称 -> 会话ID - */ - private final Map machineSessionMapping = new ConcurrentHashMap<>(); - - @Override - public boolean addMachineInfo(MachineInfoDto machineInfoDto) { - if (machineInfoDto == null) { - throw new ServiceException(ServiceException.MACHINE_INFO_NULL, "机器信息为空"); - } - MachineInfo machineInfo = new MachineInfo(); - BeanUtils.copyProperties(machineInfoDto, machineInfo); - machineInfo.setStatusCode(1); - machineInfo.setAuthenticationTypeCode( - "密码认证".equals(machineInfoDto.getAuthenticationType()) - ? AuthenticationType.PASSWORD.getCode() - : AuthenticationType.SECRET_KEY.getCode() - ); - machineInfo.setMachineInfoTypeCode( - "Windows".equals(machineInfoDto.getMachineInfoType()) - ? MachineInfoType.WINDOWS.getCode() - : MachineInfoType.Linux.getCode() - ); - - return this.save(machineInfo); - } - - @Override - public PageResult listMachineInfo(MachineInfoDto machineInfoDto) { - QueryWrapper queryWrapper = getMachineInfoQueryWrapper(machineInfoDto); - Page page = machineInfoMapper.selectPage( - new Page<>(machineInfoDto.getPageIndex(), machineInfoDto.getPageSize()), - queryWrapper - ); - - List machineInfoDtos = page.getRecords().stream() - .map(machineInfo -> { - MachineInfoDto dto = new MachineInfoDto(); - BeanUtils.copyProperties(machineInfo, dto); - // 直接调用原有枚举转换方法 - dto.setMachineInfoType(EnumUtils.getEnumByCode(machineInfo.getMachineInfoTypeCode(), MachineInfoType.class).getMessage()); - dto.setStatus(EnumUtils.getEnumByCode(machineInfo.getStatusCode(), MachineInfoStatus.class).getMessage()); - dto.setAuthenticationType(EnumUtils.getEnumByCode(machineInfo.getAuthenticationTypeCode(), AuthenticationType.class).getMessage()); - return dto; - }) - .toList(); - - return new PageResult<>( - page.getCurrent(), - page.getSize(), - page.getTotal(), - page.getPages(), - machineInfoDtos - ); - } - - @Override - public boolean updateMachineInfo(MachineInfoDto machineInfoDto) { - MachineInfo machineInfo = new MachineInfo(); - BeanUtils.copyProperties(machineInfoDto, machineInfo); - machineInfo.setAuthenticationTypeCode( - "密码认证".equals(machineInfoDto.getAuthenticationType()) - ? AuthenticationType.PASSWORD.getCode() - : AuthenticationType.SECRET_KEY.getCode() - ); - machineInfo.setMachineInfoTypeCode( - "Windows".equals(machineInfoDto.getMachineInfoType()) - ? MachineInfoType.WINDOWS.getCode() - : MachineInfoType.Linux.getCode() - ); - return this.updateById(machineInfo); - } - - @Override - public boolean updateStatus(MachineInfoDto machineInfoDto) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.eq("id", machineInfoDto.getId()).set("status_code", EnumUtils.getEnumByMessage(machineInfoDto.getStatus(), MachineInfoStatus.class).getCode()); - return this.update(updateWrapper); - } - - @Override - public boolean bindingSecretKey(MachineInfoDto machineInfoDto) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.eq("id", machineInfoDto.getId()).set("secret_key_id", machineInfoDto.getSecretKeyId()).set("authentication_type_code", 2); - return this.update(updateWrapper); - } - - @Override - public void deleteList(String machineInfoIds) { - List machineInfoIdList = Arrays.stream(machineInfoIds.split(",")) - .map(String::trim) - .filter(s -> !s.isEmpty()) - .map(Long::parseLong) - .collect(Collectors.toList()); - machineInfoMapper.selectBatchIds(machineInfoIdList).forEach(machineInfo -> { - if (machineInfo.getStatusCode() == 1) { - this.removeById(machineInfo.getId()); - } - }); - } - - @Override - public void deleteMachineInfo(Long machineInfoId) { - MachineInfo machineInfo = this.getById(machineInfoId); - if (machineInfo.getStatusCode() == 1) { - this.removeById(machineInfoId); - } - } - - private QueryWrapper getMachineInfoQueryWrapper(MachineInfoDto machineInfoDto) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - if (machineInfoDto.getStatus() != null && !machineInfoDto.getStatus().isEmpty()) { - queryWrapper.eq("status_code", EnumUtils.getEnumByMessage(machineInfoDto.getStatus(), MachineInfoStatus.class).getCode()); - } - if (machineInfoDto.getName() != null && !machineInfoDto.getName().isEmpty()) { - queryWrapper.like("name", machineInfoDto.getName()); - } - if (machineInfoDto.getTag() != null && !machineInfoDto.getTag().isEmpty()) { - queryWrapper.like("tag", machineInfoDto.getTag()); - } - if (machineInfoDto.getHostIp() != null && !machineInfoDto.getHostIp().isEmpty()) { - queryWrapper.like("host_ip", machineInfoDto.getHostIp()); - } - if (machineInfoDto.getDescription() != null && !machineInfoDto.getDescription().isEmpty()) { - queryWrapper.like("description", machineInfoDto.getDescription()); - } - return queryWrapper.orderByDesc("create_date"); - } - - - @Override - public boolean testConnection(Long id) { - //先查询机器是否存在,在判断机器可用性 - MachineInfo machineInfo = this.getById(id); - if (machineInfo==null){ - throw new RuntimeException("机器不存在"); - } - if (machineInfo.getStatusCode() == 0) { - throw new RuntimeException("机器不可用"); - } - log.info("测试机器连接: {}", machineInfo.getHostIp()); - connectionSession.setMachineInfo(machineInfo); - try{ - connectionSession.connect(); - return true; - } catch (Exception e) { - log.error("机器连接测试失败: {}", e.getMessage(), e); - return false; - } - } - - @Override - public ConnectionStatus getConnectionStatus(String machineName) { - String sessionId = machineSessionMapping.get(machineName); - if (sessionId == null) { - return ConnectionStatus.DISCONNECTED; - } - - ConnectionSession session = sessions.get(sessionId); - return session != null ? session.getStatus() : ConnectionStatus.DISCONNECTED; - } - - @Override - public Map getAllConnectionStatus() { - Map result = new HashMap<>(); - - machineSessionMapping.forEach((machineName, sessionId) -> { - ConnectionSession session = sessions.get(sessionId); - result.put(machineName, session != null ? session.getStatus() : ConnectionStatus.DISCONNECTED); - }); - - return result; - } - - @Override - public String connect(MachineInfo machineInfo) { - if (machineInfo.getStatus().getCode() == UN_ENABLE) { - throw new RuntimeException("机器不可用"); - } - log.info("建立机器连接: {}", machineInfo.getHostIp()); - - // 检查是否已连接 - String existingSessionId = machineSessionMapping.get(machineInfo.getName()); - if (existingSessionId != null) { - ConnectionSession existingSession = sessions.get(existingSessionId); - if (existingSession != null && existingSession.getStatus() == ConnectionStatus.CONNECTED) { - log.info("机器已连接,返回现有会话: {}", machineInfo.getHostIp()); - return existingSessionId; - } - } - - try { - connectionSession.setMachineInfo(machineInfo); - - connectionSession.connect(); - - // 生成会话ID - String sessionId = generateSessionId(); - - // 保存会话 - sessions.put(sessionId, connectionSession); - machineSessionMapping.put(machineInfo.getName(), sessionId); - - log.info("机器连接成功: {}, 会话ID: {}", machineInfo.getHostIp(), sessionId); - return sessionId; - } catch (Exception e) { - log.error("机器连接失败: {}", e.getMessage(), e); - throw new RuntimeException("机器连接失败: " + e.getMessage(), e); - } - } - - @Override - public boolean disconnect(String sessionId) { - log.info("断开机器连接: {}", sessionId); - - ConnectionSession session = sessions.get(sessionId); - if (session == null) { - log.warn("会话不存在: {}", sessionId); - return false; - } - - try { - session.disconnect(); - - // 清理会话 - sessions.remove(sessionId); - machineSessionMapping.entrySet().removeIf(entry -> entry.getValue().equals(sessionId)); - - log.info("机器连接已断开: {}", sessionId); - return true; - } catch (Exception e) { - log.error("断开连接失败: {}", e.getMessage(), e); - return false; - } - } - - @Override - public String executeCommand(String sessionId, String command) { - log.info("执行命令: {}, 会话ID: {}", command, sessionId); - - ConnectionSession session = sessions.get(sessionId); - if (session == null) { - throw new RuntimeException("会话不存在: " + sessionId); - } - - if (session.getStatus() != ConnectionStatus.CONNECTED) { - throw new RuntimeException("会话未连接: " + sessionId); - } - - try { - return session.executeCommand(command); - } catch (Exception e) { - log.error("命令执行失败: {}", e.getMessage(), e); - throw new RuntimeException("命令执行失败: " + e.getMessage(), e); - } - } - - @Override - public boolean uploadFile(String sessionId, String localFilePath, String remoteFilePath) { - log.info("上传文件: {} -> {}, 会话ID: {}", localFilePath, remoteFilePath, sessionId); - - ConnectionSession session = sessions.get(sessionId); - if (session == null) { - throw new RuntimeException("会话不存在: " + sessionId); - } - - if (session.getStatus() != ConnectionStatus.CONNECTED) { - throw new RuntimeException("会话未连接: " + sessionId); - } - - try { - return session.uploadFile(localFilePath, remoteFilePath); - } catch (Exception e) { - log.error("文件上传失败: {}", e.getMessage(), e); - throw new RuntimeException("文件上传失败: " + e.getMessage(), e); - } - } - - @Override - public boolean downloadFile(String sessionId, String remoteFilePath, String localFilePath) { - log.info("下载文件: {} -> {}, 会话ID: {}", remoteFilePath, localFilePath, sessionId); - - ConnectionSession session = sessions.get(sessionId); - if (session == null) { - throw new RuntimeException("会话不存在: " + sessionId); - } - - if (session.getStatus() != ConnectionStatus.CONNECTED) { - throw new RuntimeException("会话未连接: " + sessionId); - } - - try { - return session.downloadFile(remoteFilePath, localFilePath); - } catch (Exception e) { - log.error("文件下载失败: {}", e.getMessage(), e); - throw new RuntimeException("文件下载失败: " + e.getMessage(), e); - } - } - - - /** - * 生成会话ID - */ - private String generateSessionId() { - return "session-" + sessionIdGenerator.incrementAndGet(); - } -} +//package cd.casic.module.machine.service.impl; +//import cd.casic.module.machine.enums.MachineInfoType; +//import cd.casic.module.machine.handler.ConnectionSession; +//import cd.casic.module.machine.dal.mysql.MachineInfoMapper; +//import cd.casic.module.machine.controller.vo.MachineInfoDto; +//import cd.casic.module.machine.dal.dataobject.MachineInfo; +//import cd.casic.module.machine.enums.AuthenticationType; +//import cd.casic.module.machine.enums.ConnectionStatus; +//import cd.casic.module.machine.enums.MachineInfoStatus; +//import cd.casic.module.machine.service.MachineInfoService; +//import cd.casic.module.machine.utils.EnumUtils; +//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +//import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +//import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +//import jakarta.annotation.Resource; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.beans.BeanUtils; +//import org.springframework.stereotype.Service; +//import java.util.Arrays; +//import java.util.HashMap; +//import java.util.List; +//import java.util.Map; +//import java.util.concurrent.ConcurrentHashMap; +//import java.util.concurrent.atomic.AtomicInteger; +//import java.util.stream.Collectors; +// +//@Slf4j +//@Service("machineInfoService") +//public class MachineinfoServiceImpl implements MachineInfoService { +// +// int ENABLE = 1; +// int UN_ENABLE = 0; +// +// @Resource +// private MachineInfoMapper machineInfoMapper; +// @Resource +// private ConnectionSession connectionSession; +// /** +// * 会话ID生成器 +// */ +// private final AtomicInteger sessionIdGenerator = new AtomicInteger(1000); +// +// /** +// * 会话管理:会话ID -> 连接会话 +// */ +// private final Map sessions = new ConcurrentHashMap<>(); +// +// /** +// * 机器名称 -> 会话ID +// */ +// private final Map machineSessionMapping = new ConcurrentHashMap<>(); +// +// @Override +// public boolean addMachineInfo(MachineInfoDto machineInfoDto) { +// if (machineInfoDto == null) { +// throw new ServiceException(ServiceException.MACHINE_INFO_NULL, "机器信息为空"); +// } +// MachineInfo machineInfo = new MachineInfo(); +// BeanUtils.copyProperties(machineInfoDto, machineInfo); +// machineInfo.setStatusCode(1); +// machineInfo.setAuthenticationTypeCode( +// "密码认证".equals(machineInfoDto.getAuthenticationType()) +// ? AuthenticationType.PASSWORD.getCode() +// : AuthenticationType.SECRET_KEY.getCode() +// ); +// machineInfo.setMachineInfoTypeCode( +// "Windows".equals(machineInfoDto.getMachineInfoType()) +// ? MachineInfoType.WINDOWS.getCode() +// : MachineInfoType.Linux.getCode() +// ); +// +// return this.save(machineInfo); +// } +// +// @Override +// public PageResult listMachineInfo(MachineInfoDto machineInfoDto) { +// QueryWrapper queryWrapper = getMachineInfoQueryWrapper(machineInfoDto); +// Page page = machineInfoMapper.selectPage( +// new Page<>(machineInfoDto.getPageIndex(), machineInfoDto.getPageSize()), +// queryWrapper +// ); +// +// List machineInfoDtos = page.getRecords().stream() +// .map(machineInfo -> { +// MachineInfoDto dto = new MachineInfoDto(); +// BeanUtils.copyProperties(machineInfo, dto); +// // 直接调用原有枚举转换方法 +// dto.setMachineInfoType(EnumUtils.getEnumByCode(machineInfo.getMachineInfoTypeCode(), MachineInfoType.class).getMessage()); +// dto.setStatus(EnumUtils.getEnumByCode(machineInfo.getStatusCode(), MachineInfoStatus.class).getMessage()); +// dto.setAuthenticationType(EnumUtils.getEnumByCode(machineInfo.getAuthenticationTypeCode(), AuthenticationType.class).getMessage()); +// return dto; +// }) +// .toList(); +// +// return new PageResult<>( +// page.getCurrent(), +// page.getSize(), +// page.getTotal(), +// page.getPages(), +// machineInfoDtos +// ); +// } +// +// @Override +// public boolean updateMachineInfo(MachineInfoDto machineInfoDto) { +// MachineInfo machineInfo = new MachineInfo(); +// BeanUtils.copyProperties(machineInfoDto, machineInfo); +// machineInfo.setAuthenticationTypeCode( +// "密码认证".equals(machineInfoDto.getAuthenticationType()) +// ? AuthenticationType.PASSWORD.getCode() +// : AuthenticationType.SECRET_KEY.getCode() +// ); +// machineInfo.setMachineInfoTypeCode( +// "Windows".equals(machineInfoDto.getMachineInfoType()) +// ? MachineInfoType.WINDOWS.getCode() +// : MachineInfoType.Linux.getCode() +// ); +// return this.updateById(machineInfo); +// } +// +// @Override +// public boolean updateStatus(MachineInfoDto machineInfoDto) { +// UpdateWrapper updateWrapper = new UpdateWrapper<>(); +// updateWrapper.eq("id", machineInfoDto.getId()).set("status_code", EnumUtils.getEnumByMessage(machineInfoDto.getStatus(), MachineInfoStatus.class).getCode()); +// return this.update(updateWrapper); +// } +// +// @Override +// public boolean bindingSecretKey(MachineInfoDto machineInfoDto) { +// UpdateWrapper updateWrapper = new UpdateWrapper<>(); +// updateWrapper.eq("id", machineInfoDto.getId()).set("secret_key_id", machineInfoDto.getSecretKeyId()).set("authentication_type_code", 2); +// return this.update(updateWrapper); +// } +// +// @Override +// public void deleteList(String machineInfoIds) { +// List machineInfoIdList = Arrays.stream(machineInfoIds.split(",")) +// .map(String::trim) +// .filter(s -> !s.isEmpty()) +// .map(Long::parseLong) +// .collect(Collectors.toList()); +// machineInfoMapper.selectBatchIds(machineInfoIdList).forEach(machineInfo -> { +// if (machineInfo.getStatusCode() == 1) { +// this.removeById(machineInfo.getId()); +// } +// }); +// } +// +// @Override +// public void deleteMachineInfo(Long machineInfoId) { +// MachineInfo machineInfo = this.getById(machineInfoId); +// if (machineInfo.getStatusCode() == 1) { +// this.removeById(machineInfoId); +// } +// } +// +// private QueryWrapper getMachineInfoQueryWrapper(MachineInfoDto machineInfoDto) { +// QueryWrapper queryWrapper = new QueryWrapper<>(); +// if (machineInfoDto.getStatus() != null && !machineInfoDto.getStatus().isEmpty()) { +// queryWrapper.eq("status_code", EnumUtils.getEnumByMessage(machineInfoDto.getStatus(), MachineInfoStatus.class).getCode()); +// } +// if (machineInfoDto.getName() != null && !machineInfoDto.getName().isEmpty()) { +// queryWrapper.like("name", machineInfoDto.getName()); +// } +// if (machineInfoDto.getTag() != null && !machineInfoDto.getTag().isEmpty()) { +// queryWrapper.like("tag", machineInfoDto.getTag()); +// } +// if (machineInfoDto.getHostIp() != null && !machineInfoDto.getHostIp().isEmpty()) { +// queryWrapper.like("host_ip", machineInfoDto.getHostIp()); +// } +// if (machineInfoDto.getDescription() != null && !machineInfoDto.getDescription().isEmpty()) { +// queryWrapper.like("description", machineInfoDto.getDescription()); +// } +// return queryWrapper.orderByDesc("create_date"); +// } +// +// +// @Override +// public boolean testConnection(Long id) { +// //先查询机器是否存在,在判断机器可用性 +// MachineInfo machineInfo = machineInfoMapper.getById(id); +// if (machineInfo==null){ +// throw new RuntimeException("机器不存在"); +// } +// if (machineInfo.getStatusCode() == 0) { +// throw new RuntimeException("机器不可用"); +// } +// log.info("测试机器连接: {}", machineInfo.getHostIp()); +// connectionSession.setMachineInfo(machineInfo); +// try{ +// connectionSession.connect(); +// return true; +// } catch (Exception e) { +// log.error("机器连接测试失败: {}", e.getMessage(), e); +// return false; +// } +// } +// +// @Override +// public ConnectionStatus getConnectionStatus(String machineName) { +// String sessionId = machineSessionMapping.get(machineName); +// if (sessionId == null) { +// return ConnectionStatus.DISCONNECTED; +// } +// +// ConnectionSession session = sessions.get(sessionId); +// return session != null ? session.getStatus() : ConnectionStatus.DISCONNECTED; +// } +// +// @Override +// public Map getAllConnectionStatus() { +// Map result = new HashMap<>(); +// +// machineSessionMapping.forEach((machineName, sessionId) -> { +// ConnectionSession session = sessions.get(sessionId); +// result.put(machineName, session != null ? session.getStatus() : ConnectionStatus.DISCONNECTED); +// }); +// +// return result; +// } +// +// @Override +// public String connect(MachineInfo machineInfo) { +// if (machineInfo.getStatus().getCode() == UN_ENABLE) { +// throw new RuntimeException("机器不可用"); +// } +// log.info("建立机器连接: {}", machineInfo.getHostIp()); +// +// // 检查是否已连接 +// String existingSessionId = machineSessionMapping.get(machineInfo.getName()); +// if (existingSessionId != null) { +// ConnectionSession existingSession = sessions.get(existingSessionId); +// if (existingSession != null && existingSession.getStatus() == ConnectionStatus.CONNECTED) { +// log.info("机器已连接,返回现有会话: {}", machineInfo.getHostIp()); +// return existingSessionId; +// } +// } +// +// try { +// connectionSession.setMachineInfo(machineInfo); +// +// connectionSession.connect(); +// +// // 生成会话ID +// String sessionId = generateSessionId(); +// +// // 保存会话 +// sessions.put(sessionId, connectionSession); +// machineSessionMapping.put(machineInfo.getName(), sessionId); +// +// log.info("机器连接成功: {}, 会话ID: {}", machineInfo.getHostIp(), sessionId); +// return sessionId; +// } catch (Exception e) { +// log.error("机器连接失败: {}", e.getMessage(), e); +// throw new RuntimeException("机器连接失败: " + e.getMessage(), e); +// } +// } +// +// @Override +// public boolean disconnect(String sessionId) { +// log.info("断开机器连接: {}", sessionId); +// +// ConnectionSession session = sessions.get(sessionId); +// if (session == null) { +// log.warn("会话不存在: {}", sessionId); +// return false; +// } +// +// try { +// session.disconnect(); +// +// // 清理会话 +// sessions.remove(sessionId); +// machineSessionMapping.entrySet().removeIf(entry -> entry.getValue().equals(sessionId)); +// +// log.info("机器连接已断开: {}", sessionId); +// return true; +// } catch (Exception e) { +// log.error("断开连接失败: {}", e.getMessage(), e); +// return false; +// } +// } +// +// @Override +// public String executeCommand(String sessionId, String command) { +// log.info("执行命令: {}, 会话ID: {}", command, sessionId); +// +// ConnectionSession session = sessions.get(sessionId); +// if (session == null) { +// throw new RuntimeException("会话不存在: " + sessionId); +// } +// +// if (session.getStatus() != ConnectionStatus.CONNECTED) { +// throw new RuntimeException("会话未连接: " + sessionId); +// } +// +// try { +// return session.executeCommand(command); +// } catch (Exception e) { +// log.error("命令执行失败: {}", e.getMessage(), e); +// throw new RuntimeException("命令执行失败: " + e.getMessage(), e); +// } +// } +// +// @Override +// public boolean uploadFile(String sessionId, String localFilePath, String remoteFilePath) { +// log.info("上传文件: {} -> {}, 会话ID: {}", localFilePath, remoteFilePath, sessionId); +// +// ConnectionSession session = sessions.get(sessionId); +// if (session == null) { +// throw new RuntimeException("会话不存在: " + sessionId); +// } +// +// if (session.getStatus() != ConnectionStatus.CONNECTED) { +// throw new RuntimeException("会话未连接: " + sessionId); +// } +// +// try { +// return session.uploadFile(localFilePath, remoteFilePath); +// } catch (Exception e) { +// log.error("文件上传失败: {}", e.getMessage(), e); +// throw new RuntimeException("文件上传失败: " + e.getMessage(), e); +// } +// } +// +// @Override +// public boolean downloadFile(String sessionId, String remoteFilePath, String localFilePath) { +// log.info("下载文件: {} -> {}, 会话ID: {}", remoteFilePath, localFilePath, sessionId); +// +// ConnectionSession session = sessions.get(sessionId); +// if (session == null) { +// throw new RuntimeException("会话不存在: " + sessionId); +// } +// +// if (session.getStatus() != ConnectionStatus.CONNECTED) { +// throw new RuntimeException("会话未连接: " + sessionId); +// } +// +// try { +// return session.downloadFile(remoteFilePath, localFilePath); +// } catch (Exception e) { +// log.error("文件下载失败: {}", e.getMessage(), e); +// throw new RuntimeException("文件下载失败: " + e.getMessage(), e); +// } +// } +// +// +// /** +// * 生成会话ID +// */ +// private String generateSessionId() { +// return "session-" + sessionIdGenerator.incrementAndGet(); +// } +//} diff --git a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/impl/SecretKeyServiceImpl.java b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/impl/SecretKeyServiceImpl.java index 2b4d6c2d..99d263b1 100644 --- a/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/impl/SecretKeyServiceImpl.java +++ b/modules/module-ci-machine/src/main/java/cd/casic/module/machine/service/impl/SecretKeyServiceImpl.java @@ -1,160 +1,159 @@ -package cd.casic.module.machine.service.impl; - -import cd.casic.module.machine.dto.SecretKeyDto; -import cd.casic.module.machine.entity.MachineInfo; -import cd.casic.module.machine.entity.SecretKey; -import cd.casic.module.machine.mapper.SecretServiceMapper; -import cd.casic.module.machine.service.MachineInfoService; -import cd.casic.module.machine.utils.PageResult; -import cn.hutool.core.io.resource.ResourceUtil; -import cn.hutool.core.util.IdUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; - -import cd.casic.module.machine.utils.AliYunOssClient; -import cd.casic.module.machine.exception.ServiceException; +//package cd.casic.module.machine.service.impl; +// +//import cd.casic.module.machine.controller.vo.SecretKeyDto; +//import cd.casic.module.machine.dal.dataobject.MachineInfo; +//import cd.casic.module.machine.dal.dataobject.SecretKey; +//import cd.casic.module.machine.dal.mysql.SecretServiceMapper; //import cd.casic.module.machine.service.MachineInfoService; -import cd.casic.module.machine.service.SecretKeyService; -import jakarta.annotation.Resource; -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -public class SecretKeyServiceImpl extends ServiceImpl implements SecretKeyService { - - @Resource - private MachineInfoService machineInfoService; - - @Resource - private AliYunOssClient aliYunOssClient; - - @Resource - private SecretServiceMapper secretServiceMapper; - - - - - @Override - public boolean addSecretKey(SecretKeyDto secretKeyDto){ - if (secretKeyDto.getPath()==null) - { - throw new ServiceException(ServiceException.MACHINE_PROXY_NULL,"密钥不能为空"); - } - - String ossPath = upLoadSecretKey(secretKeyDto.getPath()); - if (ossPath == null){ - throw new ServiceException(ServiceException.MACHINE_PROXY_NULL,"密钥上传失败"); - } - secretKeyDto.setPath(ossPath); - SecretKey secretKey = new SecretKey(); - BeanUtils.copyProperties(secretKeyDto,secretKey); - //todo检查密钥合法 - return this.save(secretKey); - - - } - @Override - public boolean updateSecretKey(SecretKeyDto secretKeyDto) { - - Long id = secretKeyDto.getId(); - SecretKey secretKey = this.getById(id); - if (secretKey == null){ - throw new ServiceException(ServiceException.MACHINE_PROXY_NULL,"密钥不存在"); - } - if (!secretKey.getPath().equals(secretKeyDto.getPath())) { - //todo检查密钥合法 - String ossPath = upLoadSecretKey(secretKeyDto.getPath()); - BeanUtils.copyProperties(secretKeyDto,secretKey); - secretKey.setPath(ossPath); - } - else { - BeanUtils.copyProperties(secretKeyDto,secretKey); - } - - return this.updateById(secretKey); - - - } - - @Override - public void bindingMachine(Long secretKeyId, List machineIds) { - SecretKey secretKey = this.getById(secretKeyId); - if (secretKey==null){ - throw new ServiceException(ServiceException.SECRETKEY_NULL,"密钥不存在"); - } - List machineList = machineInfoService.listByIds(machineIds); - machineList.forEach(machine -> machine.setSecretKeyId(secretKeyId)); - machineInfoService.updateBatchById(machineList); - } - - - - - - @Override - public PageResult listSecretKey(SecretKeyDto secretKeyDto) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - if (secretKeyDto.getName() != null && !secretKeyDto.getName().isEmpty()){ - queryWrapper.like("name", secretKeyDto.getName()); - } - if (secretKeyDto.getDescription() != null && !secretKeyDto.getDescription().isEmpty()){ - queryWrapper.like("description", secretKeyDto.getDescription()); - } - Page page = secretServiceMapper.selectPage(new Page<>(secretKeyDto.getPageIndex(), secretKeyDto.getPageSize()), queryWrapper); - return new PageResult<>( - page.getCurrent(), - page.getSize(), - page.getTotal(), - page.getPages(), - page.getRecords() - ); - } - - - - @Override - public boolean deleteList(List secretKeyIds) { - List secretKeys = this.listByIds(secretKeyIds); - - for (SecretKey secretKey : secretKeys) { - if (secretKey.getPath() != null && !secretKey.getPath().isEmpty()){ - try { - //文件名 - //删除子目录文件,需要在前面加上根目录文件路径 - String fileName = secretKey.getPath().substring(secretKey.getPath().lastIndexOf("/") + 1); - aliYunOssClient.delete(fileName); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } - - - //todo是否删除已经绑定的机器 - return secretServiceMapper.deleteBatchIds(secretKeyIds) > 0 ; - } - - - public String upLoadSecretKey(String localPath) { - - //使用S3FileClient上传文件 - aliYunOssClient.init(); - - //传输到指定文件,需要在path前面加上文件路径 - String path = IdUtil.fastSimpleUUID() + ".txt"; - - - //上传文件是从本地上传,这里传的是本地文件地址 - byte[] content = ResourceUtil.readBytes(localPath); - String ossPath; - try { - ossPath = aliYunOssClient.upload(content, path, "txt"); - }catch (Exception e) { - throw new RuntimeException(e+"上传文件失败"); - } - return ossPath; - } -} +//import cn.hutool.core.io.resource.ResourceUtil; +//import cn.hutool.core.util.IdUtil; +//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +//import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +// +//import cd.casic.module.machine.utils.AliYunOssClient; +//import cd.casic.module.machine.exception.ServiceException; +////import cd.casic.module.machine.service.MachineInfoService; +//import cd.casic.module.machine.service.SecretKeyService; +//import jakarta.annotation.Resource; +//import org.springframework.beans.BeanUtils; +//import org.springframework.stereotype.Service; +// +//import java.util.List; +// +//@Service +//public class SecretKeyServiceImpl extends ServiceImpl implements SecretKeyService { +// +// @Resource +// private MachineInfoService machineInfoService; +// +// @Resource +// private AliYunOssClient aliYunOssClient; +// +// @Resource +// private SecretServiceMapper secretServiceMapper; +// +// +// +// +// @Override +// public boolean addSecretKey(SecretKeyDto secretKeyDto){ +// if (secretKeyDto.getPath()==null) +// { +// throw new ServiceException(ServiceException.MACHINE_PROXY_NULL,"密钥不能为空"); +// } +// +// String ossPath = upLoadSecretKey(secretKeyDto.getPath()); +// if (ossPath == null){ +// throw new ServiceException(ServiceException.MACHINE_PROXY_NULL,"密钥上传失败"); +// } +// secretKeyDto.setPath(ossPath); +// SecretKey secretKey = new SecretKey(); +// BeanUtils.copyProperties(secretKeyDto,secretKey); +// //todo检查密钥合法 +// return this.save(secretKey); +// +// +// } +// @Override +// public boolean updateSecretKey(SecretKeyDto secretKeyDto) { +// +// Long id = secretKeyDto.getId(); +// SecretKey secretKey = this.getById(id); +// if (secretKey == null){ +// throw new ServiceException(ServiceException.MACHINE_PROXY_NULL,"密钥不存在"); +// } +// if (!secretKey.getPath().equals(secretKeyDto.getPath())) { +// //todo检查密钥合法 +// String ossPath = upLoadSecretKey(secretKeyDto.getPath()); +// BeanUtils.copyProperties(secretKeyDto,secretKey); +// secretKey.setPath(ossPath); +// } +// else { +// BeanUtils.copyProperties(secretKeyDto,secretKey); +// } +// +// return this.updateById(secretKey); +// +// +// } +// +// @Override +// public void bindingMachine(Long secretKeyId, List machineIds) { +// SecretKey secretKey = this.getById(secretKeyId); +// if (secretKey==null){ +// throw new ServiceException(ServiceException.SECRETKEY_NULL,"密钥不存在"); +// } +// List machineList = machineInfoService.listByIds(machineIds); +// machineList.forEach(machine -> machine.setSecretKeyId(secretKeyId)); +// machineInfoService.updateBatchById(machineList); +// } +// +// +// +// +// +// @Override +// public PageResult listSecretKey(SecretKeyDto secretKeyDto) { +// QueryWrapper queryWrapper = new QueryWrapper<>(); +// if (secretKeyDto.getName() != null && !secretKeyDto.getName().isEmpty()){ +// queryWrapper.like("name", secretKeyDto.getName()); +// } +// if (secretKeyDto.getDescription() != null && !secretKeyDto.getDescription().isEmpty()){ +// queryWrapper.like("description", secretKeyDto.getDescription()); +// } +// Page page = secretServiceMapper.selectPage(new Page<>(secretKeyDto.getPageIndex(), secretKeyDto.getPageSize()), queryWrapper); +// return new PageResult<>( +// page.getCurrent(), +// page.getSize(), +// page.getTotal(), +// page.getPages(), +// page.getRecords() +// ); +// } +// +// +// +// @Override +// public boolean deleteList(List secretKeyIds) { +// List secretKeys = this.listByIds(secretKeyIds); +// +// for (SecretKey secretKey : secretKeys) { +// if (secretKey.getPath() != null && !secretKey.getPath().isEmpty()){ +// try { +// //文件名 +// //删除子目录文件,需要在前面加上根目录文件路径 +// String fileName = secretKey.getPath().substring(secretKey.getPath().lastIndexOf("/") + 1); +// aliYunOssClient.delete(fileName); +// } catch (Exception e) { +// throw new RuntimeException(e); +// } +// } +// } +// +// +// //todo是否删除已经绑定的机器 +// return secretServiceMapper.deleteBatchIds(secretKeyIds) > 0 ; +// } +// +// +// public String upLoadSecretKey(String localPath) { +// +// //使用S3FileClient上传文件 +// aliYunOssClient.init(); +// +// //传输到指定文件,需要在path前面加上文件路径 +// String path = IdUtil.fastSimpleUUID() + ".txt"; +// +// +// //上传文件是从本地上传,这里传的是本地文件地址 +// byte[] content = ResourceUtil.readBytes(localPath); +// String ossPath; +// try { +// ossPath = aliYunOssClient.upload(content, path, "txt"); +// }catch (Exception e) { +// throw new RuntimeException(e+"上传文件失败"); +// } +// return ossPath; +// } +//}