diff --git a/js/helpers.js b/js/helpers.js index e64983f0b..2169cd42f 100644 --- a/js/helpers.js +++ b/js/helpers.js @@ -156,10 +156,18 @@ function format_tt(transform_table) { newIP = num2dot(newIP); } } + var newBase = ip.newBase; + if (newBase){ + if(_.isArray(newBase)){ + newBase = _.map(newBase,function(i){return num2dot(i)}).join(",") + }else{ + newBase = num2dot(newBase); + } + } var row = [ num2dot(ip.low), num2dot(ip.high), - num2dot(ip.newBase), + newBase, newIP ] lines.push(row.join(" ~ ")) diff --git a/js/parse_tests/006-transforms.js b/js/parse_tests/006-transforms.js new file mode 100644 index 000000000..b8a773523 --- /dev/null +++ b/js/parse_tests/006-transforms.js @@ -0,0 +1,12 @@ +var REG = NewRegistrar("Third-Party","NONE"); +var CF = NewDSP("Cloudflare", "CLOUDFLAREAPI") + +var TRANSFORM_INT = [ + {low: "0.0.0.0", high: "1.1.1.1", newBase: "2.2.2.2" }, + {low: "1.1.1.1", high: IP("2.2.2.2"), newBase: ["3.3.3.3","4.4.4.4",IP("5.5.5.5")]} , + {low: "1.1.1.1", high: IP("2.2.2.2"), newIP: ["3.3.3.3","4.4.4.4",IP("5.5.5.5")]} +] + +D("foo.com",REG,CF, + A("@","1.2.3.4",{transform: TRANSFORM_INT}) +); \ No newline at end of file diff --git a/js/parse_tests/006-transforms.json b/js/parse_tests/006-transforms.json new file mode 100644 index 000000000..a96d7a9dd --- /dev/null +++ b/js/parse_tests/006-transforms.json @@ -0,0 +1,34 @@ +{ + "registrars": [ + { + "name": "Third-Party", + "type": "NONE" + } + ], + "dns_service_providers": [ + { + "name": "Cloudflare", + "type": "CLOUDFLAREAPI" + } + ], + "domains": [ + { + "name": "foo.com", + "registrar": "Third-Party", + "dsps": [ + "Cloudflare" + ], + "records": [ + { + "type": "A", + "name": "@", + "target": "1.2.3.4", + "meta": { + "transform": "0.0.0.0 ~ 1.1.1.1 ~ 2.2.2.2 ~ ; 1.1.1.1 ~ 2.2.2.2 ~ 3.3.3.3,4.4.4.4,5.5.5.5 ~ ; 1.1.1.1 ~ 2.2.2.2 ~ ~ 3.3.3.3,4.4.4.4,5.5.5.5" + } + } + ], + "keepunknown": false + } + ] + } \ No newline at end of file diff --git a/js/static.go b/js/static.go index b37d98534..e0e66e2f8 100644 --- a/js/static.go +++ b/js/static.go @@ -190,59 +190,43 @@ var _escData = map[string]*_escFile{ "/helpers.js": { local: "js/helpers.js", - size: 6427, + size: 6644, modtime: 0, compressed: ` -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 -`, - }, - - "/tester.html": { - local: "js/tester.html", - size: 953, - modtime: 0, - compressed: ` -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 `, }, diff --git a/main.go b/main.go index b8ca73046..511a540c5 100644 --- a/main.go +++ b/main.go @@ -29,7 +29,7 @@ import ( _ "github.com/StackExchange/dnscontrol/providers/route53" ) -//go:generate esc -modtime 0 -o js/static.go -pkg js -ignore go -prefix js js +//go:generate esc -modtime 0 -o js/static.go -pkg js -include helpers\.js -ignore go -prefix js js //go:generate esc -modtime 0 -o web/static.go -pkg web -include=bundle\.js -ignore node_modules -prefix web web // One of these config options must be set. diff --git a/transform/transform.go b/transform/transform.go index bcbcf6a61..e3fa4dcac 100644 --- a/transform/transform.go +++ b/transform/transform.go @@ -7,8 +7,9 @@ import ( ) type IpConversion struct { - Low, High, NewBase net.IP - NewIPs []net.IP + Low, High net.IP + NewBases []net.IP + NewIPs []net.IP } func ipToUint(i net.IP) (uint32, error) { @@ -42,19 +43,30 @@ func DecodeTransformTable(transforms string) ([]IpConversion, error) { } con := IpConversion{ - Low: net.ParseIP(items[0]), - High: net.ParseIP(items[1]), - NewBase: net.ParseIP(items[2]), + Low: net.ParseIP(items[0]), + High: net.ParseIP(items[1]), } - for _, ip := range strings.Split(items[3], ",") { - if ip == "" { - continue + parseList := func(s string) ([]net.IP, error) { + ips := []net.IP{} + for _, ip := range strings.Split(s, ",") { + + if ip == "" { + continue + } + addr := net.ParseIP(ip) + if addr == nil { + return nil, fmt.Errorf("%s is not a valid ip address", ip) + } + ips = append(ips, addr) } - addr := net.ParseIP(ip) - if addr == nil { - return nil, fmt.Errorf("%s is not a valid ip address", ip) - } - con.NewIPs = append(con.NewIPs, addr) + return ips, nil + } + var err error + if con.NewBases, err = parseList(items[2]); err != nil { + return nil, err + } + if con.NewIPs, err = parseList(items[3]); err != nil { + return nil, err } low, _ := ipToUint(con.Low) @@ -62,8 +74,8 @@ func DecodeTransformTable(transforms string) ([]IpConversion, error) { if low > high { return nil, fmt.Errorf("transform_table Low should be less than High. row (%v) %v>%v (%v)\n", ri, con.Low, con.High, transforms) } - if con.NewBase != nil && con.NewIPs != nil { - return nil, fmt.Errorf("transform_table_rows should only specify one of NewBase or NewIP. Not both.") + if len(con.NewBases) > 0 && len(con.NewIPs) > 0 { + return nil, fmt.Errorf("transform_table_rows should only specify one of NewBases or NewIPs, Not both") } result = append(result, con) } @@ -102,11 +114,15 @@ func TransformIPToList(address net.IP, transforms []IpConversion) ([]net.IP, err if conv.NewIPs != nil { return conv.NewIPs, nil } - newbase, err := ipToUint(conv.NewBase) - if err != nil { - return nil, err + list := []net.IP{} + for _, nb := range conv.NewBases { + newbase, err := ipToUint(nb) + if err != nil { + return nil, err + } + list = append(list, UintToIP(newbase+(thisIP-min))) } - return []net.IP{UintToIP(newbase + (thisIP - min))}, nil + return list, nil } } return []net.IP{address}, nil diff --git a/transform/transform_test.go b/transform/transform_test.go index 391c5e12d..60f6f13d9 100644 --- a/transform/transform_test.go +++ b/transform/transform_test.go @@ -2,6 +2,7 @@ package transform import ( "net" + "strings" "testing" ) @@ -46,7 +47,7 @@ func Test_DecodeTransformTable_0(t *testing.T) { } test_ip(t, "low", "1.2.3.4", result[0].Low) test_ip(t, "high", "2.3.4.5", result[0].High) - test_ip(t, "newBase", "3.4.5.6", result[0].NewBase) + test_ip(t, "newBase", "3.4.5.6", result[0].NewBases[0]) //test_ip(t, "newIP", "", result[0].NewIPs) } @@ -60,11 +61,11 @@ func Test_DecodeTransformTable_1(t *testing.T) { } test_ip(t, "Low[0]", "1.2.3.4", result[0].Low) test_ip(t, "High[0]", "2.3.4.5", result[0].High) - test_ip(t, "NewBase[0]", "3.4.5.6", result[0].NewBase) + test_ip(t, "NewBase[0]", "3.4.5.6", result[0].NewBases[0]) //test_ip(t, "newIP[0]", "", result[0].NewIP) test_ip(t, "Low[1]", "8.7.6.5", result[1].Low) test_ip(t, "High[1]", "9.8.7.6", result[1].High) - test_ip(t, "NewBase[1]", "7.6.5.4", result[1].NewBase) + test_ip(t, "NewBase[1]", "7.6.5.4", result[1].NewBases[0]) //test_ip(t, "newIP[1]", "", result[0].NewIP) } func Test_DecodeTransformTable_NewIP(t *testing.T) { @@ -77,8 +78,7 @@ func Test_DecodeTransformTable_NewIP(t *testing.T) { } test_ip(t, "low", "1.2.3.4", result[0].Low) test_ip(t, "high", "2.3.4.5", result[0].High) - //test_ip(t, "newIP", "3.4.5.6", result[0].NewIP) - test_ip(t, "newBase", "", result[0].NewBase) + test_ip(t, "newIP", "3.4.5.6", result[0].NewIPs[0]) } func Test_DecodeTransformTable_order(t *testing.T) { @@ -106,21 +106,25 @@ func Test_DecodeTransformTable_Base_and_IP(t *testing.T) { func Test_TransformIP(t *testing.T) { var transforms1 = []IpConversion{{ - Low: net.ParseIP("11.11.11.0"), - High: net.ParseIP("11.11.11.20"), - NewBase: net.ParseIP("99.99.99.0"), + Low: net.ParseIP("11.11.11.0"), + High: net.ParseIP("11.11.11.20"), + NewBases: []net.IP{net.ParseIP("99.99.99.0")}, }, { - Low: net.ParseIP("22.22.22.0"), - High: net.ParseIP("22.22.22.40"), - NewBase: net.ParseIP("99.99.99.100"), + Low: net.ParseIP("22.22.22.0"), + High: net.ParseIP("22.22.22.40"), + NewBases: []net.IP{net.ParseIP("99.99.99.100")}, }, { - Low: net.ParseIP("33.33.33.20"), - High: net.ParseIP("33.33.35.40"), - NewBase: net.ParseIP("100.100.100.0"), + Low: net.ParseIP("33.33.33.20"), + High: net.ParseIP("33.33.35.40"), + NewBases: []net.IP{net.ParseIP("100.100.100.0")}, }, { - Low: net.ParseIP("44.44.44.20"), - High: net.ParseIP("44.44.44.40"), - NewBase: net.ParseIP("100.100.100.40"), + Low: net.ParseIP("44.44.44.20"), + High: net.ParseIP("44.44.44.40"), + NewBases: []net.IP{net.ParseIP("100.100.100.40")}, + }, { + Low: net.ParseIP("55.0.0.0"), + High: net.ParseIP("55.255.0.0"), + NewBases: []net.IP{net.ParseIP("66.0.0.0"), net.ParseIP("77.0.0.0")}, }} var tests = []struct { @@ -145,17 +149,22 @@ func Test_TransformIP(t *testing.T) { {"33.33.35.41", "33.33.35.41"}, {"44.44.44.24", "100.100.100.44"}, {"44.44.44.44", "44.44.44.44"}, + {"55.0.42.42", "66.0.42.42,77.0.42.42"}, } for _, test := range tests { experiment := net.ParseIP(test.experiment) - expected := net.ParseIP(test.expected) - actual, err := TransformIP(experiment, transforms1) + actual, err := TransformIPToList(experiment, transforms1) if err != nil { t.Errorf("%v: got an err: %v\n", experiment, err) } - if !expected.Equal(actual) { - t.Errorf("%v: expected (%v) got (%v)\n", experiment, expected, actual) + list := []string{} + for _, ip := range actual { + list = append(list, ip.String()) + } + act := strings.Join(list, ",") + if test.expected != act { + t.Errorf("%v: expected (%v) got (%v)\n", experiment, test.expected, act) } } }