aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2022-04-19 23:18:19 +0700
committerShulhan <ms@kilabit.info>2022-04-19 23:30:09 +0700
commited83581fc716d5d41d769662fae0bc5e78309982 (patch)
tree8f11ad99ee9ef2dfd595c485d01425fd1affb574
parent2ada0a2da129a33229d63462b2c7fa7ccd5d0460 (diff)
downloadrescached-ed83581fc716d5d41d769662fae0bc5e78309982.tar.xz
all: add option to set the base directory
Previously, running an instance of rescached assume that all configurations and cache are located in /etc/rescached and /var/cache/rescached. It possible that we may want to use different base directory (or $PREFIX, in the auto tools terms), for example "/opt/rescached" or as showed in the "dev" task in the Makefile, we use "_test" as base directory for running test instance. This changes also fix an error when loading hosts file from non-existant hosts.d directory.
-rw-r--r--Makefile4
-rw-r--r--cmd/rescached/main.go25
-rw-r--r--environment.go42
-rw-r--r--environment_test.go16
-rw-r--r--hosts_block.go6
-rw-r--r--hosts_block_test.go18
-rw-r--r--httpd.go4
-rw-r--r--memfs_generate.go6
-rw-r--r--rescached.go68
9 files changed, 106 insertions, 83 deletions
diff --git a/Makefile b/Makefile
index 02fcb9a..f8e3d74 100644
--- a/Makefile
+++ b/Makefile
@@ -87,9 +87,7 @@ clean:
.PHONY: dev
dev:
- -sudo ./_bin/nft_dnstest_chain.sh; \
- go run ./cmd/rescached -config=cmd/rescached/rescached.cfg.test dev; \
- sudo ./_bin/nft_dnstest_chain.sh flush
+ go run ./cmd/rescached -dir-base=./_test -config=cmd/rescached/rescached.cfg.test dev
serve-doc:
ciigo serve _doc
diff --git a/cmd/rescached/main.go b/cmd/rescached/main.go
index e2dbb84..069d126 100644
--- a/cmd/rescached/main.go
+++ b/cmd/rescached/main.go
@@ -9,6 +9,7 @@ import (
"log"
"os"
"os/signal"
+ "strings"
"syscall"
"time"
@@ -25,22 +26,29 @@ const (
func main() {
var (
+ env *rescached.Environment
+ rcd *rescached.Server
+ dirBase string
fileConfig string
+ cmd string
running chan bool
+ qsignal chan os.Signal
+ err error
)
log.SetFlags(0)
log.SetPrefix("rescached: ")
- flag.StringVar(&fileConfig, "config", "", "path to configuration")
+ flag.StringVar(&dirBase, "dir-base", "", "Base directory for reading and storing rescached data.")
+ flag.StringVar(&fileConfig, "config", "", "Path to configuration.")
flag.Parse()
- env, err := rescached.LoadEnvironment(fileConfig)
+ env, err = rescached.LoadEnvironment(dirBase, fileConfig)
if err != nil {
log.Fatal(err)
}
- cmd := flag.Arg(0)
+ cmd = strings.ToLower(flag.Arg(0))
switch cmd {
case cmdEmbed:
@@ -55,7 +63,7 @@ func main() {
go watchWww(env, running)
}
- rcd, err := rescached.New(env)
+ rcd, err = rescached.New(env)
if err != nil {
log.Fatal(err)
}
@@ -69,10 +77,9 @@ func main() {
go debugRuntime()
}
- c := make(chan os.Signal, 1)
- signal.Notify(c, syscall.SIGQUIT, syscall.SIGSEGV, syscall.SIGTERM,
- syscall.SIGINT)
- <-c
+ qsignal = make(chan os.Signal, 1)
+ signal.Notify(qsignal, syscall.SIGQUIT, syscall.SIGSEGV, syscall.SIGTERM, syscall.SIGINT)
+ <-qsignal
if cmd == cmdDev {
running <- false
<-running
@@ -96,10 +103,8 @@ func debugRuntime() {
}
}
-//
// watchWww watch any changes to files inside _www directory and regenerate
// the embed file "memfs_generate.go".
-//
func watchWww(env *rescached.Environment, running chan bool) {
var (
logp = "watchWww"
diff --git a/environment.go b/environment.go
index aac538e..99dc773 100644
--- a/environment.go
+++ b/environment.go
@@ -6,6 +6,7 @@ package rescached
import (
"fmt"
"io"
+ "path/filepath"
"strconv"
"strings"
@@ -46,9 +47,12 @@ const (
keyTLSPort = "tls.port"
keyTLSPrivateKey = "tls.private_key"
- dirBlock = "/etc/rescached/block.d"
- dirHosts = "/etc/rescached/hosts.d"
- dirZone = "/etc/rescached/zone.d"
+ dirBlock = "/etc/rescached/block.d"
+ dirCaches = "/var/cache/rescached/"
+ dirHosts = "/etc/rescached/hosts.d"
+ dirZone = "/etc/rescached/zone.d"
+
+ fileCaches = "rescached.gob"
)
var (
@@ -60,6 +64,13 @@ type Environment struct {
HostsFiles map[string]*dns.HostsFile
Zones map[string]*dns.Zone
+ dirBase string
+ pathDirBlock string
+ pathDirCaches string
+ pathDirHosts string
+ pathDirZone string
+ pathFileCaches string
+
fileConfig string
FileResolvConf string `ini:"rescached::file.resolvconf"`
WUIListen string `ini:"rescached::wui.listen"`
@@ -76,36 +87,43 @@ type Environment struct {
}
// LoadEnvironment initialize environment from configuration file.
-func LoadEnvironment(fileConfig string) (env *Environment, err error) {
+func LoadEnvironment(dirBase, fileConfig string) (env *Environment, err error) {
var (
logp = "LoadEnvironment"
cfg *ini.Ini
)
- env = newEnvironment()
- env.fileConfig = fileConfig
+ env = newEnvironment(dirBase, fileConfig)
if len(fileConfig) == 0 {
_ = env.init()
return env, nil
}
- cfg, err = ini.Open(fileConfig)
+ cfg, err = ini.Open(env.fileConfig)
if err != nil {
- return nil, fmt.Errorf("%s: %q: %s", logp, fileConfig, err)
+ return nil, fmt.Errorf("%s: %q: %s", logp, env.fileConfig, err)
}
err = cfg.Unmarshal(env)
if err != nil {
- return nil, fmt.Errorf("%s: %q: %s", logp, fileConfig, err)
+ return nil, fmt.Errorf("%s: %q: %s", logp, env.fileConfig, err)
}
return env, nil
}
// newEnvironment create and initialize options with default values.
-func newEnvironment() *Environment {
+func newEnvironment(dirBase, fileConfig string) *Environment {
return &Environment{
+ dirBase: dirBase,
+ pathDirBlock: filepath.Join(dirBase, dirBlock),
+ pathDirCaches: filepath.Join(dirBase, dirCaches),
+ pathDirHosts: filepath.Join(dirBase, dirHosts),
+ pathDirZone: filepath.Join(dirBase, dirZone),
+ pathFileCaches: filepath.Join(dirBase, dirCaches, fileCaches),
+
+ fileConfig: filepath.Join(dirBase, fileConfig),
hostsBlocksFile: make(map[string]*dns.HostsFile),
HttpdOptions: &libhttp.ServerOptions{
Memfs: mfsWww,
@@ -169,12 +187,10 @@ func (env *Environment) init() (err error) {
func (env *Environment) initHostsBlock() {
var (
- dirBase = ""
-
hb *hostsBlock
)
for _, hb = range env.HostsBlocks {
- hb.init(dirBase)
+ hb.init(env.pathDirBlock)
}
}
diff --git a/environment_test.go b/environment_test.go
index 66f6521..edade88 100644
--- a/environment_test.go
+++ b/environment_test.go
@@ -6,6 +6,7 @@ package rescached
import (
"bytes"
"os"
+ "path/filepath"
"testing"
"github.com/shuLhan/share/lib/dns"
@@ -60,7 +61,15 @@ parent = https://kilabit.info/dns-query
func TestLoadEnvironment(t *testing.T) {
var (
- expEnv = &Environment{
+ testDirBase = "./"
+ expEnv = &Environment{
+ dirBase: testDirBase,
+ pathDirBlock: filepath.Join(testDirBase, dirBlock),
+ pathDirCaches: filepath.Join(testDirBase, dirCaches),
+ pathDirHosts: filepath.Join(testDirBase, dirHosts),
+ pathDirZone: filepath.Join(testDirBase, dirZone),
+ pathFileCaches: filepath.Join(testDirBase, dirCaches, fileCaches),
+
fileConfig: "cmd/rescached/rescached.cfg.test",
WUIListen: "127.0.0.1:5381",
@@ -88,11 +97,10 @@ func TestLoadEnvironment(t *testing.T) {
},
TLSAllowInsecure: true,
},
-
Debug: 2,
}
- expBuffer []byte
+ expBuffer []byte
gotEnv *Environment
gotBuffer bytes.Buffer
err error
@@ -103,7 +111,7 @@ func TestLoadEnvironment(t *testing.T) {
t.Fatal(err)
}
- gotEnv, err = LoadEnvironment("cmd/rescached/rescached.cfg.test")
+ gotEnv, err = LoadEnvironment(testDirBase, "cmd/rescached/rescached.cfg.test")
if err != nil {
t.Fatal(err)
}
diff --git a/hosts_block.go b/hosts_block.go
index d4c6722..bc9a238 100644
--- a/hosts_block.go
+++ b/hosts_block.go
@@ -57,14 +57,14 @@ func (hb *hostsBlock) enable() (err error) {
return nil
}
-func (hb *hostsBlock) init(dirBase string) {
+func (hb *hostsBlock) init(pathDirBlock string) {
var (
fi os.FileInfo
err error
)
- hb.file = filepath.Join(dirBase, dirBlock, hb.Name)
- hb.fileDisabled = filepath.Join(dirBase, dirBlock, "."+hb.Name)
+ hb.file = filepath.Join(pathDirBlock, hb.Name)
+ hb.fileDisabled = filepath.Join(pathDirBlock, "."+hb.Name)
fi, err = os.Stat(hb.file)
if err != nil {
diff --git a/hosts_block_test.go b/hosts_block_test.go
index 456fb63..18652fc 100644
--- a/hosts_block_test.go
+++ b/hosts_block_test.go
@@ -20,12 +20,12 @@ func TestHostsBlock_init(t *testing.T) {
var (
testDirBase = t.TempDir()
- testDirBlock = filepath.Join(testDirBase, dirBlock)
+ pathDirBlock = filepath.Join(testDirBase, dirBlock)
fileEnabled = "fileEnabled"
fileDisabled = "fileDisabled"
fileNotExist = "fileNotExist"
- hostsFileEnabled = filepath.Join(testDirBlock, fileEnabled)
- hostsFileDisabled = filepath.Join(testDirBlock, "."+fileDisabled)
+ hostsFileEnabled = filepath.Join(pathDirBlock, fileEnabled)
+ hostsFileDisabled = filepath.Join(pathDirBlock, "."+fileDisabled)
fiEnabled os.FileInfo
fiDisabled os.FileInfo
@@ -34,7 +34,7 @@ func TestHostsBlock_init(t *testing.T) {
err error
)
- err = os.MkdirAll(testDirBlock, 0700)
+ err = os.MkdirAll(pathDirBlock, 0700)
if err != nil {
t.Fatal(err)
}
@@ -67,7 +67,7 @@ func TestHostsBlock_init(t *testing.T) {
lastUpdated: fiEnabled.ModTime(),
LastUpdated: fiEnabled.ModTime().Format(lastUpdatedFormat),
file: hostsFileEnabled,
- fileDisabled: filepath.Join(testDirBlock, "."+fileEnabled),
+ fileDisabled: filepath.Join(pathDirBlock, "."+fileEnabled),
IsEnabled: true,
isFileExist: true,
},
@@ -80,7 +80,7 @@ func TestHostsBlock_init(t *testing.T) {
Name: fileDisabled,
lastUpdated: fiDisabled.ModTime(),
LastUpdated: fiDisabled.ModTime().Format(lastUpdatedFormat),
- file: filepath.Join(testDirBlock, fileDisabled),
+ file: filepath.Join(pathDirBlock, fileDisabled),
fileDisabled: hostsFileDisabled,
isFileExist: true,
},
@@ -91,13 +91,13 @@ func TestHostsBlock_init(t *testing.T) {
},
exp: hostsBlock{
Name: fileNotExist,
- file: filepath.Join(testDirBlock, fileNotExist),
- fileDisabled: filepath.Join(testDirBlock, "."+fileNotExist),
+ file: filepath.Join(pathDirBlock, fileNotExist),
+ fileDisabled: filepath.Join(pathDirBlock, "."+fileNotExist),
},
}}
for _, c = range cases {
- c.hb.init(testDirBase)
+ c.hb.init(pathDirBlock)
test.Assert(t, c.desc, c.exp, c.hb)
}
diff --git a/httpd.go b/httpd.go
index 17a8442..0152166 100644
--- a/httpd.go
+++ b/httpd.go
@@ -512,7 +512,7 @@ func (srv *Server) apiHostsFileCreate(epr *libhttp.EndpointRequest) (resbody []b
_, found = srv.env.HostsFiles[name]
if !found {
- path = filepath.Join(dirHosts, name)
+ path = filepath.Join(srv.env.pathDirHosts, name)
hfile, err = dns.NewHostsFile(path, nil)
if err != nil {
res.Code = http.StatusInternalServerError
@@ -733,7 +733,7 @@ func (srv *Server) apiZoneCreate(epr *libhttp.EndpointRequest) (resbody []byte,
return json.Marshal(&res)
}
- zoneFile = filepath.Join(dirZone, zoneName)
+ zoneFile = filepath.Join(srv.env.pathDirZone, zoneName)
zone = dns.NewZone(zoneFile, zoneName)
err = zone.Save()
if err != nil {
diff --git a/memfs_generate.go b/memfs_generate.go
index b9652ff..8e99207 100644
--- a/memfs_generate.go
+++ b/memfs_generate.go
@@ -114,9 +114,9 @@ func generate__www_hosts_blocks() *memfs.Node {
GenFuncName: "generate__www_hosts_blocks",
}
node.SetMode(2147484141)
- node.SetModTimeUnix(1611415192, 0)
+ node.SetModTimeUnix(1650381015, 660954842)
node.SetName("hosts_blocks")
- node.SetSize(0)
+ node.SetSize(4096)
node.AddChild(_mfsWww_getNode(mfsWww, "/hosts_blocks/index.html", generate__www_hosts_blocks_index_html))
return node
}
@@ -130,7 +130,7 @@ func generate__www_hosts_blocks_index_html() *memfs.Node {
Content: []byte("\x3C\x21\x44\x4F\x43\x54\x59\x50\x45\x20\x68\x74\x6D\x6C\x3E\x0A\x3C\x21\x2D\x2D\x20\x53\x50\x44\x58\x2D\x46\x69\x6C\x65\x43\x6F\x70\x79\x72\x69\x67\x68\x74\x54\x65\x78\x74\x3A\x20\x32\x30\x32\x31\x20\x4D\x2E\x20\x53\x68\x75\x6C\x68\x61\x6E\x20\x3C\x6D\x73\x40\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x20\x2D\x2D\x3E\x0A\x3C\x21\x2D\x2D\x20\x53\x50\x44\x58\x2D\x4C\x69\x63\x65\x6E\x73\x65\x2D\x49\x64\x65\x6E\x74\x69\x66\x69\x65\x72\x3A\x20\x47\x50\x4C\x2D\x33\x2E\x30\x2D\x6F\x72\x2D\x6C\x61\x74\x65\x72\x20\x2D\x2D\x3E\x0A\x3C\x68\x74\x6D\x6C\x20\x6C\x61\x6E\x67\x3D\x22\x65\x6E\x22\x3E\x0A\x09\x3C\x68\x65\x61\x64\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x63\x68\x61\x72\x73\x65\x74\x3D\x22\x75\x74\x66\x2D\x38\x22\x20\x2F\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x76\x69\x65\x77\x70\x6F\x72\x74\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x77\x69\x64\x74\x68\x3D\x64\x65\x76\x69\x63\x65\x2D\x77\x69\x64\x74\x68\x2C\x20\x69\x6E\x69\x74\x69\x61\x6C\x2D\x73\x63\x61\x6C\x65\x3D\x31\x2C\x20\x73\x68\x72\x69\x6E\x6B\x2D\x74\x6F\x2D\x66\x69\x74\x3D\x6E\x6F\x22\x20\x2F\x3E\x0A\x09\x09\x3C\x6C\x69\x6E\x6B\x20\x72\x65\x6C\x3D\x22\x69\x63\x6F\x6E\x22\x20\x74\x79\x70\x65\x3D\x22\x69\x6D\x61\x67\x65\x2F\x70\x6E\x67\x22\x20\x68\x72\x65\x66\x3D\x22\x2F\x66\x61\x76\x69\x63\x6F\x6E\x2E\x70\x6E\x67\x22\x20\x2F\x3E\x0A\x09\x09\x3C\x6C\x69\x6E\x6B\x20\x72\x65\x6C\x3D\x22\x73\x74\x79\x6C\x65\x73\x68\x65\x65\x74\x22\x20\x68\x72\x65\x66\x3D\x22\x2F\x69\x6E\x64\x65\x78\x2E\x63\x73\x73\x22\x20\x2F\x3E\x0A\x09\x09\x3C\x74\x69\x74\x6C\x65\x3E\x72\x65\x73\x63\x61\x63\x68\x65\x64\x20\x7C\x20\x68\x6F\x73\x74\x73\x20\x62\x6C\x6F\x63\x6B\x73\x3C\x2F\x74\x69\x74\x6C\x65\x3E\x0A\x0A\x09\x09\x3C\x73\x74\x79\x6C\x65\x3E\x0A\x09\x09\x09\x2E\x62\x6C\x6F\x63\x6B\x5F\x73\x6F\x75\x72\x63\x65\x20\x7B\x0A\x09\x09\x09\x09\x77\x69\x64\x74\x68\x3A\x20\x63\x61\x6C\x63\x28\x31\x30\x30\x25\x20\x2D\x20\x32\x65\x6D\x29\x3B\x0A\x09\x09\x09\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x09\x09\x7D\x0A\x09\x09\x09\x2E\x62\x6C\x6F\x63\x6B\x5F\x73\x6F\x75\x72\x63\x65\x20\x69\x6E\x70\x75\x74\x3A\x64\x69\x73\x61\x62\x6C\x65\x64\x20\x7B\x0A\x09\x09\x09\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x62\x6C\x61\x63\x6B\x3B\x0A\x09\x09\x09\x7D\x0A\x09\x09\x09\x2E\x69\x74\x65\x6D\x20\x7B\x0A\x09\x09\x09\x09\x77\x69\x64\x74\x68\x3A\x20\x31\x30\x30\x25\x3B\x0A\x09\x09\x09\x09\x6D\x61\x72\x67\x69\x6E\x2D\x62\x6F\x74\x74\x6F\x6D\x3A\x20\x31\x65\x6D\x3B\x0A\x09\x09\x09\x7D\x0A\x09\x09\x09\x2E\x69\x74\x65\x6D\x2E\x68\x65\x61\x64\x65\x72\x20\x7B\x0A\x09\x09\x09\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x62\x6F\x6C\x64\x3B\x0A\x09\x09\x09\x09\x6D\x61\x72\x67\x69\x6E\x2D\x62\x6F\x74\x74\x6F\x6D\x3A\x20\x31\x65\x6D\x3B\x0A\x09\x09\x09\x09\x62\x6F\x72\x64\x65\x72\x2D\x62\x6F\x74\x74\x6F\x6D\x3A\x20\x31\x70\x78\x20\x73\x6F\x6C\x69\x64\x20\x73\x69\x6C\x76\x65\x72\x3B\x0A\x09\x09\x09\x7D\x0A\x09\x09\x09\x2E\x69\x74\x65\x6D\x20\x2E\x69\x73\x2D\x65\x6E\x61\x62\x6C\x65\x64\x20\x7B\x0A\x09\x09\x09\x09\x64\x69\x73\x70\x6C\x61\x79\x3A\x20\x69\x6E\x6C\x69\x6E\x65\x2D\x62\x6C\x6F\x63\x6B\x3B\x0A\x09\x09\x09\x09\x77\x69\x64\x74\x68\x3A\x20\x34\x65\x6D\x3B\x0A\x09\x09\x09\x09\x76\x65\x72\x74\x69\x63\x61\x6C\x2D\x61\x6C\x69\x67\x6E\x3A\x20\x74\x6F\x70\x3B\x0A\x09\x09\x09\x7D\x0A\x09\x09\x09\x2E\x69\x74\x65\x6D\x20\x2E\x69\x6E\x66\x6F\x20\x7B\x0A\x09\x09\x09\x09\x64\x69\x73\x70\x6C\x61\x79\x3A\x20\x69\x6E\x6C\x69\x6E\x65\x2D\x62\x6C\x6F\x63\x6B\x3B\x0A\x09\x09\x09\x09\x77\x69\x64\x74\x68\x3A\x20\x63\x61\x6C\x63\x28\x31\x30\x30\x25\x20\x2D\x20\x36\x65\x6D\x29\x3B\x0A\x09\x09\x09\x7D\x0A\x09\x09\x09\x2E\x69\x74\x65\x6D\x20\x2E\x69\x6E\x66\x6F\x20\x69\x6E\x70\x75\x74\x20\x7B\x0A\x09\x09\x09\x09\x77\x69\x64\x74\x68\x3A\x20\x63\x61\x6C\x63\x28\x31\x30\x30\x25\x20\x2D\x20\x34\x65\x6D\x29\x3B\x0A\x09\x09\x09\x7D\x0A\x09\x09\x3C\x2F\x73\x74\x79\x6C\x65\x3E\x0A\x09\x3C\x2F\x68\x65\x61\x64\x3E\x0A\x09\x3C\x62\x6F\x64\x79\x20\x6F\x6E\x6C\x6F\x61\x64\x3D\x22\x6F\x6E\x4C\x6F\x61\x64\x28\x29\x22\x3E\x0A\x09\x09\x3C\x6E\x61\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x6D\x65\x6E\x75\x22\x3E\x0A\x09\x09\x09\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x2F\x22\x3E\x20\x72\x65\x73\x63\x61\x63\x68\x65\x64\x20\x3C\x2F\x61\x3E\x0A\x09\x09\x09\x2F\x0A\x09\x09\x09\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x2F\x22\x3E\x20\x45\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x20\x3C\x2F\x61\x3E\x0A\x09\x09\x09\x2F\x0A\x09\x09\x09\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x2F\x68\x6F\x73\x74\x73\x5F\x62\x6C\x6F\x63\x6B\x73\x2F\x22\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x63\x74\x69\x76\x65\x22\x3E\x20\x48\x6F\x73\x74\x73\x20\x62\x6C\x6F\x63\x6B\x73\x20\x3C\x2F\x61\x3E\x0A\x09\x09\x09\x2F\x0A\x09\x09\x09\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x2F\x68\x6F\x73\x74\x73\x2E\x64\x2F\x22\x3E\x20\x68\x6F\x73\x74\x73\x2E\x64\x20\x3C\x2F\x61\x3E\x0A\x09\x09\x09\x2F\x0A\x09\x09\x09\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x2F\x7A\x6F\x6E\x65\x2E\x64\x2F\x22\x3E\x20\x7A\x6F\x6E\x65\x2E\x64\x20\x3C\x2F\x61\x3E\x0A\x09\x09\x3C\x2F\x6E\x61\x76\x3E\x0A\x0A\x09\x09\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x6E\x6F\x74\x69\x66\x22\x3E\x3C\x2F\x64\x69\x76\x3E\x0A\x0A\x09\x09\x3C\x70\x3E\x43\x6F\x6E\x66\x69\x67\x75\x72\x65\x20\x74\x68\x65\x20\x73\x6F\x75\x72\x63\x65\x20\x6F\x66\x20\x62\x6C\x6F\x63\x6B\x65\x64\x20\x68\x6F\x73\x74\x73\x20\x66\x69\x6C\x65\x2E\x3C\x2F\x70\x3E\x0A\x0A\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x62\x6C\x6F\x63\x6B\x5F\x73\x6F\x75\x72\x63\x65\x22\x3E\x0A\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x69\x74\x65\x6D\x20\x68\x65\x61\x64\x65\x72\x22\x3E\x0A\x09\x09\x09\x09\x3C\x73\x70\x61\x6E\x20\x63\x6C\x61\x73\x73\x3D\x22\x69\x73\x2D\x65\x6E\x61\x62\x6C\x65\x64\x22\x3E\x20\x45\x6E\x61\x62\x6C\x65\x64\x20\x3C\x2F\x73\x70\x61\x6E\x3E\x0A\x09\x09\x09\x09\x3C\x73\x70\x61\x6E\x20\x63\x6C\x61\x73\x73\x3D\x22\x69\x6E\x66\x6F\x22\x3E\x20\x4E\x61\x6D\x65\x20\x3C\x2F\x73\x70\x61\x6E\x3E\x0A\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x48\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x73\x22\x20\x63\x6C\x61\x73\x73\x3D\x22\x62\x6C\x6F\x63\x6B\x5F\x73\x6F\x75\x72\x63\x65\x22\x3E\x3C\x2F\x64\x69\x76\x3E\x0A\x0A\x09\x09\x3C\x64\x69\x76\x3E\x0A\x09\x09\x09\x3C\x62\x75\x74\x74\x6F\x6E\x20\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x22\x75\x70\x64\x61\x74\x65\x48\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x73\x28\x29\x22\x3E\x53\x61\x76\x65\x3C\x2F\x62\x75\x74\x74\x6F\x6E\x3E\x0A\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x0A\x09\x09\x3C\x73\x63\x72\x69\x70\x74\x20\x73\x72\x63\x3D\x22\x2F\x69\x6E\x64\x65\x78\x2E\x6A\x73\x22\x3E\x3C\x2F\x73\x63\x72\x69\x70\x74\x3E\x0A\x09\x09\x3C\x73\x63\x72\x69\x70\x74\x20\x73\x72\x63\x3D\x22\x2F\x72\x65\x73\x63\x61\x63\x68\x65\x64\x2E\x6A\x73\x22\x3E\x3C\x2F\x73\x63\x72\x69\x70\x74\x3E\x0A\x09\x09\x3C\x73\x63\x72\x69\x70\x74\x3E\x0A\x09\x09\x09\x6C\x65\x74\x20\x72\x65\x73\x63\x20\x3D\x20\x6E\x75\x6C\x6C\x0A\x0A\x09\x09\x09\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x6F\x6E\x4C\x6F\x61\x64\x28\x29\x20\x7B\x0A\x09\x09\x09\x09\x72\x65\x73\x63\x20\x3D\x20\x6E\x65\x77\x20\x52\x65\x73\x63\x61\x63\x68\x65\x64\x28\x22\x22\x29\x0A\x09\x09\x09\x09\x67\x65\x74\x45\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x28\x29\x0A\x09\x09\x09\x7D\x0A\x0A\x09\x09\x09\x61\x73\x79\x6E\x63\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x67\x65\x74\x45\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x28\x29\x20\x7B\x0A\x09\x09\x09\x09\x63\x6F\x6E\x73\x74\x20\x72\x65\x73\x20\x3D\x20\x61\x77\x61\x69\x74\x20\x72\x65\x73\x63\x2E\x67\x65\x74\x45\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x28\x29\x0A\x09\x09\x09\x09\x69\x66\x20\x28\x72\x65\x73\x2E\x63\x6F\x64\x65\x20\x21\x3D\x20\x32\x30\x30\x29\x20\x7B\x0A\x09\x09\x09\x09\x09\x6E\x6F\x74\x69\x66\x45\x72\x72\x6F\x72\x28\x72\x65\x73\x2E\x6D\x65\x73\x73\x61\x67\x65\x29\x0A\x09\x09\x09\x09\x09\x72\x65\x74\x75\x72\x6E\x0A\x09\x09\x09\x09\x7D\x0A\x0A\x09\x09\x09\x09\x6C\x65\x74\x20\x65\x6E\x76\x20\x3D\x20\x72\x65\x73\x2E\x64\x61\x74\x61\x0A\x09\x09\x09\x09\x72\x65\x6E\x64\x65\x72\x48\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x73\x28\x65\x6E\x76\x2E\x48\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x73\x29\x0A\x09\x09\x09\x7D\x0A\x0A\x09\x09\x09\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x6F\x6E\x43\x68\x65\x63\x6B\x48\x6F\x73\x74\x62\x6C\x6F\x63\x6B\x28\x6B\x65\x79\x2C\x20\x76\x61\x6C\x29\x20\x7B\x0A\x09\x09\x09\x09\x72\x65\x73\x63\x2E\x65\x6E\x76\x2E\x48\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x73\x5B\x6B\x65\x79\x5D\x2E\x49\x73\x45\x6E\x61\x62\x6C\x65\x64\x20\x3D\x20\x76\x61\x6C\x0A\x09\x09\x09\x7D\x0A\x0A\x09\x09\x09\x61\x73\x79\x6E\x63\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x75\x70\x64\x61\x74\x65\x48\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x73\x28\x29\x20\x7B\x0A\x09\x09\x09\x09\x63\x6F\x6E\x73\x74\x20\x72\x65\x73\x20\x3D\x20\x61\x77\x61\x69\x74\x20\x72\x65\x73\x63\x2E\x75\x70\x64\x61\x74\x65\x48\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x73\x28\x72\x65\x73\x63\x2E\x65\x6E\x76\x2E\x48\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x73\x29\x0A\x09\x09\x09\x09\x69\x66\x20\x28\x72\x65\x73\x2E\x63\x6F\x64\x65\x20\x21\x3D\x20\x32\x30\x30\x29\x20\x7B\x0A\x09\x09\x09\x09\x09\x6E\x6F\x74\x69\x66\x45\x72\x72\x6F\x72\x28\x22\x75\x70\x64\x61\x74\x65\x48\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x73\x3A\x20\x22\x2C\x20\x72\x65\x73\x2E\x6D\x65\x73\x73\x61\x67\x65\x29\x0A\x09\x09\x09\x09\x09\x72\x65\x74\x75\x72\x6E\x0A\x09\x09\x09\x09\x7D\x0A\x0A\x09\x09\x09\x09\x72\x65\x6E\x64\x65\x72\x48\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x73\x28\x72\x65\x73\x2E\x64\x61\x74\x61\x29\x0A\x09\x09\x09\x09\x6E\x6F\x74\x69\x66\x49\x6E\x66\x6F\x28\x22\x54\x68\x65\x20\x68\x6F\x73\x74\x73\x20\x62\x6C\x6F\x63\x6B\x73\x20\x68\x61\x73\x20\x62\x65\x65\x6E\x20\x75\x70\x64\x61\x74\x65\x64\x2E\x22\x29\x0A\x09\x09\x09\x7D\x0A\x0A\x09\x09\x09\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x72\x65\x6E\x64\x65\x72\x48\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x73\x28\x68\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x73\x29\x20\x7B\x0A\x09\x09\x09\x09\x6C\x65\x74\x20\x70\x61\x72\x65\x6E\x74\x20\x3D\x20\x64\x6F\x63\x75\x6D\x65\x6E\x74\x2E\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64\x28\x22\x48\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x73\x22\x29\x0A\x09\x09\x09\x09\x70\x61\x72\x65\x6E\x74\x2E\x69\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x20\x3D\x20\x22\x22\x0A\x0A\x09\x09\x09\x09\x66\x6F\x72\x20\x28\x76\x61\x72\x20\x6B\x20\x69\x6E\x20\x68\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x73\x29\x20\x7B\x0A\x09\x09\x09\x09\x09\x69\x66\x20\x28\x21\x68\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x73\x2E\x68\x61\x73\x4F\x77\x6E\x50\x72\x6F\x70\x65\x72\x74\x79\x28\x6B\x29\x29\x20\x7B\x0A\x09\x09\x09\x09\x09\x09\x63\x6F\x6E\x74\x69\x6E\x75\x65\x3B\x0A\x09\x09\x09\x09\x09\x7D\x0A\x0A\x09\x09\x09\x09\x09\x6C\x65\x74\x20\x68\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x20\x3D\x20\x68\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x73\x5B\x6B\x5D\x0A\x09\x09\x09\x09\x09\x6C\x65\x74\x20\x69\x74\x65\x6D\x20\x3D\x20\x64\x6F\x63\x75\x6D\x65\x6E\x74\x2E\x63\x72\x65\x61\x74\x65\x45\x6C\x65\x6D\x65\x6E\x74\x28\x22\x64\x69\x76\x22\x29\x0A\x09\x09\x09\x09\x09\x69\x74\x65\x6D\x2E\x63\x6C\x61\x73\x73\x4C\x69\x73\x74\x2E\x61\x64\x64\x28\x22\x69\x74\x65\x6D\x22\x29\x0A\x09\x09\x09\x09\x09\x69\x74\x65\x6D\x2E\x69\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x20\x3D\x20\x60\x0A\x09\x09\x09\x09\x09\x09\x3C\x73\x70\x61\x6E\x20\x63\x6C\x61\x73\x73\x3D\x22\x69\x73\x2D\x65\x6E\x61\x62\x6C\x65\x64\x22\x3E\x0A\x09\x09\x09\x09\x09\x09\x09\x3C\x69\x6E\x70\x75\x74\x0A\x09\x09\x09\x09\x09\x09\x09\x09\x74\x79\x70\x65\x3D\x22\x63\x68\x65\x63\x6B\x62\x6F\x78\x22\x0A\x09\x09\x09\x09\x09\x09\x09\x09\x24\x7B\x68\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x2E\x49\x73\x45\x6E\x61\x62\x6C\x65\x64\x20\x3F\x20\x22\x63\x68\x65\x63\x6B\x65\x64\x22\x20\x3A\x20\x22\x22\x7D\x0A\x09\x09\x09\x09\x09\x09\x09\x09\x6F\x6E\x69\x6E\x70\x75\x74\x3D\x22\x6F\x6E\x43\x68\x65\x63\x6B\x48\x6F\x73\x74\x62\x6C\x6F\x63\x6B\x28\x27\x24\x7B\x6B\x7D\x27\x2C\x20\x74\x68\x69\x73\x2E\x63\x68\x65\x63\x6B\x65\x64\x29\x22\x0A\x09\x09\x09\x09\x09\x09\x09\x2F\x3E\x0A\x09\x09\x09\x09\x09\x09\x3C\x2F\x73\x70\x61\x6E\x3E\x0A\x09\x09\x09\x09\x09\x09\x3C\x73\x70\x61\x6E\x20\x63\x6C\x61\x73\x73\x3D\x22\x69\x6E\x66\x6F\x22\x3E\x0A\x09\x09\x09\x09\x09\x09\x09\x3C\x64\x69\x76\x3E\x24\x7B\x68\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x2E\x4E\x61\x6D\x65\x7D\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x09\x09\x09\x09\x09\x3C\x64\x69\x76\x3E\x20\x55\x52\x4C\x3A\x20\x3C\x69\x6E\x70\x75\x74\x20\x76\x61\x6C\x75\x65\x3D\x22\x24\x7B\x68\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x2E\x55\x52\x4C\x7D\x22\x20\x64\x69\x73\x61\x62\x6C\x65\x64\x20\x2F\x3E\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x09\x09\x09\x09\x09\x3C\x64\x69\x76\x3E\x20\x4C\x61\x73\x74\x20\x75\x70\x64\x61\x74\x65\x64\x20\x61\x74\x20\x24\x7B\x68\x6F\x73\x74\x73\x42\x6C\x6F\x63\x6B\x2E\x4C\x61\x73\x74\x55\x70\x64\x61\x74\x65\x64\x7D\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x09\x09\x09\x09\x3C\x2F\x73\x70\x61\x6E\x3E\x60\x0A\x0A\x09\x09\x09\x09\x09\x70\x61\x72\x65\x6E\x74\x2E\x61\x70\x70\x65\x6E\x64\x43\x68\x69\x6C\x64\x28\x69\x74\x65\x6D\x29\x0A\x09\x09\x09\x09\x7D\x0A\x09\x09\x09\x7D\x0A\x09\x09\x3C\x2F\x73\x63\x72\x69\x70\x74\x3E\x0A\x09\x3C\x2F\x62\x6F\x64\x79\x3E\x0A\x3C\x2F\x68\x74\x6D\x6C\x3E\x0A"),
}
node.SetMode(420)
- node.SetModTimeUnix(1650380258, 721203491)
+ node.SetModTimeUnix(1650381015, 660954842)
node.SetName("index.html")
node.SetSize(3278)
return node
diff --git a/rescached.go b/rescached.go
index 5b8951b..8519420 100644
--- a/rescached.go
+++ b/rescached.go
@@ -9,7 +9,6 @@ import (
"fmt"
"log"
"os"
- "path/filepath"
"sync"
"github.com/shuLhan/share/lib/debug"
@@ -18,11 +17,6 @@ import (
"github.com/shuLhan/share/lib/memfs"
)
-const (
- cachesDir = "/var/cache/rescached/"
- cachesFile = "rescached.gob"
-)
-
// Server implement caching DNS server.
type Server struct {
dns *dns.Server
@@ -33,9 +27,7 @@ type Server struct {
httpdRunner sync.Once
}
-//
// New create and initialize new rescached server.
-//
func New(env *Environment) (srv *Server, err error) {
if debug.Value >= 1 {
fmt.Printf("--- rescached: config: %+v\n", env)
@@ -60,16 +52,17 @@ func New(env *Environment) (srv *Server, err error) {
return srv, nil
}
-//
// Start the server, waiting for DNS query from clients, read it and response
// it.
-//
func (srv *Server) Start() (err error) {
var (
logp = "Start"
- hb *hostsBlock
- hfile *dns.HostsFile
+ fcaches *os.File
+ hb *hostsBlock
+ hfile *dns.HostsFile
+ zone *dns.Zone
+ answers []*dns.Answer
)
srv.dns, err = dns.NewServer(&srv.env.ServerOptions)
@@ -77,16 +70,14 @@ func (srv *Server) Start() (err error) {
return err
}
- cachesPath := filepath.Join(cachesDir, cachesFile)
-
- fcaches, err := os.Open(cachesPath)
+ fcaches, err = os.Open(srv.env.pathFileCaches)
if err == nil {
// Load stored caches from file.
- answers, err := srv.dns.CachesLoad(fcaches)
+ answers, err = srv.dns.CachesLoad(fcaches)
if err != nil {
log.Printf("%s: %s", logp, err)
} else {
- fmt.Printf("%s: %d caches loaded from %s\n", logp, len(answers), cachesPath)
+ fmt.Printf("%s: %d caches loaded from %s\n", logp, len(answers), srv.env.pathFileCaches)
}
err = fcaches.Close()
@@ -95,11 +86,11 @@ func (srv *Server) Start() (err error) {
}
}
- systemHostsFile, err := dns.ParseHostsFile(dns.GetSystemHosts())
+ hfile, err = dns.ParseHostsFile(dns.GetSystemHosts())
if err != nil {
return err
}
- err = srv.dns.PopulateCachesByRR(systemHostsFile.Records, systemHostsFile.Path)
+ err = srv.dns.PopulateCachesByRR(hfile.Records, hfile.Path)
if err != nil {
return err
}
@@ -122,31 +113,33 @@ func (srv *Server) Start() (err error) {
srv.env.hostsBlocksFile[hfile.Name] = hfile
}
- srv.env.HostsFiles, err = dns.LoadHostsDir(dirHosts)
+ srv.env.HostsFiles, err = dns.LoadHostsDir(srv.env.pathDirHosts)
if err != nil {
- return err
+ if !errors.Is(err, os.ErrNotExist) {
+ return err
+ }
}
- for _, hf := range srv.env.HostsFiles {
- err = srv.dns.PopulateCachesByRR(hf.Records, hf.Path)
+ for _, hfile = range srv.env.HostsFiles {
+ err = srv.dns.PopulateCachesByRR(hfile.Records, hfile.Path)
if err != nil {
return err
}
}
- srv.env.Zones, err = dns.LoadZoneDir(dirZone)
+ srv.env.Zones, err = dns.LoadZoneDir(srv.env.pathDirZone)
if err != nil {
if !errors.Is(err, os.ErrNotExist) {
return err
}
- err = os.MkdirAll(dirZone, 0700)
+ err = os.MkdirAll(srv.env.pathDirZone, 0700)
if err != nil {
return err
}
err = nil
}
- for _, zoneFile := range srv.env.Zones {
- srv.dns.PopulateCaches(zoneFile.Messages(), zoneFile.Path)
+ for _, zone = range srv.env.Zones {
+ srv.dns.PopulateCaches(zone.Messages(), zone.Path)
}
if len(srv.env.FileResolvConf) > 0 {
@@ -176,31 +169,34 @@ func (srv *Server) run() {
}
}
-//
// Stop the server.
-//
func (srv *Server) Stop() {
- logp := "Stop"
+ var (
+ logp = "Stop"
+
+ fcaches *os.File
+ err error
+ n int
+ )
if srv.rcWatcher != nil {
srv.rcWatcher.Stop()
}
srv.dns.Stop()
- cachesPath := filepath.Join(cachesDir, cachesFile)
-
// Stores caches to file for next start.
- err := os.MkdirAll(cachesDir, 0700)
+ err = os.MkdirAll(srv.env.pathDirCaches, 0700)
if err != nil {
log.Printf("%s: %s", logp, err)
return
}
- fcaches, err := os.Create(cachesPath)
+
+ fcaches, err = os.Create(srv.env.pathFileCaches)
if err != nil {
log.Printf("%s: %s", logp, err)
return
}
- n, err := srv.dns.CachesSave(fcaches)
+ n, err = srv.dns.CachesSave(fcaches)
if err != nil {
log.Printf("%s: %s", logp, err)
// fall-through for Close.
@@ -209,7 +205,7 @@ func (srv *Server) Stop() {
if err != nil {
log.Printf("%s: %s", logp, err)
}
- fmt.Printf("%s: %d caches stored to %s\n", logp, n, cachesPath)
+ fmt.Printf("%s: %d caches stored to %s\n", logp, n, srv.env.pathFileCaches)
}
// watchResolvConf watch an update to file resolv.conf.