From 778852b76acd4d1fa0dac18ce4bbfc0742cce24f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=9F=E9=85=8C=20=E9=B5=AC=E5=85=84?= Date: Mon, 14 Mar 2022 12:19:06 +0900 Subject: [PATCH] Some error messages --- Dockerfile | 2 +- deploy/freedns-webhook/values.yaml | 6 ++-- freedns/freedns.go | 56 ++++++++++++++++++++++++------ 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/Dockerfile b/Dockerfile index 9b49cee..c0d84bf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.16-alpine AS build_deps +FROM golang:1.17-alpine AS build_deps RUN apk add --no-cache git diff --git a/deploy/freedns-webhook/values.yaml b/deploy/freedns-webhook/values.yaml index 239aa2a..a631632 100644 --- a/deploy/freedns-webhook/values.yaml +++ b/deploy/freedns-webhook/values.yaml @@ -1,19 +1,19 @@ # The GroupName here is used to identify your company or business unit that # created this webhook. -# For freedns, this may be "acme.mycompany.com". +# For freedns, this may be "acme.freedns.afraid.org". # This name will need to be referenced in each Issuer's `webhook` stanza to # inform cert-manager of where to send ChallengePayload resources in order to # solve the DNS01 challenge. # This group name should be **unique**, hence using your own company's domain # here is recommended. -groupName: acme.mycompany.com +groupName: acme.freedns.afraid.org certManager: namespace: cert-manager serviceAccountName: cert-manager image: - repository: mycompany/webhook-image + repository: penguinade/cert-manager-webhook-freedns tag: latest pullPolicy: IfNotPresent diff --git a/freedns/freedns.go b/freedns/freedns.go index 019ce9d..2e863b7 100755 --- a/freedns/freedns.go +++ b/freedns/freedns.go @@ -6,6 +6,7 @@ import ( "io/ioutil" "net/http" "net/url" + "strconv" "strings" logf "github.com/jetstack/cert-manager/pkg/logs" @@ -33,8 +34,6 @@ const URI_SUBDOMAIN_EDIT = "https://freedns.afraid.org/subdomain/edit.php?data_i const URI_LOGOUT = "https://freedns.afraid.org/logout/" const URI_DELETE_RECORD = "https://freedns.afraid.org/subdomain/delete2.php?data_id[]=%s&submit=delete%%20selected" -// const URI_LOGIN string = "http://127.0.0.1:1234/" - func LogInfo(Mesg string) { // fmt.Println(Mesg) logf.V(logf.InfoLevel).Info(Mesg) @@ -175,7 +174,7 @@ loop: for { attrKey, attrValue, moreAttr := htmlTokens.TagAttr() _href := string(attrValue) - if string(attrKey) == "href" && strings.Contains(_href, "/subdomain/?limit=") { + if string(attrKey) == "href" && strings.HasPrefix(_href, "/subdomain/?limit=") { dnsObj.DomainId = strings.TrimPrefix(_href, "/subdomain/?limit=") LogDebug(fmt.Sprintf("Domain id for \"%s\" is %s\n", DomainName, dnsObj.DomainId)) break loop @@ -222,6 +221,11 @@ func (dnsObj *FreeDNS) AddRecord(RecordType string, Subdomain string, Address st return nil } + // Try get a sense of the problem + var errorMesgs []string + lookForNextEl := 0 + lookForText := false + _strBuffer := "" htmlTokens := html.NewTokenizer(strings.NewReader(respStr)) loop: for { @@ -230,10 +234,40 @@ func (dnsObj *FreeDNS) AddRecord(RecordType string, Subdomain string, Address st case html.ErrorToken: break loop case html.TextToken: + _text := strings.TrimSpace(string(htmlTokens.Text())) + // Search for the "1 error" / "N errors" message + if strings.HasSuffix(_text, "error") || strings.HasSuffix(_text, "errors") { + _text = strings.TrimSpace(strings.TrimSuffix(strings.TrimSuffix(_text, "s"), "error")) + _n, _ := strconv.ParseInt(_text, 10, 8) + // + 1 because we are already inside a font tag + // The next closing is ourself + lookForNextEl = int(_n) + 1 + } else if lookForText { + _strBuffer = _strBuffer + _text + } + case html.StartTagToken: + _t, _ := htmlTokens.TagName() + tagName := string(_t) + if tagName == "font" && 0 < lookForNextEl { + lookForText = true + _strBuffer = "" + } + case html.EndTagToken: + _t, _ := htmlTokens.TagName() + tagName := string(_t) + if tagName == "font" && 0 < lookForNextEl { + lookForText = false + errorMesgs = append(errorMesgs, strings.TrimSpace(_strBuffer)) + lookForNextEl-- + } } } + if 0 < len(errorMesgs) { + return errors.New(strings.Join(errorMesgs, ", ")) + } + return errors.New("Unknown error while submitting record") } @@ -242,7 +276,7 @@ func (dnsObj *FreeDNS) AddRecord(RecordType string, Subdomain string, Address st return err } - if strings.Contains(_Location.Path, "/zc.php") { + if strings.HasPrefix(_Location.Path, "/zc.php") { LogDebug("Error on AddRecord: Cookie expired") return errors.New("dns_cookie maybe expired") } @@ -291,7 +325,7 @@ func (dnsObj *FreeDNS) FindRecord(Subdomain string, RecordType string, Address s CurrRecordType := "" CurrRecordAddr := "" CurrTagName := "" - lookForNextTD := 0 + lookForNextEl := 0 htmlTokens := html.NewTokenizer(strings.NewReader(respStr)) loop: @@ -301,13 +335,13 @@ loop: case html.ErrorToken: break loop case html.TextToken: - if CurrTagName == "a" && lookForNextTD == 1 && CurrRecordAddr == "" { + if CurrTagName == "a" && lookForNextEl == 1 && CurrRecordAddr == "" { CurrRecordAddr = strings.TrimSpace(string(htmlTokens.Text())) } else if CurrTagName == "td" { - if lookForNextTD == 1 { + if lookForNextEl == 1 { CurrRecordType = string(htmlTokens.Text()) - lookForNextTD = 2 - } else if lookForNextTD == 2 { + lookForNextEl = 2 + } else if lookForNextEl == 2 { _Addr := string(htmlTokens.Text()) if CurrRecordType == RecordType && CurrRecordAddr == Subdomain { if _Addr == Address { @@ -316,7 +350,7 @@ loop: DeepSearchCandidates = append(DeepSearchCandidates, CurrRecordId) } } - lookForNextTD = 0 + lookForNextEl = 0 } } /** Each record is displayed with the following structure @@ -336,7 +370,7 @@ loop: attrKey, attrValue, moreAttr := htmlTokens.TagAttr() _href := string(attrValue) if string(attrKey) == "href" && strings.Contains(_href, "edit.php?data_id=") { - lookForNextTD = 1 + lookForNextEl = 1 CurrRecordAddr = "" CurrRecordId = strings.TrimPrefix(_href, "edit.php?data_id=") break