Files
NFD/daemon/main.cpp
T
Alexander Afanasyev 31367925c6 rib: Refactor initialization of NRD instance
This commit also makes Face used inside NRD be adaptive to nfd.conf.
More specifically, it will use the same unix socket path as specified in
face_system.unix section.  If this section is not present, it will use
the same tcp port as specified in face_system.tcp section.  If tcp
section is also absent, nrd will abort execution.

Change-Id: I48f75ddf972f259055cd61824e3c228ca1d6a639
Refs: #2496
2015-02-11 16:13:26 -08:00

209 lines
5.6 KiB
C++

/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2015, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
* Washington University in St. Louis,
* Beijing Institute of Technology,
* The University of Memphis.
*
* This file is part of NFD (Named Data Networking Forwarding Daemon).
* See AUTHORS.md for complete list of NFD authors and contributors.
*
* NFD is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
*
* NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
*/
#include "nfd.hpp"
#include "version.hpp"
#include "core/global-io.hpp"
#include "core/logger.hpp"
#include "core/privilege-helper.hpp"
#include <string.h>
#include <boost/filesystem.hpp>
#include <boost/program_options/options_description.hpp>
#include <boost/program_options/variables_map.hpp>
#include <boost/program_options/parsers.hpp>
namespace nfd {
NFD_LOG_INIT("NFD");
class NfdRunner : noncopyable
{
public:
explicit
NfdRunner(const std::string& configFile)
: m_nfd(configFile, m_keyChain)
, m_terminationSignalSet(getGlobalIoService())
, m_reloadSignalSet(getGlobalIoService())
{
m_terminationSignalSet.add(SIGINT);
m_terminationSignalSet.add(SIGTERM);
m_terminationSignalSet.async_wait(bind(&NfdRunner::terminate, this, _1, _2));
m_reloadSignalSet.add(SIGHUP);
m_reloadSignalSet.async_wait(bind(&NfdRunner::reload, this, _1, _2));
}
static void
printUsage(std::ostream& os, const std::string& programName)
{
os << "Usage: \n"
<< " " << programName << " [options]\n"
<< "\n"
<< "Run NFD forwarding daemon\n"
<< "\n"
<< "Options:\n"
<< " [--help] - print this help message\n"
<< " [--version] - print version and exit\n"
<< " [--modules] - list available logging modules\n"
<< " [--config /path/to/nfd.conf] - path to configuration file "
<< "(default: " << DEFAULT_CONFIG_FILE << ")\n"
;
}
static void
printModules(std::ostream& os)
{
os << "Available logging modules: \n";
for (const auto& module : LoggerFactory::getInstance().getModules()) {
os << module << "\n";
}
}
void
terminate(const boost::system::error_code& error, int signalNo)
{
if (error)
return;
NFD_LOG_INFO("Caught signal '" << ::strsignal(signalNo) << "', exiting...");
getGlobalIoService().stop();
}
void
initialize()
{
m_nfd.initialize();
}
void
reload(const boost::system::error_code& error, int signalNo)
{
if (error)
return;
NFD_LOG_INFO("Caught signal '" << ::strsignal(signalNo) << "', reloading...");
m_nfd.reloadConfigFile();
m_reloadSignalSet.async_wait(bind(&NfdRunner::reload, this, _1, _2));
}
private:
ndn::KeyChain m_keyChain;
Nfd m_nfd;
boost::asio::signal_set m_terminationSignalSet;
boost::asio::signal_set m_reloadSignalSet;
};
} // namespace nfd
int
main(int argc, char** argv)
{
using namespace nfd;
namespace po = boost::program_options;
po::options_description description;
std::string configFile = DEFAULT_CONFIG_FILE;
description.add_options()
("help,h", "print this help message")
("version,V", "print version and exit")
("modules,m", "list available logging modules")
("config,c", po::value<std::string>(&configFile), "path to configuration file")
;
po::variables_map vm;
try {
po::store(po::command_line_parser(argc, argv).options(description).run(), vm);
po::notify(vm);
}
catch (const std::exception& e) {
std::cerr << "ERROR: " << e.what() << std::endl;
NfdRunner::printUsage(std::cerr, argv[0]);
return 1;
}
if (vm.count("help") > 0) {
NfdRunner::printUsage(std::cout, argv[0]);
return 0;
}
if (vm.count("version") > 0) {
std::cout << NFD_VERSION_BUILD_STRING << std::endl;
return 0;
}
if (vm.count("modules") > 0) {
NfdRunner::printModules(std::cout);
return 0;
}
NfdRunner runner(configFile);
try {
runner.initialize();
}
catch (const boost::filesystem::filesystem_error& e) {
if (e.code() == boost::system::errc::permission_denied) {
NFD_LOG_FATAL("Permissions denied for " << e.path1() << ". " <<
argv[0] << " should be run as superuser");
}
else {
NFD_LOG_FATAL(e.what());
}
return 1;
}
catch (const std::exception& e) {
NFD_LOG_FATAL(e.what());
return 2;
}
catch (const PrivilegeHelper::Error& e) {
// PrivilegeHelper::Errors do not inherit from std::exception
// and represent seteuid/gid failures
NFD_LOG_FATAL(e.what());
return 3;
}
try {
getGlobalIoService().run();
}
catch (const std::exception& e) {
NFD_LOG_FATAL(e.what());
return 4;
}
catch (const PrivilegeHelper::Error& e) {
NFD_LOG_FATAL(e.what());
return 5;
}
return 0;
}