aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2021-12-19 14:40:18 +0700
committerShulhan <ms@kilabit.info>2021-12-19 14:40:18 +0700
commit7ee3e4ea4658e85a40540212b95206b09686feb7 (patch)
treebabe6a3568f6ead05799e0af31c6d5f6851cfa0b
parent7713203c6bd41053599732869a70467a168e4e55 (diff)
downloadrescached-7ee3e4ea4658e85a40540212b95206b09686feb7.tar.xz
all: refactoring Server initialization
Previously, we initialize the rescached Server by passing the path to configuration file and initialize the environment inside the server. This commit changes it to pass the instance of Environment. The idea is to allow creating and running rescached Server without creating configuration file first.
-rw-r--r--cmd/rescached/main.go7
-rw-r--r--environment.go50
-rw-r--r--environment_test.go8
-rw-r--r--httpd.go6
-rw-r--r--rescached.go14
5 files changed, 47 insertions, 38 deletions
diff --git a/cmd/rescached/main.go b/cmd/rescached/main.go
index a43eefd..ebf0a62 100644
--- a/cmd/rescached/main.go
+++ b/cmd/rescached/main.go
@@ -29,7 +29,12 @@ func main() {
flag.StringVar(&fileConfig, "config", "", "path to configuration")
flag.Parse()
- rcd, err := rescached.New(fileConfig)
+ env, err := rescached.LoadEnvironment(fileConfig)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ rcd, err := rescached.New(env)
if err != nil {
log.Fatal(err)
}
diff --git a/environment.go b/environment.go
index fdf4bd4..21cefd9 100644
--- a/environment.go
+++ b/environment.go
@@ -6,7 +6,6 @@ package rescached
import (
"fmt"
- "log"
"strconv"
"strings"
@@ -51,12 +50,14 @@ const (
)
//
-// environment for running rescached.
+// Environment for running rescached.
//
-type environment struct {
+type Environment struct {
dns.ServerOptions
- WUIListen string `ini:"rescached::wui.listen"`
- FileResolvConf string `ini:"rescached::file.resolvconf"`
+ WUIListen string `ini:"rescached::wui.listen"`
+ FileResolvConf string `ini:"rescached::file.resolvconf"`
+ fileConfig string
+
Debug int `ini:"rescached::debug"`
HostsBlocksRaw []string `ini:"rescached::hosts_block" json:"-"`
HostsBlocks []*hostsBlock
@@ -64,48 +65,55 @@ type environment struct {
Zones map[string]*dns.Zone
}
-func loadEnvironment(file string) (env *environment) {
- env = newEnvironment()
+//
+// LoadEnvironment initialize environment from configuration file.
+//
+func LoadEnvironment(fileConfig string) (env *Environment, err error) {
+ var (
+ logp = "LoadEnvironment"
+ cfg *ini.Ini
+ )
+
+ env = newEnvironment(fileConfig)
- if len(file) == 0 {
+ if len(fileConfig) == 0 {
env.init()
- return env
+ return env, nil
}
- cfg, err := ini.Open(file)
+ cfg, err = ini.Open(fileConfig)
if err != nil {
- log.Printf("loadEnvironment %q: %s", file, err)
- return env
+ return nil, fmt.Errorf("%s: %q: %s", logp, fileConfig, err)
}
err = cfg.Unmarshal(env)
if err != nil {
- log.Printf("loadEnvironment %q: %s", file, err)
- return env
+ return nil, fmt.Errorf("%s: %q: %s", logp, fileConfig, err)
}
env.init()
env.initHostsBlock(cfg)
debug.Value = env.Debug
- return env
+ return env, nil
}
//
// newEnvironment create and initialize options with default values.
//
-func newEnvironment() *environment {
- return &environment{
+func newEnvironment(fileConfig string) *Environment {
+ return &Environment{
ServerOptions: dns.ServerOptions{
ListenAddress: "127.0.0.1:53",
},
+ fileConfig: fileConfig,
}
}
//
// init check and initialize the environment instance with default values.
//
-func (env *environment) init() {
+func (env *Environment) init() {
if len(env.WUIListen) == 0 {
env.WUIListen = defWuiAddress
}
@@ -117,7 +125,7 @@ func (env *environment) init() {
}
}
-func (env *environment) initHostsBlock(cfg *ini.Ini) {
+func (env *Environment) initHostsBlock(cfg *ini.Ini) {
env.HostsBlocks = hostsBlockSources
for x, v := range env.HostsBlocksRaw {
@@ -129,7 +137,7 @@ func (env *environment) initHostsBlock(cfg *ini.Ini) {
}
}
-func (env *environment) loadResolvConf() (ok bool, err error) {
+func (env *Environment) loadResolvConf() (ok bool, err error) {
rc, err := libnet.NewResolvConf(env.FileResolvConf)
if err != nil {
return false, err
@@ -161,7 +169,7 @@ func (env *environment) loadResolvConf() (ok bool, err error) {
//
// write the options values back to file.
//
-func (env *environment) write(file string) (err error) {
+func (env *Environment) write(file string) (err error) {
in, err := ini.Open(file)
if err != nil {
return fmt.Errorf("write: %w", err)
diff --git a/environment_test.go b/environment_test.go
index 985df1d..c9278a7 100644
--- a/environment_test.go
+++ b/environment_test.go
@@ -16,11 +16,11 @@ func TestEnvironment(t *testing.T) {
cases := []struct {
desc string
content string
- exp *environment
+ exp *Environment
expError string
}{{
desc: "With empty content",
- exp: &environment{},
+ exp: &Environment{},
}, {
desc: "With multiple parents",
content: `[dns "server"]
@@ -28,7 +28,7 @@ listen = 127.0.0.1:53
parent = udp://35.240.172.103
parent = https://kilabit.info/dns-query
`,
- exp: &environment{
+ exp: &Environment{
ServerOptions: dns.ServerOptions{
ListenAddress: "127.0.0.1:53",
NameServers: []string{
@@ -42,7 +42,7 @@ parent = https://kilabit.info/dns-query
for _, c := range cases {
t.Log(c.desc)
- got := &environment{
+ got := &Environment{
ServerOptions: dns.ServerOptions{},
}
diff --git a/httpd.go b/httpd.go
index 5a392e6..e3a64b0 100644
--- a/httpd.go
+++ b/httpd.go
@@ -356,7 +356,7 @@ func (srv *Server) httpdAPIPostEnvironment(epr *libhttp.EndpointRequest) (resBod
},
}
- newOpts := new(environment)
+ newOpts := new(Environment)
err = json.Unmarshal(epr.RequestBody, newOpts)
if err != nil {
return nil, err
@@ -372,7 +372,7 @@ func (srv *Server) httpdAPIPostEnvironment(epr *libhttp.EndpointRequest) (resBod
fmt.Printf("new options: %+v\n", newOpts)
- err = newOpts.write(srv.fileConfig)
+ err = newOpts.write(srv.env.fileConfig)
if err != nil {
res.Code = http.StatusInternalServerError
res.Message = err.Error()
@@ -442,7 +442,7 @@ func (srv *Server) apiHostsBlockUpdate(epr *libhttp.EndpointRequest) (resBody []
}
}
- err = srv.env.write(srv.fileConfig)
+ err = srv.env.write(srv.env.fileConfig)
if err != nil {
log.Println("apiHostsBlockUpdate:", err.Error())
res.Message = err.Error()
diff --git a/rescached.go b/rescached.go
index af00a1b..a283826 100644
--- a/rescached.go
+++ b/rescached.go
@@ -26,10 +26,9 @@ const (
// Server implement caching DNS server.
type Server struct {
- fileConfig string
- dns *dns.Server
- env *environment
- rcWatcher *libio.Watcher
+ dns *dns.Server
+ env *Environment
+ rcWatcher *libio.Watcher
httpd *http.Server
httpdRunner sync.Once
@@ -38,16 +37,13 @@ type Server struct {
//
// New create and initialize new rescached server.
//
-func New(fileConfig string) (srv *Server, err error) {
- env := loadEnvironment(fileConfig)
-
+func New(env *Environment) (srv *Server, err error) {
if debug.Value >= 1 {
fmt.Printf("--- rescached: config: %+v\n", env)
}
srv = &Server{
- fileConfig: fileConfig,
- env: env,
+ env: env,
}
err = srv.httpdInit()