2024-02-18 23:22:18 +01:00
|
|
|
package util
|
|
|
|
|
2025-02-25 09:16:07 -08:00
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
"net/url"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"tailscale.com/util/cmpver"
|
|
|
|
)
|
2024-02-18 23:22:18 +01:00
|
|
|
|
|
|
|
func TailscaleVersionNewerOrEqual(minimum, toCheck string) bool {
|
|
|
|
if cmpver.Compare(minimum, toCheck) <= 0 ||
|
|
|
|
toCheck == "unstable" ||
|
|
|
|
toCheck == "head" {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
return false
|
|
|
|
}
|
2025-02-25 09:16:07 -08:00
|
|
|
|
|
|
|
// ParseLoginURLFromCLILogin parses the output of the tailscale up command to extract the login URL.
|
|
|
|
// It returns an error if not exactly one URL is found.
|
|
|
|
func ParseLoginURLFromCLILogin(output string) (*url.URL, error) {
|
|
|
|
lines := strings.Split(output, "\n")
|
|
|
|
var urlStr string
|
|
|
|
|
|
|
|
for _, line := range lines {
|
|
|
|
line = strings.TrimSpace(line)
|
|
|
|
if strings.HasPrefix(line, "http://") || strings.HasPrefix(line, "https://") {
|
|
|
|
if urlStr != "" {
|
|
|
|
return nil, fmt.Errorf("multiple URLs found: %s and %s", urlStr, line)
|
|
|
|
}
|
|
|
|
urlStr = line
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if urlStr == "" {
|
|
|
|
return nil, errors.New("no URL found")
|
|
|
|
}
|
|
|
|
|
|
|
|
loginURL, err := url.Parse(urlStr)
|
|
|
|
if err != nil {
|
|
|
|
return nil, fmt.Errorf("failed to parse URL: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return loginURL, nil
|
|
|
|
}
|