This commit is contained in:
waner 2025-05-15 13:58:53 +08:00
parent b7cd62a872
commit f8bf4b10fb
4 changed files with 70 additions and 59 deletions

33
pom.xml
View File

@ -94,33 +94,12 @@
<artifactId>gson</artifactId> <artifactId>gson</artifactId>
<version>2.13.1</version> <version>2.13.1</version>
</dependency> </dependency>
<dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 --> <groupId>ch.qos.logback</groupId>
<!-- <dependency>--> <artifactId>logback-classic</artifactId>
<!-- <groupId>org.apache.commons</groupId>--> <version>1.3.15</version>
<!-- <artifactId>commons-collections4</artifactId>--> <scope>compile</scope>
<!-- <version>4.5.0</version>--> </dependency>
<!-- </dependency>-->
<!-- &lt;!&ndash; https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>org.apache.commons</groupId>-->
<!-- <artifactId>commons-lang3</artifactId>-->
<!-- <version>3.17.0</version>-->
<!-- </dependency>-->
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<!-- <dependency>-->
<!-- <groupId>org.slf4j</groupId>-->
<!-- <artifactId>slf4j-api</artifactId>-->
<!-- <version>1.7.36</version>-->
<!-- </dependency>-->
<!-- &lt;!&ndash; https://mvnrepository.com/artifact/ch.qos.logback/logback-classic &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>ch.qos.logback</groupId>-->
<!-- <artifactId>logback-classic</artifactId>-->
<!-- <version>1.3.15</version>-->
<!-- <scope>compile</scope>-->
<!-- </dependency>-->
<!--<dependency>--> <!--<dependency>-->
<!--<groupId>club.fullstack</groupId>--> <!--<groupId>club.fullstack</groupId>-->

View File

@ -1,6 +1,8 @@
package com.sunyard.snmp; package com.sunyard.snmp;
import org.snmp4j.*; import org.snmp4j.*;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.event.ResponseListener;
import org.snmp4j.mp.*; import org.snmp4j.mp.*;
import org.snmp4j.security.*; import org.snmp4j.security.*;
import org.snmp4j.smi.*; import org.snmp4j.smi.*;
@ -40,33 +42,35 @@ public class SnmpTrapSender implements AutoCloseable{
snmp.listen(); snmp.listen();
} }
public void sendTrap(String message, int severity) throws IOException { public ResponseEvent sendTrap(String message, int severity) throws IOException {
ResponseEvent event = null;
switch (version) { switch (version) {
case SnmpConstants.version1: case SnmpConstants.version1:
sendV1Trap(message, severity); event = sendV1Trap(message, severity);
break; break;
case SnmpConstants.version2c: case SnmpConstants.version2c:
sendV2Trap(message, severity); event = sendV2Trap(message, severity);
break; break;
default: default:
throw new IllegalArgumentException("不支持的SNMP版本"); throw new IllegalArgumentException("不支持的SNMP版本");
} }
return event;
} }
private void sendV1Trap(String message, int severity) throws IOException { private ResponseEvent sendV1Trap(String message, int severity) throws IOException {
CommunityTarget target = createCommunityTarget(SnmpConstants.version1); CommunityTarget target = createCommunityTarget(SnmpConstants.version1);
PDUv1 pdu = new PDUv1(); PDUv1 pdu = new PDUv1();
configureCommonTrap(pdu, message, severity); configureCommonTrap(pdu, message, severity);
pdu.setGenericTrap(PDUv1.ENTERPRISE_SPECIFIC); pdu.setGenericTrap(PDUv1.ENTERPRISE_SPECIFIC);
snmp.send(pdu, target); return snmp.send(pdu, target);
} }
private void sendV2Trap(String message, int severity) throws IOException { private ResponseEvent sendV2Trap(String message, int severity) throws IOException {
CommunityTarget target = createCommunityTarget(SnmpConstants.version2c); CommunityTarget target = createCommunityTarget(SnmpConstants.version2c);
PDU pdu = new PDU(); PDU pdu = new PDU();
configureCommonTrap(pdu, message, severity); configureCommonTrap(pdu, message, severity);
pdu.setType(PDU.TRAP); pdu.setType(PDU.TRAP);
snmp.send(pdu, target); return snmp.send(pdu, target);
} }

View File

@ -30,6 +30,11 @@ import org.bouncycastle.asn1.cms.ContentInfo;
import org.bouncycastle.cms.SydCmsUtil; import org.bouncycastle.cms.SydCmsUtil;
import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils; import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.snmp4j.PDU;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import racal.sunyard.main.dto.DTO77; import racal.sunyard.main.dto.DTO77;
import racal.sunyard.main.dto.DTO78; import racal.sunyard.main.dto.DTO78;
import racal.sunyard.main.dto.DTO79; import racal.sunyard.main.dto.DTO79;
@ -61,6 +66,8 @@ import static org.bouncycastle.asn1.ASN1Encoding.DL;
public class SydApi4j implements SydApi { public class SydApi4j implements SydApi {
private final static Logger log = LoggerFactory.getLogger(SydApi4j.class);
static { static {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
} }
@ -1320,19 +1327,31 @@ public class SydApi4j implements SydApi {
addressList.stream().map(p -> createTaskContext(p, timeout, cert)).collect(Collectors.toList()); addressList.stream().map(p -> createTaskContext(p, timeout, cert)).collect(Collectors.toList());
AsyncTaskExecutor executor = new AsyncTaskExecutor(); AsyncTaskExecutor executor = new AsyncTaskExecutor();
List<TaskOutcome<String>> taskOutcomes = executor.execBatchTasks(taskContexts); List<TaskOutcome<String>> taskOutcomes = executor.execBatchTasks(taskContexts);
executor.shutdown();
//失败的记录日志 //失败的记录日志
List<String> failures = new ArrayList<>(); List<String> failures = new ArrayList<>();
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("日期:").append(LocalDateTime.now()).append("\n");
for (TaskOutcome<String> taskOutcome : taskOutcomes) { for (TaskOutcome<String> taskOutcome : taskOutcomes) {
if (!taskOutcome.isSuccess()) { if (!taskOutcome.isSuccess()) {
failures.add(taskOutcome.getContext().getAddress()); failures.add(taskOutcome.getContext().getAddress());
stringBuilder.append("ip:").append(taskOutcome.getContext().getAddress()).append("/证书导入失败:").append(taskOutcome.getError().getMessage()).append("\n"); stringBuilder.append("签名服务器:").append(taskOutcome.getContext().getAddress()).append("/导入失败:").append(taskOutcome.getError().getMessage()).append("\n");
} }
} }
if (!failures.isEmpty()) { if (!failures.isEmpty()) {
String dn = "";
String serialNumber = "";
X509Certificate certificate = null;
try {
certificate = CertUtil.convertToX509Cert(cert);
dn = certificate.getSubjectDN().toString();
serialNumber = certificate.getSerialNumber().toString();
} catch (Exception e) {
log.info("证书格式错误!");
}
//记录失败日志 //记录失败日志
stringBuilder.append("行号:").append(bkCode).append("\n").append("证书:").append(cert); stringBuilder.append("行号:").append(bkCode).append("\n").append("DN").append(dn)
.append("\n序列号").append(serialNumber).append("\n证书").append(cert);
log.warn("证书导入失败!\n{}", stringBuilder);
//异步发送snmp trap消息 //异步发送snmp trap消息
String result = "[" + failures.stream() String result = "[" + failures.stream()
.map(Object::toString) .map(Object::toString)
@ -1342,12 +1361,20 @@ public class SydApi4j implements SydApi {
Gson gson = new Gson(); Gson gson = new Gson();
Map<String, String> map = gson.fromJson(snmpConfig, new TypeToken<Map<String, String>>() {}.getType()); Map<String, String> map = gson.fromJson(snmpConfig, new TypeToken<Map<String, String>>() {}.getType());
try (SnmpTrapSender sender = new SnmpTrapSender(map)) { try (SnmpTrapSender sender = new SnmpTrapSender(map)) {
sender.sendTrap(message, 2); ResponseEvent event = sender.sendTrap(message, 2);
System.out.println("snmp告警消息发送成功:" + message); log.info("snmp告警消息发送成功:{}", message);
} catch (IOException e) { // if (event != null && event.getResponse() != null) {
System.out.println("snmp告警消息发送失败:" + e.getMessage()); // PDU response = event.getResponse();
// if (response.getErrorStatus() == PDU.noError) {
// log.info("snmp告警消息发送成功:{}/响应数据:{}", message, response.getVariableBindings());
// } else {
// log.info("snmp告警消息发送失败:{}", SnmpConstants.mpErrorMessage(response.getErrorStatus()));
// }
// }
} catch (Exception e) {
log.warn("snmp告警消息发送失败:{}", e.getMessage());
} }
throw new SydApiException(String.valueOf(stringBuilder), 56300, true); throw new SydApiException("证书导入失败!", 56300, true);
} }
} }

View File

@ -98,22 +98,22 @@ public class Test4NongxinCW {
"-----END CERTIFICATE-----"; "-----END CERTIFICATE-----";
String cert = "-----BEGIN CERTIFICATE-----\n" + String cert = "-----BEGIN CERTIFICATE-----\n" +
"MIICITCCAcWgAwIBAgIGAZbD4M8uMAwGCCqBHM9VAYN1BQAwSzELMAkGA1UEBhMC\n" + "MIICMDCCAdagAwIBAgIJAOWoGwJCnjlLMAoGCCqBHM9VAYN1MGcxCzAJBgNVBAYT\n" +
"Q04xDjAMBgNVBAoTBUdNU1NMMRAwDgYDVQQLEwdQS0kvU00yMRowGAYDVQQDExFN\n" + "AkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdIYWlEaWFuMRMwEQYDVQQK\n" +
"aWRkbGVDQSBmb3IgVGVzdDAiGA8yMDI1MDUxMTE2MDAwMFoYDzIwMjYwNTExMTYw\n" + "DApHTUNlcnQub3JnMR8wHQYDVQQDDBZHTUNlcnQgR00gUm9vdCBDQSAtIDAxMB4X\n" +
"MDAwWjBQMQswCQYDVQQGDAJDTjERMA8GA1UECAwIaGFuZ3pob3UxETAPBgNVBAcM\n" + "DTI1MDUxMzAyMzUxM1oXDTI2MDUxMzAyMzUxM1owRTELMAkGA1UEBgwCQ04xCzAJ\n" +
"CGhhbmd6aG91MQwwCgYDVQQKDANzc3MxDTALBgNVBAMMBHNzc3MwWTATBgcqhkjO\n" + "BgNVBAgMAnp6MQswCQYDVQQHDAJ6ejEMMAoGA1UECgwDenp6MQ4wDAYDVQQDDAV6\n" +
"PQIBBggqgRzPVQGCLQNCAARGnQQLJSiMkoH2iCqbsTpGkZmHPCP7ThQQmzf1m8jr\n" + "enp6ejBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABK5fyRSACWPIBBr/3U+qvjvp\n" +
"NjgMzBJ0p2rXJQSglaVqaVcaL/ox5wfV8okIavToNQjao4GJMIGGMBsGA1UdIwQU\n" + "niropv2PrA3ZLU1bG8vQpwAEMA0kwyqGgXURBPbvWdAhN7s9wfvHbJyMd9CMZGqj\n" +
"MBKAEPl/VbQnlDNiplbKb8xdGv8wGQYDVR0OBBIEEMu/aP+Gw3PMakxFSVzC5MYw\n" + "gYwwgYkwDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMCB4AwLAYJYIZIAYb4QgENBB8W\n" +
"MQYIKwYBBQUHAQEEJTAjMCEGCCsGAQUFBzABhhVodHRwczovL29jc3AuZ21zc2wu\n" + "HUdNQ2VydC5vcmcgU2lnbmVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBSQB7UUqEuG\n" +
"Y24wCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCAMAwDAYIKoEcz1UBg3UFAANIADBF\n" + "kl4mrx3MAhKTptfbYjAfBgNVHSMEGDAWgBR/Wl47AIRZKg+YvqEObzmVQxBNBzAK\n" +
"AiEAnoN1iWj1Cv6M4eUtSt2XEoKpswLTEy7gczIn/ZTI+JYCIB2but+jsuUD6Udp\n" + "BggqgRzPVQGDdQNIADBFAiEA4kgTdn/iA/XYfjTEeOcELwBXd0tTFghkpfP8DhBF\n" +
"uFp7xVvOp8IKQyazXx9bA4N9PbLo\n" + "KFQCIAXZTL6VPtW67tM/DF4ZgFt5S/YIiFombKa2bWOfL81u\n" +
"-----END CERTIFICATE-----"; "-----END CERTIFICATE-----";;
//将证书导入设备获取证书主题 //将证书导入设备获取证书主题
String dn = api.importCertAndGetDN(certBySign); String dn = api.importCertAndGetDN(cert);
System.out.println("导入证书主题为:"+dn); System.out.println("导入证书主题为:"+dn);
@ -224,19 +224,20 @@ public class Test4NongxinCW {
"-----END CERTIFICATE-----"; "-----END CERTIFICATE-----";
List<String> masterNodes = new ArrayList<>(); List<String> masterNodes = new ArrayList<>();
// masterNodes.add("172.16.18.99:8889"); // masterNodes.add("172.16.18.99:8889");
masterNodes.add("172.16.18.5:8889"); // masterNodes.add("172.16.18.5:8889");
masterNodes.add("172.16.18.6:8889"); masterNodes.add("172.16.18.6:8889");
// masterNodes.add("172.16.18.7:8889"); // masterNodes.add("172.16.18.7:8889");
// masterNodes.add("172.16.18.8:8889"); // masterNodes.add("172.16.18.8:8889");
int timeout = 1000; int timeout = 1;
Map<String, String> map = new HashMap<>(); Map<String, String> map = new HashMap<>();
map.put("snmp.target.ip", "172.16.18.113"); map.put("snmp.target.ip", "172.16.18.113");
map.put("snmp.target.port", "162"); map.put("snmp.target.port", "162");
map.put("enterprise.oid", "1.3.6.1.4.1.9999"); map.put("enterprise.oid", "1.3.6.1.4.1.9999");
map.put("snmp.community", "public"); map.put("snmp.community", "public");
map.put("snmp.version", "1"); map.put("snmp.version", "1");
String snmpConfig = new Gson().toJson(map);
SydApi4j sydApi4j = new SydApi4j(); SydApi4j sydApi4j = new SydApi4j();
sydApi4j.importCertToServers(new ArrayList<>(), timeout, cert1, "12345678", new Gson().toJson(map)); sydApi4j.importCertToServers(masterNodes, timeout, cert, "12345678", snmpConfig);
stopWatch.stop(); stopWatch.stop();
System.out.println(stopWatch.getTotalTimeSeconds()); System.out.println(stopWatch.getTotalTimeSeconds());
} }