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  }