📄 snmpsubrequesthandler.java
字号:
/* * @(#)file SnmpSubRequestHandler.java * @(#)author Sun Microsystems, Inc. * @(#)version 4.38 * @(#)date 08/09/12 * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * */package com.sun.jmx.snmp.daemon;// java import//import java.util.Vector;// jmx imports//import com.sun.jmx.snmp.SnmpPdu;import com.sun.jmx.snmp.SnmpVarBind;import com.sun.jmx.snmp.SnmpDefinitions;import com.sun.jmx.snmp.SnmpStatusException;import com.sun.jmx.snmp.SnmpEngine;// RI imports//import com.sun.jmx.trace.Trace;// SNMP Runtime import//import com.sun.jmx.snmp.agent.SnmpMibAgent;import com.sun.jmx.snmp.agent.SnmpMibRequest;import com.sun.jmx.snmp.ThreadContext;import com.sun.jmx.snmp.internal.SnmpIncomingRequest;class SnmpSubRequestHandler implements SnmpDefinitions, Runnable { protected SnmpIncomingRequest incRequest = null; protected SnmpEngine engine = null; /** * V3 enabled Adaptor. Each Oid is added using updateRequest method. */ protected SnmpSubRequestHandler(SnmpEngine engine, SnmpIncomingRequest incRequest, SnmpMibAgent agent, SnmpPdu req) { this(agent, req); init(engine, incRequest); } /** * V3 enabled Adaptor. */ protected SnmpSubRequestHandler(SnmpEngine engine, SnmpIncomingRequest incRequest, SnmpMibAgent agent, SnmpPdu req, boolean nouse) { this(agent, req, nouse); init(engine, incRequest); } /** * SNMP V1/V2 . To be called with updateRequest. */ protected SnmpSubRequestHandler(SnmpMibAgent agent, SnmpPdu req) { dbgTag = makeDebugTag(); if (isTraceOn()) { trace("constructor", "creating instance for request " + String.valueOf(req.requestId)); } version= req.version; type= req.type; this.agent= agent; // We get a ref on the pdu in order to pass it to SnmpMibRequest. reqPdu = req; //Pre-allocate room for storing varbindlist and translation table. // int length= req.varBindList.length; translation= new int[length]; varBind= new NonSyncVector(length); } /** * SNMP V1/V2 The constuctor initialize the subrequest with the whole varbind list contained * in the original request. */ protected SnmpSubRequestHandler(SnmpMibAgent agent, SnmpPdu req, boolean nouse) { this(agent,req); // The translation table is easy in this case ... // int max= translation.length; SnmpVarBind[] list= req.varBindList; for(int i=0; i < max; i++) { translation[i]= i; ((NonSyncVector)varBind).addNonSyncElement(list[i]); } } SnmpMibRequest createMibRequest(Vector vblist, int protocolVersion, Object userData) { // This is an optimization: // The SnmpMibRequest created in the check() phase is // reused in the set() phase. // if (type == pduSetRequestPdu && mibRequest != null) return mibRequest; //This is a request comming from an SnmpV3AdaptorServer. //Full power. SnmpMibRequest result = null; if(incRequest != null) { result = SnmpMibAgent.newMibRequest(engine, reqPdu, vblist, protocolVersion, userData, incRequest.getPrincipal(), incRequest.getSecurityLevel(), incRequest.getSecurityModel(), incRequest.getContextName(), incRequest.getAccessContext()); } else { result = SnmpMibAgent.newMibRequest(reqPdu, vblist, protocolVersion, userData); } // If we're doing the check() phase, we store the SnmpMibRequest // so that we can reuse it in the set() phase. // if (type == pduWalkRequest) mibRequest = result; return result; } void setUserData(Object userData) { data = userData; } public void run() { try { final ThreadContext oldContext = ThreadContext.push("SnmpUserData",data); try { switch(type) { case pduGetRequestPdu: // Invoke a get operation // if (isTraceOn()) { trace("run", "[" + Thread.currentThread() + "]:get operation on " + agent.getMibName()); } agent.get(createMibRequest(varBind,version,data)); break; case pduGetNextRequestPdu: if (isTraceOn()) { trace("run", "[" + Thread.currentThread() + "]:getNext operation on " + agent.getMibName()); } //#ifdef DEBUG agent.getNext(createMibRequest(varBind,version,data)); break; case pduSetRequestPdu: if (isTraceOn()) { trace("run", "[" + Thread.currentThread() + "]:set operation on " + agent.getMibName()); } agent.set(createMibRequest(varBind,version,data)); break; case pduWalkRequest: if (isTraceOn()) { trace("run", "[" + Thread.currentThread() + "]:check operation on " + agent.getMibName()); } agent.check(createMibRequest(varBind,version,data)); break; default: if (isDebugOn()) { debug("run", "[" + Thread.currentThread() + "]:unknown operation (" + type + ") on " + agent.getMibName()); } errorStatus= snmpRspGenErr; errorIndex= 1; break; }// end of switch } finally { ThreadContext.restore(oldContext); } } catch(SnmpStatusException x) { errorStatus = x.getStatus() ; errorIndex= x.getErrorIndex(); if (isDebugOn()) { debug("run", "[" + Thread.currentThread() + "]:an Snmp error occured during the operation"); debug("run", x); } } catch(Exception x) { errorStatus = SnmpDefinitions.snmpRspGenErr ; if (isTraceOn()) { trace("run", "[" + Thread.currentThread() + "]:a generic error occured during the operation"); } if (isDebugOn()) { debug("run", "Error is: " + x); debug("run", x); } } if (isTraceOn()) { trace("run", "[" + Thread.currentThread() + "]:operation completed"); } } // ------------------------------------------------------------- // // This function does a best-effort to map global error status // to SNMP v1 valid global error status. // // An SnmpStatusException can contain either: // <li> v2 local error codes (that should be stored in the varbind)</li> // <li> v2 global error codes </li> // <li> v1 global error codes </li> // // v2 local error codes (noSuchInstance, noSuchObject) are // transformed in a global v1 snmpRspNoSuchName error. // // v2 global error codes are transformed in the following way: // // If the request was a GET/GETNEXT then either // snmpRspNoSuchName or snmpRspGenErr is returned. // // Otherwise: // snmpRspNoAccess, snmpRspInconsistentName // => snmpRspNoSuchName // snmpRspAuthorizationError, snmpRspNotWritable, snmpRspNoCreation // => snmpRspReadOnly (snmpRspNoSuchName for GET/GETNEXT) // snmpRspWrong* // => snmpRspBadValue (snmpRspNoSuchName for GET/GETNEXT) // snmpRspResourceUnavailable, snmpRspRspCommitFailed, // snmpRspUndoFailed // => snmpRspGenErr // // ------------------------------------------------------------- // static final int mapErrorStatusToV1(int errorStatus, int reqPduType) { // Map v2 codes onto v1 codes // if (errorStatus == SnmpDefinitions.snmpRspNoError) return SnmpDefinitions.snmpRspNoError; if (errorStatus == SnmpDefinitions.snmpRspGenErr) return SnmpDefinitions.snmpRspGenErr; if (errorStatus == SnmpDefinitions.snmpRspNoSuchName) return SnmpDefinitions.snmpRspNoSuchName; if ((errorStatus == SnmpStatusException.noSuchInstance) || (errorStatus == SnmpStatusException.noSuchObject) || (errorStatus == SnmpDefinitions.snmpRspNoAccess) || (errorStatus == SnmpDefinitions.snmpRspInconsistentName) || (errorStatus == SnmpDefinitions.snmpRspAuthorizationError)){ return SnmpDefinitions.snmpRspNoSuchName; } else if ((errorStatus == SnmpDefinitions.snmpRspAuthorizationError) || (errorStatus == SnmpDefinitions.snmpRspNotWritable)) { if (reqPduType == SnmpDefinitions.pduWalkRequest) return SnmpDefinitions.snmpRspReadOnly; else return SnmpDefinitions.snmpRspNoSuchName; } else if ((errorStatus == SnmpDefinitions.snmpRspNoCreation)) { return SnmpDefinitions.snmpRspNoSuchName; } else if ((errorStatus == SnmpDefinitions.snmpRspWrongType) || (errorStatus == SnmpDefinitions.snmpRspWrongLength) || (errorStatus == SnmpDefinitions.snmpRspWrongEncoding) || (errorStatus == SnmpDefinitions.snmpRspWrongValue) || (errorStatus == SnmpDefinitions.snmpRspWrongLength) || (errorStatus == SnmpDefinitions.snmpRspInconsistentValue)) { if ((reqPduType == SnmpDefinitions.pduSetRequestPdu) || (reqPduType == SnmpDefinitions.pduWalkRequest)) return SnmpDefinitions.snmpRspBadValue; else return SnmpDefinitions.snmpRspNoSuchName; } else if ((errorStatus == SnmpDefinitions.snmpRspResourceUnavailable) || (errorStatus == SnmpDefinitions.snmpRspCommitFailed) || (errorStatus == SnmpDefinitions.snmpRspUndoFailed)) { return SnmpDefinitions.snmpRspGenErr; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -