Documentation
¶
Index ¶
- Constants
- Variables
- func AbsolutePathFromConfigPath(path string) string
- func EnsureDir(dir string) error
- func EnsureHostname(hostinfo *tailcfg.Hostinfo, machineKey, nodeKey string) string
- func GenerateIPv4DNSRootDomain(ipPrefix netip.Prefix) []dnsname.FQDN
- func GenerateIPv6DNSRootDomain(ipPrefix netip.Prefix) []dnsname.FQDN
- func GenerateRandomBytes(n int) ([]byte, error)
- func GenerateRandomStringDNSSafe(size int) (string, error)
- func GenerateRandomStringURLSafe(n int) (string, error)
- func GetFileMode(key string) fs.FileMode
- func GetIPPrefixEndpoints(na netip.Prefix) (netip.Addr, netip.Addr)
- func GrpcSocketDialer(ctx context.Context, addr string) (net.Conn, error)
- func IPSetAddrIter(ipSet *netipx.IPSet) iter.Seq[netip.Addr]
- func InvalidString() string
- func IsCI() bool
- func LogErr(err error, msg string)
- func MustGenerateRandomStringDNSSafe(size int) string
- func MustStringsToPrefixes(strings []string) []netip.Prefix
- func NormaliseHostname(name string) (string, error)
- func ParseIPSet(arg string, bits *int) (*netipx.IPSet, error)
- func ParseLoginURLFromCLILogin(output string) (*url.URL, error)
- func PrefixesToString(prefixes []netip.Prefix) []string
- func StringToIPPrefix(prefixes []string) ([]netip.Prefix, error)
- func TSLogfWrapper() logger.Logf
- func TailMapResponseToString(resp tailcfg.MapResponse) string
- func TailNodesToString(nodes []*tailcfg.Node) string
- func TailcfgFilterRulesToString(rules []tailcfg.FilterRule) string
- func TailscaleVersionNewerOrEqual(minimum, toCheck string) bool
- func ValidateHostname(name string) error
- func ValidateUsername(username string) error
- func YesNo(msg string) bool
- type DBLogWrapper
- func (l *DBLogWrapper) Error(ctx context.Context, msg string, data ...interface{})
- func (l *DBLogWrapper) Info(ctx context.Context, msg string, data ...interface{})
- func (l *DBLogWrapper) LogMode(gormLogger.LogLevel) gormLogger.Interface
- func (l *DBLogWrapper) ParamsFilter(ctx context.Context, sql string, params ...interface{}) (string, []interface{})
- func (l *DBLogWrapper) Trace(ctx context.Context, begin time.Time, ...)
- func (l *DBLogWrapper) Warn(ctx context.Context, msg string, data ...interface{})
- type DBLogWrapperOption
- type Traceroute
- type TraceroutePath
Constants ¶
const ( RegisterMethodAuthKey = "authkey" RegisterMethodOIDC = "oidc" RegisterMethodCLI = "cli" )
const ( ByteSize = 8 // value related to RFC 1123 and 952. LabelHostnameLength = 63 )
const ( Base8 = 8 Base10 = 10 BitSize16 = 16 BitSize32 = 32 BitSize64 = 64 PermissionFallback = 0o700 )
Variables ¶
var ( ErrCannotDecryptResponse = errors.New("cannot decrypt response") ZstdCompression = "zstd" )
var Comparers []cmp.Option = []cmp.Option{ IPComparer, PrefixComparer, AddrPortComparer, MkeyComparer, NkeyComparer, DkeyComparer, ViewSliceIPProtoComparer, }
var DkeyComparer = cmp.Comparer(func(x, y key.DiscoPublic) bool {
return x.String() == y.String()
})
var ErrInvalidHostName = errors.New("invalid hostname")
var MkeyComparer = cmp.Comparer(func(x, y key.MachinePublic) bool {
return x.String() == y.String()
})
var NkeyComparer = cmp.Comparer(func(x, y key.NodePublic) bool {
return x.String() == y.String()
})
var TheInternet = sync.OnceValue(func() *netipx.IPSet { var internetBuilder netipx.IPSetBuilder internetBuilder.AddPrefix(netip.MustParsePrefix("2000::/3")) internetBuilder.AddPrefix(tsaddr.AllIPv4()) internetBuilder.RemovePrefix(netip.MustParsePrefix("fc00::/7")) internetBuilder.RemovePrefix(netip.MustParsePrefix("10.0.0.0/8")) internetBuilder.RemovePrefix(netip.MustParsePrefix("172.16.0.0/12")) internetBuilder.RemovePrefix(netip.MustParsePrefix("192.168.0.0/16")) internetBuilder.RemovePrefix(tsaddr.TailscaleULARange()) internetBuilder.RemovePrefix(tsaddr.CGNATRange()) internetBuilder.RemovePrefix(netip.MustParsePrefix("fe80::/10")) internetBuilder.RemovePrefix(netip.MustParsePrefix("169.254.0.0/16")) theInternetSet, _ := internetBuilder.IPSet() return theInternetSet })
TheInternet returns the IPSet for the Internet. https://www.youtube.com/watch?v=iDbyYGrswtg
var ViewSliceIPProtoComparer = cmp.Comparer(func(a, b views.Slice[ipproto.Proto]) bool { return views.SliceEqual(a, b) })
Functions ¶
func EnsureHostname ¶ added in v0.27.0
SafeHostname extracts a hostname from Hostinfo, providing sensible defaults if Hostinfo is nil or Hostname is empty. This prevents nil pointer dereferences and ensures nodes always have a valid hostname. The hostname is truncated to 63 characters to comply with DNS label length limits (RFC 1123). EnsureHostname guarantees a valid hostname for node registration. This function never fails - it always returns a valid hostname.
Strategy: 1. If hostinfo is nil/empty → generate default from keys 2. If hostname is provided → normalise it 3. If normalisation fails → generate invalid-<random> replacement
Returns the guaranteed-valid hostname to use.
func GenerateIPv4DNSRootDomain ¶
From the netmask we can find out the wildcard bits (the bits that are not set in the netmask). This allows us to then calculate the subnets included in the subsequent class block and generate the entries.
func GenerateIPv6DNSRootDomain ¶
From the netmask we can find out the wildcard bits (the bits that are not set in the netmask). This allows us to then calculate the subnets included in the subsequent class block and generate the entries.
func GenerateRandomBytes ¶
GenerateRandomBytes returns securely generated random bytes. It will return an error if the system's secure random number generator fails to function correctly, in which case the caller should not continue.
func GenerateRandomStringDNSSafe ¶
GenerateRandomStringDNSSafe returns a DNS-safe securely generated random string. It will return an error if the system's secure random number generator fails to function correctly, in which case the caller should not continue.
func GenerateRandomStringURLSafe ¶
GenerateRandomStringURLSafe returns a URL-safe, base64 encoded securely generated random string. It will return an error if the system's secure random number generator fails to function correctly, in which case the caller should not continue.
func GetFileMode ¶
func IPSetAddrIter ¶ added in v0.26.0
IPSetAddrIter returns a function that iterates over all the IPs in the IPSet.
func InvalidString ¶ added in v0.27.0
func InvalidString() string
func MustGenerateRandomStringDNSSafe ¶ added in v0.26.0
func MustStringsToPrefixes ¶ added in v0.26.0
func NormaliseHostname ¶ added in v0.27.0
NormaliseHostname transforms a string into a valid DNS hostname. Returns error if the transformation results in an invalid hostname.
Transformations applied: - Converts to lowercase - Removes invalid DNS characters - Truncates to 63 characters if needed
After transformation, validates the result.
func ParseIPSet ¶
parseIPSet parses arg as one:
- an IP address (IPv4 or IPv6)
- the string "*" to match everything (both IPv4 & IPv6)
- a CIDR (e.g. "192.168.0.0/16")
- a range of two IPs, inclusive, separated by hyphen ("2eff::1-2eff::0800")
bits, if non-nil, is the legacy SrcBits CIDR length to make a IP address (without a slash) treated as a CIDR of *bits length. nolint
func ParseLoginURLFromCLILogin ¶ added in v0.25.1
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 PrefixesToString ¶ added in v0.26.0
func TSLogfWrapper ¶
func TailMapResponseToString ¶
func TailMapResponseToString(resp tailcfg.MapResponse) string
func TailNodesToString ¶
func TailcfgFilterRulesToString ¶ added in v0.26.0
func TailcfgFilterRulesToString(rules []tailcfg.FilterRule) string
func ValidateHostname ¶ added in v0.27.0
ValidateHostname checks if a hostname meets DNS requirements. This function does NOT modify the input - it only validates. The hostname must already be lowercase and contain only valid characters.
func ValidateUsername ¶ added in v0.24.0
ValidateUsername checks if a username is valid. It must be at least 2 characters long, start with a letter, and contain only letters, numbers, hyphens, dots, and underscores. It cannot contain more than one '@'. It cannot contain invalid characters.
Types ¶
type DBLogWrapper ¶
type DBLogWrapper struct {
Logger *zerolog.Logger
Level zerolog.Level
Event *zerolog.Event
SlowThreshold time.Duration
SkipErrRecordNotFound bool
ParameterizedQueries bool
}
func NewDBLogWrapper ¶
func (*DBLogWrapper) Error ¶
func (l *DBLogWrapper) Error(ctx context.Context, msg string, data ...interface{})
func (*DBLogWrapper) Info ¶
func (l *DBLogWrapper) Info(ctx context.Context, msg string, data ...interface{})
func (*DBLogWrapper) LogMode ¶
func (l *DBLogWrapper) LogMode(gormLogger.LogLevel) gormLogger.Interface
func (*DBLogWrapper) ParamsFilter ¶
func (l *DBLogWrapper) ParamsFilter(ctx context.Context, sql string, params ...interface{}) (string, []interface{})
type DBLogWrapperOption ¶
type DBLogWrapperOption func(*DBLogWrapper)
type Traceroute ¶ added in v0.26.0
type Traceroute struct {
// Hostname is the resolved hostname or IP address identifying the target
Hostname string
// IP is the IP address of the target
IP netip.Addr
// Route is the path taken to reach the target if successful. The list is ordered by the path taken.
Route []TraceroutePath
// Success indicates if the traceroute was successful.
Success bool
// Err contains an error if the traceroute was not successful.
Err error
}
func ParseTraceroute ¶ added in v0.26.0
func ParseTraceroute(output string) (Traceroute, error)
ParseTraceroute parses the output of the traceroute command and returns a Traceroute struct.
type TraceroutePath ¶ added in v0.26.0
type TraceroutePath struct {
// Hop is the current jump in the total traceroute.
Hop int
// Hostname is the resolved hostname or IP address identifying the jump
Hostname string
// IP is the IP address of the jump
IP netip.Addr
// Latencies is a list of the latencies for this jump
Latencies []time.Duration
}