diff --git a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/AflManagerController.java b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/AflManagerController.java index 7a4b4587..677ca4a2 100644 --- a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/AflManagerController.java +++ b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/AflManagerController.java @@ -49,6 +49,15 @@ public class AflManagerController { } + @PostMapping(path="/testSaveAflInfo") + public CommonResult testSaveAflInfo(@RequestBody @Valid AflManagerReq req) throws SftpUploadUtil.SftpUploadException { + + String groupIdentifier = aflInfoService.testSaveAflInfo(req); + + return CommonResult.success(groupIdentifier); + } + + @PostMapping(path="/findAflInfoNow") public CommonResult findAflInfo(@RequestBody @Valid AflManagerReq req) throws SftpUploadUtil.SftpUploadException { @@ -68,7 +77,7 @@ public class AflManagerController { @PostMapping(path="/saveAflCrashesInfo") - public CommonResult saveAflCrashesInfo(@RequestBody @Valid AflManagerReq req) throws SftpUploadUtil.SftpUploadException { + public CommonResult saveAflCrashesInfo(@RequestBody @Valid AflManagerReq req){ String groupIdentifier = aflCrashesInfoService.saveAflCrashesInfo(req); @@ -76,8 +85,17 @@ public class AflManagerController { } + @PostMapping(path="/testSaveAflCrashesInfo") + public CommonResult testSaveAflCrashesInfo(@RequestBody @Valid AflManagerReq req){ + + String groupIdentifier = aflCrashesInfoService.testSaveAflCrashesInfo(req); + + return CommonResult.success(groupIdentifier); + } + + @PostMapping(path="/findCrashesCount") - public CommonResult findCrashesCount(@RequestBody @Valid AflManagerReq req) throws SftpUploadUtil.SftpUploadException { + public CommonResult findCrashesCount(@RequestBody @Valid AflManagerReq req){ AflCrashesResp resp = aflCrashesInfoService.findCrashesCount(req); @@ -86,7 +104,7 @@ public class AflManagerController { @PostMapping(path="/findCrashesNow") - public CommonResult> findCrashesNow(@RequestBody @Valid AflManagerReq req) throws SftpUploadUtil.SftpUploadException { + public CommonResult> findCrashesNow(@RequestBody @Valid AflManagerReq req){ List respList = aflCrashesInfoService.findCrashesNow(req); @@ -113,7 +131,7 @@ public class AflManagerController { @PostMapping(path="/saveAflSeedInfo") - public CommonResult saveAflSeedInfo(@RequestBody @Valid AflManagerReq req) throws SftpUploadUtil.SftpUploadException { + public CommonResult saveAflSeedInfo(@RequestBody @Valid AflManagerReq req){ aflSeedInfoService.saveAflSeedInfo(req); @@ -122,6 +140,16 @@ public class AflManagerController { + @PostMapping(path="/testSaveAflSeedInfo") + public CommonResult testSaveAflSeedInfo(@RequestBody @Valid AflManagerReq req){ + + aflSeedInfoService.testSaveAflSeedInfo(req); + + return CommonResult.success(); + } + + + @PostMapping(path="/saveAflPlotInfo") public CommonResult saveAflPlotInfo(@RequestBody @Valid AflManagerReq req) throws SftpUploadUtil.SftpUploadException { @@ -131,6 +159,16 @@ public class AflManagerController { } + + @PostMapping(path="/testSaveAflPlotInfo") + public CommonResult testSaveAflPlotInfo(@RequestBody @Valid AflManagerReq req) throws SftpUploadUtil.SftpUploadException { + + String groupIdentifier = aflPlotInfoService.testSaveAflPlotInfo(req); + + return CommonResult.success(groupIdentifier); + } + + @PostMapping(path="/findAflPlotInfoNow") public CommonResult findAflPlotInfoNow(@RequestBody @Valid AflManagerReq req) throws SftpUploadUtil.SftpUploadException { diff --git a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/LocalAflCrashesController.java b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/LocalAflCrashesController.java index 1567609e..65d7d811 100644 --- a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/LocalAflCrashesController.java +++ b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/LocalAflCrashesController.java @@ -5,7 +5,6 @@ import cd.casic.ci.process.dto.req.localAflCrashes.LocalAflCrashesQueryReq; import cd.casic.ci.process.dto.req.localAflCrashes.LocalAflCrashesSaveReq; import cd.casic.ci.process.dto.resp.localAflCrashes.LocalAflCrashesResp; import cd.casic.ci.process.process.service.localAflCrashes.LocalAflCrashesService; -import cd.casic.ci.process.util.SftpUploadUtil; import cd.casic.framework.commons.pojo.CommonResult; import cd.casic.framework.commons.pojo.PageResult; import jakarta.annotation.Resource; @@ -22,13 +21,22 @@ public class LocalAflCrashesController { private LocalAflCrashesService localAflCrashesService; @PostMapping(path="/saveLocalAflCrashesInfo") - public CommonResult saveLocalAflCrashesInfo(@RequestBody @Valid LocalAflCrashesSaveReq req) throws SftpUploadUtil.SftpUploadException { + public CommonResult saveLocalAflCrashesInfo(@RequestBody @Valid LocalAflCrashesSaveReq req){ localAflCrashesService.saveLocalAflCrashesInfo(req); return CommonResult.success(); } + + @PostMapping(path="/testSaveLocalAflCrashesInfo") + public CommonResult testSaveLocalAflCrashesInfo(@RequestBody @Valid LocalAflCrashesSaveReq req){ + + localAflCrashesService.testSaveLocalAflCrashesInfo(req); + + return CommonResult.success(); + } + /** *分页模糊查询漏洞信息 */ diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/AflCrashesInfoService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/AflCrashesInfoService.java index 5a6f720c..1cf4ea72 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/AflCrashesInfoService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/AflCrashesInfoService.java @@ -28,4 +28,6 @@ public interface AflCrashesInfoService extends IService { AflCrashesResp findCrashesCount(@Valid AflManagerReq req); List findCrashesNow(@Valid AflManagerReq req); + + String testSaveAflCrashesInfo(@Valid AflManagerReq req); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/AflInfoService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/AflInfoService.java index 1aab05ad..3569f5dc 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/AflInfoService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/AflInfoService.java @@ -28,4 +28,6 @@ public interface AflInfoService extends IService { List findAflInfoListByHistory(@Valid AflManagerReq req); AflBaseInfoResp findAflBaseInfoList(@Valid AflManagerReq req) throws SftpUploadUtil.SftpUploadException; + + String testSaveAflInfo(@Valid AflManagerReq req) throws SftpUploadUtil.SftpUploadException; } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/AflPlotInfoService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/AflPlotInfoService.java index eb352786..3ef10402 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/AflPlotInfoService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/AflPlotInfoService.java @@ -25,4 +25,6 @@ public interface AflPlotInfoService extends IService { List findAflPlotInfoListByHistory(@Valid AflManagerReq req); void updateHistoryPipelineIdByAflPlotInfo(@Valid AflManagerReq req); + + String testSaveAflPlotInfo(@Valid AflManagerReq req) throws SftpUploadUtil.SftpUploadException; } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/AflSeedInfoService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/AflSeedInfoService.java index 8b91efe8..dd0d54e7 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/AflSeedInfoService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/AflSeedInfoService.java @@ -24,4 +24,5 @@ public interface AflSeedInfoService extends IService { void updateHistoryPipelineIdByAflSeedInfo(@Valid AflManagerReq req); + void testSaveAflSeedInfo(@Valid AflManagerReq req); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/impl/AflCrashesInfoServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/impl/AflCrashesInfoServiceImpl.java index 17ec89ff..2fdf0797 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/impl/AflCrashesInfoServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/impl/AflCrashesInfoServiceImpl.java @@ -361,4 +361,124 @@ public class AflCrashesInfoServiceImpl extends ServiceImpl aflCrashesInfos = new ArrayList<>(0); + + if (StringUtils.isEmpty(req.getPipelineId()) || StringUtils.isEmpty(req.getTaskId())){ + throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"pipelineId或者taskId不能为空"); + } + String uuid = req.getGroupIdentifier(); + + ResourceDetailResp resourceById = resourceManagerService.findResourceDetailById("735516490182299648"); + if (resourceById == null || resourceById.getMachineInfo() == null || resourceById.getMachineInfo().getAuthenticationType()!=1) { + throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"资源信息错误"); + } + + MachineInfoDO resourceMachine = resourceById.getMachineInfo(); + String password = CryptogramUtil.doDecrypt(resourceMachine.getPassword()); + resourceMachine.setPassword(password); + + try { + // 步骤1:使用自定义sql获取崩溃文件的创建时间 + //查询创建时间 + List resultList = SftpUploadUtil.findCreateTimeByCommand( + resourceMachine.getHostIp(), + resourceMachine.getSshPort(), + resourceMachine.getUsername(), + resourceMachine.getPassword(), null, remoteFilePath + "PIP_" + req.getPipelineId() + crashesFilePath); + + if (CollectionUtils.isEmpty(resultList)){ + return null; + } + + //解析文件名和创建时间 + for (String o : resultList) { + String[] lineParts = o.split("\\s+创建时间:\\s+"); + if (lineParts.length < 2) { + System.err.println("无效格式: " + o); + break; + } + AflCrashesInfo aflCrashesInfo = new AflCrashesInfo(); + + String fileName = lineParts[0].substring(2).trim(); // 文件信息部分 + String createTime = lineParts[1].trim(); // 创建时间 + aflCrashesInfo.setCrashesName(fileName); + aflCrashesInfo.setCrashesCreateTime(createTime); + + aflCrashesInfos.add(aflCrashesInfo); + } + + // 步驟2.查询文件大小 + List fileResultList = SftpUploadUtil.findFileByteByCommand( + resourceMachine.getHostIp(), + resourceMachine.getSshPort(), + resourceMachine.getUsername(), + resourceMachine.getPassword(), null, remoteFilePath + "PIP_" + req.getPipelineId() + crashesFilePath); + + if (CollectionUtils.isEmpty(fileResultList)){ + return null; + } + + //解析文件名和文件大小 + for (String o : fileResultList) { + // 按空白字符分割 + String[] parts = o.trim().split("\\s+"); + + String fileName = parts[0]; // 文件名称 + Integer fileLength = Integer.parseInt(parts[1]); // 文件大小 + if (!CollectionUtils.isEmpty(aflCrashesInfos)){ + for (AflCrashesInfo aflCrashesInfo : aflCrashesInfos) { + if (aflCrashesInfo.getCrashesName().equals(fileName)) { + aflCrashesInfo.setCrashesLength(fileLength); + } + } + } + } + + // 步骤3:列出源目录下的所有文件 + List files = SftpUploadUtil.listFilesInRemoteDirectory( + resourceMachine.getHostIp(), resourceMachine.getSshPort(), resourceMachine.getUsername(), resourceMachine.getPassword(), null, remoteFilePath + "PIP_" + req.getPipelineId() + crashesFilePath); + + if (!CollectionUtils.isEmpty(files)) { + // 步骤4:批量复制文件到目标目录 + Map copiedFiles = SftpUploadUtil.copyRemoteFilesToLocalMap( + resourceMachine.getHostIp(), resourceMachine.getSshPort(), resourceMachine.getUsername(), resourceMachine.getPassword(), null, files, "/home/ops/opsFile/crashes_result/" + UUID.randomUUID() + "/"); + System.out.println("共复制 " + copiedFiles.size() + " 个文件"); + + //绑定对应的文件路径 + if (!CollectionUtils.isEmpty(copiedFiles)){ + for (Map.Entry entry : copiedFiles.entrySet()) { + if (!CollectionUtils.isEmpty(aflCrashesInfos)){ + for (AflCrashesInfo aflCrashesInfo : aflCrashesInfos) { + if (aflCrashesInfo.getCrashesName().equals(entry.getKey())) { + aflCrashesInfo.setFilePath(entry.getValue()); + } + aflCrashesInfo.setPipelineId(req.getPipelineId()); + if (!StringUtils.isEmpty(req.getTaskId())){ + aflCrashesInfo.setTaskId(req.getTaskId()); + } + if (!StringUtils.isEmpty(req.getPipelineHistoryId())){ + aflCrashesInfo.setPipelineHistoryId(req.getPipelineHistoryId()); + } + aflCrashesInfo.setGroupIdentifier(uuid); + } + } + } + + //新增数据到crashes表中 + baseMapper.insertBatch(aflCrashesInfos); + } + return uuid; + }else { + return null; + } + } catch (Exception e) { + e.printStackTrace(); + throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"crashes入库失败"); + } + } } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/impl/AflInfoServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/impl/AflInfoServiceImpl.java index 032a54ca..c9507b65 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/impl/AflInfoServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/impl/AflInfoServiceImpl.java @@ -228,4 +228,39 @@ public class AflInfoServiceImpl extends ServiceImpl impleme return resp; } + + + @Override + public String testSaveAflInfo(AflManagerReq req) throws SftpUploadUtil.SftpUploadException { + if (StringUtils.isEmpty(req.getPipelineId()) || StringUtils.isEmpty(req.getTaskId())){ + throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"pipelineId或者taskId不能为空"); + } + + ResourceDetailResp resourceById = resourceManagerService.findResourceDetailById("735516490182299648"); + if (resourceById == null || resourceById.getMachineInfo() == null) { + throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"资源信息错误"); + } + + MachineInfoDO resourceMachine = resourceById.getMachineInfo(); + resourceMachine.setPassword(CryptogramUtil.doDecrypt(resourceMachine.getPassword())); + AflInfo aflInfo = SftpUploadUtil.downloadFileSftpForInputStreamAndSetAflInfo(resourceMachine.getHostIp(), resourceMachine.getSshPort(), resourceMachine.getUsername(), resourceMachine.getPassword(),null, remoteFilePath + "PIP_" + req.getPipelineId() + "/ai_afl/default/fuzzer_stats"); + //在本地创建一个新文件夹,将远程文件复制一份过去 + List sourceFilePaths = new ArrayList<>(); + sourceFilePaths.add(remoteFilePath + "PIP_" + req.getPipelineId() + "/ai_afl/default/fuzzer_stats"); + List strings = SftpUploadUtil.copyRemoteFilesToLocal(resourceMachine.getHostIp(), resourceMachine.getSshPort(), resourceMachine.getUsername(), resourceMachine.getPassword(), null, sourceFilePaths, "/home/ops/opsFile/fuzzer_result/" + UUID.randomUUID() + "/"); + + aflInfo.setFilePath(strings.get(0)); + aflInfo.setPipelineId(req.getPipelineId()); + if (!StringUtils.isEmpty(req.getTaskId())){ + aflInfo.setTaskId(req.getTaskId()); + } + if (!StringUtils.isEmpty(req.getPipelineHistoryId())){ + aflInfo.setPipelineHistoryId(req.getPipelineHistoryId()); + } + aflInfo.setGroupIdentifier(req.getGroupIdentifier()); + baseMapper.insert(aflInfo); + + return aflInfo.getGroupIdentifier(); + } + } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/impl/AflPlotInfoServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/impl/AflPlotInfoServiceImpl.java index d394b817..6995149f 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/impl/AflPlotInfoServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/impl/AflPlotInfoServiceImpl.java @@ -160,4 +160,39 @@ public class AflPlotInfoServiceImpl extends ServiceImpl sourceFilePaths = new ArrayList<>(); + sourceFilePaths.add(remoteFilePath + "PIP_" + req.getPipelineId() + "/ai_afl/default/plot_data"); + List strings = SftpUploadUtil.copyRemoteFilesToLocal(resourceMachine.getHostIp(), resourceMachine.getSshPort(), resourceMachine.getUsername(), resourceMachine.getPassword(), null, sourceFilePaths, "/home/ops/opsFile/plot_result/" + UUID.randomUUID() + "/"); + + aflPlotInfo.setFilePath(strings.get(0)); + aflPlotInfo.setPipelineId(req.getPipelineId()); + if (!StringUtils.isEmpty(req.getTaskId())){ + aflPlotInfo.setTaskId(req.getTaskId()); + } + if (!StringUtils.isEmpty(req.getPipelineHistoryId())){ + aflPlotInfo.setPipelineHistoryId(req.getPipelineHistoryId()); + } + aflPlotInfo.setGroupIdentifier(req.getGroupIdentifier()); + baseMapper.insert(aflPlotInfo); + + return aflPlotInfo.getGroupIdentifier(); + } } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/impl/AflSeedInfoServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/impl/AflSeedInfoServiceImpl.java index 2af14d8b..e23df437 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/impl/AflSeedInfoServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflManager/impl/AflSeedInfoServiceImpl.java @@ -286,4 +286,96 @@ public class AflSeedInfoServiceImpl extends ServiceImpl files = SftpUploadUtil.listFilesInRemoteDirectory( + resourceMachine.getHostIp(), resourceMachine.getSshPort(), resourceMachine.getUsername(), resourceMachine.getPassword(), null, remoteFilePath + "PIP_" + req.getPipelineId() + seedFilePath); + + if (!CollectionUtils.isEmpty(files)) { + // 步骤2:批量复制文件到目标目录 + List copiedFiles = SftpUploadUtil.copyRemoteFilesToLocal( + resourceMachine.getHostIp(), resourceMachine.getSshPort(), resourceMachine.getUsername(), resourceMachine.getPassword(), null, files, "/home/ops/opsFile/seed_result/" + UUID.randomUUID() + "/"); + System.out.println("共复制 " + copiedFiles.size() + " 个文件"); + + List aflSeedInfos = new ArrayList<>(0); + if (!CollectionUtils.isEmpty(copiedFiles)){ + //新增数据到seed表中 + copiedFiles.forEach(o->{ + AflSeedInfo aflSeedInfo = new AflSeedInfo(); + + // 提取文件名部分(seed_result/之后的内容) + String fileNamePart = o.substring(o.indexOf("seed_result/") + 12); + + //截取最后一个斜杠后的内容,即文件信息部分 + fileNamePart = fileNamePart.substring(fileNamePart.lastIndexOf("/") + 1); + + // 使用正则匹配 id: 开头的内容 + java.util.regex.Pattern patternId = java.util.regex.Pattern.compile("id:([^,]+)"); + java.util.regex.Matcher matcherId = patternId.matcher(fileNamePart); + + // 使用正则匹配 rep: 开头的内容 + java.util.regex.Pattern patternRep = java.util.regex.Pattern.compile("rep:(\\d+)"); + java.util.regex.Matcher matcherRep = patternRep.matcher(fileNamePart); + + if (matcherRep.find()) { + String repValue = matcherRep.group(1); + aflSeedInfo.setSeedAmount(repValue); + } + + if (matcherId.find()) { + String idValue = matcherId.group(1); + aflSeedInfo.setSeedId(idValue); + } + + aflSeedInfo.setFilePath(o); + if (!StringUtils.isEmpty(req.getTaskId())){ + aflSeedInfo.setTaskId(req.getTaskId()); + } + if (!StringUtils.isEmpty(req.getPipelineHistoryId())){ + aflSeedInfo.setPipelineHistoryId(req.getPipelineHistoryId()); + } + aflSeedInfo.setPipelineId(req.getPipelineId()); + aflSeedInfo.setGroupIdentifier(uuid); + + aflSeedInfos.add(aflSeedInfo); + }); + } + + if (!CollectionUtils.isEmpty(aflSeedInfos)){ + //查询种子运行分钟数,同时入库 + List seedsCount = this.findSeedsCount(req); + if (!CollectionUtils.isEmpty(seedsCount)){ + aflSeedInfos.forEach(o->{ + seedsCount.forEach(j->{ + if (o.getSeedId().equals(j.getSeedId())){ + o.setMinutesDifference(j.getMinutesDifference()); + } + }); + }); + } + baseMapper.insertBatch(aflSeedInfos); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/localAflCrashes/LocalAflCrashesService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/localAflCrashes/LocalAflCrashesService.java index 6e1eee83..0774eebd 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/localAflCrashes/LocalAflCrashesService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/localAflCrashes/LocalAflCrashesService.java @@ -20,4 +20,6 @@ public interface LocalAflCrashesService extends IService { void saveLocalAflCrashesInfo(@Valid LocalAflCrashesSaveReq req); PageResult getLocalAflCrashesSearch(LocalAflCrashesQueryReq req); + + void testSaveLocalAflCrashesInfo(@Valid LocalAflCrashesSaveReq req); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/localAflCrashes/impl/LocalAflCrashesServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/localAflCrashes/impl/LocalAflCrashesServiceImpl.java index c069d62f..af952c40 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/localAflCrashes/impl/LocalAflCrashesServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/localAflCrashes/impl/LocalAflCrashesServiceImpl.java @@ -211,4 +211,122 @@ public class LocalAflCrashesServiceImpl extends ServiceImpl aflCrashesInfos = new ArrayList<>(0); + + if (StringUtils.isEmpty(req.getPipelineId()) || StringUtils.isEmpty(req.getTaskId())){ + throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"pipelineId或者taskId不能为空"); + } + String uuid = req.getGroupIdentifier(); + + ResourceDetailResp resourceById = resourceManagerService.findResourceDetailById("735516490182299648"); + if (resourceById == null || resourceById.getMachineInfo() == null || resourceById.getMachineInfo().getAuthenticationType()!=1) { + throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"资源信息错误"); + } + + MachineInfoDO resourceMachine = resourceById.getMachineInfo(); + String password = CryptogramUtil.doDecrypt(resourceMachine.getPassword()); + resourceMachine.setPassword(password); + + try { + // 步骤1:使用自定义sql获取崩溃文件的创建时间 + //查询创建时间 + List resultList = SftpUploadUtil.findCreateTimeByCommand( + resourceMachine.getHostIp(), + resourceMachine.getSshPort(), + resourceMachine.getUsername(), + resourceMachine.getPassword(), null, remoteFilePath + "PIP_" + req.getPipelineId() + crashesFilePath); + + if (!CollectionUtils.isEmpty(resultList)){ + //解析文件名和创建时间 + for (String o : resultList) { + String[] lineParts = o.split("\\s+创建时间:\\s+"); + if (lineParts.length < 2) { + System.err.println("无效格式: " + o); + break; + } + LocalAflCrashesInfo aflCrashesInfo = new LocalAflCrashesInfo(); + + String fileName = lineParts[0].substring(2).trim(); // 文件信息部分 + String createTime = lineParts[1].trim(); // 创建时间 + aflCrashesInfo.setCrashesName(fileName); + aflCrashesInfo.setCrashesCreateTime(createTime); + + aflCrashesInfos.add(aflCrashesInfo); + } + } + + + + // 步驟2.查询文件大小 + List fileResultList = SftpUploadUtil.findFileByteByCommand( + resourceMachine.getHostIp(), + resourceMachine.getSshPort(), + resourceMachine.getUsername(), + resourceMachine.getPassword(), null, remoteFilePath + "PIP_" + req.getPipelineId() + crashesFilePath); + + if (!CollectionUtils.isEmpty(fileResultList) && !CollectionUtils.isEmpty(aflCrashesInfos)){ + //解析文件名和文件大小 + for (String o : fileResultList) { + // 按空白字符分割 + String[] parts = o.trim().split("\\s+"); + + String fileName = parts[0]; // 文件名称 + Integer fileLength = Integer.parseInt(parts[1]); // 文件大小 + for (LocalAflCrashesInfo aflCrashesInfo : aflCrashesInfos) { + if (aflCrashesInfo.getCrashesName().equals(fileName)) { + aflCrashesInfo.setCrashesLength(fileLength); + } + aflCrashesInfo.setPipelineId(req.getPipelineId()); + if (!StringUtils.isEmpty(req.getTaskId())){ + aflCrashesInfo.setTaskId(req.getTaskId()); + } + aflCrashesInfo.setGroupIdentifier(uuid); + } + } + } + + + + // 步骤3:列出源目录下的所有文件 + List files = SftpUploadUtil.listFilesInRemoteDirectory( + resourceMachine.getHostIp(), resourceMachine.getSshPort(), resourceMachine.getUsername(), resourceMachine.getPassword(), null, remoteFilePath + "PIP_" + req.getPipelineId() + crashesFilePath); + + if (!CollectionUtils.isEmpty(files)) { + // 步骤4:批量下载文件流与文件绑定 + Map copiedFiles = SftpUploadUtil.copyRemoteFilesToByteArray( + resourceMachine.getHostIp(), resourceMachine.getSshPort(), resourceMachine.getUsername(), resourceMachine.getPassword(), null, files); + System.out.println("共复制 " + copiedFiles.size() + " 个文件"); + + //绑定对应的文件流 + if (!CollectionUtils.isEmpty(copiedFiles)){ + for (Map.Entry entry : copiedFiles.entrySet()) { + if (!CollectionUtils.isEmpty(aflCrashesInfos)){ + for (LocalAflCrashesInfo aflCrashesInfo : aflCrashesInfos) { + if (aflCrashesInfo.getCrashesName().equals(entry.getKey())) { + aflCrashesInfo.setFileContent(entry.getValue()); + } + aflCrashesInfo.setPipelineId(req.getPipelineId()); + if (!StringUtils.isEmpty(req.getTaskId())){ + aflCrashesInfo.setTaskId(req.getTaskId()); + } + aflCrashesInfo.setTaskType("AFL"); + aflCrashesInfo.setInstanceId(req.getInstanceId()); + aflCrashesInfo.setTargetType(req.getTargetType()); + aflCrashesInfo.setTargetName(req.getTargetName()); + aflCrashesInfo.setCity(req.getCity()); + } + } + } + + //新增数据到crashes表中 + baseMapper.insertBatch(aflCrashesInfos); + } + } + } catch (Exception e) { + e.printStackTrace(); + throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"crashes入库失败"); + } + } }