blob: 2b98637cf1e722c83b94a90408fd4992768223d7 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <string>
#include <set>
#include <iostream>
#include <algorithm>
#include "ArgParser.h"
#include "utils/OptionalUtils.h"
#include "utils/StringUtils.h"
#include "utils/CollectionUtils.h"
#include "CommandException.h"
namespace org {
namespace apache {
namespace nifi {
namespace minifi {
namespace encrypt_config {
const std::vector<Argument> Arguments::registered_args_{
{std::set<std::string>{"--minifi-home", "-m"},
true,
"minifi home",
"Specifies the home directory used by the minifi agent"}
};
const std::vector<Flag> Arguments::registered_flags_{
{std::set<std::string>{"--help", "-h"},
"Prints this help message"},
{std::set<std::string>{"--encrypt-flow-config"},
"If set, the flow configuration file (as specified in minifi.properties) is also encrypted."}
};
std::string Arguments::getHelp() {
std::stringstream ss;
ss << "Usage: " << "encrypt-config";
for (const auto& arg : registered_args_) {
ss << " ";
if (!arg.required) {
ss << "[";
}
ss << utils::StringUtils::join("|", arg.names)
<< " <" << arg.value_name << ">";
if (!arg.required) {
ss << "]";
}
}
for (const auto& flag : registered_flags_) {
ss << " [" << utils::StringUtils::join("|", flag.names) << "]";
}
ss << "\n";
for (const auto& arg : registered_args_) {
ss << "\t";
ss << utils::StringUtils::join("|", arg.names) << " : ";
if (arg.required) {
ss << "(required)";
} else {
ss << "(optional)";
}
ss << " " << arg.description;
ss << "\n";
}
for (const auto& flag : registered_flags_) {
ss << "\t" << utils::StringUtils::join("|", flag.names) << " : "
<< flag.description << "\n";
}
return ss.str();
}
void Arguments::set(const std::string& key, const std::string& value) {
if (get(key)) {
throw CommandException("Key is specified more than once \"" + key + "\"");
}
args_[key] = value;
}
void Arguments::set(const std::string& flag) {
if (isSet(flag)) {
throw CommandException("Flag is specified more than once \"" + flag + "\"");
}
flags_.insert(flag);
}
utils::optional<std::string> Arguments::get(const std::string &key) const {
return getArg(key) | utils::flatMap([&] (const Argument& arg) {return get(arg);});
}
utils::optional<std::string> Arguments::get(const Argument& arg) const {
for (const auto& name : arg.names) {
auto it = args_.find(name);
if (it != args_.end()) {
return it->second;
}
}
return {};
}
bool Arguments::isSet(const std::string &flag) const {
utils::optional<Flag> opt_flag = getFlag(flag);
if (!opt_flag) {
return false;
}
return utils::haveCommonItem(opt_flag->names, flags_);
}
Arguments Arguments::parse(int argc, char* argv[]) {
Arguments args;
for (int argIdx = 1; argIdx < argc; ++argIdx) {
std::string key{argv[argIdx]};
if (getFlag(key)) {
args.set(key);
continue;
}
if (!getArg(key)) {
throw CommandException("Unrecognized option: \"" + key + "\"");
}
if (argIdx == argc - 1) {
throw CommandException("No value specified for key \"" + key + "\"");
}
++argIdx;
std::string value{argv[argIdx]};
args.set(key, value);
}
if (args.isSet("-h")) {
std::cout << getHelp();
std::exit(0);
}
for (const auto& arg : registered_args_) {
if (arg.required && !args.get(arg)) {
throw CommandException("Missing required option " + utils::StringUtils::join("|", arg.names));
}
}
return args;
}
utils::optional<Flag> Arguments::getFlag(const std::string &name) {
for (const auto& flag : registered_flags_) {
if (flag.names.count(name) > 0) {
return flag;
}
}
return {};
}
utils::optional<Argument> Arguments::getArg(const std::string &key) {
for (const auto& arg : registered_args_) {
if (arg.names.count(key) > 0) {
return arg;
}
}
return {};
}
} // namespace encrypt_config
} // namespace minifi
} // namespace nifi
} // namespace apache
} // namespace org