整合aflcrash(未测试)

This commit is contained in:
even 2025-08-11 22:26:06 +08:00
parent c78ef4d33b
commit 9465bf96fb
6 changed files with 188 additions and 0 deletions

View File

@ -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<AflAnalyzerCrashesInfo> {
}

View File

@ -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<LinuxSignals> {
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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<AflAnalyzerCrashesInfo> 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<ChannelSftp.LsEntry> files = sftpChannel.ls(fullOutputPath);
List<LinuxSignals> linuxSignals = signalsMapper.selectList();
Map<String, LinuxSignals> 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<ChannelSftp.LsEntry> 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);
}
}
}