aflCrashesAnalyzer信息查询接口

This commit is contained in:
even 2025-08-12 18:07:57 +08:00
parent a79ab4ca17
commit 9bd66db9e9
9 changed files with 149 additions and 17 deletions

View File

@ -0,0 +1,33 @@
package cd.casic.ci.process.dto.resp.aflCrashesAnalyzer;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import org.apache.ibatis.type.JdbcType;
@Data
public class AflCrashesAnalyzerListResp {
private String id;
private String crashName;
private String signId;
private String pipelineHistoryId;
private String pipelineId;
private String taskId;
/**
* 信号名称
* */
private String signalName;
/**
* 信号简析
* */
private String briefDesc;
/**
* 信号详解
* */
private String detailDesc;
/**
* 常见场景
* */
private String commonScenarios;
}

View File

@ -17,6 +17,7 @@ import cd.casic.ci.process.process.dataObject.base.PipBaseElement;
import cd.casic.ci.process.process.dataObject.history.PipPipelineHisInstance;
import cd.casic.ci.process.process.dataObject.pipeline.PipPipeline;
import cd.casic.ci.process.process.service.pipeline.PipelineService;
import cd.casic.ci.process.util.snowflake.SnowflakeIdentifierGenerator;
import cd.casic.framework.commons.exception.ServiceException;
import cd.casic.framework.commons.exception.enums.GlobalErrorCodeConstants;
import cd.casic.framework.security.core.LoginUser;
@ -52,6 +53,8 @@ public class DefaultRunContextManager implements RunContextManager {
private PipelineService pipelineService;
@Resource
private PostHandlerManager postHandlerManager;
@Resource
private SnowflakeIdentifierGenerator idWork;
@Override
public Boolean stopPipeline(String pipelineId) {

View File

@ -117,7 +117,7 @@ public class AFLWorker extends DockerWorker {
}
localVariables.put(DIYImageExecuteCommandConstant.STATUS_CODE, statusCode);
afterTaskExecute(context);
afterPipelineExecute(context,pipeline,resourceById,allDir+"/aflCrash");
afterPipelineExecute(context,pipeline,resourceById,AFL_VOLUME_WORK_DIR_PREFIX+File.separator + workDir+"/aflCrash");
}
}
private String cdSourceName(String fileName){

View File

@ -0,0 +1,16 @@
package cd.casic.ci.process.process.converter;
import cd.casic.ci.process.dto.resp.aflCrashesAnalyzer.AflCrashesAnalyzerListResp;
import cd.casic.ci.process.process.dataObject.aflCrashAnalyzer.AflCrashesAnalyzerInfo;
import org.mapstruct.Mapper;
import org.mapstruct.NullValuePropertyMappingStrategy;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper(componentModel = "spring",nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
public interface AflCrashesAnalyzerConverter {
AflCrashesAnalyzerConverter INSTANCE = Mappers.getMapper(AflCrashesAnalyzerConverter.class);
AflCrashesAnalyzerListResp converter(AflCrashesAnalyzerInfo info);
List<AflCrashesAnalyzerListResp> converter(List<AflCrashesAnalyzerInfo> info);
}

View File

@ -1,7 +1,7 @@
package cd.casic.ci.process.process.dao.aflCrashAnalyzer;
import cd.casic.ci.process.process.dataObject.aflCrashAnalyzer.AflAnalyzerCrashesInfo;
import cd.casic.ci.process.process.dataObject.aflCrashAnalyzer.AflCrashesAnalyzerInfo;
import cd.casic.framework.mybatis.core.mapper.BaseMapperX;
public interface AflAnalyzerCrashesInfoDao extends BaseMapperX<AflAnalyzerCrashesInfo> {
public interface AflCrashesAnalyzerInfoDao extends BaseMapperX<AflCrashesAnalyzerInfo> {
}

View File

@ -4,15 +4,16 @@ 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 com.baomidou.mybatisplus.annotation.TableName;
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 {
@TableName("afl_crashes_analyzer_info")
public class AflCrashesAnalyzerInfo extends BaseDO {
@TableId(type = IdType.ASSIGN_ID)
private String id;
private String crashName;

View File

@ -1,7 +1,11 @@
package cd.casic.ci.process.process.service.aflAnalyzer;
import cd.casic.ci.process.dto.resp.aflCrashesAnalyzer.AflCrashesAnalyzerListResp;
import cd.casic.ci.process.dto.resp.resource.ResourceDetailResp;
import cd.casic.framework.commons.pojo.PageParam;
import cd.casic.framework.commons.pojo.PageResult;
public interface AflCrashesAnalyzerService {
PageResult<AflCrashesAnalyzerListResp> getCrashesPageList(PageParam page);
public void saveCrashesByOutputPath(String outputPath, ResourceDetailResp resourceDetailResp, String pipelineId, String taskId, String pipelineHistoryId);
}

View File

@ -1,14 +1,19 @@
package cd.casic.ci.process.process.service.aflAnalyzer.impl;
import cd.casic.ci.process.dto.resp.aflCrashesAnalyzer.AflCrashesAnalyzerListResp;
import cd.casic.ci.process.dto.resp.resource.ResourceDetailResp;
import cd.casic.ci.process.process.dao.aflCrashAnalyzer.AflAnalyzerCrashesInfoDao;
import cd.casic.ci.process.process.converter.AflCrashesAnalyzerConverter;
import cd.casic.ci.process.process.dao.aflCrashAnalyzer.AflCrashesAnalyzerInfoDao;
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.AflCrashesAnalyzerInfo;
import cd.casic.ci.process.process.dataObject.aflCrashAnalyzer.LinuxSignals;
import cd.casic.ci.process.process.service.aflAnalyzer.AflCrashesAnalyzerService;
import cd.casic.framework.commons.pojo.PageParam;
import cd.casic.framework.commons.pojo.PageResult;
import cd.casic.module.machine.dal.dataobject.MachineInfoDO;
import cd.casic.module.machine.utils.CryptogramUtil;
import com.amazonaws.util.IOUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jcraft.jsch.*;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
@ -32,11 +37,30 @@ public class AflCrashesAnalyzerServiceImpl implements AflCrashesAnalyzerService
@Resource
private LinuxSignalsDao signalsMapper;
@Resource
private AflAnalyzerCrashesInfoDao crashesInfoDao;
private AflCrashesAnalyzerInfoDao crashesInfoDao;
@Resource
private AflCrashesAnalyzerConverter converter;
public PageResult<AflCrashesAnalyzerListResp> getCrashesPageList(PageParam page){
LambdaQueryWrapper<AflCrashesAnalyzerInfo> wrapper = new LambdaQueryWrapper<>();
PageResult<AflCrashesAnalyzerInfo> infoPage = crashesInfoDao.selectPage(page, wrapper);
List<LinuxSignals> linuxSignals = signalsMapper.selectList();
Map<String, LinuxSignals> signMap = linuxSignals.stream().collect(Collectors.toMap(LinuxSignals::getId, Function.identity()));
List<AflCrashesAnalyzerInfo> list = infoPage.getList();
List<AflCrashesAnalyzerListResp> respList = converter.converter(list);
respList.forEach(item ->{
LinuxSignals signal = signMap.get(item.getSignId());
item.setBriefDesc(signal.getBriefDesc());
item.setDetailDesc(signal.getDetailDesc());
item.setSignalName(signal.getSignalName());
item.setCommonScenarios(signal.getCommonScenarios());
});
return new PageResult<AflCrashesAnalyzerListResp>(respList,infoPage.getTotal(), infoPage.getPageNum(), infoPage.getPageSize());
}
@Override
public void saveCrashesByOutputPath(String outputPath, ResourceDetailResp resource, String pipelineId, String taskId, String pipelineHistoryId) {
log.info("afl-crash-analyzer信息入库开始执行:{},{},{},{}",outputPath,pipelineId,taskId,pipelineHistoryId);
MachineInfoDO machineInfo = resource.getMachineInfo();
List<AflAnalyzerCrashesInfo> dbList= new LinkedList<>();
List<AflCrashesAnalyzerInfo> dbList= new LinkedList<>();
try {
JSch jsch = new JSch();
Session session = jsch.getSession(machineInfo.getUsername(),machineInfo.getHostIp(), machineInfo.getSshPort());
@ -48,7 +72,7 @@ public class AflCrashesAnalyzerServiceImpl implements AflCrashesAnalyzerService
channel.connect();
ChannelSftp sftpChannel = (ChannelSftp) channel;
String fullOutputPath = outputPath + File.separator + "per-signal";
String fullOutputPath = outputPath + "/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()));
@ -62,14 +86,15 @@ public class AflCrashesAnalyzerServiceImpl implements AflCrashesAnalyzerService
log.error("未识别信号类型");
continue;
}
String crashesTypes = fullOutputPath + File.separator + sign.getId();
String crashesTypes = fullOutputPath + "/" + 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();
System.out.println(crashesTypes + "/" + crashFilename);
InputStream crashesInputStream = ((ChannelSftp) channel).get(crashesTypes + "/"+ crashFilename);
AflCrashesAnalyzerInfo crashesInfo = new AflCrashesAnalyzerInfo();
crashesInfo.setCrashName(crashe.getFilename());
crashesInfo.setSignId(sign.getId());
crashesInfo.setPipelineHistoryId(pipelineHistoryId);
@ -84,7 +109,9 @@ public class AflCrashesAnalyzerServiceImpl implements AflCrashesAnalyzerService
}
}
}
if (!CollectionUtils.isEmpty(dbList)) {
crashesInfoDao.insertBatch(dbList);
}
sftpChannel.disconnect();
session.disconnect();
} catch (JSchException | SftpException e) {
@ -92,8 +119,6 @@ public class AflCrashesAnalyzerServiceImpl implements AflCrashesAnalyzerService
} catch (IOException e) {
throw new RuntimeException(e);
}
if (!CollectionUtils.isEmpty(dbList)) {
crashesInfoDao.insertBatch(dbList);
}
}
}

View File

@ -0,0 +1,50 @@
package cd.casic.server;
import cd.casic.ci.commons.properties.TargetFileUploadProperties;
import cd.casic.ci.process.dto.resp.aflCrashesAnalyzer.AflCrashesAnalyzerListResp;
import cd.casic.ci.process.dto.resp.resource.ResourceDetailResp;
import cd.casic.ci.process.process.dataObject.history.PipPipelineHisInstance;
import cd.casic.ci.process.process.dataObject.resource.PipResourceManager;
import cd.casic.ci.process.process.service.aflAnalyzer.AflCrashesAnalyzerService;
import cd.casic.ci.process.process.service.history.PipelineHistoryService;
import cd.casic.ci.process.process.service.resource.ResourceManagerService;
import cd.casic.framework.commons.pojo.PageParam;
import cd.casic.framework.commons.pojo.PageResult;
import com.jcraft.jsch.*;
import jakarta.annotation.Resource;
import org.apache.commons.io.IOUtils;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.web.WebAppConfiguration;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.util.Properties;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@SpringBootTest(classes = {OpsServerApplication.class})
@ActiveProfiles("local")
@WebAppConfiguration
public class AflCrashesAnalyzerTest {
@Resource
AflCrashesAnalyzerService crashesAnalyzerService;
@Resource
PipelineHistoryService historyService;
@Resource
ResourceManagerService resourceManagerService;
@Test
public void test01(){
PipPipelineHisInstance byId = historyService.getById("743101099321462784");
System.out.println(byId);
ResourceDetailResp resource = resourceManagerService.findResourceDetailById("735516490182299648");
crashesAnalyzerService.saveCrashesByOutputPath("/home/casic/706/yunqi/PIP_"+byId.getPipelineId()+"/aflCrash",resource,byId.getPipelineId(),"738805555593875459",byId.getId());
}
@Test
public void test02(){
PageResult<AflCrashesAnalyzerListResp> crashesPageList = crashesAnalyzerService.getCrashesPageList(new PageParam());
System.out.println(crashesPageList);
}
}