Search in sources :

Example 1 with SnmpMessage

use of com.sun.jmx.snmp.SnmpMessage in project jdk8u_jdk by JetBrains.

the class SnmpRequestHandler method makeResponseMessage.

/**
     * Here we make a response message from a request message.
     * We return null if there is no message to reply.
     */
private SnmpMessage makeResponseMessage(SnmpMessage reqMsg) {
    SnmpMessage respMsg = null;
    // Transform the request message into a request pdu
    //
    SnmpPduPacket reqPdu;
    Object userData = null;
    try {
        reqPdu = (SnmpPduPacket) pduFactory.decodeSnmpPdu(reqMsg);
        if (reqPdu != null && userDataFactory != null)
            userData = userDataFactory.allocateUserData(reqPdu);
    } catch (SnmpStatusException x) {
        reqPdu = null;
        SnmpAdaptorServer snmpServer = (SnmpAdaptorServer) adaptorServer;
        snmpServer.incSnmpInASNParseErrs(1);
        if (x.getStatus() == SnmpDefinitions.snmpWrongSnmpVersion)
            snmpServer.incSnmpInBadVersions(1);
        if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
            SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, dbgTag, "makeResponseMessage", "message decoding failed", x);
        }
    }
    // Make the response pdu if any
    //
    SnmpPduPacket respPdu = null;
    if (reqPdu != null) {
        respPdu = makeResponsePdu(reqPdu, userData);
        try {
            if (userDataFactory != null)
                userDataFactory.releaseUserData(userData, respPdu);
        } catch (SnmpStatusException x) {
            respPdu = null;
        }
    }
    //
    if (respPdu != null) {
        try {
            respMsg = (SnmpMessage) pduFactory.encodeSnmpPdu(respPdu, packet.getData().length);
        } catch (SnmpStatusException x) {
            respMsg = null;
            if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
                SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, dbgTag, "makeResponseMessage", "failure when encoding the response message", x);
            }
        } catch (SnmpTooBigException x) {
            if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
                SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, dbgTag, "makeResponseMessage", "response message is too big");
            }
            try {
                //
                if (packet.getData().length <= 32)
                    throw x;
                int pos = x.getVarBindCount();
                if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
                    SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, dbgTag, "makeResponseMessage", "fail on element" + pos);
                }
                int old;
                while (true) {
                    try {
                        respPdu = reduceResponsePdu(reqPdu, respPdu, pos);
                        respMsg = (SnmpMessage) pduFactory.encodeSnmpPdu(respPdu, packet.getData().length - 32);
                        break;
                    } catch (SnmpTooBigException xx) {
                        if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
                            SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, dbgTag, "makeResponseMessage", "response message is still too big");
                        }
                        old = pos;
                        pos = xx.getVarBindCount();
                        if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
                            SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, dbgTag, "makeResponseMessage", "fail on element" + pos);
                        }
                        if (pos == old) {
                            //
                            throw xx;
                        }
                    }
                }
            // end of loop
            } catch (SnmpStatusException xx) {
                respMsg = null;
                if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
                    SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, dbgTag, "makeResponseMessage", "failure when encoding the response message", xx);
                }
            } catch (SnmpTooBigException xx) {
                try {
                    respPdu = newTooBigPdu(reqPdu);
                    respMsg = (SnmpMessage) pduFactory.encodeSnmpPdu(respPdu, packet.getData().length);
                } catch (SnmpTooBigException xxx) {
                    respMsg = null;
                    if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
                        SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, dbgTag, "makeResponseMessage", "'too big' is 'too big' !!!");
                    }
                    adaptor.incSnmpSilentDrops(1);
                } catch (Exception xxx) {
                    if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
                        SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, dbgTag, "makeResponseMessage", "Got unexpected exception", xxx);
                    }
                    respMsg = null;
                }
            } catch (Exception xx) {
                if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
                    SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, dbgTag, "makeResponseMessage", "Got unexpected exception", xx);
                }
                respMsg = null;
            }
        }
    }
    return respMsg;
}
Also used : SnmpStatusException(com.sun.jmx.snmp.SnmpStatusException) SnmpMessage(com.sun.jmx.snmp.SnmpMessage) SnmpPduPacket(com.sun.jmx.snmp.SnmpPduPacket) SnmpTooBigException(com.sun.jmx.snmp.SnmpTooBigException) SnmpTooBigException(com.sun.jmx.snmp.SnmpTooBigException) InterruptedIOException(java.io.InterruptedIOException) SocketException(java.net.SocketException) SnmpStatusException(com.sun.jmx.snmp.SnmpStatusException)

Example 2 with SnmpMessage

use of com.sun.jmx.snmp.SnmpMessage in project jdk8u_jdk by JetBrains.

the class SnmpAdaptorServer method sendTrapPdu.

/**
     * Send the specified trap PDU to the specified destination.
     */
private void sendTrapPdu(InetAddress addr, SnmpPduPacket pdu) throws SnmpStatusException, IOException {
    // Make an SNMP message from the pdu
    //
    SnmpMessage msg = null;
    try {
        msg = (SnmpMessage) pduFactory.encodeSnmpPdu(pdu, bufferSize);
        if (msg == null) {
            throw new SnmpStatusException(SnmpDefinitions.snmpRspAuthorizationError);
        }
    } catch (SnmpTooBigException x) {
        if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
            SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, dbgTag, "sendTrapPdu", "Trap pdu is too big. " + "Trap hasn't been sent to the specified host.");
        }
        throw new SnmpStatusException(SnmpDefinitions.snmpRspTooBig);
    // FIXME: is the right exception to throw ?
    // We could simply forward SnmpTooBigException ?
    }
    // Now send the SNMP message to specified destination
    //
    openTrapSocketIfNeeded();
    if (addr != null) {
        msg.address = addr;
        try {
            sendTrapMessage(msg);
        } catch (SnmpTooBigException x) {
            if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
                SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, dbgTag, "sendTrapPdu", "Trap pdu is too big. " + "Trap hasn't been sent to " + msg.address);
            }
        }
    }
    closeTrapSocketIfNeeded();
}
Also used : SnmpStatusException(com.sun.jmx.snmp.SnmpStatusException) SnmpMessage(com.sun.jmx.snmp.SnmpMessage) SnmpTooBigException(com.sun.jmx.snmp.SnmpTooBigException)

Example 3 with SnmpMessage

use of com.sun.jmx.snmp.SnmpMessage in project jdk8u_jdk by JetBrains.

the class SnmpRequestHandler method makeResponsePacket.

/**
     * Here we make a response packet from a request packet.
     * We return null if there no response packet to sent.
     */
private DatagramPacket makeResponsePacket(DatagramPacket reqPacket) {
    DatagramPacket respPacket = null;
    // Transform the request packet into a request SnmpMessage
    //
    SnmpMessage reqMsg = new SnmpMessage();
    try {
        reqMsg.decodeMessage(reqPacket.getData(), reqPacket.getLength());
        reqMsg.address = reqPacket.getAddress();
        reqMsg.port = reqPacket.getPort();
    } catch (SnmpStatusException x) {
        if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
            SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, dbgTag, "makeResponsePacket", "packet decoding failed", x);
        }
        reqMsg = null;
        ((SnmpAdaptorServer) adaptorServer).incSnmpInASNParseErrs(1);
    }
    // Make the response SnmpMessage if any
    //
    SnmpMessage respMsg = null;
    if (reqMsg != null) {
        respMsg = makeResponseMessage(reqMsg);
    }
    //
    if (respMsg != null) {
        try {
            reqPacket.setLength(respMsg.encodeMessage(reqPacket.getData()));
            respPacket = reqPacket;
        } catch (SnmpTooBigException x) {
            if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
                SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, dbgTag, "makeResponsePacket", "response message is too big");
            }
            try {
                respMsg = newTooBigMessage(reqMsg);
                reqPacket.setLength(respMsg.encodeMessage(reqPacket.getData()));
                respPacket = reqPacket;
            } catch (SnmpTooBigException xx) {
                if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
                    SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, dbgTag, "makeResponsePacket", "'too big' is 'too big' !!!");
                }
                adaptor.incSnmpSilentDrops(1);
            }
        }
    }
    return respPacket;
}
Also used : SnmpStatusException(com.sun.jmx.snmp.SnmpStatusException) SnmpMessage(com.sun.jmx.snmp.SnmpMessage) DatagramPacket(java.net.DatagramPacket) SnmpTooBigException(com.sun.jmx.snmp.SnmpTooBigException)

Example 4 with SnmpMessage

use of com.sun.jmx.snmp.SnmpMessage in project jdk8u_jdk by JetBrains.

the class SnmpRequestHandler method newTooBigMessage.

private SnmpMessage newTooBigMessage(SnmpMessage reqMsg) throws SnmpTooBigException {
    SnmpMessage result = null;
    SnmpPduPacket reqPdu;
    try {
        reqPdu = (SnmpPduPacket) pduFactory.decodeSnmpPdu(reqMsg);
        if (reqPdu != null) {
            SnmpPduPacket respPdu = newTooBigPdu(reqPdu);
            result = (SnmpMessage) pduFactory.encodeSnmpPdu(respPdu, packet.getData().length);
        }
    } catch (SnmpStatusException x) {
        // been successfully called before.
        if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
            SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, dbgTag, "newTooBigMessage", "Internal error", x);
        }
        throw new InternalError(x);
    }
    return result;
}
Also used : SnmpStatusException(com.sun.jmx.snmp.SnmpStatusException) SnmpMessage(com.sun.jmx.snmp.SnmpMessage) SnmpPduPacket(com.sun.jmx.snmp.SnmpPduPacket)

Example 5 with SnmpMessage

use of com.sun.jmx.snmp.SnmpMessage in project jdk8u_jdk by JetBrains.

the class SnmpAdaptorServer method sendTrapPdu.

/**
     * Send the specified trap PDU to every destinations from the ACL file.
     */
private void sendTrapPdu(SnmpPduPacket pdu) throws SnmpStatusException, IOException {
    // Make an SNMP message from the pdu
    //
    SnmpMessage msg = null;
    try {
        msg = (SnmpMessage) pduFactory.encodeSnmpPdu(pdu, bufferSize);
        if (msg == null) {
            throw new SnmpStatusException(SnmpDefinitions.snmpRspAuthorizationError);
        }
    } catch (SnmpTooBigException x) {
        if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
            SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, dbgTag, "sendTrapPdu", "Trap pdu is too big. " + "Trap hasn't been sent to anyone");
        }
        throw new SnmpStatusException(SnmpDefinitions.snmpRspTooBig);
    // FIXME: is the right exception to throw ?
    // We could simply forward SnmpTooBigException ?
    }
    // Now send the SNMP message to each destination
    //
    int sendingCount = 0;
    openTrapSocketIfNeeded();
    if (ipacl != null) {
        Enumeration<InetAddress> ed = ipacl.getTrapDestinations();
        while (ed.hasMoreElements()) {
            msg.address = ed.nextElement();
            Enumeration<String> ec = ipacl.getTrapCommunities(msg.address);
            while (ec.hasMoreElements()) {
                msg.community = ec.nextElement().getBytes();
                try {
                    sendTrapMessage(msg);
                    sendingCount++;
                } catch (SnmpTooBigException x) {
                    if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
                        SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, dbgTag, "sendTrapPdu", "Trap pdu is too big. " + "Trap hasn't been sent to " + msg.address);
                    }
                }
            }
        }
    }
    //
    if (sendingCount == 0) {
        try {
            msg.address = InetAddress.getLocalHost();
            sendTrapMessage(msg);
        } catch (SnmpTooBigException x) {
            if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
                SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, dbgTag, "sendTrapPdu", "Trap pdu is too big. " + "Trap hasn't been sent.");
            }
        } catch (UnknownHostException e) {
            if (SNMP_ADAPTOR_LOGGER.isLoggable(Level.FINEST)) {
                SNMP_ADAPTOR_LOGGER.logp(Level.FINEST, dbgTag, "sendTrapPdu", "Trap pdu is too big. " + "Trap hasn't been sent.");
            }
        }
    }
    closeTrapSocketIfNeeded();
}
Also used : SnmpStatusException(com.sun.jmx.snmp.SnmpStatusException) UnknownHostException(java.net.UnknownHostException) SnmpMessage(com.sun.jmx.snmp.SnmpMessage) SnmpTooBigException(com.sun.jmx.snmp.SnmpTooBigException) InetAddress(java.net.InetAddress)

Aggregations

SnmpMessage (com.sun.jmx.snmp.SnmpMessage)5 SnmpStatusException (com.sun.jmx.snmp.SnmpStatusException)5 SnmpTooBigException (com.sun.jmx.snmp.SnmpTooBigException)4 SnmpPduPacket (com.sun.jmx.snmp.SnmpPduPacket)2 InterruptedIOException (java.io.InterruptedIOException)1 DatagramPacket (java.net.DatagramPacket)1 InetAddress (java.net.InetAddress)1 SocketException (java.net.SocketException)1 UnknownHostException (java.net.UnknownHostException)1