go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/detector/parser_linux_version.go (about)

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package detector
     5  
     6  import (
     7  	"errors"
     8  	"regexp"
     9  )
    10  
    11  var (
    12  	OS_RELEASE_REGEX    = regexp.MustCompile(`(?m)^\s*(.+?)\s*=\s*['"]?([^'"\n]*)['"]?\s*$`)
    13  	LSB_RELEASE_REGEX   = regexp.MustCompile(`(?m)^\s*(.+?)\s*=["']?(.+?)["']?$`)
    14  	RHEL_PLATFORM_REGEX = regexp.MustCompile(`^(.+)\srelease`)
    15  	RHEL_RELEASE_REGEX  = regexp.MustCompile(`release ([\d\.]+)`)
    16  )
    17  
    18  func ParseOsRelease(content string) (map[string]string, error) {
    19  	return parseKeyValue(content, OS_RELEASE_REGEX), nil
    20  }
    21  
    22  func ParseLsbRelease(content string) (map[string]string, error) {
    23  	return parseKeyValue(content, LSB_RELEASE_REGEX), nil
    24  }
    25  
    26  func parseKeyValue(content string, regex *regexp.Regexp) map[string]string {
    27  	res := regex.FindAllStringSubmatch(content, -1)
    28  	m := make(map[string]string)
    29  	for _, value := range res {
    30  		m[value[1]] = value[2]
    31  	}
    32  	return m
    33  }
    34  
    35  func ParseRhelVersion(releaseDescription string) (string, string, error) {
    36  	// extract platform name
    37  	m := RHEL_PLATFORM_REGEX.FindStringSubmatch(releaseDescription)
    38  	if len(m) < 1 {
    39  		return "", "", errors.New("could not parse rhel version")
    40  	}
    41  	name := m[1]
    42  
    43  	// extract release
    44  	n := RHEL_RELEASE_REGEX.FindStringSubmatch(releaseDescription)
    45  	if len(n) < 2 {
    46  		return "", "", errors.New("could not parse rhel version")
    47  	}
    48  	release := n[1]
    49  
    50  	return name, release, nil
    51  }