From 53306235dc3b0c76f4b38d80315b69628e1f59d1 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Wed, 11 Jan 2023 22:31:00 +0700 Subject: [PATCH] all: uninstall service if got invalid config from API --- cmd/ctrld/cli.go | 17 +++++++++++++++-- internal/controld/config.go | 19 +++++++++++++------ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/cmd/ctrld/cli.go b/cmd/ctrld/cli.go index d9deab8..6549f39 100644 --- a/cmd/ctrld/cli.go +++ b/cmd/ctrld/cli.go @@ -348,7 +348,7 @@ func readConfigFile(writeDefaultConfig bool) bool { // If err == nil, there's a config supplied via `--config`, no default config written. err := v.ReadInConfig() if err == nil { - fmt.Println("loading config file from: ", v.ConfigFileUsed()) + fmt.Println("loading config file from:", v.ConfigFileUsed()) return true } @@ -419,8 +419,21 @@ func processCDFlags() { return } resolverConfig, err := controld.FetchResolverConfig(cdUID) + if uer, ok := err.(*controld.UtilityErrorResponse); ok && uer.ErrorField.Code == controld.InvalidConfigCode { + s, err := service.New(&prog{}, svcConfig) + if err != nil { + stderrMsg(err.Error()) + return + } + tasks := []task{{s.Uninstall, true}} + if doTasks(tasks) { + log.Println("uninstalled service") + } + log.Fatalf("failed to fetch resolver config: %v", uer) + } if err != nil { - log.Fatalf("failed to fetch resolver config: %v", err) + log.Printf("could not fetch resolver config: %v", err) + return } cfg = ctrld.Config{} diff --git a/internal/controld/config.go b/internal/controld/config.go index ca6303b..3ca1c5b 100644 --- a/internal/controld/config.go +++ b/internal/controld/config.go @@ -3,13 +3,15 @@ package controld import ( "bytes" "encoding/json" - "errors" "fmt" "net/http" "time" ) -const resolverDataURL = "https://api.controld.com/utility" +const ( + resolverDataURL = "https://api.controld.com/utility" + InvalidConfigCode = 40401 +) // ResolverConfig represents Control D resolver data. type ResolverConfig struct { @@ -24,12 +26,17 @@ type utilityResponse struct { } `json:"body"` } -type utilityErrorResponse struct { - Error struct { +type UtilityErrorResponse struct { + ErrorField struct { Message string `json:"message"` + Code int `json:"code"` } `json:"error"` } +func (u UtilityErrorResponse) Error() string { + return u.ErrorField.Message +} + type utilityRequest struct { UID string `json:"uid"` } @@ -53,11 +60,11 @@ func FetchResolverConfig(uid string) (*ResolverConfig, error) { defer resp.Body.Close() d := json.NewDecoder(resp.Body) if resp.StatusCode != http.StatusOK { - errResp := &utilityErrorResponse{} + errResp := &UtilityErrorResponse{} if err := d.Decode(errResp); err != nil { return nil, err } - return nil, errors.New(errResp.Error.Message) + return nil, errResp } ur := &utilityResponse{}