View Javadoc
1   // NAME
2   //      $RCSfile: OneInterfaceBean.java,v $
3   // DESCRIPTION
4   //      [given below in javadoc format]
5   // DELTA
6   //      $Revision: 1.14 $
7   // CREATED
8   //      $Date: 2006/01/25 18:08:56 $
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 collects information about one interface. 
63   * </p>
64   *
65   * <p>
66   * The properties in the parent classes should be set, before calling
67   * the action() method. Via a PropertyChangeEvent the application/applet
68   * will be notified.
69   * </p>
70   *
71   * @see SNMPBean#setHost
72   * @see SNMPBean#setPort
73   * @see SNMPBean#setCommunityName
74   * @see SNMPRunBean#setUpdateInterval
75   * @see #setIndex(int)
76   * @see SNMPBean#addPropertyChangeListener
77   * @see SNMPBean#action
78   * @see InterfaceGetNextPdu
79   * @see InterfaceIndexesBean
80   * 
81   * @author <a href="mailto:snmp@westhawk.co.uk">Birgit Arkesteijn</a>
82   * @version $Revision: 1.14 $ $Date: 2006/01/25 18:08:56 $
83   */
84  public class OneInterfaceBean extends SNMPRunBean implements Observer {
85      private static final String version_id = "@(#)$Id: OneInterfaceBean.java,v 1.14 2006/01/25 18:08:56 birgit Exp $ Copyright Westhawk Ltd";
86  
87      private InterfaceGetNextPdu pdu, prev;
88  
89      private boolean isPduInFlight;
90      private Date lastUpdateDate = null;
91  
92      private int index = 1;
93      private String descr = "";
94      private String operState = "";
95      private long speed = -1;
96  
97      /**
98       * The default constructor.
99       */
100     public OneInterfaceBean() {
101     }
102 
103     /**
104      * The constructor that will set the host and the port no.
105      *
106      * @param h the hostname
107      * @param p the port no
108      * @see SNMPBean#setHost
109      * @see SNMPBean#setPort
110      */
111     public OneInterfaceBean(String h, int p) {
112         this(h, p, null);
113     }
114 
115     /**
116      * The constructor that will set the host, the port no and the local
117      * bind address.
118      *
119      * @param h the hostname
120      * @param p the port no
121      * @param b the local bind address
122      * @see SNMPBean#setHost
123      * @see SNMPBean#setPort
124      * @see SNMPBean#setBindAddress
125      *
126      * @since 4_14
127      */
128     public OneInterfaceBean(String h, int p, String b) {
129         this();
130         setHost(h);
131         setPort(p);
132         setBindAddress(b);
133     }
134 
135     /**
136      * Sets the index of the interface that will be requested.
137      * 
138      * @param i the index
139      * @see #getIndex()
140      */
141     public void setIndex(int i) {
142         if (index != i) {
143             index = i;
144         }
145     }
146 
147     /**
148      * Returns the index of the interface.
149      * 
150      * @return the index
151      * @see #setIndex(int)
152      */
153     public int getIndex() {
154         return index;
155     }
156 
157     /**
158      * Returns the description of the interface.
159      * 
160      * @return the description
161      */
162     public String getDescription() {
163         return descr;
164     }
165 
166     /**
167      * Returns the operation state of the interface.
168      * 
169      * @return the operation state
170      */
171     public String getOperStatusString() {
172         return operState;
173     }
174 
175     /**
176      * Returns the speed (bits per second) of the interface.
177      * 
178      * @return the speed
179      */
180     public long getSpeed() {
181         return speed;
182     }
183 
184     /**
185      * Returns the date of the moment when this bean was last updated.
186      * This might be null when the first time the update was not finished.
187      *
188      * @return the last update date
189      */
190     public Date getLastUpdateDate() {
191         return lastUpdateDate;
192     }
193 
194     /**
195      * This method starts sending the SNMP request. All properties should be
196      * set before this method is called.
197      *
198      * The actual sending will take place in the run method.
199      * It makes a new snmp context and initialises all variables before
200      * starting.
201      */
202     public void action() {
203         if (isHostPortReachable()) {
204             lastUpdateDate = new Date();
205             isPduInFlight = false;
206             setRunning(true);
207         }
208     }
209 
210     /**
211      * The run method according to the Runnable interface.
212      * This method will send the Pdu request, if the previous one is not
213      * still in flight.
214      * 
215      * @see SNMPRunBean#isRunning()
216      */
217     public void run() {
218         while (context != null && isRunning()) {
219             if (isPduInFlight == false) {
220                 isPduInFlight = true;
221                 prev = pdu;
222                 try {
223                     pdu = new InterfaceGetNextPdu(context);
224                     pdu.addObserver(this);
225                     pdu.addOids(index - 1);
226                     pdu.send();
227                 } catch (PduException exc) {
228                     System.out.println("PduException " + exc.getMessage());
229                 } catch (IOException exc) {
230                     System.out.println("IOException " + exc.getMessage());
231                 }
232             }
233 
234             try {
235                 Thread.sleep(interval);
236             } catch (InterruptedException ix) {
237                 ;
238             }
239         }
240     }
241 
242     /**
243      * The update method according to the Observer interface, it will be
244      * called when the Pdu response is received.
245      * The speed is calculated with the previous answer, after that the
246      * property change event is fired.
247      *
248      * @see SNMPBean#addPropertyChangeListener
249      */
250     public void update(Observable obs, Object ov) {
251         if (pdu.getErrorStatus() == AsnObject.SNMP_ERR_NOERROR) {
252             if (prev != null) {
253                 speed = pdu.getSpeed(prev);
254             }
255 
256             descr = pdu.getIfDescr();
257             operState = pdu.getIfOperStatusStr();
258 
259             lastUpdateDate = new Date();
260             isPduInFlight = false;
261             firePropertyChange("Interface", null, null);
262         }
263     }
264 
265 }