write config file
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "cf-handler.h"
+#include <vespa/defaults.h>
#include <vespa/config/common/configsystem.h>
#include <vespa/config/common/exceptions.h>
@@ -19,15 +20,41 @@ CfHandler::subscribe(const std::string & configId, uint64_t timeoutMS)
_handle = _subscriber.subscribe<LogforwarderConfig>(configId, timeoutMS);
}
+namespace {
+std::string
+cfFilePath() {
+ std::string path = vespa::Defaults::underVespaHome("var/db/vespa/splunk");
+ DIR *dp = opendir(path.c_str());
+ if (dp == NULL) {
+ if (errno != ENOTDIR || mkdir(path.c_str() != 0)) {
+ perror(path.c_str());
+ }
+ }
+ if (dp != NULL) closedir(dp);
+ path += "/deploymentclient.conf;
+ return path;
+}
+}
+
void
CfHandler::doConfigure()
{
std::unique_ptr<LogforwarderConfig> cfg(_handle->getConfig());
const LogforwarderConfig& config(*cfg);
- printf("logforwarder:\n");
- printf(" deployment server: %s\n", config.deploymentServer.c_str());
- printf(" client name: %s\n", config.clientName.c_str());
+ std::string path = cfFilePath();
+ std::string tmpPath = path + ".new";
+ FILE *fp = fopen(tmpPath.c_str(), "w");
+ if (fp == NULL) return;
+
+ fprintf(fp, "[deployment-client]\n");
+ fprintf(fp, "clientName = %s\n", config.clientName.c_str());
+ 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());
}
void
@@ -43,9 +70,10 @@ constexpr uint64_t CONFIG_TIMEOUT_MS = 30 * 1000;
void
CfHandler::start(const char *configId)
{
- LOG(debug, "Reading configuration configid '%s'", configId);
+ LOG(debug, "Reading configuration with id '%s'", configId);
try {
subscribe(configId, CONFIG_TIMEOUT_MS);
+ doConfigure();
} catch (config::ConfigTimeoutException & ex) {
LOG(warning, "Timout getting config, please check your setup. Will exit and restart: %s", ex.getMessage().c_str());
exit(EXIT_FAILURE);
@@ -56,5 +84,4 @@ CfHandler::start(const char *configId)
LOG(error, "Fatal: Could not get config, please check your setup: %s", ex.getMessage().c_str());
exit(EXIT_FAILURE);
}
- doConfigure();
}
