refactor(amazon): version determination, parseInstalledPackagesLine

This commit is contained in:
MaineK00n
2023-08-01 16:42:23 +09:00
parent a23abf48fd
commit bbb8fcbb42
4 changed files with 84 additions and 181 deletions

View File

@@ -113,24 +113,13 @@ func getDefsByPackNameViaHTTP(r *models.ScanResult, url string) (relatedDefs ova
ovalRelease = strings.TrimPrefix(r.Release, "stream")
case constant.Amazon:
switch s := strings.Fields(r.Release)[0]; s {
case "1":
ovalRelease = "1"
case "2":
ovalRelease = "2"
case "2022":
ovalRelease = "2022"
case "2023":
ovalRelease = "2023"
case "2025":
ovalRelease = "2025"
case "2027":
ovalRelease = "2027"
case "2029":
ovalRelease = "2029"
case "1", "2", "2022", "2023", "2025", "2027", "2029":
ovalRelease = s
default:
if _, err := time.Parse("2006.01", s); err == nil {
ovalRelease = "1"
if _, err := time.Parse("2006.01", s); err != nil {
return relatedDefs, xerrors.Errorf(`Failed to detect amazon version. err: unexpected Amazon Linux 1 version format. expected: "yyyy.MM", actual: "%s". err: %w`, s, err)
}
ovalRelease = "1"
}
}
@@ -287,24 +276,13 @@ func getDefsByPackNameFromOvalDB(r *models.ScanResult, driver ovaldb.DB) (relate
ovalRelease = strings.TrimPrefix(r.Release, "stream")
case constant.Amazon:
switch s := strings.Fields(r.Release)[0]; s {
case "1":
ovalRelease = "1"
case "2":
ovalRelease = "2"
case "2022":
ovalRelease = "2022"
case "2023":
ovalRelease = "2023"
case "2025":
ovalRelease = "2025"
case "2027":
ovalRelease = "2027"
case "2029":
ovalRelease = "2029"
case "1", "2", "2022", "2023", "2025", "2027", "2029":
ovalRelease = s
default:
if _, err := time.Parse("2006.01", s); err == nil {
ovalRelease = "1"
if _, err := time.Parse("2006.01", s); err != nil {
return relatedDefs, xerrors.Errorf(`Failed to detect amazon version. err: unexpected Amazon Linux 1 version format. expected: "yyyy.MM", actual: "%s". err: %w`, s, err)
}
ovalRelease = "1"
}
}

View File

@@ -519,28 +519,7 @@ func (o *redhatBase) parseInstalledPackages(stdout string) (models.Packages, mod
continue
}
var (
pack *models.Package
err error
)
switch o.getDistro().Family {
case constant.Amazon:
switch strings.Fields(o.getDistro().Release)[0] {
case "2":
switch len(strings.Fields(line)) {
case 5:
pack, err = o.parseInstalledPackagesLine(line)
case 6:
pack, err = o.parseInstalledPackagesLineFromRepoquery(line)
default:
return nil, nil, xerrors.Errorf("Failed to parse package line: %s", line)
}
default:
pack, err = o.parseInstalledPackagesLine(line)
}
default:
pack, err = o.parseInstalledPackagesLine(line)
}
pack, err := o.parseInstalledPackagesLine(line)
if err != nil {
return nil, nil, err
}
@@ -572,30 +551,7 @@ func (o *redhatBase) parseInstalledPackages(stdout string) (models.Packages, mod
func (o *redhatBase) parseInstalledPackagesLine(line string) (*models.Package, error) {
fields := strings.Fields(line)
if len(fields) != 5 {
return nil,
xerrors.Errorf("Failed to parse package line: %s", line)
}
ver := ""
epoch := fields[1]
if epoch == "0" || epoch == "(none)" {
ver = fields[2]
} else {
ver = fmt.Sprintf("%s:%s", epoch, fields[2])
}
return &models.Package{
Name: fields[0],
Version: ver,
Release: fields[3],
Arch: fields[4],
}, nil
}
func (o *redhatBase) parseInstalledPackagesLineFromRepoquery(line string) (*models.Package, error) {
fields := strings.Fields(line)
if len(fields) != 6 {
if len(fields) < 5 {
return nil, xerrors.Errorf("Failed to parse package line: %s", line)
}
@@ -607,9 +563,22 @@ func (o *redhatBase) parseInstalledPackagesLineFromRepoquery(line string) (*mode
ver = fmt.Sprintf("%s:%s", epoch, fields[2])
}
repo := strings.TrimPrefix(fields[5], "@")
if repo == "installed" {
repo = "amzn2-core"
var repo string
switch o.getDistro().Family {
case constant.Amazon:
switch strings.Fields(o.getDistro().Release)[0] {
case "2":
if len(fields) == 5 {
break
}
if fields[5] == "installed" {
repo = "amzn2-core"
break
}
repo = strings.TrimPrefix(fields[5], "@")
default:
}
default:
}
return &models.Package{

View File

@@ -118,32 +118,6 @@ kernel-devel 0 2.6.32 695.20.3.el6 x86_64`,
},
},
},
{
in: `openssl 0 1.0.1e 30.el6.11 x86_64
Percona-Server-shared-56 1 5.6.19 rel67.0.el6 x84_64
kernel 0 2.6.32 696.20.1.el6 x86_64
kernel 0 2.6.32 696.20.3.el6 x86_64
kernel 0 2.6.32 695.20.3.el6 x86_64`,
distro: config.Distro{Family: constant.Amazon, Release: "2 (Karoo)"},
kernel: models.Kernel{},
packages: models.Packages{
"openssl": models.Package{
Name: "openssl",
Version: "1.0.1e",
Release: "30.el6.11",
},
"Percona-Server-shared-56": models.Package{
Name: "Percona-Server-shared-56",
Version: "1:5.6.19",
Release: "rel67.0.el6",
},
"kernel": models.Package{
Name: "kernel",
Version: "2.6.32",
Release: "696.20.3.el6",
},
},
},
{
in: `yum-utils 0 1.1.31 46.amzn2.0.1 noarch @amzn2-core
zlib 0 1.2.7 19.amzn2.0.1 x86_64 installed
@@ -195,67 +169,52 @@ java-1.8.0-amazon-corretto 1 1.8.0_192.b12 1.amzn2 x86_64 @amzn2extra-corretto8`
}
}
}
}
func TestParseInstalledPackagesLine(t *testing.T) {
r := newRHEL(config.ServerInfo{})
var packagetests = []struct {
in string
pack models.Package
err bool
func Test_redhatBase_parseInstalledPackagesLine(t *testing.T) {
tests := []struct {
name string
distro config.Distro
line string
want *models.Package
wantErr bool
}{
{
"openssl 0 1.0.1e 30.el6.11 x86_64",
models.Package{
name: "rpm -qa redhat 6.11 1",
distro: config.Distro{
Family: constant.RedHat,
Release: "6.11",
},
line: "openssl 0 1.0.1e 30.el6.11 x86_64",
want: &models.Package{
Name: "openssl",
Version: "1.0.1e",
Release: "30.el6.11",
Arch: "x86_64",
},
false,
},
{
"Percona-Server-shared-56 1 5.6.19 rel67.0.el6 x84_64",
models.Package{
name: "rpm -qa redhat 6.11 2",
distro: config.Distro{
Family: constant.RedHat,
Release: "6.11",
},
line: "Percona-Server-shared-56 1 5.6.19 rel67.0.el6 x84_64",
want: &models.Package{
Name: "Percona-Server-shared-56",
Version: "1:5.6.19",
Release: "rel67.0.el6",
Arch: "x84_64",
},
false,
},
}
for i, tt := range packagetests {
p, err := r.parseInstalledPackagesLine(tt.in)
if err == nil && tt.err {
t.Errorf("Expected err not occurred: %d", i)
}
if err != nil && !tt.err {
t.Errorf("UnExpected err not occurred: %d", i)
}
if p.Name != tt.pack.Name {
t.Errorf("name: expected %s, actual %s", tt.pack.Name, p.Name)
}
if p.Version != tt.pack.Version {
t.Errorf("version: expected %s, actual %s", tt.pack.Version, p.Version)
}
if p.Release != tt.pack.Release {
t.Errorf("release: expected %s, actual %s", tt.pack.Release, p.Release)
}
}
}
func TestParseInstalledPackagesLineFromRepoquery(t *testing.T) {
r := newRHEL(config.ServerInfo{})
var packagetests = []struct {
in string
pack models.Package
err bool
}{
{
in: "yum-utils 0 1.1.31 46.amzn2.0.1 noarch @amzn2-core",
pack: models.Package{
name: "rpmquery amazonlinux 2 1",
distro: config.Distro{
Family: constant.Amazon,
Release: "2",
},
line: "yum-utils 0 1.1.31 46.amzn2.0.1 noarch @amzn2-core",
want: &models.Package{
Name: "yum-utils",
Version: "1.1.31",
Release: "46.amzn2.0.1",
@@ -264,8 +223,13 @@ func TestParseInstalledPackagesLineFromRepoquery(t *testing.T) {
},
},
{
in: "zlib 0 1.2.7 19.amzn2.0.1 x86_64 installed",
pack: models.Package{
name: "rpmquery amazonlinux 2 2",
distro: config.Distro{
Family: constant.Amazon,
Release: "2",
},
line: "zlib 0 1.2.7 19.amzn2.0.1 x86_64 installed",
want: &models.Package{
Name: "zlib",
Version: "1.2.7",
Release: "19.amzn2.0.1",
@@ -274,8 +238,13 @@ func TestParseInstalledPackagesLineFromRepoquery(t *testing.T) {
},
},
{
in: "java-1.8.0-amazon-corretto 1 1.8.0_192.b12 1.amzn2 x86_64 @amzn2extra-corretto8",
pack: models.Package{
name: "rpmquery amazonlinux 2 3",
distro: config.Distro{
Family: constant.Amazon,
Release: "2",
},
line: "java-1.8.0-amazon-corretto 1 1.8.0_192.b12 1.amzn2 x86_64 @amzn2extra-corretto8",
want: &models.Package{
Name: "java-1.8.0-amazon-corretto",
Version: "1:1.8.0_192.b12",
Release: "1.amzn2",
@@ -284,32 +253,18 @@ func TestParseInstalledPackagesLineFromRepoquery(t *testing.T) {
},
},
}
for i, tt := range packagetests {
p, err := r.parseInstalledPackagesLineFromRepoquery(tt.in)
if err == nil && tt.err {
t.Errorf("Expected err not occurred: %d", i)
}
if err != nil && !tt.err {
t.Errorf("UnExpected err not occurred: %d", i)
}
if p.Name != tt.pack.Name {
t.Errorf("name: expected %s, actual %s", tt.pack.Name, p.Name)
}
if p.Version != tt.pack.Version {
t.Errorf("version: expected %s, actual %s", tt.pack.Version, p.Version)
}
if p.Release != tt.pack.Release {
t.Errorf("release: expected %s, actual %s", tt.pack.Release, p.Release)
}
if p.Arch != tt.pack.Arch {
t.Errorf("arch: expected %s, actual %s", tt.pack.Arch, p.Arch)
}
if p.Repository != tt.pack.Repository {
t.Errorf("repository: expected %s, actual %s", tt.pack.Repository, p.Repository)
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := (&redhatBase{base: base{Distro: tt.distro}}).parseInstalledPackagesLine(tt.line)
if (err != nil) != tt.wantErr {
t.Errorf("redhatBase.parseInstalledPackagesLine() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("redhatBase.parseInstalledPackagesLine() = %v, want %v", got, tt.want)
}
})
}
}
func TestParseYumCheckUpdateLine(t *testing.T) {

View File

@@ -4399,6 +4399,7 @@ var windowsReleases = map[string]map[string]map[string]updateProgram{
},
}
// DetectKBsFromKernelVersion :
func DetectKBsFromKernelVersion(release, kernelVersion string) (models.WindowsKB, error) {
switch ss := strings.Split(kernelVersion, "."); len(ss) {
case 3: