Skip to content

Commit f110097

Browse files
committed
rpm: use rpm FileInstalledByRPM in language indexers
Check whether interesting paths were installed by RPM during language level indexing. Signed-off-by: crozzy <[email protected]>
1 parent 6741426 commit f110097

File tree

6 files changed

+76
-5
lines changed

6 files changed

+76
-5
lines changed

gobin/gobin.go

+15-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626

2727
"github.com/quay/claircore"
2828
"github.com/quay/claircore/indexer"
29+
"github.com/quay/claircore/rpm"
2930
)
3031

3132
// Detector detects go binaries and reports the packages used to build them.
@@ -84,7 +85,8 @@ func (Detector) Scan(ctx context.Context, l *claircore.Layer) ([]*claircore.Pack
8485
// Only create a single spool file per call, re-use for every binary.
8586
var spool spoolfile
8687
walk := func(p string, d fs.DirEntry, err error) error {
87-
ctx := zlog.ContextWithValues(ctx, "path", d.Name())
88+
ctx := zlog.ContextWithValues(ctx, "filename", d.Name())
89+
8890
switch {
8991
case err != nil:
9092
return err
@@ -105,6 +107,18 @@ func (Detector) Scan(ctx context.Context, l *claircore.Layer) ([]*claircore.Pack
105107
// Not executable
106108
return nil
107109
}
110+
111+
isRPM, err := rpm.FileInstalledByRPM(ctx, l, p)
112+
if err != nil {
113+
return err
114+
}
115+
if isRPM {
116+
zlog.Debug(ctx).
117+
Str("path", p).
118+
Msg("file path determined to be of RPM origin")
119+
return nil
120+
}
121+
108122
f, err := sys.Open(p)
109123
if err != nil {
110124
// TODO(crozzy): Remove log line once controller is in a

gobin/gobin_test.go

+11
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ func TestEmptyFile(t *testing.T) {
6060
if err := l.Init(ctx, &test.AnyDescription, f); err != nil {
6161
t.Error(err)
6262
}
63+
t.Cleanup(func() {
64+
if err := l.Close(); err != nil {
65+
t.Error(err)
66+
}
67+
})
68+
6369
var s Detector
6470
_, err = s.Scan(ctx, &l)
6571
if err != nil {
@@ -137,6 +143,11 @@ func TestScanner(t *testing.T) {
137143
if err := l.Init(ctx, &test.AnyDescription, f); err != nil {
138144
t.Error(err)
139145
}
146+
t.Cleanup(func() {
147+
if err := l.Close(); err != nil {
148+
t.Error(err)
149+
}
150+
})
140151

141152
// Run the scanner on the fake layer.
142153
var s Detector

java/packagescanner.go

+12
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"github.com/quay/claircore"
2525
"github.com/quay/claircore/indexer"
2626
"github.com/quay/claircore/java/jar"
27+
"github.com/quay/claircore/rpm"
2728
)
2829

2930
var (
@@ -147,6 +148,17 @@ func (s *Scanner) Scan(ctx context.Context, layer *claircore.Layer) ([]*claircor
147148
defer putBuf(buf)
148149
for _, n := range ars {
149150
ctx := zlog.ContextWithValues(ctx, "file", n)
151+
isRPM, err := rpm.FileInstalledByRPM(ctx, layer, n)
152+
if err != nil {
153+
return nil, err
154+
}
155+
if isRPM {
156+
zlog.Debug(ctx).
157+
Str("path", n).
158+
Msg("file path determined to be of RPM origin")
159+
continue
160+
}
161+
150162
sh.Reset()
151163
buf.Reset()
152164
// Calculate the SHA1 as it's buffered, since it may be needed for

nodejs/packagescanner.go

+12
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/Masterminds/semver"
1818
"github.com/quay/claircore"
1919
"github.com/quay/claircore/indexer"
20+
"github.com/quay/claircore/rpm"
2021
)
2122

2223
const repository = "npm"
@@ -92,6 +93,17 @@ func (s *Scanner) Scan(ctx context.Context, layer *claircore.Layer) ([]*claircor
9293
ret := make([]*claircore.Package, 0, len(pkgs))
9394
var invalidPkgs []string
9495
for _, p := range pkgs {
96+
isRPM, err := rpm.FileInstalledByRPM(ctx, layer, p)
97+
if err != nil {
98+
return nil, err
99+
}
100+
if isRPM {
101+
zlog.Debug(ctx).
102+
Str("path", p).
103+
Msg("file path determined to be of RPM origin")
104+
continue
105+
}
106+
95107
f, err := sys.Open(p)
96108
if err != nil {
97109
return nil, fmt.Errorf("nodejs: unable to open file %q: %w", p, err)

python/packagescanner.go

+15-4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"github.com/quay/claircore"
2020
"github.com/quay/claircore/indexer"
2121
"github.com/quay/claircore/pkg/pep440"
22+
"github.com/quay/claircore/rpm"
2223
)
2324

2425
var (
@@ -79,6 +80,16 @@ func (ps *Scanner) Scan(ctx context.Context, layer *claircore.Layer) ([]*clairco
7980
}
8081
var ret []*claircore.Package
8182
for _, n := range ms {
83+
isRPM, err := rpm.FileInstalledByRPM(ctx, layer, n)
84+
if err != nil {
85+
return nil, err
86+
}
87+
if isRPM {
88+
zlog.Debug(ctx).
89+
Str("path", n).
90+
Msg("file path determined to be of RPM origin")
91+
continue
92+
}
8293
b, err := fs.ReadFile(sys, n)
8394
if err != nil {
8495
return nil, fmt.Errorf("python: unable to read file: %w", err)
@@ -143,14 +154,14 @@ func findDeliciousEgg(ctx context.Context, sys fs.FS) (out []string, err error)
143154
// Is this layer an rpm layer?
144155
//
145156
// If so, files in the disto-managed directory can be skipped.
146-
var rpm bool
157+
var isRPM bool
147158
for _, p := range []string{
148159
"var/lib/rpm/Packages",
149160
"var/lib/rpm/rpmdb.sqlite",
150161
"var/lib/rpm/Packages.db",
151162
} {
152163
if fi, err := fs.Stat(sys, p); err == nil && fi.Mode().IsRegular() {
153-
rpm = true
164+
isRPM = true
154165
break
155166
}
156167
}
@@ -172,12 +183,12 @@ func findDeliciousEgg(ctx context.Context, sys fs.FS) (out []string, err error)
172183
switch {
173184
case err != nil:
174185
return err
175-
case (rpm || dpkg) && d.Type().IsDir():
186+
case (isRPM || dpkg) && d.Type().IsDir():
176187
// Skip one level up from the "packages" directory so the walk also
177188
// skips the standard library.
178189
var pat string
179190
switch {
180-
case rpm:
191+
case isRPM:
181192
pat = `usr/lib*/python[23].*`
182193
ev = ev.Bool("rpm_dir", true)
183194
case dpkg:

ruby/packagescanner.go

+11
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616

1717
"github.com/quay/claircore"
1818
"github.com/quay/claircore/indexer"
19+
"github.com/quay/claircore/rpm"
1920
)
2021

2122
var (
@@ -103,6 +104,16 @@ func (ps *Scanner) Scan(ctx context.Context, layer *claircore.Layer) ([]*clairco
103104

104105
var ret []*claircore.Package
105106
for _, g := range gs {
107+
isRPM, err := rpm.FileInstalledByRPM(ctx, layer, g)
108+
if err != nil {
109+
return nil, fmt.Errorf("ruby: unable to check RPM db: %w", err)
110+
}
111+
if isRPM {
112+
zlog.Debug(ctx).
113+
Str("path", g).
114+
Msg("file path determined to be of RPM origin")
115+
continue
116+
}
106117
f, err := sys.Open(g)
107118
if err != nil {
108119
return nil, fmt.Errorf("ruby: unable to open file: %w", err)

0 commit comments

Comments
 (0)