diff --git a/src/configuration.cc b/src/configuration.cc index 138ddb1d..90dc40bd 100644 --- a/src/configuration.cc +++ b/src/configuration.cc @@ -17,9 +17,10 @@ #include "configuration.h" #include +#include #include #include -#include +#include #include @@ -128,6 +129,11 @@ int Configuration::ParseArguments(int ac, char** av) { ("version,V", "Print the agent version") ("verbose,v", boost::program_options::bool_switch(&verbose_logging_), "Enable verbose logging") + ("option,o", + boost::program_options::value>() + ->multitoken()->zero_tokens()->composing(), + "Explicit configuration option, e.g. " + "-o CredentialsFile=/tmp/token.json") ; boost::program_options::options_description hidden_desc; hidden_desc.add_options() @@ -156,8 +162,31 @@ int Configuration::ParseArguments(int ac, char** av) { << std::endl; return -1; } - ParseConfigFile(config_file); + + // Command line options override the options provided in the config file. + if (flags.count("option")) { + std::stringstream option_stream; + const std::vector options = + flags["option"].as>(); + for (const std::string& option: options) { + std::size_t separator_pos = option.find("="); + if (separator_pos == std::string::npos) { + std::cerr << "Invalid option " << option; + return 1; + } + const std::string key = option.substr(0, separator_pos); + const std::string value = + option.substr(separator_pos + 1, std::string::npos); + option_stream << key << ": " << value << "\n"; + } + +#ifdef VERBOSE + LOG(DEBUG) << "Options:\n" << option_stream.str(); +#endif + ParseConfiguration(option_stream); + } + return 0; } catch (const boost::program_options::error& arg_error) { std::cerr << arg_error.what() << std::endl; @@ -177,79 +206,77 @@ void Configuration::ParseConfiguration(std::istream& input) { YAML::Node config = YAML::Load(input); std::lock_guard lock(mutex_); project_id_ = - config["ProjectId"].as(kDefaultProjectId); + config["ProjectId"].as(project_id_); credentials_file_ = - config["CredentialsFile"].as(kDefaultCredentialsFile); + config["CredentialsFile"].as(credentials_file_); metadata_api_num_threads_ = - config["MetadataApiNumThreads"].as(kMetadataApiDefaultNumThreads); + config["MetadataApiNumThreads"].as(metadata_api_num_threads_); metadata_api_port_ = - config["MetadataApiPort"].as(kMetadataApiDefaultPort); + config["MetadataApiPort"].as(metadata_api_port_); metadata_api_resource_type_separator_ = config["MetadataApiResourceTypeSeparator"].as( - kMetadataApiDefaultResourceTypeSeparator); + metadata_api_resource_type_separator_); metadata_reporter_interval_seconds_ = config["MetadataReporterIntervalSeconds"].as( - kMetadataReporterDefaultIntervalSeconds); + metadata_reporter_interval_seconds_); metadata_reporter_purge_deleted_ = config["MetadataReporterPurgeDeleted"].as( - kMetadataReporterDefaultPurgeDeleted); + metadata_reporter_purge_deleted_); metadata_reporter_user_agent_ = config["MetadataReporterUserAgent"].as( - kMetadataReporterDefaultUserAgent); + metadata_reporter_user_agent_); metadata_ingestion_endpoint_format_ = config["MetadataIngestionEndpointFormat"].as( - kMetadataIngestionDefaultEndpointFormat); + metadata_ingestion_endpoint_format_); metadata_ingestion_request_size_limit_bytes_ = config["MetadataIngestionRequestSizeLimitBytes"].as( - kMetadataIngestionDefaultRequestSizeLimitBytes); + metadata_ingestion_request_size_limit_bytes_); metadata_ingestion_raw_content_version_ = config["MetadataIngestionRawContentVersion"].as( - kMetadataIngestionDefaultRawContentVersion); + metadata_ingestion_raw_content_version_); instance_updater_interval_seconds_ = config["InstanceUpdaterIntervalSeconds"].as( - kInstanceUpdaterDefaultIntervalSeconds); + instance_updater_interval_seconds_); instance_resource_type_ = - config["InstanceResourceType"].as( - kDefaultInstanceResourceType); + config["InstanceResourceType"].as(instance_resource_type_); docker_updater_interval_seconds_ = config["DockerUpdaterIntervalSeconds"].as( - kDockerUpdaterDefaultIntervalSeconds); + docker_updater_interval_seconds_); docker_endpoint_host_ = - config["DockerEndpointHost"].as(kDockerDefaultEndpointHost); + config["DockerEndpointHost"].as(docker_endpoint_host_); docker_api_version_ = - config["DockerApiVersion"].as( - kDockerDefaultApiVersion); + config["DockerApiVersion"].as(docker_api_version_); docker_container_filter_ = config["DockerContainerFilter"].as( - kDockerDefaultContainerFilter); + docker_container_filter_); kubernetes_updater_interval_seconds_ = config["KubernetesUpdaterIntervalSeconds"].as( - kKubernetesUpdaterDefaultIntervalSeconds); + kubernetes_updater_interval_seconds_); kubernetes_endpoint_host_ = config["KubernetesEndpointHost"].as( - kKubernetesDefaultEndpointHost); + kubernetes_endpoint_host_); kubernetes_pod_label_selector_ = config["KubernetesPodLabelSelector"].as( - kKubernetesDefaultPodLabelSelector); + kubernetes_pod_label_selector_); kubernetes_cluster_name_ = config["KubernetesClusterName"].as( - kKubernetesDefaultClusterName); + kubernetes_cluster_name_); kubernetes_cluster_location_ = config["KubernetesClusterLocation"].as( - kKubernetesDefaultClusterLocation); + kubernetes_cluster_location_); kubernetes_node_name_ = - config["KubernetesNodeName"].as(kKubernetesDefaultNodeName); + config["KubernetesNodeName"].as(kubernetes_node_name_); kubernetes_use_watch_ = - config["KubernetesUseWatch"].as(kKubernetesDefaultUseWatch); + config["KubernetesUseWatch"].as(kubernetes_use_watch_); kubernetes_cluster_level_metadata_ = config["KubernetesClusterLevelMetadata"].as( - kKubernetesDefaultClusterLevelMetadata); + kubernetes_cluster_level_metadata_); instance_id_ = - config["InstanceId"].as(kDefaultInstanceId); + config["InstanceId"].as(instance_id_); instance_zone_ = - config["InstanceZone"].as(kDefaultInstanceZone); + config["InstanceZone"].as(instance_zone_); health_check_file_ = - config["HealthCheckFile"].as(kDefaultHealthCheckFile); + config["HealthCheckFile"].as(health_check_file_); } } // google