Skip to content

Commit 68cb8ce

Browse files
committed
add apk analyzer
1 parent ec2b20d commit 68cb8ce

File tree

4 files changed

+547
-8
lines changed

4 files changed

+547
-8
lines changed

analyzer/analyzer.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,5 +88,8 @@ func GetPackages(filesMap extractor.FilesMap) ([]Package, error) {
8888
return pkgs, nil
8989
}
9090
return nil, ErrUnknownOS
91+
}
9192

93+
func CheckPackage(pkg *Package) bool {
94+
return pkg.Name != "" && pkg.Version != ""
9295
}

analyzer/pkg/apk/apk.go

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@ package apk
33
import (
44
"bufio"
55
"bytes"
6-
"fmt"
6+
7+
"github.com/labstack/gommon/log"
8+
9+
"github.com/coreos/clair/ext/versionfmt"
10+
clairDpkg "github.com/coreos/clair/ext/versionfmt/dpkg"
711

812
"github.com/knqyf263/fanal/analyzer"
913
"github.com/knqyf263/fanal/extractor"
10-
"github.com/pkg/errors"
1114
)
1215

1316
func init() {
@@ -16,20 +19,54 @@ func init() {
1619

1720
type alpinePkgAnalyzer struct{}
1821

19-
func (a alpinePkgAnalyzer) Analyze(filesMap extractor.FilesMap) ([]analyzer.Package, error) {
22+
func (a alpinePkgAnalyzer) Analyze(filesMap extractor.FilesMap) (pkgs []analyzer.Package, err error) {
23+
var parsedPkgs []analyzer.Package
2024
for _, filename := range a.RequiredFiles() {
2125
file, ok := filesMap[filename]
2226
if !ok {
2327
continue
2428
}
2529
scanner := bufio.NewScanner(bytes.NewBuffer(file))
26-
for scanner.Scan() {
27-
// TODO
28-
line := scanner.Text()
29-
fmt.Println(line)
30+
parsedPkgs, err = a.parseApkInfo(scanner)
31+
pkgs = append(pkgs, parsedPkgs...)
32+
}
33+
return pkgs, err
34+
}
35+
36+
func (a alpinePkgAnalyzer) parseApkInfo(scanner *bufio.Scanner) (pkgs []analyzer.Package, err error) {
37+
var pkg analyzer.Package
38+
for scanner.Scan() {
39+
line := scanner.Text()
40+
41+
// check package if paragraph end
42+
if len(line) < 2 {
43+
if analyzer.CheckPackage(&pkg) {
44+
pkgs = append(pkgs, pkg)
45+
}
46+
pkg = analyzer.Package{}
47+
continue
48+
}
49+
50+
switch line[:2] {
51+
case "P:":
52+
pkg.Name = line[2:]
53+
case "V:":
54+
version := string(line[2:])
55+
err = versionfmt.Valid(clairDpkg.ParserName, version)
56+
if err != nil {
57+
log.Warnf("Invalid Version Found : OS %s, Package %s, Version %s", "alpine", pkg.Name, version)
58+
continue
59+
} else {
60+
pkg.Version = version
61+
}
3062
}
3163
}
32-
return []analyzer.Package{}, errors.New("alpine: Not match")
64+
// in case of last paragraph
65+
if analyzer.CheckPackage(&pkg) {
66+
pkgs = append(pkgs, pkg)
67+
}
68+
69+
return pkgs, nil
3370
}
3471

3572
func (a alpinePkgAnalyzer) RequiredFiles() []string {

analyzer/pkg/apk/apk_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package apk
2+
3+
import (
4+
"bufio"
5+
"os"
6+
"reflect"
7+
"testing"
8+
9+
"github.com/knqyf263/fanal/analyzer"
10+
)
11+
12+
func TestParseApkInfo(t *testing.T) {
13+
var tests = map[string]struct {
14+
path string
15+
pkgs []analyzer.Package
16+
}{
17+
"Valid": {
18+
path: "./testdata/apk",
19+
pkgs: []analyzer.Package{
20+
{Name: "musl", Version: "1.1.14-r10"},
21+
{Name: "busybox", Version: "1.24.2-r9"},
22+
{Name: "alpine-baselayout", Version: "3.0.3-r0"},
23+
{Name: "alpine-keys", Version: "1.1-r0"},
24+
{Name: "zlib", Version: "1.2.8-r2"},
25+
{Name: "libcrypto1.0", Version: "1.0.2h-r1"},
26+
{Name: "libssl1.0", Version: "1.0.2h-r1"},
27+
{Name: "apk-tools", Version: "2.6.7-r0"},
28+
{Name: "scanelf", Version: "1.1.6-r0"},
29+
{Name: "musl-utils", Version: "1.1.14-r10"},
30+
{Name: "libc-utils", Version: "0.7-r0"},
31+
},
32+
},
33+
}
34+
a := alpinePkgAnalyzer{}
35+
for i, v := range tests {
36+
read, err := os.Open(v.path)
37+
if err != nil {
38+
t.Errorf("%s : can't open file %s", i, v.path)
39+
}
40+
scanner := bufio.NewScanner(read)
41+
pkgs, err := a.parseApkInfo(scanner)
42+
if err != nil {
43+
t.Errorf("%s : catch the error : %v", i, err)
44+
}
45+
if !reflect.DeepEqual(v.pkgs, pkgs) {
46+
t.Errorf("[%s]\nexpected : %v\nactual : %v", i, v.pkgs, pkgs)
47+
}
48+
}
49+
}

0 commit comments

Comments
 (0)