github.com/telepresenceio/telepresence/v2@v2.20.0-pro.6.0.20240517030216-236ea954e789/pkg/client/cli/connect/version_check.go (about) 1 package connect 2 3 import ( 4 "context" 5 "fmt" 6 "regexp" 7 "strings" 8 9 "github.com/blang/semver/v4" 10 empty "google.golang.org/protobuf/types/known/emptypb" 11 12 "github.com/telepresenceio/telepresence/v2/pkg/client/cli/daemon" 13 "github.com/telepresenceio/telepresence/v2/pkg/errcat" 14 "github.com/telepresenceio/telepresence/v2/pkg/version" 15 ) 16 17 var validPrerelRx = regexp.MustCompile(`^[a-z]+\.\d+$`) 18 19 func versionCheck(ctx context.Context, daemonBinary string, userD *daemon.UserClient) error { 20 // Ensure that the already running daemons have the correct version 21 vu, err := userD.Version(ctx, &empty.Empty{}) 22 if err != nil { 23 return fmt.Errorf("unable to retrieve version of User Daemon: %w", err) 24 } 25 if userD.Containerized() { 26 // The user-daemon is remote (in a docker container, most likely). Compare the major, minor, and patch. Only 27 // compare pre-release if it's rc.X or test.X, and don't check if the binaries match. 28 cv := version.Structured 29 uv, err := semver.Parse(strings.TrimPrefix(vu.Version, "v")) 30 if err == nil && cv.Major == uv.Major && cv.Minor == uv.Minor && cv.Patch == uv.Patch { 31 if len(cv.Pre) != 1 { 32 // Prerelease does not consist of exactly one element, so it either doesn't exist or we don't care about it. 33 return nil 34 } 35 if pv := cv.Pre[0].VersionStr; !validPrerelRx.MatchString(pv) || len(uv.Pre) == 1 && pv == uv.Pre[0].VersionStr { 36 // Either not a prerelease that we care about comparing, or the prerelease was exactly equal. 37 return nil 38 } 39 } 40 return errcat.User.Newf("version mismatch. Client %s != remote user daemon %s", version.Version, vu.Version) 41 } 42 if version.Version != vu.Version { 43 // OSS Version mismatch. We never allow this 44 return errcat.User.Newf("version mismatch. Client %s != user daemon %s, please run 'telepresence quit -s' and reconnect", 45 version.Version, vu.Version) 46 } 47 if daemonBinary != "" && vu.Executable != daemonBinary { 48 return errcat.User.Newf("executable mismatch. Connector using %s, configured to use %s, please run 'telepresence quit -s' and reconnect", 49 vu.Executable, daemonBinary) 50 } 51 vr, err := userD.RootDaemonVersion(ctx, &empty.Empty{}) 52 if err == nil && version.Version != vr.Version { 53 return errcat.User.Newf("version mismatch. Client %s != Root Daemon %s, please run 'telepresence quit -s' and reconnect", 54 version.Version, vr.Version) 55 } 56 return nil 57 }