hostinfo_freebsd.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. // Copyright (c) Tailscale Inc & AUTHORS
  2. // SPDX-License-Identifier: BSD-3-Clause
  3. //go:build freebsd
  4. package hostinfo
  5. import (
  6. "bytes"
  7. "os"
  8. "os/exec"
  9. "golang.org/x/sys/unix"
  10. "tailscale.com/types/ptr"
  11. "tailscale.com/version/distro"
  12. )
  13. func init() {
  14. osVersion = lazyOSVersion.Get
  15. distroName = distroNameFreeBSD
  16. distroVersion = distroVersionFreeBSD
  17. }
  18. var (
  19. lazyVersionMeta = &lazyAtomicValue[versionMeta]{f: ptr.To(freebsdVersionMeta)}
  20. lazyOSVersion = &lazyAtomicValue[string]{f: ptr.To(osVersionFreeBSD)}
  21. )
  22. func distroNameFreeBSD() string {
  23. return lazyVersionMeta.Get().DistroName
  24. }
  25. func distroVersionFreeBSD() string {
  26. return lazyVersionMeta.Get().DistroVersion
  27. }
  28. type versionMeta struct {
  29. DistroName string
  30. DistroVersion string
  31. DistroCodeName string
  32. }
  33. func osVersionFreeBSD() string {
  34. var un unix.Utsname
  35. unix.Uname(&un)
  36. return unix.ByteSliceToString(un.Release[:])
  37. }
  38. func freebsdVersionMeta() (meta versionMeta) {
  39. d := distro.Get()
  40. meta.DistroName = string(d)
  41. switch d {
  42. case distro.Pfsense:
  43. b, _ := os.ReadFile("/etc/version")
  44. meta.DistroVersion = string(bytes.TrimSpace(b))
  45. case distro.OPNsense:
  46. b, _ := exec.Command("opnsense-version").Output()
  47. meta.DistroVersion = string(bytes.TrimSpace(b))
  48. case distro.TrueNAS:
  49. b, _ := os.ReadFile("/etc/version")
  50. meta.DistroVersion = string(bytes.TrimSpace(b))
  51. }
  52. return
  53. }