Skip to content

Commit b6fa20b

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 38954d8 commit b6fa20b

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
@@ -28,6 +28,7 @@ import (
2828

2929
"github.com/quay/claircore"
3030
"github.com/quay/claircore/indexer"
31+
"github.com/quay/claircore/rpm"
3132
)
3233

3334
// Detector detects go binaries and reports the packages used to build them.
@@ -86,7 +87,8 @@ func (Detector) Scan(ctx context.Context, l *claircore.Layer) ([]*claircore.Pack
8687
// Only create a single spool file per call, re-use for every binary.
8788
var spool spoolfile
8889
walk := func(p string, d fs.DirEntry, err error) error {
89-
ctx := zlog.ContextWithValues(ctx, "path", d.Name())
90+
ctx := zlog.ContextWithValues(ctx, "filename", d.Name())
91+
9092
switch {
9193
case err != nil:
9294
return err
@@ -107,6 +109,18 @@ func (Detector) Scan(ctx context.Context, l *claircore.Layer) ([]*claircore.Pack
107109
// Not executable
108110
return nil
109111
}
112+
113+
isRPM, err := rpm.FileInstalledByRPM(ctx, l, p)
114+
if err != nil {
115+
return err
116+
}
117+
if isRPM {
118+
zlog.Debug(ctx).
119+
Str("path", p).
120+
Msg("file path determined to be of RPM origin")
121+
return nil
122+
}
123+
110124
f, err := sys.Open(p)
111125
if err != nil {
112126
// TODO(crozzy): Remove log line once controller is in a

gobin/gobin_test.go

+11
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@ func TestEmptyFile(t *testing.T) {
6161
if err := l.Init(ctx, &test.AnyDescription, f); err != nil {
6262
t.Error(err)
6363
}
64+
t.Cleanup(func() {
65+
if err := l.Close(); err != nil {
66+
t.Error(err)
67+
}
68+
})
69+
6470
var s Detector
6571
_, err = s.Scan(ctx, &l)
6672
if err != nil {
@@ -138,6 +144,11 @@ func TestScanner(t *testing.T) {
138144
if err := l.Init(ctx, &test.AnyDescription, f); err != nil {
139145
t.Error(err)
140146
}
147+
t.Cleanup(func() {
148+
if err := l.Close(); err != nil {
149+
t.Error(err)
150+
}
151+
})
141152

142153
// Run the scanner on the fake layer.
143154
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)