@ -20,27 +20,33 @@ import (
"tailscale.com/version"
"tailscale.com/version"
)
)
var osVersion func ( ) string // non-nil on some platforms
// New returns a partially populated Hostinfo for the current host.
// New returns a partially populated Hostinfo for the current host.
func New ( ) * tailcfg . Hostinfo {
func New ( ) * tailcfg . Hostinfo {
hostname , _ := os . Hostname ( )
hostname , _ := os . Hostname ( )
hostname = dnsname . FirstLabel ( hostname )
hostname = dnsname . FirstLabel ( hostname )
var osv string
if osVersion != nil {
osv = osVersion ( )
}
return & tailcfg . Hostinfo {
return & tailcfg . Hostinfo {
IPNVersion : version . Long ,
IPNVersion : version . Long ,
Hostname : hostname ,
Hostname : hostname ,
OS : version . OS ( ) ,
OS : version . OS ( ) ,
OSVersion : osv ,
OSVersion : getOSVersion ( ) ,
Package : packageType ( ) ,
Package : packageType ( ) ,
GoArch : runtime . GOARCH ,
GoArch : runtime . GOARCH ,
DeviceModel : deviceModel ( ) ,
DeviceModel : deviceModel ( ) ,
}
}
}
}
var osVersion func ( ) string // non-nil on some platforms
func getOSVersion ( ) string {
if s , _ := osVersionAtomic . Load ( ) . ( string ) ; s != "" {
return s
}
if osVersion != nil {
return osVersion ( )
}
return ""
}
func packageType ( ) string {
func packageType ( ) string {
switch runtime . GOOS {
switch runtime . GOOS {
case "windows" :
case "windows" :
@ -86,11 +92,17 @@ func GetEnvType() EnvType {
return e
return e
}
}
var deviceModelAtomic atomic . Value // of string
var (
deviceModelAtomic atomic . Value // of string
osVersionAtomic atomic . Value // of string
)
// SetDeviceModel sets the device model for use in Hostinfo updates.
// SetDeviceModel sets the device model for use in Hostinfo updates.
func SetDeviceModel ( model string ) { deviceModelAtomic . Store ( model ) }
func SetDeviceModel ( model string ) { deviceModelAtomic . Store ( model ) }
// SetOSVersion sets the OS version.
func SetOSVersion ( v string ) { osVersionAtomic . Store ( v ) }
func deviceModel ( ) string {
func deviceModel ( ) string {
s , _ := deviceModelAtomic . Load ( ) . ( string )
s , _ := deviceModelAtomic . Load ( ) . ( string )
return s
return s