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
    ```


---

Reply via email to