diff options
| -rw-r--r-- | _doc/resolver.1.gz | bin | 2373 -> 2439 bytes | |||
| -rw-r--r-- | _doc/resolver.adoc | 10 | ||||
| -rw-r--r-- | client.go | 31 | ||||
| -rw-r--r-- | cmd/resolver/main.go | 28 | ||||
| -rw-r--r-- | cmd/resolver/resolver.go | 27 |
5 files changed, 94 insertions, 2 deletions
diff --git a/_doc/resolver.1.gz b/_doc/resolver.1.gz Binary files differindex c24c77c..78211df 100644 --- a/_doc/resolver.1.gz +++ b/_doc/resolver.1.gz diff --git a/_doc/resolver.adoc b/_doc/resolver.adoc index 179b976..d259983 100644 --- a/_doc/resolver.adoc +++ b/_doc/resolver.adoc @@ -94,6 +94,16 @@ List of valid types, The "class" parameter is optional, its either IN (default), CS, or HS. -- +block.d update <name>:: ++ +-- +Fetch the latest hosts file from remote block.d URL defined by +its name. +On success, the hosts file will be updated and the server will be +restarted. +-- + + caches:: + -- @@ -32,6 +32,37 @@ func NewClient(serverUrl string, insecure bool) (cl *Client) { return cl } +// BlockdUpdate fetch the latest hosts file from the hosts block +// provider based on registered URL. +func (cl *Client) BlockdUpdate(blockdName string) (an interface{}, err error) { + var ( + logp = "BlockdUpdate" + hbReq = hostsBlock{ + Name: blockdName, + } + res = libhttp.EndpointResponse{} + + hb *hostsBlock + resb []byte + ) + + _, resb, err = cl.PostJSON(apiBlockdUpdate, nil, &hbReq) + if err != nil { + return nil, fmt.Errorf("%s: %w", logp, err) + } + + res.Data = &hb + err = json.Unmarshal(resb, &res) + if err != nil { + return nil, fmt.Errorf("%s: %w", logp, err) + } + if res.Code != http.StatusOK { + return nil, fmt.Errorf("%s: %d %s", logp, res.Code, res.Message) + } + + return hb, nil +} + // Caches fetch all of non-local caches from server. func (cl *Client) Caches() (answers []*dns.Answer, err error) { var ( diff --git a/cmd/resolver/main.go b/cmd/resolver/main.go index f2d4baf..a3ecbe5 100644 --- a/cmd/resolver/main.go +++ b/cmd/resolver/main.go @@ -15,6 +15,7 @@ import ( // List of valid commands. const ( + cmdBlockd = "block.d" cmdCaches = "caches" cmdEnv = "env" cmdQuery = "query" @@ -58,6 +59,26 @@ func main() { rsol.cmd = strings.ToLower(args[0]) switch rsol.cmd { + case cmdBlockd: + args = args[1:] + if len(args) == 0 { + log.Fatalf("resolver: %s: missing sub command", cmdBlockd) + } + + subCmd = strings.ToLower(args[0]) + + switch subCmd { + case subCmdUpdate: + args = args[1:] + if len(args) == 0 { + log.Fatalf("resolver: %s %s: missing argument", rsol.cmd, subCmd) + } + err = rsol.blockdUpdate(args[0]) + if err != nil { + log.Fatalf("resolver: %s %s: %s", rsol.cmd, subCmd, err) + } + } + case cmdCaches: args = args[1:] if len(args) == 0 { @@ -178,6 +199,13 @@ query <domain / ip-address> [type] [class] Valid class are either IN, CS, HS. Default value is IN. +block.d update <name> + + Fetch the latest hosts file from remote block.d URL defined by + its name. + On success, the hosts file will be updated and the server will be + restarted. + caches Fetch and print all caches from rescached server. diff --git a/cmd/resolver/resolver.go b/cmd/resolver/resolver.go index 697953d..76c5a13 100644 --- a/cmd/resolver/resolver.go +++ b/cmd/resolver/resolver.go @@ -45,6 +45,31 @@ type resolver struct { insecure bool } +// blockdUpdate fetch the latest hosts file from remote block.d URL defined by +// its name. +func (rsol *resolver) blockdUpdate(blockdName string) (err error) { + var ( + resc = rsol.newRescachedClient() + + hb interface{} + hbjson []byte + ) + + hb, err = resc.BlockdUpdate(blockdName) + if err != nil { + return err + } + + hbjson, err = json.MarshalIndent(hb, "", " ") + if err != nil { + return err + } + + fmt.Println(string(hbjson)) + + return nil +} + // doCmdCaches call the rescached HTTP API to fetch all caches. func (rsol *resolver) doCmdCaches() { var ( @@ -252,10 +277,8 @@ func (rsol *resolver) doCmdQuery(args []string) { } } -// // initSystemResolver read the system resolv.conf to create fallback DNS // resolver. -// func (rsol *resolver) initSystemResolver() (err error) { var ( logp = "initSystemResolver" |
