Skip to content

Commit 984ce9b

Browse files
committed
add rpm analyzer
1 parent c7cf493 commit 984ce9b

File tree

6 files changed

+416
-4
lines changed

6 files changed

+416
-4
lines changed

analyzer/pkg/rpm/rpm.go

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package rpm
2+
3+
import (
4+
"bufio"
5+
"io/ioutil"
6+
"os"
7+
"os/exec"
8+
"strconv"
9+
"strings"
10+
11+
"golang.org/x/xerrors"
12+
13+
"github.com/knqyf263/fanal/analyzer"
14+
"github.com/knqyf263/fanal/extractor"
15+
)
16+
17+
func init() {
18+
analyzer.RegisterPkgAnalyzer(&rpmPkgAnalyzer{})
19+
}
20+
21+
type rpmPkgAnalyzer struct{}
22+
23+
func (a rpmPkgAnalyzer) Analyze(fileMap extractor.FileMap) (pkgs []analyzer.Package, err error) {
24+
var parsedPkgs []analyzer.Package
25+
for _, filename := range a.RequiredFiles() {
26+
file, ok := fileMap[filename]
27+
if !ok {
28+
continue
29+
}
30+
parsedPkgs, err = a.parsePkgInfo(file)
31+
pkgs = append(pkgs, parsedPkgs...)
32+
}
33+
return pkgs, err
34+
}
35+
36+
func (a rpmPkgAnalyzer) parsePkgInfo(packageBytes []byte) (pkgs []analyzer.Package, err error) {
37+
tmpDir, err := ioutil.TempDir(os.TempDir(), "rpm")
38+
defer os.RemoveAll(tmpDir)
39+
if err != nil {
40+
return pkgs, err
41+
}
42+
43+
err = ioutil.WriteFile(tmpDir+"/Packages", packageBytes, 0700)
44+
if err != nil {
45+
return pkgs, err
46+
}
47+
48+
// rpm-python 4.11.3 rpm-4.11.3-35.el7.src.rpm
49+
// Extract binary package names because RHSA refers to binary package names.
50+
out, err := outputPkgInfo(tmpDir)
51+
if err != nil {
52+
return pkgs, nil
53+
}
54+
55+
pkgString := string(out)
56+
57+
scanner := bufio.NewScanner(strings.NewReader(pkgString))
58+
for scanner.Scan() {
59+
pkg, err := parseRPMOutput(scanner.Text())
60+
if err != nil {
61+
return pkgs, err
62+
}
63+
pkgs = append(pkgs, pkg)
64+
}
65+
return pkgs, nil
66+
}
67+
68+
func parseRPMOutput(line string) (pkg analyzer.Package, err error) {
69+
fields := strings.Fields(line)
70+
if len(fields) != 4 {
71+
return pkg, xerrors.Errorf("Failed to parse package line: %s", line)
72+
}
73+
74+
var epoch int
75+
epochStr := fields[1]
76+
if epochStr == "0" || epochStr == "(none)" {
77+
epoch = 0
78+
} else {
79+
epoch, err = strconv.Atoi(epochStr)
80+
if err != nil {
81+
return pkg, err
82+
}
83+
}
84+
85+
return analyzer.Package{
86+
Name: fields[0],
87+
Epoch: epoch,
88+
Version: fields[2],
89+
Release: fields[3],
90+
}, nil
91+
}
92+
93+
func outputPkgInfo(dir string) (out []byte, err error) {
94+
const old = "%{NAME} %{EPOCH} %{VERSION} %{RELEASE}\n"
95+
const new = "%{NAME} %{EPOCHNUM} %{VERSION} %{RELEASE}\n"
96+
out, err = exec.Command("rpm", "--dbpath", dir, "-qa", "--qf", new).Output()
97+
if err != nil {
98+
return exec.Command("rpm", "--dbpath", dir, "-qa", "--qf", old).Output()
99+
}
100+
return out, nil
101+
}
102+
103+
func (a rpmPkgAnalyzer) RequiredFiles() []string {
104+
return []string{"var/lib/rpm/Packages"}
105+
}

analyzer/pkg/rpm/rpm_test.go

Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
package rpm
2+
3+
import (
4+
"io/ioutil"
5+
"reflect"
6+
"testing"
7+
8+
"github.com/knqyf263/fanal/analyzer"
9+
)
10+
11+
func TestParseRpmInfo(t *testing.T) {
12+
var tests = map[string]struct {
13+
path string
14+
pkgs []analyzer.Package
15+
}{
16+
"Valid": {
17+
path: "./testdata/valid",
18+
pkgs: []analyzer.Package{
19+
{Name: "centos-release", Version: "7", Release: "1.1503.el7.centos.2.8"},
20+
{Name: "filesystem", Version: "3.2", Release: "18.el7"},
21+
},
22+
},
23+
"ValidBig": {
24+
path: "./testdata/valid_big",
25+
pkgs: []analyzer.Package{
26+
{Name: "publicsuffix-list-dafsa", Epoch: 0, Version: "20180514", Release: "1.fc28"},
27+
{Name: "libreport-filesystem", Epoch: 0, Version: "2.9.5", Release: "1.fc28"},
28+
{Name: "fedora-gpg-keys", Epoch: 0, Version: "28", Release: "5"},
29+
{Name: "fedora-release", Epoch: 0, Version: "28", Release: "2"},
30+
{Name: "filesystem", Epoch: 0, Version: "3.8", Release: "2.fc28"},
31+
{Name: "tzdata", Epoch: 0, Version: "2018e", Release: "1.fc28"},
32+
{Name: "pcre2", Epoch: 0, Version: "10.31", Release: "10.fc28"},
33+
{Name: "glibc-minimal-langpack", Epoch: 0, Version: "2.27", Release: "32.fc28"},
34+
{Name: "glibc-common", Epoch: 0, Version: "2.27", Release: "32.fc28"},
35+
{Name: "bash", Epoch: 0, Version: "4.4.23", Release: "1.fc28"},
36+
{Name: "zlib", Epoch: 0, Version: "1.2.11", Release: "8.fc28"},
37+
{Name: "bzip2-libs", Epoch: 0, Version: "1.0.6", Release: "26.fc28"},
38+
{Name: "libcap", Epoch: 0, Version: "2.25", Release: "9.fc28"},
39+
{Name: "libgpg-error", Epoch: 0, Version: "1.31", Release: "1.fc28"},
40+
{Name: "libzstd", Epoch: 0, Version: "1.3.5", Release: "1.fc28"},
41+
{Name: "expat", Epoch: 0, Version: "2.2.5", Release: "3.fc28"},
42+
{Name: "nss-util", Epoch: 0, Version: "3.38.0", Release: "1.0.fc28"},
43+
{Name: "libcom_err", Epoch: 0, Version: "1.44.2", Release: "0.fc28"},
44+
{Name: "libffi", Epoch: 0, Version: "3.1", Release: "16.fc28"},
45+
{Name: "libgcrypt", Epoch: 0, Version: "1.8.3", Release: "1.fc28"},
46+
{Name: "libxml2", Epoch: 0, Version: "2.9.8", Release: "4.fc28"},
47+
{Name: "libacl", Epoch: 0, Version: "2.2.53", Release: "1.fc28"},
48+
{Name: "sed", Epoch: 0, Version: "4.5", Release: "1.fc28"},
49+
{Name: "libmount", Epoch: 0, Version: "2.32.1", Release: "1.fc28"},
50+
{Name: "p11-kit", Epoch: 0, Version: "0.23.12", Release: "1.fc28"},
51+
{Name: "libidn2", Epoch: 0, Version: "2.0.5", Release: "1.fc28"},
52+
{Name: "libcap-ng", Epoch: 0, Version: "0.7.9", Release: "4.fc28"},
53+
{Name: "lz4-libs", Epoch: 0, Version: "1.8.1.2", Release: "4.fc28"},
54+
{Name: "libassuan", Epoch: 0, Version: "2.5.1", Release: "3.fc28"},
55+
{Name: "keyutils-libs", Epoch: 0, Version: "1.5.10", Release: "6.fc28"},
56+
{Name: "glib2", Epoch: 0, Version: "2.56.1", Release: "4.fc28"},
57+
{Name: "systemd-libs", Epoch: 0, Version: "238", Release: "9.git0e0aa59.fc28"},
58+
{Name: "dbus-libs", Epoch: 1, Version: "1.12.10", Release: "1.fc28"},
59+
{Name: "libtasn1", Epoch: 0, Version: "4.13", Release: "2.fc28"},
60+
{Name: "ca-certificates", Epoch: 0, Version: "2018.2.24", Release: "1.0.fc28"},
61+
{Name: "libarchive", Epoch: 0, Version: "3.3.1", Release: "4.fc28"},
62+
{Name: "openssl", Epoch: 1, Version: "1.1.0h", Release: "3.fc28"},
63+
{Name: "libusbx", Epoch: 0, Version: "1.0.22", Release: "1.fc28"},
64+
{Name: "libsemanage", Epoch: 0, Version: "2.8", Release: "2.fc28"},
65+
{Name: "libutempter", Epoch: 0, Version: "1.1.6", Release: "14.fc28"},
66+
{Name: "mpfr", Epoch: 0, Version: "3.1.6", Release: "1.fc28"},
67+
{Name: "gnutls", Epoch: 0, Version: "3.6.3", Release: "4.fc28"},
68+
{Name: "gzip", Epoch: 0, Version: "1.9", Release: "3.fc28"},
69+
{Name: "acl", Epoch: 0, Version: "2.2.53", Release: "1.fc28"},
70+
{Name: "nss-softokn-freebl", Epoch: 0, Version: "3.38.0", Release: "1.0.fc28"},
71+
{Name: "nss", Epoch: 0, Version: "3.38.0", Release: "1.0.fc28"},
72+
{Name: "libmetalink", Epoch: 0, Version: "0.1.3", Release: "6.fc28"},
73+
{Name: "libdb-utils", Epoch: 0, Version: "5.3.28", Release: "30.fc28"},
74+
{Name: "file-libs", Epoch: 0, Version: "5.33", Release: "7.fc28"},
75+
{Name: "libsss_idmap", Epoch: 0, Version: "1.16.3", Release: "2.fc28"},
76+
{Name: "libsigsegv", Epoch: 0, Version: "2.11", Release: "5.fc28"},
77+
{Name: "krb5-libs", Epoch: 0, Version: "1.16.1", Release: "13.fc28"},
78+
{Name: "libnsl2", Epoch: 0, Version: "1.2.0", Release: "2.20180605git4a062cf.fc28"},
79+
{Name: "python3-pip", Epoch: 0, Version: "9.0.3", Release: "2.fc28"},
80+
{Name: "python3", Epoch: 0, Version: "3.6.6", Release: "1.fc28"},
81+
{Name: "pam", Epoch: 0, Version: "1.3.1", Release: "1.fc28"},
82+
{Name: "python3-gobject-base", Epoch: 0, Version: "3.28.3", Release: "1.fc28"},
83+
{Name: "python3-smartcols", Epoch: 0, Version: "0.3.0", Release: "2.fc28"},
84+
{Name: "python3-iniparse", Epoch: 0, Version: "0.4", Release: "30.fc28"},
85+
{Name: "openldap", Epoch: 0, Version: "2.4.46", Release: "3.fc28"},
86+
{Name: "libseccomp", Epoch: 0, Version: "2.3.3", Release: "2.fc28"},
87+
{Name: "npth", Epoch: 0, Version: "1.5", Release: "4.fc28"},
88+
{Name: "gpgme", Epoch: 0, Version: "1.10.0", Release: "4.fc28"},
89+
{Name: "json-c", Epoch: 0, Version: "0.13.1", Release: "2.fc28"},
90+
{Name: "libyaml", Epoch: 0, Version: "0.1.7", Release: "5.fc28"},
91+
{Name: "libpkgconf", Epoch: 0, Version: "1.4.2", Release: "1.fc28"},
92+
{Name: "pkgconf-pkg-config", Epoch: 0, Version: "1.4.2", Release: "1.fc28"},
93+
{Name: "iptables-libs", Epoch: 0, Version: "1.6.2", Release: "3.fc28"},
94+
{Name: "device-mapper-libs", Epoch: 0, Version: "1.02.146", Release: "5.fc28"},
95+
{Name: "systemd-pam", Epoch: 0, Version: "238", Release: "9.git0e0aa59.fc28"},
96+
{Name: "systemd", Epoch: 0, Version: "238", Release: "9.git0e0aa59.fc28"},
97+
{Name: "elfutils-default-yama-scope", Epoch: 0, Version: "0.173", Release: "1.fc28"},
98+
{Name: "libcurl", Epoch: 0, Version: "7.59.0", Release: "6.fc28"},
99+
{Name: "python3-librepo", Epoch: 0, Version: "1.8.1", Release: "7.fc28"},
100+
{Name: "rpm-plugin-selinux", Epoch: 0, Version: "4.14.1", Release: "9.fc28"},
101+
{Name: "rpm", Epoch: 0, Version: "4.14.1", Release: "9.fc28"},
102+
{Name: "libdnf", Epoch: 0, Version: "0.11.1", Release: "3.fc28"},
103+
{Name: "rpm-build-libs", Epoch: 0, Version: "4.14.1", Release: "9.fc28"},
104+
{Name: "python3-rpm", Epoch: 0, Version: "4.14.1", Release: "9.fc28"},
105+
{Name: "dnf", Epoch: 0, Version: "2.7.5", Release: "12.fc28"},
106+
{Name: "deltarpm", Epoch: 0, Version: "3.6", Release: "25.fc28"},
107+
{Name: "sssd-client", Epoch: 0, Version: "1.16.3", Release: "2.fc28"},
108+
{Name: "cracklib-dicts", Epoch: 0, Version: "2.9.6", Release: "13.fc28"},
109+
{Name: "tar", Epoch: 2, Version: "1.30", Release: "3.fc28"},
110+
{Name: "diffutils", Epoch: 0, Version: "3.6", Release: "4.fc28"},
111+
{Name: "langpacks-en", Epoch: 0, Version: "1.0", Release: "12.fc28"},
112+
{Name: "gpg-pubkey", Epoch: 0, Version: "9db62fb1", Release: "59920156"},
113+
{Name: "libgcc", Epoch: 0, Version: "8.1.1", Release: "5.fc28"},
114+
{Name: "pkgconf-m4", Epoch: 0, Version: "1.4.2", Release: "1.fc28"},
115+
{Name: "dnf-conf", Epoch: 0, Version: "2.7.5", Release: "12.fc28"},
116+
{Name: "fedora-repos", Epoch: 0, Version: "28", Release: "5"},
117+
{Name: "setup", Epoch: 0, Version: "2.11.4", Release: "1.fc28"},
118+
{Name: "basesystem", Epoch: 0, Version: "11", Release: "5.fc28"},
119+
{Name: "ncurses-base", Epoch: 0, Version: "6.1", Release: "5.20180224.fc28"},
120+
{Name: "libselinux", Epoch: 0, Version: "2.8", Release: "1.fc28"},
121+
{Name: "ncurses-libs", Epoch: 0, Version: "6.1", Release: "5.20180224.fc28"},
122+
{Name: "glibc", Epoch: 0, Version: "2.27", Release: "32.fc28"},
123+
{Name: "libsepol", Epoch: 0, Version: "2.8", Release: "1.fc28"},
124+
{Name: "xz-libs", Epoch: 0, Version: "5.2.4", Release: "2.fc28"},
125+
{Name: "info", Epoch: 0, Version: "6.5", Release: "4.fc28"},
126+
{Name: "libdb", Epoch: 0, Version: "5.3.28", Release: "30.fc28"},
127+
{Name: "elfutils-libelf", Epoch: 0, Version: "0.173", Release: "1.fc28"},
128+
{Name: "popt", Epoch: 0, Version: "1.16", Release: "14.fc28"},
129+
{Name: "nspr", Epoch: 0, Version: "4.19.0", Release: "1.fc28"},
130+
{Name: "libxcrypt", Epoch: 0, Version: "4.1.2", Release: "1.fc28"},
131+
{Name: "lua-libs", Epoch: 0, Version: "5.3.4", Release: "10.fc28"},
132+
{Name: "libuuid", Epoch: 0, Version: "2.32.1", Release: "1.fc28"},
133+
{Name: "readline", Epoch: 0, Version: "7.0", Release: "11.fc28"},
134+
{Name: "libattr", Epoch: 0, Version: "2.4.48", Release: "3.fc28"},
135+
{Name: "coreutils-single", Epoch: 0, Version: "8.29", Release: "7.fc28"},
136+
{Name: "libblkid", Epoch: 0, Version: "2.32.1", Release: "1.fc28"},
137+
{Name: "gmp", Epoch: 1, Version: "6.1.2", Release: "7.fc28"},
138+
{Name: "libunistring", Epoch: 0, Version: "0.9.10", Release: "1.fc28"},
139+
{Name: "sqlite-libs", Epoch: 0, Version: "3.22.0", Release: "4.fc28"},
140+
{Name: "audit-libs", Epoch: 0, Version: "2.8.4", Release: "2.fc28"},
141+
{Name: "chkconfig", Epoch: 0, Version: "1.10", Release: "4.fc28"},
142+
{Name: "libsmartcols", Epoch: 0, Version: "2.32.1", Release: "1.fc28"},
143+
{Name: "pcre", Epoch: 0, Version: "8.42", Release: "3.fc28"},
144+
{Name: "grep", Epoch: 0, Version: "3.1", Release: "5.fc28"},
145+
{Name: "crypto-policies", Epoch: 0, Version: "20180425", Release: "5.git6ad4018.fc28"},
146+
{Name: "gdbm-libs", Epoch: 1, Version: "1.14.1", Release: "4.fc28"},
147+
{Name: "p11-kit-trust", Epoch: 0, Version: "0.23.12", Release: "1.fc28"},
148+
{Name: "openssl-libs", Epoch: 1, Version: "1.1.0h", Release: "3.fc28"},
149+
{Name: "ima-evm-utils", Epoch: 0, Version: "1.1", Release: "2.fc28"},
150+
{Name: "gdbm", Epoch: 1, Version: "1.14.1", Release: "4.fc28"},
151+
{Name: "gobject-introspection", Epoch: 0, Version: "1.56.1", Release: "1.fc28"},
152+
{Name: "shadow-utils", Epoch: 2, Version: "4.6", Release: "1.fc28"},
153+
{Name: "libpsl", Epoch: 0, Version: "0.20.2", Release: "2.fc28"},
154+
{Name: "nettle", Epoch: 0, Version: "3.4", Release: "2.fc28"},
155+
{Name: "libfdisk", Epoch: 0, Version: "2.32.1", Release: "1.fc28"},
156+
{Name: "cracklib", Epoch: 0, Version: "2.9.6", Release: "13.fc28"},
157+
{Name: "libcomps", Epoch: 0, Version: "0.1.8", Release: "11.fc28"},
158+
{Name: "nss-softokn", Epoch: 0, Version: "3.38.0", Release: "1.0.fc28"},
159+
{Name: "nss-sysinit", Epoch: 0, Version: "3.38.0", Release: "1.0.fc28"},
160+
{Name: "libksba", Epoch: 0, Version: "1.3.5", Release: "7.fc28"},
161+
{Name: "kmod-libs", Epoch: 0, Version: "25", Release: "2.fc28"},
162+
{Name: "libsss_nss_idmap", Epoch: 0, Version: "1.16.3", Release: "2.fc28"},
163+
{Name: "libverto", Epoch: 0, Version: "0.3.0", Release: "5.fc28"},
164+
{Name: "gawk", Epoch: 0, Version: "4.2.1", Release: "1.fc28"},
165+
{Name: "libtirpc", Epoch: 0, Version: "1.0.3", Release: "3.rc2.fc28"},
166+
{Name: "python3-libs", Epoch: 0, Version: "3.6.6", Release: "1.fc28"},
167+
{Name: "python3-setuptools", Epoch: 0, Version: "39.2.0", Release: "6.fc28"},
168+
{Name: "libpwquality", Epoch: 0, Version: "1.4.0", Release: "7.fc28"},
169+
{Name: "util-linux", Epoch: 0, Version: "2.32.1", Release: "1.fc28"},
170+
{Name: "python3-libcomps", Epoch: 0, Version: "0.1.8", Release: "11.fc28"},
171+
{Name: "python3-six", Epoch: 0, Version: "1.11.0", Release: "3.fc28"},
172+
{Name: "cyrus-sasl-lib", Epoch: 0, Version: "2.1.27", Release: "0.2rc7.fc28"},
173+
{Name: "libssh", Epoch: 0, Version: "0.8.2", Release: "1.fc28"},
174+
{Name: "qrencode-libs", Epoch: 0, Version: "3.4.4", Release: "5.fc28"},
175+
{Name: "gnupg2", Epoch: 0, Version: "2.2.8", Release: "1.fc28"},
176+
{Name: "python3-gpg", Epoch: 0, Version: "1.10.0", Release: "4.fc28"},
177+
{Name: "libargon2", Epoch: 0, Version: "20161029", Release: "5.fc28"},
178+
{Name: "libmodulemd", Epoch: 0, Version: "1.6.2", Release: "2.fc28"},
179+
{Name: "pkgconf", Epoch: 0, Version: "1.4.2", Release: "1.fc28"},
180+
{Name: "libpcap", Epoch: 14, Version: "1.9.0", Release: "1.fc28"},
181+
{Name: "device-mapper", Epoch: 0, Version: "1.02.146", Release: "5.fc28"},
182+
{Name: "cryptsetup-libs", Epoch: 0, Version: "2.0.4", Release: "1.fc28"},
183+
{Name: "elfutils-libs", Epoch: 0, Version: "0.173", Release: "1.fc28"},
184+
{Name: "dbus", Epoch: 1, Version: "1.12.10", Release: "1.fc28"},
185+
{Name: "libnghttp2", Epoch: 0, Version: "1.32.1", Release: "1.fc28"},
186+
{Name: "librepo", Epoch: 0, Version: "1.8.1", Release: "7.fc28"},
187+
{Name: "curl", Epoch: 0, Version: "7.59.0", Release: "6.fc28"},
188+
{Name: "rpm-libs", Epoch: 0, Version: "4.14.1", Release: "9.fc28"},
189+
{Name: "libsolv", Epoch: 0, Version: "0.6.35", Release: "1.fc28"},
190+
{Name: "python3-hawkey", Epoch: 0, Version: "0.11.1", Release: "3.fc28"},
191+
{Name: "rpm-sign-libs", Epoch: 0, Version: "4.14.1", Release: "9.fc28"},
192+
{Name: "python3-dnf", Epoch: 0, Version: "2.7.5", Release: "12.fc28"},
193+
{Name: "dnf-yum", Epoch: 0, Version: "2.7.5", Release: "12.fc28"},
194+
{Name: "rpm-plugin-systemd-inhibit", Epoch: 0, Version: "4.14.1", Release: "9.fc28"},
195+
{Name: "nss-tools", Epoch: 0, Version: "3.38.0", Release: "1.0.fc28"},
196+
{Name: "openssl-pkcs11", Epoch: 0, Version: "0.4.8", Release: "1.fc28"},
197+
{Name: "vim-minimal", Epoch: 2, Version: "8.1.328", Release: "1.fc28"},
198+
{Name: "glibc-langpack-en", Epoch: 0, Version: "2.27", Release: "32.fc28"},
199+
{Name: "rootfiles", Epoch: 0, Version: "8.1", Release: "22.fc28"},
200+
},
201+
},
202+
}
203+
a := rpmPkgAnalyzer{}
204+
for i, v := range tests {
205+
bytes, err := ioutil.ReadFile(v.path)
206+
if err != nil {
207+
t.Errorf("%s : can't open file %s", i, v.path)
208+
}
209+
pkgs, err := a.parsePkgInfo(bytes)
210+
if err != nil {
211+
t.Errorf("%s : catch the error : %v", i, err)
212+
}
213+
if !reflect.DeepEqual(v.pkgs, pkgs) {
214+
t.Errorf("[%s]\nexpected : %v\nactual : %v", i, v.pkgs, pkgs)
215+
}
216+
}
217+
}

analyzer/pkg/rpm/testdata/valid

11 MB
Binary file not shown.

analyzer/pkg/rpm/testdata/valid_big

8.39 MB
Binary file not shown.

go.mod

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
go 1.12
22

33
require (
4-
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc // indirect
5-
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf // indirect
4+
cloud.google.com/go v0.37.4 // indirect
5+
github.com/GoogleCloudPlatform/docker-credential-gcr v1.5.0 // indirect
66
github.com/aws/aws-sdk-go v1.19.11
77
github.com/coreos/clair v0.0.0-20180919182544-44ae4bc9590a
88
github.com/d4l3k/messagediff v1.2.1
99
github.com/deckarep/golang-set v1.7.1
1010
github.com/docker/distribution v0.0.0-20180920194744-16128bbac47f
1111
github.com/docker/docker v0.0.0-20180924202107-a9c061deec0f
1212
github.com/genuinetools/reg v0.16.1-0.20190102165523-d959057b30da
13+
github.com/google/subcommands v1.0.1 // indirect
1314
github.com/knqyf263/nested v0.0.1
1415
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2
1516
github.com/pkg/errors v0.8.1
16-
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e
17+
github.com/prometheus/common v0.2.0
18+
github.com/toqueteos/webbrowser v1.1.0 // indirect
1719
golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5
1820
golang.org/x/xerrors v0.0.0-20190315151331-d61658bd2e18
19-
gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect
2021
)
2122

2223
module github.com/knqyf263/fanal

0 commit comments

Comments
 (0)