View Javadoc
1   // NAME
2   //      $RCSfile: SnmpContextv3Discovery.java,v $
3   // DESCRIPTION
4   //      [given below in javadoc format]
5   // DELTA
6   //      $Revision: 3.11 $
7   // CREATED
8   //      $Date: 2009/03/05 13:12:50 $
9   // COPYRIGHT
10  //      Westhawk Ltd
11  // TO DO
12  //
13  
14  /*
15   * Copyright (C) 2005 - 2006 by Westhawk Ltd
16   * <a href="www.westhawk.co.uk">www.westhawk.co.uk</a>
17   *
18   * Permission to use, copy, modify, and distribute this software
19   * for any purpose and without fee is hereby granted, provided
20   * that the above copyright notices appear in all copies and that
21   * both the copyright notice and this permission notice appear in
22   * supporting documentation.
23   * This software is provided "as is" without express or implied
24   * warranty.
25   */
26  
27  package uk.co.westhawk.snmp.stack;
28  
29  /*-
30   * ╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲
31   * SNMP Java Client
32   * ჻჻჻჻჻჻
33   * Copyright 2023 MetricsHub, Westhawk
34   * ჻჻჻჻჻჻
35   * This program is free software: you can redistribute it and/or modify
36   * it under the terms of the GNU Lesser General Public License as
37   * published by the Free Software Foundation, either version 3 of the
38   * License, or (at your option) any later version.
39   *
40   * This program is distributed in the hope that it will be useful,
41   * but WITHOUT ANY WARRANTY; without even the implied warranty of
42   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
43   * GNU General Lesser Public License for more details.
44   *
45   * You should have received a copy of the GNU General Lesser Public
46   * License along with this program.  If not, see
47   * <http://www.gnu.org/licenses/lgpl-3.0.html>.
48   * ╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱
49   */
50  
51  import java.io.*;
52  import uk.co.westhawk.snmp.beans.*;
53  
54  /**
55   * This class contains the SNMP v3 discovery context that is used by
56   * UsmBeingDiscoveredBean, when this stack is being discovered.
57   * Most of the work is done by SnmpContextv3Basis.
58   *
59   * <p>
60   * Now that the stack can send traps and receive requests, 
61   * it needs to be able to act as an
62   * authoritative SNMP engine. This is done via the interface UsmAgent.
63   * The DefaultUsmAgent is not guaranteed to work; agents (or rather 
64   * authoritative engines) <em>should</em> provide a better implementation.
65   * </p>
66   *
67   * @see DefaultUsmAgent
68   * @see UsmBeingDiscoveredBean
69   *
70   * @since 4_14
71   * @author <a href="mailto:snmp@westhawk.co.uk">Birgit Arkesteijn</a>
72   * @version $Revision: 3.11 $ $Date: 2009/03/05 13:12:50 $
73   */
74  public class SnmpContextv3Discovery extends SnmpContextv3Basis {
75      private static final String version_id = "@(#)$Id: SnmpContextv3Discovery.java,v 3.11 2009/03/05 13:12:50 birgita Exp $ Copyright Westhawk Ltd";
76  
77      /**
78       * Constructor.
79       *
80       * @param host The host to which the PDU will be sent
81       * @param port The port where the SNMP server will be
82       * @see AbstractSnmpContext#AbstractSnmpContext(String, int)
83       */
84      public SnmpContextv3Discovery(String host, int port) throws IOException {
85          super(host, port);
86      }
87  
88      /**
89       * Constructor.
90       * Parameter typeSocketA should be either STANDARD_SOCKET, TCP_SOCKET or a
91       * fully qualified classname.
92       *
93       * @param host        The host to which the Pdu will be sent
94       * @param port        The port where the SNMP server will be
95       * @param typeSocketA The local address the server will bind to
96       *
97       * @see AbstractSnmpContext#AbstractSnmpContext(String, int, String)
98       */
99      public SnmpContextv3Discovery(String host, int port, String typeSocketA)
100             throws IOException {
101         super(host, port, typeSocketA);
102     }
103 
104     /**
105      * Constructor.
106      * Parameter typeSocketA should be either STANDARD_SOCKET, TCP_SOCKET or a
107      * fully qualified classname.
108      *
109      * @param host        The host to which the PDU will be sent
110      * @param port        The port where the SNMP server will be
111      * @param bindAddress The local address the server will bind to
112      * @param typeSocketA The type of socket to use.
113      *
114      * @see AbstractSnmpContext#AbstractSnmpContext(String, int, String, String)
115      * @see SnmpContextBasisFace#STANDARD_SOCKET
116      * @see SnmpContextBasisFace#TCP_SOCKET
117      * @since 4_14
118      */
119     public SnmpContextv3Discovery(String host, int port, String bindAddress, String typeSocketA)
120             throws IOException {
121         super(host, port, bindAddress, typeSocketA);
122     }
123 
124     /**
125      * Processes an incoming Discovery (and only Discovery) PDU.
126      * <p>
127      * See <a href="http://www.ietf.org/rfc/rfc3414.txt">SNMP-USER-BASED-SM-MIB</a>.
128      * </p>
129      *
130      * @see #rawPduReceived
131      */
132     public Pdu processIncomingPdu(byte[] message)
133             throws DecodingException, IOException {
134         String msg = checkContextSanity();
135         if (msg != null) {
136             throw new DecodingException(msg);
137         }
138         int l = message.length;
139         byte[] copyOfMessage = new byte[l];
140         System.arraycopy(message, 0, copyOfMessage, 0, l);
141 
142         AsnDecoderv3 rpdu = new AsnDecoderv3();
143         ByteArrayInputStream in = new ByteArrayInputStream(message);
144         AsnSequence asnTopSeq = rpdu.DecodeSNMPv3(in);
145         int msgId = rpdu.getMessageId(asnTopSeq);
146         AsnPduSequence pduSeq = rpdu.processSNMPv3(this, asnTopSeq, copyOfMessage, true);
147 
148         Pdu pdu = null;
149         if (pduSeq != null) {
150             byte type = pduSeq.getRespType();
151             if (type == SnmpConstants.GET_REQ_MSG && pduSeq.isSnmpv3Discovery() == true) {
152                 pdu = new GetPdu(this);
153             } else {
154                 /*
155                  * These cannot be sent as discovery pdu;
156                  * SnmpConstants.GETNEXT_REQ_MSG
157                  * SnmpConstants.SET_REQ_MSG
158                  * SnmpConstants.GETBULK_REQ_MSG
159                  * SnmpConstants.INFORM_REQ_MSG
160                  * SnmpConstants.GET_RSP_MSG
161                  * SnmpConstants.GET_RPRT_MSG
162                  * SnmpConstants.TRPV2_REQ_MSG
163                  */
164 
165                 if (AsnObject.debug > 3) {
166                     System.out.println(getClass().getName()
167                             + ".ProcessIncomingPdu(): PDU received with type "
168                             + pduSeq.getRespTypeString()
169                             + ". Ignoring it.");
170                 }
171             }
172 
173             if (pdu != null) {
174                 pdu.fillin(pduSeq);
175                 pdu.snmpv3MsgId = new Integer(msgId);
176             }
177         }
178         return pdu;
179     }
180 
181     /**
182      * Returns a clone of this SnmpContextv3.
183      *
184      * @exception CloneNotSupportedException Thrown when the constructor
185      *                                       generates an IOException
186      */
187     public Object clone() throws CloneNotSupportedException {
188         SnmpContextv3Discovery clContext = null;
189         try {
190             clContext = new SnmpContextv3Discovery(hostname, hostPort, bindAddr, typeSocket);
191             clContext = (SnmpContextv3Discovery) cloneParameters(clContext);
192         } catch (IOException exc) {
193             throw new CloneNotSupportedException("IOException "
194                     + exc.getMessage());
195         }
196         return clContext;
197     }
198 
199 }