mgmt: add sample configuration file and install default configuration
refs: #1332 Change-Id: Ic50aac57382b9760aa3b1c22b7dd2a9fec589cf9
This commit is contained in:
+33
-157
@@ -13,11 +13,8 @@
|
||||
#include "mgmt/local-control-header-manager.hpp"
|
||||
#include "mgmt/strategy-choice-manager.hpp"
|
||||
#include "mgmt/config-file.hpp"
|
||||
#include "face/tcp-factory.hpp"
|
||||
|
||||
#ifdef HAVE_UNIX_SOCKETS
|
||||
#include "face/unix-stream-factory.hpp"
|
||||
#endif
|
||||
#include <boost/filesystem.hpp>
|
||||
|
||||
namespace nfd {
|
||||
|
||||
@@ -25,21 +22,7 @@ NFD_LOG_INIT("Main");
|
||||
|
||||
struct ProgramOptions
|
||||
{
|
||||
struct TcpOutgoing
|
||||
{
|
||||
TcpOutgoing(std::pair<std::string, std::string> endpoint)
|
||||
: m_endpoint(endpoint)
|
||||
{
|
||||
}
|
||||
|
||||
std::pair<std::string, std::string> m_endpoint;
|
||||
std::vector<Name> m_prefixes;
|
||||
};
|
||||
|
||||
bool m_showUsage;
|
||||
std::pair<std::string, std::string> m_tcpListen;
|
||||
std::vector<TcpOutgoing> m_tcpOutgoings;
|
||||
std::string m_unixListen;
|
||||
std::string m_config;
|
||||
};
|
||||
|
||||
@@ -49,70 +32,33 @@ static FibManager* g_fibManager;
|
||||
static FaceManager* g_faceManager;
|
||||
static LocalControlHeaderManager* g_localControlHeaderManager;
|
||||
static StrategyChoiceManager* g_strategyChoiceManager;
|
||||
static TcpFactory* g_tcpFactory;
|
||||
static shared_ptr<TcpChannel> g_tcpChannel;
|
||||
static shared_ptr<InternalFace> g_internalFace;
|
||||
|
||||
#ifdef HAVE_UNIX_SOCKETS
|
||||
static UnixStreamFactory* g_unixFactory;
|
||||
static shared_ptr<UnixStreamChannel> g_unixChannel;
|
||||
#endif
|
||||
|
||||
|
||||
void
|
||||
usage(char* programName)
|
||||
{
|
||||
printf(
|
||||
"%s --help\n\tshow this help and exit\n"
|
||||
"%s [--tcp-listen \"0.0.0.0:6363\"] "
|
||||
#ifdef HAVE_UNIX_SOCKETS
|
||||
"[--unix-listen \"/var/run/nfd.sock\"] "
|
||||
#endif
|
||||
"[--tcp-connect \"192.0.2.1:6363\" "
|
||||
"[--prefix </example>]] "
|
||||
"%s "
|
||||
"[--config /path/to/nfd.conf]\n"
|
||||
"\trun forwarding daemon\n"
|
||||
"\t--tcp-listen <ip:port>: listen on IP and port\n"
|
||||
#ifdef HAVE_UNIX_SOCKETS
|
||||
"\t--unix-listen <unix-socket-path>: listen on Unix socket\n"
|
||||
#endif
|
||||
"\t--tcp-connect <ip:port>: connect to IP and port (can occur multiple times)\n"
|
||||
"\t--prefix <NDN name>: add this face as nexthop to FIB entry "
|
||||
"(must appear after --tcp-connect, can occur multiple times)\n"
|
||||
"\t--config <configuration file>]: path to configuration file\n"
|
||||
"\n",
|
||||
programName, programName
|
||||
);
|
||||
}
|
||||
|
||||
inline std::pair<std::string, std::string>
|
||||
parseIpPortPair(const std::string& s)
|
||||
{
|
||||
size_t pos = s.rfind(":");
|
||||
if (pos == std::string::npos) {
|
||||
throw std::invalid_argument("ip:port");
|
||||
}
|
||||
|
||||
return std::make_pair(s.substr(0, pos), s.substr(pos+1));
|
||||
}
|
||||
|
||||
bool
|
||||
parseCommandLine(int argc, char** argv)
|
||||
{
|
||||
g_options.m_showUsage = false;
|
||||
g_options.m_tcpListen = std::make_pair("0.0.0.0", "6363");
|
||||
g_options.m_unixListen = "/var/run/nfd.sock";
|
||||
g_options.m_tcpOutgoings.clear();
|
||||
g_options.m_config = DEFAULT_CONFIG_FILE;
|
||||
|
||||
while (1) {
|
||||
int option_index = 0;
|
||||
static ::option long_options[] = {
|
||||
{ "help" , no_argument , 0, 0 },
|
||||
{ "tcp-listen" , required_argument, 0, 0 },
|
||||
{ "tcp-connect" , required_argument, 0, 0 },
|
||||
{ "prefix" , required_argument, 0, 0 },
|
||||
{ "unix-listen" , required_argument, 0, 0 },
|
||||
{ "config" , required_argument, 0, 0 },
|
||||
{ 0 , 0 , 0, 0 }
|
||||
};
|
||||
@@ -125,22 +71,7 @@ parseCommandLine(int argc, char** argv)
|
||||
case 0://help
|
||||
g_options.m_showUsage = true;
|
||||
break;
|
||||
case 1://tcp-listen
|
||||
g_options.m_tcpListen = parseIpPortPair(::optarg);
|
||||
break;
|
||||
case 2://tcp-connect
|
||||
g_options.m_tcpOutgoings.push_back(parseIpPortPair(::optarg));
|
||||
break;
|
||||
case 3://prefix
|
||||
if (g_options.m_tcpOutgoings.empty()) {
|
||||
return false;
|
||||
}
|
||||
g_options.m_tcpOutgoings.back().m_prefixes.push_back(Name(::optarg));
|
||||
break;
|
||||
case 4://unix-listen
|
||||
g_options.m_unixListen = ::optarg;
|
||||
break;
|
||||
case 5://config
|
||||
case 1://config
|
||||
g_options.m_config = ::optarg;
|
||||
break;
|
||||
}
|
||||
@@ -151,68 +82,6 @@ parseCommandLine(int argc, char** argv)
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
onFaceFail(shared_ptr<Face> face, const std::string& reason)
|
||||
{
|
||||
g_forwarder->removeFace(face);
|
||||
}
|
||||
|
||||
void
|
||||
onFaceEstablish(shared_ptr<Face> newFace, std::vector<Name>* prefixes)
|
||||
{
|
||||
g_forwarder->addFace(newFace);
|
||||
newFace->onFail += bind(&onFaceFail, newFace, _1);
|
||||
|
||||
// add nexthop on prefixes
|
||||
if (prefixes != 0) {
|
||||
Fib& fib = g_forwarder->getFib();
|
||||
for (std::vector<Name>::iterator it = prefixes->begin();
|
||||
it != prefixes->end(); ++it) {
|
||||
std::pair<shared_ptr<fib::Entry>, bool> fibInsertResult =
|
||||
fib.insert(*it);
|
||||
shared_ptr<fib::Entry> fibEntry = fibInsertResult.first;
|
||||
fibEntry->addNextHop(newFace, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
onFaceError(const std::string& reason)
|
||||
{
|
||||
throw std::runtime_error(reason);
|
||||
}
|
||||
|
||||
void
|
||||
initializeTcp()
|
||||
{
|
||||
g_tcpFactory = new TcpFactory();
|
||||
g_tcpChannel = g_tcpFactory->createChannel(g_options.m_tcpListen.first,
|
||||
g_options.m_tcpListen.second);
|
||||
g_tcpChannel->listen(
|
||||
bind(&onFaceEstablish, _1, static_cast<std::vector<Name>*>(0)),
|
||||
&onFaceError);
|
||||
|
||||
for (std::vector<ProgramOptions::TcpOutgoing>::iterator it =
|
||||
g_options.m_tcpOutgoings.begin();
|
||||
it != g_options.m_tcpOutgoings.end(); ++it) {
|
||||
g_tcpChannel->connect(it->m_endpoint.first, it->m_endpoint.second,
|
||||
bind(&onFaceEstablish, _1, &(it->m_prefixes)), &onFaceError);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_UNIX_SOCKETS
|
||||
void
|
||||
initializeUnix()
|
||||
{
|
||||
g_unixFactory = new UnixStreamFactory();
|
||||
g_unixChannel = g_unixFactory->createChannel(g_options.m_unixListen);
|
||||
|
||||
g_unixChannel->listen(
|
||||
bind(&onFaceEstablish, _1, static_cast<std::vector<Name>*>(0)),
|
||||
&onFaceError);
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
initializeMgmt()
|
||||
{
|
||||
@@ -238,8 +107,8 @@ initializeMgmt()
|
||||
g_strategyChoiceManager = new StrategyChoiceManager(g_forwarder->getStrategyChoice(),
|
||||
g_internalFace);
|
||||
|
||||
/// \todo add parsing back when there is an official default config file
|
||||
// config.parse(g_options.m_config);
|
||||
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);
|
||||
@@ -248,29 +117,36 @@ initializeMgmt()
|
||||
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;
|
||||
}
|
||||
|
||||
g_forwarder = new Forwarder();
|
||||
initializeTcp();
|
||||
#ifdef HAVE_UNIX_SOCKETS
|
||||
initializeUnix();
|
||||
#endif
|
||||
initializeMgmt();
|
||||
|
||||
/// \todo Add signal processing to gracefully terminate the app
|
||||
|
||||
try {
|
||||
bool isCommandLineValid = parseCommandLine(argc, argv);
|
||||
if (!isCommandLineValid) {
|
||||
usage(argv[0]);
|
||||
return 1;
|
||||
}
|
||||
if (g_options.m_showUsage) {
|
||||
usage(argv[0]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
g_forwarder = new Forwarder();
|
||||
initializeMgmt();
|
||||
|
||||
/// \todo Add signal processing to gracefully terminate the app
|
||||
|
||||
getGlobalIoService().run();
|
||||
} catch(std::exception& ex) {
|
||||
NFD_LOG_ERROR(ex.what());
|
||||
// } 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& error) {
|
||||
if (error.code() == boost::system::errc::permission_denied) {
|
||||
NFD_LOG_ERROR("Error: Permissions denied for " << error.path1());
|
||||
NFD_LOG_ERROR(argv[0] << " should be run as superuser");
|
||||
} else {
|
||||
NFD_LOG_ERROR("Error: " << error.what());
|
||||
}
|
||||
} catch(std::exception& exception) {
|
||||
NFD_LOG_ERROR("Error: " << exception.what());
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
+12
-20
@@ -26,11 +26,11 @@ ConfigFile::addSectionHandler(const std::string& sectionName,
|
||||
}
|
||||
|
||||
void
|
||||
ConfigFile::parse(const char* filename, bool isDryRun)
|
||||
ConfigFile::parse(const std::string& filename, bool isDryRun)
|
||||
{
|
||||
std::ifstream inputFile;
|
||||
inputFile.open(filename);
|
||||
if (!inputFile.is_open())
|
||||
inputFile.open(filename.c_str());
|
||||
if (!inputFile.good() || !inputFile.is_open())
|
||||
{
|
||||
std::string msg = "Failed to read configuration file: ";
|
||||
msg += filename;
|
||||
@@ -41,7 +41,7 @@ ConfigFile::parse(const char* filename, bool isDryRun)
|
||||
}
|
||||
|
||||
void
|
||||
ConfigFile::parse(const std::string& input, bool isDryRun, const char* filename)
|
||||
ConfigFile::parse(const std::string& input, bool isDryRun, const std::string& filename)
|
||||
{
|
||||
std::istringstream inputStream(input);
|
||||
parse(inputStream, isDryRun, filename);
|
||||
@@ -49,7 +49,7 @@ ConfigFile::parse(const std::string& input, bool isDryRun, const char* filename)
|
||||
|
||||
|
||||
void
|
||||
ConfigFile::parse(std::istream& input, bool isDryRun, const char* filename)
|
||||
ConfigFile::parse(std::istream& input, bool isDryRun, const std::string& filename)
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -59,10 +59,7 @@ ConfigFile::parse(std::istream& input, bool isDryRun, const char* filename)
|
||||
{
|
||||
std::stringstream msg;
|
||||
msg << "Failed to parse configuration file";
|
||||
if (filename != 0)
|
||||
{
|
||||
msg << " " << filename;
|
||||
}
|
||||
msg << " " << filename;
|
||||
msg << " " << error.message() << " line " << error.line();
|
||||
throw Error(msg.str());
|
||||
}
|
||||
@@ -71,18 +68,16 @@ ConfigFile::parse(std::istream& input, bool isDryRun, const char* filename)
|
||||
}
|
||||
|
||||
void
|
||||
ConfigFile::process(bool isDryRun, const char* filename)
|
||||
ConfigFile::process(bool isDryRun, const std::string& filename)
|
||||
{
|
||||
BOOST_ASSERT(!filename.empty());
|
||||
// NFD_LOG_DEBUG("processing..." << ((isDryRun)?("dry run"):("")));
|
||||
|
||||
if (m_global.begin() == m_global.end())
|
||||
{
|
||||
std::string msg = "Error processing configuration file";
|
||||
if (filename != 0)
|
||||
{
|
||||
msg += ": ";
|
||||
msg += filename;
|
||||
}
|
||||
msg += ": ";
|
||||
msg += filename;
|
||||
msg += " no data";
|
||||
throw Error(msg);
|
||||
}
|
||||
@@ -101,11 +96,8 @@ ConfigFile::process(bool isDryRun, const char* filename)
|
||||
else
|
||||
{
|
||||
std::string msg = "Error processing configuration file";
|
||||
if (filename != 0)
|
||||
{
|
||||
msg += " ";
|
||||
msg += filename;
|
||||
}
|
||||
msg += " ";
|
||||
msg += filename;
|
||||
msg += " no module subscribed for section: " + sectionName;
|
||||
throw Error(msg);
|
||||
}
|
||||
|
||||
@@ -47,31 +47,31 @@ public:
|
||||
* \throws ConfigFile::Error if parse error
|
||||
*/
|
||||
void
|
||||
parse(const char* filename, bool isDryRun=false);
|
||||
parse(const std::string& filename, bool isDryRun);
|
||||
|
||||
/**
|
||||
* \param input configuration (as a string) to parse
|
||||
* \param isDryRun true if performing a dry run of configuration, false otherwise
|
||||
* \param filename optional convenience argument to provide more detailed error messages (if available)
|
||||
* \param filename optional convenience argument to provide more detailed error messages
|
||||
* \throws ConfigFile::Error if file not found
|
||||
* \throws ConfigFile::Error if parse error
|
||||
*/
|
||||
void
|
||||
parse(const std::string& input, bool isDryRun=false, const char* filename=0);
|
||||
parse(const std::string& input, bool isDryRun, const std::string& filename);
|
||||
|
||||
/**
|
||||
* \param input stream to parse
|
||||
* \param isDryRun true if performing a dry run of configuration, false otherwise
|
||||
* \param filename optional convenience argument to provide more detailed error messages (if available)
|
||||
* \param filename optional convenience argument to provide more detailed error messages
|
||||
* \throws ConfigFile::Error if parse error
|
||||
*/
|
||||
void
|
||||
parse(std::istream& input, bool isDryRun=false, const char* filename=0);
|
||||
parse(std::istream& input, bool isDryRun, const std::string& filename);
|
||||
|
||||
private:
|
||||
|
||||
void
|
||||
process(bool isDryRun, const char* filename);
|
||||
process(bool isDryRun, const std::string& filename);
|
||||
|
||||
private:
|
||||
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
; the general section contains settings of nfd process
|
||||
; general
|
||||
; {
|
||||
; }
|
||||
|
||||
; the face_system section defines what faces and channels are created
|
||||
face_system
|
||||
{
|
||||
; the unix section contains settings of UNIX stream faces and channels
|
||||
unix
|
||||
{
|
||||
listen yes ; set to 'no' to disable UNIX stream listener, default 'yes'
|
||||
path /var/run/nfd.sock ; UNIX stream listener path
|
||||
}
|
||||
|
||||
; the tcp section contains settings of TCP faces and channels
|
||||
tcp
|
||||
{
|
||||
listen yes ; set to 'no' to disable TCP listener, default 'yes'
|
||||
port 6363 ; TCP listener port number
|
||||
}
|
||||
|
||||
; the udp section contains settings of UDP faces and channels
|
||||
udp
|
||||
{
|
||||
port 6363 ; UDP unicast port number
|
||||
idle_timeout 600 ; idle time (seconds) before closing a UDP unicast face
|
||||
keep_alive_interval 25; interval (seconds) between keep-alive refreshes
|
||||
|
||||
mcast no
|
||||
|
||||
; Example multicast settings
|
||||
; NFD creates one UDP multicast face per NIC
|
||||
; mcast yes ; set to 'no' to disable UDP multicast, default 'yes'
|
||||
; mcast_port 56363 ; UDP multicast port number
|
||||
; mcast_group 224.0.23.170 ; UDP multicast group (IPv4 only)
|
||||
}
|
||||
|
||||
; the ether section contains settings of Ethernet faces and channels
|
||||
ether
|
||||
{
|
||||
mcast no
|
||||
; Example multicast settings
|
||||
; NFD creates one Ethernet multicast face per NIC
|
||||
; mcast yes ; set to 'no' to disable Ethernet multicast, default 'yes'
|
||||
; mcast_group 01:00:5E:00:17:AA ; Ethernet multicast group
|
||||
}
|
||||
}
|
||||
|
||||
; the authorizations section grants privileges to authorized keys
|
||||
authorizations
|
||||
{
|
||||
; an authorize section grants privileges to a key
|
||||
authorize
|
||||
{
|
||||
keyfile @SYSCONFDIR@/ndn/keys/default.pub ; public key file
|
||||
privileges ; set of privileges granted to this public key
|
||||
{
|
||||
control-header
|
||||
faces
|
||||
fib
|
||||
; stats
|
||||
strategy-choice
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -207,7 +207,7 @@ BOOST_FIXTURE_TEST_CASE(TwoKeys, TwoValidatorFixture)
|
||||
|
||||
config.addSectionHandler("authorizations",
|
||||
bind(&CommandValidator::onConfig, boost::ref(validator), _1, _2));
|
||||
config.parse(CONFIG, false);
|
||||
config.parse(CONFIG, false, "dummy-config");
|
||||
|
||||
validator.validate(*fibCommand,
|
||||
bind(&CommandValidatorTester::onValidated, boost::ref(m_tester1), _1),
|
||||
@@ -267,7 +267,7 @@ BOOST_FIXTURE_TEST_CASE(TwoKeysDryRun, TwoValidatorFixture)
|
||||
|
||||
config.addSectionHandler("authorizations",
|
||||
bind(&CommandValidator::onConfig, boost::ref(validator), _1, _2));
|
||||
config.parse(CONFIG, true);
|
||||
config.parse(CONFIG, true, "dummy-config");
|
||||
|
||||
validator.validate(*fibCommand,
|
||||
bind(&CommandValidatorTester::onValidated, boost::ref(m_tester1), _1),
|
||||
@@ -312,7 +312,7 @@ BOOST_AUTO_TEST_CASE(NoAuthorizeSections)
|
||||
|
||||
config.addSectionHandler("authorizations",
|
||||
bind(&CommandValidator::onConfig, boost::ref(validator), _1, _2));
|
||||
BOOST_CHECK_THROW(config.parse(NO_AUTHORIZE_CONFIG, false), ConfigFile::Error);
|
||||
BOOST_CHECK_THROW(config.parse(NO_AUTHORIZE_CONFIG, false, "dummy-config"), ConfigFile::Error);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(NoPrivilegesSections)
|
||||
@@ -331,7 +331,7 @@ BOOST_AUTO_TEST_CASE(NoPrivilegesSections)
|
||||
|
||||
config.addSectionHandler("authorizations",
|
||||
bind(&CommandValidator::onConfig, boost::ref(validator), _1, _2));
|
||||
BOOST_CHECK_THROW(config.parse(NO_PRIVILEGES_CONFIG, false), ConfigFile::Error);
|
||||
BOOST_CHECK_THROW(config.parse(NO_PRIVILEGES_CONFIG, false, "dummy-config"), ConfigFile::Error);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(InvalidKeyFile)
|
||||
@@ -355,7 +355,7 @@ BOOST_AUTO_TEST_CASE(InvalidKeyFile)
|
||||
|
||||
config.addSectionHandler("authorizations",
|
||||
bind(&CommandValidator::onConfig, boost::ref(validator), _1, _2));
|
||||
BOOST_CHECK_THROW(config.parse(INVALID_KEY_CONFIG, false), ConfigFile::Error);
|
||||
BOOST_CHECK_THROW(config.parse(INVALID_KEY_CONFIG, false, "dummy-config"), ConfigFile::Error);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(NoKeyFile)
|
||||
@@ -379,7 +379,7 @@ BOOST_AUTO_TEST_CASE(NoKeyFile)
|
||||
|
||||
config.addSectionHandler("authorizations",
|
||||
bind(&CommandValidator::onConfig, boost::ref(validator), _1, _2));
|
||||
BOOST_CHECK_THROW(config.parse(NO_KEY_CONFIG, false), ConfigFile::Error);
|
||||
BOOST_CHECK_THROW(config.parse(NO_KEY_CONFIG, false, "dummy-config"), ConfigFile::Error);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(MalformedKey)
|
||||
@@ -404,7 +404,7 @@ BOOST_AUTO_TEST_CASE(MalformedKey)
|
||||
|
||||
config.addSectionHandler("authorizations",
|
||||
bind(&CommandValidator::onConfig, boost::ref(validator), _1, _2));
|
||||
BOOST_CHECK_THROW(config.parse(MALFORMED_KEY_CONFIG, false), ConfigFile::Error);
|
||||
BOOST_CHECK_THROW(config.parse(MALFORMED_KEY_CONFIG, false, "dummy-config"), ConfigFile::Error);
|
||||
}
|
||||
|
||||
bool
|
||||
@@ -431,7 +431,7 @@ BOOST_AUTO_TEST_CASE(NoAuthorizeSectionsDryRun)
|
||||
|
||||
config.addSectionHandler("authorizations",
|
||||
bind(&CommandValidator::onConfig, boost::ref(validator), _1, _2));
|
||||
BOOST_CHECK_EXCEPTION(config.parse(NO_AUTHORIZE_CONFIG, true),
|
||||
BOOST_CHECK_EXCEPTION(config.parse(NO_AUTHORIZE_CONFIG, true, "dummy-config"),
|
||||
ConfigFile::Error,
|
||||
bind(&validateErrorMessage,
|
||||
"No authorize sections found", _1));
|
||||
@@ -472,7 +472,7 @@ BOOST_FIXTURE_TEST_CASE(NoPrivilegesSectionsDryRun, TwoValidatorFixture)
|
||||
<< "No privileges section found for key file tests/mgmt/key2.pub "
|
||||
<< "(" << m_tester2.getPublicKeyName().toUri() << ")";
|
||||
|
||||
BOOST_CHECK_EXCEPTION(config.parse(NO_PRIVILEGES_CONFIG, true),
|
||||
BOOST_CHECK_EXCEPTION(config.parse(NO_PRIVILEGES_CONFIG, true, "dummy-config"),
|
||||
ConfigFile::Error,
|
||||
bind(&validateErrorMessage, expectedError.str(), _1));
|
||||
}
|
||||
@@ -506,7 +506,7 @@ BOOST_AUTO_TEST_CASE(InvalidKeyFileDryRun)
|
||||
config.addSectionHandler("authorizations",
|
||||
bind(&CommandValidator::onConfig, boost::ref(validator), _1, _2));
|
||||
|
||||
BOOST_CHECK_EXCEPTION(config.parse(INVALID_KEY_CONFIG, true),
|
||||
BOOST_CHECK_EXCEPTION(config.parse(INVALID_KEY_CONFIG, true, "dummy-config"),
|
||||
ConfigFile::Error,
|
||||
bind(&validateErrorMessage,
|
||||
"Unable to open key file tests/mgmt/notakeyfile.pub\n"
|
||||
@@ -537,7 +537,7 @@ BOOST_AUTO_TEST_CASE(NoKeyFileDryRun)
|
||||
|
||||
config.addSectionHandler("authorizations",
|
||||
bind(&CommandValidator::onConfig, boost::ref(validator), _1, _2));
|
||||
BOOST_CHECK_EXCEPTION(config.parse(NO_KEY_CONFIG, true),
|
||||
BOOST_CHECK_EXCEPTION(config.parse(NO_KEY_CONFIG, true, "dummy-config"),
|
||||
ConfigFile::Error,
|
||||
bind(&validateErrorMessage,
|
||||
"No keyfile specified\n"
|
||||
@@ -570,7 +570,7 @@ BOOST_AUTO_TEST_CASE(MalformedKeyDryRun)
|
||||
|
||||
config.addSectionHandler("authorizations",
|
||||
bind(&CommandValidator::onConfig, boost::ref(validator), _1, _2));
|
||||
BOOST_CHECK_EXCEPTION(config.parse(MALFORMED_KEY_CONFIG, true),
|
||||
BOOST_CHECK_EXCEPTION(config.parse(MALFORMED_KEY_CONFIG, true, "dummy-config"),
|
||||
ConfigFile::Error,
|
||||
bind(&validateErrorMessage,
|
||||
"Malformed key file tests/mgmt/malformedkey.pub\n"
|
||||
|
||||
+13
-14
@@ -202,8 +202,7 @@ BOOST_AUTO_TEST_CASE(OnConfigStream)
|
||||
input.open("tests/mgmt/config_example.info");
|
||||
BOOST_REQUIRE(input.is_open());
|
||||
|
||||
file.parse(input);
|
||||
|
||||
file.parse(input, false, "config_example.info");
|
||||
BOOST_CHECK(sub.allCallbacksFired());
|
||||
}
|
||||
|
||||
@@ -214,7 +213,7 @@ BOOST_AUTO_TEST_CASE(OnConfigStreamEmptyStream)
|
||||
|
||||
std::ifstream input;
|
||||
|
||||
BOOST_CHECK_THROW(file.parse(input), ConfigFile::Error);
|
||||
BOOST_CHECK_THROW(file.parse(input, false, "unknown"), ConfigFile::Error);
|
||||
BOOST_CHECK(sub.noCallbacksFired());
|
||||
}
|
||||
|
||||
@@ -224,7 +223,7 @@ BOOST_AUTO_TEST_CASE(OnConfigString)
|
||||
ConfigFile file;
|
||||
DummyAllSubscriber sub(file);
|
||||
|
||||
file.parse(CONFIG);
|
||||
file.parse(CONFIG, false, "dummy-config");
|
||||
|
||||
BOOST_CHECK(sub.allCallbacksFired());
|
||||
}
|
||||
@@ -234,7 +233,7 @@ BOOST_AUTO_TEST_CASE(OnConfigStringEmpty)
|
||||
ConfigFile file;
|
||||
DummyAllSubscriber sub(file);
|
||||
|
||||
BOOST_CHECK_THROW(file.parse(std::string()), ConfigFile::Error);
|
||||
BOOST_CHECK_THROW(file.parse(std::string(), false, "dummy-config"), ConfigFile::Error);
|
||||
BOOST_CHECK(sub.noCallbacksFired());
|
||||
}
|
||||
|
||||
@@ -243,7 +242,7 @@ BOOST_AUTO_TEST_CASE(OnConfigStringMalformed)
|
||||
ConfigFile file;
|
||||
DummyAllSubscriber sub(file);
|
||||
|
||||
BOOST_CHECK_THROW(file.parse(MALFORMED_CONFIG), ConfigFile::Error);
|
||||
BOOST_CHECK_THROW(file.parse(MALFORMED_CONFIG, false, "dummy-config"), ConfigFile::Error);
|
||||
BOOST_CHECK(sub.noCallbacksFired());
|
||||
}
|
||||
|
||||
@@ -252,7 +251,7 @@ BOOST_AUTO_TEST_CASE(OnConfigStringDryRun)
|
||||
ConfigFile file;
|
||||
DummyAllSubscriber sub(file, true);
|
||||
|
||||
file.parse(CONFIG, true);
|
||||
file.parse(CONFIG, true, "dummy-config");
|
||||
|
||||
BOOST_CHECK(sub.allCallbacksFired());
|
||||
}
|
||||
@@ -262,7 +261,7 @@ BOOST_AUTO_TEST_CASE(OnConfigFilename)
|
||||
ConfigFile file;
|
||||
DummyAllSubscriber sub(file);
|
||||
|
||||
file.parse("tests/mgmt/config_example.info");
|
||||
file.parse("tests/mgmt/config_example.info", false);
|
||||
|
||||
BOOST_CHECK(sub.allCallbacksFired());
|
||||
}
|
||||
@@ -272,7 +271,7 @@ BOOST_AUTO_TEST_CASE(OnConfigFilenameNoFile)
|
||||
ConfigFile file;
|
||||
DummyAllSubscriber sub(file);
|
||||
|
||||
BOOST_CHECK_THROW(file.parse("i_made_this_up.info"), ConfigFile::Error);
|
||||
BOOST_CHECK_THROW(file.parse("i_made_this_up.info", false), ConfigFile::Error);
|
||||
|
||||
BOOST_CHECK(sub.noCallbacksFired());
|
||||
}
|
||||
@@ -282,7 +281,7 @@ BOOST_AUTO_TEST_CASE(OnConfigFilenameMalformed)
|
||||
ConfigFile file;
|
||||
DummyAllSubscriber sub(file);
|
||||
|
||||
BOOST_CHECK_THROW(file.parse("tests/mgmt/config_malformed.info"), ConfigFile::Error);
|
||||
BOOST_CHECK_THROW(file.parse("tests/mgmt/config_malformed.info", false), ConfigFile::Error);
|
||||
|
||||
BOOST_CHECK(sub.noCallbacksFired());
|
||||
}
|
||||
@@ -296,7 +295,7 @@ BOOST_AUTO_TEST_CASE(OnConfigStreamDryRun)
|
||||
input.open("tests/mgmt/config_example.info");
|
||||
BOOST_REQUIRE(input.is_open());
|
||||
|
||||
file.parse(input, true);
|
||||
file.parse(input, true, "tests/mgmt/config_example.info");
|
||||
|
||||
BOOST_CHECK(sub.allCallbacksFired());
|
||||
|
||||
@@ -318,7 +317,7 @@ BOOST_AUTO_TEST_CASE(OnConfigReplaceSubscriber)
|
||||
DummyAllSubscriber sub1(file);
|
||||
DummyAllSubscriber sub2(file);
|
||||
|
||||
file.parse(CONFIG);
|
||||
file.parse(CONFIG, false, "dummy-config");
|
||||
|
||||
BOOST_CHECK(sub1.noCallbacksFired());
|
||||
BOOST_CHECK(sub2.allCallbacksFired());
|
||||
@@ -328,7 +327,7 @@ BOOST_AUTO_TEST_CASE(OnConfigUncoveredSections)
|
||||
{
|
||||
ConfigFile file;
|
||||
|
||||
BOOST_CHECK_THROW(file.parse(CONFIG), ConfigFile::Error);
|
||||
BOOST_CHECK_THROW(file.parse(CONFIG, false, "dummy-config"), ConfigFile::Error);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(OnConfigCoveredByPartialSubscribers)
|
||||
@@ -337,7 +336,7 @@ BOOST_AUTO_TEST_CASE(OnConfigCoveredByPartialSubscribers)
|
||||
DummyOneSubscriber subA(file, "a");
|
||||
DummyOneSubscriber subB(file, "b");
|
||||
|
||||
file.parse(CONFIG);
|
||||
file.parse(CONFIG, false, "dummy-config");
|
||||
|
||||
BOOST_CHECK(subA.allCallbacksFired());
|
||||
BOOST_CHECK(subB.allCallbacksFired());
|
||||
|
||||
@@ -260,7 +260,7 @@ public:
|
||||
void
|
||||
parseConfig(const std::string configuration, bool isDryRun)
|
||||
{
|
||||
m_config.parse(configuration, isDryRun);
|
||||
m_config.parse(configuration, isDryRun, "dummy-config");
|
||||
}
|
||||
|
||||
virtual
|
||||
|
||||
@@ -13,7 +13,7 @@ def options(opt):
|
||||
nfdopt.add_option('--with-tests', action='store_true',default=False,dest='with_tests',help='''Build unit tests''')
|
||||
nfdopt.add_option('--with-ndn-cpp',action='store',type='string',default=None,dest='ndn_cpp_dir',
|
||||
help='''Use NDN-CPP library from the specified path''')
|
||||
|
||||
|
||||
def configure(conf):
|
||||
conf.load("compiler_cxx boost gnu_dirs")
|
||||
try:
|
||||
@@ -40,7 +40,7 @@ def configure(conf):
|
||||
if not conf.options.ndn_cpp_dir:
|
||||
conf.check_cfg(package='libndn-cpp-dev', args=['--cflags', '--libs'], uselib_store='NDN_CPP', mandatory=True)
|
||||
else:
|
||||
conf.check_cxx(lib='ndn-cpp-dev', uselib_store='NDN_CPP',
|
||||
conf.check_cxx(lib='ndn-cpp-dev', uselib_store='NDN_CPP',
|
||||
cxxflags="-I%s/include" % conf.options.ndn_cpp_dir,
|
||||
linkflags="-L%s/lib" % conf.options.ndn_cpp_dir,
|
||||
mandatory=True)
|
||||
@@ -52,7 +52,7 @@ def configure(conf):
|
||||
boost_libs+=' unit_test_framework'
|
||||
|
||||
conf.check_boost(lib=boost_libs)
|
||||
|
||||
|
||||
if conf.env.BOOST_VERSION_NUMBER < 104800:
|
||||
Logs.error ("Minimum required boost version is 1.48.0")
|
||||
Logs.error ("Please upgrade your distribution or install custom boost libraries" +
|
||||
@@ -96,7 +96,7 @@ def build(bld):
|
||||
use = 'nfd-objects',
|
||||
includes = [".", "daemon"],
|
||||
)
|
||||
|
||||
|
||||
for app in bld.path.ant_glob('tools/*.cpp'):
|
||||
bld(features=['cxx', 'cxxprogram'],
|
||||
target = 'bin/%s' % (str(app.change_ext(''))),
|
||||
@@ -123,6 +123,11 @@ def build(bld):
|
||||
if bld.env['HAVE_UNIX_SOCKETS']:
|
||||
unit_tests.source += bld.path.ant_glob('tests/face/unix-*.cpp')
|
||||
|
||||
bld(features = "subst",
|
||||
source = 'nfd.conf.sample.in',
|
||||
target = 'nfd.conf.sample',
|
||||
install_path = "${SYSCONFDIR}/ndn")
|
||||
|
||||
@Configure.conf
|
||||
def add_supported_cxxflags(self, cxxflags):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user