blob: 104aac92e3597202fda1e5a95018e4099ebab243 [file] [log] [blame]
shockjiang85312022014-07-27 23:22:16 -07001/*
2 * NameServer.cpp
3 *
4 * Created on: 18 Jul, 2014
5 * Author: Xiaoke JIANG
6 *
7 */
8
9
10#include "app/name-dig.hpp"
11#include "boost/program_options.hpp"
12#include "boost/filesystem.hpp"
13
14using namespace ndn;
15using namespace ndn::ndns;
16using namespace std;
17
18void
19usage()
20{
21 cout<<"\n Usage: \n"
22 << "dig /name/to/be/resolved [options]\n"
23 <<"\t[-t seconds] - set the maximal waiting time. default: 10\n"
24 <<"\t[-p prefix] - set the routable prefix of caching resolver. default: / \n"
25 <<"\t[-n number] - set the maximal tried time. default: 2\n"
26 <<"\t[-r rr_type] - set the RR type. default: TXT\n"
27 <<"\t[-h] - set the help message\n"
28
29 <<"\ne.g.: dig /net/ndnsim/www -p /localhost -t 5 -n 2 -r TXT\n"
30 ;
31
32}
33
34int main(int argc, char * argv[])
35{
36 //char *programName, char *dstLabel, char *resolverName
37 //const char *programName = argv[0];
38 std::string appName = boost::filesystem::basename(argv[0]);
39
40 string dstLabel;
41 string resolver;
42 int waitingSeconds=10;
43 string rrType = "TXT";
44 int tryMax = 1;
45 try{
46
47 namespace po = boost::program_options;
48 po::variables_map vm;
49
50 /*
51 po::options_description desc("Generic Options");
52 desc.add_options()
53 ("help,h", "print help message")
54 ("name", po::value<string>(&dstLabel)->required()->composing(), "name to be resolved")
55 ("resolver", po::value<string>(&resolver)->composing(), "routable prefix of resolver")
56 ("waiting,w", po::value<int>(&waitingSeconds), "set waiting seconds for every Interest. default: 10")
57 ("rrtype", po::value<std::string>(), "set request RR Type. default: TXT")
58 ("try", po::value<int>(&tryMax), "set maximal Interest Tried Number. default: 2")
59 //("positional,p", po::value< vector<string> >(), "positional optionals")
60 ;
61
62 */
63
64 po::options_description generic("Generic Options");
65 generic.add_options()
66 ("help,h", "print help message")
67 ;
68
69
70 po::options_description config("Configuration");
71 config.add_options()
72 ("waiting,w", po::value<int>(&waitingSeconds), "set waiting seconds for every Interest. default: 10")
73 ("rrtype,t", po::value<std::string>(), "set request RR Type. default: TXT")
74 ("trynum,n", po::value<int>(&tryMax), "set maximal Interest Tried Number. default: 2")
75 ;
76
77
78 po::options_description hidden("Hidden Options");
79 hidden.add_options()
80 ("name", po::value<string>(&dstLabel)->required(), "name to be resolved")
81 ("resolver", po::value<string>(&resolver), "routable prefix of resolver")
82 ;
83
84 po::positional_options_description postion;
85 postion.add("name", 1);
86 postion.add("resolver", 1);
87
88
89
90 po::options_description cmdline_options;
91 cmdline_options.add(generic).add(config).add(hidden);
92
93 po::options_description config_file_options;
94 config_file_options.add(config).add(hidden);
95
96 po::options_description visible("Allowed options");
97 visible.add(generic).add(config);
98
99
100 po::parsed_options parsed = po::command_line_parser(argc, argv).options(cmdline_options).positional(postion).run();
101
102
103 po::store(parsed, vm);
104 po::notify(vm);
105
106 if (vm.count("help"))
107 {
108 cout<<visible<<endl;
109 return 0;
110 }
111
112 cout<<"waiting="<<waitingSeconds<<"s RRType="<<rrType<<" tryMax="<<tryMax<<endl;
113 }
114 catch(const std::exception& ex)
115 {
116 cout << "Parameter Error: " << ex.what() << endl;
117 }
118 catch(...)
119 {
120 cout << "Parameter Unknown error" << endl;
121 }
122
123
124 NameDig dig(argv[0], argv[1]);
125
126 dig.setResolverName(Name(resolver));
127
128 dig.setInterestTriedMax(tryMax);
129
130 dig.setRrType(RR::toRRType(rrType));
131
132 dig.run();
133
134 if (dig.hasError())
135 {
136 cout<<"\n\n"<<dig.getProgramName()<<" cannot find any records for Name"
137 <<dig.getDstLabel().toUri()<<" from resolver "
138 <<resolver<<". Due to:"<<std::endl;
139 cout<<"Error: "<<dig.getErr()<<endl;
140 } else
141 {
142 if (dig.getRrs().size() == 0)
143 {
144 cout<<"Dig found no record(s) for Name "
145 <<dig.getDstLabel().toUri()<<std::endl;
146 }
147 else {
148 cout<<"Success to the dig "<<dig.getDstLabel().toUri()<<" by Resolver "
149 <<resolver<<endl;
150
151 vector<RR> rrs = dig.getRrs();
152 vector<RR>::const_iterator iter = rrs.begin();
153 while (iter != rrs.end())
154 {
155 cout<<" "<<*iter<<"\n";
156 iter ++;
157 }
158
159 }
160 }
161
162}
163