I have not read your code, but in general
this is handled by the timeout value of the
request. Try to decrease the value. The
wait() is OK. The timeout is handled
elsewhere.

Best regards,
Frank

Oosten, Harry van schrieb:
Anybody got an idea? I don't understands why the code hangs on the wait
as the request is being ignored. Could it help to set .the
syncResponse.wait(); with an timeout value of 10 seconds or is there
more time needed for the agent to response?
Thanks.

Met vriendelijke groet / Kind Regards,

ing. Harry van Oosten

Software engineer


-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On
Behalf Of Oosten, Harry van
Sent: dinsdag 5 augustus 2008 10:08
To: [email protected]
Subject: [SNMP4J] Code hangs on syncResponse.wait();

Hi,

I managed to create an test class that's send a GETBULK request to an
configured switch and router. This goes well as long as I use the right
username password.
Only when I change a username or password the request is ignored by the
device and the code hangs on the syncResponse.wait();
MyCode:

public class SNMPManager {

    private boolean needConfig = false;

    public static void main(String[] args) {

        SNMPManager snmpMan = new SNMPManager();

        System.out.println("Switch = up?
"+snmpMan.isResponding("192.168.16.122", "1AuthUser", "AuthPassword",
null)); //wrong username

        System.out.println(snmpMan.needConfig);

    }

    public boolean isResponding(String ipAddress, String userName,
String authPassword, String privPassword){

    List<String> OIDList = new LinkedList<String>();

    //OIDList.add("");

      PDU pdu;

        try {

            pdu = getPDU(ipAddress, userName, authPassword, privPassword
,OIDList);

            if (pdu != null)  {

                    System.out.println(pdu);

return true;
            } else{

                return false;

            }

        } catch (IOException e) {

            e.printStackTrace();

            needConfig = true;

            return false;

        }

    }

    private PDU getPDU(String ipAddress, String userName, String
authPassword, String privPassword ,List<String> OIDList) throws
IOException {

        //Create transport.

        Address targetAddress =
GenericAddress.parse("udp:"+ipAddress+"/161");

        TransportMapping transport = new DefaultUdpTransportMapping();

        Snmp snmp = new Snmp(transport);

        USM usm = new USM(SecurityProtocols.getInstance(), new
OctetString(MPv3.createLocalEngineID()),0);

        SecurityModels.getInstance().addSecurityModel(usm);

        transport.listen();

        // add user to the USM

        if (privPassword != null)  {

snmp.getUSM().addUser(new OctetString(userName),
                                  //new
OctetString("80:00:13:70:c0:a8:01:0d"),
                                  new UsmUser(new OctetString(userName),


AuthMD5.ID,
                                              new
OctetString(authPassword),

                                              PrivDES.ID,

                                              new
OctetString(privPassword)

)); //Fill out!
        } else {

snmp.getUSM().addUser(new OctetString(userName),
                               //new
OctetString("80:00:13:70:c0:a8:01:0d"), new UsmUser(new OctetString(userName), AuthMD5.ID,
                                           new
OctetString(authPassword),

                                           null,

null));
        }

        //Create target.

        UserTarget target = createTarget(targetAddress, userName);

        //Create the PDU

        PDU pdu = createPDU(OIDList);

        //Send the PDU

        ResponseEvent responseEvent = snmp.send(pdu, target);

        //Exctract the response PDU (could be null if timed out)

        PDU responsePDU = responseEvent.getResponse();

        closeTransport(transport);

        return responsePDU;

    }

    /**

* Used to create the PDU.
     * Gets a list of Strings containing the OID's that needs to be
acquired.

     * @param OIDList String List

     * @return PDU

     */

    private PDU createPDU(List<String> OIDList) {

        PDU pdu = new ScopedPDU();

        for (String oid :OIDList ) {

            pdu.add(new VariableBinding(new OID(oid)));

        }

        pdu.setType(PDU.GETBULK);

        return pdu;

    }

    private UserTarget createTarget(Address targetAddress, String
userName) {

        UserTarget target = new UserTarget();

        target.setAddress(targetAddress);

        target.setRetries(0);

        target.setTimeout(5000);

        target.setVersion(SnmpConstants.version3);

        target.setSecurityLevel(SecurityLevel.AUTH_NOPRIV);

        target.setSecurityName(new OctetString(userName));

        return target;

    }

    private void closeTransport(TransportMapping transport) throws
IOException {

            transport.close();

    }

}

Where it goes wrong: (snmp.java)

public ResponseEvent send(PDU pdu, Target target,

                            TransportMapping transport) throws
IOException {

    if (!pdu.isConfirmedPdu()) {

      sendMessage(pdu, target, transport, null);

      return null;

    }

    if (timer == null) {

      createPendingTimer();

    }

    SyncResponseListener syncResponse = new SyncResponseListener();

    PendingRequest retryRequest = null;

    synchronized (syncResponse) {

      PduHandle handle = null;

      PendingRequest request =

          new PendingRequest(syncResponse, target, pdu, target,
transport);

      handle = sendMessage(pdu, target, transport, request);

      try {

        syncResponse.wait();

        retryRequest = (PendingRequest) pendingRequests.remove(handle);

        if (logger.isDebugEnabled()) {

          logger.debug("Removed pending request with handle: "+handle);

        }

        request.setFinished();

        request.cancel();

      }

      catch (InterruptedException iex) {

        logger.warn(iex);

        // ignore

      }

    }

    if (retryRequest != null) {

      retryRequest.setFinished();

      retryRequest.cancel();

    }

    return syncResponse.response;

  }

  private synchronized void createPendingTimer() {

    if (timer == null) {

      timer = SNMP4JSettings.getTimerFactory().createTimer();

    }

  }

Hope you can help!
Met vriendelijke groet / Kind Regards,

ing. Harry van Oosten

Software engineer

_________________________________________







This e-mail and any attachment is for authorised use by the intended
recipient(s) only. It may contain proprietary material, confidential
information and/or be subject to legal privilege. It should not be
copied, disclosed to, retained or used by, any other party. If you are
not an intended recipient then please promptly delete this e-mail and
any attachment and all copies and inform the sender. Thank you.

_______________________________________________
SNMP4J mailing list
[email protected]
http://lists.agentpp.org/mailman/listinfo/snmp4j


This e-mail and any attachment is for authorised use by the intended 
recipient(s) only. It may contain proprietary material, confidential 
information and/or be subject to legal privilege. It should not be copied, 
disclosed to, retained or used by, any other party. If you are not an intended 
recipient then please promptly delete this e-mail and any attachment and all 
copies and inform the sender. Thank you.


_______________________________________________
SNMP4J mailing list
[email protected]
http://lists.agentpp.org/mailman/listinfo/snmp4j

_______________________________________________
SNMP4J mailing list
[email protected]
http://lists.agentpp.org/mailman/listinfo/snmp4j

Reply via email to