Skip to content

Commit 917ebcc

Browse files
authored
Merge pull request #1813 from stgraber/osarch
Extend OS detection logic
2 parents ec31d80 + 3b056f9 commit 917ebcc

File tree

5 files changed

+73
-39
lines changed

5 files changed

+73
-39
lines changed

cmd/incus-agent/state.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -250,10 +250,10 @@ func osState() *api.InstanceStateOSInfo {
250250
osInfo := &api.InstanceStateOSInfo{}
251251

252252
// Get information about the OS.
253-
lsbRelease, err := osarch.GetLSBRelease()
253+
lsbRelease, err := osarch.GetOSRelease()
254254
if err == nil {
255255
osInfo.OS = lsbRelease["NAME"]
256-
osInfo.OSVersion = lsbRelease["VERSION"]
256+
osInfo.OSVersion = lsbRelease["VERSION_ID"]
257257
}
258258

259259
// Get information about the kernel version.

internal/server/sys/os.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ func (s *OS) Init() ([]cluster.Warning, error) {
178178
s.CGInfo = cgroup.GetInfo()
179179

180180
// Fill in the OS release info.
181-
osInfo, err := osarch.GetLSBRelease()
181+
osInfo, err := osarch.GetOSRelease()
182182
if err != nil {
183183
return nil, err
184184
}

internal/version/platform_linux.go

+7-19
Original file line numberDiff line numberDiff line change
@@ -3,42 +3,30 @@
33
package version
44

55
import (
6-
"os"
76
"strings"
87

98
"github.com/lxc/incus/v6/internal/linux"
109
"github.com/lxc/incus/v6/shared/osarch"
11-
"github.com/lxc/incus/v6/shared/util"
1210
)
1311

1412
func getPlatformVersionStrings() []string {
1513
versions := []string{}
1614

17-
// Add kernel version
15+
// Add kernel version.
1816
uname, err := linux.Uname()
1917
if err != nil {
2018
return versions
2119
}
2220

2321
versions = append(versions, strings.Split(uname.Release, "-")[0])
2422

25-
// Add distribution info
26-
lsbRelease, err := osarch.GetLSBRelease()
27-
if err == nil {
28-
for _, key := range []string{"NAME", "VERSION_ID"} {
29-
value, ok := lsbRelease[key]
30-
if ok {
31-
versions = append(versions, value)
32-
}
33-
}
34-
}
23+
// Add distribution info.
24+
osRelease, err := osarch.GetOSRelease()
25+
if err == nil && osRelease["NAME"] != "" {
26+
versions = append(versions, osRelease["NAME"])
3527

36-
// Add chromebook info
37-
if len(versions) == 1 && util.PathExists("/run/cros_milestone") {
38-
content, err := os.ReadFile("/run/cros_milestone")
39-
if err == nil {
40-
versions = append(versions, "Chrome OS")
41-
versions = append(versions, strings.TrimSpace(string(content)))
28+
if osRelease["VERSION_ID"] != "" {
29+
versions = append(versions, osRelease["VERSION_ID"])
4230
}
4331
}
4432

shared/osarch/release.go

+53-7
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,65 @@ import (
66
"io/fs"
77
"os"
88
"strings"
9+
10+
"github.com/lxc/incus/v6/shared/util"
911
)
1012

11-
// GetLSBRelease returns a map with Linux distribution information.
12-
func GetLSBRelease() (map[string]string, error) {
13-
osRelease, err := getLSBRelease("/etc/os-release")
14-
if errors.Is(err, fs.ErrNotExist) {
15-
return getLSBRelease("/usr/lib/os-release")
13+
// GetOSRelease returns a map with Linux distribution information.
14+
func GetOSRelease() (map[string]string, error) {
15+
// Handle TrueNAS.
16+
if util.PathExists("/usr/share/truenas") {
17+
content, err := os.ReadFile("/etc/version")
18+
if err == nil {
19+
return map[string]string{
20+
"NAME": "TrueNAS Scale",
21+
"VERSION_ID": strings.TrimSpace(string(content)),
22+
}, nil
23+
}
24+
}
25+
26+
// Add chromebook info
27+
if util.PathExists("/run/cros_milestone") {
28+
content, err := os.ReadFile("/run/cros_milestone")
29+
if err == nil {
30+
return map[string]string{
31+
"NAME": "Chrome OS",
32+
"VERSION_ID": strings.TrimSpace(string(content)),
33+
}, nil
34+
}
35+
}
36+
37+
// Parse OS release files.
38+
for _, osPath := range []string{"/etc/os-release", "/usr/lib/os-release"} {
39+
osRelease, err := getOSRelease(osPath)
40+
if err != nil {
41+
if errors.Is(err, fs.ErrNotExist) {
42+
continue
43+
}
44+
45+
return nil, err
46+
}
47+
48+
// Check if we have what we need.
49+
if osRelease["IMAGE_ID"] != "" {
50+
return map[string]string{
51+
"NAME": osRelease["IMAGE_ID"],
52+
"VERSION_ID": osRelease["IMAGE_VERSION"],
53+
}, nil
54+
}
55+
56+
if osRelease["NAME"] != "" {
57+
return map[string]string{
58+
"NAME": osRelease["NAME"],
59+
"VERSION_ID": osRelease["VERSION_ID"],
60+
}, nil
61+
}
1662
}
1763

18-
return osRelease, err
64+
return map[string]string{}, nil
1965
}
2066

21-
func getLSBRelease(filename string) (map[string]string, error) {
67+
func getOSRelease(filename string) (map[string]string, error) {
2268
osRelease := make(map[string]string)
2369

2470
data, err := os.ReadFile(filename)

shared/osarch/release_test.go

+10-10
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ func TestReleaseTestSuite(t *testing.T) {
1515
suite.Run(t, new(releaseTestSuite))
1616
}
1717

18-
func (s *releaseTestSuite) TestGetLSBRelease() {
18+
func (s *releaseTestSuite) TestGetOSRelease() {
1919
content := `NAME="Ubuntu"
2020
ID="ubuntu"
2121
VERSION_ID="16.04"
2222
`
2323
filename, cleanup := WriteTempFile(&s.Suite, "", "os-release", content)
2424
defer cleanup()
2525

26-
lsbRelease, err := getLSBRelease(filename)
26+
lsbRelease, err := getOSRelease(filename)
2727
s.Nil(err)
2828
s.Equal(
2929
map[string]string{
@@ -33,27 +33,27 @@ VERSION_ID="16.04"
3333
}, lsbRelease)
3434
}
3535

36-
func (s *releaseTestSuite) TestGetLSBReleaseSingleQuotes() {
36+
func (s *releaseTestSuite) TestGetOSReleaseSingleQuotes() {
3737
content := `NAME='Ubuntu'`
3838
filename, cleanup := WriteTempFile(&s.Suite, "", "os-release", content)
3939
defer cleanup()
4040

41-
lsbRelease, err := getLSBRelease(filename)
41+
lsbRelease, err := getOSRelease(filename)
4242
s.Nil(err)
4343
s.Equal(map[string]string{"NAME": "Ubuntu"}, lsbRelease)
4444
}
4545

46-
func (s *releaseTestSuite) TestGetLSBReleaseNoQuotes() {
46+
func (s *releaseTestSuite) TestGetOSReleaseNoQuotes() {
4747
content := `NAME=Ubuntu`
4848
filename, cleanup := WriteTempFile(&s.Suite, "", "os-release", content)
4949
defer cleanup()
5050

51-
lsbRelease, err := getLSBRelease(filename)
51+
lsbRelease, err := getOSRelease(filename)
5252
s.Nil(err)
5353
s.Equal(map[string]string{"NAME": "Ubuntu"}, lsbRelease)
5454
}
5555

56-
func (s *releaseTestSuite) TestGetLSBReleaseSkipCommentsEmpty() {
56+
func (s *releaseTestSuite) TestGetOSReleaseSkipCommentsEmpty() {
5757
content := `
5858
NAME="Ubuntu"
5959
@@ -64,7 +64,7 @@ VERSION_ID="16.04"
6464
filename, cleanup := WriteTempFile(&s.Suite, "", "os-release", content)
6565
defer cleanup()
6666

67-
lsbRelease, err := getLSBRelease(filename)
67+
lsbRelease, err := getOSRelease(filename)
6868
s.Nil(err)
6969
s.Equal(
7070
map[string]string{
@@ -74,7 +74,7 @@ VERSION_ID="16.04"
7474
}, lsbRelease)
7575
}
7676

77-
func (s *releaseTestSuite) TestGetLSBReleaseInvalidLine() {
77+
func (s *releaseTestSuite) TestGetOSReleaseInvalidLine() {
7878
content := `
7979
NAME="Ubuntu"
8080
this is invalid
@@ -83,6 +83,6 @@ ID="ubuntu"
8383
filename, cleanup := WriteTempFile(&s.Suite, "", "os-release", content)
8484
defer cleanup()
8585

86-
_, err := getLSBRelease(filename)
86+
_, err := getOSRelease(filename)
8787
s.EqualError(err, fmt.Sprintf("%s: invalid format on line 3", filename))
8888
}

0 commit comments

Comments
 (0)