mgmt: publish GeneralStatus dataset

In ForwarderStatusManager, publish ForwarderStatus as a dataset at
/localhost/nfd/status/general.
To maintain backwards compatibility, an Interest to /localhost/nfd/status
also retrieves this dataset.

It's intentional not to update the test suite in this commit,
to illustrate that backwards compatibility is maintained.

refs #3081

Change-Id: I9b636e2e621563185303a7304be402c8221c9863
diff --git a/daemon/mgmt/forwarder-status-manager.cpp b/daemon/mgmt/forwarder-status-manager.cpp
index b614a58..486e621 100644
--- a/daemon/mgmt/forwarder-status-manager.cpp
+++ b/daemon/mgmt/forwarder-status-manager.cpp
@@ -37,12 +37,11 @@
   , m_startTimestamp(time::system_clock::now())
 {
   m_dispatcher.addStatusDataset("status", ndn::mgmt::makeAcceptAllAuthorization(),
-                                bind(&ForwarderStatusManager::listStatus, this, _1, _2, _3));
+                                bind(&ForwarderStatusManager::listGeneralStatus, this, _1, _2, _3));
 }
 
-void
-ForwarderStatusManager::listStatus(const Name& topPrefix, const Interest& interest,
-                                   ndn::mgmt::StatusDatasetContext& context)
+ndn::nfd::ForwarderStatus
+ForwarderStatusManager::collectGeneralStatus()
 {
   ndn::nfd::ForwarderStatus status;
 
@@ -64,8 +63,29 @@
         .setNInNacks(counters.nInNacks)
         .setNOutNacks(counters.nOutNacks);
 
+  return status;
+}
+
+void
+ForwarderStatusManager::listGeneralStatus(const Name& topPrefix, const Interest& interest,
+                                          ndn::mgmt::StatusDatasetContext& context)
+{
+  static const PartialName PREFIX_STATUS("status");
+  static const PartialName PREFIX_STATUS_GENERAL("status/general");
+
+  PartialName subPrefix = interest.getName().getSubName(topPrefix.size());
+  if (subPrefix == PREFIX_STATUS_GENERAL || subPrefix == PREFIX_STATUS) {
+    context.setPrefix(Name(topPrefix).append(PREFIX_STATUS_GENERAL));
+  }
+  else {
+    context.reject(ndn::mgmt::ControlResponse().setCode(404));
+    return;
+  }
+  // TODO#3379 register the dataset at status/general, and delete these conditions
+
   context.setExpiry(STATUS_SERVER_DEFAULT_FRESHNESS);
 
+  auto status = this->collectGeneralStatus();
   status.wireEncode().parse();
   for (const auto& subblock : status.wireEncode().elements()) {
     context.append(subblock);