整合aflcrash(未测试)
This commit is contained in:
parent
c78ef4d33b
commit
9465bf96fb
@ -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> {
|
||||
}
|
@ -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> {
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user