This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
nms-nmsserver/src/com/nms/server/util/SNMP4JUtils.java
2018-10-10 19:17:04 +08:00

541 lines
22 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.nms.server.util;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.Vector;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.snmp4j.CommunityTarget;
import org.snmp4j.DefaultTimeoutModel;
import org.snmp4j.PDU;
import org.snmp4j.ScopedPDU;
import org.snmp4j.Snmp;
import org.snmp4j.Target;
import org.snmp4j.TransportMapping;
import org.snmp4j.UserTarget;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.MPv1;
import org.snmp4j.mp.MPv2c;
import org.snmp4j.mp.MPv3;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.security.AuthMD5;
import org.snmp4j.security.AuthSHA;
import org.snmp4j.security.PrivAES128;
import org.snmp4j.security.PrivAES192;
import org.snmp4j.security.PrivAES256;
import org.snmp4j.security.PrivDES;
import org.snmp4j.security.SecurityLevel;
import org.snmp4j.security.SecurityModels;
import org.snmp4j.security.SecurityProtocols;
import org.snmp4j.security.USM;
import org.snmp4j.security.UsmUser;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.DefaultPDUFactory;
import org.snmp4j.util.TreeEvent;
import org.snmp4j.util.TreeUtils;
import com.nms.server.common.Common;
import com.nms.server.common.Constants;
/**
* 最近项目上用到了SNMP操作在网上找了找有关java操作SNMP 的例子发现原创的非常少,要么就是不完整。
* 看了一下SNMP4J的文档自己写了一个工具类
* @author Administrator
*
*/
public class SNMP4JUtils {
private static Logger logger = Logger.getLogger(SNMP4JUtils.class);
public static final String ROOT="WALK";
private static final Integer C_P_RETRIES=0;
private static final Integer C_P_TIME_OUT=7000;
private static final String C_P_COMMUNITY="public";
private static final int C_P_VERSION = SnmpConstants.version2c;
private static final Snmp snmp = createSnmp();
/**
*
* @param datas
* @param oids
* @param snmp
* @param target
* @throws Exception
*/
public static void snmpGet(Map<String,String> datas,String[] oids,Target target) throws Exception{
if(target.getVersion() == SnmpConstants.version3){
snmpGetV3(datas,oids,target,Constants.SNMP_V3_SECURITY_NAME);
}else{
snmpGetV2(datas,oids,snmp,target);
}
}
/**
*
* @param datas
* @param oids
* @param snmp
* @param target
* @throws Exception
*/
public static void snmpGetV2(Map<String,String> datas,String[] oids,Snmp snmp,Target target) throws Exception{
PDU request = createPDU(PDU.GET);
for(String oid :oids ){
if((oid.toString()).endsWith(".0"))
request.add(new VariableBinding(new OID(oid)));
else{
// throw new Exception(oid+" 为非基本节点");
throw new Exception(oid+" is not basic node");
}
}
ResponseEvent respEvent = snmp.send(request, target);
PDU response = respEvent.getResponse();
// if(isNullPDU(response,"SNMP4J 响应结果为空")){
if(isNullPDU(response,"The result of the SNMP4J response is empty")){
return;
}
if(response.getErrorIndex()==PDU.noError&&response.getErrorStatus()==PDU.noError){
Vector<VariableBinding> vector = (Vector<VariableBinding>) response.getVariableBindings();
for(VariableBinding vb : vector){
String key = vb.getOid().toString();
datas.put(key,vb.getVariable().toString());
//pl(key+" 88 "+vb.getVariable().toString());
}
}else{
// throw new Exception("错误信息:"+response.getErrorStatusText());
throw new Exception("Error information:"+response.getErrorStatusText());
}
}
public static void snmpGetV3(Map<String,String> datas,String[] oids,Target target,String contextName) throws Exception{
ScopedPDU request = new ScopedPDU();
for(String oid :oids){
if((oid.toString()).endsWith(".0"))
request.add(new VariableBinding(new OID(oid)));
else{
throw new Exception(oid+" is not basic node");
}
}
// request.setContextName(new OctetString(contextName));
request.setType(PDU.GET);
ResponseEvent respEvent = snmp.send(request, target);
System.out.println(snmp.getUSM().getUserTable().getUser(new OctetString(contextName)));
System.out.println(respEvent.getResponse());
PDU response = respEvent.getResponse();
// if(isNullPDU(response,"SNMP4J 响应结果为空")){
if(isNullPDU(response,"The result of the SNMP4J response is empty")){
return;
}
if(response.getErrorIndex()==PDU.noError&&response.getErrorStatus()==PDU.noError){
Vector<VariableBinding> vector = (Vector<VariableBinding>) response.getVariableBindings();
for(VariableBinding vb : vector){
String key = vb.getOid().toString();
datas.put(key,vb.getVariable().toString());
}
}else{
// throw new Exception("错误信息:"+response.getErrorStatusText());
throw new Exception("Error information:"+response.getErrorStatusText());
}
}
private static Map<String,String> resoveVersion2c(PDU response) throws Exception{
Map<String,String> datas = new HashMap<String, String>();
if (response.getErrorIndex()==PDU.noError&&response.getErrorStatus()==PDU.noError) {
Object obj = response.getVariableBindings().firstElement();
VariableBinding variable = (VariableBinding) obj;
String key = variable.getOid().toString();
System.out.println("key:"+key+":"+variable.getVariable().toString());
datas.put(key,variable.getVariable().toString());
} else {
// throw new Exception("错误信息:"+response.getErrorStatusText());
throw new Exception("Error information:"+response.getErrorStatusText());
}
return datas;
}
/**
* 将十进六制转换成为中文
*/
private static String hexString = "0123456789ABCDEF";
public static String toStringHex(String bytes) {
ByteArrayOutputStream baos = new ByteArrayOutputStream(
bytes.length() / 2);
//将每2位16进制整数组装成一个字节
for (int i = 0; i < bytes.length(); i += 2) {
baos.write((hexString.indexOf(bytes.charAt(i)) << 4 | hexString
.indexOf(bytes.charAt(i + 1))));
}
return new String(baos.toByteArray());
}
private static Map<String,String> resoveVersion3(PDU response) throws Exception{
Map<String,String> datas = new HashMap<String, String>();
for (int i = 0; i < response.size(); i++) {
VariableBinding vb = response.get(i);
String[] str = vb.getVariable().toString().toUpperCase().split(":");
String strOut = "";
int intLength = str.length;
logger.debug("长度==> " + intLength);
for (int j = 0; j < intLength; j++) {
strOut += str[j];
}
// System.out.println("snmpWalkKey:"+vb.getOid()+" : "+vb.getVariable().toString()+" --中文: ");
datas.put(vb.getOid().toString(), vb.getVariable().toString());
if (str.length != 1) {
logger.debug("==第284行=vb.getVariable()=" + toStringHex(strOut));//显示中文
}
}
return datas;
}
public static CommunityTarget createCommunityTarget(String host,String port,String community,int retries,int timeout,int version){
CommunityTarget target = new CommunityTarget();
target.setAddress(new UdpAddress(host+"/"+port));//设置Snmp Agent的访问地址和端口
target.setCommunity(new OctetString(StringUtils.isEmpty(community)?C_P_COMMUNITY:community));//设置共同体,默认是"public"
target.setRetries(retries==0?C_P_RETRIES:retries);//设置重试次数
target.setTimeout(timeout==0?C_P_TIME_OUT:timeout);//设置超时毫秒数
target.setVersion(version==0?C_P_VERSION : version);//设置snmp的版本号
return target;
}
public static UserTarget createUserTarget(String host,String port,int retries,int timeout){
UserTarget target = new UserTarget();
target.setAddress(new UdpAddress(host+"/"+port));//设置Snmp Agent的访问地址和端口
target.setRetries(1);//设置重试次数
target.setRetries(retries==0?C_P_RETRIES : retries);//设置重试次数
target.setTimeout(timeout==0?C_P_TIME_OUT : timeout);//设置超时毫秒数
target.setVersion(SnmpConstants.version3);//设置snmp的版本号
switch (Constants.SNMP_V3_SECURITY_LEVEL) {
case 0:
target.setSecurityLevel(SecurityLevel.NOAUTH_NOPRIV);
break;
case 1:
target.setSecurityLevel(SecurityLevel.AUTH_NOPRIV);
break;
case 2:
target.setSecurityLevel(SecurityLevel.AUTH_PRIV);
break;
default:
target.setSecurityLevel(SecurityLevel.NOAUTH_NOPRIV);
break;
}
target.setSecurityName(new OctetString(Constants.SNMP_V3_SECURITY_NAME));
return target;
}
public static Snmp createSnmp() {
try {
if(snmp == null){
String ip = Common.getLocalIp();
if(StringUtils.isEmpty(ip)){
return null;
}
TransportMapping transport = new DefaultUdpTransportMapping();
Snmp snmp = new Snmp(transport);
snmp.getMessageDispatcher().addMessageProcessingModel(new MPv1());
snmp.getMessageDispatcher().addMessageProcessingModel(new MPv2c());
snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3());
snmp.setTimeoutModel(new DefaultTimeoutModel());
USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
SecurityModels.getInstance().addSecurityModel(usm);
snmp.listen();
OID authProtocol = getAuthProtocol(Constants.SNMP_V3_AUTH_PROTOCOL); //认证协议
OID privProtocol = getPrivProtocol(Constants.SNMP_V3_PRIV_PROTOCOL); //加密协议
OctetString securityName = new OctetString(Constants.SNMP_V3_SECURITY_NAME); //认证用户
OctetString authPassphrase = new OctetString(Constants.SNMP_V3_AUTH_PASSPHRASE); //认证密码明文
OctetString privPassphrase = new OctetString(Constants.SNMP_V3_PRIV_PASSPHRASE); //加密密码明文
snmp.getUSM().addUser(securityName, new UsmUser(securityName, authProtocol, authPassphrase,
privProtocol, privPassphrase));
logger.info("SNMP 启动成功");
return snmp;
}else{
return snmp;
}
} catch (IOException e) {
logger.error("SNMP4J ERROR", e);
} catch (Exception e) {
logger.error("SNMP4J ERROR", e);
}
return snmp;
}
private static OID getAuthProtocol(String auth){
if (auth.equals("MD5")) {
return AuthMD5.ID;
} else if (auth.equals("SHA")) {
return AuthSHA.ID;
}else{
return null;
}
}
private static OID getPrivProtocol(String priv){
if (priv.equals("DES")) {
return PrivDES.ID;
} else if ((priv.equals("AES128"))
|| (priv.equals("AES"))) {
return PrivAES128.ID;
} else if (priv.equals("AES192")) {
return PrivAES192.ID;
} else if (priv.equals("AES256")) {
return PrivAES256.ID;
}else{
return null;
}
}
private static PDU createPDU(int type){
PDU pdu= new PDU();
pdu.setType(type);
return pdu;
}
/**
* PDU为空判断
* @param pdu 需判断的PDU
* @param messages PDU为空是输出的提示信息
* @return
* @throws Exception
*/
public static boolean isNullPDU(PDU pdu, String messages) throws Exception{
boolean isNull = true;
if(pdu!=null){
isNull = false;
}else{
isNull = true;
//pdu为空的处理可以添加到这里
// logger.debug(messages);
// throw new Exception("错误信息:"+messages);
throw new Exception("Error information:"+messages);
}
return isNull;
}
public static String checkTypeName = null;
public static void snmpTree(List<Map<String, String>> datasList,List<String> oidModel, String oid,String host,String port,String community,int retries,int timeout,int version,String checktypename) throws Exception{
checkTypeName = checktypename;
snmpTree(datasList,oidModel, oid, host, port, community, retries, timeout, version);
}
public static void snmpTree(List<Map<String, String>> datasList,List<String> oidModel, String oid,String host,String port,String community,int retries,int timeout,int version) throws Exception{
Target target = null;
if (version == SnmpConstants.version3) {
target = createUserTarget(host,port,retries,timeout);
}else{
target = createCommunityTarget(host,port,community,retries,timeout, version);
}
treeUtilNew(datasList,oidModel,snmp,target,oid);
}
/**
*
* TODO
* @author hyx Mar 20, 2013
* @version 1.0
*/
public static void snmpIfXTabTree(Map<String,Map<String, String>> datasMap,List<String> oidModel, String oid,String host,String port,String community,int retries,int timeout,int version) throws Exception{
Target target = null;
if (version == SnmpConstants.version3) {
target = createUserTarget(host,port,retries,timeout);
}else{
target = createCommunityTarget(host,port,community,retries,timeout, version);
}
ifXTabTreeUtilNew(datasMap,oidModel,snmp,target,oid);
}
public static void subTreeUtil( List<Map<String, String>> datasList,List<String> oidModel,Snmp snmp,Target target,String rootOid)throws Exception{
PDU request = createPDU(PDU.GETBULK);
ResponseEvent respEvent = snmp.send(request, target);
PDU response = respEvent.getResponse();
// if(isNullPDU(response,"SNMP4J 响应结果为空")){
if(isNullPDU(response,"The result of the SNMP4J response is empty")){
return;
}
if(response.getErrorIndex()==PDU.noError&&response.getErrorStatus()==PDU.noError){
Vector<VariableBinding> vector = (Vector<VariableBinding>) response.getVariableBindings();
for(VariableBinding vb : vector){
String key = vb.getOid().toString();
}
}else{
// throw new Exception("错误信息:"+response.getErrorStatusText());
throw new Exception("Error information:"+response.getErrorStatusText());
}
}
public static void treeUtilNew( List<Map<String, String>> datasList,List<String> oidModel,Snmp snmp,Target target,String rootOid)throws Exception{
TreeUtils treeUtils = null;
List list = null;
//如果没有指定oid则取系统基本信息
if(StringUtils.isBlank(rootOid)){
return ;//rootOid = "1.3.6.1.2.1.1";
}
treeUtils = new TreeUtils(snmp ,new DefaultPDUFactory());
list = treeUtils.getSubtree(target, new OID(rootOid));
//获取到的所有实例信息每个keyvalue中包含一个oid的所有实例信息的map
Map<String, Map<String, String>> mapInstance = new LinkedHashMap<String, Map<String, String>>();
for (int j = 0; j < list.size(); j++) {
TreeEvent treeEvent = (TreeEvent)list.get(j);
if (treeEvent.isError())
throw new Exception((new StringBuilder("Error getting SNMP table")).append(treeEvent.getErrorMessage()).toString());
if (treeEvent.getException() != null)
throw new Exception((new StringBuilder("Get an exception in SNMP table")).append(treeEvent.getErrorMessage()).append(" ").append(treeEvent.getException().getMessage()).toString());
if (treeEvent.getStatus() != 0)
throw new Exception((new StringBuilder("Error getting SNMP table")).append(treeEvent.getErrorMessage()).toString());
if (treeEvent.getVariableBindings() != null ){
VariableBinding vbArr[] = treeEvent.getVariableBindings();
if(vbArr != null){
for(int i = 0,m= vbArr.length;i<m;i++){
VariableBinding vb = vbArr[i];
OID oid = vb.getOid();
String index = oid.last()+"";//索引
String oidStr = oid.toString();
oidStr = oidStr.substring(0, oidStr.lastIndexOf("."));
if(oidModel.contains(oidStr)){
Map<String, String> map = mapInstance.get(index);
if(map == null){
map = new HashMap<String, String>();
mapInstance.put(index, map);
}
map.put(oidStr, vb.getVariable().toString());
}
}
}
}
}
if(mapInstance.size() > 0){
Set<Entry<String,Map<String,String>>> entrySet = mapInstance.entrySet();
for(Entry<String,Map<String,String>> entry : entrySet){
Map<String, String> value = entry.getValue();
if(value != null && value.size() > 0){
datasList.add(value);
}
}
}
logger.debug("datasList -> " + datasList.size());
}
/**
*
* TODO
* @author hyx Mar 20, 2013
* @version 1.0
*/
public static void ifXTabTreeUtilNew( Map<String,Map<String, String>> datasMap,List<String> oidModel,Snmp snmp,Target target,String rootOid)throws Exception{
TreeUtils treeUtils = null;
List list = null;
//如果没有指定oid则取系统基本信息
if(StringUtils.isBlank(rootOid)){
return ;//rootOid = "1.3.6.1.2.1.1";
}
treeUtils = new TreeUtils(snmp ,new DefaultPDUFactory());
list = treeUtils.getSubtree(target, new OID(rootOid));
Vector<TreeEvent> vector2 = new Vector<TreeEvent>();
//获取信息过程是否异常
for (int j = 0; j < list.size(); j++) {
TreeEvent treeEvent = (TreeEvent)list.get(j);
if (treeEvent.isError())
throw new Exception((new StringBuilder("Error getting SNMP table")).append(treeEvent.getErrorMessage()).toString());
if (treeEvent.getException() != null)
throw new Exception((new StringBuilder("Get an exception in SNMP table")).append(treeEvent.getErrorMessage()).append(" ").append(treeEvent.getException().getMessage()).toString());
if (treeEvent.getStatus() != 0)
throw new Exception((new StringBuilder("Error getting SNMP table")).append(treeEvent.getErrorMessage()).toString());
if (treeEvent.getVariableBindings() != null ){
VariableBinding vbArr[] = treeEvent.getVariableBindings();
if(vbArr != null){
for(int i = 0,m= vbArr.length;i<m;i++){
VariableBinding vb = vbArr[i];
OID oid = vb.getOid();
String index = oid.last()+"";//索引
String oidStr = oid.toString();
oidStr = oidStr.substring(0, oidStr.lastIndexOf("."));
if(oidModel.contains(oidStr)){
Map<String, String> map = datasMap.get(index);
if(map == null){
map = new HashMap<String, String>();
datasMap.put(index, map);
}
map.put(oidStr, vb.getVariable().toString());
}
}
}
}
}
//删除空数据
Iterator<Entry<String, Map<String, String>>> it = datasMap.entrySet().iterator();
while(it.hasNext()){
Entry<String, Map<String, String>> next = it.next();
Map<String, String> value = next.getValue();
if(value == null || value.size() <1){
it.remove();
}
}
}
private static void pl(Object object) {
System.out.println(object==null?null:object.toString());
}
public static void main(String [] args) throws Exception{
// SNMP4J 》》》》1.3.6.1.2.1.1 10.0.6.230 161 public 3 0 1
//SNMP4J 》》》》 1.3.6.1.4.1.1000.1.2.1 10.0.6.230 161 public 3 0 1>
List<Map<String,String>> datasList = new ArrayList<Map<String,String>>();
List<String> oidModel = new ArrayList<String>();
// [1.3.6.1.2.1.1.1, 1.3.6.1.2.1.1.2, 1.3.6.1.2.1.1.3, 1.3.6.1.2.1.1.4, 1.3.6.1.2.1.1.5, 1.3.6.1.2.1.1.6, 1.3.6.1.2.1.1.7]
/*oidModel.add("1.3.6.1.2.1.1.1");
oidModel.add("1.3.6.1.2.1.1.2");
oidModel.add("1.3.6.1.2.1.1.3");
oidModel.add("1.3.6.1.2.1.1.4");
oidModel.add("1.3.6.1.2.1.1.5");
oidModel.add("1.3.6.1.2.1.1.6");
oidModel.add("1.3.6.1.2.1.1.7");*/
// [1.3.6.1.2.1.31.1.1.1.1, 1.3.6.1.2.1.31.1.1.1.2, 1.3.6.1.2.1.31.1.1.1.3, 1.3.6.1.2.1.31.1.1.1.4, 1.3.6.1.2.1.31.1.1.1.5, 1.3.6.1.2.1.31.1.1.1.6, 1.3.6.1.2.1.31.1.1.1.7, 1.3.6.1.2.1.31.1.1.1.8, 1.3.6.1.2.1.31.1.1.1.9, 1.3.6.1.2.1.31.1.1.1.10, 1.3.6.1.2.1.31.1.1.1.11, 1.3.6.1.2.1.31.1.1.1.12, 1.3.6.1.2.1.31.1.1.1.13, 1.3.6.1.2.1.31.1.1.1.14, 1.3.6.1.2.1.31.1.1.1.15, 1.3.6.1.2.1.31.1.1.1.17, 1.3.6.1.2.1.31.1.1.1.16, 1.3.6.1.2.1.31.1.1.1.19, 1.3.6.1.2.1.31.1.1.1.18]
oidModel.add("1.3.6.1.4.1.1000.4.3.1.1");
oidModel.add("1.3.6.1.4.1.1000.4.3.1.2");
oidModel.add("1.3.6.1.4.1.1000.4.3.1.3");
oidModel.add("1.3.6.1.4.1.1000.4.3.1.4");
oidModel.add("1.3.6.1.4.1.1000.4.3.1.5");
oidModel.add("1.3.6.1.4.1.1000.4.3.1.6");
oidModel.add("1.3.6.1.4.1.1000.4.3.1.7");
oidModel.add("1.3.6.1.4.1.1000.4.3.1.8");
oidModel.add("1.3.6.1.4.1.1000.4.3.1.9");
oidModel.add("1.3.6.1.4.1.1000.4.3.1.10");
//String oid = "1.3.6.1.2.1.1";
String oid = "1.3.6.1.4.1.1000.4.3.1";
String host = "10.0.6.230";
String port = "161";
String community = "public";
int retries = 3;
int timeout = 0;
int version = SnmpConstants.version2c;
String checktypename = "checktype100017";
snmpTree(datasList, oidModel, oid, host, port, community, retries, timeout, version, checktypename);
System.out.println(datasList.size());
System.out.println(Arrays.toString(datasList.toArray()));
}
}