...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package resource
19
20 import (
21 "fmt"
22 "os"
23
24 "golang.org/x/sys/unix"
25 )
26
27 type unameProvider func(buf *unix.Utsname) (err error)
28
29 var defaultUnameProvider unameProvider = unix.Uname
30
31 var currentUnameProvider = defaultUnameProvider
32
33 func setDefaultUnameProvider() {
34 setUnameProvider(defaultUnameProvider)
35 }
36
37 func setUnameProvider(unameProvider unameProvider) {
38 currentUnameProvider = unameProvider
39 }
40
41
42
43
44 func platformOSDescription() (string, error) {
45 uname, err := uname()
46 if err != nil {
47 return "", err
48 }
49
50 osRelease := osRelease()
51 if osRelease != "" {
52 return fmt.Sprintf("%s (%s)", osRelease, uname), nil
53 }
54
55 return uname, nil
56 }
57
58
59
60
61
62 func uname() (string, error) {
63 var utsName unix.Utsname
64
65 err := currentUnameProvider(&utsName)
66 if err != nil {
67 return "", err
68 }
69
70 return fmt.Sprintf("%s %s %s %s %s",
71 unix.ByteSliceToString(utsName.Sysname[:]),
72 unix.ByteSliceToString(utsName.Nodename[:]),
73 unix.ByteSliceToString(utsName.Release[:]),
74 unix.ByteSliceToString(utsName.Version[:]),
75 unix.ByteSliceToString(utsName.Machine[:]),
76 ), nil
77 }
78
79
80
81 func getFirstAvailableFile(candidates []string) (*os.File, error) {
82 for _, c := range candidates {
83 file, err := os.Open(c)
84 if err == nil {
85 return file, nil
86 }
87 }
88
89 return nil, fmt.Errorf("no candidate file available: %v", candidates)
90 }
91
View as plain text