zone rendering
This commit is contained in:
parent
173e3f6476
commit
b41f622655
|
@ -0,0 +1,59 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"git.e3t.cc/e3team/pancheri"
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
//configPath := flag.String("zone", "", "Zone file to render")
|
||||||
|
printUsage := flag.Bool("help", false, "Print command line usage")
|
||||||
|
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
if *printUsage {
|
||||||
|
flag.Usage()
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
var aRecords []pancheri.RecordA
|
||||||
|
aRecords = append(aRecords, pancheri.RecordA{
|
||||||
|
In: "test.xe.",
|
||||||
|
Ip: net.ParseIP("1.2.3.4"),
|
||||||
|
TTL: 600,
|
||||||
|
})
|
||||||
|
|
||||||
|
var aaaaRecords []pancheri.RecordAAAA
|
||||||
|
aaaaRecords = append(aaaaRecords, pancheri.RecordAAAA{
|
||||||
|
In: "testv6.xe.",
|
||||||
|
Ip: net.ParseIP("bd1f:f314:5398:0e3d:b3e0:f427:73ef:60fb"),
|
||||||
|
TTL: 600,
|
||||||
|
})
|
||||||
|
|
||||||
|
var cnameRecords []pancheri.RecordCNAME
|
||||||
|
cnameRecords = append(cnameRecords, pancheri.RecordCNAME{
|
||||||
|
In: "cname.xe.",
|
||||||
|
Target: "test.xe.",
|
||||||
|
TTL: 600,
|
||||||
|
})
|
||||||
|
|
||||||
|
var txtRecords []pancheri.RecordTXT
|
||||||
|
txtRecords = append(txtRecords, pancheri.RecordTXT{
|
||||||
|
In: "txt.xe.",
|
||||||
|
Content: []string{"WHY HELLO THERE MY FELLOW E3TEAMERS"},
|
||||||
|
TTL: 600,
|
||||||
|
})
|
||||||
|
|
||||||
|
zone := pancheri.Zone{
|
||||||
|
ReducedHash: "0433da05bf22d86c1886fca6e3e2c3239b86f1e6ebea9b94201483c8596c0468",
|
||||||
|
Root: "xe",
|
||||||
|
ARecords: aRecords,
|
||||||
|
AAAARecords: aaaaRecords,
|
||||||
|
CNAMERecords: cnameRecords,
|
||||||
|
TXTRecords: txtRecords,
|
||||||
|
Zonefile: "zone_example.yml",
|
||||||
|
}
|
||||||
|
println(zone.RenderZone())
|
||||||
|
}
|
23
rule.go
23
rule.go
|
@ -1,12 +1,31 @@
|
||||||
package pancheri
|
package pancheri
|
||||||
|
|
||||||
|
import "net"
|
||||||
|
|
||||||
const (
|
const (
|
||||||
RuleTypeA = "A"
|
RuleTypeA = "A"
|
||||||
RuleTypeAAAA = "AAAA"
|
RuleTypeAAAA = "AAAA"
|
||||||
RuleTypeCNAME = "CNAME"
|
RuleTypeCNAME = "CNAME"
|
||||||
RuleTypeMX = "MX"
|
|
||||||
RuleTypeTXT = "TXT"
|
RuleTypeTXT = "TXT"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Rule interface {
|
type RecordA struct {
|
||||||
|
In string
|
||||||
|
Ip net.IP
|
||||||
|
TTL uint
|
||||||
|
}
|
||||||
|
type RecordAAAA struct {
|
||||||
|
In string
|
||||||
|
Ip net.IP
|
||||||
|
TTL uint
|
||||||
|
}
|
||||||
|
type RecordCNAME struct {
|
||||||
|
In string
|
||||||
|
Target string
|
||||||
|
TTL uint
|
||||||
|
}
|
||||||
|
type RecordTXT struct {
|
||||||
|
In string
|
||||||
|
Content []string
|
||||||
|
TTL uint
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
package pancheri
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/miekg/dns"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Zone struct {
|
||||||
|
Root string
|
||||||
|
ReducedHash string
|
||||||
|
Zonefile string
|
||||||
|
ARecords []RecordA
|
||||||
|
AAAARecords []RecordAAAA
|
||||||
|
CNAMERecords []RecordCNAME
|
||||||
|
TXTRecords []RecordTXT
|
||||||
|
}
|
||||||
|
|
||||||
|
func (z *Zone) RenderZone() string {
|
||||||
|
outString := ""
|
||||||
|
outString += fmt.Sprintf(";; Rendered zonefile for %s (rsha %s) at %s\n", z.Zonefile, z.ReducedHash, time.Now().Format(time.RFC3339))
|
||||||
|
outString += ";; Generated by pancheri-render. Note: this will NOT work out of the box!\n"
|
||||||
|
outString += ";; At the very least, you'll need to change the SOA and NS values.\n"
|
||||||
|
outString += "\n"
|
||||||
|
outString += ";; SOA & NS records\n"
|
||||||
|
outString += ";; TODO\n"
|
||||||
|
outString += "\n"
|
||||||
|
outString += ";; A Records\n"
|
||||||
|
|
||||||
|
for _, record := range z.ARecords {
|
||||||
|
r := new(dns.A)
|
||||||
|
r.Hdr = dns.RR_Header{
|
||||||
|
Name: record.In,
|
||||||
|
Rrtype: dns.TypeA,
|
||||||
|
Class: dns.ClassINET,
|
||||||
|
Ttl: uint32(record.TTL),
|
||||||
|
}
|
||||||
|
r.A = record.Ip
|
||||||
|
outString += r.String() + "\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
outString += ";; AAAA Records\n"
|
||||||
|
|
||||||
|
for _, record := range z.AAAARecords {
|
||||||
|
r := new(dns.AAAA)
|
||||||
|
r.Hdr = dns.RR_Header{
|
||||||
|
Name: record.In,
|
||||||
|
Rrtype: dns.TypeAAAA,
|
||||||
|
Class: dns.ClassINET,
|
||||||
|
Ttl: uint32(record.TTL),
|
||||||
|
}
|
||||||
|
r.AAAA = record.Ip
|
||||||
|
outString += r.String() + "\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
outString += ";; CNAME Records\n"
|
||||||
|
|
||||||
|
for _, record := range z.CNAMERecords {
|
||||||
|
r := new(dns.CNAME)
|
||||||
|
r.Hdr = dns.RR_Header{
|
||||||
|
Name: record.In,
|
||||||
|
Rrtype: dns.TypeCNAME,
|
||||||
|
Class: dns.ClassINET,
|
||||||
|
Ttl: uint32(record.TTL),
|
||||||
|
}
|
||||||
|
r.Target = record.Target
|
||||||
|
outString += r.String() + "\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
outString += ";; TXT Records\n"
|
||||||
|
|
||||||
|
for _, record := range z.TXTRecords {
|
||||||
|
r := new(dns.TXT)
|
||||||
|
r.Hdr = dns.RR_Header{
|
||||||
|
Name: record.In,
|
||||||
|
Rrtype: dns.TypeTXT,
|
||||||
|
Class: dns.ClassINET,
|
||||||
|
Ttl: uint32(record.TTL),
|
||||||
|
}
|
||||||
|
r.Txt = record.Content
|
||||||
|
outString += r.String() + "\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
return outString
|
||||||
|
}
|
|
@ -2,23 +2,15 @@ zone:
|
||||||
root: 'xe'
|
root: 'xe'
|
||||||
records:
|
records:
|
||||||
- type: 'A'
|
- type: 'A'
|
||||||
domains: ['some_a']
|
domains: ['test']
|
||||||
ipv4: '1.2.3.4'
|
ipv4: '1.2.3.4'
|
||||||
|
|
||||||
- type: 'AAAA'
|
- type: 'AAAA'
|
||||||
domains: ['some_aaaa']
|
domains: ['testv6']
|
||||||
ipv6: 'bd1f:f314:5398:0e3d:b3e0:f427:73ef:60fb'
|
ipv6: 'bd1f:f314:5398:0e3d:b3e0:f427:73ef:60fb'
|
||||||
|
|
||||||
- type: 'CNAME'
|
- type: 'CNAME'
|
||||||
domains: ['some_cname']
|
domains: ['cname']
|
||||||
content: 'some_a'
|
content: 'test'
|
||||||
|
|
||||||
- type: 'MX'
|
|
||||||
domains: ['some_mail_domain']
|
|
||||||
mailserver: 'mail.e3t.cc'
|
|
||||||
priority: 10
|
|
||||||
|
|
||||||
- type: 'TXT'
|
- type: 'TXT'
|
||||||
domains: ['some_txt']
|
domains: ['txt']
|
||||||
content: |
|
content: |
|
||||||
WHY HELLO THERE MY FELLOW E3TEAMERS
|
WHY HELLO THERE MY FELLOW E3TEAMERS
|
Loading…
Reference in New Issue