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

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package packages_test
     5  
     6  import (
     7  	"bytes"
     8  	"fmt"
     9  	"io"
    10  	"os"
    11  	"path/filepath"
    12  	"testing"
    13  
    14  	rpmdb "github.com/knqyf263/go-rpmdb/pkg"
    15  	"github.com/stretchr/testify/assert"
    16  	"github.com/stretchr/testify/require"
    17  	"go.mondoo.com/cnquery/providers/os/connection/mock"
    18  	"go.mondoo.com/cnquery/providers/os/resources/packages"
    19  )
    20  
    21  func TestRedhat7Parser(t *testing.T) {
    22  	mock, err := mock.New("./testdata/packages_redhat7.toml", nil)
    23  	if err != nil {
    24  		t.Fatal(err)
    25  	}
    26  
    27  	c, err := mock.RunCommand("rpm -qa --queryformat '%{NAME} %{EPOCHNUM}:%{VERSION}-%{RELEASE} %{ARCH} %{SUMMARY}\\n'")
    28  	if err != nil {
    29  		t.Fatal(err)
    30  	}
    31  
    32  	m := packages.ParseRpmPackages(c.Stdout)
    33  	assert.Equal(t, 144, len(m), "detected the right amount of packages")
    34  
    35  	var p packages.Package
    36  	p = packages.Package{
    37  		Name:        "ncurses-base",
    38  		Version:     "5.9-14.20130511.el7_4",
    39  		Arch:        "noarch",
    40  		Description: "Descriptions of common terminals",
    41  		Format:      packages.RpmPkgFormat,
    42  	}
    43  	assert.Contains(t, m, p, "ncurses-base")
    44  
    45  	p = packages.Package{
    46  		Name:        "libstdc++",
    47  		Version:     "4.8.5-28.el7_5.1",
    48  		Arch:        "x86_64",
    49  		Description: "GNU Standard C++ Library",
    50  		Format:      packages.RpmPkgFormat,
    51  	}
    52  	assert.Contains(t, m, p, "libstdc detected")
    53  
    54  	p = packages.Package{
    55  		Name:        "iputils",
    56  		Version:     "20160308-10.el7",
    57  		Arch:        "x86_64",
    58  		Description: "Network monitoring tools including ping",
    59  		Format:      packages.RpmPkgFormat,
    60  	}
    61  	assert.Contains(t, m, p, "gpg-pubkey detected")
    62  
    63  	p = packages.Package{
    64  		Name:        "openssl-libs",
    65  		Version:     "1:1.0.2k-12.el7",
    66  		Arch:        "x86_64",
    67  		Description: "A general purpose cryptography library with TLS implementation",
    68  		Format:      packages.RpmPkgFormat,
    69  	}
    70  	assert.Contains(t, m, p, "gpg-pubkey detected")
    71  
    72  	p = packages.Package{
    73  		Name:        "dbus-libs",
    74  		Version:     "1:1.10.24-7.el7",
    75  		Arch:        "x86_64",
    76  		Description: "Libraries for accessing D-BUS",
    77  		Format:      packages.RpmPkgFormat,
    78  	}
    79  	assert.Contains(t, m, p, "gpg-pubkey detected")
    80  }
    81  
    82  func TestRedhat6Parser(t *testing.T) {
    83  	mock, err := mock.New("./testdata/packages_redhat6.toml", nil)
    84  	if err != nil {
    85  		t.Fatal(err)
    86  	}
    87  
    88  	c, err := mock.RunCommand("rpm -qa --queryformat '%{NAME} %{EPOCH}:%{VERSION}-%{RELEASE} %{ARCH} %{SUMMARY}\\n'")
    89  	if err != nil {
    90  		t.Fatal(err)
    91  	}
    92  
    93  	m := packages.ParseRpmPackages(c.Stdout)
    94  	assert.Equal(t, 8, len(m), "detected the right amount of packages")
    95  
    96  	var p packages.Package
    97  	p = packages.Package{
    98  		Name:        "ElectricFence",
    99  		Version:     "2.1-3",
   100  		Arch:        "i386",
   101  		Description: "A debugger which detects memory allocation violations.",
   102  		Format:      packages.RpmPkgFormat,
   103  	}
   104  	assert.Contains(t, m, p, "ElectricFence")
   105  
   106  	p = packages.Package{
   107  		Name:        "shadow-utils",
   108  		Version:     "1:19990827-10",
   109  		Arch:        "i386",
   110  		Description: "Utilities for managing shadow password files and user/group accounts.",
   111  		Format:      packages.RpmPkgFormat,
   112  	}
   113  	assert.Contains(t, m, p, "shadow-utils")
   114  
   115  	p = packages.Package{
   116  		Name:        "arpwatch",
   117  		Version:     "1:2.1a4-19",
   118  		Arch:        "i386",
   119  		Description: "Network monitoring tools for tracking IP addresses on a network.",
   120  		Format:      packages.RpmPkgFormat,
   121  	}
   122  	assert.Contains(t, m, p, "arpwatch")
   123  
   124  	p = packages.Package{
   125  		Name:        "bash",
   126  		Version:     "1.14.7-22",
   127  		Arch:        "i386",
   128  		Description: "The GNU Bourne Again shell (bash) version 1.14.",
   129  		Format:      packages.RpmPkgFormat,
   130  	}
   131  	assert.Contains(t, m, p, "bash")
   132  }
   133  
   134  func TestPhoton4ImageParser(t *testing.T) {
   135  	// to create this test file, run the following command:
   136  	// mondoo scan docker image photon:4.0 --record
   137  	mock, err := mock.New("./testdata/packages_photon_image.toml", nil)
   138  	if err != nil {
   139  		t.Fatal(err)
   140  	}
   141  
   142  	rpmTmpDir, err := os.MkdirTemp(os.TempDir(), "mondoo-rpmdb")
   143  	require.NoError(t, err)
   144  	defer os.RemoveAll(rpmTmpDir)
   145  
   146  	fWriter, err := os.Create(filepath.Join(rpmTmpDir, "rpmdb.sqlite"))
   147  	require.NoError(t, err)
   148  	defer fWriter.Close()
   149  
   150  	f, err := mock.FileSystem().Open(filepath.Join("/var/lib/rpm", "rpmdb.sqlite"))
   151  	require.NoError(t, err)
   152  	defer f.Close()
   153  
   154  	_, err = io.Copy(fWriter, f)
   155  	require.NoError(t, err)
   156  
   157  	packageList := bytes.Buffer{}
   158  	db, err := rpmdb.Open(filepath.Join(rpmTmpDir, "rpmdb.sqlite"))
   159  	require.NoError(t, err)
   160  
   161  	pkgList, err := db.ListPackages()
   162  	require.NoError(t, err)
   163  
   164  	for _, pkg := range pkgList {
   165  		packageList.WriteString(fmt.Sprintf("%s %d:%s-%s %s %s\n", pkg.Name, pkg.EpochNum(), pkg.Version, pkg.Release, pkg.Arch, pkg.Summary))
   166  	}
   167  
   168  	m := packages.ParseRpmPackages(&packageList)
   169  	assert.Equal(t, 36, len(m), "detected the right amount of packages")
   170  
   171  	var p packages.Package
   172  	p = packages.Package{
   173  		Name:        "ncurses-libs",
   174  		Version:     "6.2-6.ph4",
   175  		Arch:        "x86_64",
   176  		Description: "Ncurses Libraries",
   177  		Format:      packages.RpmPkgFormat,
   178  	}
   179  	assert.Contains(t, m, p, "ncurses-libs")
   180  
   181  	p = packages.Package{
   182  		Name:        "bash",
   183  		Version:     "5.0-2.ph4",
   184  		Arch:        "x86_64",
   185  		Description: "Bourne-Again SHell",
   186  		Format:      packages.RpmPkgFormat,
   187  	}
   188  	assert.Contains(t, m, p, "bash")
   189  
   190  	p = packages.Package{
   191  		Name:        "sqlite-libs",
   192  		Version:     "3.38.5-1.ph4",
   193  		Arch:        "x86_64",
   194  		Description: "sqlite3 library",
   195  		Format:      packages.RpmPkgFormat,
   196  	}
   197  	assert.Contains(t, m, p, "sqlite-libs")
   198  }