diff --git a/.gitignore b/.gitignore index aef93049f..00dbf3cd7 100644 --- a/.gitignore +++ b/.gitignore @@ -33,5 +33,8 @@ types-dnscontrol.d.ts dist/ node_modules/ +// Golang +__debug_bin* + // Test artifact: *.ACTUAL diff --git a/models/rawrecord.go b/models/rawrecord.go index 47d30ef18..1b073a803 100644 --- a/models/rawrecord.go +++ b/models/rawrecord.go @@ -5,8 +5,9 @@ package models // NOTE: Only newer rtypes are processed this way. Eventually the // legacy types will be converted. type RawRecordConfig struct { - Type string `json:"type"` - Args []any `json:"args,omitempty"` - Metas []map[string]any `json:"metas,omitempty"` - TTL uint32 `json:"ttl,omitempty"` + Type string `json:"type"` + Args []any `json:"args,omitempty"` + Metas []map[string]any `json:"metas,omitempty"` + TTL uint32 `json:"ttl,omitempty"` + FilePos string `json:"filepos"` // Where in the file this record was defined. } diff --git a/models/record.go b/models/record.go index f2a61cb12..c9f4a36c0 100644 --- a/models/record.go +++ b/models/record.go @@ -24,9 +24,9 @@ type RecordConfig struct { // Name is the shortname i.e. the FQDN without the parent directory's suffix. // It should never be "". Record at the apex (naked domain) are represented by "@". - Name string `json:"name"` // The short name, PunyCode. See above. - NameRaw string `json:"name_raw"` // .Name as the user entered it in dnsconfig.js (downcased). - NameUnicode string `json:"name_unicode"` // .Name as Unicode (downcased, then convertedot Unicode). + Name string `json:"name"` // The short name, PunyCode. See above. + NameRaw string `json:"name_raw,omitempty"` // .Name as the user entered it in dnsconfig.js (downcased). + NameUnicode string `json:"name_unicode,omitempty"` // .Name as Unicode (downcased, then convertedot Unicode). // This is the FQDN version of .Name. It should never have a trailing ".". NameFQDN string `json:"-"` // Must end with ".$origin". @@ -35,7 +35,7 @@ type RecordConfig struct { // F is the binary representation of the record's data usually a dns.XYZ struct. // Always stored in Punycode, not Unicode. Downcased where applicable. - F any `json:"fields"` + F any `json:"fields,omitempty"` //FieldsAsRaw []string // Fields as received from the dnsconfig.js file, converted to strings. //FieldsAsUnicode []string // fields with IDN fields converted to Unicode for display purposes. diff --git a/pkg/diff2/analyze_test.go b/pkg/diff2/analyze_test.go index 5bf4271a5..7b49728e3 100644 --- a/pkg/diff2/analyze_test.go +++ b/pkg/diff2/analyze_test.go @@ -621,7 +621,7 @@ func Test_diffTargets(t *testing.T) { Key: models.RecordKey{NameFQDN: "laba.f.com", Type: "A"}, New: models.Records{testDataAA5678ttl700, testDataAA1234ttl700}, Msgs: []string{ - "± MODIFY-TTL laba.f.com A 5.6.7.8 ttl=(300->700)", + "± MODIFY-TTL laba.f.com A ttl=(300->700) 5.6.7.8", "+ CREATE laba.f.com A 1.2.3.4 ttl=700", }, }, @@ -836,7 +836,7 @@ func Test_splitTTLOnly(t *testing.T) { }, wantExistDiff: nil, wantDesireDiff: nil, - wantChanges: "ChangeList: len=1\n00: Change: verb=CHANGE\n key={laba.f.com A}\n Hints=OnlyTTL\n{laba.f.com A} old=[1.2.3.4]\n new=[1.2.3.4]\n msg=[\"± MODIFY-TTL laba.f.com A 1.2.3.4 ttl=(300->700)\"]\n", + wantChanges: "ChangeList: len=1\n00: Change: verb=CHANGE\n key={laba.f.com A}\n Hints=OnlyTTL\n{laba.f.com A} old=[1.2.3.4]\n new=[1.2.3.4]\n msg=[\"± MODIFY-TTL laba.f.com A ttl=(300->700) 1.2.3.4\"]\n", }, { diff --git a/pkg/js/helpers.js b/pkg/js/helpers.js index 4f3df9e0c..0a27fac2c 100644 --- a/pkg/js/helpers.js +++ b/pkg/js/helpers.js @@ -2436,9 +2436,19 @@ function rawrecordBuilder(type) { rawArgs.push(arguments[i]); } + // Record which line called this record type. + // NB(tlim): Hopefully we can find a better way to do this in the + // future. Right now we're faking that there was an error just to parse + // out the line number. That's inefficient but I can't find anything better. + // This will certainly break if we change to a different Javascript interpreter. + // Hopefully any other interpreter will have a better way to do this. + var positionLines = new Error().stack.split('\n'); + var position = positionLines[positionLines.length - 2]; + return function (d) { var record = { type: type, + filepos: position, }; // Process the args: Functions are executed, objects are assumed to diff --git a/pkg/js/js_test.go b/pkg/js/js_test.go index f42c02e4c..a41f27486 100644 --- a/pkg/js/js_test.go +++ b/pkg/js/js_test.go @@ -6,6 +6,7 @@ import ( "fmt" "os" "path/filepath" + "strings" "testing" "unicode" @@ -131,8 +132,8 @@ func TestParsedFiles(t *testing.T) { } actualZone := buf.String() - es := string(expectedZone) - as := actualZone + es := strings.TrimSpace(string(expectedZone)) + as := strings.TrimSpace(actualZone) if es != as { // On failure, leave behind the .ACTUAL file. if err := os.WriteFile(zoneFile+".ACTUAL", []byte(actualZone), 0o644); err != nil { diff --git a/pkg/js/parse_tests/001-basic.json b/pkg/js/parse_tests/001-basic.json index 1317e48be..82289bf2e 100644 --- a/pkg/js/parse_tests/001-basic.json +++ b/pkg/js/parse_tests/001-basic.json @@ -16,11 +16,8 @@ "name": "foo.com", "records": [ { - "fields": null, "filepos": "[line:5:5]", "name": "@", - "name_raw": "", - "name_unicode": "", "target": "1.2.3.4", "ttl": 300, "type": "A" diff --git a/pkg/js/parse_tests/002-ttl.json b/pkg/js/parse_tests/002-ttl.json index fdff17d40..48bd3db4a 100644 --- a/pkg/js/parse_tests/002-ttl.json +++ b/pkg/js/parse_tests/002-ttl.json @@ -16,11 +16,8 @@ "name": "foo.com", "records": [ { - "fields": null, "filepos": "[line:5:5]", "name": "@", - "name_raw": "", - "name_unicode": "", "target": "1.2.3.4", "ttl": 42, "type": "A" diff --git a/pkg/js/parse_tests/003-meta.json b/pkg/js/parse_tests/003-meta.json index d0603a83b..21f988ee3 100644 --- a/pkg/js/parse_tests/003-meta.json +++ b/pkg/js/parse_tests/003-meta.json @@ -9,14 +9,11 @@ "name": "foo.com", "records": [ { - "fields": null, "filepos": "[line:4:5]", "meta": { "cloudflare_proxy": "ON" }, "name": "@", - "name_raw": "", - "name_unicode": "", "target": "1.2.3.4", "ttl": 300, "type": "A" diff --git a/pkg/js/parse_tests/004-ips.json b/pkg/js/parse_tests/004-ips.json index eb97be67d..4147e135f 100644 --- a/pkg/js/parse_tests/004-ips.json +++ b/pkg/js/parse_tests/004-ips.json @@ -16,31 +16,22 @@ "name": "foo.com", "records": [ { - "fields": null, "filepos": "[line:7:5]", "name": "@", - "name_raw": "", - "name_unicode": "", "target": "1.2.3.4", "ttl": 300, "type": "A" }, { - "fields": null, "filepos": "[line:8:5]", "name": "p1", - "name_raw": "", - "name_unicode": "", "target": "1.2.3.5", "ttl": 300, "type": "A" }, { - "fields": null, "filepos": "[line:9:5]", "name": "p255", - "name_raw": "", - "name_unicode": "", "target": "1.2.4.3", "ttl": 300, "type": "A" diff --git a/pkg/js/parse_tests/006-transforms.json b/pkg/js/parse_tests/006-transforms.json index 9ffa331ab..2a54d02bf 100644 --- a/pkg/js/parse_tests/006-transforms.json +++ b/pkg/js/parse_tests/006-transforms.json @@ -16,40 +16,31 @@ "name": "foo.com", "records": [ { - "fields": null, "filepos": "[line:18:5]", "meta": { "transform": "0.0.0.0 ~ 1.1.1.0 ~ 2.2.2.2 ~ ; 1.1.1.1 ~ 2.2.2.2 ~ ~ 3.3.3.3,4.4.4.4,5.5.5.5" }, "name": "@", - "name_raw": "", - "name_unicode": "", "target": "3.3.3.3", "ttl": 300, "type": "A" }, { - "fields": null, "filepos": "[line:18:5]", "meta": { "transform": "0.0.0.0 ~ 1.1.1.0 ~ 2.2.2.2 ~ ; 1.1.1.1 ~ 2.2.2.2 ~ ~ 3.3.3.3,4.4.4.4,5.5.5.5" }, "name": "@", - "name_raw": "", - "name_unicode": "", "target": "4.4.4.4", "ttl": 300, "type": "A" }, { - "fields": null, "filepos": "[line:18:5]", "meta": { "transform": "0.0.0.0 ~ 1.1.1.0 ~ 2.2.2.2 ~ ; 1.1.1.1 ~ 2.2.2.2 ~ ~ 3.3.3.3,4.4.4.4,5.5.5.5" }, "name": "@", - "name_raw": "", - "name_unicode": "", "target": "5.5.5.5", "ttl": 300, "type": "A" diff --git a/pkg/js/parse_tests/007-importTransformTTL.json b/pkg/js/parse_tests/007-importTransformTTL.json index 9075e412f..39027b66e 100644 --- a/pkg/js/parse_tests/007-importTransformTTL.json +++ b/pkg/js/parse_tests/007-importTransformTTL.json @@ -9,21 +9,15 @@ "name": "foo1.com", "records": [ { - "fields": null, "filepos": "[line:2:5]", "name": "bar", - "name_raw": "", - "name_unicode": "", "target": "1.1.1.1", "ttl": 300, "type": "A" }, { - "fields": null, "filepos": "[line:3:5]", "name": "foo", - "name_raw": "", - "name_unicode": "", "target": "5.5.5.5", "ttl": 300, "type": "A" @@ -39,21 +33,15 @@ "name": "inny", "records": [ { - "fields": null, "filepos": "[line:2:5]", "name": "bar.foo1.com", - "name_raw": "", - "name_unicode": "", "target": "4.4.4.101", "ttl": 60, "type": "A" }, { - "fields": null, "filepos": "[line:3:5]", "name": "foo.foo1.com", - "name_raw": "", - "name_unicode": "", "target": "6.6.6.3", "ttl": 60, "type": "A" @@ -69,21 +57,15 @@ "name": "com.inny", "records": [ { - "fields": null, "filepos": "[line:2:5]", "name": "bar.foo1", - "name_raw": "", - "name_unicode": "", "target": "1.1.1.1", "ttl": 99, "type": "A" }, { - "fields": null, "filepos": "[line:3:5]", "name": "foo.foo1", - "name_raw": "", - "name_unicode": "", "target": "7.7.7.7", "ttl": 99, "type": "A" diff --git a/pkg/js/parse_tests/008-import.json b/pkg/js/parse_tests/008-import.json index 92ce72139..ce6010f13 100644 --- a/pkg/js/parse_tests/008-import.json +++ b/pkg/js/parse_tests/008-import.json @@ -9,11 +9,8 @@ "name": "foo.com", "records": [ { - "fields": null, "filepos": "[line:1:1]", "name": "@", - "name_raw": "", - "name_unicode": "", "target": "1.2.3.4", "ttl": 300, "type": "A" diff --git a/pkg/js/parse_tests/010-alias.json b/pkg/js/parse_tests/010-alias.json index 8e65d3f22..cde8d47e1 100644 --- a/pkg/js/parse_tests/010-alias.json +++ b/pkg/js/parse_tests/010-alias.json @@ -9,11 +9,8 @@ "name": "foo.com", "records": [ { - "fields": null, "filepos": "[line:2:5]", "name": "@", - "name_raw": "", - "name_unicode": "", "target": "foo.com.", "ttl": 300, "type": "ALIAS" diff --git a/pkg/js/parse_tests/011-cfRedirect.js b/pkg/js/parse_tests/011-cfRedirect.js index d649afbf3..7d0efae63 100644 --- a/pkg/js/parse_tests/011-cfRedirect.js +++ b/pkg/js/parse_tests/011-cfRedirect.js @@ -1,4 +1,4 @@ D("foo.com", "none", - CF_REDIRECT("test.foo.com", "https://goo.com/$1"), - CF_TEMP_REDIRECT("test.foo.com", "https://goo.com/$1"), + CF_REDIRECT("test1.foo.com", "https://goo.com/$1"), + CF_TEMP_REDIRECT("test2.foo.com", "https://goo.com/$1"), ); diff --git a/pkg/js/parse_tests/011-cfRedirect.json b/pkg/js/parse_tests/011-cfRedirect.json index be71ee946..419d81c49 100644 --- a/pkg/js/parse_tests/011-cfRedirect.json +++ b/pkg/js/parse_tests/011-cfRedirect.json @@ -9,24 +9,36 @@ "name": "foo.com", "records": [ { - "filepos": "[line:2:5]", - "meta": { - "orig_custom_type": "CF_REDIRECT" + "fields": { + "code": 301, + "sr_display": "name=(001,301,test1.foo.com,https://goo.com/$1) code=(301) when=(http.host eq \"test1.foo.com\" and http.request.uri.path eq \"/\") then=(concat(\"https://goo.com\", http.request.uri.path))", + "sr_name": "001,301,test1.foo.com,https://goo.com/$1", + "sr_then": "concat(\"https://goo.com\", http.request.uri.path)", + "sr_when": "http.host eq \"test1.foo.com\" and http.request.uri.path eq \"/\"" }, + "filepos": "[line:2:5]", "name": "@", - "target": "test.foo.com,https://goo.com/$1", - "ttl": 300, - "type": "CF_REDIRECT" + "name_raw": "@", + "name_unicode": "@", + "target": "test1.foo.com,https://goo.com/$1", + "ttl": 1, + "type": "CLOUDFLAREAPI_SINGLE_REDIRECT" }, { - "filepos": "[line:3:5]", - "meta": { - "orig_custom_type": "CF_TEMP_REDIRECT" + "fields": { + "code": 302, + "sr_display": "name=(002,302,test2.foo.com,https://goo.com/$1) code=(302) when=(http.host eq \"test2.foo.com\" and http.request.uri.path eq \"/\") then=(concat(\"https://goo.com\", http.request.uri.path))", + "sr_name": "002,302,test2.foo.com,https://goo.com/$1", + "sr_then": "concat(\"https://goo.com\", http.request.uri.path)", + "sr_when": "http.host eq \"test2.foo.com\" and http.request.uri.path eq \"/\"" }, + "filepos": "[line:3:5]", "name": "@", - "target": "test.foo.com,https://goo.com/$1", - "ttl": 300, - "type": "CF_TEMP_REDIRECT" + "name_raw": "@", + "name_unicode": "@", + "target": "test2.foo.com,https://goo.com/$1", + "ttl": 1, + "type": "CLOUDFLAREAPI_SINGLE_REDIRECT" } ], "registrar": "none" diff --git a/pkg/js/parse_tests/011-cfRedirect/foo.com.zone b/pkg/js/parse_tests/011-cfRedirect/foo.com.zone index 4cf254442..884f7f77b 100644 --- a/pkg/js/parse_tests/011-cfRedirect/foo.com.zone +++ b/pkg/js/parse_tests/011-cfRedirect/foo.com.zone @@ -1,3 +1,3 @@ $TTL 300 -;@ IN CF_REDIRECT test.foo.com,https://goo.com/$1 -;@ IN CF_TEMP_REDIRECT test.foo.com,https://goo.com/$1 +;@ 1 IN CLOUDFLAREAPI_SINGLE_REDIRECT test1.foo.com,https://goo.com/$1 +;@ 1 IN CLOUDFLAREAPI_SINGLE_REDIRECT test2.foo.com,https://goo.com/$1 diff --git a/pkg/js/parse_tests/036-dextendcf.json b/pkg/js/parse_tests/036-dextendcf.json index dbf452bdd..5894be7f5 100644 --- a/pkg/js/parse_tests/036-dextendcf.json +++ b/pkg/js/parse_tests/036-dextendcf.json @@ -15,26 +15,6 @@ }, "name": "foo.com", "records": [ - { - "filepos": "[line:9:5]", - "meta": { - "orig_custom_type": "CF_REDIRECT" - }, - "name": "@", - "target": "test1.foo.com,https://goo.com/$1", - "ttl": 300, - "type": "CF_REDIRECT" - }, - { - "filepos": "[line:10:5]", - "meta": { - "orig_custom_type": "CF_TEMP_REDIRECT" - }, - "name": "@", - "target": "test2.foo.com,https://goo.com/$1", - "ttl": 300, - "type": "CF_TEMP_REDIRECT" - }, { "filepos": "[line:11:5]", "meta": { @@ -45,6 +25,38 @@ "ttl": 300, "type": "CF_WORKER_ROUTE" }, + { + "fields": { + "code": 301, + "sr_display": "name=(003,301,test1.foo.com,https://goo.com/$1) code=(301) when=(http.host eq \"test1.foo.com\" and http.request.uri.path eq \"/\") then=(concat(\"https://goo.com\", http.request.uri.path))", + "sr_name": "003,301,test1.foo.com,https://goo.com/$1", + "sr_then": "concat(\"https://goo.com\", http.request.uri.path)", + "sr_when": "http.host eq \"test1.foo.com\" and http.request.uri.path eq \"/\"" + }, + "filepos": "[line:9:5]", + "name": "@", + "name_raw": "@", + "name_unicode": "@", + "target": "test1.foo.com,https://goo.com/$1", + "ttl": 1, + "type": "CLOUDFLAREAPI_SINGLE_REDIRECT" + }, + { + "fields": { + "code": 302, + "sr_display": "name=(004,302,test2.foo.com,https://goo.com/$1) code=(302) when=(http.host eq \"test2.foo.com\" and http.request.uri.path eq \"/\") then=(concat(\"https://goo.com\", http.request.uri.path))", + "sr_name": "004,302,test2.foo.com,https://goo.com/$1", + "sr_then": "concat(\"https://goo.com\", http.request.uri.path)", + "sr_when": "http.host eq \"test2.foo.com\" and http.request.uri.path eq \"/\"" + }, + "filepos": "[line:10:5]", + "name": "@", + "name_raw": "@", + "name_unicode": "@", + "target": "test2.foo.com,https://goo.com/$1", + "ttl": 1, + "type": "CLOUDFLAREAPI_SINGLE_REDIRECT" + }, { "filepos": "[line:6:5]", "name": "test1.foo.com.sub", diff --git a/pkg/js/parse_tests/036-dextendcf/foo.com.zone b/pkg/js/parse_tests/036-dextendcf/foo.com.zone index e8a1ba02c..3e481e8a0 100644 --- a/pkg/js/parse_tests/036-dextendcf/foo.com.zone +++ b/pkg/js/parse_tests/036-dextendcf/foo.com.zone @@ -1,7 +1,7 @@ $TTL 300 -;@ IN CF_REDIRECT test1.foo.com,https://goo.com/$1 -;@ IN CF_TEMP_REDIRECT test2.foo.com,https://goo.com/$1 ;@ IN CF_WORKER_ROUTE test3.foo.com,test-worker +;@ 1 IN CLOUDFLAREAPI_SINGLE_REDIRECT test1.foo.com,https://goo.com/$1 +;@ 1 IN CLOUDFLAREAPI_SINGLE_REDIRECT test2.foo.com,https://goo.com/$1 test1.foo.com.sub IN A 10.2.3.1 test2.foo.com.sub IN A 10.2.3.2 -test3.foo.com.sub IN A 10.2.3.3 +test3.foo.com.sub IN A 10.2.3.3 \ No newline at end of file diff --git a/pkg/js/parse_tests/050-cfSingleRedirect.json b/pkg/js/parse_tests/050-cfSingleRedirect.json index 380b1022e..d835df9db 100644 --- a/pkg/js/parse_tests/050-cfSingleRedirect.json +++ b/pkg/js/parse_tests/050-cfSingleRedirect.json @@ -7,63 +7,87 @@ "dnscontrol_uniquename": "foo.com" }, "name": "foo.com", - "rawrecords": [ - { - "args": [ - "name1", - 301, - "when1", - "then1" - ], - "type": "CLOUDFLAREAPI_SINGLE_REDIRECT" - }, - { - "args": [ - "name2", - 302, - "when2", - "then2" - ], - "type": "CLOUDFLAREAPI_SINGLE_REDIRECT" - }, - { - "args": [ - "name3", - "301", - "when3", - "then3" - ], - "type": "CLOUDFLAREAPI_SINGLE_REDIRECT" - }, - { - "args": [ - "namettl", - 302, - "whenttl", - "thenttl" - ], - "ttl": 999, - "type": "CLOUDFLAREAPI_SINGLE_REDIRECT" - }, - { - "args": [ - "namemeta", - 302, - "whenmeta", - "thenmeta" - ], - "metas": [ - { - "metastr": "stringy" - }, - { - "metanum": 22 - } - ], - "type": "CLOUDFLAREAPI_SINGLE_REDIRECT" - } - ], "records": [ + { + "fields": { + "code": 301, + "sr_display": "name=(name1) code=(301) when=(when1) then=(then1)", + "sr_name": "name1", + "sr_then": "then1", + "sr_when": "when1" + }, + "filepos": "[line:5:5]", + "name": "@", + "name_raw": "@", + "name_unicode": "@", + "target": "name1", + "ttl": 1, + "type": "CLOUDFLAREAPI_SINGLE_REDIRECT" + }, + { + "fields": { + "code": 302, + "sr_display": "name=(name2) code=(302) when=(when2) then=(then2)", + "sr_name": "name2", + "sr_then": "then2", + "sr_when": "when2" + }, + "filepos": "[line:6:5]", + "name": "@", + "name_raw": "@", + "name_unicode": "@", + "target": "name2", + "ttl": 1, + "type": "CLOUDFLAREAPI_SINGLE_REDIRECT" + }, + { + "fields": { + "code": 301, + "sr_display": "name=(name3) code=(301) when=(when3) then=(then3)", + "sr_name": "name3", + "sr_then": "then3", + "sr_when": "when3" + }, + "filepos": "[line:7:5]", + "name": "@", + "name_raw": "@", + "name_unicode": "@", + "target": "name3", + "ttl": 1, + "type": "CLOUDFLAREAPI_SINGLE_REDIRECT" + }, + { + "fields": { + "code": 302, + "sr_display": "name=(namemeta) code=(302) when=(whenmeta) then=(thenmeta)", + "sr_name": "namemeta", + "sr_then": "thenmeta", + "sr_when": "whenmeta" + }, + "filepos": "[line:9:5]", + "name": "@", + "name_raw": "@", + "name_unicode": "@", + "target": "namemeta", + "ttl": 1, + "type": "CLOUDFLAREAPI_SINGLE_REDIRECT" + }, + { + "fields": { + "code": 302, + "sr_display": "name=(namettl) code=(302) when=(whenttl) then=(thenttl)", + "sr_name": "namettl", + "sr_then": "thenttl", + "sr_when": "whenttl" + }, + "filepos": "[line:8:5]", + "name": "@", + "name_raw": "@", + "name_unicode": "@", + "target": "namettl", + "ttl": 1, + "type": "CLOUDFLAREAPI_SINGLE_REDIRECT" + }, { "filepos": "[line:2:5]", "meta": { diff --git a/pkg/normalize/validate.go b/pkg/normalize/validate.go index 5c19e00b8..1c080ecea 100644 --- a/pkg/normalize/validate.go +++ b/pkg/normalize/validate.go @@ -55,6 +55,11 @@ func checkTarget(target string) error { // validateRecordTypes list of valid rec.Type values. Returns true if this is a real DNS record type, false means it is a pseudo-type used internally. func validateRecordTypes(rec *models.RecordConfig, domain string, pTypes []string) error { + if rec.IsModernType() { + // Modern types do their own validation. + return nil + } + // #rtype_variations validTypes := map[string]bool{ "A": true, @@ -175,6 +180,11 @@ func checkSoa(expire uint32, minttl uint32, refresh uint32, retry uint32, mbox s // checkTargets returns true if rec.Target is valid for the rec.Type. func checkTargets(rec *models.RecordConfig, domain string) (errs []error) { + if rec.IsModernType() { + // Modern types do their own validation. + return nil + } + label := rec.GetLabel() target := rec.GetTargetField() check := func(e error) { diff --git a/pkg/rtypecontrol/import.go b/pkg/rtypecontrol/import.go index d839db239..ddc43bdc4 100644 --- a/pkg/rtypecontrol/import.go +++ b/pkg/rtypecontrol/import.go @@ -15,10 +15,9 @@ func ImportRawRecords(domains []*models.DomainConfig) error { for _, rawRec := range dc.RawRecords { rec, err := NewRecordConfigFromRaw(rawRec.Type, rawRec.Args, dc) + rec.FilePos = models.FixPosition(rawRec.FilePos) if err != nil { - return fmt.Errorf("%s: %w", nil, err) - // TODO(tlim): Fix FilePos - //return fmt.Errorf("%s: %w", rawRec.FilePos, err) + return fmt.Errorf("%s: %w", rec.FilePos, err) } // Free memeory: @@ -44,7 +43,6 @@ func NewRecordConfigFromRaw(t string, args []any, dc *models.DomainConfig) (*mod Type: t, Name: args[0].(string), // May be fixed later. Metadata: map[string]string{}, - //FilePos: models.FixPosition(filePos), } setRecordNames(rec, dc, args[0].(string)) diff --git a/providers/cloudflare/cloudflareProvider.go b/providers/cloudflare/cloudflareProvider.go index 909a2325f..9c7b4e901 100644 --- a/providers/cloudflare/cloudflareProvider.go +++ b/providers/cloudflare/cloudflareProvider.go @@ -363,9 +363,6 @@ func (c *cloudflareProvider) mkDeleteCorrection(recType string, origRec *models. idTxt = origRec.Original.(cloudflare.WorkerRoute).ID case "CLOUDFLAREAPI_SINGLE_REDIRECT": idTxt = origRec.Original.(cloudflare.RulesetRule).ID - // case "": - // fmt.Printf("DEBUG: %q origRec.Original type is %T\nrec=%+v\n\n", recType, origRec.Original, *origRec) - // idTxt = origRec.Original.(cloudflare.RulesetRule).ID default: //fmt.Printf("DEBUG: %q rec=%+v origRec.Original type is %T\n", recType, *origRec, origRec.Original) fmt.Printf("SHOULD NOT HAPPEN: %q origRec.Original type is %T\n", recType, origRec.Original) diff --git a/providers/cloudflare/rtypes/cfsingleredirect/cfredirect.go b/providers/cloudflare/rtypes/cfsingleredirect/cfredirect.go index 6479e576f..dcdc15059 100644 --- a/providers/cloudflare/rtypes/cfsingleredirect/cfredirect.go +++ b/providers/cloudflare/rtypes/cfsingleredirect/cfredirect.go @@ -32,20 +32,20 @@ func (handle *CfTempRedirect) Name() string { return "CF_TEMP_REDIRECT" } -var services = map[string]int{} -var serviceMutex = sync.RWMutex{} +var redirCount = map[string]int{} +var redirCountMutex = sync.RWMutex{} -func inc(name string) { - serviceMutex.Lock() - defer serviceMutex.Unlock() +func incRedirCount(name string) { + redirCountMutex.Lock() + defer redirCountMutex.Unlock() - services[name]++ + redirCount[name]++ } -func get(name string) int { - serviceMutex.Lock() - defer serviceMutex.Unlock() - return services[name] +func getRedirCount(name string) int { + redirCountMutex.Lock() + defer redirCountMutex.Unlock() + return redirCount[name] } func (handle *CfTempRedirect) FromArgs(dc *models.DomainConfig, rec *models.RecordConfig, args []any) error { @@ -68,10 +68,16 @@ func FromArgs_helper(dc *models.DomainConfig, rec *models.RecordConfig, args []a return err } - inc(dc.UniqueName) - name := fmt.Sprintf("%03d,%03d,%s,%s", get(dc.UniqueName), code, prWhen, prThen) + incRedirCount(dc.UniqueName) + name := fmt.Sprintf("%03d,%03d,%s,%s", getRedirCount(dc.UniqueName), code, prWhen, prThen) + target := fmt.Sprintf("%s,%s", prWhen, prThen) sr := SingleRedirectConfig{} rec.Type = sr.Name() // This record is now a CLOUDFLAREAPI_SINGLE_REDIRECT - return sr.FromArgs(dc, rec, []any{name, code, srWhen, srThen}) + err = sr.FromArgs(dc, rec, []any{name, code, srWhen, srThen}) + if err != nil { + return err + } + rec.SetTarget(target) // Overwrite target to old-style for compatibility + return nil } diff --git a/providers/cloudflare/rtypes/cfsingleredirect/cfsingleredirect.go b/providers/cloudflare/rtypes/cfsingleredirect/cfsingleredirect.go index 698909d5c..b1485b9b9 100644 --- a/providers/cloudflare/rtypes/cfsingleredirect/cfsingleredirect.go +++ b/providers/cloudflare/rtypes/cfsingleredirect/cfsingleredirect.go @@ -15,11 +15,6 @@ func init() { type SingleRedirectConfig struct { // Code uint16 `json:"code,omitempty"` // 301 or 302 - // PR == PageRule - PRWhen string `json:"pr_when,omitempty"` - PRThen string `json:"pr_then,omitempty"` - PRPriority int `json:"pr_priority,omitempty"` // Really an identifier for the rule. - PRDisplay string `json:"pr_display,omitempty"` // How is this displayed to the user (SetTarget) for CF_REDIRECT/CF_TEMP_REDIRECT // // SR == SingleRedirect SRName string `json:"sr_name,omitempty"` // How is this displayed to the user @@ -53,18 +48,11 @@ func (handle *SingleRedirectConfig) FromArgs(dc *models.DomainConfig, rec *model } when = args[2].(string) then = args[3].(string) - //fmt.Printf("\n\nDEBUG: targetFromRaw(name=%q code=%03d when=%q then=%q)\n", name, code, when, then) display := targetFromRaw(name, code, when, then) - //fmt.Printf("DEBUG: targetFromRaw(name=%q code=%03d when=%q then=%q) display=%q\n\n\n", name, code, when, then, display) rec.F = &SingleRedirectConfig{ Code: code, // - PRWhen: "UNKNOWABLE", - PRThen: "UNKNOWABLE", - PRPriority: 0, - PRDisplay: "UNKNOWABLE", - // SRName: name, SRWhen: when, SRThen: then, @@ -82,7 +70,7 @@ func (handle *SingleRedirectConfig) FromArgs(dc *models.DomainConfig, rec *model rec.Comparable = display rec.ZonefilePartial = display - _ = rec.SetTarget(display) + _ = rec.SetTarget(name) return nil } diff --git a/providers/cloudflare/rtypes/cfsingleredirect/convert.go b/providers/cloudflare/rtypes/cfsingleredirect/convert.go index d4f87fe85..b234d236b 100644 --- a/providers/cloudflare/rtypes/cfsingleredirect/convert.go +++ b/providers/cloudflare/rtypes/cfsingleredirect/convert.go @@ -7,31 +7,6 @@ import ( "strings" ) -// // TranscodePRtoSR takes a PAGE_RULE record, stores transcoded versions of the fields, and makes the record a CLOUDFLAREAPI_SINGLE_REDDIRECT. -// func TranscodePRtoSR(rec *models.RecordConfig) error { -// //rec.Type = SINGLEREDIRECT // This record is now a CLOUDFLAREAPI_SINGLE_REDIRECT - -// // Extract the fields we're reading from: -// sr := rec.CloudflareRedirect -// code := sr.Code -// prWhen := sr.PRWhen -// prThen := sr.PRThen -// srName := sr.PRDisplay - -// // Convert old-style patterns to new-style rules: -// srWhen, srThen, err := makeRuleFromPattern(prWhen, prThen) -// if err != nil { -// return err -// } - -// // Fix the RecordConfig -// return makeSingleRedirectFromConvert(rec, -// sr.PRPriority, -// prWhen, prThen, -// code, -// srName, srWhen, srThen) -// } - // makeRuleFromPattern compile old-style patterns and replacements into new-style rules and expressions. func makeRuleFromPattern(pattern, replacement string) (string, string, error) { var srWhen, srThen string