View Javadoc
1   // NAME
2   //      $RCSfile: IsHostReachableBean.java,v $
3   // DESCRIPTION
4   //      [given below in javadoc format]
5   // DELTA
6   //      $Revision: 1.14 $
7   // CREATED
8   //      $Date: 2006/01/26 12:38:59 $
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 will determine whether the host+port is up, by sending an
63   * UpSincePdu.
64   * </p>
65   *
66   * <p>
67   * The properties in the parent classes should be set, before calling
68   * the action() method. Via a PropertyChangeEvent the application/applet
69   * will be notified.
70   * </p>
71   *
72   * @see SNMPBean#setHost
73   * @see SNMPBean#setPort
74   * @see SNMPBean#setCommunityName
75   * @see SNMPBean#addPropertyChangeListener
76   * @see SNMPBean#action
77   * @see UpSincePdu
78   * 
79   * @author <a href="mailto:snmp@westhawk.co.uk">Birgit Arkesteijn</a>
80   * @version $Revision: 1.14 $ $Date: 2006/01/26 12:38:59 $
81   *
82   */
83  public class IsHostReachableBean extends SNMPBean implements Observer {
84      private static final String version_id = "@(#)$Id: IsHostReachableBean.java,v 1.14 2006/01/26 12:38:59 birgit Exp $ Copyright Westhawk Ltd";
85  
86      private UpSincePdu pdu;
87  
88      private Date upSince = null;
89      private boolean isReachable = false;
90  
91      private SimpleDateFormat dateFormat;
92  
93      /**
94       * The default constructor.
95       */
96      public IsHostReachableBean() {
97          dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss zzz");
98          dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
99      }
100 
101     /**
102      * The constructor that will set the host and the port no.
103      *
104      * @param h the hostname
105      * @param p the port no
106      * @see SNMPBean#setHost
107      * @see SNMPBean#setPort
108      */
109     public IsHostReachableBean(String h, int p) {
110         this(h, p, null);
111     }
112 
113     /**
114      * The constructor that will set the host, the port no and the local
115      * bind address.
116      *
117      * @param h the hostname
118      * @param p the port no
119      * @param b the local bind address
120      * @see SNMPBean#setHost
121      * @see SNMPBean#setPort
122      * @see SNMPBean#setBindAddress
123      *
124      * @since 4_14
125      */
126     public IsHostReachableBean(String h, int p, String b) {
127         this();
128         setHost(h);
129         setPort(p);
130         setBindAddress(b);
131     }
132 
133     /**
134      * Returns the date when the host went up. This might be null is no
135      * answer is received yet.
136      * 
137      * @return the date
138      *
139      * @see SNMPBean#getMessage()
140      * @see #isReachable()
141      */
142     public Date getUpSinceDate() {
143         return upSince;
144     }
145 
146     /**
147      * Answer is set according to the received SNMP response.
148      * 
149      * @see #getUpSinceDate()
150      */
151     protected void setUpSinceDate(Date d) {
152         upSince = d;
153     }
154 
155     /**
156      * Indicates whether the host + port is reachable.
157      * The host + port is reachable if a valid response is received from a
158      * UpSincePdu request.
159      * 
160      * @return is the host + port + community name valid
161      *
162      * @see SNMPBean#getMessage()
163      * @see #getUpSinceDate()
164      */
165     public boolean isReachable() {
166         return isReachable;
167     }
168 
169     /**
170      * The reachable property is set according to the succes of making
171      * a connection and the response of the SNMP request.
172      * This method will fire a Property Change Event.
173      *
174      * @see #isReachable()
175      * @see SNMPBean#addPropertyChangeListener
176      */
177     protected void setReachable(boolean b) {
178         boolean old;
179         old = isReachable;
180         isReachable = b;
181 
182         firePropertyChange("Reachable", new Boolean(old),
183                 new Boolean(isReachable));
184     }
185 
186     /**
187      * This method performs the request and wait for it. It is not
188      * recommended to use the waitForSelf option, preferred is the action()
189      * method.
190      * Use it if it is really necessary to wait.
191      *
192      * @see SnmpContext
193      * @see #action()
194      * @see Pdu#waitForSelf()
195      */
196     public void waitForSelfAction()
197             throws PduException, IOException {
198         action(true);
199     }
200 
201     /**
202      * This method actually performs the request. All properties should be
203      * set before this method is called.
204      *
205      * This will create a new SnmpContext and send a UpSincePdu SNMP
206      * request.
207      * If the connection fails, the reachable property will be set to false.
208      *
209      * @see SnmpContext
210      */
211     public void action()
212             throws PduException, IOException {
213         action(false);
214     }
215 
216     protected void action(boolean wait)
217             throws PduException, IOException {
218         if (host != null
219                 &&
220                 host.length() > 0
221                 &&
222                 port > 0) {
223             try {
224                 if (context != null) {
225                     context.destroy();
226                 }
227                 context = new SnmpContext(host, port, bindAddr, socketType);
228                 context.setCommunity(community);
229                 setMessage("Connection to host " + host
230                         + " is made succesfully");
231 
232                 if (wait == true) {
233                     pdu = new UpSincePdu(context, null);
234                     if (pdu.waitForSelf()) {
235                         this.update((Observable) pdu, (Object) null);
236                     } else {
237                         setMessage("No SNMP Response from " + host);
238                     }
239                 } else {
240                     pdu = new UpSincePdu(context, this);
241                 }
242             } catch (IOException exc) {
243                 setMessage("IOException: " + exc.getMessage());
244                 setReachable(false);
245             } catch (RuntimeException exc) {
246                 setMessage("RuntimeException: " + exc.getMessage());
247                 setReachable(false);
248             }
249         }
250     }
251 
252     /**
253      * The update method according to the Observer interface, it will be
254      * called when the Pdu response is received.
255      * If there is no error it means that the host is reachable. If it is
256      * not reachable the message will contain the type of error, if it is
257      * reachable the message will say since when the host is up.
258      */
259     public void update(Observable obs, Object ov) {
260         pdu = (UpSincePdu) obs;
261 
262         if (pdu.getErrorStatus() == AsnObject.SNMP_ERR_NOERROR) {
263             setUpSinceDate(pdu.getDate());
264             setMessage("Host " + host + " is up since "
265                     + dateFormat.format(getUpSinceDate()));
266             setReachable(true);
267         } else {
268             setUpSinceDate(null);
269             setMessage("SNMP Response: " + pdu.getErrorStatusString());
270             setReachable(false);
271         }
272     }
273 
274     /**
275      * Destroys the context.
276      * 
277      * @since 4_14
278      */
279     public void freeResources() {
280         if (context != null) {
281             context.destroy();
282             context = null;
283         }
284     }
285 
286 }