Commit 7ad84320c387a8a0531bbc6b632d0d96a718de9a

Authored by zhangqiang
0 parents

漏管接口 init

Showing 42 changed files with 4831 additions and 0 deletions

Too many changes to show.

To preserve performance only 42 of 46 files are displayed.

  1 +/target
  2 +/*.iml
  3 +/.idea
  4 +/logs
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4 + <modelVersion>4.0.0</modelVersion>
  5 +
  6 + <groupId>com.idss.asset</groupId>
  7 + <artifactId>asset-service-vulsync</artifactId>
  8 + <version>0.0.1-SNAPSHOT</version>
  9 + <name>asset-service-vulsync</name>
  10 +
  11 +
  12 +
  13 + <properties>
  14 + <package.path>${project.build.directory}</package.path>
  15 + <province.classifier/>
  16 + <maven.compiler.source>8</maven.compiler.source>
  17 + <maven.compiler.target>8</maven.compiler.target>
  18 + <asset.service.kafka.version>[2.0.5,2.0.5.9999]</asset.service.kafka.version>
  19 + <log4j.version>2.18.0</log4j.version>
  20 + <postgresql.version>[42.4,42.999]</postgresql.version>
  21 + <fastjson.version>1.2.83</fastjson.version>
  22 + <druid.version>1.2.8</druid.version>
  23 + <asset.service.common.version>2.1.8.74</asset.service.common.version>
  24 + <asset.service.authority.version>2.1.8.45</asset.service.authority.version>
  25 + <asset.service.ip.version>2.1.8.7</asset.service.ip.version>
  26 + <spring.util.version>2.2.1.7</spring.util.version>
  27 + <asset.service.dictionary.version>2.1.8.12</asset.service.dictionary.version>
  28 + <logback.classic.version>1.2.10</logback.classic.version>
  29 + <spring.security.version>5.7.5</spring.security.version>
  30 + <spring.boot>2.5.4</spring.boot>
  31 + </properties>
  32 +
  33 + <dependencies>
  34 +
  35 +
  36 + <dependency>
  37 + <groupId>org.springframework.boot</groupId>
  38 + <artifactId>spring-boot-starter-web</artifactId>
  39 + <version>2.5.4</version>
  40 + </dependency>
  41 +
  42 + <dependency>
  43 + <groupId>javax.servlet</groupId>
  44 + <artifactId>javax.servlet-api</artifactId>
  45 + <version>4.0.1</version>
  46 + </dependency>
  47 +
  48 +
  49 + <dependency>
  50 + <groupId>org.elasticsearch.client</groupId>
  51 + <artifactId>elasticsearch-rest-high-level-client</artifactId>
  52 + <version>7.17.12</version>
  53 + </dependency>
  54 + <dependency>
  55 + <groupId>org.apache.commons</groupId>
  56 + <artifactId>commons-lang3</artifactId>
  57 + <version>[3.12.0,3.999]</version>
  58 + </dependency>
  59 + <dependency>
  60 + <groupId>cloud.agileframework</groupId>
  61 + <artifactId>agile-mybatis</artifactId>
  62 + <version>2.2.1.13</version>
  63 + <exclusions>
  64 + <exclusion>
  65 + <groupId>cloud.agileframework</groupId>
  66 + <artifactId>common-util</artifactId>
  67 + </exclusion>
  68 + <exclusion>
  69 + <groupId>org.postgresql</groupId>
  70 + <artifactId>postgresql</artifactId>
  71 + </exclusion>
  72 + </exclusions>
  73 + </dependency>
  74 + <dependency>
  75 + <groupId>org.springframework.boot</groupId>
  76 + <artifactId>spring-boot-starter-data-redis</artifactId>
  77 + <version>2.5.4</version>
  78 + </dependency>
  79 + <dependency>
  80 + <groupId>com.jcraft</groupId>
  81 + <artifactId>jsch</artifactId>
  82 + <version>0.1.55</version>
  83 + </dependency>
  84 + <dependency>
  85 + <groupId>commons-fileupload</groupId>
  86 + <artifactId>commons-fileupload</artifactId>
  87 + <version>1.3.3</version>
  88 + <scope>compile</scope>
  89 + </dependency>
  90 + <dependency>
  91 + <groupId>com.fasterxml.jackson.core</groupId>
  92 + <artifactId>jackson-databind</artifactId>
  93 + <version>2.17.2</version>
  94 + </dependency>
  95 +
  96 + <dependency>
  97 + <groupId>cloud.agileframework</groupId>
  98 + <artifactId>spring-util</artifactId>
  99 + <version>${spring.util.version}</version>
  100 + </dependency>
  101 + <dependency>
  102 + <groupId>cloud.agileframework</groupId>
  103 + <artifactId>common-util</artifactId>
  104 + <version>2.2.1.26</version>
  105 + <exclusions>
  106 + <exclusion>
  107 + <groupId>org.apache.commons</groupId>
  108 + <artifactId>commons-collections4</artifactId>
  109 + </exclusion>
  110 + <exclusion>
  111 + <groupId>com.alibaba</groupId>
  112 + <artifactId>fastjson</artifactId>
  113 + </exclusion>
  114 + <exclusion>
  115 + <groupId>cloud.agileframework</groupId>
  116 + <artifactId>spring-util</artifactId>
  117 + </exclusion>
  118 + <exclusion>
  119 + <groupId>org.apache.commons</groupId>
  120 + <artifactId>commons-lang3</artifactId>
  121 + </exclusion>
  122 + </exclusions>
  123 + </dependency>
  124 + <dependency>
  125 + <groupId>cn.hutool</groupId>
  126 + <artifactId>hutool-all</artifactId>
  127 + <version>5.7.22</version>
  128 + </dependency>
  129 + <dependency>
  130 + <groupId>org.springframework.boot</groupId>
  131 + <artifactId>spring-boot-starter-quartz</artifactId>
  132 + <version>2.5.4</version>
  133 + </dependency>
  134 +
  135 + <dependency>
  136 + <groupId>org.postgresql</groupId>
  137 + <artifactId>postgresql</artifactId>
  138 + <version>${postgresql.version}</version>
  139 + <exclusions>
  140 + <exclusion>
  141 + <groupId>org.checkerframework</groupId>
  142 + <artifactId>checker-qual</artifactId>
  143 + </exclusion>
  144 + </exclusions>
  145 + </dependency>
  146 + <!-- <dependency>-->
  147 + <!-- <groupId>com.alibaba</groupId>-->
  148 + <!-- <artifactId>druid</artifactId>-->
  149 + <!-- <version>${druid.version}</version>-->
  150 + <!-- </dependency>-->
  151 + <!-- 这个依赖需要引入,如果是使用spring缓存时需要使用其初始化缓存数据,不能删除!!! -->
  152 + <dependency>
  153 + <groupId>org.slf4j</groupId>
  154 + <artifactId>slf4j-api</artifactId>
  155 + <version>[1.7.32,1.7.999]</version>
  156 + <optional>true</optional>
  157 + </dependency>
  158 + <dependency>
  159 + <groupId>org.apache.logging.log4j</groupId>
  160 + <artifactId>log4j-api</artifactId>
  161 + <version>2.17.1</version>
  162 + </dependency>
  163 + <dependency>
  164 + <groupId>org.apache.logging.log4j</groupId>
  165 + <artifactId>log4j-to-slf4j</artifactId>
  166 + <version>${log4j.version}</version>
  167 + </dependency>
  168 +
  169 + <dependency>
  170 + <groupId>ch.qos.logback</groupId>
  171 + <artifactId>logback-classic</artifactId>
  172 + <version>${logback.classic.version}</version>
  173 + </dependency>
  174 + <dependency>
  175 + <groupId>com.alibaba</groupId>
  176 + <artifactId>fastjson</artifactId>
  177 + <version>${fastjson.version}</version>
  178 + </dependency>
  179 + <dependency>
  180 + <groupId>org.apache.logging.log4j</groupId>
  181 + <artifactId>log4j-to-slf4j</artifactId>
  182 + <exclusions>
  183 + <exclusion>
  184 + <groupId>org.apache.logging.log4j</groupId>
  185 + <artifactId>log4j-api</artifactId>
  186 + </exclusion>
  187 + </exclusions>
  188 + <version>${log4j.version}</version>
  189 + </dependency>
  190 + <dependency>
  191 + <groupId>org.apache.logging.log4j</groupId>
  192 + <artifactId>log4j-api</artifactId>
  193 + <version>${log4j.version}</version>
  194 + </dependency>
  195 + <dependency>
  196 + <groupId>org.projectlombok</groupId>
  197 + <artifactId>lombok</artifactId>
  198 + <optional>true</optional>
  199 + <version>1.18.12</version>
  200 + </dependency>
  201 +
  202 + <dependency>
  203 + <groupId>com.alibaba</groupId>
  204 + <artifactId>druid-spring-boot-starter</artifactId>
  205 + <version>1.1.9</version>
  206 + </dependency>
  207 +
  208 + <dependency>
  209 + <groupId>org.springframework.boot</groupId>
  210 + <artifactId>spring-boot-autoconfigure</artifactId>
  211 + <version>2.5.4</version>
  212 + </dependency>
  213 +
  214 + <dependency>
  215 + <groupId>org.bouncycastle</groupId>
  216 + <artifactId>bcpkix-jdk15on</artifactId>
  217 + <version>1.60</version>
  218 + </dependency> <dependency>
  219 + <groupId>com.idss.common</groupId>
  220 + <artifactId>common-file-storage</artifactId>
  221 + <version>1.0.0.16</version>
  222 + </dependency>
  223 + <dependency>
  224 + <groupId>cloud.agileframework</groupId>
  225 + <artifactId>agile-security</artifactId>
  226 + <version>2.2.1.18</version>
  227 + </dependency>
  228 + <dependency>
  229 + <groupId>cloud.agileframework</groupId>
  230 + <artifactId>agile-validate</artifactId>
  231 + <version>2.2.1.3</version>
  232 + </dependency>
  233 +
  234 + <dependency>
  235 + <groupId>cloud.agileframework</groupId>
  236 + <artifactId>agile-mvc</artifactId>
  237 + <version>2.2.1.21</version>
  238 + </dependency>
  239 +
  240 +
  241 + </dependencies>
  242 +
  243 + <repositories>
  244 + <repository>
  245 + <id>shanghai</id>
  246 + <url>http://10.66.11.136:8082/repository/maven-public/</url>
  247 + </repository>
  248 + </repositories>
  249 +
  250 +
  251 + <build>
  252 + <finalName>${project.artifactId}</finalName>
  253 + <plugins>
  254 + <!-- 开始处理启动模块jar包, -->
  255 + <plugin>
  256 + <groupId>org.apache.maven.plugins</groupId>
  257 + <artifactId>maven-jar-plugin</artifactId>
  258 + <configuration>
  259 + <!--在启动模块的jar中排除以下文件类型,这是为了避免启动模块jar和后续的config目录下存在两份相同资源文件从而导致项目无法重启-->
  260 + <excludes>
  261 + <!-- <exclude>**/*.xml</exclude>-->
  262 + <!-- <exclude>**/*.yml</exclude>-->
  263 + </excludes>
  264 + <archive>
  265 + <manifest>
  266 + <!-- 执行的主程序路径 -->
  267 + <mainClass>com.idss.vulsync.VulSyncApp</mainClass>
  268 + <!--是否要把第三方jar放到manifest的classpath中-->
  269 + <addClasspath>true</addClasspath>
  270 + <!--生成的manifest中classpath的前缀,因为要把第三方jar放到lib目录下,所以classpath的前缀是lib/-->
  271 + <classpathPrefix>../lib/</classpathPrefix>
  272 + <!-- 打包时 MANIFEST.MF 文件不记录的时间戳版本 -->
  273 + <useUniqueVersions>false</useUniqueVersions>
  274 + </manifest>
  275 + <manifestEntries>
  276 + <!-- 在 Class-Path 下添加配置文件的路径 -->
  277 + <Class-Path>../config/</Class-Path>
  278 + </manifestEntries>
  279 + </archive>
  280 + <!-- 将启动模块的jar包也输出到对应的lib下 -->
  281 + <outputDirectory>${package.path}/lib/</outputDirectory>
  282 + </configuration>
  283 + </plugin>
  284 +
  285 + <!-- 开始处理依赖包,将所有资源文件拷贝到${package.path}/lib下 -->
  286 + <plugin>
  287 + <groupId>org.apache.maven.plugins</groupId>
  288 + <artifactId>maven-dependency-plugin</artifactId>
  289 + <executions>
  290 + <execution>
  291 + <id>copy-dependencies</id>
  292 + <phase>package</phase>
  293 + <goals>
  294 + <goal>copy-dependencies</goal>
  295 + </goals>
  296 + <configuration>
  297 + <outputDirectory>${package.path}/lib/</outputDirectory>
  298 + </configuration>
  299 + </execution>
  300 + </executions>
  301 + </plugin>
  302 +
  303 + <!-- 开始处理资源文件,将所有资源文件拷贝到${package.path}/config下 -->
  304 + <plugin>
  305 + <artifactId>maven-resources-plugin</artifactId>
  306 + <executions>
  307 + <execution>
  308 + <id>copy-mapper</id>
  309 + <phase>package</phase>
  310 + <goals>
  311 + <goal>copy-resources</goal>
  312 + </goals>
  313 + <configuration>
  314 + <resources>
  315 + <!--把配置文件打包到指定路径-->
  316 + <resource>
  317 + <directory>src/main/resources/mapper/</directory>
  318 + </resource>
  319 + </resources>
  320 + <outputDirectory>${package.path}/config</outputDirectory>
  321 + </configuration>
  322 + </execution>
  323 +
  324 + <execution>
  325 + <id>copy-resources</id>
  326 + <phase>package</phase>
  327 + <goals>
  328 + <goal>copy-resources</goal>
  329 + </goals>
  330 + <configuration>
  331 + <resources>
  332 + <!--把配置文件打包到指定路径-->
  333 + <resource>
  334 + <directory>src/main/resources/</directory>
  335 + <excludes>
  336 + <exclude>**/*.xml</exclude>
  337 + </excludes>
  338 + </resource>
  339 + </resources>
  340 + <outputDirectory>${package.path}/config</outputDirectory>
  341 + </configuration>
  342 + </execution>
  343 + <!--copy 脚本,把bin目录下的文件复制到,打包目录下-->
  344 + <execution>
  345 + <id>copy-bin</id>
  346 + <phase>package</phase>
  347 + <goals>
  348 + <goal>copy-resources</goal>
  349 + </goals>
  350 + <configuration>
  351 + <resources>
  352 + <resource>
  353 + <!--注意:此处bin脚本目录在src下,根据实际情况填写-->
  354 + <directory>src/bin/</directory>
  355 + </resource>
  356 + </resources>
  357 + <outputDirectory>${package.path}/bin</outputDirectory>
  358 + </configuration>
  359 + </execution>
  360 + </executions>
  361 + </plugin>
  362 + </plugins>
  363 + </build>
  364 +
  365 +
  366 +</project>
  1 +package com.idss.vulsync;
  2 +
  3 +import org.mybatis.spring.annotation.MapperScan;
  4 +import org.springframework.boot.SpringApplication;
  5 +import org.springframework.boot.autoconfigure.SpringBootApplication;
  6 +import org.springframework.context.annotation.ComponentScan;
  7 +import org.springframework.scheduling.annotation.EnableScheduling;
  8 +
  9 +/**
  10 + * @Author: zc
  11 + * @Date: 2024/8/1 14:04
  12 + */
  13 +@SpringBootApplication
  14 +@ComponentScan(value = {"com.idss"})
  15 +@EnableScheduling
  16 +@MapperScan(value = {"com.idss.vulsync.mvc.mapper", "com.idss.common.file.storage.mapper"})
  17 +public class VulSyncApp {
  18 + /**
  19 + * main方法
  20 + *
  21 + * @param args args
  22 + */
  23 + public static void main(String[] args) {
  24 + new SpringApplication(VulSyncApp.class).run(args);
  25 + }
  26 +}
  1 +package com.idss.vulsync.common;
  2 +
  3 +/**
  4 + * ES索引常量
  5 + *
  6 + * @author zhangjiachen
  7 + */
  8 +public class EsIndexConstant {
  9 +
  10 + /**
  11 + * 部侧全量数据
  12 + */
  13 +
  14 + public static final String GXB_ASSET_FULL_DATA_INDEX = "gxb_asset_full_data_index";
  15 +
  16 +
  17 + /**
  18 + * 默认索引类型
  19 + */
  20 + public static final String DEFAULT_TYPE = "_doc";
  21 + }
  1 +package com.idss.vulsync.config;
  2 +
  3 +import lombok.Data;
  4 +import org.springframework.boot.context.properties.ConfigurationProperties;
  5 +import org.springframework.context.annotation.Configuration;
  6 +
  7 +/**
  8 + * @Author: zc
  9 + * @Date: 2024/8/16 14:29
  10 + */
  11 +@Configuration
  12 +@ConfigurationProperties(value = "assetftp")
  13 +@Data
  14 +public class AssetSftpConfiguration {
  15 + private String ip;
  16 + private String port;
  17 + private String user;
  18 + private String pwd;
  19 + private String path;
  20 +}
  1 +package com.idss.vulsync.config;
  2 +
  3 +import cloud.agileframework.mvc.base.AbstractResponseFormat;
  4 +import cloud.agileframework.mvc.base.Head;
  5 +import com.fasterxml.jackson.core.JsonProcessingException;
  6 +import com.fasterxml.jackson.databind.ObjectMapper;
  7 +import com.fasterxml.jackson.databind.type.TypeFactory;
  8 +import org.springframework.beans.factory.annotation.Autowired;
  9 +import org.springframework.stereotype.Component;
  10 +
  11 +import java.util.HashMap;
  12 +import java.util.LinkedHashMap;
  13 +import java.util.Map;
  14 +
  15 +/**
  16 + * @Author: zc
  17 + * @Date: 2024/8/20 16:41
  18 + */
  19 +@Component
  20 +public class CommonResponseFormate extends AbstractResponseFormat {
  21 + @Autowired
  22 + ObjectMapper objectMapper;
  23 +
  24 + @Override
  25 + public Map<String, Object> buildResponseData(Head head, Object result) {
  26 + //head为组件整理后的响应头部信息
  27 + //result为响应体信息
  28 + //自行定制返回结果状态为Map格式返回,该Map将作为ModelAndView中的Model组装成视图写入response
  29 + LinkedHashMap<String, Object> map = new LinkedHashMap<>();
  30 + try {
  31 + map = objectMapper.readValue(objectMapper.writeValueAsString(result), TypeFactory.defaultInstance().constructMapType(LinkedHashMap.class, String.class, Object.class));
  32 + return map;
  33 + } catch (JsonProcessingException e) {
  34 + e.printStackTrace();
  35 + }
  36 + return map;
  37 + }
  38 +}
  1 +package com.idss.vulsync.config;
  2 +
  3 +import cn.hutool.core.collection.ListUtil;
  4 +import lombok.extern.slf4j.Slf4j;
  5 +import org.apache.commons.lang3.StringUtils;
  6 +import org.apache.http.HttpHost;
  7 +import org.apache.http.auth.AuthScope;
  8 +import org.apache.http.auth.UsernamePasswordCredentials;
  9 +import org.apache.http.client.CredentialsProvider;
  10 +import org.apache.http.impl.client.BasicCredentialsProvider;
  11 +import org.elasticsearch.client.*;
  12 +import org.slf4j.Logger;
  13 +import org.slf4j.LoggerFactory;
  14 +import org.springframework.beans.factory.annotation.Value;
  15 +import org.springframework.context.annotation.Bean;
  16 +import org.springframework.context.annotation.Configuration;
  17 +
  18 +import javax.annotation.PostConstruct;
  19 +import java.util.ArrayList;
  20 +import java.util.List;
  21 +
  22 +/**
  23 + * @Author: zc
  24 + * @Date: 2021/11/19 14:06
  25 + */
  26 +@Configuration
  27 +@Slf4j
  28 +public class ElasticSearchConfig {
  29 + private List<HttpHost> httpHosts = new ArrayList<>();
  30 + /**
  31 + * elk集群地址
  32 + */
  33 + @Value("${spring.data.elasticsearch.cluster-hosts}")
  34 + private String hostName;
  35 +
  36 +
  37 +
  38 + /**
  39 + * 用户
  40 + */
  41 + @Value("${spring.data.elasticsearch.userName}")
  42 + private String username;
  43 +
  44 + /**
  45 + * 密码
  46 + */
  47 + @Value("${spring.data.elasticsearch.password}")
  48 + private String password;
  49 +
  50 +// /**
  51 +// * 连接池
  52 +// */
  53 +// @Value("${elasticsearch.pool}")
  54 +// private String poolSize;
  55 +
  56 + public static final RequestOptions COMMON_OPTIONS;
  57 + static {
  58 + RequestOptions.Builder builder=RequestOptions.DEFAULT.toBuilder();
  59 + COMMON_OPTIONS=builder.build();
  60 + }
  61 +
  62 + /**
  63 + * 防止netty的bug
  64 + * java.lang.IllegalStateException: availableProcessors is already set to [4], rejecting [4]
  65 + */
  66 + @PostConstruct
  67 + void init() {
  68 + System.setProperty("es.set.netty.runtime.available.processors", "false");
  69 + }
  70 +
  71 + @Bean
  72 + public RestHighLevelClient restHighLevelClient() {
  73 + String[] hosts = hostName.split(",");
  74 + for (String host : hosts) {
  75 + String[] hostStr = host.split(":");
  76 + httpHosts.add(new HttpHost(hostStr[0], Integer.parseInt(hostStr[1]), "http"));
  77 + }
  78 + RestClientBuilder builder = RestClient.builder(httpHosts.toArray(new HttpHost[0]));
  79 + RestHighLevelClient restHighLevelClient=getRestHighLevelClient(builder);
  80 + return restHighLevelClient;
  81 + }
  82 +
  83 + /**
  84 + * get restHistLevelClient
  85 + *
  86 + * @return
  87 + */
  88 + private RestHighLevelClient getRestHighLevelClient(RestClientBuilder builder) {
  89 + // Callback used the default {@link RequestConfig} being set to the {@link CloseableHttpClient}
  90 + builder.setRequestConfigCallback(requestConfigBuilder -> {
  91 + requestConfigBuilder.setConnectTimeout(1000);
  92 + requestConfigBuilder.setSocketTimeout(30000);
  93 + requestConfigBuilder.setConnectionRequestTimeout(500);
  94 + return requestConfigBuilder;
  95 + });
  96 + // Callback used to customize the {@link CloseableHttpClient} instance used by a {@link RestClient} instance.
  97 + builder.setHttpClientConfigCallback(httpClientBuilder -> {
  98 + httpClientBuilder.setMaxConnTotal(30);
  99 + httpClientBuilder.setMaxConnPerRoute(10);
  100 + // Callback used the basic credential auth
  101 + if (!StringUtils.isEmpty(username) && !StringUtils.isEmpty(password)) {
  102 + final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
  103 + credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
  104 + httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
  105 + }
  106 + return httpClientBuilder;
  107 + });
  108 +
  109 + return new RestHighLevelClient(builder);
  110 + }
  111 +
  112 +}
  1 +package com.idss.vulsync.config;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonInclude;
  4 +import com.fasterxml.jackson.databind.DeserializationFeature;
  5 +import com.fasterxml.jackson.databind.ObjectMapper;
  6 +import com.fasterxml.jackson.databind.SerializationFeature;
  7 +import org.springframework.context.annotation.Bean;
  8 +import org.springframework.context.annotation.Configuration;
  9 +
  10 +/**
  11 + * @Author: zc
  12 + * @Date: 2024/8/30 14:37
  13 + */
  14 +@Configuration
  15 +public class JacksonConfig {
  16 + @Bean
  17 + public ObjectMapper objectMapper() {
  18 + ObjectMapper mapper = new ObjectMapper();
  19 + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
  20 + // 自定义配置
  21 + mapper.configure(DeserializationFeature.USE_JAVA_ARRAY_FOR_JSON_ARRAY, false);;
  22 + mapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, false);
  23 + return mapper;
  24 + }
  25 +}
  1 +package com.idss.crawl.config;
  2 +
  3 +import org.springframework.beans.factory.annotation.Value;
  4 +import org.springframework.context.annotation.Bean;
  5 +import org.springframework.context.annotation.Configuration;
  6 +import org.springframework.data.redis.connection.RedisConnectionFactory;
  7 +import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
  8 +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
  9 +import org.springframework.data.redis.core.RedisTemplate;
  10 +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
  11 +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
  12 +import org.springframework.data.redis.serializer.StringRedisSerializer;
  13 +
  14 +/**
  15 + * RedisConfig
  16 + * 设置序列化与反序列化方法
  17 + *
  18 + * @author Syouken
  19 + */
  20 +@Configuration
  21 +public class RedisConfig {
  22 + @Value("${spring.redis.host}")
  23 + private String host;
  24 + @Value("${spring.redis.port}")
  25 + private Integer port;
  26 + @Value("${spring.redis.password}")
  27 + private String password;
  28 + @Value("${spring.redis.database}")
  29 + private Integer database;
  30 +
  31 + @Bean
  32 + public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
  33 + RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
  34 + redisTemplate.setConnectionFactory(redisConnectionFactory);
  35 + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer=new Jackson2JsonRedisSerializer(Object.class);
  36 + redisTemplate.setKeySerializer(new StringRedisSerializer());
  37 + redisTemplate.setValueSerializer(new StringRedisSerializer());
  38 + redisTemplate.setHashKeySerializer(new StringRedisSerializer());
  39 + redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
  40 + redisTemplate.afterPropertiesSet();
  41 + return redisTemplate;
  42 + }
  43 +
  44 + @Bean
  45 + public RedisConnectionFactory redisConnectionFactory(){
  46 + RedisStandaloneConfiguration redisStandaloneConfiguration=new RedisStandaloneConfiguration();
  47 + redisStandaloneConfiguration.setHostName(host);
  48 + redisStandaloneConfiguration.setPort(port);
  49 + redisStandaloneConfiguration.setPassword(password);
  50 + redisStandaloneConfiguration.setDatabase(database);
  51 + LettuceConnectionFactory lettuceConnectionFactory=new LettuceConnectionFactory(redisStandaloneConfiguration);
  52 + lettuceConnectionFactory.afterPropertiesSet();
  53 + return lettuceConnectionFactory;
  54 + }
  55 +
  56 +}
  1 +package com.idss.vulsync.config;
  2 +
  3 +import cloud.agileframework.spring.util.PropertiesUtil;
  4 +import org.quartz.Scheduler;
  5 +import org.quartz.ee.servlet.QuartzInitializerListener;
  6 +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  7 +import org.springframework.context.ApplicationContext;
  8 +import org.springframework.context.annotation.Bean;
  9 +import org.springframework.context.annotation.Configuration;
  10 +import org.springframework.scheduling.quartz.SchedulerFactoryBean;
  11 +import org.springframework.scheduling.quartz.SpringBeanJobFactory;
  12 +
  13 +import java.io.IOException;
  14 +import java.util.Properties;
  15 +
  16 +@Configuration
  17 +@ConditionalOnProperty(prefix = "spring", value = "quartz.enable", havingValue = "true", matchIfMissing = false)
  18 +public class SchedulerConfig {
  19 +
  20 + @Bean(name="SchedulerFactory")
  21 + public SchedulerFactoryBean schedulerFactoryBean(ApplicationContext applicationContext) throws IOException {
  22 + SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
  23 + SpringBeanJobFactory jobFactory = new SpringBeanJobFactory();
  24 + jobFactory.setApplicationContext(applicationContext);
  25 + schedulerFactoryBean.setJobFactory(jobFactory);
  26 + schedulerFactoryBean.setQuartzProperties(quartzProperties());
  27 + return schedulerFactoryBean;
  28 + }
  29 +
  30 + @Bean(name="QuartzScheduler")
  31 + public Scheduler quartzScheduler(ApplicationContext applicationContext) throws IOException {
  32 + return schedulerFactoryBean(applicationContext).getScheduler();
  33 + }
  34 +
  35 +
  36 + /**
  37 + * quartz初始化监听器
  38 + * 这个监听器可以监听到工程的启动,在工程停止再启动时可以让已有的定时任务继续进行。
  39 + *
  40 + * @return
  41 + */
  42 + @Bean
  43 + public QuartzInitializerListener executorListener() {
  44 + return new QuartzInitializerListener();
  45 + }
  46 +
  47 + @Bean
  48 + public Properties quartzProperties() throws IOException {
  49 + Properties properties = new Properties();
  50 + properties.put("org.quartz.scheduler.instanceName", "asset-service-vulsync");
  51 + properties.put("org.quartz.scheduler.instanceId", "AUTO");
  52 + properties.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");
  53 + properties.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate");
  54 + properties.put("org.quartz.jobStore.tablePrefix", PropertiesUtil.getProperty("spring.quartz.prefix"));
  55 + properties.put("org.quartz.jobStore.isClustered", "true");
  56 + properties.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
  57 + properties.put("org.quartz.threadPool.threadCount", "10");
  58 + properties.put("org.quartz.threadPool.threadPriority", "5");
  59 + properties.put("org.quartz.jobStore.dataSource", "myDS");
  60 + properties.put("org.quartz.dataSource.myDS.driver", PropertiesUtil.getProperty("spring.datasource.driver-class-name"));
  61 + properties.put("org.quartz.dataSource.myDS.URL", PropertiesUtil.getProperty("spring.datasource.url"));
  62 + properties.put("org.quartz.dataSource.myDS.user", PropertiesUtil.getProperty("spring.datasource.username"));
  63 + properties.put("org.quartz.dataSource.myDS.password", PropertiesUtil.getProperty("spring.datasource.password"));
  64 + properties.put("org.quartz.dataSource.myDS.maxConnections", "10");
  65 + return properties;
  66 + }
  67 +}
  1 +//package com.idss.vulsync.config;
  2 +//
  3 +//import lombok.Data;
  4 +//import org.springframework.boot.context.properties.ConfigurationProperties;
  5 +//import org.springframework.context.annotation.Configuration;
  6 +//
  7 +///**
  8 +// * @Author: zc
  9 +// * @Date: 2024/8/16 14:29
  10 +// */
  11 +//@Configuration
  12 +//@ConfigurationProperties(value = "ftp")
  13 +//@Data
  14 +//public class SftpConfiguration {
  15 +// private String ip;
  16 +// private Integer port;
  17 +// private String user;
  18 +// private String pwd;
  19 +// private String dir;
  20 +//
  21 +// private String tmpdir;
  22 +//}
  1 +package com.idss.vulsync.config;
  2 +
  3 +import javax.net.ssl.X509TrustManager;
  4 +import java.security.cert.CertificateException;
  5 +import java.security.cert.X509Certificate;
  6 +
  7 +/**
  8 + * @Author: zc
  9 + * @Date: 2024/8/8 20:04
  10 + */
  11 +public class TrustAllCertManager implements X509TrustManager {
  12 + @Override
  13 + public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
  14 +
  15 + }
  16 +
  17 + @Override
  18 + public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
  19 +
  20 + }
  21 +
  22 + @Override
  23 + public X509Certificate[] getAcceptedIssuers() {
  24 + return null;
  25 + }
  26 +
  27 +}
  1 +package com.idss.vulsync.config;
  2 +
  3 +import lombok.Data;
  4 +import org.springframework.boot.context.properties.ConfigurationProperties;
  5 +import org.springframework.context.annotation.Configuration;
  6 +
  7 +/**
  8 + * @Author: zc
  9 + * @Date: 2024/8/16 14:29
  10 + */
  11 +@Configuration
  12 +@ConfigurationProperties(value = "vulftp")
  13 +@Data
  14 +public class VulSftpConfiguration {
  15 + private String ip;
  16 + private String temp;
  17 +}
  1 +package com.idss.vulsync.constants;
  2 +
  3 +
  4 +/**
  5 + * 公共常量
  6 + */
  7 +public class CommonConstant {
  8 + /**
  9 + * 冒号:":"
  10 + */
  11 + public static final String COLON = ":";
  12 +
  13 + public static final String CONSULT_UNIQUE_ID = "CONSULT_UNIQUE_ID";
  14 +}
  1 +package com.idss.vulsync.constants;
  2 +
  3 +/**
  4 + * @Author: zc
  5 + * @Date: 2024/8/16 14:00
  6 + */
  7 +public class RedisConstants {
  8 +
  9 + //部侧上报全量数据文件 多文件路径用逗号分隔
  10 + public static final String INIT_REPORT_DATA_FILE_NAME = "init-report-data-file-name";
  11 +// public static final String INIT_REPORT_DATA_FILE_NAME = "063c032e-0021-4619-a26f-65e12635594d";
  12 +
  13 + //部侧上报全量数据es索引
  14 + public static final String INIT_REPORT_DATA_INDEX = "init-report-data-index";
  15 +
  16 +}
  1 +package com.idss.vulsync.entity;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonProperty;
  4 +import com.fasterxml.jackson.annotation.JsonPropertyOrder;
  5 +import lombok.Data;
  6 +
  7 +import java.util.List;
  8 +
  9 +/**
  10 + * @Author: zc
  11 + * @Date: 2023/4/7 13:10
  12 + */
  13 +@Data
  14 +@JsonPropertyOrder(alphabetic=true)
  15 +public class AssetInfo {
  16 + @JsonProperty("Brand")
  17 + private List<Brand> brand;
  18 + @JsonProperty("Language")
  19 + private String language;
  20 +
  21 + @JsonProperty("Memory")
  22 + private List<Memory> memory;
  23 +
  24 + @JsonProperty("OpenSource")
  25 + private String openSource;
  26 + @JsonProperty("HardwareEnvironment")
  27 + private String hardwareEnvironment;
  28 + @JsonProperty("SoftwareEnvironment")
  29 + private String softwareEnvironment;
  30 +
  31 + @JsonProperty("CPU")
  32 + private List<Cpu> cpu;
  33 + @JsonProperty("information")
  34 + private List<Information> information;
  35 +
  36 + @JsonProperty("Chip")
  37 + private List<Chip> Chip;
  38 +
  39 + @Data
  40 + @JsonPropertyOrder(alphabetic=true)
  41 + public static class Brand {
  42 + @JsonProperty("Manufacturer")
  43 + private String manufacturer;
  44 + @JsonProperty("Region")
  45 + private String region;
  46 + @JsonProperty("Name")
  47 + private String name;
  48 + }
  49 +
  50 + @Data
  51 + @JsonPropertyOrder(alphabetic=true)
  52 + public static class Memory {
  53 + @JsonProperty("Manufacturer")
  54 + private String manufacturer;
  55 + @JsonProperty("Model")
  56 + private String model;
  57 + }
  58 +
  59 + @Data
  60 + @JsonPropertyOrder(alphabetic=true)
  61 + public static class Cpu {
  62 + @JsonProperty("Manufacturer")
  63 + private String manufacturer;
  64 + @JsonProperty("Model")
  65 + private String model;
  66 + }
  67 +
  68 + @Data
  69 + @JsonPropertyOrder(alphabetic=true)
  70 + public static class Information {
  71 + @JsonProperty("Version")
  72 + private String version;
  73 + @JsonProperty("Model")
  74 + private String model;
  75 + }
  76 +
  77 + @Data
  78 + @JsonPropertyOrder(alphabetic=true)
  79 + public static class Chip {
  80 + @JsonProperty("Manufacturer")
  81 + private String manufacturer;
  82 + @JsonProperty("Model")
  83 + private String model;
  84 + }
  85 +}
  86 +
  87 +
  1 +package com.idss.vulsync.entity;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonProperty;
  4 +import com.fasterxml.jackson.annotation.JsonPropertyOrder;
  5 +import lombok.Data;
  6 +
  7 +import java.util.List;
  8 +
  9 +/**
  10 + * @Author: zc
  11 + * @Date: 2023/4/7 13:10
  12 + */
  13 +@Data
  14 +@JsonPropertyOrder(alphabetic=true)
  15 +public class AssetIpInfo {
  16 + @JsonProperty("IpType")
  17 + private String ipType;
  18 + @JsonProperty("Ip")
  19 + private String ip;
  20 +
  21 + @JsonProperty("OpenPort")
  22 + private List<Ip> openPort;
  23 +
  24 + @Data
  25 + @JsonPropertyOrder(alphabetic=true)
  26 + public static class Ip {
  27 + @JsonProperty("protocol")
  28 + private String protocol;
  29 + @JsonProperty("port")
  30 + private String port;
  31 + }
  32 +}
  33 +
  34 +
  1 +package com.idss.vulsync.entity;
  2 +
  3 +import com.alibaba.fastjson.annotation.JSONField;
  4 +import com.fasterxml.jackson.annotation.JsonIgnore;
  5 +import com.fasterxml.jackson.annotation.JsonProperty;
  6 +import com.fasterxml.jackson.annotation.JsonPropertyOrder;
  7 +import lombok.Data;
  8 +
  9 +import java.util.List;
  10 +
  11 +/**
  12 + * @Author: zc
  13 + * @Date: 2024/8/16 14:18
  14 + */
  15 +@Data
  16 +@JsonPropertyOrder(alphabetic=true)
  17 +public class AssetReportVO {
  18 + @JsonProperty("TaskID")
  19 + private String taskID;
  20 + @JsonProperty("IspCode")
  21 + private String ispCode;
  22 + @JsonProperty("OrgCode")
  23 + private String orgCode;
  24 + @JsonProperty("AssetID")
  25 + private String assetId;
  26 + @JsonProperty("AssetIPInfo")
  27 + private List<AssetIpInfo> assetIPInfo;
  28 + @JsonProperty("AssetName")
  29 + private String assetName;
  30 + @JsonProperty("AssetType")
  31 + private String assetType;
  32 + @JsonProperty("AssetTag")
  33 + private String assetTag;
  34 + @JsonProperty("AssetInfo")
  35 + private List<AssetInfo> assetInfo;
  36 + @JsonProperty("IsAccess")
  37 + private String isAccess;
  38 + @JsonProperty("State")
  39 + private String state;
  40 + @JsonProperty("SystemName")
  41 + private String systemName;
  42 + @JsonProperty("NetworkUnit")
  43 + private String networkUnit;
  44 + @JsonProperty("NetPosition")
  45 + private String netPosition;
  46 + @JsonProperty("FoundTypeList")
  47 + private String foundTypeList;
  48 + @JsonProperty("FoundTypeTime")
  49 + private String foundTypeTime;
  50 + @JsonProperty("Location")
  51 + private String location;
  52 + @JsonProperty("ObjectName")
  53 + private String objectName;
  54 + @JsonProperty("DeviceLevel")
  55 + private String deviceLevel;
  56 +
  57 +// @JsonProperty("SortedJson")
  58 +// @JsonIgnore
  59 +// private String sortedJson;
  60 +}
  1 +/**
  2 + * @Author: zc
  3 + * @Date: 2024/8/13 15:01
  4 + */
  5 +package com.idss.vulsync.entity;
  1 +package com.idss.vulsync.entity.vo;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonProperty;
  4 +import lombok.Data;
  5 +
  6 +/**
  7 + * @Author: zc
  8 + * @Date: 2024/8/13 15:11
  9 + */
  10 +@Data
  11 +public class BaseRequest {
  12 + private String msgID;
  13 + private Integer msgType;
  14 + @JsonProperty("IspCode")
  15 + private String ispCode;
  16 + @JsonProperty("OrgCode")
  17 + private String orgCode;
  18 + @JsonProperty("ReqMsgCnt")
  19 + private String reqMsgCnt;
  20 + @JsonProperty("Timestamp")
  21 + private String timestamp;
  22 + @JsonProperty("Sign")
  23 + private String sign;
  24 +}
  1 +package com.idss.vulsync.entity.vo;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonProperty;
  4 +import com.fasterxml.jackson.annotation.JsonPropertyOrder;
  5 +import lombok.Data;
  6 +
  7 +/**
  8 + * @Author: zc
  9 + * @Date: 2024/8/13 15:11
  10 + */
  11 +@Data
  12 +public class BaseResponse <Rsp>{
  13 + private String msgID;
  14 + private Integer msgType;
  15 + private Integer statusCode;
  16 + private String statusText;
  17 + @JsonProperty("RspMsgCnt")
  18 + private Rsp rspMsgCnt;
  19 + @JsonProperty("Timestamp")
  20 + private String timestamp;
  21 + @JsonProperty("Sign")
  22 + private String sign;
  23 +}
  1 +package com.idss.vulsync.entity.vo;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonProperty;
  4 +import com.fasterxml.jackson.annotation.JsonPropertyOrder;
  5 +import lombok.Data;
  6 +
  7 +/**
  8 + * @Author: zc
  9 + * 同步参数协商
  10 + * @Date: 2024/8/13 15:02
  11 + */
  12 +@Data
  13 +@JsonPropertyOrder(value = {"TransID","filePath","user","port","creditType","initDelay","updCycle","credit"})
  14 +public class SyncParamConsultRequestData {
  15 + @JsonProperty("TransID")
  16 + private String transID;
  17 + private String filePath;
  18 + private String user;
  19 + private Integer creditType;
  20 + private String credit;
  21 + private String pubKey;
  22 + private String initDelay;
  23 + private String updCycle;
  24 + private Integer port;
  25 +}
  1 +package com.idss.vulsync.entity.vo;
  2 +
  3 +import lombok.Data;
  4 +
  5 +/**
  6 + * @Author: zc
  7 + * 同步参数协商
  8 + * @Date: 2024/8/13 15:02
  9 + */
  10 +@Data
  11 +public class SyncParamConsultResponseData {
  12 + private String initDelay;
  13 + private String updCycle;
  14 +}
  1 +package com.idss.vulsync.enums;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +import lombok.NoArgsConstructor;
  6 +
  7 +/**
  8 + * TopicTypeEnum
  9 + *
  10 + */
  11 +@Getter
  12 +@AllArgsConstructor
  13 +@NoArgsConstructor
  14 +public enum TopicTypeEnum {
  15 + /**
  16 + * crawl-task-begin
  17 + */
  18 + CRAWL_BEGIN("crawl-task-begin", "web爬虫程序启动"),
  19 +
  20 +
  21 + /**
  22 + * crawl-task-return
  23 + */
  24 + CRAWL_RETURN("crawl-task-return", "web爬虫程序应答"),
  25 + ;
  26 +
  27 + private String code;
  28 +
  29 + private String msg;
  30 +
  31 + /**
  32 + * 根据code查找name
  33 + *
  34 + * @param name name
  35 + * @return TopicTypeEnum
  36 + */
  37 + public static TopicTypeEnum getByCode(String name) {
  38 + TopicTypeEnum[] enums = TopicTypeEnum.values();
  39 + for (TopicTypeEnum e : enums) {
  40 + if (e.getCode().equals(name)) {
  41 + return e;
  42 + }
  43 + }
  44 + return null;
  45 + }
  46 +}
  1 +package com.idss.vulsync.mvc.controller;
  2 +
  3 +import cloud.agileframework.common.constant.Constant;
  4 +import cloud.agileframework.mvc.base.RETURN;
  5 +import cloud.agileframework.mvc.param.AgileReturn;
  6 +import cn.hutool.core.date.DateUtil;
  7 +import com.fasterxml.jackson.databind.DeserializationFeature;
  8 +import com.fasterxml.jackson.databind.ObjectMapper;
  9 +import com.fasterxml.jackson.databind.type.TypeFactory;
  10 +import com.idss.vulsync.entity.vo.BaseRequest;
  11 +import com.idss.vulsync.entity.vo.BaseResponse;
  12 +import com.idss.vulsync.entity.vo.SyncParamConsultRequestData;
  13 +import com.idss.vulsync.entity.vo.SyncParamConsultResponseData;
  14 +import com.idss.vulsync.mvc.service.ConsultVulmanageSyncService;
  15 +import com.idss.vulsync.utils.AuthUtils;
  16 +import lombok.extern.slf4j.Slf4j;
  17 +import org.springframework.beans.factory.annotation.Autowired;
  18 +import org.springframework.stereotype.Controller;
  19 +import org.springframework.web.bind.annotation.GetMapping;
  20 +import org.springframework.web.bind.annotation.PostMapping;
  21 +import org.springframework.web.bind.annotation.RequestBody;
  22 +import org.springframework.web.bind.annotation.RequestMapping;
  23 +
  24 +import javax.servlet.http.HttpServletRequest;
  25 +import java.security.PublicKey;
  26 +import java.util.Base64;
  27 +import java.util.LinkedHashMap;
  28 +
  29 +/**
  30 + * @Author: zc
  31 + * @Date: 2024/7/17 13:31
  32 + */
  33 +@Slf4j
  34 +@Controller
  35 +@RequestMapping("/api/v1/")
  36 +public class SyncController {
  37 +
  38 + @Autowired
  39 + AuthUtils authUtils;
  40 +
  41 + @Autowired
  42 + ConsultVulmanageSyncService consultVulmanageSyncService;
  43 + @Autowired
  44 + ObjectMapper objectMapper;
  45 +
  46 +
  47 + @GetMapping("/test")
  48 + public RETURN aaa() {
  49 + log.info("接收到请求test");
  50 +
  51 + PublicKey publicKey = authUtils.getPublicKey();
  52 + AgileReturn.add("test");
  53 + return RETURN.SUCCESS;
  54 +// return AgileReturn.build();
  55 +
  56 + }
  57 +
  58 + public static void main(String[] args) {
  59 + String a="QWEuMUQwUkQ5TzI2";
  60 + String s = new String(Base64.getDecoder().decode(a.getBytes()));
  61 + System.out.println(s);
  62 + }
  63 +
  64 + /**
  65 + * 资管侧提供服务
  66 + */
  67 + @PostMapping("/assetSvc")
  68 + public RETURN assetSvc(@RequestBody BaseRequest object, HttpServletRequest httpServletRequest) {
  69 +
  70 + BaseResponse baseResponse = new BaseResponse();
  71 +// boolean validAuth = authUtils.valid(httpServletRequest);
  72 +// if (!validAuth) {
  73 +// baseResponse.setStatusText("认证失败");
  74 +// baseResponse.setStatusCode(2);
  75 +// AgileReturn.add(Constant.ResponseAbout.RESULT, baseResponse);
  76 +// return RETURN.SUCCESS;
  77 +// }
  78 +
  79 +
  80 + try {
  81 + String json = objectMapper.writeValueAsString(object);
  82 + log.info("接收到请求{}", json);
  83 +
  84 + objectMapper.configure(DeserializationFeature.USE_JAVA_ARRAY_FOR_JSON_ARRAY, false);
  85 + LinkedHashMap<String, Object> requestMap = objectMapper.readValue(json, TypeFactory.defaultInstance().constructMapType(LinkedHashMap.class, String.class, Object.class));
  86 +
  87 + String msgID = requestMap.get("msgID").toString();
  88 + Integer msgType = Integer.parseInt(requestMap.get("msgType").toString());
  89 + String reqMsgCnt = requestMap.get("ReqMsgCnt").toString();
  90 + String sign = requestMap.get("Sign").toString();
  91 +
  92 +
  93 + requestMap.remove("Timestamp");
  94 + requestMap.remove("Sign");
  95 +
  96 + if (msgType.equals(1)) {
  97 + //资产同步协商
  98 + SyncParamConsultRequestData syncParamConsultRequestData = objectMapper.readValue(reqMsgCnt, SyncParamConsultRequestData.class);
  99 + String s = objectMapper.writeValueAsString(syncParamConsultRequestData);
  100 + syncParamConsultRequestData=objectMapper.readValue(s, SyncParamConsultRequestData.class);
  101 + requestMap.put("ReqMsgCnt", syncParamConsultRequestData);
  102 + } else if (msgType.equals(2)) {
  103 + //资产ID查询
  104 + }
  105 +// String signJson = objectMapper.writeValueAsString(requestMap);
  106 +// String validSign = authUtils.generateSHA1Sign(signJson);
  107 +// if (!validSign.equals(sign)) {
  108 +// log.info("本次请求数据的签名值服务端为{}", validSign);
  109 +// baseResponse.setStatusText("sign签名不一致");
  110 +// baseResponse.setStatusCode(2);
  111 +// AgileReturn.add(Constant.ResponseAbout.RESULT, baseResponse);
  112 +// return RETURN.SUCCESS;
  113 +// }
  114 +
  115 + Object rspObj=new Object();
  116 +
  117 + if (msgType.equals(1)) {
  118 + //资产同步协商
  119 + SyncParamConsultRequestData syncParamConsultRequestData = objectMapper.readValue(reqMsgCnt, SyncParamConsultRequestData.class);
  120 + consultVulmanageSyncService.consultVulmanage(syncParamConsultRequestData);
  121 + SyncParamConsultResponseData responseData=new SyncParamConsultResponseData();
  122 + responseData.setInitDelay(syncParamConsultRequestData.getInitDelay());
  123 + responseData.setUpdCycle(syncParamConsultRequestData.getUpdCycle());
  124 + rspObj=responseData;
  125 + } else if (msgType.equals(2)) {
  126 + //资产ID查询
  127 + }
  128 +
  129 + baseResponse.setMsgID(msgID);
  130 + baseResponse.setMsgType(msgType);
  131 + baseResponse.setStatusCode(0);
  132 + baseResponse.setStatusText("success");
  133 + baseResponse.setTimestamp(DateUtil.currentSeconds() + "");
  134 + baseResponse.setRspMsgCnt(rspObj);
  135 +
  136 + LinkedHashMap<String,Object> responseSignMap=new LinkedHashMap<>();
  137 + responseSignMap.put("msgID",baseResponse.getMsgID());
  138 + responseSignMap.put("msgType",baseResponse.getMsgType());
  139 + responseSignMap.put("statusCode",baseResponse.getStatusCode());
  140 + responseSignMap.put("statusText",baseResponse.getStatusText());
  141 + responseSignMap.put("RspMsgCnt",rspObj);
  142 +
  143 +// String returnSign = authUtils.generateSHA1Sign(objectMapper.writeValueAsString(responseSignMap));
  144 +// String returnSign = "";
  145 +// log.info("本次请求返回数据的签名值为{}", returnSign);
  146 +// baseResponse.setSign(returnSign);
  147 +
  148 + AgileReturn.add(Constant.ResponseAbout.RESULT, baseResponse);
  149 + return RETURN.SUCCESS;
  150 + } catch (Exception e) {
  151 + log.error("参数解析失败,", e);
  152 + }
  153 + baseResponse.setStatusText("参数解析失败");
  154 + baseResponse.setStatusCode(2);
  155 + AgileReturn.add(Constant.ResponseAbout.RESULT, baseResponse);
  156 + return RETURN.SUCCESS;
  157 + }
  158 +
  159 +
  160 +}
  1 +package com.idss.vulsync.mvc.mapper;
  2 +
  3 +import com.idss.vulsync.mvc.pojo.db.ConsultVulmanageSyncEntity;
  4 +import com.idss.vulsync.mvc.pojo.db.ConsultVulmanageSyncEntityExample;
  5 +import org.apache.ibatis.annotations.Param;
  6 +
  7 +import java.util.List;
  8 +
  9 +public interface ConsultVulmanageSyncEntityMapper {
  10 + int countByExample(ConsultVulmanageSyncEntityExample example);
  11 +
  12 + int deleteByExample(ConsultVulmanageSyncEntityExample example);
  13 +
  14 + int deleteByPrimaryKey(String id);
  15 +
  16 + int insert(ConsultVulmanageSyncEntity record);
  17 +
  18 + int insertSelective(ConsultVulmanageSyncEntity record);
  19 +
  20 + List<ConsultVulmanageSyncEntity> selectByExample(ConsultVulmanageSyncEntityExample example);
  21 +
  22 + ConsultVulmanageSyncEntity selectByPrimaryKey(String id);
  23 +
  24 + int updateByExampleSelective(@Param("record") ConsultVulmanageSyncEntity record, @Param("example") ConsultVulmanageSyncEntityExample example);
  25 +
  26 + int updateByExample(@Param("record") ConsultVulmanageSyncEntity record, @Param("example") ConsultVulmanageSyncEntityExample example);
  27 +
  28 + int updateByPrimaryKeySelective(ConsultVulmanageSyncEntity record);
  29 +
  30 + int updateByPrimaryKey(ConsultVulmanageSyncEntity record);
  31 +}
  1 +/**
  2 + * @Author: zc
  3 + * @Date: 2024/8/16 14:42
  4 + */
  5 +package com.idss.vulsync.mvc;
  1 +package com.idss.vulsync.mvc.pojo.db;
  2 +
  3 +import java.util.Date;
  4 +
  5 +public class ConsultVulmanageSyncEntity {
  6 + private String id;
  7 +
  8 + private String transId;
  9 +
  10 + private String filePath;
  11 +
  12 + private String user;
  13 +
  14 + private String creditType;
  15 +
  16 + private String credit;
  17 +
  18 + private String pubKey;
  19 +
  20 + private String initDelay;
  21 +
  22 + private String updCycle;
  23 +
  24 + private String initFilePath;
  25 +
  26 + private String latestFilePath;
  27 +
  28 + private String latestEsId;
  29 +
  30 + private Date latestUploadTime;
  31 +
  32 + private Date createTime;
  33 +
  34 + public String getId() {
  35 + return id;
  36 + }
  37 +
  38 + public void setId(String id) {
  39 + this.id = id == null ? null : id.trim();
  40 + }
  41 +
  42 + public String getTransId() {
  43 + return transId;
  44 + }
  45 +
  46 + public void setTransId(String transId) {
  47 + this.transId = transId == null ? null : transId.trim();
  48 + }
  49 +
  50 + public String getFilePath() {
  51 + return filePath;
  52 + }
  53 +
  54 + public void setFilePath(String filePath) {
  55 + this.filePath = filePath == null ? null : filePath.trim();
  56 + }
  57 +
  58 + public String getUser() {
  59 + return user;
  60 + }
  61 +
  62 + public void setUser(String user) {
  63 + this.user = user == null ? null : user.trim();
  64 + }
  65 +
  66 + public String getCreditType() {
  67 + return creditType;
  68 + }
  69 +
  70 + public void setCreditType(String creditType) {
  71 + this.creditType = creditType == null ? null : creditType.trim();
  72 + }
  73 +
  74 + public String getCredit() {
  75 + return credit;
  76 + }
  77 +
  78 + public void setCredit(String credit) {
  79 + this.credit = credit == null ? null : credit.trim();
  80 + }
  81 +
  82 + public String getPubKey() {
  83 + return pubKey;
  84 + }
  85 +
  86 + public void setPubKey(String pubKey) {
  87 + this.pubKey = pubKey == null ? null : pubKey.trim();
  88 + }
  89 +
  90 + public String getInitDelay() {
  91 + return initDelay;
  92 + }
  93 +
  94 + public void setInitDelay(String initDelay) {
  95 + this.initDelay = initDelay == null ? null : initDelay.trim();
  96 + }
  97 +
  98 + public String getUpdCycle() {
  99 + return updCycle;
  100 + }
  101 +
  102 + public void setUpdCycle(String updCycle) {
  103 + this.updCycle = updCycle == null ? null : updCycle.trim();
  104 + }
  105 +
  106 + public String getInitFilePath() {
  107 + return initFilePath;
  108 + }
  109 +
  110 + public void setInitFilePath(String initFilePath) {
  111 + this.initFilePath = initFilePath == null ? null : initFilePath.trim();
  112 + }
  113 +
  114 + public String getLatestFilePath() {
  115 + return latestFilePath;
  116 + }
  117 +
  118 + public void setLatestFilePath(String latestFilePath) {
  119 + this.latestFilePath = latestFilePath == null ? null : latestFilePath.trim();
  120 + }
  121 +
  122 + public String getLatestEsId() {
  123 + return latestEsId;
  124 + }
  125 +
  126 + public void setLatestEsId(String latestEsId) {
  127 + this.latestEsId = latestEsId == null ? null : latestEsId.trim();
  128 + }
  129 +
  130 + public Date getLatestUploadTime() {
  131 + return latestUploadTime;
  132 + }
  133 +
  134 + public void setLatestUploadTime(Date latestUploadTime) {
  135 + this.latestUploadTime = latestUploadTime;
  136 + }
  137 +
  138 + public Date getCreateTime() {
  139 + return createTime;
  140 + }
  141 +
  142 + public void setCreateTime(Date createTime) {
  143 + this.createTime = createTime;
  144 + }
  145 +}
  1 +package com.idss.vulsync.mvc.pojo.db;
  2 +
  3 +import java.util.ArrayList;
  4 +import java.util.Date;
  5 +import java.util.List;
  6 +
  7 +public class ConsultVulmanageSyncEntityExample {
  8 + protected String orderByClause;
  9 +
  10 + protected boolean distinct;
  11 +
  12 + protected List<Criteria> oredCriteria;
  13 +
  14 + public ConsultVulmanageSyncEntityExample() {
  15 + oredCriteria = new ArrayList<Criteria>();
  16 + }
  17 +
  18 + public void setOrderByClause(String orderByClause) {
  19 + this.orderByClause = orderByClause;
  20 + }
  21 +
  22 + public String getOrderByClause() {
  23 + return orderByClause;
  24 + }
  25 +
  26 + public void setDistinct(boolean distinct) {
  27 + this.distinct = distinct;
  28 + }
  29 +
  30 + public boolean isDistinct() {
  31 + return distinct;
  32 + }
  33 +
  34 + public List<Criteria> getOredCriteria() {
  35 + return oredCriteria;
  36 + }
  37 +
  38 + public void or(Criteria criteria) {
  39 + oredCriteria.add(criteria);
  40 + }
  41 +
  42 + public Criteria or() {
  43 + Criteria criteria = createCriteriaInternal();
  44 + oredCriteria.add(criteria);
  45 + return criteria;
  46 + }
  47 +
  48 + public Criteria createCriteria() {
  49 + Criteria criteria = createCriteriaInternal();
  50 + if (oredCriteria.size() == 0) {
  51 + oredCriteria.add(criteria);
  52 + }
  53 + return criteria;
  54 + }
  55 +
  56 + protected Criteria createCriteriaInternal() {
  57 + Criteria criteria = new Criteria();
  58 + return criteria;
  59 + }
  60 +
  61 + public void clear() {
  62 + oredCriteria.clear();
  63 + orderByClause = null;
  64 + distinct = false;
  65 + }
  66 +
  67 + protected abstract static class GeneratedCriteria {
  68 + protected List<Criterion> criteria;
  69 +
  70 + protected GeneratedCriteria() {
  71 + super();
  72 + criteria = new ArrayList<Criterion>();
  73 + }
  74 +
  75 + public boolean isValid() {
  76 + return criteria.size() > 0;
  77 + }
  78 +
  79 + public List<Criterion> getAllCriteria() {
  80 + return criteria;
  81 + }
  82 +
  83 + public List<Criterion> getCriteria() {
  84 + return criteria;
  85 + }
  86 +
  87 + protected void addCriterion(String condition) {
  88 + if (condition == null) {
  89 + throw new RuntimeException("Value for condition cannot be null");
  90 + }
  91 + criteria.add(new Criterion(condition));
  92 + }
  93 +
  94 + protected void addCriterion(String condition, Object value, String property) {
  95 + if (value == null) {
  96 + throw new RuntimeException("Value for " + property + " cannot be null");
  97 + }
  98 + criteria.add(new Criterion(condition, value));
  99 + }
  100 +
  101 + protected void addCriterion(String condition, Object value1, Object value2, String property) {
  102 + if (value1 == null || value2 == null) {
  103 + throw new RuntimeException("Between values for " + property + " cannot be null");
  104 + }
  105 + criteria.add(new Criterion(condition, value1, value2));
  106 + }
  107 +
  108 + public Criteria andIdIsNull() {
  109 + addCriterion("id is null");
  110 + return (Criteria) this;
  111 + }
  112 +
  113 + public Criteria andIdIsNotNull() {
  114 + addCriterion("id is not null");
  115 + return (Criteria) this;
  116 + }
  117 +
  118 + public Criteria andIdEqualTo(String value) {
  119 + addCriterion("id =", value, "id");
  120 + return (Criteria) this;
  121 + }
  122 +
  123 + public Criteria andIdNotEqualTo(String value) {
  124 + addCriterion("id <>", value, "id");
  125 + return (Criteria) this;
  126 + }
  127 +
  128 + public Criteria andIdGreaterThan(String value) {
  129 + addCriterion("id >", value, "id");
  130 + return (Criteria) this;
  131 + }
  132 +
  133 + public Criteria andIdGreaterThanOrEqualTo(String value) {
  134 + addCriterion("id >=", value, "id");
  135 + return (Criteria) this;
  136 + }
  137 +
  138 + public Criteria andIdLessThan(String value) {
  139 + addCriterion("id <", value, "id");
  140 + return (Criteria) this;
  141 + }
  142 +
  143 + public Criteria andIdLessThanOrEqualTo(String value) {
  144 + addCriterion("id <=", value, "id");
  145 + return (Criteria) this;
  146 + }
  147 +
  148 + public Criteria andIdLike(String value) {
  149 + addCriterion("id like", value, "id");
  150 + return (Criteria) this;
  151 + }
  152 +
  153 + public Criteria andIdNotLike(String value) {
  154 + addCriterion("id not like", value, "id");
  155 + return (Criteria) this;
  156 + }
  157 +
  158 + public Criteria andIdIn(List<String> values) {
  159 + addCriterion("id in", values, "id");
  160 + return (Criteria) this;
  161 + }
  162 +
  163 + public Criteria andIdNotIn(List<String> values) {
  164 + addCriterion("id not in", values, "id");
  165 + return (Criteria) this;
  166 + }
  167 +
  168 + public Criteria andIdBetween(String value1, String value2) {
  169 + addCriterion("id between", value1, value2, "id");
  170 + return (Criteria) this;
  171 + }
  172 +
  173 + public Criteria andIdNotBetween(String value1, String value2) {
  174 + addCriterion("id not between", value1, value2, "id");
  175 + return (Criteria) this;
  176 + }
  177 +
  178 + public Criteria andTransIdIsNull() {
  179 + addCriterion("trans_id is null");
  180 + return (Criteria) this;
  181 + }
  182 +
  183 + public Criteria andTransIdIsNotNull() {
  184 + addCriterion("trans_id is not null");
  185 + return (Criteria) this;
  186 + }
  187 +
  188 + public Criteria andTransIdEqualTo(String value) {
  189 + addCriterion("trans_id =", value, "transId");
  190 + return (Criteria) this;
  191 + }
  192 +
  193 + public Criteria andTransIdNotEqualTo(String value) {
  194 + addCriterion("trans_id <>", value, "transId");
  195 + return (Criteria) this;
  196 + }
  197 +
  198 + public Criteria andTransIdGreaterThan(String value) {
  199 + addCriterion("trans_id >", value, "transId");
  200 + return (Criteria) this;
  201 + }
  202 +
  203 + public Criteria andTransIdGreaterThanOrEqualTo(String value) {
  204 + addCriterion("trans_id >=", value, "transId");
  205 + return (Criteria) this;
  206 + }
  207 +
  208 + public Criteria andTransIdLessThan(String value) {
  209 + addCriterion("trans_id <", value, "transId");
  210 + return (Criteria) this;
  211 + }
  212 +
  213 + public Criteria andTransIdLessThanOrEqualTo(String value) {
  214 + addCriterion("trans_id <=", value, "transId");
  215 + return (Criteria) this;
  216 + }
  217 +
  218 + public Criteria andTransIdLike(String value) {
  219 + addCriterion("trans_id like", value, "transId");
  220 + return (Criteria) this;
  221 + }
  222 +
  223 + public Criteria andTransIdNotLike(String value) {
  224 + addCriterion("trans_id not like", value, "transId");
  225 + return (Criteria) this;
  226 + }
  227 +
  228 + public Criteria andTransIdIn(List<String> values) {
  229 + addCriterion("trans_id in", values, "transId");
  230 + return (Criteria) this;
  231 + }
  232 +
  233 + public Criteria andTransIdNotIn(List<String> values) {
  234 + addCriterion("trans_id not in", values, "transId");
  235 + return (Criteria) this;
  236 + }
  237 +
  238 + public Criteria andTransIdBetween(String value1, String value2) {
  239 + addCriterion("trans_id between", value1, value2, "transId");
  240 + return (Criteria) this;
  241 + }
  242 +
  243 + public Criteria andTransIdNotBetween(String value1, String value2) {
  244 + addCriterion("trans_id not between", value1, value2, "transId");
  245 + return (Criteria) this;
  246 + }
  247 +
  248 + public Criteria andFilePathIsNull() {
  249 + addCriterion("file_path is null");
  250 + return (Criteria) this;
  251 + }
  252 +
  253 + public Criteria andFilePathIsNotNull() {
  254 + addCriterion("file_path is not null");
  255 + return (Criteria) this;
  256 + }
  257 +
  258 + public Criteria andFilePathEqualTo(String value) {
  259 + addCriterion("file_path =", value, "filePath");
  260 + return (Criteria) this;
  261 + }
  262 +
  263 + public Criteria andFilePathNotEqualTo(String value) {
  264 + addCriterion("file_path <>", value, "filePath");
  265 + return (Criteria) this;
  266 + }
  267 +
  268 + public Criteria andFilePathGreaterThan(String value) {
  269 + addCriterion("file_path >", value, "filePath");
  270 + return (Criteria) this;
  271 + }
  272 +
  273 + public Criteria andFilePathGreaterThanOrEqualTo(String value) {
  274 + addCriterion("file_path >=", value, "filePath");
  275 + return (Criteria) this;
  276 + }
  277 +
  278 + public Criteria andFilePathLessThan(String value) {
  279 + addCriterion("file_path <", value, "filePath");
  280 + return (Criteria) this;
  281 + }
  282 +
  283 + public Criteria andFilePathLessThanOrEqualTo(String value) {
  284 + addCriterion("file_path <=", value, "filePath");
  285 + return (Criteria) this;
  286 + }
  287 +
  288 + public Criteria andFilePathLike(String value) {
  289 + addCriterion("file_path like", value, "filePath");
  290 + return (Criteria) this;
  291 + }
  292 +
  293 + public Criteria andFilePathNotLike(String value) {
  294 + addCriterion("file_path not like", value, "filePath");
  295 + return (Criteria) this;
  296 + }
  297 +
  298 + public Criteria andFilePathIn(List<String> values) {
  299 + addCriterion("file_path in", values, "filePath");
  300 + return (Criteria) this;
  301 + }
  302 +
  303 + public Criteria andFilePathNotIn(List<String> values) {
  304 + addCriterion("file_path not in", values, "filePath");
  305 + return (Criteria) this;
  306 + }
  307 +
  308 + public Criteria andFilePathBetween(String value1, String value2) {
  309 + addCriterion("file_path between", value1, value2, "filePath");
  310 + return (Criteria) this;
  311 + }
  312 +
  313 + public Criteria andFilePathNotBetween(String value1, String value2) {
  314 + addCriterion("file_path not between", value1, value2, "filePath");
  315 + return (Criteria) this;
  316 + }
  317 +
  318 + public Criteria andUserIsNull() {
  319 + addCriterion("user is null");
  320 + return (Criteria) this;
  321 + }
  322 +
  323 + public Criteria andUserIsNotNull() {
  324 + addCriterion("user is not null");
  325 + return (Criteria) this;
  326 + }
  327 +
  328 + public Criteria andUserEqualTo(String value) {
  329 + addCriterion("user =", value, "user");
  330 + return (Criteria) this;
  331 + }
  332 +
  333 + public Criteria andUserNotEqualTo(String value) {
  334 + addCriterion("user <>", value, "user");
  335 + return (Criteria) this;
  336 + }
  337 +
  338 + public Criteria andUserGreaterThan(String value) {
  339 + addCriterion("user >", value, "user");
  340 + return (Criteria) this;
  341 + }
  342 +
  343 + public Criteria andUserGreaterThanOrEqualTo(String value) {
  344 + addCriterion("user >=", value, "user");
  345 + return (Criteria) this;
  346 + }
  347 +
  348 + public Criteria andUserLessThan(String value) {
  349 + addCriterion("user <", value, "user");
  350 + return (Criteria) this;
  351 + }
  352 +
  353 + public Criteria andUserLessThanOrEqualTo(String value) {
  354 + addCriterion("user <=", value, "user");
  355 + return (Criteria) this;
  356 + }
  357 +
  358 + public Criteria andUserLike(String value) {
  359 + addCriterion("user like", value, "user");
  360 + return (Criteria) this;
  361 + }
  362 +
  363 + public Criteria andUserNotLike(String value) {
  364 + addCriterion("user not like", value, "user");
  365 + return (Criteria) this;
  366 + }
  367 +
  368 + public Criteria andUserIn(List<String> values) {
  369 + addCriterion("user in", values, "user");
  370 + return (Criteria) this;
  371 + }
  372 +
  373 + public Criteria andUserNotIn(List<String> values) {
  374 + addCriterion("user not in", values, "user");
  375 + return (Criteria) this;
  376 + }
  377 +
  378 + public Criteria andUserBetween(String value1, String value2) {
  379 + addCriterion("user between", value1, value2, "user");
  380 + return (Criteria) this;
  381 + }
  382 +
  383 + public Criteria andUserNotBetween(String value1, String value2) {
  384 + addCriterion("user not between", value1, value2, "user");
  385 + return (Criteria) this;
  386 + }
  387 +
  388 + public Criteria andCreditTypeIsNull() {
  389 + addCriterion("credit_type is null");
  390 + return (Criteria) this;
  391 + }
  392 +
  393 + public Criteria andCreditTypeIsNotNull() {
  394 + addCriterion("credit_type is not null");
  395 + return (Criteria) this;
  396 + }
  397 +
  398 + public Criteria andCreditTypeEqualTo(String value) {
  399 + addCriterion("credit_type =", value, "creditType");
  400 + return (Criteria) this;
  401 + }
  402 +
  403 + public Criteria andCreditTypeNotEqualTo(String value) {
  404 + addCriterion("credit_type <>", value, "creditType");
  405 + return (Criteria) this;
  406 + }
  407 +
  408 + public Criteria andCreditTypeGreaterThan(String value) {
  409 + addCriterion("credit_type >", value, "creditType");
  410 + return (Criteria) this;
  411 + }
  412 +
  413 + public Criteria andCreditTypeGreaterThanOrEqualTo(String value) {
  414 + addCriterion("credit_type >=", value, "creditType");
  415 + return (Criteria) this;
  416 + }
  417 +
  418 + public Criteria andCreditTypeLessThan(String value) {
  419 + addCriterion("credit_type <", value, "creditType");
  420 + return (Criteria) this;
  421 + }
  422 +
  423 + public Criteria andCreditTypeLessThanOrEqualTo(String value) {
  424 + addCriterion("credit_type <=", value, "creditType");
  425 + return (Criteria) this;
  426 + }
  427 +
  428 + public Criteria andCreditTypeLike(String value) {
  429 + addCriterion("credit_type like", value, "creditType");
  430 + return (Criteria) this;
  431 + }
  432 +
  433 + public Criteria andCreditTypeNotLike(String value) {
  434 + addCriterion("credit_type not like", value, "creditType");
  435 + return (Criteria) this;
  436 + }
  437 +
  438 + public Criteria andCreditTypeIn(List<String> values) {
  439 + addCriterion("credit_type in", values, "creditType");
  440 + return (Criteria) this;
  441 + }
  442 +
  443 + public Criteria andCreditTypeNotIn(List<String> values) {
  444 + addCriterion("credit_type not in", values, "creditType");
  445 + return (Criteria) this;
  446 + }
  447 +
  448 + public Criteria andCreditTypeBetween(String value1, String value2) {
  449 + addCriterion("credit_type between", value1, value2, "creditType");
  450 + return (Criteria) this;
  451 + }
  452 +
  453 + public Criteria andCreditTypeNotBetween(String value1, String value2) {
  454 + addCriterion("credit_type not between", value1, value2, "creditType");
  455 + return (Criteria) this;
  456 + }
  457 +
  458 + public Criteria andCreditIsNull() {
  459 + addCriterion("credit is null");
  460 + return (Criteria) this;
  461 + }
  462 +
  463 + public Criteria andCreditIsNotNull() {
  464 + addCriterion("credit is not null");
  465 + return (Criteria) this;
  466 + }
  467 +
  468 + public Criteria andCreditEqualTo(String value) {
  469 + addCriterion("credit =", value, "credit");
  470 + return (Criteria) this;
  471 + }
  472 +
  473 + public Criteria andCreditNotEqualTo(String value) {
  474 + addCriterion("credit <>", value, "credit");
  475 + return (Criteria) this;
  476 + }
  477 +
  478 + public Criteria andCreditGreaterThan(String value) {
  479 + addCriterion("credit >", value, "credit");
  480 + return (Criteria) this;
  481 + }
  482 +
  483 + public Criteria andCreditGreaterThanOrEqualTo(String value) {
  484 + addCriterion("credit >=", value, "credit");
  485 + return (Criteria) this;
  486 + }
  487 +
  488 + public Criteria andCreditLessThan(String value) {
  489 + addCriterion("credit <", value, "credit");
  490 + return (Criteria) this;
  491 + }
  492 +
  493 + public Criteria andCreditLessThanOrEqualTo(String value) {
  494 + addCriterion("credit <=", value, "credit");
  495 + return (Criteria) this;
  496 + }
  497 +
  498 + public Criteria andCreditLike(String value) {
  499 + addCriterion("credit like", value, "credit");
  500 + return (Criteria) this;
  501 + }
  502 +
  503 + public Criteria andCreditNotLike(String value) {
  504 + addCriterion("credit not like", value, "credit");
  505 + return (Criteria) this;
  506 + }
  507 +
  508 + public Criteria andCreditIn(List<String> values) {
  509 + addCriterion("credit in", values, "credit");
  510 + return (Criteria) this;
  511 + }
  512 +
  513 + public Criteria andCreditNotIn(List<String> values) {
  514 + addCriterion("credit not in", values, "credit");
  515 + return (Criteria) this;
  516 + }
  517 +
  518 + public Criteria andCreditBetween(String value1, String value2) {
  519 + addCriterion("credit between", value1, value2, "credit");
  520 + return (Criteria) this;
  521 + }
  522 +
  523 + public Criteria andCreditNotBetween(String value1, String value2) {
  524 + addCriterion("credit not between", value1, value2, "credit");
  525 + return (Criteria) this;
  526 + }
  527 +
  528 + public Criteria andPubKeyIsNull() {
  529 + addCriterion("pub_key is null");
  530 + return (Criteria) this;
  531 + }
  532 +
  533 + public Criteria andPubKeyIsNotNull() {
  534 + addCriterion("pub_key is not null");
  535 + return (Criteria) this;
  536 + }
  537 +
  538 + public Criteria andPubKeyEqualTo(String value) {
  539 + addCriterion("pub_key =", value, "pubKey");
  540 + return (Criteria) this;
  541 + }
  542 +
  543 + public Criteria andPubKeyNotEqualTo(String value) {
  544 + addCriterion("pub_key <>", value, "pubKey");
  545 + return (Criteria) this;
  546 + }
  547 +
  548 + public Criteria andPubKeyGreaterThan(String value) {
  549 + addCriterion("pub_key >", value, "pubKey");
  550 + return (Criteria) this;
  551 + }
  552 +
  553 + public Criteria andPubKeyGreaterThanOrEqualTo(String value) {
  554 + addCriterion("pub_key >=", value, "pubKey");
  555 + return (Criteria) this;
  556 + }
  557 +
  558 + public Criteria andPubKeyLessThan(String value) {
  559 + addCriterion("pub_key <", value, "pubKey");
  560 + return (Criteria) this;
  561 + }
  562 +
  563 + public Criteria andPubKeyLessThanOrEqualTo(String value) {
  564 + addCriterion("pub_key <=", value, "pubKey");
  565 + return (Criteria) this;
  566 + }
  567 +
  568 + public Criteria andPubKeyLike(String value) {
  569 + addCriterion("pub_key like", value, "pubKey");
  570 + return (Criteria) this;
  571 + }
  572 +
  573 + public Criteria andPubKeyNotLike(String value) {
  574 + addCriterion("pub_key not like", value, "pubKey");
  575 + return (Criteria) this;
  576 + }
  577 +
  578 + public Criteria andPubKeyIn(List<String> values) {
  579 + addCriterion("pub_key in", values, "pubKey");
  580 + return (Criteria) this;
  581 + }
  582 +
  583 + public Criteria andPubKeyNotIn(List<String> values) {
  584 + addCriterion("pub_key not in", values, "pubKey");
  585 + return (Criteria) this;
  586 + }
  587 +
  588 + public Criteria andPubKeyBetween(String value1, String value2) {
  589 + addCriterion("pub_key between", value1, value2, "pubKey");
  590 + return (Criteria) this;
  591 + }
  592 +
  593 + public Criteria andPubKeyNotBetween(String value1, String value2) {
  594 + addCriterion("pub_key not between", value1, value2, "pubKey");
  595 + return (Criteria) this;
  596 + }
  597 +
  598 + public Criteria andInitDelayIsNull() {
  599 + addCriterion("init_delay is null");
  600 + return (Criteria) this;
  601 + }
  602 +
  603 + public Criteria andInitDelayIsNotNull() {
  604 + addCriterion("init_delay is not null");
  605 + return (Criteria) this;
  606 + }
  607 +
  608 + public Criteria andInitDelayEqualTo(String value) {
  609 + addCriterion("init_delay =", value, "initDelay");
  610 + return (Criteria) this;
  611 + }
  612 +
  613 + public Criteria andInitDelayNotEqualTo(String value) {
  614 + addCriterion("init_delay <>", value, "initDelay");
  615 + return (Criteria) this;
  616 + }
  617 +
  618 + public Criteria andInitDelayGreaterThan(String value) {
  619 + addCriterion("init_delay >", value, "initDelay");
  620 + return (Criteria) this;
  621 + }
  622 +
  623 + public Criteria andInitDelayGreaterThanOrEqualTo(String value) {
  624 + addCriterion("init_delay >=", value, "initDelay");
  625 + return (Criteria) this;
  626 + }
  627 +
  628 + public Criteria andInitDelayLessThan(String value) {
  629 + addCriterion("init_delay <", value, "initDelay");
  630 + return (Criteria) this;
  631 + }
  632 +
  633 + public Criteria andInitDelayLessThanOrEqualTo(String value) {
  634 + addCriterion("init_delay <=", value, "initDelay");
  635 + return (Criteria) this;
  636 + }
  637 +
  638 + public Criteria andInitDelayLike(String value) {
  639 + addCriterion("init_delay like", value, "initDelay");
  640 + return (Criteria) this;
  641 + }
  642 +
  643 + public Criteria andInitDelayNotLike(String value) {
  644 + addCriterion("init_delay not like", value, "initDelay");
  645 + return (Criteria) this;
  646 + }
  647 +
  648 + public Criteria andInitDelayIn(List<String> values) {
  649 + addCriterion("init_delay in", values, "initDelay");
  650 + return (Criteria) this;
  651 + }
  652 +
  653 + public Criteria andInitDelayNotIn(List<String> values) {
  654 + addCriterion("init_delay not in", values, "initDelay");
  655 + return (Criteria) this;
  656 + }
  657 +
  658 + public Criteria andInitDelayBetween(String value1, String value2) {
  659 + addCriterion("init_delay between", value1, value2, "initDelay");
  660 + return (Criteria) this;
  661 + }
  662 +
  663 + public Criteria andInitDelayNotBetween(String value1, String value2) {
  664 + addCriterion("init_delay not between", value1, value2, "initDelay");
  665 + return (Criteria) this;
  666 + }
  667 +
  668 + public Criteria andUpdCycleIsNull() {
  669 + addCriterion("upd_cycle is null");
  670 + return (Criteria) this;
  671 + }
  672 +
  673 + public Criteria andUpdCycleIsNotNull() {
  674 + addCriterion("upd_cycle is not null");
  675 + return (Criteria) this;
  676 + }
  677 +
  678 + public Criteria andUpdCycleEqualTo(String value) {
  679 + addCriterion("upd_cycle =", value, "updCycle");
  680 + return (Criteria) this;
  681 + }
  682 +
  683 + public Criteria andUpdCycleNotEqualTo(String value) {
  684 + addCriterion("upd_cycle <>", value, "updCycle");
  685 + return (Criteria) this;
  686 + }
  687 +
  688 + public Criteria andUpdCycleGreaterThan(String value) {
  689 + addCriterion("upd_cycle >", value, "updCycle");
  690 + return (Criteria) this;
  691 + }
  692 +
  693 + public Criteria andUpdCycleGreaterThanOrEqualTo(String value) {
  694 + addCriterion("upd_cycle >=", value, "updCycle");
  695 + return (Criteria) this;
  696 + }
  697 +
  698 + public Criteria andUpdCycleLessThan(String value) {
  699 + addCriterion("upd_cycle <", value, "updCycle");
  700 + return (Criteria) this;
  701 + }
  702 +
  703 + public Criteria andUpdCycleLessThanOrEqualTo(String value) {
  704 + addCriterion("upd_cycle <=", value, "updCycle");
  705 + return (Criteria) this;
  706 + }
  707 +
  708 + public Criteria andUpdCycleLike(String value) {
  709 + addCriterion("upd_cycle like", value, "updCycle");
  710 + return (Criteria) this;
  711 + }
  712 +
  713 + public Criteria andUpdCycleNotLike(String value) {
  714 + addCriterion("upd_cycle not like", value, "updCycle");
  715 + return (Criteria) this;
  716 + }
  717 +
  718 + public Criteria andUpdCycleIn(List<String> values) {
  719 + addCriterion("upd_cycle in", values, "updCycle");
  720 + return (Criteria) this;
  721 + }
  722 +
  723 + public Criteria andUpdCycleNotIn(List<String> values) {
  724 + addCriterion("upd_cycle not in", values, "updCycle");
  725 + return (Criteria) this;
  726 + }
  727 +
  728 + public Criteria andUpdCycleBetween(String value1, String value2) {
  729 + addCriterion("upd_cycle between", value1, value2, "updCycle");
  730 + return (Criteria) this;
  731 + }
  732 +
  733 + public Criteria andUpdCycleNotBetween(String value1, String value2) {
  734 + addCriterion("upd_cycle not between", value1, value2, "updCycle");
  735 + return (Criteria) this;
  736 + }
  737 +
  738 + public Criteria andInitFilePathIsNull() {
  739 + addCriterion("init_file_path is null");
  740 + return (Criteria) this;
  741 + }
  742 +
  743 + public Criteria andInitFilePathIsNotNull() {
  744 + addCriterion("init_file_path is not null");
  745 + return (Criteria) this;
  746 + }
  747 +
  748 + public Criteria andInitFilePathEqualTo(String value) {
  749 + addCriterion("init_file_path =", value, "initFilePath");
  750 + return (Criteria) this;
  751 + }
  752 +
  753 + public Criteria andInitFilePathNotEqualTo(String value) {
  754 + addCriterion("init_file_path <>", value, "initFilePath");
  755 + return (Criteria) this;
  756 + }
  757 +
  758 + public Criteria andInitFilePathGreaterThan(String value) {
  759 + addCriterion("init_file_path >", value, "initFilePath");
  760 + return (Criteria) this;
  761 + }
  762 +
  763 + public Criteria andInitFilePathGreaterThanOrEqualTo(String value) {
  764 + addCriterion("init_file_path >=", value, "initFilePath");
  765 + return (Criteria) this;
  766 + }
  767 +
  768 + public Criteria andInitFilePathLessThan(String value) {
  769 + addCriterion("init_file_path <", value, "initFilePath");
  770 + return (Criteria) this;
  771 + }
  772 +
  773 + public Criteria andInitFilePathLessThanOrEqualTo(String value) {
  774 + addCriterion("init_file_path <=", value, "initFilePath");
  775 + return (Criteria) this;
  776 + }
  777 +
  778 + public Criteria andInitFilePathLike(String value) {
  779 + addCriterion("init_file_path like", value, "initFilePath");
  780 + return (Criteria) this;
  781 + }
  782 +
  783 + public Criteria andInitFilePathNotLike(String value) {
  784 + addCriterion("init_file_path not like", value, "initFilePath");
  785 + return (Criteria) this;
  786 + }
  787 +
  788 + public Criteria andInitFilePathIn(List<String> values) {
  789 + addCriterion("init_file_path in", values, "initFilePath");
  790 + return (Criteria) this;
  791 + }
  792 +
  793 + public Criteria andInitFilePathNotIn(List<String> values) {
  794 + addCriterion("init_file_path not in", values, "initFilePath");
  795 + return (Criteria) this;
  796 + }
  797 +
  798 + public Criteria andInitFilePathBetween(String value1, String value2) {
  799 + addCriterion("init_file_path between", value1, value2, "initFilePath");
  800 + return (Criteria) this;
  801 + }
  802 +
  803 + public Criteria andInitFilePathNotBetween(String value1, String value2) {
  804 + addCriterion("init_file_path not between", value1, value2, "initFilePath");
  805 + return (Criteria) this;
  806 + }
  807 +
  808 + public Criteria andLatestFilePathIsNull() {
  809 + addCriterion("latest_file_path is null");
  810 + return (Criteria) this;
  811 + }
  812 +
  813 + public Criteria andLatestFilePathIsNotNull() {
  814 + addCriterion("latest_file_path is not null");
  815 + return (Criteria) this;
  816 + }
  817 +
  818 + public Criteria andLatestFilePathEqualTo(String value) {
  819 + addCriterion("latest_file_path =", value, "latestFilePath");
  820 + return (Criteria) this;
  821 + }
  822 +
  823 + public Criteria andLatestFilePathNotEqualTo(String value) {
  824 + addCriterion("latest_file_path <>", value, "latestFilePath");
  825 + return (Criteria) this;
  826 + }
  827 +
  828 + public Criteria andLatestFilePathGreaterThan(String value) {
  829 + addCriterion("latest_file_path >", value, "latestFilePath");
  830 + return (Criteria) this;
  831 + }
  832 +
  833 + public Criteria andLatestFilePathGreaterThanOrEqualTo(String value) {
  834 + addCriterion("latest_file_path >=", value, "latestFilePath");
  835 + return (Criteria) this;
  836 + }
  837 +
  838 + public Criteria andLatestFilePathLessThan(String value) {
  839 + addCriterion("latest_file_path <", value, "latestFilePath");
  840 + return (Criteria) this;
  841 + }
  842 +
  843 + public Criteria andLatestFilePathLessThanOrEqualTo(String value) {
  844 + addCriterion("latest_file_path <=", value, "latestFilePath");
  845 + return (Criteria) this;
  846 + }
  847 +
  848 + public Criteria andLatestFilePathLike(String value) {
  849 + addCriterion("latest_file_path like", value, "latestFilePath");
  850 + return (Criteria) this;
  851 + }
  852 +
  853 + public Criteria andLatestFilePathNotLike(String value) {
  854 + addCriterion("latest_file_path not like", value, "latestFilePath");
  855 + return (Criteria) this;
  856 + }
  857 +
  858 + public Criteria andLatestFilePathIn(List<String> values) {
  859 + addCriterion("latest_file_path in", values, "latestFilePath");
  860 + return (Criteria) this;
  861 + }
  862 +
  863 + public Criteria andLatestFilePathNotIn(List<String> values) {
  864 + addCriterion("latest_file_path not in", values, "latestFilePath");
  865 + return (Criteria) this;
  866 + }
  867 +
  868 + public Criteria andLatestFilePathBetween(String value1, String value2) {
  869 + addCriterion("latest_file_path between", value1, value2, "latestFilePath");
  870 + return (Criteria) this;
  871 + }
  872 +
  873 + public Criteria andLatestFilePathNotBetween(String value1, String value2) {
  874 + addCriterion("latest_file_path not between", value1, value2, "latestFilePath");
  875 + return (Criteria) this;
  876 + }
  877 +
  878 + public Criteria andLatestEsIdIsNull() {
  879 + addCriterion("latest_es_id is null");
  880 + return (Criteria) this;
  881 + }
  882 +
  883 + public Criteria andLatestEsIdIsNotNull() {
  884 + addCriterion("latest_es_id is not null");
  885 + return (Criteria) this;
  886 + }
  887 +
  888 + public Criteria andLatestEsIdEqualTo(String value) {
  889 + addCriterion("latest_es_id =", value, "latestEsId");
  890 + return (Criteria) this;
  891 + }
  892 +
  893 + public Criteria andLatestEsIdNotEqualTo(String value) {
  894 + addCriterion("latest_es_id <>", value, "latestEsId");
  895 + return (Criteria) this;
  896 + }
  897 +
  898 + public Criteria andLatestEsIdGreaterThan(String value) {
  899 + addCriterion("latest_es_id >", value, "latestEsId");
  900 + return (Criteria) this;
  901 + }
  902 +
  903 + public Criteria andLatestEsIdGreaterThanOrEqualTo(String value) {
  904 + addCriterion("latest_es_id >=", value, "latestEsId");
  905 + return (Criteria) this;
  906 + }
  907 +
  908 + public Criteria andLatestEsIdLessThan(String value) {
  909 + addCriterion("latest_es_id <", value, "latestEsId");
  910 + return (Criteria) this;
  911 + }
  912 +
  913 + public Criteria andLatestEsIdLessThanOrEqualTo(String value) {
  914 + addCriterion("latest_es_id <=", value, "latestEsId");
  915 + return (Criteria) this;
  916 + }
  917 +
  918 + public Criteria andLatestEsIdLike(String value) {
  919 + addCriterion("latest_es_id like", value, "latestEsId");
  920 + return (Criteria) this;
  921 + }
  922 +
  923 + public Criteria andLatestEsIdNotLike(String value) {
  924 + addCriterion("latest_es_id not like", value, "latestEsId");
  925 + return (Criteria) this;
  926 + }
  927 +
  928 + public Criteria andLatestEsIdIn(List<String> values) {
  929 + addCriterion("latest_es_id in", values, "latestEsId");
  930 + return (Criteria) this;
  931 + }
  932 +
  933 + public Criteria andLatestEsIdNotIn(List<String> values) {
  934 + addCriterion("latest_es_id not in", values, "latestEsId");
  935 + return (Criteria) this;
  936 + }
  937 +
  938 + public Criteria andLatestEsIdBetween(String value1, String value2) {
  939 + addCriterion("latest_es_id between", value1, value2, "latestEsId");
  940 + return (Criteria) this;
  941 + }
  942 +
  943 + public Criteria andLatestEsIdNotBetween(String value1, String value2) {
  944 + addCriterion("latest_es_id not between", value1, value2, "latestEsId");
  945 + return (Criteria) this;
  946 + }
  947 +
  948 + public Criteria andLatestUploadTimeIsNull() {
  949 + addCriterion("latest_upload_time is null");
  950 + return (Criteria) this;
  951 + }
  952 +
  953 + public Criteria andLatestUploadTimeIsNotNull() {
  954 + addCriterion("latest_upload_time is not null");
  955 + return (Criteria) this;
  956 + }
  957 +
  958 + public Criteria andLatestUploadTimeEqualTo(Date value) {
  959 + addCriterion("latest_upload_time =", value, "latestUploadTime");
  960 + return (Criteria) this;
  961 + }
  962 +
  963 + public Criteria andLatestUploadTimeNotEqualTo(Date value) {
  964 + addCriterion("latest_upload_time <>", value, "latestUploadTime");
  965 + return (Criteria) this;
  966 + }
  967 +
  968 + public Criteria andLatestUploadTimeGreaterThan(Date value) {
  969 + addCriterion("latest_upload_time >", value, "latestUploadTime");
  970 + return (Criteria) this;
  971 + }
  972 +
  973 + public Criteria andLatestUploadTimeGreaterThanOrEqualTo(Date value) {
  974 + addCriterion("latest_upload_time >=", value, "latestUploadTime");
  975 + return (Criteria) this;
  976 + }
  977 +
  978 + public Criteria andLatestUploadTimeLessThan(Date value) {
  979 + addCriterion("latest_upload_time <", value, "latestUploadTime");
  980 + return (Criteria) this;
  981 + }
  982 +
  983 + public Criteria andLatestUploadTimeLessThanOrEqualTo(Date value) {
  984 + addCriterion("latest_upload_time <=", value, "latestUploadTime");
  985 + return (Criteria) this;
  986 + }
  987 +
  988 + public Criteria andLatestUploadTimeIn(List<Date> values) {
  989 + addCriterion("latest_upload_time in", values, "latestUploadTime");
  990 + return (Criteria) this;
  991 + }
  992 +
  993 + public Criteria andLatestUploadTimeNotIn(List<Date> values) {
  994 + addCriterion("latest_upload_time not in", values, "latestUploadTime");
  995 + return (Criteria) this;
  996 + }
  997 +
  998 + public Criteria andLatestUploadTimeBetween(Date value1, Date value2) {
  999 + addCriterion("latest_upload_time between", value1, value2, "latestUploadTime");
  1000 + return (Criteria) this;
  1001 + }
  1002 +
  1003 + public Criteria andLatestUploadTimeNotBetween(Date value1, Date value2) {
  1004 + addCriterion("latest_upload_time not between", value1, value2, "latestUploadTime");
  1005 + return (Criteria) this;
  1006 + }
  1007 +
  1008 + public Criteria andCreateTimeIsNull() {
  1009 + addCriterion("create_time is null");
  1010 + return (Criteria) this;
  1011 + }
  1012 +
  1013 + public Criteria andCreateTimeIsNotNull() {
  1014 + addCriterion("create_time is not null");
  1015 + return (Criteria) this;
  1016 + }
  1017 +
  1018 + public Criteria andCreateTimeEqualTo(Date value) {
  1019 + addCriterion("create_time =", value, "createTime");
  1020 + return (Criteria) this;
  1021 + }
  1022 +
  1023 + public Criteria andCreateTimeNotEqualTo(Date value) {
  1024 + addCriterion("create_time <>", value, "createTime");
  1025 + return (Criteria) this;
  1026 + }
  1027 +
  1028 + public Criteria andCreateTimeGreaterThan(Date value) {
  1029 + addCriterion("create_time >", value, "createTime");
  1030 + return (Criteria) this;
  1031 + }
  1032 +
  1033 + public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
  1034 + addCriterion("create_time >=", value, "createTime");
  1035 + return (Criteria) this;
  1036 + }
  1037 +
  1038 + public Criteria andCreateTimeLessThan(Date value) {
  1039 + addCriterion("create_time <", value, "createTime");
  1040 + return (Criteria) this;
  1041 + }
  1042 +
  1043 + public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
  1044 + addCriterion("create_time <=", value, "createTime");
  1045 + return (Criteria) this;
  1046 + }
  1047 +
  1048 + public Criteria andCreateTimeIn(List<Date> values) {
  1049 + addCriterion("create_time in", values, "createTime");
  1050 + return (Criteria) this;
  1051 + }
  1052 +
  1053 + public Criteria andCreateTimeNotIn(List<Date> values) {
  1054 + addCriterion("create_time not in", values, "createTime");
  1055 + return (Criteria) this;
  1056 + }
  1057 +
  1058 + public Criteria andCreateTimeBetween(Date value1, Date value2) {
  1059 + addCriterion("create_time between", value1, value2, "createTime");
  1060 + return (Criteria) this;
  1061 + }
  1062 +
  1063 + public Criteria andCreateTimeNotBetween(Date value1, Date value2) {
  1064 + addCriterion("create_time not between", value1, value2, "createTime");
  1065 + return (Criteria) this;
  1066 + }
  1067 + }
  1068 +
  1069 + public static class Criteria extends GeneratedCriteria {
  1070 +
  1071 + protected Criteria() {
  1072 + super();
  1073 + }
  1074 + }
  1075 +
  1076 + public static class Criterion {
  1077 + private String condition;
  1078 +
  1079 + private Object value;
  1080 +
  1081 + private Object secondValue;
  1082 +
  1083 + private boolean noValue;
  1084 +
  1085 + private boolean singleValue;
  1086 +
  1087 + private boolean betweenValue;
  1088 +
  1089 + private boolean listValue;
  1090 +
  1091 + private String typeHandler;
  1092 +
  1093 + public String getCondition() {
  1094 + return condition;
  1095 + }
  1096 +
  1097 + public Object getValue() {
  1098 + return value;
  1099 + }
  1100 +
  1101 + public Object getSecondValue() {
  1102 + return secondValue;
  1103 + }
  1104 +
  1105 + public boolean isNoValue() {
  1106 + return noValue;
  1107 + }
  1108 +
  1109 + public boolean isSingleValue() {
  1110 + return singleValue;
  1111 + }
  1112 +
  1113 + public boolean isBetweenValue() {
  1114 + return betweenValue;
  1115 + }
  1116 +
  1117 + public boolean isListValue() {
  1118 + return listValue;
  1119 + }
  1120 +
  1121 + public String getTypeHandler() {
  1122 + return typeHandler;
  1123 + }
  1124 +
  1125 + protected Criterion(String condition) {
  1126 + super();
  1127 + this.condition = condition;
  1128 + this.typeHandler = null;
  1129 + this.noValue = true;
  1130 + }
  1131 +
  1132 + protected Criterion(String condition, Object value, String typeHandler) {
  1133 + super();
  1134 + this.condition = condition;
  1135 + this.value = value;
  1136 + this.typeHandler = typeHandler;
  1137 + if (value instanceof List<?>) {
  1138 + this.listValue = true;
  1139 + } else {
  1140 + this.singleValue = true;
  1141 + }
  1142 + }
  1143 +
  1144 + protected Criterion(String condition, Object value) {
  1145 + this(condition, value, null);
  1146 + }
  1147 +
  1148 + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
  1149 + super();
  1150 + this.condition = condition;
  1151 + this.value = value;
  1152 + this.secondValue = secondValue;
  1153 + this.typeHandler = typeHandler;
  1154 + this.betweenValue = true;
  1155 + }
  1156 +
  1157 + protected Criterion(String condition, Object value, Object secondValue) {
  1158 + this(condition, value, secondValue, null);
  1159 + }
  1160 + }
  1161 +}
  1 +package com.idss.vulsync.mvc.pojo.vo;
  2 +
  3 +import lombok.Data;
  4 +
  5 +@Data
  6 +public class SftpConfigVo {
  7 + private String ip;
  8 + private Integer port;
  9 + private String sftpUserName;
  10 + private String sftpPassword;
  11 + private String directory;
  12 +}
  1 +package com.idss.vulsync.mvc.pojo.vo;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import java.io.InputStream;
  6 +import java.util.Map;
  7 +
  8 +@Data
  9 +public class SftpStatusDto {
  10 + private boolean status;
  11 + private String errorMessage;
  12 + private Map<String, InputStream> files;
  13 +}
  1 +/**
  2 + * @Author: zc
  3 + * @Date: 2024/8/16 14:43
  4 + */
  5 +package com.idss.vulsync.mvc.pojo.vo;
  1 +package com.idss.vulsync.mvc.service;
  2 +
  3 +import cloud.agileframework.common.util.file.FileUtil;
  4 +import cn.hutool.core.collection.ListUtil;
  5 +import cn.hutool.core.date.DatePattern;
  6 +import cn.hutool.core.date.DateUtil;
  7 +import cn.hutool.core.util.ObjectUtil;
  8 +import com.alibaba.fastjson.JSON;
  9 +import com.alibaba.fastjson.serializer.PropertyFilter;
  10 +import com.fasterxml.jackson.databind.ObjectMapper;
  11 +import com.idss.vulsync.config.VulSftpConfiguration;
  12 +import com.idss.vulsync.entity.AssetReportVO;
  13 +import com.idss.vulsync.mvc.mapper.ConsultVulmanageSyncEntityMapper;
  14 +import com.idss.vulsync.mvc.pojo.db.ConsultVulmanageSyncEntity;
  15 +import com.idss.vulsync.utils.MultipartFileToFile;
  16 +import com.idss.vulsync.utils.SftpUtil;
  17 +import lombok.extern.slf4j.Slf4j;
  18 +import org.springframework.beans.factory.annotation.Autowired;
  19 +import org.springframework.stereotype.Service;
  20 +
  21 +import java.io.File;
  22 +import java.io.FileOutputStream;
  23 +import java.io.OutputStreamWriter;
  24 +import java.util.Arrays;
  25 +import java.util.Base64;
  26 +import java.util.Date;
  27 +import java.util.List;
  28 +import java.util.stream.Collectors;
  29 +
  30 +/**
  31 + * @Author: zc
  32 + * @Date: 2024/8/20 11:10
  33 + */
  34 +@Slf4j
  35 +@Service
  36 +public class CommonService {
  37 + @Autowired
  38 + ObjectMapper objectMapper;
  39 + @Autowired
  40 + ConsultVulmanageSyncEntityMapper consultVulmanageSyncEntityMapper;
  41 + @Autowired
  42 + VulSftpConfiguration vulSftpConfiguration;
  43 +
  44 + public void sync(List<AssetReportVO> dataList, ConsultVulmanageSyncEntity syncEntity, Date now, String type) {
  45 + try {
  46 + String dateFormat = DateUtil.format(now, DatePattern.PURE_DATETIME_FORMAT);
  47 + String zipFileName = "";
  48 + zipFileName = syncEntity.getTransId() + "_" + type + "_" + dateFormat;
  49 +
  50 + String parentPath = vulSftpConfiguration.getTemp();
  51 +
  52 + String roundStr = syncEntity.getLatestEsId() + File.separator + dateFormat;
  53 +
  54 +
  55 + File contentLogFile = FileUtil.createFile(parentPath + File.separator + roundStr, "content.log");
  56 + OutputStreamWriter ow = new OutputStreamWriter(new FileOutputStream(contentLogFile), "utf-8");
  57 +
  58 + for (AssetReportVO entity : dataList) {
  59 + String json= objectMapper.writeValueAsString(entity);
  60 +// String json = JSON.toJSONString(entity, new PropertyFilter() {
  61 +// @Override
  62 +// public boolean apply(Object object, String name, Object value) {
  63 +// return !ListUtil.toList("SortedJson", "sortedJson").contains(name);
  64 +// }
  65 +// });
  66 + ow.append(json.concat("\r\n"));
  67 + ow.flush();
  68 + }
  69 + MultipartFileToFile.writeToFile(contentLogFile, parentPath, zipFileName);
  70 + String outputDir = parentPath + File.separator + roundStr;
  71 + List<String> zipFileUrlList = MultipartFileToFile.splitZip(parentPath, zipFileName, 20 * 1024 * 1024, outputDir);
  72 + if(ObjectUtil.isNotEmpty(zipFileUrlList)){
  73 + //最后一个文件后缀改成FFFF
  74 + String lastFileUrlOrigin = zipFileUrlList.get(zipFileUrlList.size() - 1);
  75 + String[] split = lastFileUrlOrigin.split("_");
  76 + split[split.length-1]="FFFF.zip";
  77 + String lastFileUrl = Arrays.stream(split).collect(Collectors.joining("_"));
  78 + cn.hutool.core.io.FileUtil.rename(new File(lastFileUrlOrigin),lastFileUrl,false);
  79 + zipFileUrlList.remove(zipFileUrlList.size() - 1);
  80 + zipFileUrlList.add(lastFileUrl);
  81 + }
  82 +
  83 + //更新db
  84 + syncEntity.setInitFilePath(outputDir);
  85 + syncEntity.setLatestFilePath(outputDir);
  86 + syncEntity.setLatestUploadTime(now);
  87 + consultVulmanageSyncEntityMapper.updateByPrimaryKeySelective(syncEntity);
  88 +
  89 + if ("1".equals(syncEntity.getCreditType())) {
  90 + //账号密码字符串
  91 + String pwd = cn.hutool.core.codec.Base64.decodeStr(syncEntity.getCredit());
  92 + String userAndPort = syncEntity.getUser();
  93 + String[] split = userAndPort.split(":");
  94 + SftpUtil sftpUtil = new SftpUtil(split[0], pwd, vulSftpConfiguration.getIp(), Integer.parseInt(split[1]));
  95 + try {
  96 + sftpUtil.login();
  97 + if (ObjectUtil.isNotEmpty(zipFileUrlList)) {
  98 + log.info("同步初始数据文件{}个", zipFileUrlList.size());
  99 + for (String fileUrl : zipFileUrlList) {
  100 + sftpUtil.upload(syncEntity.getFilePath(), fileUrl);
  101 + }
  102 + }
  103 + }catch (Exception e){
  104 + log.error("ftpy异常",e);
  105 + }finally {
  106 + sftpUtil.logout();
  107 + }
  108 + } else if ("2".equals(syncEntity.getCreditType())) {
  109 + //账号公钥
  110 + }
  111 + } catch (Exception e) {
  112 + log.error("{}同步数据异常", type, e);
  113 + }
  114 +
  115 + }
  116 +
  117 + public static void main(String[] args) throws Exception{
  118 + String a="idss@1234";
  119 + byte[] encode = Base64.getEncoder().encode(a.getBytes());
  120 + String string = new String(encode,"UTF-8");
  121 + System.out.println(string);
  122 + }
  123 +}
  1 +package com.idss.vulsync.mvc.service;
  2 +
  3 +import cn.hutool.core.collection.ListUtil;
  4 +import cn.hutool.core.date.DateField;
  5 +import cn.hutool.core.date.DateTime;
  6 +import cn.hutool.core.date.DateUtil;
  7 +import cn.hutool.core.util.ObjectUtil;
  8 +import cn.hutool.core.util.StrUtil;
  9 +import com.alibaba.fastjson.JSON;
  10 +import com.alibaba.fastjson.JSONException;
  11 +import com.alibaba.fastjson.serializer.PropertyFilter;
  12 +import com.fasterxml.jackson.databind.ObjectMapper;
  13 +import com.idss.common.file.storage.FileStorageProxy;
  14 +import com.idss.common.file.storage.pojo.dto.FileDownloadInfo;
  15 +import com.idss.common.file.storage.pojo.query.OperateQuery;
  16 +import com.idss.vulsync.common.EsIndexConstant;
  17 +import com.idss.vulsync.config.AssetSftpConfiguration;
  18 +import com.idss.vulsync.config.VulSftpConfiguration;
  19 +import com.idss.vulsync.constants.CommonConstant;
  20 +import com.idss.vulsync.constants.RedisConstants;
  21 +import com.idss.vulsync.entity.AssetReportVO;
  22 +import com.idss.vulsync.entity.vo.SyncParamConsultRequestData;
  23 +import com.idss.vulsync.mvc.mapper.ConsultVulmanageSyncEntityMapper;
  24 +import com.idss.vulsync.mvc.pojo.db.ConsultVulmanageSyncEntity;
  25 +import com.idss.vulsync.schedule.InitDataSyncJob;
  26 +import com.idss.vulsync.utils.MultipartFileToFile;
  27 +import com.idss.vulsync.utils.RedisUtil;
  28 +import com.idss.vulsync.utils.SftpUtil;
  29 +import lombok.extern.slf4j.Slf4j;
  30 +import org.apache.commons.lang3.StringUtils;
  31 +import org.quartz.*;
  32 +import org.springframework.beans.factory.annotation.Autowired;
  33 +import org.springframework.beans.factory.annotation.Qualifier;
  34 +import org.springframework.data.redis.core.RedisTemplate;
  35 +import org.springframework.stereotype.Service;
  36 +import org.springframework.web.multipart.MultipartFile;
  37 +
  38 +import java.io.BufferedReader;
  39 +import java.io.IOException;
  40 +import java.io.InputStream;
  41 +import java.io.InputStreamReader;
  42 +import java.util.*;
  43 +import java.util.stream.Collectors;
  44 +
  45 +/**
  46 + * @Author: zc
  47 + * @Date: 2024/8/16 13:48
  48 + */
  49 +@Service
  50 +@Slf4j
  51 +public class ConsultVulmanageSyncService {
  52 + @Autowired
  53 + ObjectMapper objectMapper;
  54 + @Autowired
  55 + ConsultVulmanageSyncEntityMapper consultVulmanageSyncEntityMapper;
  56 + @Autowired
  57 + EsService esService;
  58 + @Autowired(required = false)
  59 + @Qualifier("QuartzScheduler")
  60 + private Scheduler scheduler;
  61 + @Autowired(required = false)
  62 + private FileStorageProxy fileStorageProxy;
  63 + @Autowired
  64 + private RedisUtil redisUtil;
  65 + @Autowired
  66 + AssetSftpConfiguration assetSftpConfiguration;
  67 +
  68 +
  69 +
  70 + public List<AssetReportVO> getLatestDataGxb() {
  71 + List<AssetReportVO> allList = new ArrayList<>();
  72 + Set<String> keys = redisUtil.keys("*" + RedisConstants.INIT_REPORT_DATA_FILE_NAME + "*");
  73 + if(ObjectUtil.isEmpty(keys)){
  74 + log.info("redis未获取到最近一次上报部侧的全量数据文件地址");
  75 + return new ArrayList<>();
  76 + }
  77 +
  78 +
  79 + Object initDataFileName = redisUtil.get(new ArrayList<>(keys).get(0)) ;
  80 + if (ObjectUtil.isEmpty(initDataFileName)) {
  81 + log.info("redis未获取到最近一次上报部侧的全量数据文件地址{}的值", RedisConstants.INIT_REPORT_DATA_FILE_NAME);
  82 + return allList;
  83 + }
  84 + String fileNames = initDataFileName.toString();
  85 + log.info("redis获取最近一次上报部侧的全量数据文件地址{}", fileNames);
  86 +
  87 + SftpUtil sftpUtil = new SftpUtil(assetSftpConfiguration.getUser(), assetSftpConfiguration.getPwd(), assetSftpConfiguration.getIp(), Integer.parseInt(assetSftpConfiguration.getPort()));
  88 + try {
  89 + sftpUtil.login();
  90 + for (String fileName : fileNames.split(",")) {
  91 +
  92 + InputStream inputStream = sftpUtil.downloadStream(assetSftpConfiguration.getPath(), fileName.split("/")[1]);
  93 +
  94 + List<AssetReportVO> resultList = resolveZip2AssetList(inputStream);
  95 + if (ObjectUtil.isNotEmpty(resultList)) {
  96 + allList.addAll(resultList);
  97 + }
  98 + }
  99 +
  100 + if (ObjectUtil.isNotEmpty(allList)) {
  101 + log.info("解析最近一次上报全量数据{}包含{}条", fileNames, allList.size());
  102 + }
  103 +
  104 + } catch (Exception e) {
  105 + log.error("解析最近一次上报全量数据文件异常", e);
  106 + } finally {
  107 + sftpUtil.logout();
  108 + }
  109 + return allList;
  110 + }
  111 +
  112 +
  113 +
  114 + public void consultVulmanage(SyncParamConsultRequestData syncParamConsultRequestData) {
  115 + Date now = new Date();
  116 +
  117 +
  118 + //获取最近一次上报部侧的全量数据文件 作为资产同步的初始数据
  119 + List<AssetReportVO> allList = getLatestDataGxb();
  120 +
  121 + //删除上次的协商参数和资产数据
  122 + ConsultVulmanageSyncEntity existSync = consultVulmanageSyncEntityMapper.selectByPrimaryKey(CommonConstant.CONSULT_UNIQUE_ID);
  123 + if (existSync != null) {
  124 + String existIndex = existSync.getLatestEsId();
  125 + if (ObjectUtil.isNotEmpty(existIndex)) {
  126 + esService.delete(existIndex);
  127 + }
  128 + consultVulmanageSyncEntityMapper.deleteByPrimaryKey(CommonConstant.CONSULT_UNIQUE_ID);
  129 + }
  130 +
  131 +
  132 + String newIndex = UUID.randomUUID().toString().replace("-", "");
  133 +
  134 +
  135 + //保存初始资产数据
  136 + esService.addBatch(allList, newIndex);
  137 +// esService.addBatch(allList, EsIndexConstant.GXB_ASSET_FULL_DATA_INDEX);
  138 +
  139 + //保存同步协商参数
  140 + ConsultVulmanageSyncEntity syncEntity = new ConsultVulmanageSyncEntity();
  141 + syncEntity.setId(CommonConstant.CONSULT_UNIQUE_ID);
  142 + syncEntity.setTransId(syncParamConsultRequestData.getTransID());
  143 + syncEntity.setFilePath(syncParamConsultRequestData.getFilePath());
  144 + syncEntity.setUser(syncParamConsultRequestData.getUser()+":"+syncParamConsultRequestData.getPort());
  145 + syncEntity.setCreditType(syncParamConsultRequestData.getCreditType().toString());
  146 + syncEntity.setCredit(syncParamConsultRequestData.getCredit());
  147 + syncEntity.setPubKey(syncParamConsultRequestData.getPubKey());
  148 + syncEntity.setInitDelay(syncParamConsultRequestData.getInitDelay());
  149 + syncEntity.setUpdCycle(syncParamConsultRequestData.getUpdCycle());
  150 + syncEntity.setCreateTime(now);
  151 + syncEntity.setLatestEsId(newIndex);
  152 + consultVulmanageSyncEntityMapper.insertSelective(syncEntity);
  153 +
  154 +
  155 + try {
  156 + String initDelay = syncEntity.getInitDelay();
  157 + String numStr = initDelay.substring(0, 2);
  158 + String unit = initDelay.substring(2, initDelay.length());
  159 + Integer num = numStr.startsWith("0") ? Integer.parseInt(numStr.substring(1, numStr.length())) : Integer.parseInt(numStr);
  160 +
  161 +
  162 + JobDetail jobDetail = JobBuilder.newJob(InitDataSyncJob.class).
  163 + withIdentity(InitDataSyncJob.class.getSimpleName(), InitDataSyncJob.class.getSimpleName())
  164 + .build();
  165 +
  166 +
  167 + DateTime executionTime = new DateTime();
  168 +
  169 + if (unit.equals("分")) {
  170 + executionTime = DateUtil.offsetMinute(now, num);
  171 + } else if (unit.equals("时")) {
  172 + executionTime = DateUtil.offsetHour(now, num);
  173 + } else {
  174 + executionTime = new DateTime(now);
  175 + }
  176 +
  177 +
  178 + Trigger trigger = TriggerBuilder.newTrigger().withIdentity(InitDataSyncJob.class.getSimpleName(), InitDataSyncJob.class.getSimpleName())
  179 + .startAt(executionTime).build();
  180 + JobKey jobKey=new JobKey(InitDataSyncJob.class.getSimpleName(), InitDataSyncJob.class.getSimpleName());
  181 + scheduler.deleteJob(jobKey);
  182 + scheduler.scheduleJob(jobDetail, trigger);
  183 + log.info("新增初始数据同步任务,下次执行时间{}", DateUtil.formatDateTime(executionTime));
  184 + } catch (Exception e) {
  185 + log.error("新增初始数据同步任务异常", e);
  186 + }
  187 +
  188 + }
  189 +
  190 +
  191 + /**
  192 + * 解析zip文件为上报数据
  193 + */
  194 + public List<AssetReportVO> resolveZip2AssetList(InputStream inputStream) {
  195 + List<AssetReportVO> resultList = new ArrayList<>();
  196 + try {
  197 + List<MultipartFile> multipartFiles = MultipartFileToFile.zipParse(inputStream);
  198 + for (MultipartFile multipartFile : multipartFiles) {
  199 + InputStream ins = multipartFile.getInputStream();
  200 + BufferedReader br = null;
  201 + try {
  202 + //读取文件信息
  203 + br = new BufferedReader(new InputStreamReader(ins));
  204 + String lines = "";
  205 + // 根据行进行读取数据
  206 + while (StringUtils.isNotBlank((lines = br.readLine()))) {
  207 + AssetReportVO entity = new AssetReportVO();
  208 + try {
  209 + entity = objectMapper.readValue(lines, AssetReportVO.class);
  210 +// String sortedJson = JSON.toJSONString(entity, new PropertyFilter() {
  211 +// @Override
  212 +// public boolean apply(Object object, String name, Object value) {
  213 +// return !ListUtil.toList("TaskID", "AssetID", "taskID", "assetId").contains(name);
  214 +// }
  215 +// });
  216 + resultList.add(entity);
  217 + } catch (JSONException e) {
  218 + e.printStackTrace();
  219 + }
  220 + }
  221 + br.close();
  222 + } catch (IOException e) {
  223 + try {
  224 + br.close();
  225 + } catch (IOException ex) {
  226 + ex.printStackTrace();
  227 + }
  228 + e.printStackTrace();
  229 + }
  230 +
  231 + }
  232 + } catch (Exception e) {
  233 + e.printStackTrace();
  234 +
  235 + }
  236 + return resultList;
  237 + }
  238 +
  239 + public static void main(String[] args) {
  240 + String var0="M#@*G+q<O8F";
  241 + int var10000 = 5 << 3 ^ 3 ^ 5;
  242 + int var10001 = (3 ^ 5) << 4 ^ 3;
  243 + int var10002 = 4 << 4 ^ (3 ^ 5) << 1;
  244 + String var1;
  245 + int var10003 = (var1 = (String)var0).length();
  246 + char[] var10004 = new char[var10003];
  247 + boolean var10006 = true;
  248 + int var5 = var10003 - 1;
  249 + var10003 = var10002;
  250 + int var3;
  251 + var10002 = var3 = var5;
  252 + char[] a = var10004;
  253 + int var4 = var10003;
  254 + var10001 = var10000;
  255 + var10000 = var10002;
  256 +
  257 + for(int var2 = var10001; var10000 >= 0; var10000 = var3) {
  258 + var10001 = var3;
  259 + char var7 = var1.charAt(var3);
  260 + --var3;
  261 + a[var10001] = (char)(var7 ^ var2);
  262 + if (var3 < 0) {
  263 + break;
  264 + }
  265 +
  266 + var10002 = var3--;
  267 + a[var10002] = (char)(var1.charAt(var10002) ^ var4);
  268 + }
  269 +
  270 +
  271 +
  272 +
  273 + System.out.println(new String(a));
  274 + }
  275 +}
  1 +package com.idss.vulsync.mvc.service;
  2 +
  3 +import cn.hutool.core.lang.Assert;
  4 +import cn.hutool.core.util.ObjectUtil;
  5 +import com.alibaba.fastjson.JSON;
  6 +import com.fasterxml.jackson.databind.ObjectMapper;
  7 +import com.fasterxml.jackson.databind.type.TypeFactory;
  8 +import com.idss.vulsync.entity.AssetReportVO;
  9 +import lombok.extern.slf4j.Slf4j;
  10 +import org.elasticsearch.action.DocWriteRequest;
  11 +import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
  12 +import org.elasticsearch.action.bulk.*;
  13 +import org.elasticsearch.action.delete.DeleteRequest;
  14 +import org.elasticsearch.action.delete.DeleteResponse;
  15 +import org.elasticsearch.action.index.IndexRequest;
  16 +import org.elasticsearch.action.search.SearchRequest;
  17 +import org.elasticsearch.action.search.SearchResponse;
  18 +import org.elasticsearch.action.search.SearchScrollRequest;
  19 +import org.elasticsearch.action.support.IndicesOptions;
  20 +import org.elasticsearch.action.support.master.AcknowledgedResponse;
  21 +import org.elasticsearch.client.RequestOptions;
  22 +import org.elasticsearch.client.RestHighLevelClient;
  23 +import org.elasticsearch.client.indices.CreateIndexRequest;
  24 +import org.elasticsearch.client.indices.CreateIndexResponse;
  25 +import org.elasticsearch.client.indices.GetIndexRequest;
  26 +import org.elasticsearch.common.unit.ByteSizeUnit;
  27 +import org.elasticsearch.common.unit.ByteSizeValue;
  28 +import org.elasticsearch.core.TimeValue;
  29 +import org.elasticsearch.index.query.BoolQueryBuilder;
  30 +import org.elasticsearch.index.query.QueryBuilder;
  31 +import org.elasticsearch.index.query.QueryBuilders;
  32 +import org.elasticsearch.index.reindex.BulkByScrollResponse;
  33 +import org.elasticsearch.index.reindex.DeleteByQueryRequest;
  34 +import org.elasticsearch.search.Scroll;
  35 +import org.elasticsearch.search.SearchHit;
  36 +import org.elasticsearch.search.builder.SearchSourceBuilder;
  37 +import org.elasticsearch.xcontent.XContentType;
  38 +import org.springframework.beans.factory.annotation.Autowired;
  39 +import org.springframework.stereotype.Component;
  40 +
  41 +import java.io.IOException;
  42 +import java.util.*;
  43 +import java.util.concurrent.TimeUnit;
  44 +import java.util.stream.Collectors;
  45 +
  46 +/**
  47 + * @Author: zc
  48 + * @Date: 2021/11/19 14:35
  49 + */
  50 +@Component
  51 +@Slf4j
  52 +public class EsService {
  53 +
  54 +
  55 + @Autowired
  56 + ObjectMapper objectMapper;
  57 + @Autowired
  58 + RestHighLevelClient client;
  59 +
  60 +
  61 +
  62 + public int delete(String indexName) {
  63 + try {
  64 + GetIndexRequest indexRequest = new GetIndexRequest(indexName);
  65 + boolean inExists = client.indices().exists(indexRequest, RequestOptions.DEFAULT);
  66 +
  67 + if (inExists) {
  68 + DeleteIndexRequest request = new DeleteIndexRequest(indexName);
  69 + AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
  70 + if (!response.isAcknowledged()) {
  71 + // 2:索引存在删除失败
  72 + log.info("删除索引失败{}",indexName);
  73 + return 2;
  74 + }
  75 + } else {
  76 + // 1:索引不存在
  77 + log.info("删除索引不存在{}",indexName);
  78 + return 1;
  79 + }
  80 + } catch (IllegalArgumentException e) {
  81 + throw e;
  82 + } catch (Exception e) {
  83 + log.error("删除索引异常{}",indexName,e);
  84 + }
  85 + // 0:索引存在并删除成功
  86 + return 0;
  87 + }
  88 +
  89 +
  90 +
  91 + /**
  92 + * 批量插入
  93 + */
  94 + public void addBatch(List<AssetReportVO> models, String index) {
  95 + if (!indexIsExist(index)) {
  96 + createIndex(index);
  97 + }
  98 + BulkProcessor.Listener listener = new BulkProcessor.Listener() {
  99 + @Override
  100 + public void beforeBulk(long executionId, BulkRequest request) {
  101 + log.info("1. 【beforeBulk】批次[{}] 携带 {} 请求数量", executionId, request.numberOfActions());
  102 + }
  103 +
  104 + @Override
  105 + public void afterBulk(long executionId, BulkRequest request,
  106 + BulkResponse response) {
  107 +// if (!response.hasFailures()) {
  108 +// log.info("2. 【afterBulk-成功】批量 [{}] 完成在 {} ms", executionId, response.getTook().getMillis());
  109 +// } else {
  110 +// BulkItemResponse[] items = response.getItems();
  111 +// for (BulkItemResponse item : items) {
  112 +// if (item.isFailed()) {
  113 +// log.info("2. 【afterBulk-失败】批量 [{}] 出现异常的原因 : {}", executionId, item.getFailureMessage());
  114 +// break;
  115 +// }
  116 +// }
  117 +// }
  118 + }
  119 +
  120 + @Override
  121 + public void afterBulk(long executionId, BulkRequest request,
  122 + Throwable failure) {
  123 + log.error("3. 【afterBulk-failure失败】es执行bluk失败", failure);
  124 +// List<DocWriteRequest<?>> requests = request.requests();
  125 +// List<String> esIds = requests.stream().map(DocWriteRequest::id).collect(Collectors.toList());
  126 + }
  127 + };
  128 + BulkProcessor bulkProcessor = BulkProcessor.builder(
  129 + (request, bulkListener) ->
  130 + client.bulkAsync(request, RequestOptions.DEFAULT, bulkListener),
  131 + listener)
  132 + .setBulkActions(10000) // Execute the bulk every 10,000 requests
  133 + .setBulkSize(new ByteSizeValue(100, ByteSizeUnit.MB)) // Execute the bulk every 5MB
  134 + .build();
  135 +
  136 + try {
  137 + for (AssetReportVO entity : models) {
  138 + LinkedHashMap<String,Object> map = objectMapper.readValue(objectMapper.writeValueAsString(entity), TypeFactory.defaultInstance().constructMapType(LinkedHashMap.class, String.class, Object.class));
  139 + IndexRequest indexRequest = new IndexRequest(index).id(entity.getAssetId())
  140 + .type(index)
  141 + .source(map);
  142 + bulkProcessor.add(indexRequest);
  143 + }
  144 + bulkProcessor.flush();
  145 + bulkProcessor.awaitClose(3, TimeUnit.MINUTES);
  146 + }catch (Exception e){
  147 + e.printStackTrace();
  148 + }
  149 + }
  150 +
  151 + public boolean createIndex(String indexName) {
  152 + if (indexIsExist(indexName)) {
  153 + return true;
  154 + }
  155 + CreateIndexResponse createIndexResponse = null;
  156 + try {
  157 + CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName);
  158 + createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
  159 + } catch (IOException e) {
  160 + throw new RuntimeException(e);
  161 + }
  162 + if (createIndexResponse.isAcknowledged()) {
  163 + log.info("Index created");
  164 + return true;
  165 + } else {
  166 + log.info("Index creation failed");
  167 + return false;
  168 + }
  169 + }
  170 +
  171 +
  172 + public boolean indexIsExist(String indexName) {
  173 + Assert.notNull(indexName, "exist index name assert null!");
  174 + GetIndexRequest getIndexRequest = new GetIndexRequest("fisher");
  175 + boolean exists = false;
  176 + try {
  177 + exists = client.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
  178 + } catch (IOException e) {
  179 + log.info("indexIsExist found exception:" + e);
  180 + }
  181 + return exists;
  182 + }
  183 +
  184 +
  185 +// public boolean addBatch(List<Object> models, String index) {
  186 +// for (Object model : models) {
  187 +// String id = idGenerator.randomUUID();
  188 +// IndexRequest indexRequest = new IndexRequest(index).id(id).source(JSON.toJSONString(model), XContentType.JSON);
  189 +// try {
  190 +// client.index(indexRequest, COMMON_OPTIONS);
  191 +// } catch (IOException e) {
  192 +// log.warn("inserts to es is error, errorMsg " + id, e);
  193 +// }
  194 +// }
  195 +// return true;
  196 +// }
  197 +
  198 + private IndicesOptions setIndicesOptionsParam() {
  199 + return IndicesOptions.fromOptions(true, true, true, false, IndicesOptions.strictExpandOpenAndForbidClosed());
  200 + }
  201 +
  202 + /**
  203 + * @param index
  204 + * @param queryBuilder
  205 + * @return
  206 + */
  207 + public List<AssetReportVO> selectList(String index, QueryBuilder queryBuilder) {
  208 + try {
  209 + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  210 + searchSourceBuilder.query(queryBuilder);
  211 + searchSourceBuilder.size(10000);
  212 +
  213 + Scroll scroll = new Scroll(new TimeValue(600000));
  214 + SearchRequest searchRequest = new SearchRequest();
  215 + searchRequest.indices(index);
  216 + searchRequest.scroll(scroll);
  217 + searchRequest.source(searchSourceBuilder);
  218 +
  219 + SearchResponse scrollResp = client.search(searchRequest, RequestOptions.DEFAULT);
  220 + List<AssetReportVO> resultList = new ArrayList<>();
  221 + AssetReportVO entity = null;
  222 +
  223 +
  224 + //记录滚动id。
  225 + String scrollId = scrollResp.getScrollId();
  226 + //滚动查询部分,将从第10001条数据开始取。
  227 + SearchHit[] scrollHits = scrollResp.getHits().getHits();
  228 +
  229 + for (SearchHit searchHit : scrollHits) {
  230 + entity = JSON.parseObject(searchHit.getSourceAsString(), AssetReportVO.class);
  231 + resultList.add(entity);
  232 + }
  233 + log.info("resultList size " + resultList.size());
  234 +
  235 +
  236 + while (ObjectUtil.isNotNull(scrollHits) && scrollHits.length > 0) {
  237 + //构造滚动查询条件
  238 + SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId);
  239 + searchScrollRequest.scroll(scroll);
  240 + //响应必须是上面的响应对象,需要对上一层进行覆盖。
  241 + scrollResp = client.scroll(searchScrollRequest, RequestOptions.DEFAULT);
  242 + scrollId = scrollResp.getScrollId();
  243 + scrollHits = scrollResp.getHits().getHits();
  244 +
  245 + for (SearchHit searchHit : scrollHits) {
  246 + entity = JSON.parseObject(searchHit.getSourceAsString(), AssetReportVO.class);
  247 + resultList.add(entity);
  248 + }
  249 + log.info("resultList size " + resultList.size());
  250 +
  251 + }
  252 + log.info("resultList final size " + resultList.size());
  253 + return resultList;
  254 + } catch (Exception e) {
  255 + log.error("selectList timeindex is error,errorMsg ", e);
  256 + }
  257 + return new ArrayList<>();
  258 + }
  259 +
  260 +
  261 +}
  1 +package com.idss.vulsync.schedule;
  2 +
  3 +import cn.hutool.core.date.DateTime;
  4 +import cn.hutool.core.date.DateUtil;
  5 +import cn.hutool.core.util.ObjectUtil;
  6 +import com.idss.vulsync.constants.CommonConstant;
  7 +import com.idss.vulsync.entity.AssetReportVO;
  8 +import com.idss.vulsync.mvc.mapper.ConsultVulmanageSyncEntityMapper;
  9 +import com.idss.vulsync.mvc.pojo.db.ConsultVulmanageSyncEntity;
  10 +import com.idss.vulsync.mvc.service.CommonService;
  11 +import com.idss.vulsync.mvc.service.EsService;
  12 +import lombok.extern.slf4j.Slf4j;
  13 +import org.elasticsearch.index.query.BoolQueryBuilder;
  14 +import org.elasticsearch.index.query.QueryBuilders;
  15 +import org.quartz.*;
  16 +import org.springframework.beans.factory.annotation.Autowired;
  17 +import org.springframework.beans.factory.annotation.Qualifier;
  18 +import org.springframework.stereotype.Service;
  19 +
  20 +import java.util.Date;
  21 +import java.util.List;
  22 +
  23 +/**
  24 + * @Author: zc
  25 + * @Date: 2024/8/16 16:58
  26 + * 漏管初始数据同步
  27 + */
  28 +@Service
  29 +@Slf4j
  30 +public class InitDataSyncJob implements Job {
  31 + @Autowired
  32 + ConsultVulmanageSyncEntityMapper consultVulmanageSyncEntityMapper;
  33 + @Autowired
  34 + EsService esService;
  35 + @Autowired(required = false)
  36 + @Qualifier("QuartzScheduler")
  37 + public Scheduler scheduler;
  38 + @Autowired
  39 + CommonService commonService;
  40 +
  41 + @Override
  42 + public void execute(JobExecutionContext jobExecutionContext) {
  43 + log.info("quartz启动" + this.getClass().getSimpleName());
  44 + this.run(jobExecutionContext);
  45 + }
  46 +
  47 +
  48 + public void run(JobExecutionContext jobExecutionContext) {
  49 + Date now = new Date();
  50 + log.info("开始同步初始数据--------");
  51 + ConsultVulmanageSyncEntity syncEntity = consultVulmanageSyncEntityMapper.selectByPrimaryKey(CommonConstant.CONSULT_UNIQUE_ID);
  52 + if (ObjectUtil.isEmpty(syncEntity) || ObjectUtil.isEmpty(syncEntity.getLatestEsId())) {
  53 + log.error("开始同步初始数据失败,未找到初始数据");
  54 + }
  55 + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  56 + List<AssetReportVO> list = esService.selectList(syncEntity.getLatestEsId(), boolQueryBuilder);
  57 +
  58 +
  59 + commonService.sync(list, syncEntity, now, "INIT");
  60 +
  61 + try {
  62 + jobExecutionContext.getScheduler().deleteJob(jobExecutionContext.getJobDetail().getKey());
  63 + } catch (SchedulerException e) {
  64 + e.printStackTrace();
  65 + }
  66 +
  67 + try {
  68 + scheduler.deleteJob(new JobKey(InitDataSyncJob.class.getSimpleName(),InitDataSyncJob.class.getSimpleName()));
  69 + }catch (Exception e){
  70 + e.printStackTrace();
  71 + }
  72 +
  73 + try {
  74 + JobKey jobKey=new JobKey(UpdateDataSyncJob.class.getSimpleName(), UpdateDataSyncJob.class.getSimpleName());
  75 + scheduler.deleteJob(jobKey);
  76 + }catch (Exception e){
  77 + e.printStackTrace();
  78 + }
  79 +
  80 + try {
  81 + //新增增量更新同步任务
  82 + String updCycle = syncEntity.getUpdCycle();
  83 + String numStr = updCycle.substring(0, 2);
  84 + String unit = updCycle.substring(2, updCycle.length());
  85 + Integer num = numStr.startsWith("0") ? Integer.parseInt(numStr.substring(1, numStr.length())) : Integer.parseInt(numStr);
  86 +
  87 +
  88 + JobDetail jobDetail = JobBuilder.newJob(UpdateDataSyncJob.class).
  89 + withIdentity(UpdateDataSyncJob.class.getSimpleName(), UpdateDataSyncJob.class.getSimpleName())
  90 + .build();
  91 +
  92 + DateTime executionTime = new DateTime();
  93 +
  94 + if (unit.equals("天")) {
  95 + executionTime = DateUtil.offsetDay(now, num);
  96 + } else if (unit.equals("时")) {
  97 + executionTime = DateUtil.offsetHour(now, num);
  98 + } else {
  99 + executionTime = new DateTime(now);
  100 + }
  101 +
  102 + Trigger trigger = TriggerBuilder.newTrigger().withIdentity(UpdateDataSyncJob.class.getSimpleName(), UpdateDataSyncJob.class.getSimpleName())
  103 + .startAt(executionTime).build();
  104 + scheduler.scheduleJob(jobDetail, trigger);
  105 + log.error("新增增量更新同步任务,下次执行时间{}", DateUtil.formatDateTime(executionTime));
  106 +
  107 +
  108 + } catch (Exception e) {
  109 + log.error("同步初始数据异常", e);
  110 + }
  111 +
  112 +
  113 + log.info("结束同步初始数据--------");
  114 + }
  115 +
  116 +}
  1 +package com.idss.vulsync.schedule;
  2 +
  3 +import cn.hutool.core.date.DateTime;
  4 +import cn.hutool.core.date.DateUtil;
  5 +import cn.hutool.core.util.ObjectUtil;
  6 +import com.idss.vulsync.constants.CommonConstant;
  7 +import com.idss.vulsync.entity.AssetReportVO;
  8 +import com.idss.vulsync.mvc.mapper.ConsultVulmanageSyncEntityMapper;
  9 +import com.idss.vulsync.mvc.pojo.db.ConsultVulmanageSyncEntity;
  10 +import com.idss.vulsync.mvc.service.CommonService;
  11 +import com.idss.vulsync.mvc.service.ConsultVulmanageSyncService;
  12 +import com.idss.vulsync.mvc.service.EsService;
  13 +import lombok.extern.slf4j.Slf4j;
  14 +import org.elasticsearch.index.query.QueryBuilders;
  15 +import org.quartz.*;
  16 +import org.springframework.beans.factory.annotation.Autowired;
  17 +import org.springframework.beans.factory.annotation.Qualifier;
  18 +import org.springframework.data.redis.core.RedisTemplate;
  19 +import org.springframework.stereotype.Service;
  20 +
  21 +import java.util.*;
  22 +import java.util.stream.Collectors;
  23 +
  24 +/**
  25 + * @Author: zc
  26 + * @Date: 2024/8/16 16:58
  27 + * 漏管增量数据同步
  28 + */
  29 +@Service
  30 +@Slf4j
  31 +public class UpdateDataSyncJob implements Job {
  32 + @Autowired(required = false)
  33 + @Qualifier("QuartzScheduler")
  34 + public Scheduler scheduler;
  35 + @Autowired
  36 + EsService esService;
  37 + @Autowired
  38 + ConsultVulmanageSyncEntityMapper consultVulmanageSyncEntityMapper;
  39 + @Autowired
  40 + ConsultVulmanageSyncService consultVulmanageSyncService;
  41 + @Autowired
  42 + CommonService commonService;
  43 + @Autowired
  44 + private RedisTemplate redisTemplate;
  45 +
  46 + @Override
  47 + public void execute(JobExecutionContext jobExecutionContext) {
  48 + log.info("quartz启动" + this.getClass().getSimpleName());
  49 + this.run(jobExecutionContext);
  50 + }
  51 +
  52 +
  53 + public void run(JobExecutionContext jobExecutionContext) {
  54 + log.info("开始同步增量数据--------");
  55 + Date now = new Date();
  56 + //初始同步任务同步部侧全量指令数据DataGxb为初始漏管数据latestEsId至漏管
  57 + //每次上报部侧数据后更新部侧数据DataGxb ???是否只处理部侧全量指令数据的情况
  58 + //增量同步任务比对DataGxb与latestEsId,然后更新DataVul并同步至漏管
  59 +
  60 + //获取最近一次上报部侧的全量数据文件 作为DataGxb
  61 + List<AssetReportVO> gxbDataList = consultVulmanageSyncService.getLatestDataGxb();
  62 +
  63 +
  64 + ConsultVulmanageSyncEntity syncEntity = consultVulmanageSyncEntityMapper.selectByPrimaryKey(CommonConstant.CONSULT_UNIQUE_ID);
  65 + String latestEsId = syncEntity.getLatestEsId();
  66 + List<AssetReportVO> vulDataList = esService.selectList(latestEsId, QueryBuilders.boolQuery());
  67 +
  68 + log.info("增量同步任务,漏管快照数据{}条,上报部侧数据{}条", vulDataList.size(), gxbDataList.size());
  69 +
  70 + List<AssetReportVO> removeList = new ArrayList<>();
  71 + //漏管DataVul为存量数据,最近一次部侧全量数据为本次需要比对的数据
  72 + Set<String> vulDataIds = vulDataList.stream().map(AssetReportVO::getAssetId).collect(Collectors.toSet());
  73 + Set<String> gxbDataIds = gxbDataList.stream().map(AssetReportVO::getAssetId).collect(Collectors.toSet());
  74 +
  75 + Set<String> removeIds = new HashSet<>();
  76 + for (String vulDataId : vulDataIds) {
  77 + if (!gxbDataIds.contains(vulDataId)) {
  78 + removeIds.add(vulDataId);
  79 + AssetReportVO remove = new AssetReportVO();
  80 + remove.setAssetId(vulDataId);
  81 + remove.setState("3");
  82 + removeList.add(remove);
  83 + }
  84 + }
  85 + //部侧数据中废弃资产 认为0下线 2停用 3删除均为废弃资产, state=1为新增和变更资产
  86 + Set<AssetReportVO> gxbRemoveIds = gxbDataList.stream().filter(s -> !"1".equals(s.getState())).collect(Collectors.toSet());
  87 + for (AssetReportVO reportVO : gxbRemoveIds) {
  88 + AssetReportVO remove = new AssetReportVO();
  89 + remove.setAssetId(reportVO.getAssetId());
  90 + remove.setState(reportVO.getState());
  91 + removeList.add(remove);
  92 + }
  93 + log.info("本次资产废弃或删除{}条", removeList.size());
  94 +
  95 + //1资产新增+属性变更
  96 + List<AssetReportVO> addList = gxbDataList.stream().filter(s -> "1".equals(s.getState())).collect(Collectors.toList());
  97 + log.info("本次资产新增和属性变更共{}条", addList.size());
  98 +
  99 + //待更新数据
  100 + List<AssetReportVO> syncDataList = new ArrayList<>();
  101 + syncDataList.addAll(addList);
  102 + syncDataList.addAll(removeList);
  103 +
  104 + try {
  105 + //latestEsId删除旧数据,插入新增资产和变更资产, *废弃资产不入库
  106 + esService.delete(latestEsId);
  107 + if (ObjectUtil.isNotEmpty(addList)) {
  108 + esService.addBatch(addList, latestEsId);
  109 + log.error("增量更新插入es{}条", addList.size());
  110 + }
  111 + } catch (Exception e) {
  112 + log.error("增量更新插入es异常", e);
  113 + }
  114 +
  115 +
  116 + commonService.sync(syncDataList, syncEntity, now, "UPD");
  117 +
  118 + try {
  119 + JobKey jobKey=new JobKey(UpdateDataSyncJob.class.getSimpleName(), UpdateDataSyncJob.class.getSimpleName());
  120 + scheduler.deleteJob(jobKey);
  121 + }catch (Exception e){
  122 + e.printStackTrace();
  123 + }
  124 +
  125 +
  126 + try {
  127 + //新增增量更新同步任务
  128 + String updCycle = syncEntity.getUpdCycle();
  129 + String numStr = updCycle.substring(0, 2);
  130 + String unit = updCycle.substring(2, updCycle.length());
  131 + Integer num = numStr.startsWith("0") ? Integer.parseInt(numStr.substring(1, numStr.length())) : Integer.parseInt(numStr);
  132 +
  133 +
  134 + JobDetail jobDetail = JobBuilder.newJob(UpdateDataSyncJob.class).
  135 + withIdentity(UpdateDataSyncJob.class.getSimpleName(), UpdateDataSyncJob.class.getSimpleName())
  136 + .build();
  137 +
  138 + DateTime executionTime = new DateTime();
  139 +
  140 + if (unit.equals("天")) {
  141 + executionTime = DateUtil.offsetDay(now, num);
  142 + } else if (unit.equals("时")) {
  143 + executionTime = DateUtil.offsetHour(now, num);
  144 + } else {
  145 + executionTime = new DateTime(now);
  146 + }
  147 +
  148 + Trigger trigger = TriggerBuilder.newTrigger().withIdentity(UpdateDataSyncJob.class.getSimpleName(), UpdateDataSyncJob.class.getSimpleName())
  149 + .startAt(executionTime).build();
  150 + scheduler.scheduleJob(jobDetail, trigger);
  151 + log.error("新增增量更新同步任务,下次执行时间{}", DateUtil.formatDateTime(executionTime));
  152 +
  153 +
  154 + } catch (Exception e) {
  155 + log.error("同步增量数据异常", e);
  156 + }
  157 +
  158 +
  159 + log.info("结束同步增量数据--------");
  160 + }
  161 +
  162 +}
  1 +package com.idss.vulsync.utils;
  2 +
  3 +import com.alibaba.fastjson.JSON;
  4 +import com.fasterxml.jackson.core.JsonProcessingException;
  5 +import com.fasterxml.jackson.databind.DeserializationFeature;
  6 +import com.fasterxml.jackson.databind.JsonNode;
  7 +import com.fasterxml.jackson.databind.ObjectMapper;
  8 +import com.fasterxml.jackson.databind.type.TypeFactory;
  9 +import lombok.extern.slf4j.Slf4j;
  10 +import org.springframework.beans.factory.annotation.Autowired;
  11 +import org.springframework.beans.factory.annotation.Value;
  12 +import org.springframework.stereotype.Component;
  13 +
  14 +import javax.servlet.http.HttpServletRequest;
  15 +import java.math.BigInteger;
  16 +import java.nio.charset.StandardCharsets;
  17 +import java.security.KeyFactory;
  18 +import java.security.MessageDigest;
  19 +import java.security.PublicKey;
  20 +import java.security.Signature;
  21 +import java.security.spec.X509EncodedKeySpec;
  22 +import java.util.Base64;
  23 +import java.util.LinkedHashMap;
  24 +
  25 +/**
  26 + * @Author: zc
  27 + * @Date: 2024/8/13 14:34
  28 + */
  29 +@Component
  30 +@Slf4j
  31 +public class AuthUtils {
  32 + @Value("${auth.publickey:11}")
  33 + private String publickey;
  34 +
  35 + @Autowired
  36 + ObjectMapper objectMapper;
  37 +
  38 + public boolean valid(HttpServletRequest req) {
  39 +// 提取Authorization头
  40 + String authHeader = req.getHeader("Authorization");
  41 + try {
  42 + if (authHeader == null || !authHeader.startsWith("Basic ")) {
  43 + return false;
  44 + }
  45 +
  46 + // 提取base64编码的pubKeyInfo
  47 + String base64PubKeyInfo = authHeader.substring("Basic ".length());
  48 + // 解码base64
  49 + byte[] decodedBytes = Base64.getDecoder().decode(base64PubKeyInfo);
  50 + String pubKeyInfo = new String(decodedBytes, "UTF-8");
  51 + pubKeyInfo = pubKeyInfo.replace("\\", "");
  52 +
  53 +
  54 + // 分解pubKeyInfo字符串
  55 +
  56 + JsonNode jsonObject = objectMapper.readTree(pubKeyInfo);
  57 +
  58 + int hashAlgo = jsonObject.get("hashAlgo").asInt();
  59 + String pubKeyHash = jsonObject.get("pubKeyHash").asText();
  60 + byte[] pubKeySign = Base64.getDecoder().decode(jsonObject.get("pubKeySign").asText());
  61 +
  62 + // 获取公钥(此处需要替换为实际公钥获取方式)
  63 + PublicKey publicKey = getPublicKey();
  64 +
  65 + // 根据hashAlgo选择摘要算法
  66 + MessageDigest digest;
  67 + Signature verifier;
  68 + switch (hashAlgo) {
  69 + case 1:
  70 + digest = MessageDigest.getInstance("MD5");
  71 + verifier = Signature.getInstance("MD5withRSA");
  72 + break;
  73 + case 2:
  74 + digest = MessageDigest.getInstance("SHA-1");
  75 + verifier = Signature.getInstance("SHA1withRSA");
  76 + break;
  77 + case 3:
  78 + digest = MessageDigest.getInstance("SHA-256");
  79 + verifier = Signature.getInstance("SHA256withRSA");
  80 + break;
  81 + case 4:
  82 + digest = MessageDigest.getInstance("SHA-512");
  83 + verifier = Signature.getInstance("SHA512withRSA");
  84 + break;
  85 + default:
  86 + throw new IllegalArgumentException("Unsupported hash algorithm");
  87 + }
  88 +
  89 + // 验证签名
  90 +
  91 + verifier.initVerify(publicKey);
  92 + verifier.update(pubKeyHash.getBytes());
  93 + boolean isSignatureValid = verifier.verify(pubKeySign);
  94 +
  95 + if (isSignatureValid) {
  96 + // 验证成功
  97 + return true;
  98 + } else {
  99 + // 验证失败
  100 + return false;
  101 + }
  102 + } catch (Exception e) {
  103 + log.error("解析Authorization异常", e);
  104 + return false;
  105 + }
  106 + }
  107 +
  108 +
  109 + public PublicKey getPublicKey() {
  110 + try {
  111 + // Base64解码
  112 + byte[] encoded = Base64.getDecoder().decode(publickey);
  113 + // 生成公钥对象
  114 + X509EncodedKeySpec spec = new X509EncodedKeySpec(encoded);
  115 + KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  116 + return keyFactory.generatePublic(spec);
  117 + } catch (Exception e) {
  118 + log.error("加载公钥异常{}", publickey, e);
  119 + }
  120 + return null;
  121 + }
  122 +
  123 +
  124 + public static String generateSHA1Sign(String jsonString) {
  125 + try {
  126 + log.info("参与签名的字符串:{}", jsonString);
  127 + // Compute the SHA-1 hash of the JSON string
  128 + MessageDigest digest = MessageDigest.getInstance("SHA-1");
  129 + byte[] hashBytes = digest.digest(jsonString.getBytes(StandardCharsets.UTF_8));
  130 +
  131 + // Convert the hash bytes to a hexadecimal string
  132 + String hashHex = new BigInteger(1, hashBytes).toString(16);
  133 +
  134 + // Pad the hexadecimal string to ensure it is 40 characters long
  135 + while (hashHex.length() < 40) {
  136 + hashHex = "0" + hashHex;
  137 + }
  138 +
  139 + // Print the result
  140 + log.info("SHA-1 hash: " + hashHex);
  141 + return hashHex;
  142 + } catch (Exception e) {
  143 + log.error("生成签名异常{}", jsonString, e);
  144 + }
  145 + return null;
  146 + }
  147 +
  148 +
  149 + public static void main(String[] args) throws JsonProcessingException {
  150 + String a="{\\\"hashAlgo\\\": 3, \\\"pubKeyHash\\\": \\\"a1771141fc41757dd3e2876730c2e4960323f3250f91a64d3ddc30c5535a0e8d\\\", \\\"pubKeySign\\\": \\\"u5JJmfldHBpeW5a6aIvw2BSjl5NxLiZMJ0VF/WZSYNimgiSPX8KfucAm3JcVek6P/ox2BVooJlX2D7m+jdLZHO6iJVmME1aa66hLdsKwYT4fZIpXhI3HrWbe5GJkmo9x2Y/qeerG3IXwIrmAJXBmImz33tQO81gB8F7hsiDeok3AS8VNFP9e+/BvxXBYfTfGrGj06c7xTXMIN8ZHHw46nX0C2zpFuZuNumiqE1sUXv4QNSbaslED8wyqiR/KjRYpYFgk58g417BJUhSdAhREbd0+qJ+ug8o+wanQ+bCVyCiDcjzaw23tXzMs5Fa1sk6TOBapUJy5MJGWfIsvzS3IyA==\\\"}";
  151 + System.out.println(Base64.getEncoder().encodeToString(a.getBytes()));
  152 +
  153 + //9585914816779ed6001e5e7fe1fa75aa92f20c26
  154 + //
  155 + //
  156 + String json = "{\"msgID\":\"Q5UB0DR7IQRXQS1952LWXTULP5LTEW8IN0XPXKKENG4MRMDEMMXWNN78OX25SDJGUCH50FPDNM1KS40JZFG9PXXOZOH973QQIIUP2N5A3N619QR7W903J5SSE3HWI8VNT425WDSODPNSEVQ65YYJFCI6700ZATDK50QH4DQ41P7SSKPMJ9XQ3OGHZ9RDPJK6DJ5J12PVK4VDZQQSMRDDBCAMVRQKW2MFTGNWVXHXKVVRF9PBYABP1ZSJVXQ7BHV\",\"msgType\":1,\"IspCode\":\"CUCC\",\"OrgCode\":\"110000\",\"ReqMsgCnt\":{\"TransID\":\"GX8G5ZJG0HZV5EJ28CP2\",\"filePath\":\"/sftpbsau1/tvm_asset_sync\",\"user\":\"sftpbsau1\",\"port\":5048,\"creditType\":1,\"initDelay\":\"1分\",\"updCycle\":\"1时\",\"credit\":\"QWEuMTJJSDdQU0g3\"}}";
  157 + ObjectMapper objectMapper = new ObjectMapper();
  158 + objectMapper.configure(DeserializationFeature.USE_JAVA_ARRAY_FOR_JSON_ARRAY, false);
  159 + LinkedHashMap<String, Object> bigMap = objectMapper.readValue(json, TypeFactory.defaultInstance().constructMapType(LinkedHashMap.class, String.class, Object.class));
  160 +
  161 +
  162 + bigMap.remove("timestamp");
  163 + bigMap.remove("sign");
  164 +
  165 +
  166 + String validSign = generateSHA1Sign(JSON.toJSONString(bigMap));
  167 +
  168 +
  169 + if (!"2f9240fed4707d960c560f9451d3c0ad10ceb771".equals(validSign)) {
  170 + System.out.println("不通过");
  171 + } else {
  172 + System.out.println("通过");
  173 + }
  174 + }
  175 +}
  1 +package com.idss.vulsync.utils;
  2 +
  3 +
  4 +import cloud.agileframework.common.util.file.FileUtil;
  5 +import lombok.extern.slf4j.Slf4j;
  6 +import org.apache.commons.fileupload.FileItem;
  7 +import org.apache.commons.fileupload.FileItemFactory;
  8 +import org.apache.commons.fileupload.disk.DiskFileItemFactory;
  9 +import org.apache.commons.io.IOUtils;
  10 +import org.springframework.http.MediaType;
  11 +import org.springframework.web.multipart.MultipartFile;
  12 +import org.springframework.web.multipart.commons.CommonsMultipartFile;
  13 +
  14 +import java.io.*;
  15 +import java.nio.charset.Charset;
  16 +import java.util.ArrayList;
  17 +import java.util.Enumeration;
  18 +import java.util.List;
  19 +import java.util.zip.ZipEntry;
  20 +import java.util.zip.ZipFile;
  21 +import java.util.zip.ZipInputStream;
  22 +import java.util.zip.ZipOutputStream;
  23 +
  24 +@Slf4j
  25 +public class MultipartFileToFile {
  26 + /**
  27 + * MultipartFile 转 File
  28 + *
  29 + * @param file
  30 + * @throws Exception
  31 + */
  32 + public static File multipartFileToFile(MultipartFile file) throws Exception {
  33 +
  34 + File toFile = null;
  35 + if (file.equals("") || file.getSize() <= 0) {
  36 + file = null;
  37 + } else {
  38 + InputStream ins = null;
  39 + ins = file.getInputStream();
  40 + toFile = new File(file.getOriginalFilename());
  41 + inputStreamToFile(ins, toFile);
  42 + ins.close();
  43 + }
  44 + return toFile;
  45 + }
  46 +
  47 + /**
  48 + * MultipartFile 转 File
  49 + *
  50 + * @param file
  51 + * @throws Exception
  52 + */
  53 + public static File multipartFileToFile(MultipartFile file, String rename) throws Exception {
  54 +
  55 + File toFile = null;
  56 + if (file.equals("") || file.getSize() <= 0) {
  57 + file = null;
  58 + } else {
  59 + InputStream ins = null;
  60 + ins = file.getInputStream();
  61 + toFile = new File(rename);
  62 + inputStreamToFile(ins, toFile);
  63 + ins.close();
  64 + }
  65 + return toFile;
  66 + }
  67 +
  68 + /**
  69 + * MultipartFile 转 File
  70 + *
  71 + * @param file
  72 + * @throws Exception
  73 + */
  74 + public static File multipartFileToFile(MultipartFile file, String path, String rename) throws Exception {
  75 +
  76 + File toFile = null;
  77 + if (file.equals("") || file.getSize() <= 0) {
  78 + file = null;
  79 + } else {
  80 + isFileDir(path + "/");
  81 + InputStream ins = null;
  82 + ins = file.getInputStream();
  83 + toFile = new File(path + "/" + rename);
  84 + inputStreamToFile(ins, toFile);
  85 + ins.close();
  86 + }
  87 + return toFile;
  88 + }
  89 +
  90 + public static void isFileDir(String path) {
  91 + String osName = System.getProperty("os.name");
  92 + //兼容 linux 系统
  93 + if (osName.toLowerCase().startsWith("win")) {
  94 + path = path.replaceAll("/", "\\\\");
  95 + }
  96 + //判断路径是否存在
  97 + File filePath = new File(path);
  98 + if (!filePath.exists()) {
  99 + //不存在,创建目录
  100 + filePath.mkdirs();
  101 + }
  102 +
  103 + }
  104 +
  105 + //获取流文件
  106 + public static void inputStreamToFile(InputStream ins, File file) {
  107 + try {
  108 + OutputStream os = new FileOutputStream(file);
  109 + int bytesRead = 0;
  110 + byte[] buffer = new byte[8192];
  111 + while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
  112 + os.write(buffer, 0, bytesRead);
  113 + }
  114 + os.close();
  115 + ins.close();
  116 + } catch (Exception e) {
  117 + e.printStackTrace();
  118 + }
  119 + }
  120 +
  121 + /**
  122 + * 删除本地临时文件
  123 + *
  124 + * @param file
  125 + */
  126 + public static void deleteTempFile(File file) {
  127 + if (file != null) {
  128 + File del = new File(file.toURI());
  129 + del.delete();
  130 + }
  131 + }
  132 +
  133 + /**
  134 + * 删除本地临时文件
  135 + *
  136 + * @param multipartFile
  137 + */
  138 + public static void deleteTempFile(MultipartFile multipartFile) {
  139 + try {
  140 + File file = multipartFileToFile(multipartFile);
  141 + if (file != null) {
  142 + File del = new File(file.toURI());
  143 + del.delete();
  144 + }
  145 + } catch (Exception e) {
  146 + e.printStackTrace();
  147 + }
  148 + }
  149 +
  150 + /**
  151 + * 将zip文件解压成file集
  152 + *
  153 + * @param multipartFile
  154 + * @return
  155 + * @throws IOException
  156 + */
  157 + public static List<MultipartFile> zipToFiles(MultipartFile multipartFile) {
  158 + //获取文件输入流
  159 + InputStream input = null;
  160 + ZipInputStream zipInputStream = null;
  161 + try {
  162 + input = multipartFile.getInputStream();
  163 + //获取ZIP输入流(一定要指定字符集Charset.forName("GBK")否则会报java.lang.IllegalArgumentException: MALFORMED)
  164 + zipInputStream = new ZipInputStream(new BufferedInputStream(input), Charset.forName("GBK"));
  165 + ZipFile zf = toFile(multipartFile);
  166 + //定义ZipEntry置为null,避免由于重复调用zipInputStream.getNextEntry造成的不必要的问题
  167 + ZipEntry ze = null;
  168 + List<MultipartFile> list = new ArrayList<>();
  169 + //循环遍历
  170 + while ((ze = zipInputStream.getNextEntry()) != null) {
  171 + InputStream is = zf.getInputStream(ze);
  172 + MultipartFile file = getMultipartFile(is, ze.getName());
  173 + list.add(file);
  174 + }
  175 + //一定记得关闭流
  176 + zipInputStream.closeEntry();
  177 + input.close();
  178 + return list;
  179 + } catch (Exception e) {
  180 + try {
  181 + zipInputStream.closeEntry();
  182 + input.close();
  183 + } catch (IOException ex) {
  184 + ex.printStackTrace();
  185 + }
  186 + }
  187 + return null;
  188 + }
  189 +
  190 + public static List<MultipartFile> zipParse(InputStream input) {
  191 + ZipInputStream zipInputStream = null;
  192 + try {
  193 + //将包含压缩包信息的字节数组转化为zipInputStream
  194 + zipInputStream = new ZipInputStream(new BufferedInputStream(input), Charset.forName("GBK"));
  195 + ZipEntry ze = null;
  196 + List<MultipartFile> list = new ArrayList<>();
  197 + while ((ze = zipInputStream.getNextEntry()) != null) {
  198 + ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
  199 + IOUtils.copy(zipInputStream, byteOut);
  200 + InputStream inputStream = new ByteArrayInputStream(byteOut.toByteArray());
  201 + MultipartFile mFile = getMultipartFile(inputStream, ze.getName());
  202 + list.add(mFile);
  203 + byteOut.close();
  204 + inputStream.close();
  205 + }
  206 + zipInputStream.closeEntry();
  207 + input.close();
  208 + return list;
  209 + } catch (Exception e) {
  210 + try {
  211 + zipInputStream.closeEntry();
  212 + input.close();
  213 + } catch (IOException ex) {
  214 + ex.printStackTrace();
  215 + }
  216 + }
  217 + return null;
  218 + }
  219 +
  220 + /**
  221 + * 获取封装得MultipartFile
  222 + *
  223 + * @param inputStream inputStream
  224 + * @param fileName fileName
  225 + * @return MultipartFile
  226 + */
  227 + public static MultipartFile getMultipartFile(InputStream inputStream, String fileName) {
  228 + FileItem fileItem = createFileItem(inputStream, fileName);
  229 + //CommonsMultipartFile是feign对multipartFile的封装,但是要FileItem类对象
  230 + return new CommonsMultipartFile(fileItem);
  231 + }
  232 +
  233 +
  234 + /**
  235 + * FileItem类对象创建
  236 + *
  237 + * @param inputStream inputStream
  238 + * @param fileName fileName
  239 + * @return FileItem
  240 + */
  241 + public static FileItem createFileItem(InputStream inputStream, String fileName) {
  242 + FileItemFactory factory = new DiskFileItemFactory(16, null);
  243 + String textFieldName = "file";
  244 + FileItem item = factory.createItem(textFieldName, MediaType.MULTIPART_FORM_DATA_VALUE, true, fileName);
  245 + int bytesRead = 0;
  246 + byte[] buffer = new byte[8192];
  247 + OutputStream os = null;
  248 + //使用输出流输出输入流的字节
  249 + try {
  250 + os = item.getOutputStream();
  251 + while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {
  252 + os.write(buffer, 0, bytesRead);
  253 + }
  254 + inputStream.close();
  255 + } catch (IOException e) {
  256 +
  257 + throw new IllegalArgumentException("文件上传失败");
  258 + } finally {
  259 + if (os != null) {
  260 + try {
  261 + os.close();
  262 + } catch (IOException e) {
  263 +
  264 + }
  265 + }
  266 + if (inputStream != null) {
  267 + try {
  268 + inputStream.close();
  269 + } catch (IOException e) {
  270 + }
  271 + }
  272 + }
  273 +
  274 + return item;
  275 + }
  276 +
  277 + private static ZipFile toFile(MultipartFile multipartFile) throws Exception {
  278 + if (multipartFile == null || multipartFile.getSize() <= 0) {
  279 + return null;
  280 + }
  281 + File file = multipartFileToFile(multipartFile);
  282 + if (file == null || !file.exists()) {
  283 + return null;
  284 + }
  285 + ZipFile zipFile = new ZipFile(file, Charset.forName("GBK"));
  286 + return zipFile;
  287 + }
  288 +
  289 +
  290 + /**
  291 + * 文件内容写入文件
  292 + *
  293 + * @param zipFileName 文件名不含序号
  294 + */
  295 + public static void writeToFile(File contentLogFile,String zipDir, String zipFileName) {
  296 + //创建文件集合
  297 + List<File> fileList = new ArrayList<>();
  298 + fileList.add(contentLogFile);
  299 + try {
  300 + //压缩文件
  301 + FileUtil.createZip(fileList, zipDir, zipFileName);
  302 + } catch (Exception e) {
  303 + log.error("压缩文件失败", e);
  304 + }
  305 + }
  306 +
  307 + public static List<String> splitZip(String zipDir,String zipName, int chunkSize, String outputDirectory) throws IOException {
  308 + List<String> zipNameList=new ArrayList<>();
  309 + String inputZip=zipDir+"/"+zipName;
  310 + try (ZipFile zipFile = new ZipFile(inputZip+".zip")) {
  311 + Enumeration<? extends ZipEntry> entries = zipFile.entries();
  312 + int partNumber = 1;
  313 + int currentSize = 0;
  314 + ZipOutputStream zos = null;
  315 + FileOutputStream fos = null;
  316 +
  317 + while (entries.hasMoreElements()) {
  318 + ZipEntry entry = entries.nextElement();
  319 + if (zos == null || currentSize >= chunkSize) {
  320 + if (zos != null) {
  321 + zos.close();
  322 + }
  323 + String partFileName = getPartFileName(zipName, partNumber++,outputDirectory);
  324 + fos = new FileOutputStream(partFileName);
  325 + zos = new ZipOutputStream(fos);
  326 + currentSize = 0;
  327 + zipNameList.add(partFileName);
  328 + }
  329 +
  330 + zos.putNextEntry(new ZipEntry(entry.getName()));
  331 + try (InputStream is = zipFile.getInputStream(entry)) {
  332 + byte[] buffer = new byte[1024];
  333 + int len;
  334 + while ((len = is.read(buffer)) > 0) {
  335 + zos.write(buffer, 0, len);
  336 + currentSize += len;
  337 + }
  338 + }
  339 + zos.closeEntry();
  340 + }
  341 +
  342 + if (zos != null) {
  343 + zos.close();
  344 + }
  345 + }
  346 + return zipNameList;
  347 + }
  348 +
  349 + private static String getPartFileName(String zipName, int partNumber,String outputDirectory) {
  350 + return outputDirectory+File.separator+zipName+"_"+String.format("%04d", partNumber)+".zip";
  351 + }
  352 +
  353 +}
  1 +package com.idss.vulsync.utils;
  2 +
  3 +import com.alibaba.fastjson.JSON;
  4 +import lombok.extern.slf4j.Slf4j;
  5 +import org.apache.commons.lang3.StringUtils;
  6 +import org.springframework.beans.factory.annotation.Autowired;
  7 +import org.springframework.data.redis.core.RedisTemplate;
  8 +import org.springframework.stereotype.Component;
  9 +import org.springframework.util.CollectionUtils;
  10 +
  11 +import java.util.Map;
  12 +import java.util.Set;
  13 +import java.util.concurrent.TimeUnit;
  14 +
  15 +@Slf4j
  16 +@Component
  17 +public class RedisUtil {
  18 + @Autowired
  19 + private RedisTemplate redisTemplate;
  20 +
  21 +
  22 + /**
  23 + * 查询键
  24 + *
  25 + * @param key 键 支持ant
  26 + * @return Set
  27 + */
  28 + public Set<String> keys(String key) {
  29 + return redisTemplate.keys(key);
  30 + }
  31 +
  32 + /**
  33 + * 判断key是否存在
  34 + *
  35 + * @param key 键
  36 + * @return true 存在 false不存在
  37 + */
  38 + public boolean hasKey(String key) {
  39 + return redisTemplate.hasKey(key);
  40 + }
  41 +
  42 + /**
  43 + * 删除缓存
  44 + *
  45 + * @param key 可以传一个值 或多个
  46 + */
  47 + public void del(String... key) {
  48 + if (key != null && key.length > 0) {
  49 + boolean delete;
  50 + if (key.length == 1) {
  51 + delete = redisTemplate.delete(key[0]);
  52 + } else {
  53 + delete = 0L < redisTemplate.delete(CollectionUtils.arrayToList(key));
  54 + }
  55 + log.info("@@@@@ del处理key值为{},结果delete信息为:{}", JSON.toJSONString(key), delete);
  56 + }
  57 + }
  58 +
  59 + /**
  60 + * 普通缓存获取
  61 + *
  62 + * @param key 键
  63 + * @return 值
  64 + */
  65 + public Object get(String key) {
  66 + return key == null ? null : redisTemplate.opsForValue().get(key);
  67 + }
  68 +
  69 + /**
  70 + * 普通缓存放入
  71 + *
  72 + * @param key 键
  73 + * @param value 值
  74 + */
  75 + public void set(String key, Object value) {
  76 + redisTemplate.opsForValue().set(key, value);
  77 + }
  78 +
  79 + /**
  80 + * 普通缓存放入并设置时间
  81 + *
  82 + * @param key 键
  83 + * @param value 值
  84 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
  85 + */
  86 + public void set(String key, Object value, TimeUnit timeUnit, long time) {
  87 + if (time > 0) {
  88 + redisTemplate.opsForValue().set(key, value, time, timeUnit);
  89 + } else {
  90 + set(key, value);
  91 + }
  92 + }
  93 +
  94 + /**
  95 + * 普通缓存放入并设置时间(带返回值)
  96 + *
  97 + * @param key key
  98 + * @param value value
  99 + * @param timeUnit timeUnit
  100 + * @param time time
  101 + * @return boolean
  102 + */
  103 + public boolean setIfAbsent(String key, Object value, TimeUnit timeUnit, long time) {
  104 + return redisTemplate.opsForValue().setIfAbsent(key, value, time, timeUnit);
  105 + }
  106 +
  107 + /**
  108 + * 加锁(单次获取)
  109 + *
  110 + * @param lockKey lockKey
  111 + * @param lockValue lockValue
  112 + * @param expireTime expireTime
  113 + * @return boolean
  114 + */
  115 + public boolean tryLockSingle(String lockKey, String lockValue, long expireTime) {
  116 + //SET命令返回true时,则证明加锁成功,设置超时时间间隔,默认超时时间单位为分钟
  117 + return setIfAbsent(lockKey, lockValue, TimeUnit.MINUTES, expireTime);
  118 + }
  119 +
  120 + /**
  121 + * 加锁,无阻塞
  122 + *
  123 + * @param lockKey lockKey
  124 + * @param lockValue lockValue
  125 + * @param expireTime expireTime
  126 + * @return boolean
  127 + */
  128 + public boolean tryLock(String lockKey, String lockValue, long expireTime) throws InterruptedException {
  129 + while (true) {
  130 + String threadName = Thread.currentThread().getName();
  131 + //SET命令返回true时,则证明加锁成功,设置超时时间间隔,默认超时时间单位为分钟
  132 + boolean isExistFlag = setIfAbsent(lockKey, lockValue, TimeUnit.MINUTES, expireTime);
  133 + if (isExistFlag) {
  134 + log.info("@@@@@ 进程ID为[{}],加锁成功!", threadName);
  135 + return true;
  136 + } else {
  137 + log.info("@@@@@ 进程ID为[{}],加锁失败!500毫秒后继续尝试加锁!", threadName);
  138 + //睡100毫秒继续尝试加锁
  139 + TimeUnit.MILLISECONDS.sleep(500);
  140 + }
  141 + }
  142 + }
  143 +
  144 + /**
  145 + * 解锁处理
  146 + *
  147 + * @param lockKey lockKey
  148 + * @param lockValue lockValue
  149 + */
  150 + public void unLock(String lockKey, String lockValue) {
  151 + String threadName = Thread.currentThread().getName();
  152 + try {
  153 + log.info("@@@@@ 进程ID为[{}]准备unLock处理lockKey值为:{},lockValue值为:{}", threadName, lockKey, lockValue);
  154 + String currentValue = (String) get(lockKey);
  155 + log.info("@@@@@ 进程ID为[{}]准备unLock处理currentValue值为:{}", threadName, currentValue);
  156 + if (StringUtils.isNotEmpty(currentValue) && currentValue.equals(lockValue)) {
  157 + del(lockKey);
  158 + }
  159 + } catch (Exception e) {
  160 + log.error("@@@@@ 进程ID为[{}],unLock处理失败!异常信息为:{}", threadName, e.getMessage(), e);
  161 + }
  162 + }
  163 +
  164 + /**
  165 + * 获取hashKey对应的所有键值
  166 + *
  167 + * @param key 键
  168 + * @return 对应的多个键值
  169 + */
  170 + public Map<String, String> getHashMap(String key) {
  171 + return redisTemplate.opsForHash().entries(key);
  172 + }
  173 +}
  1 +package com.idss.vulsync.utils;
  2 +
  3 +import java.io.FileWriter;
  4 +import java.io.IOException;
  5 +import java.security.Key;
  6 +import java.security.KeyPair;
  7 +import java.security.KeyPairGenerator;
  8 +import java.util.Base64;
  9 +
  10 +/**
  11 + * @Author: zc
  12 + * @Date: 2024/8/29 15:51
  13 + */
  14 +public class RsaUtils {
  15 + public static void main(String[] args) throws Exception {
  16 + generateRSAPemKeyFiles();
  17 + }
  18 +
  19 + /**
  20 + * 生成RSA pem格式的公私钥文件
  21 + *
  22 + * @throws Exception
  23 + */
  24 + private static void generateRSAPemKeyFiles() throws Exception {
  25 + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
  26 + keyPairGenerator.initialize(4096);
  27 + KeyPair keyPair = keyPairGenerator.generateKeyPair();
  28 +
  29 + savePrivatePemFile(keyPair.getPrivate(), "E:\\工作\\资管探针\\idss\\打包\\测试141\\北京联通\\漏管对接\\资管侧接口程序密钥\\private_key.pem");
  30 + savePublicPemFile(keyPair.getPublic(), "E:\\工作\\资管探针\\idss\\打包\\测试141\\北京联通\\漏管对接\\资管侧接口程序密钥\\public_key.pem");
  31 + }
  32 +
  33 + private static void savePrivatePemFile(Key key, String filename)
  34 + throws IOException {
  35 + String encoded = Base64.getEncoder().encodeToString(key.getEncoded());
  36 +
  37 + FileWriter fileWriter = null;
  38 + try {
  39 + fileWriter = new FileWriter(filename);
  40 + fileWriter.write("-----BEGIN PRIVATE KEY-----\n");
  41 + fileWriter.write(encoded);
  42 + fileWriter.write("\n-----END PRIVATE KEY-----");
  43 + } finally {
  44 + if (null != fileWriter) {
  45 + fileWriter.close();
  46 + }
  47 + }
  48 + }
  49 +
  50 + private static void savePublicPemFile(Key key, String filename)
  51 + throws IOException {
  52 + String encoded = Base64.getEncoder().encodeToString(key.getEncoded());
  53 +
  54 + FileWriter fileWriter = null;
  55 + try {
  56 + fileWriter = new FileWriter(filename);
  57 + fileWriter.write("-----BEGIN PUBLIC KEY-----\n");
  58 + fileWriter.write(encoded);
  59 + fileWriter.write("\n-----END PUBLIC KEY-----");
  60 + } finally {
  61 + if (null != fileWriter) {
  62 + fileWriter.close();
  63 + }
  64 + }
  65 + }
  66 +
  67 +}
  1 +package com.idss.vulsync.utils;
  2 +import cn.hutool.core.util.ObjectUtil;
  3 +import com.jcraft.jsch.*;
  4 +import lombok.extern.slf4j.Slf4j;
  5 +import org.apache.commons.io.IOUtils;
  6 +
  7 +import java.io.*;
  8 +import java.util.Vector;
  9 +
  10 +/**
  11 + * FTP服务器工具类:
  12 + * JSch类 通过 SFTP 协议上传文件到 freeSSHd 服务器
  13 + *
  14 + */
  15 +@Slf4j
  16 +public class SftpUtil {
  17 +
  18 + private ChannelSftp sftp;
  19 +
  20 + private Session session;
  21 +
  22 + /**
  23 + * 用户名
  24 + */
  25 + private String username;
  26 +
  27 + /**
  28 + * 密码
  29 + */
  30 + private String password;
  31 +
  32 + /**
  33 + * 秘钥
  34 + */
  35 + private String privateKey;
  36 +
  37 + /**
  38 + * FTP服务器Ip
  39 + */
  40 + private String host;
  41 +
  42 + /**
  43 + * FTP服务器端口号
  44 + */
  45 + private int port;
  46 +
  47 + /**
  48 + * 构造器:基于密码认证sftp对象
  49 + * @param username 用户名
  50 + * @param password 密码
  51 + * @param host 服务器ip
  52 + * @param port 服务器端口号
  53 + */
  54 + public SftpUtil(String username, String password, String host, int port){
  55 + this.username = username;
  56 + this.password = password;
  57 + this.host = host;
  58 + this.port = port;
  59 + }
  60 +
  61 + /**
  62 + * 构造器:基于秘钥认证sftp对象
  63 + * @param username 用户名
  64 + * @param privateKey 秘钥
  65 + * @param host 服务器ip
  66 + * @param port 服务器端口号
  67 + */
  68 + public SftpUtil(String username, String privateKey, int port, String host){
  69 + this.username = username;
  70 + this.privateKey = privateKey;
  71 + this.host = host;
  72 + this.port = port;
  73 + }
  74 +
  75 + /**
  76 + * 连接SFTP服务器
  77 + */
  78 + public boolean login(){
  79 + JSch jsch = new JSch();
  80 + try{
  81 + if(privateKey != null){
  82 + //设置登陆主机的秘钥
  83 + jsch.addIdentity(privateKey);
  84 + }
  85 + //采用指定的端口连接服务器
  86 + session = jsch.getSession(username,host,port);
  87 + if(password != null){
  88 + //设置登陆主机的密码
  89 + session.setPassword(password);
  90 + }
  91 + //优先使用 password 验证 注:session.connect()性能低,使用password验证可跳过gssapi认证,提升连接服务器速度
  92 + session.setConfig("PreferredAuthentications","password");
  93 + //设置第一次登陆的时候提示,可选值:(ask | yes | no)
  94 + session.setConfig("StrictHostKeyChecking","no");
  95 + session.connect();
  96 + //创建sftp通信通道
  97 + Channel channel = session.openChannel("sftp");
  98 + channel.connect();
  99 + sftp = (ChannelSftp) channel;
  100 + log.info("sftp server connect success !!");
  101 + }catch (JSchException e){
  102 + log.error("SFTP服务器连接异常!!", e);
  103 + return false;
  104 + }
  105 + return true;
  106 + }
  107 +
  108 + /**
  109 + * 关闭SFTP连接
  110 + */
  111 + public void logout(){
  112 + if(sftp != null){
  113 + if(sftp.isConnected()){
  114 + sftp.disconnect();
  115 + log.info("sftp is close already");
  116 + }
  117 + }
  118 + if(session != null){
  119 + if(session.isConnected()){
  120 + session.disconnect();
  121 + log.info("session is close already");
  122 + }
  123 + }
  124 + }
  125 +
  126 + /**
  127 + * 将输入流上传到SFTP服务器,作为文件
  128 + *
  129 + * @param directory 上传到SFTP服务器的路径
  130 + * @param sftpFileName 上传到SFTP服务器后的文件名
  131 + * @param input 输入流
  132 + * @throws SftpException
  133 + */
  134 + public void upload(String directory, String sftpFileName, InputStream input) throws SftpException {
  135 + long start = System.currentTimeMillis();
  136 + try{
  137 + //如果文件夹不存在,则创建文件夹
  138 + if(sftp.ls(directory) == null){
  139 + sftp.mkdir(directory);
  140 + }
  141 + //切换到指定文件夹
  142 + sftp.cd(directory);
  143 + }catch (SftpException e){
  144 + //创建不存在的文件夹,并切换到文件夹
  145 + sftp.mkdir(directory);
  146 + sftp.cd(directory);
  147 + }
  148 + sftp.put(input, sftpFileName+".tmp");
  149 + sftp.rename(sftpFileName+".tmp", sftpFileName);
  150 + log.info("文件上传成功!! 耗时:{}ms",(System.currentTimeMillis() - start));
  151 + }
  152 +
  153 + /**
  154 + * 上传单个文件
  155 + *
  156 + * @param directory 上传到SFTP服务器的路径
  157 + * @param uploadFileUrl 文件路径
  158 + */
  159 + public void upload(String directory, String uploadFileUrl){
  160 + File file = new File(uploadFileUrl);
  161 + try{
  162 + upload(directory, file.getName(), new FileInputStream(file));
  163 + }catch (FileNotFoundException | SftpException e){
  164 + log.error("上传文件异常!", e);
  165 + }
  166 + }
  167 +
  168 + /**
  169 + * 上传单个文件,自定义名称
  170 + *
  171 + * @param directory 上传到SFTP服务器的路径
  172 + * @param uploadFileUrl 文件路径
  173 + */
  174 + public void upload(String directory,String fileName, String uploadFileUrl){
  175 + File file = new File(uploadFileUrl);
  176 + if(ObjectUtil.isEmpty(fileName)){
  177 + fileName=file.getName();
  178 + }
  179 + try{
  180 + upload(directory, fileName, new FileInputStream(file));
  181 + }catch (FileNotFoundException | SftpException e){
  182 + log.error("上传文件异常!", e);
  183 + }
  184 + }
  185 +
  186 + /**
  187 + * 将byte[] 上传到SFTP服务器,作为文件
  188 + * 注: 从String转换成byte[] 需要指定字符集
  189 + *
  190 + * @param directory 上传到SFTP服务器的路径
  191 + * @param sftpFileName 上传SFTP服务器后的文件名
  192 + * @param bytes 字节数组
  193 + */
  194 + public void upload(String directory, String sftpFileName, byte[] bytes){
  195 + try{
  196 + upload(directory, sftpFileName, new ByteArrayInputStream(bytes));
  197 + }catch (SftpException e){
  198 + log.error("上传文件异常!", e);
  199 + }
  200 + }
  201 +
  202 + /**
  203 + * 将字符串按照指定编码格式上传到SFTP服务器
  204 + *
  205 + * @param directory 上传到SFTP服务器的路径
  206 + * @param sftpFileName 上传SFTP服务器后的文件名
  207 + * @param dataStr 字符串
  208 + * @param charsetName 字符串的编码格式
  209 + */
  210 + public void upload(String directory, String sftpFileName, String dataStr, String charsetName){
  211 + try{
  212 + upload(directory, sftpFileName, new ByteArrayInputStream(dataStr.getBytes(charsetName)));
  213 + }catch (UnsupportedEncodingException | SftpException e){
  214 + log.error("上传文件异常!", e);
  215 + }
  216 + }
  217 +
  218 + /**
  219 + * 下载文件
  220 + *
  221 + * @param directory SFTP服务器的文件路径
  222 + * @param downloadFile SFTP服务器上的文件名
  223 + * @param saveFile 保存到本地路径
  224 + */
  225 + public void download(String directory, String downloadFile, String saveFile){
  226 + try{
  227 + if(directory != null && !"".equals(directory)){
  228 + sftp.cd(directory);
  229 + }
  230 + File file = new File(saveFile);
  231 + sftp.get(downloadFile, new FileOutputStream(file));
  232 + }catch (SftpException | FileNotFoundException e){
  233 + log.error("文件下载异常!", e);
  234 + }
  235 + }
  236 +
  237 + /**
  238 + * 下载文件
  239 + *
  240 + * @param directory SFTP服务器的文件路径
  241 + * @param downloadFile SFTP服务器上的文件名
  242 + * @return 字节数组
  243 + */
  244 + public byte[] download(String directory, String downloadFile){
  245 + try{
  246 + if(directory != null && !"".equals(directory)){
  247 + sftp.cd(directory);
  248 + }
  249 + InputStream inputStream = sftp.get(downloadFile);
  250 + return IOUtils.toByteArray(inputStream);
  251 + }catch (SftpException | IOException e){
  252 + log.error("文件下载异常!", e);
  253 + }
  254 + return null;
  255 + }
  256 +
  257 + /**
  258 + * 下载文件
  259 + *
  260 + * @param directory SFTP服务器的文件路径
  261 + * @param downloadFile SFTP服务器上的文件名
  262 + * @return 输入流
  263 + */
  264 + public InputStream downloadStream(String directory, String downloadFile){
  265 + try{
  266 + if(directory != null && !"".equals(directory)){
  267 + sftp.cd(directory);
  268 + }
  269 + return sftp.get(downloadFile);
  270 + }catch (SftpException e){
  271 + log.error("文件下载异常!", e);
  272 + }
  273 + return null;
  274 + }
  275 +
  276 +// /**
  277 +// * 删除文件
  278 +// *
  279 +// * @param directory SFTP服务器的文件路径
  280 +// * @param deleteFileName 删除的文件名称
  281 +// */
  282 +// public void delete(String directory, String deleteFileName){
  283 +// try{
  284 +// sftp.cd(directory);
  285 +// sftp.rm(deleteFileName);
  286 +// }catch (SftpException e){
  287 +// log.error("文件删除异常!", e);
  288 +// }
  289 +// }
  290 +//
  291 +// /**
  292 +// * 删除文件夹(有问题:remove(0)不一定删除的是上级目录和根目录)
  293 +// *
  294 +// * @param directory SFTP服务器的文件路径
  295 +// */
  296 +// public void delete(String directory){
  297 +// Vector vector = listFiles(directory);
  298 +// vector.remove(0);
  299 +// vector.remove(0);
  300 +// for(Object v : vector){
  301 +// ChannelSftp.LsEntry lsEntry = (ChannelSftp.LsEntry)v;
  302 +// try{
  303 +// sftp.cd(directory);
  304 +// sftp.rm(lsEntry.getFilename());
  305 +// }catch (SftpException e){
  306 +// log.error("文件删除异常!", e);
  307 +// }
  308 +// }
  309 +// }
  310 +
  311 + /**
  312 + * 获取文件夹下的文件
  313 + *
  314 + * @param directory 路径
  315 + * @return
  316 + */
  317 + public Vector<?> listFiles(String directory){
  318 + try{
  319 + if(isDirExist(directory)){
  320 + Vector<?> vector = sftp.ls(directory);
  321 +// //移除上级目录和根目录:"." ".."
  322 +// vector.remove(0); //不适用
  323 +// vector.remove(0);
  324 +
  325 +// for (Object object : vector) {
  326 +// if (object instanceof ChannelSftp.LsEntry) {
  327 +// ChannelSftp.LsEntry lsEntry = (ChannelSftp.LsEntry) object;
  328 +// String fileName = lsEntry.getFilename();
  329 +// if (StringUtils.equals(fileName,".")||StringUtils.equals(fileName,"..")) {
  330 +// vector.remove(object);
  331 +// }
  332 +// }
  333 +// }
  334 + return vector;
  335 + }
  336 + }catch (SftpException e){
  337 + log.error("获取文件夹信息异常!", e);
  338 + }
  339 + return null;
  340 + }
  341 +
  342 + /**
  343 + * 检测文件夹是否存在
  344 + *
  345 + * @param directory 路径
  346 + * @return
  347 + */
  348 + public boolean booleanUrl(String directory){
  349 + try{
  350 + if(sftp.ls(directory) == null){
  351 + return false;
  352 + }
  353 + }catch (Exception e){
  354 + log.error("检测文件夹异常!", e);
  355 + }
  356 + return true;
  357 + }
  358 +
  359 + /**
  360 + * 创建一个文件目录
  361 + *
  362 + * @param createpath 路径
  363 + * @return
  364 + */
  365 + public boolean createDir(String createpath) {
  366 + try {
  367 + if (isDirExist(createpath)) {
  368 + this.sftp.cd(createpath);
  369 + return true;
  370 + }
  371 + String pathArry[] = createpath.split("/");
  372 + StringBuffer filePath = new StringBuffer("/");
  373 + for (String path : pathArry) {
  374 + if (path.equals("")) {
  375 + continue;
  376 + }
  377 + filePath.append(path + "/");
  378 + if (isDirExist(filePath.toString())) {
  379 + sftp.cd(filePath.toString());
  380 + } else {
  381 + // 建立目录
  382 + sftp.mkdir(filePath.toString());
  383 + // 进入并设置为当前目录
  384 + sftp.cd(filePath.toString());
  385 + }
  386 + }
  387 + this.sftp.cd(createpath);
  388 + } catch (SftpException e) {
  389 + log.error("目录创建异常!", e);
  390 + return false;
  391 + }
  392 + return true;
  393 + }
  394 +
  395 + /**
  396 + * 判断目录是否存在
  397 + * @param directory 路径
  398 + * @return
  399 + */
  400 + public boolean isDirExist(String directory) {
  401 + boolean isDirExistFlag = false;
  402 + try {
  403 + SftpATTRS sftpATTRS = this.sftp.lstat(directory);
  404 + isDirExistFlag = true;
  405 + return sftpATTRS.isDir();
  406 + } catch (Exception e) {
  407 + if (e.getMessage().toLowerCase().equals("no such file")) {
  408 + isDirExistFlag = false;
  409 + }
  410 + log.error("目录不存在:"+directory);
  411 + }
  412 + return isDirExistFlag;
  413 + }
  414 +
  415 + /**
  416 + * 方法功能说明:目录不存在时创建目录
  417 + * @参数: @param path
  418 + * @return void
  419 + * @throws
  420 + */
  421 + public void mkdirs(String path){
  422 + File file = new File(path);
  423 + String fs = file.getParent();
  424 + file = new File(fs);
  425 + if(!file.exists()){
  426 + file.mkdirs();
  427 + }
  428 + }
  429 + /**
  430 + * 判断文件或目录是否存在
  431 + * @return
  432 + */
  433 + public boolean isExist(String path, ChannelSftp sftp){
  434 + boolean isExist=false;
  435 + try {
  436 + sftp.lstat(path);
  437 + isExist = true;
  438 + } catch (Exception e) {
  439 + if (e.getMessage().toLowerCase().equals("no such file")) {
  440 + isExist = false;
  441 + }
  442 + }
  443 + return isExist;
  444 + }
  445 +}
Please register or login to post a comment