From 7f4c77577efc3400a7ddabb8ae85176c1d2b8b65 Mon Sep 17 00:00:00 2001 From: Shulhan Date: Sun, 2 Apr 2023 01:24:07 +0700 Subject: lib/net: add method WriteTo to ResolvConf The WriteTo method write the ResolvConf as text. --- lib/net/resolvconf.go | 50 ++++++++++++++++++++++++++++++++++++++ lib/net/resolvconf_example_test.go | 43 +++++++++++++++++++++++++++++++- 2 files changed, 92 insertions(+), 1 deletion(-) diff --git a/lib/net/resolvconf.go b/lib/net/resolvconf.go index faf12c50..d35dda38 100644 --- a/lib/net/resolvconf.go +++ b/lib/net/resolvconf.go @@ -5,7 +5,11 @@ package net import ( + "bytes" + "fmt" + "io" "os" + "sort" "strconv" "strings" @@ -353,3 +357,49 @@ func (rc *ResolvConf) PopulateQuery(dname string) (queries []string) { } return queries } + +// WriteTo write the ResolvConf into w. +func (rc *ResolvConf) WriteTo(w io.Writer) (n int, err error) { + var bb bytes.Buffer + + if len(rc.Domain) > 0 { + fmt.Fprintf(&bb, "domain %s\n", rc.Domain) + } + + var k string + + if len(rc.Search) > 0 { + fmt.Fprint(&bb, `search`) + for _, k = range rc.Search { + bb.WriteString(` ` + k) + } + bb.WriteByte('\n') + } + for _, k = range rc.NameServers { + fmt.Fprintf(&bb, "nameserver %s\n", k) + } + + if rc.NDots > 0 { + fmt.Fprintf(&bb, "options ndots:%d\n", rc.NDots) + } + if rc.Timeout > 0 { + fmt.Fprintf(&bb, "options timeout:%d\n", rc.Timeout) + } + if rc.Attempts > 0 { + fmt.Fprintf(&bb, "options attempts:%d\n", rc.Attempts) + } + + if len(rc.OptMisc) > 0 { + var keys []string + for k = range rc.OptMisc { + keys = append(keys, k) + } + sort.Strings(keys) + + for _, k = range keys { + fmt.Fprintf(&bb, "options %s\n", k) + } + } + + return w.Write(bb.Bytes()) +} diff --git a/lib/net/resolvconf_example_test.go b/lib/net/resolvconf_example_test.go index a3e8cb6e..c33630ad 100644 --- a/lib/net/resolvconf_example_test.go +++ b/lib/net/resolvconf_example_test.go @@ -4,7 +4,11 @@ package net -import "fmt" +import ( + "bytes" + "fmt" + "log" +) func ExampleResolvConf_PopulateQuery() { var ( @@ -24,3 +28,40 @@ func ExampleResolvConf_PopulateQuery() { //[vpn vpn.my.internal] //[a.machine] } + +func ExampleResolvConf_WriteTo() { + var ( + rc = &ResolvConf{ + Domain: `internal`, + Search: []string{`a.internal`, `b.internal`}, + NameServers: []string{`127.0.0.1`, `192.168.1.1`}, + NDots: 1, + Timeout: 5, + Attempts: 3, + OptMisc: map[string]bool{ + `rotate`: true, + `debug`: true, + }, + } + + bb bytes.Buffer + err error + ) + + _, err = rc.WriteTo(&bb) + if err != nil { + log.Fatal(err) + } + + fmt.Println(bb.String()) + // Output: + // domain internal + // search a.internal b.internal + // nameserver 127.0.0.1 + // nameserver 192.168.1.1 + // options ndots:1 + // options timeout:5 + // options attempts:3 + // options debug + // options rotate +} -- cgit v1.3