Documentation
¶
Overview ¶
Parse DNS masterfiles a.k.a. zonefiles. See the Load function.
Index ¶
- func Load(data []byte) (r *Zonefile, e ParsingError)
- func ParseEntry(data []byte) (e Entry, err ParsingError)
- type Entry
- func (e Entry) Class() []byte
- func (e Entry) Command() []byte
- func (e Entry) Domain() []byte
- func (e *Entry) RemoveTTL() error
- func (e *Entry) SetClass(v []byte) error
- func (e *Entry) SetDomain(v []byte) error
- func (e *Entry) SetTTL(v int) error
- func (e *Entry) SetValue(i int, v []byte) error
- func (e Entry) String() string
- func (e Entry) TTL() *int
- func (e Entry) Type() []byte
- func (e Entry) Values() (ret [][]byte)
- type ParsingError
- type Zonefile
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Load ¶
func Load(data []byte) (r *Zonefile, e ParsingError)
Parse bytestring containing a zonefile
Example ¶
zf, err := zonefile.Load([]byte( "@ IN SOA NS1.NAMESERVER.NET. HOSTMASTER.MYDOMAIN.COM. (\n" + " 1406291485 ;serial\n" + " 3600 ;refresh\n" + " 600 ;retry\n" + " 604800 ;expire\n" + " 86400 ;minimum ttl\n" + ")\n" + "\n" + "@ NS NS1.NAMESERVER.NET.\n" + "@ NS NS2.NAMESERVER.NET.\n")) if err != nil { fmt.Println("Parsing error", err, "on line", err.LineNo()) return } fmt.Println(len(zf.Entries()))
Output: 3
func ParseEntry ¶
func ParseEntry(data []byte) (e Entry, err ParsingError)
Create a new entry from a bytestring
Example ¶
entry, err := zonefile.ParseEntry([]byte(" IN MX 100 alpha.example.com.")) if err != nil { fmt.Println("Parsing error", err, "on line", err.LineNo()) return } fmt.Println(entry)
Output: <Entry dom="" ttl="" cls="IN" typ="MX" ["100" "alpha.example.com."]>
Types ¶
type Entry ¶
type Entry struct {
// contains filtered or unexported fields
}
Represents an entry in the zonefile
func (Entry) Class ¶
The class specified for the entry.
Example ¶
entry, _ := zonefile.ParseEntry([]byte("irc A 1.2.3.4")) fmt.Printf("%q\n", entry.Class()) entry, _ = zonefile.ParseEntry([]byte("irc IN A 4.3.2.1")) fmt.Printf("%q\n", entry.Class())
Output: "" "IN"
func (Entry) Command ¶
For a control entry, returns its command (e.g. $TTL, $ORIGIN, ...)
Example ¶
entry, _ := zonefile.ParseEntry([]byte("$TTL 123")) fmt.Printf("%q\n", entry.Command())
Output: "$TTL"
func (Entry) Domain ¶
The domain specified for the entry.
Example ¶
entry, _ := zonefile.ParseEntry([]byte("irc IN A 1.2.3.4")) fmt.Printf("%q\n", entry.Domain()) entry, _ = zonefile.ParseEntry([]byte(" IN A 4.3.2.1")) fmt.Printf("%q\n", entry.Domain())
Output: "irc" ""
func (*Entry) RemoveTTL ¶
Remove the TTL from the entry, if there is any
Example ¶
entry, _ := zonefile.ParseEntry([]byte("irc 12 IN A 1.2.3.4")) fmt.Println(entry) entry.RemoveTTL() fmt.Println(entry)
Output: <Entry dom="irc" ttl="12" cls="IN" typ="A" ["1.2.3.4"]> <Entry dom="irc" ttl="" cls="IN" typ="A" ["1.2.3.4"]>
func (*Entry) SetClass ¶
Change the class in the entry
Example ¶
entry, _ := zonefile.ParseEntry([]byte("irc IN A 1.2.3.4")) fmt.Println(entry) entry.SetClass([]byte("")) fmt.Println(entry) entry.SetClass([]byte("IN")) fmt.Println(entry)
Output: <Entry dom="irc" ttl="" cls="IN" typ="A" ["1.2.3.4"]> <Entry dom="irc" ttl="" cls="" typ="A" ["1.2.3.4"]> <Entry dom="irc" ttl="" cls="IN" typ="A" ["1.2.3.4"]>
func (*Entry) SetDomain ¶
Changes the domain in the entry
Example ¶
entry, _ := zonefile.ParseEntry([]byte("irc IN A 1.2.3.4")) fmt.Println(entry) entry.SetDomain([]byte("")) fmt.Println(entry) entry.SetDomain([]byte("chat")) fmt.Println(entry)
Output: <Entry dom="irc" ttl="" cls="IN" typ="A" ["1.2.3.4"]> <Entry dom="" ttl="" cls="IN" typ="A" ["1.2.3.4"]> <Entry dom="chat" ttl="" cls="IN" typ="A" ["1.2.3.4"]>
func (*Entry) SetTTL ¶
Change the class in the entry
Example ¶
entry, _ := zonefile.ParseEntry([]byte("irc 12 IN A 1.2.3.4")) fmt.Println(entry) entry.SetTTL(14) fmt.Println(entry)
Output: <Entry dom="irc" ttl="12" cls="IN" typ="A" ["1.2.3.4"]> <Entry dom="irc" ttl="14" cls="IN" typ="A" ["1.2.3.4"]>
func (*Entry) SetValue ¶
Set the the ith value of the entry
Example ¶
entry, _ := zonefile.ParseEntry([]byte("irc IN A 1.2.3.4")) fmt.Println(entry) entry.SetValue(0, []byte("4.3.2.1")) fmt.Println(entry)
Output: <Entry dom="irc" ttl="" cls="IN" typ="A" ["1.2.3.4"]> <Entry dom="irc" ttl="" cls="IN" typ="A" ["4.3.2.1"]>
func (Entry) TTL ¶
The TTL specified for the entry
Example ¶
entry, _ := zonefile.ParseEntry([]byte("irc A 1.2.3.4")) fmt.Printf("%v\n", entry.TTL() == nil) entry, _ = zonefile.ParseEntry([]byte("irc 12 A 1.2.3.4")) fmt.Printf("%v\n", *entry.TTL())
Output: true 12
func (Entry) Type ¶
The type specified for the entry.
Example ¶
entry, _ := zonefile.ParseEntry([]byte("irc A 1.2.3.4")) fmt.Printf("%q\n", entry.Type()) entry, _ = zonefile.ParseEntry([]byte("irc AAAA ::1")) fmt.Printf("%q\n", entry.Type())
Output: "A" "AAAA"
func (Entry) Values ¶
The values specified for the entry
Example ¶
entry, _ := zonefile.ParseEntry([]byte(` @ IN SOA NS1.NAMESERVER.NET. HOSTMASTER.MYDOMAIN.COM. ( 1406291485 ;serial 3600 ;refresh 600 ;retry 604800 ;expire 86400 ;minimum ttl )`)) fmt.Printf("%q\n", entry.Values())
Output: ["NS1.NAMESERVER.NET." "HOSTMASTER.MYDOMAIN.COM." "1406291485" "3600" "600" "604800" "86400"]
type ParsingError ¶
type Zonefile ¶
type Zonefile struct {
// contains filtered or unexported fields
}
Represents a DNS masterfile a.k.a. a zonefile
func New ¶
func New() (z *Zonefile)
Create a new empty zonefile
Example ¶
z := zonefile.New() z.AddA("", "3.2.3.2") z.AddA("www", "1.2.3.4") z.AddA("irc", "2.2.2.2").SetTTL(12) fmt.Println(z)
Output: <Zonefile [<Entry dom="" ttl="" cls="" typ="" ["3.2.3.2"]> <Entry dom="www" ttl="" cls="" typ="" ["1.2.3.4"]> <Entry dom="irc" ttl="12" cls="" typ="" ["2.2.2.2"]>]>
func (*Zonefile) AddA ¶
Add an A entry to the zonefile
Example ¶
z := zonefile.New() z.AddA("", "3.2.3.2") z.AddA("www", "1.2.3.4") z.AddA("irc", "2.2.2.2").SetTTL(12) fmt.Println(z)
Output: <Zonefile [<Entry dom="" ttl="" cls="" typ="" ["3.2.3.2"]> <Entry dom="www" ttl="" cls="" typ="" ["1.2.3.4"]> <Entry dom="irc" ttl="12" cls="" typ="" ["2.2.2.2"]>]>
func (*Zonefile) AddEntry ¶
Add an entry to the zonefile
Example ¶
z := zonefile.New() entry, _ := zonefile.ParseEntry([]byte("irc IN A 1.2.3.4")) z.AddEntry(entry) fmt.Println(z)
Output: <Zonefile [<Entry dom="irc" ttl="" cls="IN" typ="A" ["1.2.3.4"]>]>
func (*Zonefile) Entries ¶
List entries in the zonefile
Example ¶
zf, err := zonefile.Load([]byte(` $TTL 3600 @ IN SOA NS1.NAMESERVER.NET. HOSTMASTER.MYDOMAIN.COM. ( 1406291485 ;serial 3600 ;refresh 600 ;retry 604800 ;expire 86400 ;minimum ttl ) A 1.1.1.1 @ A 127.0.0.1 www A 127.0.0.1 mail A 127.0.0.1 A 1.2.3.4 tst 300 IN A 101.228.10.127;this is a comment`)) if err != nil { fmt.Println("Error parsing zonefile:", err) return } for _, e := range zf.Entries() { fmt.Println(e) }
Output: <Entry cmd="$TTL" ["3600"]> <Entry dom="@" ttl="" cls="IN" typ="SOA" ["NS1.NAMESERVER.NET." "HOSTMASTER.MYDOMAIN.COM." "1406291485" "3600" "600" "604800" "86400"]> <Entry dom="" ttl="" cls="" typ="A" ["1.1.1.1"]> <Entry dom="@" ttl="" cls="" typ="A" ["127.0.0.1"]> <Entry dom="www" ttl="" cls="" typ="A" ["127.0.0.1"]> <Entry dom="mail" ttl="" cls="" typ="A" ["127.0.0.1"]> <Entry dom="" ttl="" cls="" typ="A" ["1.2.3.4"]> <Entry dom="tst" ttl="300" cls="IN" typ="A" ["101.228.10.127"]>
func (*Zonefile) Save ¶
Write the zonefile to a bytearray
Example ¶
z := zonefile.New() entry, _ := zonefile.ParseEntry([]byte("irc IN A 1.2.3.4")) z.AddEntry(entry) entry, _ = zonefile.ParseEntry([]byte("www IN A 2.1.4.3")) z.AddEntry(entry) fmt.Println(string(z.Save()))
Output: irc IN A 1.2.3.4 www IN A 2.1.4.3