Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
lima-vm
GitHub Repository: lima-vm/lima
Path: blob/master/pkg/sysprof/sysprof_darwin.go
2611 views
1
// SPDX-FileCopyrightText: Copyright The Lima Authors
2
// SPDX-License-Identifier: Apache-2.0
3
4
package sysprof
5
6
import (
7
"bytes"
8
"context"
9
"encoding/json"
10
"fmt"
11
"os/exec"
12
"strings"
13
"sync"
14
15
"github.com/sirupsen/logrus"
16
)
17
18
var NetworkData = sync.OnceValues(func() ([]NetworkDataType, error) {
19
b, err := SystemProfiler(context.Background(), "SPNetworkDataType")
20
if err != nil {
21
return nil, err
22
}
23
var networkData SPNetworkDataType
24
if err := json.Unmarshal(b, &networkData); err != nil {
25
return nil, err
26
}
27
return networkData.SPNetworkDataType, nil
28
})
29
30
func SystemProfiler(ctx context.Context, dataType string) ([]byte, error) {
31
exe, err := exec.LookPath("system_profiler")
32
if err != nil {
33
// $PATH may lack /usr/sbin
34
exe = "/usr/sbin/system_profiler"
35
}
36
var stdout, stderr bytes.Buffer
37
cmd := exec.CommandContext(ctx, exe, dataType, "-json")
38
cmd.Stdout = &stdout
39
cmd.Stderr = &stderr
40
if err := cmd.Run(); err != nil {
41
if strings.HasPrefix(stderr.String(), "Usage: system_profiler") {
42
logrus.Warn("Can't fetch system_profiler data; maybe OS is older than macOS Catalina 10.15")
43
return []byte("{}"), nil
44
}
45
return nil, fmt.Errorf("failed to run %v: stdout=%q, stderr=%q: %w",
46
cmd.Args, stdout.String(), stderr.String(), err)
47
}
48
return stdout.Bytes(), nil
49
}
50
51