7564d97d13
Refactor management protocol specific option types to ControlParameters Add control parameter field enforcement Add missing control response "success" message bodies Update fib management protocol response codes and behavior Merge local control header manager into face manager Refactor references of nfd::LocalControlHeaderFeature enum to ndn::nfd::LocalControlFeature Remove "control-header" privilege from default configuration refs: #1397, #1399, #1400 Change-Id: Id042daf00b3cee1f1c7fa38d2e4a4ff6d95c15c6
163 lines
3.9 KiB
C++
163 lines
3.9 KiB
C++
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
|
/**
|
|
* Copyright (C) 2014 Named Data Networking Project
|
|
* See COPYING for copyright and distribution information.
|
|
*/
|
|
|
|
#include <getopt.h>
|
|
#include "core/logger.hpp"
|
|
#include "fw/forwarder.hpp"
|
|
#include "mgmt/internal-face.hpp"
|
|
#include "mgmt/fib-manager.hpp"
|
|
#include "mgmt/face-manager.hpp"
|
|
#include "mgmt/strategy-choice-manager.hpp"
|
|
#include "mgmt/status-server.hpp"
|
|
#include "mgmt/config-file.hpp"
|
|
|
|
#include <boost/filesystem.hpp>
|
|
|
|
namespace nfd {
|
|
|
|
NFD_LOG_INIT("Main");
|
|
|
|
struct ProgramOptions
|
|
{
|
|
bool m_showUsage;
|
|
std::string m_config;
|
|
};
|
|
|
|
static ProgramOptions g_options;
|
|
static Forwarder* g_forwarder;
|
|
static FibManager* g_fibManager;
|
|
static FaceManager* g_faceManager;
|
|
static StrategyChoiceManager* g_strategyChoiceManager;
|
|
static StatusServer* g_statusServer;
|
|
static shared_ptr<InternalFace> g_internalFace;
|
|
|
|
|
|
void
|
|
usage(char* programName)
|
|
{
|
|
printf(
|
|
"%s --help\n\tshow this help and exit\n"
|
|
"%s "
|
|
"[--config /path/to/nfd.conf]\n"
|
|
"\trun forwarding daemon\n"
|
|
"\t--config <configuration file>]: path to configuration file\n"
|
|
"\n",
|
|
programName, programName
|
|
);
|
|
}
|
|
|
|
bool
|
|
parseCommandLine(int argc, char** argv)
|
|
{
|
|
g_options.m_showUsage = false;
|
|
g_options.m_config = DEFAULT_CONFIG_FILE;
|
|
|
|
while (true) {
|
|
int option_index = 0;
|
|
static ::option long_options[] = {
|
|
{ "help" , no_argument , 0, 0 },
|
|
{ "config" , required_argument, 0, 0 },
|
|
{ 0 , 0 , 0, 0 }
|
|
};
|
|
int c = getopt_long_only(argc, argv, "", long_options, &option_index);
|
|
if (c == -1) break;
|
|
|
|
switch (c) {
|
|
case 0:
|
|
switch (option_index) {
|
|
case 0://help
|
|
g_options.m_showUsage = true;
|
|
break;
|
|
case 1://config
|
|
g_options.m_config = ::optarg;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void
|
|
initializeMgmt()
|
|
{
|
|
ConfigFile config;
|
|
|
|
g_internalFace = make_shared<InternalFace>();
|
|
g_internalFace->getValidator().setConfigFile(config);
|
|
g_forwarder->addFace(g_internalFace);
|
|
|
|
g_fibManager = new FibManager(g_forwarder->getFib(),
|
|
bind(&Forwarder::getFace, g_forwarder, _1),
|
|
g_internalFace);
|
|
|
|
g_faceManager = new FaceManager(g_forwarder->getFaceTable(), g_internalFace);
|
|
g_faceManager->setConfigFile(config);
|
|
|
|
g_strategyChoiceManager = new StrategyChoiceManager(g_forwarder->getStrategyChoice(),
|
|
g_internalFace);
|
|
|
|
g_statusServer = new StatusServer(g_internalFace, *g_forwarder);
|
|
|
|
config.parse(g_options.m_config, true);
|
|
config.parse(g_options.m_config, false);
|
|
|
|
shared_ptr<fib::Entry> entry = g_forwarder->getFib().insert("/localhost/nfd").first;
|
|
entry->addNextHop(g_internalFace, 0);
|
|
}
|
|
|
|
int
|
|
main(int argc, char** argv)
|
|
{
|
|
bool isCommandLineValid = parseCommandLine(argc, argv);
|
|
if (!isCommandLineValid) {
|
|
usage(argv[0]);
|
|
return 1;
|
|
}
|
|
if (g_options.m_showUsage) {
|
|
usage(argv[0]);
|
|
return 0;
|
|
}
|
|
|
|
try {
|
|
g_forwarder = new Forwarder();
|
|
initializeMgmt();
|
|
|
|
/// \todo Add signal processing to gracefully terminate the app
|
|
|
|
getGlobalIoService().run();
|
|
// } catch(ConfigFile::Error& error) {
|
|
// NFD_LOG_ERROR("Error: " << error.what());
|
|
// NFD_LOG_ERROR("You should either specify --config option or copy sample configuration into "
|
|
// << DEFAULT_CONFIG_FILE);
|
|
}
|
|
catch (boost::filesystem::filesystem_error& e) {
|
|
if (e.code() == boost::system::errc::permission_denied) {
|
|
NFD_LOG_ERROR("Error: Permissions denied for " << e.path1());
|
|
NFD_LOG_ERROR(argv[0] << " should be run as superuser");
|
|
}
|
|
else {
|
|
NFD_LOG_ERROR("Error: " << e.what());
|
|
}
|
|
}
|
|
catch (std::exception& e) {
|
|
NFD_LOG_ERROR("Error: " << e.what());
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
} // namespace nfd
|
|
|
|
int
|
|
main(int argc, char** argv)
|
|
{
|
|
return nfd::main(argc, argv);
|
|
}
|
|
|