diff options
Diffstat (limited to 'logforwarder/src/apps/vespa-logforwarder-start/splunk-starter.cpp')
-rw-r--r-- | logforwarder/src/apps/vespa-logforwarder-start/splunk-starter.cpp | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/logforwarder/src/apps/vespa-logforwarder-start/splunk-starter.cpp b/logforwarder/src/apps/vespa-logforwarder-start/splunk-starter.cpp new file mode 100644 index 00000000000..905f4640c92 --- /dev/null +++ b/logforwarder/src/apps/vespa-logforwarder-start/splunk-starter.cpp @@ -0,0 +1,95 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include "splunk-starter.h" +#include <dirent.h> +#include <sys/stat.h> + +#include <vespa/log/log.h> +LOG_SETUP(".splunk-starter"); + +SplunkStarter::SplunkStarter() = default; + +SplunkStarter::~SplunkStarter() = default; + +namespace { + +vespalib::string fixDir(const vespalib::string &parent, const vespalib::string &subdir) { + auto dirname = parent + "/" + subdir; + DIR *dp = opendir(dirname.c_str()); + if (dp == NULL) { + if (errno != ENOENT || mkdir(dirname.c_str(), 0755) != 0) { + LOG(warning, "Could not create directory '%s'", dirname.c_str()); + perror(dirname.c_str()); + } + } else { + closedir(dp); + } + return dirname; +} + +vespalib::string +cfFilePath(const vespalib::string &parent, const vespalib::string &filename) { + vespalib::string path = parent; + path = fixDir(path, "etc"); + path = fixDir(path, "system"); + path = fixDir(path, "local"); + return path + "/" + filename; +} + +} // namespace <unnamed> + +void SplunkStarter::gotConfig(const LogforwarderConfig& config) { + vespalib::string path = cfFilePath(config.splunkHome, "deploymentclient.conf"); + LOG(debug, "got config, writing %s", path.c_str()); + vespalib::string tmpPath = path + ".new"; + FILE *fp = fopen(tmpPath.c_str(), "w"); + if (fp == NULL) { + LOG(warning, "could not open '%s' for write", tmpPath.c_str()); + return; + } + + fprintf(fp, "[deployment-client]\n"); + fprintf(fp, "clientName = %s\n", config.clientName.c_str()); + fprintf(fp, "phoneHomeIntervalInSecs = %i\n", config.phoneHomeInterval); + fprintf(fp, "\n"); + fprintf(fp, "[target-broker:deploymentServer]\n"); + fprintf(fp, "targetUri = %s\n", config.deploymentServer.c_str()); + + fclose(fp); + rename(tmpPath.c_str(), path.c_str()); + + if (getenv("VESPA_HOSTNAME") != NULL && + getenv("VESPA_TENANT") != NULL && + getenv("VESPA_APPLICATION")!= NULL && + getenv("VESPA_INSTANCE") != NULL && + getenv("VESPA_ENVIRONMENT") != NULL && + getenv("VESPA_REGION") != NULL) + { + path = cfFilePath(config.splunkHome, "inputs.conf"); + tmpPath = path + ".new"; + fp = fopen(tmpPath.c_str(), "w"); + if (fp != NULL) { + fprintf(fp, "[default]\n"); + fprintf(fp, "host = %s\n", getenv("VESPA_HOSTNAME")); + fprintf(fp, "_meta = vespa_tenant::%s vespa_app::%s.%s vespa_zone::%s.%s\n", + getenv("VESPA_TENANT"), + getenv("VESPA_APPLICATION"), + getenv("VESPA_INSTANCE"), + getenv("VESPA_ENVIRONMENT"), + getenv("VESPA_REGION")); + fclose(fp); + rename(tmpPath.c_str(), path.c_str()); + } + } + if (config.clientName.size() == 0 || + config.deploymentServer.size() == 0) + { + _childHandler.stopChild(); + } else { + _childHandler.startChild(config.splunkHome); + } +} + +void SplunkStarter::stop() { + _childHandler.stopChild(); +} |