blob: c14faa3c69b88f05c84e18ce16f39e390824a9b3 [file] [log] [blame]
Junxiao Shiae889382016-11-23 04:52:51 +00001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2014-2016, Regents of the University of California,
4 * Arizona Board of Regents,
5 * Colorado State University,
6 * University Pierre & Marie Curie, Sorbonne University,
7 * Washington University in St. Louis,
8 * Beijing Institute of Technology,
9 * The University of Memphis.
10 *
11 * This file is part of NFD (Named Data Networking Forwarding Daemon).
12 * See AUTHORS.md for complete list of NFD authors and contributors.
13 *
14 * NFD is free software: you can redistribute it and/or modify it under the terms
15 * of the GNU General Public License as published by the Free Software Foundation,
16 * either version 3 of the License, or (at your option) any later version.
17 *
18 * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
19 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
20 * PURPOSE. See the GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License along with
23 * NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
24 */
25
26#include "status.hpp"
27#include "forwarder-general-module.hpp"
28#include "channel-module.hpp"
29#include "face-module.hpp"
30#include "fib-module.hpp"
31#include "rib-module.hpp"
32#include "strategy-choice-module.hpp"
33
34#include <ndn-cxx/security/validator-null.hpp>
35
36namespace nfd {
37namespace tools {
38namespace nfdc {
39
40int
41reportStatus(ExecuteContext& ctx, const StatusReportOptions& options)
42{
43 unique_ptr<Validator> validator = make_unique<ndn::ValidatorNull>();
44 CommandOptions ctrlOptions;
45
46 StatusReport report;
47
48 if (options.wantForwarderGeneral) {
49 auto nfdIdCollector = make_unique<NfdIdCollector>(std::move(validator));
50 auto forwarderGeneralModule = make_unique<ForwarderGeneralModule>();
51 forwarderGeneralModule->setNfdIdCollector(*nfdIdCollector);
52 report.sections.push_back(std::move(forwarderGeneralModule));
53 validator = std::move(nfdIdCollector);
54 }
55
56 if (options.wantChannels) {
57 report.sections.push_back(make_unique<ChannelModule>());
58 }
59
60 if (options.wantFaces) {
61 report.sections.push_back(make_unique<FaceModule>());
62 }
63
64 if (options.wantFib) {
65 report.sections.push_back(make_unique<FibModule>());
66 }
67
68 if (options.wantRib) {
69 report.sections.push_back(make_unique<RibModule>());
70 }
71
72 if (options.wantStrategyChoice) {
73 report.sections.push_back(make_unique<StrategyChoiceModule>());
74 }
75
76 uint32_t code = report.collect(ctx.face, ctx.keyChain, *validator, ctrlOptions);
77 if (code != 0) {
78 // Give a simple error code for end user.
79 // Technical support personnel:
80 // 1. get the exact command from end user
81 // 2. code div 1000000 is zero-based section index
82 // 3. code mod 1000000 is a Controller.fetch error code
83 std::cerr << "Error while collecting status report (" << code << ").\n";
84 return 1;
85 }
86
87 switch (options.output) {
88 case ReportFormat::XML:
89 report.formatXml(std::cout);
90 break;
91 case ReportFormat::TEXT:
92 report.formatText(std::cout);
93 break;
94 }
95 return 0;
96}
97
98/** \brief single-section status command
99 */
100static int
101reportStatusSingleSection(ExecuteContext& ctx, bool StatusReportOptions::*wantSection)
102{
103 StatusReportOptions options;
104 options.*wantSection = true;
105 return reportStatus(ctx, options);
106}
107
108/** \brief the 'status report' command
109 */
110static int
111reportStatusComprehensive(ExecuteContext& ctx)
112{
113 StatusReportOptions options;
114 options.output = ctx.args.get<ReportFormat>("format", ReportFormat::TEXT);
115 options.wantForwarderGeneral = options.wantChannels = options.wantFaces =
116 options.wantFib = options.wantRib = options.wantStrategyChoice = true;
117 return reportStatus(ctx, options);
118}
119
120void
121registerStatusCommands(CommandParser& parser)
122{
123 CommandDefinition defStatusReport("status", "report");
124 defStatusReport
125 .setTitle("print NFD status report")
126 .addArg("format", ArgValueType::REPORT_FORMAT, Required::NO, Positional::YES);
127 parser.addCommand(defStatusReport, &reportStatusComprehensive);
128
129 CommandDefinition defStatusShow("status", "show");
130 defStatusShow
131 .setTitle("print general status");
132 parser.addCommand(defStatusShow, bind(&reportStatusSingleSection, _1, &StatusReportOptions::wantForwarderGeneral));
133 parser.addAlias("status", "show", "list");
134
135 CommandDefinition defFaceList("face", "list");
136 defFaceList
137 .setTitle("print face list");
138 parser.addCommand(defFaceList, bind(&reportStatusSingleSection, _1, &StatusReportOptions::wantFaces));
139
140 CommandDefinition defChannelList("channel", "list");
141 defChannelList
142 .setTitle("print channel list");
143 parser.addCommand(defChannelList, bind(&reportStatusSingleSection, _1, &StatusReportOptions::wantChannels));
144
145 CommandDefinition defStrategyList("strategy", "list");
146 defStrategyList
147 .setTitle("print strategy choices");
148 parser.addCommand(defStrategyList, bind(&reportStatusSingleSection, _1, &StatusReportOptions::wantStrategyChoice));
149
150 CommandDefinition defFibList("fib", "list");
151 defFibList
152 .setTitle("print FIB entries");
153 parser.addCommand(defFibList, bind(&reportStatusSingleSection, _1, &StatusReportOptions::wantFib));
154
155 CommandDefinition defRouteList("route", "list");
156 defRouteList
157 .setTitle("print RIB entries");
158 parser.addCommand(defRouteList, bind(&reportStatusSingleSection, _1, &StatusReportOptions::wantRib));
159}
160
161} // namespace nfdc
162} // namespace tools
163} // namespace nfd