Browse code

Add support for IPv6 addresses in --dns parameters.

Docker-DCO-1.1-Signed-off-by: Jan Pazdziora <jpazdziora@redhat.com> (github: adelton)

Jan Pazdziora authored on 2014/06/13 21:02:12
Showing 3 changed files
... ...
@@ -51,7 +51,7 @@ func main() {
51 51
 		flRoot               = flag.String([]string{"g", "-graph"}, "/var/lib/docker", "Path to use as the root of the Docker runtime")
52 52
 		flSocketGroup        = flag.String([]string{"G", "-group"}, "docker", "Group to assign the unix socket specified by -H when running in daemon mode\nuse '' (the empty string) to disable setting of a group")
53 53
 		flEnableCors         = flag.Bool([]string{"#api-enable-cors", "-api-enable-cors"}, false, "Enable CORS headers in the remote API")
54
-		flDns                = opts.NewListOpts(opts.ValidateIp4Address)
54
+		flDns                = opts.NewListOpts(opts.ValidateIpAddress)
55 55
 		flDnsSearch          = opts.NewListOpts(opts.ValidateDnsSearch)
56 56
 		flEnableIptables     = flag.Bool([]string{"#iptables", "-iptables"}, true, "Enable Docker's addition of iptables rules")
57 57
 		flEnableIpForward    = flag.Bool([]string{"#ip-forward", "-ip-forward"}, true, "Enable net.ipv4.ip_forward")
... ...
@@ -3,6 +3,7 @@ package opts
3 3
 import (
4 4
 	"fmt"
5 5
 	"github.com/dotcloud/docker/utils"
6
+	"net"
6 7
 	"os"
7 8
 	"path/filepath"
8 9
 	"regexp"
... ...
@@ -128,13 +129,12 @@ func ValidateEnv(val string) (string, error) {
128 128
 	return fmt.Sprintf("%s=%s", val, os.Getenv(val)), nil
129 129
 }
130 130
 
131
-func ValidateIp4Address(val string) (string, error) {
132
-	re := regexp.MustCompile(`^(([0-9]+\.){3}([0-9]+))\s*$`)
133
-	var ns = re.FindSubmatch([]byte(val))
134
-	if len(ns) > 0 {
135
-		return string(ns[1]), nil
131
+func ValidateIpAddress(val string) (string, error) {
132
+	var ip = net.ParseIP(strings.TrimSpace(val))
133
+	if ip != nil {
134
+		return ip.String(), nil
136 135
 	}
137
-	return "", fmt.Errorf("%s is not an ip4 address", val)
136
+	return "", fmt.Errorf("%s is not an ip address", val)
138 137
 }
139 138
 
140 139
 // Validates domain for resolvconf search configuration.
... ...
@@ -5,20 +5,24 @@ import (
5 5
 )
6 6
 
7 7
 func TestValidateIP4(t *testing.T) {
8
-	if ret, err := ValidateIp4Address(`1.2.3.4`); err != nil || ret == "" {
9
-		t.Fatalf("ValidateIp4Address(`1.2.3.4`) got %s %s", ret, err)
8
+	if ret, err := ValidateIpAddress(`1.2.3.4`); err != nil || ret == "" {
9
+		t.Fatalf("ValidateIpAddress(`1.2.3.4`) got %s %s", ret, err)
10 10
 	}
11 11
 
12
-	if ret, err := ValidateIp4Address(`127.0.0.1`); err != nil || ret == "" {
13
-		t.Fatalf("ValidateIp4Address(`127.0.0.1`) got %s %s", ret, err)
12
+	if ret, err := ValidateIpAddress(`127.0.0.1`); err != nil || ret == "" {
13
+		t.Fatalf("ValidateIpAddress(`127.0.0.1`) got %s %s", ret, err)
14 14
 	}
15 15
 
16
-	if ret, err := ValidateIp4Address(`127`); err == nil || ret != "" {
17
-		t.Fatalf("ValidateIp4Address(`127`) got %s %s", ret, err)
16
+	if ret, err := ValidateIpAddress(`::1`); err != nil || ret == "" {
17
+		t.Fatalf("ValidateIpAddress(`::1`) got %s %s", ret, err)
18 18
 	}
19 19
 
20
-	if ret, err := ValidateIp4Address(`random invalid string`); err == nil || ret != "" {
21
-		t.Fatalf("ValidateIp4Address(`random invalid string`) got %s %s", ret, err)
20
+	if ret, err := ValidateIpAddress(`127`); err == nil || ret != "" {
21
+		t.Fatalf("ValidateIpAddress(`127`) got %s %s", ret, err)
22
+	}
23
+
24
+	if ret, err := ValidateIpAddress(`random invalid string`); err == nil || ret != "" {
25
+		t.Fatalf("ValidateIpAddress(`random invalid string`) got %s %s", ret, err)
22 26
 	}
23 27
 
24 28
 }