Author: cyberdo
Date: 2006-02-01 23:01:25 +0000 (Wed, 01 Feb 2006)
New Revision: 7987
Added:
trunk/freenet/src/snmplib/InfoSystem.java
trunk/freenet/src/snmplib/MultiplexedDataFetcher.java
Modified:
trunk/freenet/src/freenet/node/Version.java
trunk/freenet/src/snmplib/SNMPAgent.java
trunk/freenet/src/snmplib/SNMPStarter.java
Log:
426: Initialzing more dynamic and less memory consuming handling of SNMP
UCD-SNMP-MIB::memTotalReal.0 and UCD-SNMP-MIB::memAvailReal.0 added.
SNMP-Agent might very well be highly unstable!!!
When using snmpwalk or similar, start at .1.3.1 or .1.3.6
Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-02-01 20:09:49 UTC (rev
7986)
+++ trunk/freenet/src/freenet/node/Version.java 2006-02-01 23:01:25 UTC (rev
7987)
@@ -20,7 +20,7 @@
public static final String protocolVersion = "1.0";
/** The build number of the current revision */
- private static final int buildNumber = 425;
+ private static final int buildNumber = 426;
/** Oldest build of Fred we will talk to */
private static final int lastGoodBuild = 403;
Added: trunk/freenet/src/snmplib/InfoSystem.java
===================================================================
--- trunk/freenet/src/snmplib/InfoSystem.java 2006-02-01 20:09:49 UTC (rev
7986)
+++ trunk/freenet/src/snmplib/InfoSystem.java 2006-02-01 23:01:25 UTC (rev
7987)
@@ -0,0 +1,37 @@
+package snmplib;
+
+public class InfoSystem implements MultiplexedDataFetcher {
+ long created;
+
+ public InfoSystem() {
+ created = System.currentTimeMillis()/1000;
+ }
+
+ public String getSNMPOID(int index) {
+ switch (index) {
+ case 3: //SNMPv2-MIB::sysUpTime.0
+ return ".1.3.6.1.2.1.1.3.0";
+ case 0: //UCD-SNMP-MIB::memTotalReal.0
+ return ".1.3.6.1.4.1.2021.4.5.0";
+ case 1: //UCD-SNMP-MIB::memAvailReal.0
+ return ".1.3.6.1.4.1.2021.4.6.0";
+ }
+ // default
+ return null;
+ }
+
+ public Object getSNMPData(String oid) {
+ Runtime r = Runtime.getRuntime();
+ int oidhc = oid.hashCode();
+ if (oid.equals(".1.3.6.1.2.1.1.3.0")) //SNMPv2-MIB::sysUpTime.0
+ return new Long(System.currentTimeMillis()/1000 -
created);
+ if (oid.equals(".1.3.6.1.4.1.2021.4.5.0"))
//UCD-SNMP-MIB::memTotalReal.0
+ return new Long(r.totalMemory());
+ if (oid.equals(".1.3.6.1.4.1.2021.4.6.0"))
//UCD-SNMP-MIB::memAvailReal.0
+ return new Long(r.freeMemory());
+
+ return null;
+ }
+
+
+}
Added: trunk/freenet/src/snmplib/MultiplexedDataFetcher.java
===================================================================
--- trunk/freenet/src/snmplib/MultiplexedDataFetcher.java 2006-02-01
20:09:49 UTC (rev 7986)
+++ trunk/freenet/src/snmplib/MultiplexedDataFetcher.java 2006-02-01
23:01:25 UTC (rev 7987)
@@ -0,0 +1,11 @@
+package snmplib;
+
+public interface MultiplexedDataFetcher {
+
+ /* Return null when the last OID is reached */
+ public String getSNMPOID(int index);
+
+ /* Must return an Integer or a String */
+ public Object getSNMPData(String oid);
+
+}
Modified: trunk/freenet/src/snmplib/SNMPAgent.java
===================================================================
--- trunk/freenet/src/snmplib/SNMPAgent.java 2006-02-01 20:09:49 UTC (rev
7986)
+++ trunk/freenet/src/snmplib/SNMPAgent.java 2006-02-01 23:01:25 UTC (rev
7987)
@@ -57,9 +57,19 @@
}
public void addFetcher(DataFetcher df) {
- DataHandler dh = new DataHandler(df);
- alldata.put(dh.getStringOID(), dh);
+ //DataHandler dh = new DataHandler(df);
+ //alldata.put(dh.getStringOID(), dh);
+ alldata.put(df.getSNMPOID().replaceAll("^\\.1\\.3\\.",""), df);
+ //System.err.println("sAdded: " + df.getSNMPOID() + "as" +
df.getSNMPOID().replaceAll("^\\.1\\.3\\.",""));
}
+
+ public void addFetcher(MultiplexedDataFetcher df) {
+ String oid;
+ for (int i = 0 ; (oid = df.getSNMPOID(i)) != null ; i++) {
+ alldata.put(oid.replaceAll("^\\.1\\.3\\.",""), df);
+ // System.err.println("mAdded: " + oid + " as: " +
oid.replaceAll("^\\.1\\.3\\.",""));
+ }
+ }
public void removeFetcher(String OID) {
alldata.remove(((OID.startsWith("\\."))?"":".") + OID);
@@ -94,29 +104,53 @@
int replylength = 0;
boolean keyfound = false;
- DataHandler dh = null;
+ //DataHandler dh = null;
Iterator it = alldata.keySet().iterator();
String key = "";
if (rc.OID.length() == 0)
- rc.OID = ".";
+ rc.OID = "";
while (it.hasNext() && !keyfound) {
key = (String)it.next();
+ //System.err.println("is '"+ rc.OID + "' in: " + key);
if (key.startsWith(rc.OID))
keyfound = true;
}
// keyfound /\ (equal -> hasnext)
+ //System.err.println("("+keyfound+" &&
(!"+key.equals(rc.OID)+" || "+it.hasNext()+"))");
if (keyfound && (!key.equals(rc.OID) || it.hasNext())) {
key = key.equals(rc.OID)?(String)it.next():key;
- dh = (DataHandler)alldata.get(key);
- rc.lOID = (long[])dh.lOID.clone();
+ Object df = alldata.get(key);
+ //Object key = null;
+ Object data = null;
+ //dh = (DataHandler)alldata.get(key);
+ //rc.lOID = (long[])dh.lOID.clone();
+ if (df instanceof DataFetcher) {
+ data = ((DataFetcher)df).getSNMPData();
+ } else if (df instanceof MultiplexedDataFetcher) {
+ data =
((MultiplexedDataFetcher)df).getSNMPData(key);
+ if (data == null)
+ data =
((MultiplexedDataFetcher)df).getSNMPData(".1.3."+key);
+ } else
+ data = new Integer(0);
+
+ rc.lOID = splitToLong(key);
+ //System.err.println(key);
+ //for (int i = 0; i < rc.lOID.length ; i++)
+ // System.err.print("." + rc.lOID[i]);
+
- replylength = makeIntReply(buf, rc, dh.getData());
+ replylength = makeIntReply(buf, rc, data);
} else {
- rc.lOID[0] = 100;
+ if (rc.lOID.length > 0)
+ rc.lOID[0] = 100;
+ else {
+ rc.lOID = new long[1];
+ rc.lOID[0] = 0;
+ }
replylength = makeIntReply(buf, rc, new Integer(1));
}
@@ -196,12 +230,19 @@
rc.lOID = bd.fetchOID();
rc.OID = (rc.lOID.length == 0)?".":"";
for (int i = 0; i < rc.lOID.length ; i++)
- rc.OID += "." + rc.lOID[i];
+ rc.OID += (i==0?"":".") + rc.lOID[i];
}
-
-
- private class DataHandler {
+
+ private long[] splitToLong(String list) {
+ String nums[] = list.split("\\.");
+ long ret[] = new long[nums.length];
+ for(int i = 0; i < ret.length ; i++)
+ ret[i] = Long.parseLong(nums[i]);
+ return ret;
+ }
+ /*
+ private class DataHandler {
//public Integer data;
public long lOID[] = null;
DataFetcher df;
@@ -230,10 +271,10 @@
return ret;
}
}
+ */
-
private class RequestContainer {
public long lOID[] = null;
Modified: trunk/freenet/src/snmplib/SNMPStarter.java
===================================================================
--- trunk/freenet/src/snmplib/SNMPStarter.java 2006-02-01 20:09:49 UTC (rev
7986)
+++ trunk/freenet/src/snmplib/SNMPStarter.java 2006-02-01 23:01:25 UTC (rev
7987)
@@ -20,6 +20,7 @@
SNMPAgent.getSNMPAgent().addFetcher(new
DataStatisticsInfo(i, true));
SNMPAgent.getSNMPAgent().addFetcher(new
DataStatisticsInfo(i, false));
}
+ SNMPAgent.getSNMPAgent().addFetcher(new InfoSystem());
has_been_runned = true;
}