aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--_doc/resolver.1.gzbin2373 -> 2439 bytes
-rw-r--r--_doc/resolver.adoc10
-rw-r--r--client.go31
-rw-r--r--cmd/resolver/main.go28
-rw-r--r--cmd/resolver/resolver.go27
5 files changed, 94 insertions, 2 deletions
diff --git a/_doc/resolver.1.gz b/_doc/resolver.1.gz
index c24c77c..78211df 100644
--- a/_doc/resolver.1.gz
+++ b/_doc/resolver.1.gz
Binary files differ
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::
+
--
diff --git a/client.go b/client.go
index 524322e..381b872 100644
--- a/client.go
+++ b/client.go
@@ -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"