Author: zothar
Date: 2006-10-29 23:34:22 +0000 (Sun, 29 Oct 2006)
New Revision: 10745

Added:
   trunk/freenet/src/freenet/node/fcp/ConfigData.java
   trunk/freenet/src/freenet/node/fcp/GetConfig.java
   trunk/freenet/src/freenet/node/fcp/ModifyConfig.java
Modified:
   trunk/freenet/src/freenet/config/FilePersistentConfig.java
   trunk/freenet/src/freenet/config/SubConfig.java
   trunk/freenet/src/freenet/node/fcp/FCPMessage.java
Log:
Added node configuration getting and modifying via FCP.

Modified: trunk/freenet/src/freenet/config/FilePersistentConfig.java
===================================================================
--- trunk/freenet/src/freenet/config/FilePersistentConfig.java  2006-10-29 
22:30:31 UTC (rev 10744)
+++ trunk/freenet/src/freenet/config/FilePersistentConfig.java  2006-10-29 
23:34:22 UTC (rev 10745)
@@ -170,14 +170,18 @@
                }
        }

-       private synchronized SimpleFieldSet exportFieldSet() {
+       private SimpleFieldSet exportFieldSet() {
+               return exportFieldSet(false);
+       }
+
+       public synchronized SimpleFieldSet exportFieldSet(boolean withDefaults) 
{
                SimpleFieldSet fs = new SimpleFieldSet();
                SubConfig[] configs;
                synchronized(this) {
                        configs = (SubConfig[]) 
configsByPrefix.values().toArray(new SubConfig[configsByPrefix.size()]);
                }
                for(int i=0;i<configs.length;i++) {
-                       SimpleFieldSet scfs = configs[i].exportFieldSet();
+                       SimpleFieldSet scfs = 
configs[i].exportFieldSet(withDefaults);
                        fs.tput(configs[i].prefix, scfs);
                }
                return fs;

Modified: trunk/freenet/src/freenet/config/SubConfig.java
===================================================================
--- trunk/freenet/src/freenet/config/SubConfig.java     2006-10-29 22:30:31 UTC 
(rev 10744)
+++ trunk/freenet/src/freenet/config/SubConfig.java     2006-10-29 23:34:22 UTC 
(rev 10745)
@@ -181,6 +181,10 @@
        }

        public SimpleFieldSet exportFieldSet() {
+               return exportFieldSet(false);
+       }
+
+       public SimpleFieldSet exportFieldSet(boolean withDefaults) {
                SimpleFieldSet fs = new SimpleFieldSet();
                Set entrySet = map.entrySet();
                Iterator i = entrySet.iterator();
@@ -188,7 +192,7 @@
                        Map.Entry entry = (Map.Entry) i.next();
                        String key = (String) entry.getKey();
                        Option o = (Option) entry.getValue();
-                       if(o.isDefault() && !o.forceWrite) continue;
+                       if(!withDefaults && o.isDefault() && !o.forceWrite) 
continue;
                        fs.put(key, o.getValueString());
                }
                return fs;

Added: trunk/freenet/src/freenet/node/fcp/ConfigData.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ConfigData.java  2006-10-29 22:30:31 UTC 
(rev 10744)
+++ trunk/freenet/src/freenet/node/fcp/ConfigData.java  2006-10-29 23:34:22 UTC 
(rev 10745)
@@ -0,0 +1,40 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.node.fcp;
+
+import freenet.node.Node;
+import freenet.node.PeerNode;
+import freenet.support.SimpleFieldSet;
+
+public class ConfigData extends FCPMessage {
+       static final String name = "ConfigData";
+       
+       final Node node;
+       final boolean withDefaults;
+       
+       public ConfigData(Node node, boolean withDefaults) {
+               this.node = node;
+               this.withDefaults = withDefaults;
+       }
+       
+       public SimpleFieldSet getFieldSet() {
+               SimpleFieldSet fs = new SimpleFieldSet();
+               if(withDefaults) {
+                       fs = node.config.exportFieldSet(true);
+               } else {
+                       fs = node.config.exportFieldSet(false);
+               }
+               return fs;
+       }
+
+       public String getName() {
+               return name;
+       }
+
+       public void run(FCPConnectionHandler handler, Node node)
+                       throws MessageInvalidException {
+               throw new 
MessageInvalidException(ProtocolErrorMessage.INVALID_MESSAGE, "ConfigData goes 
from server to client not the other way around", null);
+       }
+
+}

Modified: trunk/freenet/src/freenet/node/fcp/FCPMessage.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPMessage.java  2006-10-29 22:30:31 UTC 
(rev 10744)
+++ trunk/freenet/src/freenet/node/fcp/FCPMessage.java  2006-10-29 23:34:22 UTC 
(rev 10745)
@@ -44,6 +44,8 @@
                        return new ClientPutMessage(fs);
                if(name.equals(GenerateSSKMessage.name))
                        return new GenerateSSKMessage(fs);
+               if(name.equals(GetConfig.name))
+                       return new GetConfig(fs);
                if(name.equals(GetNode.name))
                        return new GetNode(fs);
                if(name.equals(GetRequestStatusMessage.name))
@@ -52,6 +54,8 @@
                        return new ListPeersMessage(fs);
                if(name.equals(ListPersistentRequestsMessage.name))
                        return new ListPersistentRequestsMessage(fs);
+               if(name.equals(ModifyConfig.name))
+                       return new ModifyConfig(fs);
                if(name.equals(ModifyPeer.name))
                        return new ModifyPeer(fs);
                if(name.equals(ModifyPersistentRequest.name))

Added: trunk/freenet/src/freenet/node/fcp/GetConfig.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/GetConfig.java   2006-10-29 22:30:31 UTC 
(rev 10744)
+++ trunk/freenet/src/freenet/node/fcp/GetConfig.java   2006-10-29 23:34:22 UTC 
(rev 10745)
@@ -0,0 +1,33 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.node.fcp;
+
+import freenet.node.Node;
+import freenet.node.PeerNode;
+import freenet.support.Fields;
+import freenet.support.SimpleFieldSet;
+
+public class GetConfig extends FCPMessage {
+
+       final boolean withDefaults;
+       static final String name = "GetConfig";
+       
+       public GetConfig(SimpleFieldSet fs) {
+               withDefaults = Fields.stringToBool(fs.get("WithDefaults"), 
false);
+       }
+       
+       public SimpleFieldSet getFieldSet() {
+               return new SimpleFieldSet();
+       }
+       
+       public String getName() {
+               return name;
+       }
+       
+       public void run(FCPConnectionHandler handler, Node node)
+                       throws MessageInvalidException {
+               handler.outputHandler.queue(new ConfigData(node, true));
+       }
+       
+}

Added: trunk/freenet/src/freenet/node/fcp/ModifyConfig.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ModifyConfig.java        2006-10-29 
22:30:31 UTC (rev 10744)
+++ trunk/freenet/src/freenet/node/fcp/ModifyConfig.java        2006-10-29 
23:34:22 UTC (rev 10745)
@@ -0,0 +1,67 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.node.fcp;
+
+import freenet.config.Config;
+import freenet.config.Option;
+import freenet.config.SubConfig;
+import freenet.node.Node;
+import freenet.node.NodeClientCore;
+import freenet.node.PeerNode;
+import freenet.support.Fields;
+import freenet.support.Logger;
+import freenet.support.SimpleFieldSet;
+
+public class ModifyConfig extends FCPMessage {
+
+       static final String name = "ModifyConfig";
+       
+       final SimpleFieldSet fs;
+       
+       public ModifyConfig(SimpleFieldSet fs) {
+               this.fs = fs;
+       }
+
+       public SimpleFieldSet getFieldSet() {
+               return new SimpleFieldSet();
+       }
+
+       public String getName() {
+               return name;
+       }
+
+       public void run(FCPConnectionHandler handler, Node node) throws 
MessageInvalidException {
+               Config config = node.config;
+               SubConfig[] sc = config.getConfigs();
+               
+               boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
+               
+               for(int i=0; i<sc.length ; i++){
+                       Option[] o = sc[i].getOptions();
+                       String prefix = new String(sc[i].getPrefix());
+                       String configName;
+                       
+                       for(int j=0; j<o.length; j++){
+                               configName=o[j].getName();
+                               if(logMINOR) Logger.minor(this, "Setting 
"+prefix+"."+configName);
+                               
+                               // we ignore unreconized parameters 
+                               if(fs.get(prefix+"."+configName) != null) {
+                                       
if(!(o[j].getValueString().equals(fs.get(prefix+"."+configName)))){
+                                               if(logMINOR) Logger.minor(this, 
"Setting "+prefix+"."+configName+" to "+fs.get(prefix+"."+configName));
+                                               try{
+                                                       
o[j].setValue(fs.get(prefix+"."+configName));
+                                               }catch(Exception e){
+                                                       // Bad values silently 
fail from an FCP perspective, but the FCP client can tell if a change took by 
comparing ConfigData messages before and after
+                                                       Logger.error(this, 
"Caught "+e, e);
+                                               }
+                                       }
+                               }
+                       }
+               }
+               node.clientCore.storeConfig();
+               handler.outputHandler.queue(new ConfigData(node, true));
+       }
+
+}


Reply via email to