diff options
| author | Shulhan <ms@kilabit.info> | 2022-04-19 23:18:19 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2022-04-19 23:30:09 +0700 |
| commit | ed83581fc716d5d41d769662fae0bc5e78309982 (patch) | |
| tree | 8f11ad99ee9ef2dfd595c485d01425fd1affb574 | |
| parent | 2ada0a2da129a33229d63462b2c7fa7ccd5d0460 (diff) | |
| download | rescached-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-- | Makefile | 4 | ||||
| -rw-r--r-- | cmd/rescached/main.go | 25 | ||||
| -rw-r--r-- | environment.go | 42 | ||||
| -rw-r--r-- | environment_test.go | 16 | ||||
| -rw-r--r-- | hosts_block.go | 6 | ||||
| -rw-r--r-- | hosts_block_test.go | 18 | ||||
| -rw-r--r-- | httpd.go | 4 | ||||
| -rw-r--r-- | memfs_generate.go | 6 | ||||
| -rw-r--r-- | rescached.go | 68 |
9 files changed, 106 insertions, 83 deletions
@@ -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) } @@ -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. |
