📄 commandprocessor.java
字号:
case Request.PHASE_2PC_PREPARE: {
prepare(context, request, server);
break;
}
case Request.PHASE_2PC_COMMIT: {
commit(context, request, server);
break;
}
case Request.PHASE_2PC_UNDO: {
undo(context, request, server);
break;
}
case Request.PHASE_2PC_CLEANUP: {
cleanup(context, request, server);
return;
}
}
if (!request.isPhaseComplete()) {
// request needs to be reprocessed later!
return;
}
}
}
catch (Exception ex) {
logger.error(ex);
}
cleanup(context, request, server);
}
protected void undo(OctetString context, Request request,
MOServer server) {
try {
SubRequestIterator it = (SubRequestIterator) request.iterator();
while (it.hasNext()) {
SubRequest sreq = it.nextSubRequest();
if (sreq.isComplete()) {
continue;
}
OID oid = sreq.getVariableBinding().getOid();
ManagedObject mo = sreq.getTargetMO();
if (mo == null) {
DefaultMOContextScope scope =
new DefaultMOContextScope(context, oid, true, oid, true);
mo = server.lookup(new DefaultMOQuery(scope));
}
if (mo == null) {
sreq.getStatus().setErrorStatus(PDU.undoFailed);
continue;
}
try {
mo.undo(sreq);
}
catch (Exception moex) {
if (logger.isDebugEnabled()) {
moex.printStackTrace();
}
logger.error(moex);
if (sreq.getStatus().getErrorStatus() == PDU.noError) {
sreq.getStatus().setErrorStatus(PDU.undoFailed);
}
}
}
}
catch (NoSuchElementException nsex) {
if (logger.isDebugEnabled()) {
nsex.printStackTrace();
}
logger.error("Cannot find sub-request: ", nsex);
request.setErrorStatus(PDU.genErr);
}
}
protected void commit(OctetString context, Request request,
MOServer server) {
try {
SubRequestIterator it = (SubRequestIterator) request.iterator();
while ((request.getErrorStatus() == PDU.noError) && (it.hasNext())) {
SubRequest sreq = it.nextSubRequest();
if (sreq.isComplete()) {
continue;
}
OID oid = sreq.getVariableBinding().getOid();
ManagedObject mo = sreq.getTargetMO();
if (mo == null) {
DefaultMOContextScope scope =
new DefaultMOContextScope(context, oid, true, oid, true);
mo = server.lookup(new DefaultMOQuery(scope));
}
if (mo == null) {
sreq.getStatus().setErrorStatus(PDU.commitFailed);
continue;
}
try {
mo.commit(sreq);
}
catch (Exception moex) {
if (logger.isDebugEnabled()) {
moex.printStackTrace();
}
logger.error(moex);
if (sreq.getStatus().getErrorStatus() == PDU.noError) {
sreq.getStatus().setErrorStatus(PDU.commitFailed);
}
}
}
}
catch (NoSuchElementException nsex) {
if (logger.isDebugEnabled()) {
nsex.printStackTrace();
}
logger.error("Cannot find sub-request: ", nsex);
request.setErrorStatus(PDU.genErr);
}
}
protected void cleanup(OctetString context, Request request,
MOServer server) {
try {
SubRequestIterator it = (SubRequestIterator) request.iterator();
while (it.hasNext()) {
SubRequest sreq = it.nextSubRequest();
if (sreq.isComplete()) {
continue;
}
OID oid = sreq.getVariableBinding().getOid();
ManagedObject mo = sreq.getTargetMO();
if (mo == null) {
DefaultMOContextScope scope =
new DefaultMOContextScope(context, oid, true, oid, true);
mo = server.lookup(new DefaultMOQuery(scope));
}
if (mo == null) {
sreq.completed();
continue;
}
server.unlock(sreq.getRequest(), mo);
try {
mo.cleanup(sreq);
sreq.getStatus().setPhaseComplete(true);
}
catch (Exception moex) {
if (logger.isDebugEnabled()) {
moex.printStackTrace();
}
logger.error(moex);
}
}
}
catch (NoSuchElementException nsex) {
logger.error("Cannot find sub-request: ", nsex);
if (logger.isDebugEnabled()) {
nsex.printStackTrace();
}
}
}
public boolean isSupported(int pduType) {
return (pduType == PDU.SET);
}
}
class GetHandler implements RequestHandler {
public boolean isSupported(int pduType) {
return (pduType == PDU.GET);
}
public void processPdu(Request request, MOServer server) {
initRequestPhase(request);
OctetString context = request.getContext();
try {
SubRequestIterator it = (SubRequestIterator) request.iterator();
while (it.hasNext()) {
SubRequest sreq = it.nextSubRequest();
MOScope scope = sreq.getScope();
MOQuery query = sreq.getQuery();
if (query == null) {
query = new VACMQuery(context,
scope.getLowerBound(),
scope.isLowerIncluded(),
scope.getUpperBound(),
scope.isUpperIncluded(),
request.getViewName());
sreq.setQuery(query);
}
ManagedObject mo = server.lookup(query);
if (mo == null) {
sreq.getVariableBinding().setVariable(Null.noSuchObject);
sreq.getStatus().setPhaseComplete(true);
continue;
}
try {
mo.get(sreq);
if ((request.getMessageProcessingModel() == MPv1.ID) &&
(sreq.getVariableBinding().getSyntax() ==
SMIConstants.SYNTAX_COUNTER64)) {
sreq.getVariableBinding().setVariable(Null.noSuchInstance);
}
}
catch (Exception moex) {
if (logger.isDebugEnabled()) {
moex.printStackTrace();
}
logger.warn(moex);
if (sreq.getStatus().getErrorStatus() == PDU.noError) {
sreq.getStatus().setErrorStatus(PDU.genErr);
}
}
}
}
catch (NoSuchElementException nsex) {
if (logger.isDebugEnabled()) {
nsex.printStackTrace();
}
logger.error("SubRequest not found");
request.setErrorStatus(PDU.genErr);
}
}
}
class GetBulkHandler implements RequestHandler {
public boolean isSupported(int pduType) {
return (pduType == PDU.GETBULK);
}
public void processPdu(Request request, MOServer server) {
initRequestPhase(request);
OctetString context = request.getContext();
SnmpRequest req = (SnmpRequest)request;
int nonRep = req.getNonRepeaters();
try {
SubRequestIterator it = (SubRequestIterator) request.iterator();
int i = 0;
// non repeaters
for (; ((i < nonRep) && it.hasNext()); i++) {
SubRequest sreq = it.nextSubRequest();
if (!sreq.isComplete()) {
processNextSubRequest(request, server, context, sreq);
}
}
// repetitions
for (; it.hasNext(); i++) {
SubRequest sreq = it.nextSubRequest();
if (!sreq.isComplete()) {
processNextSubRequest(request, server, context, sreq);
sreq.updateNextRepetition();
}
}
}
catch (NoSuchElementException nsex) {
if (logger.isDebugEnabled()) {
nsex.printStackTrace();
}
logger.error("SubRequest not found");
request.setErrorStatus(PDU.genErr);
}
}
}
class VACMQuery extends DefaultMOContextScope implements MOQuery {
private OctetString viewName;
public VACMQuery(OctetString context,
OID lowerBound, boolean isLowerIncluded,
OID upperBound, boolean isUpperIncluded,
OctetString viewName) {
super(context, lowerBound, isLowerIncluded, upperBound, isUpperIncluded);
this.viewName = viewName;
}
public MOContextScope getScope() {
return this;
}
public boolean isSearchQuery() {
return ((!isLowerIncluded()) &&
((getUpperBound() == null) ||
(!getUpperBound().equals(getLowerBound()))));
}
public boolean matchesQuery(ManagedObject managedObject) {
OID oid;
if (isSearchQuery()) {
oid = managedObject.find(this);
if (oid == null) {
return false;
}
}
else {
oid = getLowerBound();
}
return (vacm.isAccessAllowed(viewName, oid) == VACM.VACM_OK);
}
public String toString() {
return getClass().getName()+"[viewName="+viewName+"]="+
getScope().getLowerBound()+"<"+
(getScope().isLowerIncluded() ? "=" : "")+" x <"+
(getScope().isUpperIncluded() ? "=" : "")+
getScope().getUpperBound();
}
}
/*
protected int authorizeRequest(Request request) {
OctetString viewName = new OctetString();
int result = vacm.getViewName(request.getContext(),
request.getSecurityName(),
request.getSecurityModel(),
request.getSecurityLevel(),
request.getViewType(),
viewName);
if (result == VACM.VACM_OK) {
request.setViewName(viewName);
}
return result;
}
*/
static class DefaultRequestFactory implements RequestFactory {
public Request createRequest(EventObject initiatingEvent,
CoexistenceInfo cinfo) {
return new SnmpRequest((CommandResponderEvent)initiatingEvent, cinfo);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -