mirror of
https://github.com/netbirdio/netbird.git
synced 2024-12-28 01:28:56 +01:00
29e5eceb6b
* Change source of serial number in sysInfo function The serial number returned by the sysInfo function in info_linux.go has been fixed. Previously, it was incorrectly fetched from the Chassis object. Now it is correctly fetched from the Product object. This aligns better with the expected system info retrieval method. * Fallback to product.Serial in sys info In case of the chassis is "Default String" or empty then try to use product.serial --------- Co-authored-by: Zoltán Papp <zoltan.pmail@gmail.com>
98 lines
2.2 KiB
Go
98 lines
2.2 KiB
Go
//go:build !android
|
|
// +build !android
|
|
|
|
package system
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"os"
|
|
"os/exec"
|
|
"runtime"
|
|
"strings"
|
|
"time"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
"github.com/zcalusic/sysinfo"
|
|
|
|
"github.com/netbirdio/netbird/client/system/detect_cloud"
|
|
"github.com/netbirdio/netbird/client/system/detect_platform"
|
|
"github.com/netbirdio/netbird/version"
|
|
)
|
|
|
|
// GetInfo retrieves and parses the system information
|
|
func GetInfo(ctx context.Context) *Info {
|
|
info := _getInfo()
|
|
for strings.Contains(info, "broken pipe") {
|
|
info = _getInfo()
|
|
time.Sleep(500 * time.Millisecond)
|
|
}
|
|
|
|
osStr := strings.ReplaceAll(info, "\n", "")
|
|
osStr = strings.ReplaceAll(osStr, "\r\n", "")
|
|
osInfo := strings.Split(osStr, " ")
|
|
|
|
osName, osVersion := readOsReleaseFile()
|
|
if osName == "" {
|
|
osName = osInfo[3]
|
|
}
|
|
|
|
systemHostname, _ := os.Hostname()
|
|
|
|
addrs, err := networkAddresses()
|
|
if err != nil {
|
|
log.Warnf("failed to discover network addresses: %s", err)
|
|
}
|
|
|
|
serialNum, prodName, manufacturer := sysInfo()
|
|
|
|
env := Environment{
|
|
Cloud: detect_cloud.Detect(ctx),
|
|
Platform: detect_platform.Detect(ctx),
|
|
}
|
|
|
|
gio := &Info{
|
|
Kernel: osInfo[0],
|
|
Platform: osInfo[2],
|
|
OS: osName,
|
|
OSVersion: osVersion,
|
|
Hostname: extractDeviceName(ctx, systemHostname),
|
|
GoOS: runtime.GOOS,
|
|
CPUs: runtime.NumCPU(),
|
|
WiretrusteeVersion: version.NetbirdVersion(),
|
|
UIVersion: extractUserAgent(ctx),
|
|
KernelVersion: osInfo[1],
|
|
NetworkAddresses: addrs,
|
|
SystemSerialNumber: serialNum,
|
|
SystemProductName: prodName,
|
|
SystemManufacturer: manufacturer,
|
|
Environment: env,
|
|
}
|
|
|
|
return gio
|
|
}
|
|
|
|
func _getInfo() string {
|
|
cmd := exec.Command("uname", "-srio")
|
|
cmd.Stdin = strings.NewReader("some")
|
|
var out bytes.Buffer
|
|
var stderr bytes.Buffer
|
|
cmd.Stdout = &out
|
|
cmd.Stderr = &stderr
|
|
err := cmd.Run()
|
|
if err != nil {
|
|
log.Warnf("getInfo: %s", err)
|
|
}
|
|
return out.String()
|
|
}
|
|
|
|
func sysInfo() (serialNumber string, productName string, manufacturer string) {
|
|
var si sysinfo.SysInfo
|
|
si.GetSysInfo()
|
|
serial := si.Chassis.Serial
|
|
if (serial == "Default string" || serial == "") && si.Product.Serial != "" {
|
|
serial = si.Product.Serial
|
|
}
|
|
return serial, si.Product.Name, si.Product.Vendor
|
|
}
|