1 // NAME
2 // $RCSfile: SNMPBean.java,v $
3 // DESCRIPTION
4 // [given below in javadoc format]
5 // DELTA
6 // $Revision: 1.12 $
7 // CREATED
8 // $Date: 2006/01/26 12:38:30 $
9 // COPYRIGHT
10 // Westhawk Ltd
11 // TO DO
12 //
13
14 /*
15 * Copyright (C) 1998 - 2006 by Westhawk Ltd
16 *
17 * Permission to use, copy, modify, and distribute this software
18 * for any purpose and without fee is hereby granted, provided
19 * that the above copyright notices appear in all copies and that
20 * both the copyright notice and this permission notice appear in
21 * supporting documentation.
22 * This software is provided "as is" without express or implied
23 * warranty.
24 * author <a href="mailto:snmp@westhawk.co.uk">Tim Panton</a>
25 */
26
27 package uk.co.westhawk.snmp.beans;
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 uk.co.westhawk.snmp.stack.*;
52 import uk.co.westhawk.snmp.pdu.*;
53 import java.awt.*;
54 import java.util.*;
55 import java.text.*;
56 import java.lang.*;
57 import java.io.*;
58 import java.beans.*;
59
60 /**
61 * <p>
62 * This bean forms the base of the SNMP beans.
63 * </p>
64 *
65 * <p>
66 * It provides the setting of the properties that are always needed when
67 * sending a SNMP request:
68 * </p>
69 * <ul>
70 * <li>host, default is <em>localhost</em></li>
71 * <li>port, default is <em>161</em></li>
72 * <li>community name, default is <em>public</em></li>
73 * <li>bindAddr, default is <em>null</em></li>
74 * <li>socket type, default is <em>Standard</em></li>
75 * </ul>
76 *
77 * <p>
78 * The bean will only come into action when the method <em>action()</em> is
79 * called. This should be done after the properties have been set.
80 * </p>
81 *
82 * <p>
83 * This bean also provide the methods for adding and removing property
84 * change listeners and firing property change events.
85 * </p>
86 *
87 * <p>
88 * Note: This bean will create a socket. This might result in a
89 * SecurityException because of the Java security policy.
90 * </p>
91 * <ul>
92 * <li>
93 * If you are an applet: you're only connect back to its source web server
94 * </li>
95 * <li>
96 * If you are an application or servlet: java allows you to send it. The
97 * host might refuse your connection.
98 * </li>
99 * </ul>
100 *
101 * <p>
102 * The SNMP request will only succeed if:
103 * </p>
104 * <ul>
105 * <li>
106 * java security policy allows the opening of the socket
107 * </li>
108 * <li>
109 * the host/port combination is reachable from your location (you can
110 * check that with the ping (command line) command.
111 * </li>
112 * <li>
113 * the combination of OID and community name is correct
114 * </li>
115 * </ul>
116 *
117 * @see SNMPRunBean
118 * @see IsHostReachableBean
119 * @see OneInterfaceBean
120 * @see InterfaceIndexesBean
121 *
122 * @author <a href="mailto:snmp@westhawk.co.uk">Birgit Arkesteijn</a>
123 * @version $Revision: 1.12 $ $Date: 2006/01/26 12:38:30 $
124 *
125 */
126 public abstract class SNMPBean {
127 private static final String version_id = "@(#)$Id: SNMPBean.java,v 1.12 2006/01/26 12:38:30 birgit Exp $ Copyright Westhawk Ltd";
128
129 protected SnmpContext context = null;
130
131 protected String host = "localhost";
132 protected String bindAddr = null;
133 protected int port = 161;
134 protected String community = "public";
135 protected String socketType = SnmpContextBasisFace.STANDARD_SOCKET;
136 protected String message = "";
137
138 protected Vector propertyChangeListener = null;
139
140 /**
141 * This method should send the SNMP request. All properties should be
142 * set before this method is called.
143 */
144 public abstract void action()
145 throws PduException, IOException;
146
147 /**
148 * The default constructor.
149 */
150 public SNMPBean() {
151 propertyChangeListener = new Vector();
152 }
153
154 /**
155 * The constructor that will set the host and the port no.
156 *
157 * @param h the hostname
158 * @param p the port no
159 * @see #setHost
160 * @see #setPort
161 */
162 public SNMPBean(String h, int p) {
163 this(h, p, null, SnmpContextBasisFace.STANDARD_SOCKET);
164 }
165
166 /**
167 * The constructor that will set the host, the port no and the local
168 * bind address.
169 *
170 * @param h the hostname
171 * @param p the port no
172 * @param b the local bind address
173 * @param t the socket type
174 * @see #setHost
175 * @see #setPort
176 * @see #setBindAddress
177 * @see #setSocketType
178 *
179 * @since 4_14
180 */
181 public SNMPBean(String h, int p, String b, String t) {
182 this();
183 setHost(h);
184 setPort(p);
185 setBindAddress(b);
186 setSocketType(t);
187 }
188
189 /**
190 * Returns the host (name or ipadress) which is addressed. This is the
191 * host where the SNMP server is running.
192 *
193 * @return the name of the host
194 * @see #setHost
195 */
196 public String getHost() {
197 return host;
198 }
199
200 /**
201 * Sets the host (name or ipadress) which will be asked for the SNMP request.
202 * This is the host where the SNMP server is running.
203 * The default is <em>localhost</em>.
204 *
205 * This bean will only start the request when action is called.
206 *
207 * @see #getHost
208 */
209 public void setHost(String h) {
210 if (h != null && h.length() > 0 && !host.equals(h)) {
211 host = h;
212 }
213 }
214
215 /**
216 * Returns the port no which is used. That is the no of the port on the
217 * host where the SNMP server is running.
218 *
219 * @see #setPort(int)
220 * @see #setPort(String)
221 */
222 public int getPort() {
223 return port;
224 }
225
226 /**
227 * Sets the port no which is used. That should be the no of the port on the
228 * host where the SNMP server is running.
229 * The default is <em>161</em>.
230 *
231 * This bean will only start the request when action is called.
232 *
233 * @param p The number of the port
234 * @see #getPort
235 * @see #setPort(String)
236 */
237 public void setPort(int p) {
238 if (p > 0 && port != p) {
239 port = p;
240 }
241 }
242
243 /**
244 * Sets the port no which is used as a String.
245 *
246 * @param p The number of the port as a String
247 * @see #getPort
248 * @see #setPort(int)
249 */
250 public void setPort(String p) {
251 int pNo;
252 try {
253 pNo = Integer.valueOf(p.trim()).intValue();
254 setPort(pNo);
255 } catch (NumberFormatException exp) {
256 }
257 }
258
259 /**
260 * Returns the community name that is used to send the SNMP request.
261 *
262 * @see #setCommunityName
263 */
264 public String getCommunityName() {
265 return community;
266 }
267
268 /**
269 * Sets the community name that is used to send the SNMP request. The
270 * default is <em>public</em>.
271 *
272 * @see #getCommunityName
273 */
274 public void setCommunityName(String c) {
275 if (c != null & !community.equals(c)) {
276 community = c;
277 if (context != null) {
278 context.setCommunity(community);
279 }
280 }
281 }
282
283 /**
284 * Returns the local bind address.
285 *
286 * @return the name of the local bind address
287 * @see #setBindAddress
288 * @since 4_14
289 */
290 public String getBindAddress() {
291 return bindAddr;
292 }
293
294 /**
295 * Sets the local bind address.
296 * The default is <em>null</em>.
297 *
298 * This bean will only start the request when action is called.
299 *
300 * @see #getBindAddress
301 * @since 4_14
302 */
303 public void setBindAddress(String b) {
304 bindAddr = b;
305 }
306
307 /**
308 * Returns the socket type.
309 *
310 * @return the socket type.
311 * @see #setSocketType
312 * @since 4_14
313 */
314 public String getSocketType() {
315 return socketType;
316 }
317
318 /**
319 * Sets socket type.
320 * The default is <em>null</em>.
321 *
322 * This bean will only start the request when action is called.
323 *
324 * @see #getSocketType
325 * @see SnmpContextBasisFace#STANDARD_SOCKET
326 * @since 4_14
327 */
328 public void setSocketType(String t) {
329 socketType = t;
330 }
331
332 /**
333 * Indicates whether the host is reachable.
334 * This method will try to make a new SnmpContext, if this works, it is
335 * reachable.
336 * If it does not work, the message will be set.
337 *
338 * @see SnmpContext
339 */
340 protected boolean isHostPortReachable() {
341 boolean res = true;
342 if (host != null
343 &&
344 host.length() > 0
345 &&
346 port > 0) {
347 try {
348 if (context != null) {
349 context.destroy();
350 context = null;
351 }
352
353 context = new SnmpContext(host, port, bindAddr, socketType);
354 context.setCommunity(community);
355 setMessage("Connection to host " + host
356 + " is made succesfully");
357 } catch (IOException exc) {
358 res = false;
359 setMessage("IOException: " + exc.getMessage());
360 } catch (RuntimeException exc) {
361 res = false;
362 setMessage("RuntimeException: " + exc.getMessage());
363 }
364 } else {
365 res = false;
366 }
367 return res;
368 }
369
370 /**
371 * Returns the message (if any). The message is used to give the user
372 * feedback if anything is happened with the request or the connection.
373 *
374 * @return the message
375 */
376 public String getMessage() {
377 return message;
378 }
379
380 /**
381 * Returns the message (if any). The message is used to give the user
382 * feedback if anything is happened (usually when something went wrong)
383 * with the connection.
384 *
385 * @param st the message string
386 * @see #getMessage()
387 */
388 protected void setMessage(String st) {
389 message = st;
390 }
391
392 /**
393 * Add a property change listener.
394 *
395 * @see #removePropertyChangeListener
396 */
397 public synchronized void addPropertyChangeListener(PropertyChangeListener l) {
398 propertyChangeListener.addElement(l);
399 }
400
401 /**
402 * Remove a property change listener.
403 *
404 * @see #addPropertyChangeListener
405 */
406 public synchronized void removePropertyChangeListener(PropertyChangeListener l) {
407 propertyChangeListener.removeElement(l);
408 }
409
410 /**
411 * Fire the property event.
412 *
413 * @see #removePropertyChangeListener
414 * @see #addPropertyChangeListener
415 * @see PropertyChangeEvent
416 * @see PropertyChangeListener
417 */
418 protected void firePropertyChange(String property, Object old_v, Object new_v) {
419 Vector listeners;
420 synchronized (this) {
421 listeners = (Vector) propertyChangeListener.clone();
422 }
423
424 PropertyChangeEvent event = new PropertyChangeEvent(this,
425 property, old_v, new_v);
426
427 int sz = listeners.size();
428 for (int i = 0; i < sz; i++) {
429 PropertyChangeListener l = (PropertyChangeListener) listeners.elementAt(i);
430 l.propertyChange(event);
431 }
432 }
433
434 }