From 52d5089db1a98d64244957ccbb963e13b3b7dbf4 Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Thu, 12 Oct 2023 16:43:22 +0200 Subject: [PATCH] Use shlex to parse version.txt --- platform/api/azure/image.go | 19 ++++++--------- sdk/version.go | 46 ++++++++++++++++++------------------- 2 files changed, 30 insertions(+), 35 deletions(-) diff --git a/platform/api/azure/image.go b/platform/api/azure/image.go index a678f508f..4e2af3d0b 100644 --- a/platform/api/azure/image.go +++ b/platform/api/azure/image.go @@ -24,6 +24,8 @@ import ( "net/http" "strings" + "github.com/flatcar/mantle/sdk" + "github.com/Azure/azure-sdk-for-go/services/classic/management" "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2021-03-01/compute" "github.com/Azure/azure-sdk-for-go/services/resources/mgmt/2020-10-01/resources" @@ -203,17 +205,10 @@ func (a *API) resolveImage() error { return fmt.Errorf("unable to fetch release bucket %v version: %v", a.Opts.Sku, err) } - scanner := bufio.NewScanner(resp.Body) - for scanner.Scan() { - line := strings.SplitN(scanner.Text(), "=", 2) - if len(line) != 2 { - continue - } - if line[0] == "FLATCAR_VERSION" { - a.Opts.Version = line[1] - return nil - } + versions, err := sdk.ParseFlatcarVersions(resp.Body) + if err != nil { + return fmt.Errorf("couldn't parse version.txt: %v", err) } - - return fmt.Errorf("couldn't find FLATCAR_VERSION in version.txt") + a.Opts.Version = versions.Version + return nil } diff --git a/sdk/version.go b/sdk/version.go index f3face86d..d7380b8de 100644 --- a/sdk/version.go +++ b/sdk/version.go @@ -17,6 +17,7 @@ package sdk import ( "bufio" "fmt" + "io" "io/ioutil" "os" "os/exec" @@ -24,6 +25,8 @@ import ( "regexp" "strings" "time" + + "github.com/google/go-shlex" ) const ( @@ -37,39 +40,32 @@ type Versions struct { SDKVersion string } -func unquote(s string) string { - if len(s) < 2 { - return s - } - for _, q := range []byte{'\'', '"'} { - if s[0] == q && s[len(s)-1] == q { - return s[1 : len(s)-1] +func parseVersions(r io.Reader, prefix string) (ver Versions, err error) { + l := shlex.NewLexer(r) + for { + token, err2 := l.Next() + if err2 != nil { + if err2 == io.EOF { + break + } + err = err2 + return } - } - return s -} - -func parseVersions(f *os.File, prefix string) (ver Versions, err error) { - scanner := bufio.NewScanner(f) - for scanner.Scan() { - line := strings.SplitN(scanner.Text(), "=", 2) + line := strings.SplitN(token, "=", 2) if len(line) != 2 { continue } switch line[0] { case prefix + "VERSION": - ver.Version = unquote(line[1]) + ver.Version = line[1] case prefix + "VERSION_ID": - ver.VersionID = unquote(line[1]) + ver.VersionID = line[1] case prefix + "BUILD_ID": - ver.BuildID = unquote(line[1]) + ver.BuildID = line[1] case prefix + "SDK_VERSION": - ver.SDKVersion = unquote(line[1]) + ver.SDKVersion = line[1] } } - if err = scanner.Err(); err != nil { - return - } if ver.VersionID == "" { err = fmt.Errorf("Missing %sVERSION_ID in %s", prefix, f.Name()) @@ -80,6 +76,10 @@ func parseVersions(f *os.File, prefix string) (ver Versions, err error) { return } +func ParseFlatcarVersions(r io.Reader) (Versions, error) { + return parseVersions(r, "FLATCAR_") +} + func OSRelease(root string) (ver Versions, err error) { f, err := os.Open(filepath.Join(root, "usr/lib/os-release")) if err != nil { @@ -114,7 +114,7 @@ func VersionsFromDir(dir string) (ver Versions, err error) { } defer f.Close() - ver, err = parseVersions(f, "FLATCAR_") + ver, err = ParseFlacarVersions(f) if ver.SDKVersion == "" { err = fmt.Errorf("Missing FLATCAR_SDK_VERSION in %s", f.Name()) }