From 966a02a4cff7010c510a1f427d5a3055c7f18603 Mon Sep 17 00:00:00 2001 From: Elvis Souza Date: Sun, 31 Mar 2019 12:26:56 -0300 Subject: [PATCH] Configurable containers domain (#113) --- RELEASE-NOTES.md | 3 +++ VERSION | 2 +- conf/conf.go | 20 +++++++++++++++++--- docs/features.md | 20 ++++++++++++++++++++ events/docker/docker.go | 4 ++-- events/local/local.go | 3 +++ flags/flags.go | 21 +++++++-------------- service/docker.go | 9 ++++++--- utils/env/env.go | 1 + 9 files changed, 60 insertions(+), 23 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 5e433db8c..69a47a42f 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -1,3 +1,6 @@ +### 2.12.0 +* Possibility to change container hostname domain, [see the docs](https://github.com/mageddo/dns-proxy-server/blob/70a0ff8/docs/features.md#access-container-by-its-container-name--service-name) + ### 2.11.0 * Now you can customize host machine hostname, see [the docs](https://github.com/mageddo/dns-proxy-server/blob/fa1e044b/docs/features.md#solve-host-machine-ip-from-anywhere) * Increased default loglevel to INFO diff --git a/VERSION b/VERSION index 46b81d815..d8b698973 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.11.0 +2.12.0 diff --git a/conf/conf.go b/conf/conf.go index f64e85995..11cae447a 100644 --- a/conf/conf.go +++ b/conf/conf.go @@ -1,6 +1,7 @@ package conf import ( + "fmt" "github.com/mageddo/dns-proxy-server/events/local" "github.com/mageddo/dns-proxy-server/flags" "os" @@ -98,7 +99,7 @@ func GetString(value, defaultValue string) string { return value } -func RegisterContainerNames() bool { +func ShouldRegisterContainerNames() bool { if v := os.Getenv(env.MG_REGISTER_CONTAINER_NAMES); v == "1" { return true } @@ -109,11 +110,24 @@ func RegisterContainerNames() bool { } func GetHostname() string { - if hostname := os.Getenv(env.MG_HOST_MACHINE_HOSTNAME); len(strings.Trim(hostname, " ")) != 0 { + if hostname := os.Getenv(env.MG_HOST_MACHINE_HOSTNAME); len(strings.TrimSpace(hostname)) != 0 { return hostname } if conf, _ := getConf(); conf != nil && len(conf.HostMachineHostname) != 0 { return conf.HostMachineHostname } - return *flags.Hostname + return *flags.HostMachineHostname +} + +func FormatDPSDomain(subdomain string) string { + return fmt.Sprintf("%s.%s", subdomain, GetDPSDomain()) +} +func GetDPSDomain() string { + if domain := os.Getenv(env.MG_DOMAIN); len(strings.TrimSpace(domain)) != 0 { + return domain + } + if conf, _ := getConf(); conf != nil && len(conf.HostMachineHostname) != 0 { + return conf.Domain + } + return *flags.Domain } diff --git a/docs/features.md b/docs/features.md index 96043f046..019d554d0 100644 --- a/docs/features.md +++ b/docs/features.md @@ -158,6 +158,26 @@ __Using environment variable__ MG_REGISTER_CONTAINER_NAMES=1 ./dns-proxy-server ``` +You can also customize the domain from docker to whatever you want by + +__Activating by command line__ + + ./dns-proxy-server --domain docker + +__Configuring at json config file__ + +``` +... +"domain": "docker" +... +``` + +__Using environment variable__ + +```bash +MG_DOMAIN=docker ./dns-proxy-server +``` + ### Specify from which network solve container IP If your container have multiple networks then you can specify which network to use when solving IP by specifying `dps.network` label. diff --git a/events/docker/docker.go b/events/docker/docker.go index 5a3c9e66c..d7094bbf6 100644 --- a/events/docker/docker.go +++ b/events/docker/docker.go @@ -119,7 +119,7 @@ func getHostnames(inspect types.ContainerJSON) []string { } hostnames = append(hostnames, getHostnamesFromEnv(inspect)...) - if conf.RegisterContainerNames() { + if conf.ShouldRegisterContainerNames() { hostnames = append(hostnames, getHostnameFromContainerName(inspect)) if hostnameFromServiceName, err := getHostnameFromServiceName(inspect); err == nil { hostnames = append(hostnames, hostnameFromServiceName) @@ -155,7 +155,7 @@ func getMachineHostname(inspect types.ContainerJSON) (string, error) { } func getHostnameFromContainerName(inspect types.ContainerJSON) string { - return fmt.Sprintf("%s.docker", inspect.Name[1:]) + return fmt.Sprintf("%s.%s", inspect.Name[1:], conf.GetDPSDomain()) } func getHostnameFromServiceName(inspect types.ContainerJSON) (string, error) { diff --git a/events/local/local.go b/events/local/local.go index c2b60f7e9..fad5bb8b5 100644 --- a/events/local/local.go +++ b/events/local/local.go @@ -114,6 +114,9 @@ type LocalConfiguration struct { // hostname to solve host machine IP HostMachineHostname string `json:"hostMachineHostname"` + + // domain utilized to solve container names + Domain string `json:"domain"` } type EnvVo struct { diff --git a/flags/flags.go b/flags/flags.go index 287577d29..69c4653fc 100644 --- a/flags/flags.go +++ b/flags/flags.go @@ -22,13 +22,14 @@ var ( docker = start as docker service, normal = start as normal service, uninstall = uninstall the service from machine `) - publishServicePort = flag.Bool("service-publish-web-port", true, "Publish web port when running as service in docker mode") - logToFile = flag.String("log-file", "console", "Log to file instead of console, (true=log to default log file, /tmp/log.log=log to custom log location)") - logLevel = flag.String("log-level", "INFO", "Log Level ERROR, WARNING, INFO, DEBUG") + publishServicePort = flag.Bool("service-publish-web-port", true, "Publish web port when running as service in docker mode") + logToFile = flag.String("log-file", "console", "Log to file instead of console, (true=log to default log file, /tmp/log.log=log to custom log location)") + logLevel = flag.String("log-level", "INFO", "Log Level ERROR, WARNING, INFO, DEBUG") registerContainerNames = flag.Bool("register-container-names", false, "If must register container name / service name as host in DNS server") - Version = flag.Bool("version", false, "Current version") - Hostname = flag.String("host-machine-hostname", "host.docker", "The hostname to get host machine IP") - Help = flag.Bool("help", false, "This message") + Version = flag.Bool("version", false, "Current version") + HostMachineHostname = flag.String("host-machine-hostname", "host.docker", "The hostname to get host machine IP") + Domain = flag.String("domain", "docker", "Domain utilized to solver containers and services hostnames") + Help = flag.Bool("help", false, "This message") ) func init(){ @@ -49,14 +50,6 @@ func PublishServicePort() bool { } func GetRawCurrentVersion() string { - - //if len(version) == 0 { - //b, err := ioutil.ReadFile(utils.GetPath("VERSION")) // just pass the file name - //if err == nil { - // return string(b) - //} - //log.Logger.Warningf("status=could-not-recover-version, err=%v", err) - //} return version } diff --git a/service/docker.go b/service/docker.go index 0d01ec0ed..9e3aea4b2 100644 --- a/service/docker.go +++ b/service/docker.go @@ -10,12 +10,15 @@ func NewDockerScript() *Script { script := `'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ; ` + `docker rm -f dns-proxy-server &> /dev/null ;` + - `docker run --hostname dns.mageddo --name dns-proxy-server %s ` + + `docker run -e HOSTNAMES=%s --name dns-proxy-server %s ` + `-v /opt/dns-proxy-server/conf:/app/conf ` + `-v /var/run/docker.sock:/var/run/docker.sock ` + `-v /etc/resolv.conf:/etc/resolv.conf ` + `defreitas/dns-proxy-server:%s'` - script = fmt.Sprintf(script, getExposedPort(), flags.GetRawCurrentVersion()) + script = fmt.Sprintf( + script, fmt.Sprintf("dns.mageddo,%s", conf.FormatDPSDomain("dns")), + getExposedPort(), flags.GetRawCurrentVersion(), + ) return &Script{script} } @@ -25,4 +28,4 @@ func getExposedPort() string { } else { return "" } -} \ No newline at end of file +} diff --git a/utils/env/env.go b/utils/env/env.go index 3512c067e..a7a3c0166 100644 --- a/utils/env/env.go +++ b/utils/env/env.go @@ -11,4 +11,5 @@ const ( MG_REGISTER_CONTAINER_NAMES = "MG_REGISTER_CONTAINER_NAMES" MG_HOST_MACHINE_HOSTNAME = "MG_HOST_MACHINE_HOSTNAME" + MG_DOMAIN = "MG_DOMAIN" )