1 // NAME
2 // $RCSfile: InterfacePdu.java,v $
3 // DESCRIPTION
4 // [given below inOctet javadoc format]
5 // DELTA
6 // $Revision: 3.19 $
7 // CREATED
8 // $Date: 2006/11/29 16:12:50 $
9 // COPYRIGHT
10 // Westhawk Ltd
11 // TO DO
12 //
13
14 /*
15 * Copyright (C) 1996 - 1998 by Westhawk Ltd (www.westhawk.nl)
16 * Copyright (C) 1998 - 2006 by Westhawk Ltd
17 * <a href="www.westhawk.co.uk">www.westhawk.co.uk</a>
18 *
19 * Permission to use, copy, modify, and distribute this software
20 * for any purpose and without fee is hereby granted, provided
21 * that the above copyright notices appear in all copies and that
22 * both the copyright notice and this permission notice appear in
23 * supporting documentation.
24 * This software is provided "as is" without express or implied
25 * warranty.
26 * author <a href="mailto:snmp@westhawk.co.uk">Tim Panton</a>
27 */
28
29 package uk.co.westhawk.snmp.pdu;
30
31 /*-
32 * ╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲
33 * SNMP Java Client
34 * ჻჻჻჻჻჻
35 * Copyright 2023 MetricsHub, Westhawk
36 * ჻჻჻჻჻჻
37 * This program is free software: you can redistribute it and/or modify
38 * it under the terms of the GNU Lesser General Public License as
39 * published by the Free Software Foundation, either version 3 of the
40 * License, or (at your option) any later version.
41 *
42 * This program is distributed in the hope that it will be useful,
43 * but WITHOUT ANY WARRANTY; without even the implied warranty of
44 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
45 * GNU General Lesser Public License for more details.
46 *
47 * You should have received a copy of the GNU General Lesser Public
48 * License along with this program. If not, see
49 * <http://www.gnu.org/licenses/lgpl-3.0.html>.
50 * ╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱
51 */
52 import uk.co.westhawk.snmp.stack.*;
53 import java.util.*;
54
55
56 /**
57 * The InterfacePdu class asks one interface for information, useful for admin
58 * purposes.
59 * See <a href="http://www.ietf.org/rfc/rfc2863.txt">IF-MIB</a>.
60 *
61 * @author <a href="mailto:snmp@westhawk.co.uk">Tim Panton</a>
62 * @version $Revision: 3.19 $ $Date: 2006/11/29 16:12:50 $
63 * @see InterfacesPdu
64 *
65 */
66 public class InterfacePdu extends GetPdu {
67 private static final String version_id = "@(#)$Id: InterfacePdu.java,v 3.19 2006/11/29 16:12:50 birgit Exp $ Copyright Westhawk Ltd";
68
69 // see rfc 2863
70
71 /**
72 * ifNumber -
73 * The number of network interfaces (regardless of their current state)
74 * present on this system.
75 */
76 final static String IFNUMBER = "1.3.6.1.2.1.2.1.0";
77
78 /**
79 * sysUpTime -
80 * The time (in hundredths of a second) since the network management
81 * portion of the system was last re-initialized.
82 */
83 final static String SYS_UPTIME = "1.3.6.1.2.1.1.3";
84
85 /**
86 * ifDescr -
87 * A textual string containing information about the
88 * interface. This string should include the name of
89 * the manufacturer, the product name and the version
90 * of the hardware interface.
91 */
92 final static String DESCR = "1.3.6.1.2.1.2.2.1.2";
93
94 /**
95 * ifOperStatus -
96 * The current operational state of the interface.
97 * The testing(3) state indicates that no operational
98 * packets can be passed.
99 */
100 final static String OPR_STATUS = "1.3.6.1.2.1.2.2.1.8";
101
102 /**
103 * ifInOctets -
104 * The total number of octets received on the
105 * interface, including framing characters.
106 */
107 final static String IN_OCTETS = "1.3.6.1.2.1.2.2.1.10";
108
109 /**
110 * ifOutOctets -
111 * The total number of octets transmitted outOctets of the
112 * interface, including framing characters.
113 */
114 final static String OUT_OCTETS = "1.3.6.1.2.1.2.2.1.16";
115
116 /**
117 * The current operational state is up
118 */
119 final public static String UP = "up";
120 /**
121 * The current operational state is down
122 */
123 final public static String DOWN = "down";
124 /**
125 * The current operational state is testing
126 */
127 final public static String TESTING = "testing";
128 /**
129 * The current operational state is unknown
130 */
131 final public static String UNKNOWN = "unknown";
132
133 long sysUpTime;
134 int operStatus;
135 long inOctet;
136 long outOctet;
137 long speed;
138 int index;
139 String descr;
140 boolean valid = false;
141
142 /**
143 * Constructor.
144 * It permits this package to create this PDU without data.
145 *
146 * @param con The context of the request
147 */
148 InterfacePdu(SnmpContextBasisFace con) {
149 super(con);
150 }
151
152 /**
153 * Constructor that will send the request immediately.
154 *
155 * @param con the SnmpContextBasisFace
156 * @param o the Observer that will be notified when the answer is received
157 * @param interf the index of the requested interface
158 */
159 public InterfacePdu(SnmpContextBasisFace con, Observer o, int interf)
160 throws PduException, java.io.IOException {
161 super(con);
162
163 addOids(interf);
164 if (o != null) {
165 addObserver(o);
166 }
167 index = interf;
168 send();
169 }
170
171 /**
172 * Returns the index of the interface.
173 *
174 * @return the index
175 */
176 public int getIndex() {
177 return index;
178 }
179
180 /**
181 * Returns the time (in hundredths of a second) since the network management
182 * portion of the system was last re-initialized.
183 */
184 public long getSysUpTime() {
185 return sysUpTime;
186 }
187
188 /**
189 * Returns the description of the interface.
190 *
191 * @return the description
192 */
193 public String getDescription() {
194 return descr;
195 }
196
197 /**
198 * Returns the operational state of the interface.
199 *
200 * @return the operational state
201 */
202 public int getOperStatus() {
203 return operStatus;
204 }
205
206 /**
207 * Returns the string representation of the operational state of the
208 * interface.
209 *
210 * @return the operational state as string
211 * @see #getOperStatus()
212 * @see #getOperStatusString(int)
213 */
214 public String getOperStatusString() {
215 return getOperStatusString(operStatus);
216 }
217
218 /**
219 * Returns the string representation of a operational state.
220 *
221 * @see #getOperStatusString()
222 */
223 public String getOperStatusString(int status) {
224 String str = null;
225 switch (status) {
226 case 1:
227 str = UP;
228 break;
229 case 2:
230 str = DOWN;
231 break;
232 case 3:
233 str = TESTING;
234 break;
235 default:
236 str = UNKNOWN;
237 }
238 return str;
239 }
240
241 /**
242 * Returns the total number of octets received on the
243 * interface, including framing characters.
244 */
245 public long getInOctet() {
246 return inOctet;
247 }
248
249 /**
250 * Returns the total number of octets transmitted outOctets of the
251 * interface, including framing characters.
252 */
253 public long getOutOctet() {
254 return outOctet;
255 }
256
257 /**
258 * Calculates the speed of the interface. This is done by providing the
259 * method with <i>the previous value of this interface</i>. An interface
260 * is marked by its index.
261 *
262 * @param old The previous value of this interface
263 */
264 public long getSpeed(InterfacePdu old) {
265 long speed = -1;
266 if ((this.operStatus < 1) || (old.operStatus < 1)
267 ||
268 !this.valid || !old.valid) {
269 return -1;
270 }
271 long tdif = (this.sysUpTime - old.sysUpTime);
272 if (tdif != 0) {
273 speed = 100 * ((this.inOctet - old.inOctet)
274 + (this.outOctet - old.outOctet)) / tdif;
275 }
276 return speed;
277 }
278
279 void addOids(int interf) {
280 addOid(SYS_UPTIME + ".0");
281 addOid(DESCR + "." + interf);
282 addOid(OPR_STATUS + "." + interf);
283 addOid(IN_OCTETS + "." + interf);
284 addOid(OUT_OCTETS + "." + interf);
285 }
286
287 /**
288 * The value of the request is set. This will be called by
289 * Pdu.fillin().
290 *
291 * @param n the index of the value
292 * @param res the value
293 * @see Pdu#new_value
294 */
295 protected void new_value(int n, varbind res) {
296 AsnObject obj = res.getValue();
297 if (getErrorStatus() == AsnObject.SNMP_ERR_NOERROR) {
298 try {
299 switch (n) {
300 case 0:
301 sysUpTime = ((AsnUnsInteger) obj).getValue();
302 break;
303 case 1:
304 descr = ((AsnOctets) obj).getValue();
305 break;
306 case 2:
307 operStatus = ((AsnInteger) obj).getValue();
308 break;
309 case 3:
310 inOctet = ((AsnUnsInteger) obj).getValue();
311 break;
312 case 4:
313 outOctet = ((AsnUnsInteger) obj).getValue();
314 valid = true;
315 break;
316 default:
317 valid = false;
318 }
319 } catch (ClassCastException exc) {
320 sysUpTime = 0;
321 descr = null;
322 operStatus = 0;
323 inOctet = 0;
324 outOctet = 0;
325 valid = false;
326 }
327 } else {
328 valid = false;
329 }
330 }
331
332 /**
333 * This method notifies all observers.
334 * This will be called by Pdu.fillin().
335 *
336 * <p>
337 * Unless an exception occurred the Object to the update() method of the
338 * Observer will be a varbind, so any AsnObject type can be returned.
339 * In the case of an exception, that exception will be passed.
340 * </p>
341 */
342 protected void tell_them() {
343 notifyObservers(this);
344 }
345
346 /**
347 * Returns how many interfaces are present.
348 *
349 * @return the number of interfaces
350 */
351 public static int getNumIfs(SnmpContextBasisFace con)
352 throws PduException, java.io.IOException {
353 int ifCount = 0;
354
355 if (con != null) {
356 OneIntPdu numIfs = new OneIntPdu(con, IFNUMBER);
357 boolean answered = numIfs.waitForSelf();
358 boolean timedOut = numIfs.isTimedOut();
359 if (answered == true && timedOut == false) {
360 ifCount = numIfs.getValue().intValue();
361 }
362 }
363 return ifCount;
364 }
365
366 }