Browse Source

Merge pull request #52 from gpapilion/geodns-issue-26

Return NOERROR for "bar" if "foo.bar" exists
Ask Bjørn Hansen 11 years ago
parent
commit
fbc924f8c7
4 changed files with 82 additions and 0 deletions
  1. 12 0
      dns/test.example.com.json
  2. 29 0
      serve_test.go
  3. 27 0
      zone_test.go
  4. 14 0
      zones.go

+ 12 - 0
dns/test.example.com.json

@@ -32,6 +32,18 @@
       "a": [ [ "192.168.1.2" ] ],
       "ttl": "601"
     },
+    "three.two.one": {
+      "a": [ [ "192.168.1.5" ] ],
+      "ttl": "601"
+    },
+    "one": {
+      "a": [ [ "192.168.1.6" ] ],
+      "ttl": "601"
+    },
+    "a.b.c": {
+      "a": [ [ "192.168.1.7" ] ],
+      "ttl": "601"
+    },
     "bar.no": { "a": [] },
     "0": {
       "a": [ [ "192.168.0.1", 10 ] ]

+ 29 - 0
serve_test.go

@@ -83,6 +83,35 @@ func (s *ServeSuite) TestServing(c *C) {
 	c.Check(r.Answer[0].(*dns.MX).Mx, Equals, "mx.example.net.")
 	c.Check(r.Answer[1].(*dns.MX).Mx, Equals, "mx2.example.net.")
 	c.Check(r.Answer[1].(*dns.MX).Preference, Equals, uint16(20))
+
+        // Verify the first A record was created
+	r = exchange(c, "a.b.c.test.example.com.", dns.TypeA)
+	ip = r.Answer[0].(*dns.A).A
+	c.Check(ip.String(), Equals, "192.168.1.7")
+
+        // Verify sub-labels are created
+	r = exchange(c, "b.c.test.example.com.", dns.TypeA)
+	c.Check(r.Answer, HasLen, 0)
+	c.Check(r.Rcode, Equals, dns.RcodeSuccess)
+
+	r = exchange(c, "c.test.example.com.", dns.TypeA)
+	c.Check(r.Answer, HasLen, 0)
+	c.Check(r.Rcode, Equals, dns.RcodeSuccess)
+
+        // Verify the first A record was created
+	r = exchange(c, "three.two.one.test.example.com.", dns.TypeA)
+	ip = r.Answer[0].(*dns.A).A
+	c.Check(ip.String(), Equals, "192.168.1.5")
+
+        // Verify single sub-labels is created and no record is returned
+	r = exchange(c, "two.one.test.example.com.", dns.TypeA)
+	c.Check(r.Answer, HasLen, 0)
+	c.Check(r.Rcode, Equals, dns.RcodeSuccess)
+
+        // Verify the A record wasn't over written
+	r = exchange(c, "one.test.example.com.", dns.TypeA)
+	ip = r.Answer[0].(*dns.A).A
+	c.Check(ip.String(), Equals, "192.168.1.6")
 }
 
 func (s *ServeSuite) TestServingMixedCase(c *C) {

+ 27 - 0
zone_test.go

@@ -60,6 +60,33 @@ func (s *ConfigSuite) TestExampleComZone(c *C) {
 	c.Check(Txt, HasLen, 2)
 	c.Check(Txt[0].RR.(*dns.TXT).Txt[0], Equals, "w1000")
 	c.Check(Txt[1].RR.(*dns.TXT).Txt[0], Equals, "w1")
+
+        //verify empty labels are created
+	label, qtype = ex.findLabels("a.b.c", []string{"@"}, qTypes{dns.TypeA})
+	c.Check(label.Records[dns.TypeA], HasLen, 1)
+	c.Check(label.Records[dns.TypeA][0].RR.(*dns.A).A.String(), Equals, "192.168.1.7")
+
+	label, qtype = ex.findLabels("b.c", []string{"@"}, qTypes{dns.TypeA})
+	c.Check(label.Records[dns.TypeA], HasLen, 0)
+	c.Check(label.Label, Equals, "b.c")
+
+	label, qtype = ex.findLabels("c", []string{"@"}, qTypes{dns.TypeA})
+	c.Check(label.Records[dns.TypeA], HasLen, 0)
+	c.Check(label.Label, Equals, "c")
+
+        //verify label is created
+	label, qtype = ex.findLabels("three.two.one", []string{"@"}, qTypes{dns.TypeA})
+	c.Check(label.Records[dns.TypeA], HasLen, 1)
+	c.Check(label.Records[dns.TypeA][0].RR.(*dns.A).A.String(), Equals, "192.168.1.5")
+
+	label, qtype = ex.findLabels("two.one", []string{"@"}, qTypes{dns.TypeA})
+	c.Check(label.Records[dns.TypeA], HasLen, 0)
+	c.Check(label.Label, Equals, "two.one")
+
+        //verify label isn't overwritten
+	label, qtype = ex.findLabels("one", []string{"@"}, qTypes{dns.TypeA})
+	c.Check(label.Records[dns.TypeA], HasLen, 1)
+	c.Check(label.Records[dns.TypeA][0].RR.(*dns.A).A.String(), Equals, "192.168.1.6")
 }
 
 func (s *ConfigSuite) TestExampleOrgZone(c *C) {

+ 14 - 0
zones.go

@@ -458,6 +458,20 @@ func setupZoneData(data map[string]interface{}, Zone *Zone) {
 		}
 	}
 
+	// loop over exisiting labels, create zone records for missing sub-domains
+	for k := range Zone.Labels {
+		if strings.Contains(k, ".") {
+			subLabels := strings.Split(k, ".")
+			for i := 1; i < len(subLabels); i++ {
+				subSubLabel := strings.Join(subLabels[i:len(subLabels)], ".")
+				if _, ok := Zone.Labels[subSubLabel]; !ok {
+					Zone.AddLabel(subSubLabel)
+				}
+			}
+
+		}
+	}
+
 	setupSOA(Zone)
 
 	//log.Println(Zones[k])