// XXX xxx ZZZ zzz Maybe we should go through the MBeanInfo here? public void check(SnmpGenericMetaServer meta, ObjectName name, SnmpValue x, long id, Object data) throws SnmpStatusException { meta.checkSetAccess(x, id, data); try { final String attname = meta.getAttributeName(id); final Object attvalue = meta.buildAttributeValue(id, x); final Object[] params = new Object[1]; final String[] signature = new String[1]; params[0] = attvalue; signature[0] = attvalue.getClass().getName(); server.invoke(name, "check" + attname, params, signature); } catch (SnmpStatusException e) { throw e; } catch (InstanceNotFoundException i) { throw new SnmpStatusException(SnmpStatusException.snmpRspInconsistentName); } catch (ReflectionException r) { // checkXXXX() not defined => do nothing } catch (MBeanException m) { Exception t = m.getTargetException(); if (t instanceof SnmpStatusException) throw (SnmpStatusException) t; throw new SnmpStatusException(SnmpStatusException.noAccess); } catch (Exception e) { throw new SnmpStatusException(SnmpStatusException.noAccess); } }
/** * Set the value of an SNMP variable. * * <p><b><i> You should never need to use this method directly. </i></b> * * @param meta The impacted metadata object * @param name The ObjectName of the impacted MBean * @param x The new requested SnmpValue * @param id The OID arc identifying the variable we're trying to set. * @param data User contextual data allocated through the {@link * com.sun.jmx.snmp.agent.SnmpUserDataFactory} * @return The new value of the variable after the operation. * @exception SnmpStatusException whenever an SNMP exception must be raised. Raising an exception * will abort the request. <br> * Exceptions should never be raised directly, but only by means of <code> * req.registerSetException(<i>VariableId</i>,<i>SnmpStatusException</i>) * </code> */ public SnmpValue set( SnmpGenericMetaServer meta, ObjectName name, SnmpValue x, long id, Object data) throws SnmpStatusException { final String attname = meta.getAttributeName(id); final Object attvalue = meta.buildAttributeValue(id, x); final Attribute att = new Attribute(attname, attvalue); Object result = null; try { server.setAttribute(name, att); result = server.getAttribute(name, attname); } catch (InvalidAttributeValueException iv) { throw new SnmpStatusException(SnmpStatusException.snmpRspWrongValue); } catch (InstanceNotFoundException f) { throw new SnmpStatusException(SnmpStatusException.snmpRspInconsistentName); } catch (ReflectionException r) { throw new SnmpStatusException(SnmpStatusException.snmpRspInconsistentName); } catch (MBeanException m) { Exception t = m.getTargetException(); if (t instanceof SnmpStatusException) throw (SnmpStatusException) t; throw new SnmpStatusException(SnmpStatusException.noAccess); } catch (Exception e) { throw new SnmpStatusException(SnmpStatusException.noAccess); } return meta.buildSnmpValue(id, result); }
/** * Get the value of an SNMP variable. * * <p><b><i> You should never need to use this method directly. </i></b> * * @param meta The impacted metadata object * @param name The ObjectName of the impacted MBean * @param id The OID arc identifying the variable we're trying to set. * @param data User contextual data allocated through the {@link * com.sun.jmx.snmp.agent.SnmpUserDataFactory} * @return The value of the variable. * @exception SnmpStatusException whenever an SNMP exception must be raised. Raising an exception * will abort the request. <br> * Exceptions should never be raised directly, but only by means of <code> * req.registerGetException(<i>VariableId</i>,<i>SnmpStatusException</i>) * </code> */ public SnmpValue get(SnmpGenericMetaServer meta, ObjectName name, long id, Object data) throws SnmpStatusException { final String attname = meta.getAttributeName(id); Object result = null; try { result = server.getAttribute(name, attname); } catch (MBeanException m) { Exception t = m.getTargetException(); if (t instanceof SnmpStatusException) throw (SnmpStatusException) t; throw new SnmpStatusException(SnmpStatusException.noSuchInstance); } catch (Exception e) { throw new SnmpStatusException(SnmpStatusException.noSuchInstance); } return meta.buildSnmpValue(id, result); }
/** * Execute an SNMP SET request. * * <p>This method first builds the list of attributes that need to be set on the MBean and then * calls setAttributes() on the MBean server. Then it updates the SnmpMibSubRequest with the new * values retrieved from the MBean. * * <p>The SNMP metadata information is obtained through the given <code>meta</code> object, which * usually is an instance of a <code>mibgen</code> generated class. * * <p><b><i> This method is called internally by <code>mibgen</code> generated objects and you * should never need to call it directly. </i></b> * * @param meta The metadata object impacted by the subrequest * @param name The ObjectName of the MBean impacted by this subrequest * @param req The SNMP subrequest to execute on the MBean * @param depth The depth of the SNMP object in the OID tree. * @exception SnmpStatusException whenever an SNMP exception must be raised. Raising an exception * will abort the request. <br> * Exceptions should never be raised directly, but only by means of <code> * req.registerGetException(<i>VariableId</i>,<i>SnmpStatusException</i>) * </code> */ public void set(SnmpGenericMetaServer meta, ObjectName name, SnmpMibSubRequest req, int depth) throws SnmpStatusException { final int size = req.getSize(); final AttributeList attList = new AttributeList(size); final String[] nameList = new String[size]; final SnmpVarBind[] varList = new SnmpVarBind[size]; final long[] idList = new long[size]; int i = 0; for (Enumeration e = req.getElements(); e.hasMoreElements(); ) { final SnmpVarBind var = (SnmpVarBind) e.nextElement(); try { final long id = var.oid.getOidArc(depth); final String attname = meta.getAttributeName(id); final Object attvalue = meta.buildAttributeValue(id, var.value); final Attribute att = new Attribute(attname, attvalue); attList.add(att); nameList[i] = attname; varList[i] = var; idList[i] = id; i++; } catch (SnmpStatusException x) { req.registerSetException(var, x); } } AttributeList result = null; int errorCode = SnmpStatusException.noAccess; try { result = server.setAttributes(name, attList); } catch (InstanceNotFoundException f) { result = new AttributeList(); errorCode = SnmpStatusException.snmpRspInconsistentName; } catch (ReflectionException r) { errorCode = SnmpStatusException.snmpRspInconsistentName; result = new AttributeList(); } catch (Exception x) { result = new AttributeList(); } final Iterator it = result.iterator(); for (int j = 0; j < i; j++) { if (!it.hasNext()) { final SnmpStatusException x = new SnmpStatusException(errorCode); req.registerSetException(varList[j], x); continue; } final Attribute att = (Attribute) it.next(); while ((j < i) && (!nameList[j].equals(att.getName()))) { final SnmpStatusException x = new SnmpStatusException(SnmpStatusException.noAccess); req.registerSetException(varList[j], x); j++; } if (j == i) break; try { varList[j].value = meta.buildSnmpValue(idList[j], att.getValue()); } catch (SnmpStatusException x) { req.registerSetException(varList[j], x); } } }
/** * Execute an SNMP GET request. * * <p>This method first builds the list of attributes that need to be retrieved from the MBean and * then calls getAttributes() on the MBean server. Then it updates the SnmpMibSubRequest with the * values retrieved from the MBean. * * <p>The SNMP metadata information is obtained through the given <code>meta</code> object, which * usually is an instance of a <code>mibgen</code> generated class. * * <p><b><i> This method is called internally by <code>mibgen</code> generated objects and you * should never need to call it directly. </i></b> * * @param meta The metadata object impacted by the subrequest * @param name The ObjectName of the MBean impacted by this subrequest * @param req The SNMP subrequest to execute on the MBean * @param depth The depth of the SNMP object in the OID tree. * @exception SnmpStatusException whenever an SNMP exception must be raised. Raising an exception * will abort the request.<br> * Exceptions should never be raised directly, but only by means of <code> * req.registerGetException(<i>VariableId</i>,<i>SnmpStatusException</i>) * </code> */ public void get(SnmpGenericMetaServer meta, ObjectName name, SnmpMibSubRequest req, int depth) throws SnmpStatusException { // java.lang.System.out.println(">>>>>>>>> GET " + name); final int size = req.getSize(); final Object data = req.getUserData(); final String[] nameList = new String[size]; final SnmpVarBind[] varList = new SnmpVarBind[size]; final long[] idList = new long[size]; int i = 0; for (Enumeration e = req.getElements(); e.hasMoreElements(); ) { final SnmpVarBind var = (SnmpVarBind) e.nextElement(); try { final long id = var.oid.getOidArc(depth); nameList[i] = meta.getAttributeName(id); varList[i] = var; idList[i] = id; // Check the access rights according to the MIB. // The MBean might be less restrictive (have a getter // while the MIB defines the variable as AFN) // meta.checkGetAccess(id, data); // java.lang.System.out.println(nameList[i] + " added."); i++; } catch (SnmpStatusException x) { // java.lang.System.out.println("exception for " + nameList[i]); // x.printStackTrace(); req.registerGetException(var, x); } } AttributeList result = null; int errorCode = SnmpStatusException.noSuchInstance; try { result = server.getAttributes(name, nameList); } catch (InstanceNotFoundException f) { // java.lang.System.out.println(name + ": instance not found."); // f.printStackTrace(); result = new AttributeList(); } catch (ReflectionException r) { // java.lang.System.out.println(name + ": reflexion error."); // r.printStackTrace(); result = new AttributeList(); } catch (Exception x) { result = new AttributeList(); } final Iterator it = result.iterator(); for (int j = 0; j < i; j++) { if (!it.hasNext()) { // java.lang.System.out.println(name + "variable[" + j + // "] absent"); final SnmpStatusException x = new SnmpStatusException(errorCode); req.registerGetException(varList[j], x); continue; } final Attribute att = (Attribute) it.next(); while ((j < i) && (!nameList[j].equals(att.getName()))) { // java.lang.System.out.println(name + "variable[" +j + // "] not found"); final SnmpStatusException x = new SnmpStatusException(errorCode); req.registerGetException(varList[j], x); j++; } if (j == i) break; try { varList[j].value = meta.buildSnmpValue(idList[j], att.getValue()); } catch (SnmpStatusException x) { req.registerGetException(varList[j], x); } // java.lang.System.out.println(att.getName() + " retrieved."); } // java.lang.System.out.println(">>>>>>>>> END GET"); }