From 4b4b27b5e23be436e266c9720dacbf349f024636 Mon Sep 17 00:00:00 2001 From: didfet Date: Sun, 8 Mar 2015 21:24:32 +0100 Subject: [PATCH] Implementation of config file loading. --- .../config/Configuration.java | 46 ++++++++++ .../config/ConfigurationManager.java | 41 +++++++++ .../config/FilesSection.java | 46 ++++++++++ .../config/NetworkSection.java | 91 +++++++++++++++++++ .../config/ConfigurationManagerTest.java | 38 ++++++++ src/test/resources/config1.json | 52 +++++++++++ 6 files changed, 314 insertions(+) create mode 100644 src/main/java/info/fetter/logstashforwarder/config/Configuration.java create mode 100644 src/main/java/info/fetter/logstashforwarder/config/ConfigurationManager.java create mode 100644 src/main/java/info/fetter/logstashforwarder/config/FilesSection.java create mode 100644 src/main/java/info/fetter/logstashforwarder/config/NetworkSection.java create mode 100644 src/test/java/info/fetter/logstashforwarder/config/ConfigurationManagerTest.java create mode 100644 src/test/resources/config1.json diff --git a/src/main/java/info/fetter/logstashforwarder/config/Configuration.java b/src/main/java/info/fetter/logstashforwarder/config/Configuration.java new file mode 100644 index 0000000..ef0bc49 --- /dev/null +++ b/src/main/java/info/fetter/logstashforwarder/config/Configuration.java @@ -0,0 +1,46 @@ +package info.fetter.logstashforwarder.config; + +import java.util.List; + +import org.apache.commons.lang.builder.ToStringBuilder; + +public class Configuration { + private NetworkSection network; + private List files; + /** + * @return the network + */ + public NetworkSection getNetwork() { + return network; + } + /** + * @param network the network to set + */ + public void setNetwork(NetworkSection network) { + this.network = network; + } + /** + * @return the files + */ + public List getFiles() { + return files; + } + /** + * @param files the files to set + */ + public void setFiles(List files) { + this.files = files; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return new ToStringBuilder(this). + append("network", network). + append("files", files). + toString(); + } + +} diff --git a/src/main/java/info/fetter/logstashforwarder/config/ConfigurationManager.java b/src/main/java/info/fetter/logstashforwarder/config/ConfigurationManager.java new file mode 100644 index 0000000..3f9937e --- /dev/null +++ b/src/main/java/info/fetter/logstashforwarder/config/ConfigurationManager.java @@ -0,0 +1,41 @@ +package info.fetter.logstashforwarder.config; + +import java.io.File; +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class ConfigurationManager { + private File configFile; + private Configuration config; + private ObjectMapper mapper; + + public ConfigurationManager(String configFilePath) { + this(new File(configFilePath)); + } + + public ConfigurationManager(File file) { + configFile = file; + mapper = new ObjectMapper(); + mapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true); + mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); + } + + public void readConfiguration() throws JsonParseException, JsonMappingException, IOException { + config = mapper.readValue(configFile, Configuration.class); + } + + public void writeConfiguration() { + } + + /** + * @return the config + */ + public Configuration getConfig() { + return config; + } + +} diff --git a/src/main/java/info/fetter/logstashforwarder/config/FilesSection.java b/src/main/java/info/fetter/logstashforwarder/config/FilesSection.java new file mode 100644 index 0000000..7ae5173 --- /dev/null +++ b/src/main/java/info/fetter/logstashforwarder/config/FilesSection.java @@ -0,0 +1,46 @@ +package info.fetter.logstashforwarder.config; + +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.builder.ToStringBuilder; + +public class FilesSection { + private List paths; + private Map fields; + /** + * @return the paths + */ + public List getPaths() { + return paths; + } + /** + * @param paths the paths to set + */ + public void setPaths(List paths) { + this.paths = paths; + } + /** + * @return the fields + */ + public Map getFields() { + return fields; + } + /** + * @param fields the fields to set + */ + public void setFields(Map fields) { + this.fields = fields; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return new ToStringBuilder(this). + append("paths", paths). + append("fields", fields). + toString(); + } +} diff --git a/src/main/java/info/fetter/logstashforwarder/config/NetworkSection.java b/src/main/java/info/fetter/logstashforwarder/config/NetworkSection.java new file mode 100644 index 0000000..d20f6fb --- /dev/null +++ b/src/main/java/info/fetter/logstashforwarder/config/NetworkSection.java @@ -0,0 +1,91 @@ +package info.fetter.logstashforwarder.config; + +import java.util.List; + +import org.apache.commons.lang.builder.ToStringBuilder; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class NetworkSection { + private List servers; + @JsonProperty("ssl certificate") + private String sslCertificate; + @JsonProperty("ssl ca") + private String sslCA; + @JsonProperty("ssl key") + private String sslKey; + private int timeout; + /** + * @return the servers + */ + public List getServers() { + return servers; + } + /** + * @param servers the servers to set + */ + public void setServers(List servers) { + this.servers = servers; + } + /** + * @return the sslCertificate + */ + public String getSslCertificate() { + return sslCertificate; + } + /** + * @param sslCertificate the sslCertificate to set + */ + public void setSslCertificate(String sslCertificate) { + this.sslCertificate = sslCertificate; + } + /** + * @return the sslCA + */ + public String getSslCA() { + return sslCA; + } + /** + * @param sslCA the sslCA to set + */ + public void setSslCA(String sslCA) { + this.sslCA = sslCA; + } + /** + * @return the timeout + */ + public int getTimeout() { + return timeout; + } + /** + * @param timeout the timeout to set + */ + public void setTimeout(int timeout) { + this.timeout = timeout; + } + + /** + * @return the sslKey + */ + public String getSslKey() { + return sslKey; + } + /** + * @param sslKey the sslKey to set + */ + public void setSslKey(String sslKey) { + this.sslKey = sslKey; + } + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return new ToStringBuilder(this). + append("servers", servers). + append("sslCertificate", sslCertificate). + append("sslCA", sslCA). + append("timeout", timeout). + toString(); + } +} diff --git a/src/test/java/info/fetter/logstashforwarder/config/ConfigurationManagerTest.java b/src/test/java/info/fetter/logstashforwarder/config/ConfigurationManagerTest.java new file mode 100644 index 0000000..d3a5ee4 --- /dev/null +++ b/src/test/java/info/fetter/logstashforwarder/config/ConfigurationManagerTest.java @@ -0,0 +1,38 @@ +package info.fetter.logstashforwarder.config; + +import static org.apache.log4j.Level.DEBUG; + +import java.io.File; +import java.io.IOException; + +import org.apache.log4j.BasicConfigurator; +import org.apache.log4j.Logger; +import org.apache.log4j.spi.RootLogger; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; + +public class ConfigurationManagerTest { + Logger logger = Logger.getLogger(ConfigurationManagerTest.class); + + @BeforeClass + public static void setUpBeforeClass() throws Exception { + BasicConfigurator.configure(); + RootLogger.getRootLogger().setLevel(DEBUG); + } + + @AfterClass + public static void tearDownAfterClass() throws Exception { + BasicConfigurator.resetConfiguration(); + } + + @Test + public void testReadConfig1() throws JsonParseException, JsonMappingException, IOException { + ConfigurationManager manager = new ConfigurationManager(new File(ConfigurationManagerTest.class.getClassLoader().getResource("config1.json").getFile())); + manager.readConfiguration(); + logger.debug(manager.getConfig().toString()); + } +} diff --git a/src/test/resources/config1.json b/src/test/resources/config1.json new file mode 100644 index 0000000..82801c8 --- /dev/null +++ b/src/test/resources/config1.json @@ -0,0 +1,52 @@ +{ + // The network section covers network configuration :) + "network": { + // A list of downstream servers listening for our messages. + // logstash-forwarder will pick one at random and only switch if + // the selected one appears to be dead or unresponsive + "servers": [ "localhost:5043" ], + + // The path to your client ssl certificate (optional) + "ssl certificate": "./logstash-forwarder.crt", + // The path to your client ssl key (optional) + "ssl key": "./logstash-forwarder.key", + + // The path to your trusted ssl CA file. This is used + // to authenticate your downstream server. + "ssl ca": "./logstash-forwarder.crt", + + // Network timeout in seconds. This is most important for + // logstash-forwarder determining whether to stop waiting for an + // acknowledgement from the downstream server. If an timeout is reached, + // logstash-forwarder will assume the connection or server is bad and + // will connect to a server chosen at random from the servers list. + "timeout": 15 + }, + + // The list of files configurations + "files": [ + // An array of hashes. Each hash tells what paths to watch and + // what fields to annotate on events from those paths. + { + "paths": [ + // single paths are fine + "/var/log/messages", + // globs are fine too, they will be periodically evaluated + // to see if any new files match the wildcard. + "/var/log/*.log" + ], + + // A dictionary of fields to annotate on each event. + "fields": { "type": "syslog" } + }, { + // A path of "-" means stdin. + "paths": [ "-" ], + "fields": { "type": "stdin" } + }, { + "paths": [ + "/var/log/apache/httpd-*.log" + ], + "fields": { "type": "apache" } + } + ] +} \ No newline at end of file