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  }