data_source_plot.cc 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #include <boost/foreach.hpp>
  2. #include <dns/rdataclass.h>
  3. #include <dns/rrttl.h>
  4. #include "data_source_plot.h"
  5. namespace isc {
  6. namespace dns {
  7. // this implementation returns fixed records,
  8. // and does not allow update statements
  9. using namespace isc::dns;
  10. using namespace isc::dns::rdata;
  11. using namespace isc::data;
  12. namespace {
  13. const Name authors_name("authors.bind");
  14. const Name version_name("version.bind");
  15. }
  16. void
  17. DataSourceParkingLot::serve(std::string zone_name) {
  18. zones.serve(zone_name);
  19. }
  20. void
  21. DataSourceParkingLot::addARecord(std::string data) {
  22. a_records.push_back(RdataPtr(new in::A(data)));
  23. }
  24. void
  25. DataSourceParkingLot::addAAAARecord(std::string data) {
  26. aaaa_records.push_back(RdataPtr(new in::AAAA(data)));
  27. }
  28. void
  29. DataSourceParkingLot::addNSRecord(std::string data) {
  30. ns_records.push_back(RdataPtr(new generic::NS(data)));
  31. }
  32. void
  33. DataSourceParkingLot::setSOARecord(RdataPtr soa_record) {
  34. }
  35. void
  36. DataSourceParkingLot::setDefaultZoneData() {
  37. clearARecords();
  38. clearAAAARecords();
  39. clearNSRecords();
  40. addARecord("127.0.0.1");
  41. addAAAARecord("::1");
  42. addNSRecord("ns1.parking.example");
  43. addNSRecord("ns2.parking.example");
  44. addNSRecord("ns3.parking.example");
  45. }
  46. DataSourceParkingLot::DataSourceParkingLot() {
  47. setDefaultZoneData();
  48. soa = RdataPtr(new generic::SOA(Name("parking.example"),
  49. Name("noc.parking.example"),
  50. 1, 1800, 900, 604800, 86400));
  51. }
  52. bool
  53. DataSourceParkingLot::hasZoneFor(const Name& name, Name &zone_name)
  54. {
  55. if (name == authors_name) {
  56. zone_name = authors_name;
  57. return (true);
  58. } else if (name == version_name) {
  59. zone_name = version_name;
  60. return (true);
  61. }
  62. return zones.findClosest(name, zone_name);
  63. }
  64. SearchResult
  65. DataSourceParkingLot::findRRsets(const isc::dns::Name& zone_name,
  66. const isc::dns::Name& name,
  67. const isc::dns::RRClass& clas,
  68. const isc::dns::RRType& type) const
  69. {
  70. SearchResult result;
  71. if (clas == RRClass::CH()) {
  72. if (type == RRType::TXT()) {
  73. if (name == authors_name) {
  74. RRsetPtr rrset = RRsetPtr(new RRset(authors_name, RRClass::CH(),
  75. RRType::TXT(), RRTTL(0)));
  76. rrset->addRdata(generic::TXT("Han Feng"));
  77. rrset->addRdata(generic::TXT("Kazunori Fujiwara"));
  78. rrset->addRdata(generic::TXT("Michael Graff"));
  79. rrset->addRdata(generic::TXT("Evan Hunt"));
  80. rrset->addRdata(generic::TXT("Jelte Jansen"));
  81. rrset->addRdata(generic::TXT("Jin Jian"));
  82. rrset->addRdata(generic::TXT("JINMEI Tatuya"));
  83. rrset->addRdata(generic::TXT("Naoki Kambe"));
  84. rrset->addRdata(generic::TXT("Shane Kerr"));
  85. rrset->addRdata(generic::TXT("Zhang Likun"));
  86. rrset->addRdata(generic::TXT("Jeremy C. Reed"));
  87. result.addRRset(rrset);
  88. result.setStatus(SearchResult::success);
  89. } else if (name == version_name) {
  90. RRsetPtr rrset = RRsetPtr(new RRset(version_name, RRClass::CH(),
  91. RRType::TXT(), RRTTL(0)));
  92. rrset->addRdata(generic::TXT("BIND10 0.0.1"));
  93. result.addRRset(rrset);
  94. result.setStatus(SearchResult::success);
  95. } else {
  96. result.setStatus(SearchResult::name_not_found);
  97. }
  98. } else if (type == RRType::NS()) {
  99. if (name == authors_name || name == version_name) {
  100. RRsetPtr rrset = RRsetPtr(new RRset(name, RRClass::CH(),
  101. RRType::NS(),
  102. RRTTL(0)));
  103. rrset->addRdata(generic::NS(name));
  104. result.addRRset(rrset);
  105. result.setStatus(SearchResult::success);
  106. } else {
  107. result.setStatus(SearchResult::name_not_found);
  108. }
  109. } else {
  110. result.setStatus(SearchResult::name_not_found);
  111. }
  112. } else if (clas == RRClass::IN()) {
  113. if (zones.contains(name)) {
  114. RRsetPtr rrset = RRsetPtr(new RRset(name, clas, type, RRTTL(3600)));
  115. result.setStatus(SearchResult::success);
  116. if (type == RRType::A()) {
  117. BOOST_FOREACH(RdataPtr a, a_records) {
  118. rrset->addRdata(a);
  119. }
  120. } else if (type == RRType::AAAA()) {
  121. BOOST_FOREACH(RdataPtr aaaa, aaaa_records) {
  122. rrset->addRdata(aaaa);
  123. }
  124. } else if (type == RRType::NS()) {
  125. BOOST_FOREACH(RdataPtr ns, ns_records) {
  126. rrset->addRdata(ns);
  127. }
  128. } else if (type == RRType::SOA()) {
  129. rrset->addRdata(soa);
  130. }
  131. result.addRRset(rrset);
  132. } else {
  133. // we don't have the name itself. Do we have the zone?
  134. if (zones.contains(zone_name)) {
  135. result.setStatus(SearchResult::name_not_found);
  136. } else {
  137. result.setStatus(SearchResult::zone_not_found);
  138. }
  139. }
  140. } else {
  141. result.setStatus(SearchResult::zone_not_found);
  142. }
  143. return result;
  144. }
  145. /// Do direct 'search' in database, no extra processing,
  146. /// and add the resulting rrsets to the specified section
  147. /// in the given message
  148. /// returns the status code of the searchresult
  149. /// Once the dns logic is moved from parkinglot to this class,
  150. /// we should probably make this private
  151. SearchResult::status_type
  152. DataSourceParkingLot::addToMessage(Message& msg,
  153. const Section& section,
  154. const Name& zone_name,
  155. const Name& name,
  156. const RRClass& clas,
  157. const RRType& type) const
  158. {
  159. SearchResult result = findRRsets(zone_name, name, clas, type);
  160. BOOST_FOREACH(RRsetPtr rrset, result) {
  161. msg.addRRset(section, rrset);
  162. }
  163. return result.getStatus();
  164. }
  165. }
  166. }