ConsultVulmanageSyncService.java 10.8 KB
package com.idss.vulsync.mvc.service;

import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.serializer.PropertyFilter;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.idss.common.file.storage.FileStorageProxy;
import com.idss.common.file.storage.pojo.dto.FileDownloadInfo;
import com.idss.common.file.storage.pojo.query.OperateQuery;
import com.idss.vulsync.common.EsIndexConstant;
import com.idss.vulsync.config.AssetSftpConfiguration;
import com.idss.vulsync.config.VulSftpConfiguration;
import com.idss.vulsync.constants.CommonConstant;
import com.idss.vulsync.constants.RedisConstants;
import com.idss.vulsync.entity.AssetReportVO;
import com.idss.vulsync.entity.vo.SyncParamConsultRequestData;
import com.idss.vulsync.mvc.mapper.ConsultVulmanageSyncEntityMapper;
import com.idss.vulsync.mvc.pojo.db.ConsultVulmanageSyncEntity;
import com.idss.vulsync.schedule.InitDataSyncJob;
import com.idss.vulsync.utils.MultipartFileToFile;
import com.idss.vulsync.utils.RedisUtil;
import com.idss.vulsync.utils.SftpUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @Author: zc
 * @Date: 2024/8/16 13:48
 */
@Service
@Slf4j
public class ConsultVulmanageSyncService {
    @Autowired
    ObjectMapper objectMapper;
    @Autowired
    ConsultVulmanageSyncEntityMapper consultVulmanageSyncEntityMapper;
    @Autowired
    EsService esService;
    @Autowired(required = false)
    @Qualifier("QuartzScheduler")
    private Scheduler scheduler;
    @Autowired(required = false)
    private FileStorageProxy fileStorageProxy;
    @Autowired
    private RedisUtil redisUtil;
    @Autowired
    AssetSftpConfiguration assetSftpConfiguration;



    public List<AssetReportVO> getLatestDataGxb() {
        List<AssetReportVO> allList = new ArrayList<>();
        Set<String> keys = redisUtil.keys("*" + RedisConstants.INIT_REPORT_DATA_FILE_NAME + "*");
        if(ObjectUtil.isEmpty(keys)){
            log.info("redis未获取到最近一次上报部侧的全量数据文件地址");
            return new ArrayList<>();
        }


        Object initDataFileName =  redisUtil.get(new ArrayList<>(keys).get(0)) ;
        if (ObjectUtil.isEmpty(initDataFileName)) {
            log.info("redis未获取到最近一次上报部侧的全量数据文件地址{}的值", RedisConstants.INIT_REPORT_DATA_FILE_NAME);
            return allList;
        }
        String fileNames = initDataFileName.toString();
        log.info("redis获取最近一次上报部侧的全量数据文件地址{}", fileNames);

        SftpUtil sftpUtil = new SftpUtil(assetSftpConfiguration.getUser(), assetSftpConfiguration.getPwd(), assetSftpConfiguration.getIp(), Integer.parseInt(assetSftpConfiguration.getPort()));
        try {
            sftpUtil.login();
            for (String fileName : fileNames.split(",")) {

                InputStream inputStream = sftpUtil.downloadStream(assetSftpConfiguration.getPath(), fileName.split("/")[1]);

                List<AssetReportVO> resultList = resolveZip2AssetList(inputStream);
                if (ObjectUtil.isNotEmpty(resultList)) {
                    allList.addAll(resultList);
                }
            }

            if (ObjectUtil.isNotEmpty(allList)) {
                log.info("解析最近一次上报全量数据{}包含{}条", fileNames, allList.size());
            }

        } catch (Exception e) {
            log.error("解析最近一次上报全量数据文件异常", e);
        } finally {
            sftpUtil.logout();
        }
        return allList;
    }



    public void consultVulmanage(SyncParamConsultRequestData syncParamConsultRequestData) {
        Date now = new Date();


        //获取最近一次上报部侧的全量数据文件 作为资产同步的初始数据
        List<AssetReportVO> allList = getLatestDataGxb();

        //删除上次的协商参数和资产数据
        ConsultVulmanageSyncEntity existSync = consultVulmanageSyncEntityMapper.selectByPrimaryKey(CommonConstant.CONSULT_UNIQUE_ID);
        if (existSync != null) {
            String existIndex = existSync.getLatestEsId();
            if (ObjectUtil.isNotEmpty(existIndex)) {
                esService.delete(existIndex);
            }
            consultVulmanageSyncEntityMapper.deleteByPrimaryKey(CommonConstant.CONSULT_UNIQUE_ID);
        }


        String newIndex = UUID.randomUUID().toString().replace("-", "");


        //保存初始资产数据
        esService.addBatch(allList, newIndex);
//        esService.addBatch(allList, EsIndexConstant.GXB_ASSET_FULL_DATA_INDEX);

        //保存同步协商参数
        ConsultVulmanageSyncEntity syncEntity = new ConsultVulmanageSyncEntity();
        syncEntity.setId(CommonConstant.CONSULT_UNIQUE_ID);
        syncEntity.setTransId(syncParamConsultRequestData.getTransID());
        syncEntity.setFilePath(syncParamConsultRequestData.getFilePath());
        syncEntity.setUser(syncParamConsultRequestData.getUser()+":"+syncParamConsultRequestData.getPort());
        syncEntity.setCreditType(syncParamConsultRequestData.getCreditType().toString());
        syncEntity.setCredit(syncParamConsultRequestData.getCredit());
        syncEntity.setPubKey(syncParamConsultRequestData.getPubKey());
        syncEntity.setInitDelay(syncParamConsultRequestData.getInitDelay());
        syncEntity.setUpdCycle(syncParamConsultRequestData.getUpdCycle());
        syncEntity.setCreateTime(now);
        syncEntity.setLatestEsId(newIndex);
        consultVulmanageSyncEntityMapper.insertSelective(syncEntity);


        try {
            String initDelay = syncEntity.getInitDelay();
            String numStr = initDelay.substring(0, 2);
            String unit = initDelay.substring(2, initDelay.length());
            Integer num = numStr.startsWith("0") ? Integer.parseInt(numStr.substring(1, numStr.length())) : Integer.parseInt(numStr);


            JobDetail jobDetail = JobBuilder.newJob(InitDataSyncJob.class).
                    withIdentity(InitDataSyncJob.class.getSimpleName(), InitDataSyncJob.class.getSimpleName())
                    .build();


            DateTime executionTime = new DateTime();

            if (unit.equals("分")) {
                executionTime = DateUtil.offsetMinute(now, num);
            } else if (unit.equals("时")) {
                executionTime = DateUtil.offsetHour(now, num);
            } else {
                executionTime = new DateTime(now);
            }


            Trigger trigger = TriggerBuilder.newTrigger().withIdentity(InitDataSyncJob.class.getSimpleName(), InitDataSyncJob.class.getSimpleName())
                    .startAt(executionTime).build();
            JobKey jobKey=new JobKey(InitDataSyncJob.class.getSimpleName(), InitDataSyncJob.class.getSimpleName());
            scheduler.deleteJob(jobKey);
            scheduler.scheduleJob(jobDetail, trigger);
            log.info("新增初始数据同步任务,下次执行时间{}", DateUtil.formatDateTime(executionTime));
        } catch (Exception e) {
            log.error("新增初始数据同步任务异常", e);
        }

    }


    /**
     * 解析zip文件为上报数据
     */
    public List<AssetReportVO> resolveZip2AssetList(InputStream inputStream) {
        List<AssetReportVO> resultList = new ArrayList<>();
        try {
            List<MultipartFile> multipartFiles = MultipartFileToFile.zipParse(inputStream);
            for (MultipartFile multipartFile : multipartFiles) {
                InputStream ins = multipartFile.getInputStream();
                    BufferedReader br = null;
                    try {
                        //读取文件信息
                        br = new BufferedReader(new InputStreamReader(ins));
                        String lines = "";
                        // 根据行进行读取数据
                        while (StringUtils.isNotBlank((lines = br.readLine()))) {
                            AssetReportVO entity = new AssetReportVO();
                            try {
                                entity = objectMapper.readValue(lines, AssetReportVO.class);
//                                String sortedJson = JSON.toJSONString(entity, new PropertyFilter() {
//                                    @Override
//                                    public boolean apply(Object object, String name, Object value) {
//                                        return !ListUtil.toList("TaskID", "AssetID", "taskID", "assetId").contains(name);
//                                    }
//                                });
                                resultList.add(entity);
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                        br.close();
                    } catch (IOException e) {
                        try {
                            br.close();
                        } catch (IOException ex) {
                            ex.printStackTrace();
                        }
                        e.printStackTrace();
                    }

            }
        } catch (Exception e) {
            e.printStackTrace();

        }
        return resultList;
    }

    public static void main(String[] args) {
        String var0="M#@*G+q<O8F";
        int var10000 = 5 << 3 ^ 3 ^ 5;
        int var10001 = (3 ^ 5) << 4 ^ 3;
        int var10002 = 4 << 4 ^ (3 ^ 5) << 1;
        String var1;
        int var10003 = (var1 = (String)var0).length();
        char[] var10004 = new char[var10003];
        boolean var10006 = true;
        int var5 = var10003 - 1;
        var10003 = var10002;
        int var3;
        var10002 = var3 = var5;
        char[] a = var10004;
        int var4 = var10003;
        var10001 = var10000;
        var10000 = var10002;

        for(int var2 = var10001; var10000 >= 0; var10000 = var3) {
            var10001 = var3;
            char var7 = var1.charAt(var3);
            --var3;
            a[var10001] = (char)(var7 ^ var2);
            if (var3 < 0) {
                break;
            }

            var10002 = var3--;
            a[var10002] = (char)(var1.charAt(var10002) ^ var4);
        }




        System.out.println(new String(a));
    }
}