[ https://issues.apache.org/jira/browse/MINIFICPP-37?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16324061#comment-16324061 ]
ASF GitHub Bot commented on MINIFICPP-37: ----------------------------------------- Github user apiri commented on a diff in the pull request: https://github.com/apache/nifi-minifi-cpp/pull/237#discussion_r161239545 --- Diff: controller/MiNiFiController.cpp --- @@ -0,0 +1,196 @@ +/** + * + * 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 <fcntl.h> +#include <stdio.h> +#include <semaphore.h> +#include <signal.h> +#include <vector> +#include <queue> +#include <map> +#include <unistd.h> +#include <yaml-cpp/yaml.h> +#include <iostream> +#include "io/BaseStream.h" + +#include "core/Core.h" + +#include "core/FlowConfiguration.h" +#include "core/ConfigurationFactory.h" +#include "core/RepositoryFactory.h" +#include "FlowController.h" +#include "Main.h" + +#include "Controller.h" +#include "c2/ControllerSocketProtocol.h" + +#include "cxxopts.hpp" + +int main(int argc, char **argv) { + + std::shared_ptr<logging::Logger> logger = logging::LoggerConfiguration::getConfiguration().getLogger("controller"); + + // assumes POSIX compliant environment + std::string minifiHome; + if (const char *env_p = std::getenv(MINIFI_HOME_ENV_KEY)) { + minifiHome = env_p; + logger->log_info("Using MINIFI_HOME=%s from environment.", minifiHome); + } else { + logger->log_info("MINIFI_HOME is not set; determining based on environment."); + char *path = nullptr; + char full_path[PATH_MAX]; + path = realpath(argv[0], full_path); + + if (path != nullptr) { + std::string minifiHomePath(path); + if (minifiHomePath.find_last_of("/\\") != std::string::npos) { + minifiHomePath = minifiHomePath.substr(0, minifiHomePath.find_last_of("/\\")); //Remove /minifi from path + minifiHome = minifiHomePath.substr(0, minifiHomePath.find_last_of("/\\")); //Remove /bin from path + } + } + + // attempt to use cwd as MINIFI_HOME + if (minifiHome.empty() || !validHome(minifiHome)) { + char cwd[PATH_MAX]; + getcwd(cwd, PATH_MAX); + minifiHome = cwd; + } + + } + + if (!validHome(minifiHome)) { + logger->log_error("No valid MINIFI_HOME could be inferred. " + "Please set MINIFI_HOME or run minifi from a valid location."); + return -1; + } + + std::shared_ptr<minifi::Configure> configuration = std::make_shared<minifi::Configure>(); + configuration->setHome(minifiHome); + configuration->loadConfigureFile(DEFAULT_NIFI_PROPERTIES_FILE); + + std::shared_ptr<logging::LoggerProperties> log_properties = std::make_shared<logging::LoggerProperties>(); + log_properties->setHome(minifiHome); + log_properties->loadConfigureFile(DEFAULT_LOG_PROPERTIES_FILE); + logging::LoggerConfiguration::getConfiguration().initialize(log_properties); + + auto stream_factory_ = std::make_shared<minifi::io::StreamFactory>(configuration); + + std::string host, port, caCert; + + if (!configuration->get("controller.socket.host", host) || !configuration->get("controller.socket.port", port)) { + std::cout << "MiNiFi Controller is disabled" << std::endl; + exit(0); + } + + cxxopts::Options options("MiNiFiController", "MiNiFi local agent controller"); + options.positional_help("[optional args]").show_positional_help(); + + options.add_options() //NOLINT + ("help", "Shows Help") //NOLINT + ("stop", "Shuts down the provided component", cxxopts::value<std::vector<std::string>>()) //NOLINT + ("start", "Starts provided component", cxxopts::value<std::vector<std::string>>()) //NOLINT + ("l,list", "Provides a list of connections or processors", cxxopts::value<std::string>()) //NOLINT + ("c,clear", "Clears the associated connection queue", cxxopts::value<std::vector<std::string>>()) //NOLINT + ("getsize", "Reports the size of the associated connection queue", cxxopts::value<std::vector<std::string>>()) //NOLINT + ("updateflow", "Updates the flow of the agent using the provided flow file", cxxopts::value<std::string>()) //NOLINT + ("getfull", "Reports a list of full connections"); + + auto result = options.parse(argc, argv); --- End diff -- would be nice to catch unsupported options and redirect to the help in lieu of the exception, e.g. ``` $ ./bin/minificontroller -h [2018-01-infol 09:46:26.263] [controller] [info] MINIFI_HOME is not set; determining based on environment. [2018-01-infol 09:46:26.264] [org::apache::nifi::minifi::Properties] [info] Using configuration file located at /Users/apiri/Development/code/apache/nifi-minifi-cpp/build/nifi-minifi-cpp-0.4.0/conf/minifi.properties [2018-01-infol 09:46:26.264] [org::apache::nifi::minifi::Properties] [info] Using configuration file located at /Users/apiri/Development/code/apache/nifi-minifi-cpp/build/nifi-minifi-cpp-0.4.0/conf/minifi-log.properties libc++abi.dylib: terminating with uncaught exception of type cxxopts::option_not_exists_exception: Option ‘h’ does not exist [1] 56831 abort ./bin/minificontroller -h ``` > Create scripts to get information from the controller API > --------------------------------------------------------- > > Key: MINIFICPP-37 > URL: https://issues.apache.org/jira/browse/MINIFICPP-37 > Project: NiFi MiNiFi C++ > Issue Type: Sub-task > Reporter: marco polo > Assignee: marco polo > Priority: Minor > Labels: Durability, Reliability > Fix For: 0.4.0 > > -- This message was sent by Atlassian JIRA (v6.4.14#64029)