diff --git a/agent/pkg/agent/config.go b/agent/pkg/agent/config.go index 673994a7..4a5b34c4 100644 --- a/agent/pkg/agent/config.go +++ b/agent/pkg/agent/config.go @@ -81,14 +81,6 @@ func (cfg *AgentConfig) Parse(addr string) error { return nil } -func withoutBuildTime(version string) string { - return strings.Split(version, "-")[0] -} - -func checkVersion(a, b string) bool { - return withoutBuildTime(a) == withoutBuildTime(b) -} - func (cfg *AgentConfig) InitWithCerts(ctx context.Context, ca, crt, key []byte) error { clientCert, err := tls.X509KeyPair(crt, key) if err != nil { @@ -120,10 +112,10 @@ func (cfg *AgentConfig) InitWithCerts(ctx context.Context, ca, crt, key []byte) return err } - versionStr := string(version) - // skip version check for dev versions - if strings.HasPrefix(versionStr, "v") && !checkVersion(versionStr, pkg.GetVersion().String()) { - return gperr.Errorf("agent version mismatch: server: %s, agent: %s", pkg.GetVersion(), versionStr) + agentVer := pkg.ParseVersion(string(version)) + serverVer := pkg.GetVersion() + if !agentVer.IsEqual(serverVer) { + return gperr.Errorf("agent version mismatch: server: %s, agent: %s", serverVer, agentVer) } // get agent name diff --git a/internal/docker/client.go b/internal/docker/client.go index 99abccc0..c3ba621f 100644 --- a/internal/docker/client.go +++ b/internal/docker/client.go @@ -27,6 +27,7 @@ type ( refCount uint32 closedOn int64 + key string addr string dial func(ctx context.Context) (net.Conn, error) } @@ -179,6 +180,7 @@ func NewClient(host string) (*SharedClient, error) { Client: client, refCount: 1, addr: addr, + key: host, dial: dial, } @@ -197,7 +199,7 @@ func NewClient(host string) (*SharedClient, error) { } func (c *SharedClient) Key() string { - return c.DaemonHost() + return c.key } func (c *SharedClient) Address() string { diff --git a/pkg/json/struct.go b/pkg/json/struct.go index 1d7415ed..eb066e0c 100644 --- a/pkg/json/struct.go +++ b/pkg/json/struct.go @@ -79,13 +79,15 @@ func flattenFields(t reflect.Type) []*field { f.marshal = appendMarshal } if structField.Anonymous { - if structField.Type.Kind() == reflect.Pointer { - f.inner = flattenFields(structField.Type.Elem()) + t := structField.Type + if t.Kind() == reflect.Pointer { + t = t.Elem() f.omitEmpty = true - } else { - f.inner = flattenFields(structField.Type) } - f.hasInner = len(f.inner) > 0 + if t.Kind() == reflect.Struct { + f.inner = flattenFields(t) + f.hasInner = len(f.inner) > 0 + } } fields = append(fields, f) if f.omitEmpty { diff --git a/pkg/version.go b/pkg/version.go index a80be0b8..7d8e0a58 100644 --- a/pkg/version.go +++ b/pkg/version.go @@ -20,7 +20,7 @@ func GetLastVersion() Version { } func init() { - currentVersion = parseVersion(version) + currentVersion = ParseVersion(version) // ignore errors versionFile := filepath.Join(common.DataDir, "version") @@ -28,7 +28,7 @@ func init() { f, err := os.OpenFile(versionFile, os.O_RDWR|os.O_CREATE, 0o644) if err == nil { _, err = fmt.Fscanf(f, "%s", &lastVersionStr) - lastVersion = parseVersion(lastVersionStr) + lastVersion = ParseVersion(lastVersionStr) } if err != nil && !os.IsNotExist(err) { logging.Warn().Err(err).Msg("failed to read version file") @@ -89,7 +89,7 @@ var ( lastVersion Version ) -func parseVersion(v string) (ver Version) { +func ParseVersion(v string) (ver Version) { if v == "" { return }