| package cos |
| |
| import ( |
| "io/ioutil" |
| "path/filepath" |
| "syscall" |
| |
| "cos.googlesource.com/cos/tools.git/src/pkg/utils" |
| |
| "github.com/pkg/errors" |
| ) |
| |
| const ( |
| osReleasePath = "/etc/os-release" |
| lsbReleasePath = "/etc/lsb-release" |
| toolchainPathFile = "/etc/toolchain-path" |
| |
| buildID = "BUILD_ID" |
| version = "VERSION" |
| kernelCommitID = "KERNEL_COMMIT_ID" |
| releaseTrack = "CHROMEOS_RELEASE_TRACK" |
| ) |
| |
| // EnvReader is to read system configurations of COS. |
| // TODO(mikewu): rename EnvReader to a better name. |
| type EnvReader struct { |
| osRelease map[string]string |
| lsbRelease map[string]string |
| toolchainPath string |
| uname syscall.Utsname |
| } |
| |
| // NewEnvReader returns an instance of EnvReader. |
| func NewEnvReader(hostRootPath string) (reader *EnvReader, err error) { |
| reader = &EnvReader{} |
| reader.osRelease, err = utils.LoadEnvFromFile(hostRootPath, osReleasePath) |
| if err != nil { |
| return nil, errors.Wrapf(err, "failed to read OsRelease file from %s", osReleasePath) |
| } |
| |
| reader.lsbRelease, err = utils.LoadEnvFromFile(hostRootPath, lsbReleasePath) |
| if err != nil { |
| return nil, errors.Wrapf(err, "failed to read lsbRelease file from %s", lsbReleasePath) |
| } |
| |
| if toolchainPath, err := ioutil.ReadFile(filepath.Join(hostRootPath, toolchainPathFile)); err == nil { |
| reader.toolchainPath = string(toolchainPath) |
| } |
| |
| if err := syscall.Uname(&reader.uname); err != nil { |
| return nil, errors.Wrap(err, "failed to get uname") |
| } |
| return reader, nil |
| } |
| |
| // OsRelease returns configs of /etc/os-release as a map. |
| func (c *EnvReader) OsRelease() map[string]string { return c.osRelease } |
| |
| // ReleaseTrack returns the COS release track. |
| func (c *EnvReader) ReleaseTrack() string { return c.lsbRelease[releaseTrack] } |
| |
| // BuildNumber returns COS build number. |
| func (c *EnvReader) BuildNumber() string { return c.osRelease[buildID] } |
| |
| // Milestone returns COS milestone. |
| func (c *EnvReader) Milestone() string { return c.osRelease[version] } |
| |
| // KernelCommit returns commit hash of the COS kernel. |
| func (c *EnvReader) KernelCommit() string { return c.osRelease[kernelCommitID] } |
| |
| // ToolchainPath returns the toolchain path of the COS version. |
| // It may return an empty string if the COS version doesn't support the feature. |
| func (c *EnvReader) ToolchainPath() string { return c.toolchainPath } |
| |
| // KernelRelease return COS kernel release, i.e. `uname -r` |
| func (c *EnvReader) KernelRelease() string { return charsToString(c.uname.Release[:]) } |
| |
| // charsToString converts a c-style byte array (null-terminated string) to string. |
| func charsToString(chars []int8) string { |
| s := make([]byte, 0, len(chars)) |
| for _, ch := range chars { |
| if ch == 0 { |
| break |
| } |
| s = append(s, byte(ch)) |
| } |
| return string(s) |
| } |