go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/resources/kernel/modules.go (about)

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package kernel
     5  
     6  import (
     7  	"bufio"
     8  	"io"
     9  	"regexp"
    10  	"strings"
    11  )
    12  
    13  func ParseLsmod(r io.Reader) []*KernelModule {
    14  	res := []*KernelModule{}
    15  
    16  	lsmodEntry := regexp.MustCompile(`^(\S+)\s+(\S+)\s+(\S+)\s*(\S*)$`)
    17  
    18  	scanner := bufio.NewScanner(r)
    19  	for scanner.Scan() {
    20  		line := scanner.Text()
    21  		m := lsmodEntry.FindStringSubmatch(line)
    22  		if len(m) == 5 {
    23  			if m[1] == "Module" {
    24  				continue
    25  			}
    26  
    27  			res = append(res, &KernelModule{
    28  				Name:   strings.TrimSpace(m[1]),
    29  				Size:   strings.TrimSpace(m[2]),
    30  				UsedBy: strings.TrimSpace(m[3]),
    31  			})
    32  		}
    33  	}
    34  
    35  	return res
    36  }
    37  
    38  func ParseLinuxProcModules(r io.Reader) []*KernelModule {
    39  	res := []*KernelModule{}
    40  
    41  	procModulesEntry := regexp.MustCompile(`^(\S+)\s(\S+)\s(\S+)\s(.*)$`)
    42  
    43  	scanner := bufio.NewScanner(r)
    44  	for scanner.Scan() {
    45  		line := scanner.Text()
    46  		m := procModulesEntry.FindStringSubmatch(line)
    47  		if len(m) == 5 {
    48  			res = append(res, &KernelModule{
    49  				Name:   strings.TrimSpace(m[1]),
    50  				Size:   strings.TrimSpace(m[2]),
    51  				UsedBy: strings.TrimSpace(m[3]),
    52  			})
    53  		}
    54  	}
    55  
    56  	return res
    57  }
    58  
    59  func ParseKldstat(r io.Reader) []*KernelModule {
    60  	res := []*KernelModule{}
    61  
    62  	lsmodEntry := regexp.MustCompile(`^\s+(\S+)\s+(\S+)\s+(\S+)\s*(\S*)\s*(\S*)$`)
    63  
    64  	scanner := bufio.NewScanner(r)
    65  	for scanner.Scan() {
    66  		line := scanner.Text()
    67  		m := lsmodEntry.FindStringSubmatch(line)
    68  		if len(m) == 6 {
    69  			res = append(res, &KernelModule{
    70  				Name:   strings.TrimSpace(m[5]),
    71  				Size:   strings.TrimSpace(m[4]),
    72  				UsedBy: strings.TrimSpace(m[2]),
    73  			})
    74  		}
    75  	}
    76  
    77  	return res
    78  }
    79  
    80  func ParseKextstat(r io.Reader) []*KernelModule {
    81  	res := []*KernelModule{}
    82  
    83  	lsmodEntry := regexp.MustCompile(`^\s+(\S+)\s+(\S+)\s+(\S+)\s*(\S*)\s*(\S*)\s*(\S*)`)
    84  
    85  	scanner := bufio.NewScanner(r)
    86  	for scanner.Scan() {
    87  		line := scanner.Text()
    88  		m := lsmodEntry.FindStringSubmatch(line)
    89  		if len(m) == 7 {
    90  			res = append(res, &KernelModule{
    91  				Name:   strings.TrimSpace(m[6]),
    92  				Size:   strings.TrimSpace(m[4]),
    93  				UsedBy: strings.TrimSpace(m[2]),
    94  			})
    95  		}
    96  	}
    97  
    98  	return res
    99  }