go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/resources/smbios/linux.go (about) 1 // Copyright (c) Mondoo, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package smbios 5 6 import ( 7 "io" 8 "os" 9 "path/filepath" 10 "strings" 11 12 "github.com/spf13/afero" 13 "go.mondoo.com/cnquery/providers/os/connection/shared" 14 ) 15 16 type LinuxSmbiosManager struct { 17 provider shared.Connection 18 } 19 20 func (s *LinuxSmbiosManager) Name() string { 21 return "Linux Smbios Manager" 22 } 23 24 func (s *LinuxSmbiosManager) Info() (*SmBiosInfo, error) { 25 smInfo := SmBiosInfo{} 26 27 fs := s.provider.FileSystem() 28 afs := &afero.Afero{Fs: fs} 29 root := "/sys/class/dmi/id/" 30 31 wErr := afs.Walk(root, func(path string, info os.FileInfo, fErr error) error { 32 if fErr != nil { 33 // we skip files that we cannot access 34 return filepath.SkipDir 35 } 36 37 if info.IsDir() && path != root { 38 return filepath.SkipDir 39 } 40 41 var dst *string 42 switch info.Name() { 43 case "bios_date": 44 dst = &smInfo.BIOS.ReleaseDate 45 case "bios_vendor": 46 dst = &smInfo.BIOS.Vendor 47 case "bios_version": 48 dst = &smInfo.BIOS.Version 49 case "board_asset_tag": 50 dst = &smInfo.BaseBoardInfo.AssetTag 51 case "board_name": 52 dst = &smInfo.BaseBoardInfo.Model 53 case "board_serial": 54 dst = &smInfo.BaseBoardInfo.SerialNumber 55 case "board_vendor": 56 dst = &smInfo.BaseBoardInfo.Vendor 57 case "board_version": 58 dst = &smInfo.BaseBoardInfo.Version 59 case "chassis_asset_tag": 60 dst = &smInfo.ChassisInfo.AssetTag 61 case "chassis_serial": 62 dst = &smInfo.ChassisInfo.SerialNumber 63 case "chassis_type": 64 dst = &smInfo.ChassisInfo.Type 65 case "chassis_vendor": 66 dst = &smInfo.ChassisInfo.Vendor 67 case "chassis_version": 68 dst = &smInfo.ChassisInfo.Version 69 case "product_family": 70 dst = &smInfo.SysInfo.Familiy 71 case "product_name": 72 dst = &smInfo.SysInfo.Model 73 case "product_serial": 74 dst = &smInfo.SysInfo.SerialNumber 75 case "product_sku": 76 dst = &smInfo.SysInfo.SKU 77 case "product_uuid": 78 dst = &smInfo.SysInfo.UUID 79 case "product_version": 80 dst = &smInfo.SysInfo.Version 81 case "sys_vendor": 82 dst = &smInfo.SysInfo.Vendor 83 } 84 85 if dst != nil { 86 f, err := fs.Open(path) 87 if err != nil { 88 return err 89 } 90 defer f.Close() 91 data, err := io.ReadAll(f) 92 if err != nil { 93 return err 94 } 95 *dst = strings.TrimSpace(string(data)) 96 } 97 98 return nil 99 }) 100 101 // If the error is SkipDir we can safely ignore it 102 if wErr != nil && wErr != filepath.SkipDir { 103 return nil, wErr 104 } 105 106 return &smInfo, nil 107 }