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;
        }


Reply via email to