diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dao/aflCrashAnalyzer/AflAnalyzerCrashesInfoDao.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dao/aflCrashAnalyzer/AflAnalyzerCrashesInfoDao.java new file mode 100644 index 00000000..7d354f0d --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dao/aflCrashAnalyzer/AflAnalyzerCrashesInfoDao.java @@ -0,0 +1,7 @@ +package cd.casic.ci.process.process.dao.aflCrashAnalyzer; + +import cd.casic.ci.process.process.dataObject.aflCrashAnalyzer.AflAnalyzerCrashesInfo; +import cd.casic.framework.mybatis.core.mapper.BaseMapperX; + +public interface AflAnalyzerCrashesInfoDao extends BaseMapperX { +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dao/aflCrashAnalyzer/LinuxSignalsDao.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dao/aflCrashAnalyzer/LinuxSignalsDao.java new file mode 100644 index 00000000..ba7c9fa7 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dao/aflCrashAnalyzer/LinuxSignalsDao.java @@ -0,0 +1,7 @@ +package cd.casic.ci.process.process.dao.aflCrashAnalyzer; + +import cd.casic.ci.process.process.dataObject.aflCrashAnalyzer.LinuxSignals; +import cd.casic.framework.mybatis.core.mapper.BaseMapperX; + +public interface LinuxSignalsDao extends BaseMapperX { +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/aflCrashAnalyzer/AflAnalyzerCrashesInfo.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/aflCrashAnalyzer/AflAnalyzerCrashesInfo.java new file mode 100644 index 00000000..00c08bcb --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/aflCrashAnalyzer/AflAnalyzerCrashesInfo.java @@ -0,0 +1,29 @@ +package cd.casic.ci.process.process.dataObject.aflCrashAnalyzer; + +import cd.casic.framework.commons.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.ibatis.type.JdbcType; + +import java.time.LocalDateTime; + +@EqualsAndHashCode(callSuper = true) +@Data +public class AflAnalyzerCrashesInfo extends BaseDO { + @TableId(type = IdType.ASSIGN_ID) + private String id; + private String crashName; + private String signId; + @TableField(jdbcType = JdbcType.BLOB) + private byte[] crashesContent; + private String pipelineHistoryId; + private String pipelineId; + private String taskId; + private LocalDateTime createTime; + private LocalDateTime updateTime; + private String updater; + private String creator; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/aflCrashAnalyzer/LinuxSignals.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/aflCrashAnalyzer/LinuxSignals.java new file mode 100644 index 00000000..0b8876bd --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/aflCrashAnalyzer/LinuxSignals.java @@ -0,0 +1,39 @@ +package cd.casic.ci.process.process.dataObject.aflCrashAnalyzer; + +import cd.casic.framework.commons.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +@EqualsAndHashCode(callSuper = true) +@Data +public class LinuxSignals extends BaseDO { + /** + * 信号码,同时也是主键 + * */ + @TableId(type = IdType.ASSIGN_ID) + private String id; + /** + * 信号名称 + * */ + private String signalName; + /** + * 信号简析 + * */ + private String briefDesc; + /** + * 信号详解 + * */ + private String detailDesc; + /** + * 常见场景 + * */ + private String commonScenarios; + private LocalDateTime createTime; + private LocalDateTime updateTime; + private String updater; + private String creator; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflAnalyzer/AflCrashesAnalyzerService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflAnalyzer/AflCrashesAnalyzerService.java new file mode 100644 index 00000000..58a9d4c7 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflAnalyzer/AflCrashesAnalyzerService.java @@ -0,0 +1,7 @@ +package cd.casic.ci.process.process.service.aflAnalyzer; + +import cd.casic.ci.process.dto.resp.resource.ResourceDetailResp; + +public interface AflCrashesAnalyzerService { + public void saveCrashesByOutputPath(String outputPath, ResourceDetailResp resourceDetailResp, String pipelineId, String taskId, String pipelineHistoryId); +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflAnalyzer/impl/AflCrashesAnalyzerServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflAnalyzer/impl/AflCrashesAnalyzerServiceImpl.java new file mode 100644 index 00000000..9aaa4fdc --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/aflAnalyzer/impl/AflCrashesAnalyzerServiceImpl.java @@ -0,0 +1,99 @@ +package cd.casic.ci.process.process.service.aflAnalyzer.impl; + +import cd.casic.ci.process.dto.resp.resource.ResourceDetailResp; +import cd.casic.ci.process.process.dao.aflCrashAnalyzer.AflAnalyzerCrashesInfoDao; +import cd.casic.ci.process.process.dao.aflCrashAnalyzer.LinuxSignalsDao; +import cd.casic.ci.process.process.dataObject.aflCrashAnalyzer.AflAnalyzerCrashesInfo; +import cd.casic.ci.process.process.dataObject.aflCrashAnalyzer.LinuxSignals; +import cd.casic.ci.process.process.service.aflAnalyzer.AflCrashesAnalyzerService; +import cd.casic.module.machine.dal.dataobject.MachineInfoDO; +import cd.casic.module.machine.utils.CryptogramUtil; +import com.amazonaws.util.IOUtils; +import com.jcraft.jsch.*; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * afl crashes文件分析service类 + * */ +@Service +@Slf4j +public class AflCrashesAnalyzerServiceImpl implements AflCrashesAnalyzerService { + @Resource + private LinuxSignalsDao signalsMapper; + @Resource + private AflAnalyzerCrashesInfoDao crashesInfoDao; + @Override + public void saveCrashesByOutputPath(String outputPath, ResourceDetailResp resource, String pipelineId, String taskId, String pipelineHistoryId) { + MachineInfoDO machineInfo = resource.getMachineInfo(); + List dbList= new LinkedList<>(); + try { + JSch jsch = new JSch(); + Session session = jsch.getSession(machineInfo.getUsername(),machineInfo.getHostIp(), machineInfo.getSshPort()); + session.setPassword(CryptogramUtil.doDecrypt(machineInfo.getPassword())); + session.setConfig("StrictHostKeyChecking", "no"); + session.connect(); + + Channel channel = session.openChannel("sftp"); + channel.connect(); + ChannelSftp sftpChannel = (ChannelSftp) channel; + + String fullOutputPath = outputPath + File.separator + "per-signal"; + Vector files = sftpChannel.ls(fullOutputPath); + List linuxSignals = signalsMapper.selectList(); + Map signCodeMap = linuxSignals.stream().collect(Collectors.toMap(LinuxSignals::getId, Function.identity())); + for (ChannelSftp.LsEntry entry : files) { + String filename = entry.getFilename(); + if (!filename.equals(".") && !filename.equals("..")) { + if (entry.getAttrs().isDir()) { + //文件夹下第一级是信号分类,下面就是crash文件 + LinuxSignals sign = signCodeMap.get(filename); + if (sign==null) { + log.error("未识别信号类型"); + continue; + } + String crashesTypes = fullOutputPath + File.separator + sign.getId(); + // 查找crashes 的分类下的crashes + Vector crashes = sftpChannel.ls(crashesTypes); + for (ChannelSftp.LsEntry crashe : crashes) { + String crashFilename = crashe.getFilename(); + if (!crashe.getAttrs().isDir()) { + InputStream crashesInputStream = ((ChannelSftp) channel).get(fullOutputPath + File.separator + crashFilename); + AflAnalyzerCrashesInfo crashesInfo = new AflAnalyzerCrashesInfo(); + crashesInfo.setCrashName(crashe.getFilename()); + crashesInfo.setSignId(sign.getId()); + crashesInfo.setPipelineHistoryId(pipelineHistoryId); + crashesInfo.setPipelineId(pipelineId); + crashesInfo.setTaskId(taskId); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + IOUtils.copy(crashesInputStream,bos); + crashesInfo.setCrashesContent(bos.toByteArray()); + dbList.add(crashesInfo); + } + } + } + } + } + + sftpChannel.disconnect(); + session.disconnect(); + } catch (JSchException | SftpException e) { + e.printStackTrace(); + } catch (IOException e) { + throw new RuntimeException(e); + } + if (!CollectionUtils.isEmpty(dbList)) { + crashesInfoDao.insertBatch(dbList); + } + } +}