mirror of
https://github.com/anchore/syft.git
synced 2026-11-05 08:56:41 +01:00
Follow convention for naming catalogers (#2277)
* follow convention for naming catalogers Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * fix cataloger name example Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> --------- Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
/*
|
||||
Package alpine provides a concrete Cataloger implementations for packages relating to the Alpine linux distribution.
|
||||
*/
|
||||
package alpine
|
||||
|
||||
import (
|
||||
"github.com/anchore/syft/syft/pkg"
|
||||
"github.com/anchore/syft/syft/pkg/cataloger/generic"
|
||||
)
|
||||
|
||||
// NewDBCataloger returns a new cataloger object initialized for Alpine package DB flat-file stores.
|
||||
func NewDBCataloger() *generic.Cataloger {
|
||||
return generic.NewCataloger("apk-db-cataloger").
|
||||
WithParserByGlobs(parseApkDB, pkg.ApkDBGlob)
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package alpine
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/anchore/syft/syft/pkg/cataloger/internal/pkgtest"
|
||||
)
|
||||
|
||||
func TestCataloger_Globs(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
fixture string
|
||||
expected []string
|
||||
}{
|
||||
{
|
||||
name: "obtain DB files",
|
||||
fixture: "test-fixtures/glob-paths",
|
||||
expected: []string{"lib/apk/db/installed"},
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
pkgtest.NewCatalogTester().
|
||||
FromDirectory(t, test.fixture).
|
||||
ExpectsResolverContentQueries(test.expected).
|
||||
IgnoreUnfulfilledPathResponses("etc/apk/repositories").
|
||||
TestCataloger(t, NewDBCataloger())
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
package alpine
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/anchore/packageurl-go"
|
||||
"github.com/anchore/syft/syft/file"
|
||||
"github.com/anchore/syft/syft/license"
|
||||
"github.com/anchore/syft/syft/linux"
|
||||
"github.com/anchore/syft/syft/pkg"
|
||||
)
|
||||
|
||||
func newPackage(d parsedData, release *linux.Release, dbLocation file.Location) pkg.Package {
|
||||
// check if license is a valid spdx expression before splitting
|
||||
licenseStrings := []string{d.License}
|
||||
_, err := license.ParseExpression(d.License)
|
||||
if err != nil {
|
||||
// invalid so update to split on space
|
||||
licenseStrings = strings.Split(d.License, " ")
|
||||
}
|
||||
|
||||
p := pkg.Package{
|
||||
Name: d.Package,
|
||||
Version: d.Version,
|
||||
Locations: file.NewLocationSet(dbLocation.WithAnnotation(pkg.EvidenceAnnotationKey, pkg.PrimaryEvidenceAnnotation)),
|
||||
Licenses: pkg.NewLicenseSet(pkg.NewLicensesFromLocation(dbLocation, licenseStrings...)...),
|
||||
PURL: packageURL(d.ApkDBEntry, release),
|
||||
Type: pkg.ApkPkg,
|
||||
Metadata: d.ApkDBEntry,
|
||||
}
|
||||
|
||||
p.SetID()
|
||||
|
||||
return p
|
||||
}
|
||||
|
||||
// packageURL returns the PURL for the specific Alpine package (see https://github.com/package-url/purl-spec)
|
||||
func packageURL(m pkg.ApkDBEntry, distro *linux.Release) string {
|
||||
if distro == nil {
|
||||
return ""
|
||||
}
|
||||
|
||||
qualifiers := map[string]string{
|
||||
pkg.PURLQualifierArch: m.Architecture,
|
||||
}
|
||||
|
||||
if m.OriginPackage != m.Package {
|
||||
qualifiers[pkg.PURLQualifierUpstream] = m.OriginPackage
|
||||
}
|
||||
|
||||
return packageurl.NewPackageURL(
|
||||
packageurl.TypeAlpine,
|
||||
strings.ToLower(distro.ID),
|
||||
m.Package,
|
||||
m.Version,
|
||||
pkg.PURLQualifiers(
|
||||
qualifiers,
|
||||
distro,
|
||||
),
|
||||
"",
|
||||
).ToString()
|
||||
}
|
||||
@@ -0,0 +1,210 @@
|
||||
package alpine
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/go-test/deep"
|
||||
"github.com/sergi/go-diff/diffmatchpatch"
|
||||
|
||||
"github.com/anchore/packageurl-go"
|
||||
"github.com/anchore/syft/syft/linux"
|
||||
"github.com/anchore/syft/syft/pkg"
|
||||
)
|
||||
|
||||
func Test_PackageURL(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
metadata parsedData
|
||||
distro linux.Release
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
name: "non-alpine distro",
|
||||
metadata: parsedData{
|
||||
License: "",
|
||||
ApkDBEntry: pkg.ApkDBEntry{
|
||||
Package: "p",
|
||||
Version: "v",
|
||||
Architecture: "a",
|
||||
},
|
||||
},
|
||||
distro: linux.Release{
|
||||
ID: "something else",
|
||||
VersionID: "3.4.6",
|
||||
},
|
||||
expected: "pkg:apk/something%20else/p@v?arch=a&distro=something%20else-3.4.6",
|
||||
},
|
||||
{
|
||||
name: "gocase",
|
||||
metadata: parsedData{
|
||||
License: "",
|
||||
ApkDBEntry: pkg.ApkDBEntry{
|
||||
Package: "p",
|
||||
Version: "v",
|
||||
Architecture: "a",
|
||||
},
|
||||
},
|
||||
distro: linux.Release{
|
||||
ID: "alpine",
|
||||
VersionID: "3.4.6",
|
||||
},
|
||||
expected: "pkg:apk/alpine/p@v?arch=a&distro=alpine-3.4.6",
|
||||
},
|
||||
{
|
||||
name: "missing architecture",
|
||||
metadata: parsedData{
|
||||
License: "",
|
||||
ApkDBEntry: pkg.ApkDBEntry{
|
||||
Package: "p",
|
||||
Version: "v",
|
||||
},
|
||||
},
|
||||
distro: linux.Release{
|
||||
ID: "alpine",
|
||||
VersionID: "3.4.6",
|
||||
},
|
||||
expected: "pkg:apk/alpine/p@v?distro=alpine-3.4.6",
|
||||
},
|
||||
// verify #351
|
||||
{
|
||||
metadata: parsedData{
|
||||
License: "",
|
||||
ApkDBEntry: pkg.ApkDBEntry{
|
||||
Package: "g++",
|
||||
Version: "v84",
|
||||
Architecture: "am86",
|
||||
},
|
||||
},
|
||||
distro: linux.Release{
|
||||
ID: "alpine",
|
||||
VersionID: "3.4.6",
|
||||
},
|
||||
expected: "pkg:apk/alpine/g++@v84?arch=am86&distro=alpine-3.4.6",
|
||||
},
|
||||
{
|
||||
metadata: parsedData{
|
||||
License: "",
|
||||
ApkDBEntry: pkg.ApkDBEntry{
|
||||
Package: "g plus plus",
|
||||
Version: "v84",
|
||||
Architecture: "am86",
|
||||
},
|
||||
},
|
||||
distro: linux.Release{
|
||||
ID: "alpine",
|
||||
VersionID: "3.15.0",
|
||||
},
|
||||
expected: "pkg:apk/alpine/g%20plus%20plus@v84?arch=am86&distro=alpine-3.15.0",
|
||||
},
|
||||
{
|
||||
name: "add source information as qualifier",
|
||||
metadata: parsedData{
|
||||
License: "",
|
||||
ApkDBEntry: pkg.ApkDBEntry{
|
||||
Package: "p",
|
||||
Version: "v",
|
||||
Architecture: "a",
|
||||
OriginPackage: "origin",
|
||||
},
|
||||
},
|
||||
distro: linux.Release{
|
||||
ID: "alpine",
|
||||
VersionID: "3.4.6",
|
||||
},
|
||||
expected: "pkg:apk/alpine/p@v?arch=a&upstream=origin&distro=alpine-3.4.6",
|
||||
},
|
||||
{
|
||||
name: "wolfi distro",
|
||||
metadata: parsedData{
|
||||
License: "",
|
||||
ApkDBEntry: pkg.ApkDBEntry{
|
||||
Package: "p",
|
||||
Version: "v",
|
||||
Architecture: "a",
|
||||
},
|
||||
},
|
||||
distro: linux.Release{
|
||||
ID: "wolfi",
|
||||
VersionID: "20221230",
|
||||
},
|
||||
expected: "pkg:apk/wolfi/p@v?arch=a&distro=wolfi-20221230",
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
actual := packageURL(test.metadata.ApkDBEntry, &test.distro)
|
||||
if actual != test.expected {
|
||||
dmp := diffmatchpatch.New()
|
||||
diffs := dmp.DiffMain(test.expected, actual, true)
|
||||
t.Errorf("diff: %s", dmp.DiffPrettyText(diffs))
|
||||
}
|
||||
|
||||
if test.expected == "" {
|
||||
return
|
||||
}
|
||||
|
||||
// verify packageurl can parse
|
||||
purl, err := packageurl.FromString(actual)
|
||||
if err != nil {
|
||||
t.Errorf("cannot re-parse purl: %s", actual)
|
||||
}
|
||||
if purl.Name != test.metadata.Package {
|
||||
dmp := diffmatchpatch.New()
|
||||
diffs := dmp.DiffMain(test.metadata.Package, purl.Name, true)
|
||||
t.Errorf("invalid purl name: %s", dmp.DiffPrettyText(diffs))
|
||||
}
|
||||
if purl.Version != test.metadata.Version {
|
||||
dmp := diffmatchpatch.New()
|
||||
diffs := dmp.DiffMain(test.metadata.Version, purl.Version, true)
|
||||
t.Errorf("invalid purl version: %s", dmp.DiffPrettyText(diffs))
|
||||
}
|
||||
if purl.Qualifiers.Map()["arch"] != test.metadata.Architecture {
|
||||
dmp := diffmatchpatch.New()
|
||||
diffs := dmp.DiffMain(test.metadata.Architecture, purl.Qualifiers.Map()["arch"], true)
|
||||
t.Errorf("invalid purl architecture: %s", dmp.DiffPrettyText(diffs))
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestApkMetadata_FileOwner(t *testing.T) {
|
||||
tests := []struct {
|
||||
metadata pkg.ApkDBEntry
|
||||
expected []string
|
||||
}{
|
||||
{
|
||||
metadata: pkg.ApkDBEntry{
|
||||
Files: []pkg.ApkFileRecord{
|
||||
{Path: "/somewhere"},
|
||||
{Path: "/else"},
|
||||
},
|
||||
},
|
||||
expected: []string{
|
||||
"/else",
|
||||
"/somewhere",
|
||||
},
|
||||
},
|
||||
{
|
||||
metadata: pkg.ApkDBEntry{
|
||||
Files: []pkg.ApkFileRecord{
|
||||
{Path: "/somewhere"},
|
||||
{Path: ""},
|
||||
},
|
||||
},
|
||||
expected: []string{
|
||||
"/somewhere",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(strings.Join(test.expected, ","), func(t *testing.T) {
|
||||
actual := test.metadata.OwnedFiles()
|
||||
for _, d := range deep.Equal(test.expected, actual) {
|
||||
t.Errorf("diff: %+v", d)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,440 @@
|
||||
package alpine
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"io"
|
||||
"path"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/anchore/syft/internal"
|
||||
"github.com/anchore/syft/internal/log"
|
||||
"github.com/anchore/syft/syft/artifact"
|
||||
"github.com/anchore/syft/syft/file"
|
||||
"github.com/anchore/syft/syft/linux"
|
||||
"github.com/anchore/syft/syft/pkg"
|
||||
"github.com/anchore/syft/syft/pkg/cataloger/generic"
|
||||
)
|
||||
|
||||
// integrity check
|
||||
var _ generic.Parser = parseApkDB
|
||||
|
||||
var (
|
||||
repoRegex = regexp.MustCompile(`(?m)^https://.*\.alpinelinux\.org/alpine/v([^/]+)/([a-zA-Z0-9_]+)$`)
|
||||
)
|
||||
|
||||
type parsedData struct {
|
||||
License string `mapstructure:"L" json:"license"`
|
||||
pkg.ApkDBEntry
|
||||
}
|
||||
|
||||
// parseApkDB parses packages from a given APK "installed" flat-file DB. For more
|
||||
// information on specific fields, see https://wiki.alpinelinux.org/wiki/Apk_spec.
|
||||
//
|
||||
//nolint:funlen,gocognit
|
||||
func parseApkDB(resolver file.Resolver, env *generic.Environment, reader file.LocationReadCloser) ([]pkg.Package, []artifact.Relationship, error) {
|
||||
scanner := bufio.NewScanner(reader)
|
||||
|
||||
var apks []parsedData
|
||||
var currentEntry parsedData
|
||||
entryParsingInProgress := false
|
||||
fileParsingCtx := newApkFileParsingContext()
|
||||
|
||||
// creating a dedicated append-like function here instead of using `append(...)`
|
||||
// below since there is nontrivial logic to be performed for each finalized apk
|
||||
// entry.
|
||||
appendApk := func(p parsedData) {
|
||||
if files := fileParsingCtx.files; len(files) >= 1 {
|
||||
// attached accumulated files to current package
|
||||
p.Files = files
|
||||
|
||||
// reset file parsing for next use
|
||||
fileParsingCtx = newApkFileParsingContext()
|
||||
}
|
||||
|
||||
nilFieldsToEmptySlice(&p)
|
||||
apks = append(apks, p)
|
||||
}
|
||||
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
|
||||
if line == "" {
|
||||
// i.e. apk entry separator
|
||||
|
||||
if entryParsingInProgress {
|
||||
// current entry is complete
|
||||
appendApk(currentEntry)
|
||||
}
|
||||
|
||||
entryParsingInProgress = false
|
||||
|
||||
// zero-out currentEntry for use by any future entry
|
||||
currentEntry = parsedData{}
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
field := parseApkField(line)
|
||||
if field == nil {
|
||||
log.Warnf("unable to parse field data from line %q", line)
|
||||
continue
|
||||
}
|
||||
if len(field.name) == 0 {
|
||||
log.Warnf("failed to parse field name from line %q", line)
|
||||
continue
|
||||
}
|
||||
if len(field.value) == 0 {
|
||||
log.Debugf("line %q: parsed field %q appears to have an empty value, skipping", line, field.name)
|
||||
continue
|
||||
}
|
||||
|
||||
entryParsingInProgress = true
|
||||
|
||||
field.apply(¤tEntry, fileParsingCtx)
|
||||
}
|
||||
|
||||
if entryParsingInProgress {
|
||||
// There was no final empty line, so currentEntry hasn't been added to the
|
||||
// collection yet; but we've now reached the end of scanning, so let's be sure to
|
||||
// add currentEntry to the collection.
|
||||
appendApk(currentEntry)
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil {
|
||||
return nil, nil, fmt.Errorf("failed to parse APK installed DB file: %w", err)
|
||||
}
|
||||
|
||||
var r *linux.Release
|
||||
if env != nil {
|
||||
r = env.LinuxRelease
|
||||
}
|
||||
// this is somewhat ugly, but better than completely failing when we can't find the release,
|
||||
// e.g. embedded deeper in the tree, like containers or chroots.
|
||||
// but we now have no way of handling different repository sources. On the other hand,
|
||||
// we never could before this. At least now, we can handle some.
|
||||
// This should get fixed with https://gitlab.alpinelinux.org/alpine/apk-tools/-/issues/10875
|
||||
if r == nil {
|
||||
// find the repositories file from the relative directory of the DB file
|
||||
releases := findReleases(resolver, reader.Location.RealPath)
|
||||
|
||||
if len(releases) > 0 {
|
||||
r = &releases[0]
|
||||
}
|
||||
}
|
||||
|
||||
pkgs := make([]pkg.Package, 0, len(apks))
|
||||
for _, apk := range apks {
|
||||
pkgs = append(pkgs, newPackage(apk, r, reader.Location))
|
||||
}
|
||||
|
||||
return pkgs, discoverPackageDependencies(pkgs), nil
|
||||
}
|
||||
|
||||
func findReleases(resolver file.Resolver, dbPath string) []linux.Release {
|
||||
if resolver == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
reposLocation := path.Clean(path.Join(path.Dir(dbPath), "../../../etc/apk/repositories"))
|
||||
locations, err := resolver.FilesByPath(reposLocation)
|
||||
if err != nil {
|
||||
log.Tracef("unable to find APK repositories file %q: %+v", reposLocation, err)
|
||||
return nil
|
||||
}
|
||||
|
||||
if len(locations) == 0 {
|
||||
return nil
|
||||
}
|
||||
location := locations[0]
|
||||
|
||||
reposReader, err := resolver.FileContentsByLocation(location)
|
||||
if err != nil {
|
||||
log.Tracef("unable to fetch contents for APK repositories file %q: %+v", reposLocation, err)
|
||||
return nil
|
||||
}
|
||||
|
||||
return parseReleasesFromAPKRepository(file.LocationReadCloser{
|
||||
Location: location,
|
||||
ReadCloser: reposReader,
|
||||
})
|
||||
}
|
||||
|
||||
func parseReleasesFromAPKRepository(reader file.LocationReadCloser) []linux.Release {
|
||||
var releases []linux.Release
|
||||
|
||||
reposB, err := io.ReadAll(reader)
|
||||
if err != nil {
|
||||
log.Tracef("unable to read APK repositories file %q: %+v", reader.Location.RealPath, err)
|
||||
return nil
|
||||
}
|
||||
|
||||
parts := repoRegex.FindAllStringSubmatch(string(reposB), -1)
|
||||
for _, part := range parts {
|
||||
if len(part) >= 3 {
|
||||
releases = append(releases, linux.Release{
|
||||
Name: "Alpine Linux",
|
||||
ID: "alpine",
|
||||
VersionID: part[1],
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return releases
|
||||
}
|
||||
|
||||
func parseApkField(line string) *apkField {
|
||||
parts := strings.SplitN(line, ":", 2)
|
||||
if len(parts) != 2 {
|
||||
return nil
|
||||
}
|
||||
|
||||
f := apkField{
|
||||
name: parts[0],
|
||||
value: parts[1],
|
||||
}
|
||||
|
||||
return &f
|
||||
}
|
||||
|
||||
type apkField struct {
|
||||
name string
|
||||
value string
|
||||
}
|
||||
|
||||
//nolint:funlen
|
||||
func (f apkField) apply(p *parsedData, ctx *apkFileParsingContext) {
|
||||
switch f.name {
|
||||
// APKINDEX field parsing
|
||||
|
||||
case "P":
|
||||
p.Package = f.value
|
||||
case "o":
|
||||
p.OriginPackage = f.value
|
||||
case "m":
|
||||
p.Maintainer = f.value
|
||||
case "V":
|
||||
p.Version = f.value
|
||||
case "L":
|
||||
p.License = f.value
|
||||
case "A":
|
||||
p.Architecture = f.value
|
||||
case "U":
|
||||
p.URL = f.value
|
||||
case "T":
|
||||
p.Description = f.value
|
||||
case "S":
|
||||
i, err := strconv.Atoi(f.value)
|
||||
if err != nil {
|
||||
log.Warnf("unable to parse value %q for field %q: %w", f.value, f.name, err)
|
||||
return
|
||||
}
|
||||
|
||||
p.Size = i
|
||||
case "I":
|
||||
i, err := strconv.Atoi(f.value)
|
||||
if err != nil {
|
||||
log.Warnf("unable to parse value %q for field %q: %w", f.value, f.name, err)
|
||||
return
|
||||
}
|
||||
|
||||
p.InstalledSize = i
|
||||
case "D":
|
||||
deps := parseListValue(f.value)
|
||||
p.Dependencies = deps
|
||||
case "p":
|
||||
provides := parseListValue(f.value)
|
||||
p.Provides = provides
|
||||
case "C":
|
||||
p.Checksum = f.value
|
||||
case "c":
|
||||
p.GitCommit = f.value
|
||||
|
||||
// File/directory field parsing:
|
||||
|
||||
case "F":
|
||||
directory := path.Join("/", f.value)
|
||||
|
||||
ctx.files = append(ctx.files, pkg.ApkFileRecord{Path: directory})
|
||||
ctx.indexOfLatestDirectory = len(ctx.files) - 1
|
||||
case "M":
|
||||
i := ctx.indexOfLatestDirectory
|
||||
latest := ctx.files[i]
|
||||
|
||||
var ok bool
|
||||
latest.OwnerUID, latest.OwnerGID, latest.Permissions, ok = processFileInfo(f.value)
|
||||
if !ok {
|
||||
log.Warnf("unexpected value for APK ACL field %q: %q", f.name, f.value)
|
||||
return
|
||||
}
|
||||
|
||||
// save updated directory
|
||||
ctx.files[i] = latest
|
||||
case "R":
|
||||
var regularFile string
|
||||
|
||||
dirIndex := ctx.indexOfLatestDirectory
|
||||
if dirIndex < 0 {
|
||||
regularFile = path.Join("/", f.value)
|
||||
} else {
|
||||
latestDirPath := ctx.files[dirIndex].Path
|
||||
regularFile = path.Join(latestDirPath, f.value)
|
||||
}
|
||||
|
||||
ctx.files = append(ctx.files, pkg.ApkFileRecord{Path: regularFile})
|
||||
ctx.indexOfLatestRegularFile = len(ctx.files) - 1
|
||||
case "a":
|
||||
i := ctx.indexOfLatestRegularFile
|
||||
latest := ctx.files[i]
|
||||
|
||||
var ok bool
|
||||
latest.OwnerUID, latest.OwnerGID, latest.Permissions, ok = processFileInfo(f.value)
|
||||
if !ok {
|
||||
log.Warnf("unexpected value for APK ACL field %q: %q", f.name, f.value)
|
||||
return
|
||||
}
|
||||
|
||||
// save updated file
|
||||
ctx.files[i] = latest
|
||||
case "Z":
|
||||
i := ctx.indexOfLatestRegularFile
|
||||
latest := ctx.files[i]
|
||||
latest.Digest = processChecksum(f.value)
|
||||
|
||||
// save updated file
|
||||
ctx.files[i] = latest
|
||||
}
|
||||
}
|
||||
|
||||
func processFileInfo(v string) (uid, gid, perms string, ok bool) {
|
||||
ok = false
|
||||
|
||||
fileInfo := strings.Split(v, ":")
|
||||
if len(fileInfo) < 3 {
|
||||
return
|
||||
}
|
||||
|
||||
uid = fileInfo[0]
|
||||
gid = fileInfo[1]
|
||||
perms = fileInfo[2]
|
||||
|
||||
// note: there are more optional fields available that we are not capturing,
|
||||
// e.g.: "0:0:755:Q1JaDEHQHBbizhEzoWK1YxuraNU/4="
|
||||
|
||||
ok = true
|
||||
return
|
||||
}
|
||||
|
||||
// apkFileParsingContext helps keep track of what file data has been captured so far for the APK currently being parsed.
|
||||
type apkFileParsingContext struct {
|
||||
files []pkg.ApkFileRecord
|
||||
indexOfLatestDirectory int
|
||||
indexOfLatestRegularFile int
|
||||
}
|
||||
|
||||
func newApkFileParsingContext() *apkFileParsingContext {
|
||||
return &apkFileParsingContext{
|
||||
indexOfLatestDirectory: -1, // no directories yet
|
||||
indexOfLatestRegularFile: -1, // no regular files yet
|
||||
}
|
||||
}
|
||||
|
||||
// parseListValue parses a space-separated list from an apk entry field value.
|
||||
func parseListValue(value string) []string {
|
||||
items := strings.Split(value, " ")
|
||||
if len(items) >= 1 {
|
||||
return items
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func nilFieldsToEmptySlice(p *parsedData) {
|
||||
if p.Dependencies == nil {
|
||||
p.Dependencies = []string{}
|
||||
}
|
||||
|
||||
if p.Provides == nil {
|
||||
p.Provides = []string{}
|
||||
}
|
||||
|
||||
if p.Files == nil {
|
||||
p.Files = []pkg.ApkFileRecord{}
|
||||
}
|
||||
}
|
||||
|
||||
func processChecksum(value string) *file.Digest {
|
||||
// from: https://wiki.alpinelinux.org/wiki/Apk_spec
|
||||
// The package checksum field is the SHA1 hash of the second gzip stream (control stream) in the package. The
|
||||
// binary hash digest is base64 encoded. This is prefixed with Q1 to differentiate it from the MD5 hashes
|
||||
// used in older index formats. It is not possible to compute this checksum with standard command line tools
|
||||
// but the apk-tools can compute it in their index operation.
|
||||
|
||||
// based on https://github.com/alpinelinux/apk-tools/blob/dd1908f2fc20b4cfe2c15c55fafaa5fadfb599dc/src/blob.c#L379-L393
|
||||
// it seems that the old md5 checksum value was only the hex representation (not base64)
|
||||
algorithm := "md5"
|
||||
if strings.HasPrefix(value, "Q1") {
|
||||
algorithm = "'Q1'+base64(sha1)"
|
||||
}
|
||||
|
||||
return &file.Digest{
|
||||
Algorithm: algorithm,
|
||||
Value: value,
|
||||
}
|
||||
}
|
||||
|
||||
func discoverPackageDependencies(pkgs []pkg.Package) (relationships []artifact.Relationship) {
|
||||
// map["provides" string] -> packages that provide the "p" key
|
||||
lookup := make(map[string][]pkg.Package)
|
||||
// read "Provides" (p) and add as keys for lookup keys as well as package names
|
||||
for _, p := range pkgs {
|
||||
apkg, ok := p.Metadata.(pkg.ApkDBEntry)
|
||||
if !ok {
|
||||
log.Warnf("cataloger failed to extract apk 'provides' metadata for package %+v", p.Name)
|
||||
continue
|
||||
}
|
||||
lookup[p.Name] = append(lookup[p.Name], p)
|
||||
for _, provides := range apkg.Provides {
|
||||
k := stripVersionSpecifier(provides)
|
||||
lookup[k] = append(lookup[k], p)
|
||||
}
|
||||
}
|
||||
|
||||
// read "Pull Dependencies" (D) and match with keys
|
||||
for _, p := range pkgs {
|
||||
apkg, ok := p.Metadata.(pkg.ApkDBEntry)
|
||||
if !ok {
|
||||
log.Warnf("cataloger failed to extract apk dependency metadata for package %+v", p.Name)
|
||||
continue
|
||||
}
|
||||
|
||||
for _, depSpecifier := range apkg.Dependencies {
|
||||
// use the lookup to find what pkg we depend on
|
||||
dep := stripVersionSpecifier(depSpecifier)
|
||||
for _, depPkg := range lookup[dep] {
|
||||
// this is a pkg that package "p" depends on... make a relationship
|
||||
relationships = append(relationships, artifact.Relationship{
|
||||
From: depPkg,
|
||||
To: p,
|
||||
Type: artifact.DependencyOfRelationship,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
return relationships
|
||||
}
|
||||
|
||||
func stripVersionSpecifier(s string) string {
|
||||
// examples:
|
||||
// musl>=1 --> musl
|
||||
// cmd:scanelf=1.3.4-r0 --> cmd:scanelf
|
||||
|
||||
items := internal.SplitAny(s, "<>=")
|
||||
if len(items) == 0 {
|
||||
return s
|
||||
}
|
||||
|
||||
return items[0]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,149 @@
|
||||
C:Q1myMNfd7u5v5UTgNHeq1e31qTjZU=
|
||||
P:alpine-baselayout
|
||||
V:3.2.0-r6
|
||||
A:x86_64
|
||||
S:19917
|
||||
I:409600
|
||||
T:Alpine base dir structure and init scripts
|
||||
U:https://git.alpinelinux.org/cgit/aports/tree/main/alpine-baselayout
|
||||
L:GPL-2.0-only
|
||||
o:alpine-baselayout
|
||||
m:Natanael Copa <ncopa@alpinelinux.org>
|
||||
t:1590679557
|
||||
c:e1c51734fa96fa4bac92e9f14a474324c67916fc
|
||||
D:/bin/sh so:libc.musl-x86_64.so.1
|
||||
p:cmd:mkmntdirs
|
||||
F:dev
|
||||
F:dev/pts
|
||||
F:dev/shm
|
||||
F:etc
|
||||
R:fstab
|
||||
Z:Q11Q7hNe8QpDS531guqCdrXBzoA/o=
|
||||
R:group
|
||||
Z:Q1oJ16xWudgKOrXIEquEDzlF2Lsm4=
|
||||
R:hostname
|
||||
Z:Q16nVwYVXP/tChvUPdukVD2ifXOmc=
|
||||
R:hosts
|
||||
Z:Q1BD6zJKZTRWyqGnPi4tSfd3krsMU=
|
||||
R:inittab
|
||||
Z:Q1TsthbhW7QzWRe1E/NKwTOuD4pHc=
|
||||
R:modules
|
||||
Z:Q1toogjUipHGcMgECgPJX64SwUT1M=
|
||||
R:motd
|
||||
Z:Q1XmduVVNURHQ27TvYp1Lr5TMtFcA=
|
||||
R:mtab
|
||||
a:0:0:777
|
||||
Z:Q1kiljhXXH1LlQroHsEJIkPZg2eiw=
|
||||
R:passwd
|
||||
Z:Q1TchuuLUfur0izvfZQZxgN/LJhB8=
|
||||
R:profile
|
||||
Z:Q1KpFb8kl5LvwXWlY3e58FNsjrI34=
|
||||
R:protocols
|
||||
Z:Q13FqXUnvuOpMDrH/6rehxuYAEE34=
|
||||
R:services
|
||||
Z:Q1C6HJNgQvLWqt5VY+n7MZJ1rsDuY=
|
||||
R:shadow
|
||||
a:0:42:640
|
||||
Z:Q1ltrPIAW2zHeDiajsex2Bdmq3uqA=
|
||||
R:shells
|
||||
Z:Q1ojm2YdpCJ6B/apGDaZ/Sdb2xJkA=
|
||||
R:sysctl.conf
|
||||
Z:Q14upz3tfnNxZkIEsUhWn7Xoiw96g=
|
||||
F:etc/apk
|
||||
F:etc/conf.d
|
||||
F:etc/crontabs
|
||||
R:root
|
||||
a:0:0:600
|
||||
Z:Q1vfk1apUWI4yLJGhhNRd0kJixfvY=
|
||||
F:etc/init.d
|
||||
F:etc/modprobe.d
|
||||
R:aliases.conf
|
||||
Z:Q1WUbh6TBYNVK7e4Y+uUvLs/7viqk=
|
||||
R:blacklist.conf
|
||||
Z:Q1xxYGU6S6TLQvb7ervPrWWwAWqMg=
|
||||
R:i386.conf
|
||||
Z:Q1pnay/njn6ol9cCssL7KiZZ8etlc=
|
||||
R:kms.conf
|
||||
Z:Q1ynbLn3GYDpvajba/ldp1niayeog=
|
||||
F:etc/modules-load.d
|
||||
F:etc/network
|
||||
F:etc/network/if-down.d
|
||||
F:etc/network/if-post-down.d
|
||||
F:etc/network/if-pre-up.d
|
||||
F:etc/network/if-up.d
|
||||
F:etc/opt
|
||||
F:etc/periodic
|
||||
F:etc/periodic/15min
|
||||
F:etc/periodic/daily
|
||||
F:etc/periodic/hourly
|
||||
F:etc/periodic/monthly
|
||||
F:etc/periodic/weekly
|
||||
F:etc/profile.d
|
||||
R:color_prompt
|
||||
Z:Q10wL23GuSCVfumMRgakabUI6EsSk=
|
||||
R:locale
|
||||
Z:Q1R4bIEpnKxxOSrlnZy9AoawqZ5DU=
|
||||
F:etc/sysctl.d
|
||||
F:home
|
||||
F:lib
|
||||
F:lib/firmware
|
||||
F:lib/mdev
|
||||
F:lib/modules-load.d
|
||||
F:lib/sysctl.d
|
||||
R:00-alpine.conf
|
||||
Z:Q1HpElzW1xEgmKfERtTy7oommnq6c=
|
||||
F:media
|
||||
F:media/cdrom
|
||||
F:media/floppy
|
||||
F:media/usb
|
||||
F:mnt
|
||||
F:opt
|
||||
F:proc
|
||||
F:root
|
||||
M:0:0:700
|
||||
F:run
|
||||
F:sbin
|
||||
R:mkmntdirs
|
||||
a:0:0:755
|
||||
Z:Q1YeuSmC7iDbEWrusPzA/zUQF6YSg=
|
||||
F:srv
|
||||
F:sys
|
||||
F:tmp
|
||||
M:0:0:1777
|
||||
F:usr
|
||||
F:usr/lib
|
||||
F:usr/lib/modules-load.d
|
||||
F:usr/local
|
||||
F:usr/local/bin
|
||||
F:usr/local/lib
|
||||
F:usr/local/share
|
||||
F:usr/sbin
|
||||
F:usr/share
|
||||
F:usr/share/man
|
||||
F:usr/share/misc
|
||||
F:var
|
||||
R:run
|
||||
a:0:0:777
|
||||
Z:Q11/SNZz/8cK2dSKK+cJpVrZIuF4Q=
|
||||
F:var/cache
|
||||
F:var/cache/misc
|
||||
F:var/empty
|
||||
M:0:0:555
|
||||
F:var/lib
|
||||
F:var/lib/misc
|
||||
F:var/local
|
||||
F:var/lock
|
||||
F:var/lock/subsys
|
||||
F:var/log
|
||||
F:var/mail
|
||||
F:var/opt
|
||||
F:var/spool
|
||||
R:mail
|
||||
a:0:0:777
|
||||
Z:Q1dzbdazYZA2nTzSIG3YyNw7d4Juc=
|
||||
F:var/spool/cron
|
||||
R:crontabs
|
||||
a:0:0:777
|
||||
Z:Q1OFZt+ZMp7j0Gny0rqSKuWJyqYmA=
|
||||
F:var/tmp
|
||||
M:0:0:1777
|
||||
@@ -0,0 +1,35 @@
|
||||
P:alpine-baselayout-data
|
||||
V:3.4.0-r0
|
||||
A:x86_64
|
||||
L:GPL-2.0-only
|
||||
T:Alpine base dir structure and init scripts
|
||||
o:alpine-baselayout
|
||||
m:Natanael Copa <ncopa@alpinelinux.org>
|
||||
U:https://git.alpinelinux.org/cgit/aports/tree/main/alpine-baselayout
|
||||
D:
|
||||
p:
|
||||
c:bd965a7ebf7fd8f07d7a0cc0d7375bf3e4eb9b24
|
||||
i:[]
|
||||
t:1667573027
|
||||
S:11664
|
||||
I:77824
|
||||
k:0
|
||||
C:Q15ffjKT28lB7iSXjzpI/eDdYRCwM=
|
||||
F:etc
|
||||
R:fstab
|
||||
R:group
|
||||
R:hostname
|
||||
R:hosts
|
||||
R:inittab
|
||||
R:modules
|
||||
R:mtab
|
||||
a:0:0:0777
|
||||
R:nsswitch.conf
|
||||
R:passwd
|
||||
R:profile
|
||||
R:protocols
|
||||
R:services
|
||||
R:shadow
|
||||
a:0:148:0640
|
||||
R:shells
|
||||
R:sysctl.conf
|
||||
@@ -0,0 +1,22 @@
|
||||
P:openjdk8-jre
|
||||
V:8.212.04-r0
|
||||
A:x86_64
|
||||
S:359029
|
||||
I:970752
|
||||
T:OpenJDK 8 Java Runtime
|
||||
U:https://icedtea.classpath.org/
|
||||
L:custom
|
||||
o:openjdk8
|
||||
m:Timo Teras <timo.teras@iki.fi>
|
||||
t:1556993127
|
||||
c:46badd1aabd3375ae4b41c7194bc448f74b2ea4a
|
||||
D:java-cacerts nss so:libX11.so.6 so:libXcomposite.so.1 so:libXext.so.6 so:libXi.so.6 so:libXrender.so.1 so:libXtst.so.6 so:libasound.so.2 so:libc.musl-x86_64.so.1 so:libfreetype.so.6 so:libgcc_s.so.1 so:libgif.so.7 so:libjpeg.so.8 so:libpng16.so.16 so:libstdc++.so.6 so:openjdk8:libawt.so so:openjdk8:libjava.so so:openjdk8:libjli.so so:openjdk8:libjvm.so
|
||||
p:so:openjdk8:libawt_xawt.so=0 so:openjdk8:libfontmanager.so=0 so:openjdk8:libjawt.so=0 so:openjdk8:libjsoundalsa.so=0 so:openjdk8:libsplashscreen.so=0
|
||||
F:usr
|
||||
F:usr/lib
|
||||
F:usr/lib/jvm
|
||||
F:usr/lib/jvm/java-1.8-openjdk
|
||||
F:usr/lib/jvm/java-1.8-openjdk/bin
|
||||
R:policytool
|
||||
a:0:0:755:Q1JaDEHQHBbizhEzoWK1YxuraNU/4=
|
||||
Z:Q1M0C9qfC/+kdRiOodeihG2GMRtkE=
|
||||
@@ -0,0 +1 @@
|
||||
bogus db contents
|
||||
@@ -0,0 +1,638 @@
|
||||
C:Q1v4QhLje3kWlC8DJj+ZfJTjlJRSU=
|
||||
P:alpine-baselayout-data
|
||||
V:3.2.0-r22
|
||||
A:x86_64
|
||||
S:11435
|
||||
I:73728
|
||||
T:Alpine base dir structure and init scripts
|
||||
U:https://git.alpinelinux.org/cgit/aports/tree/main/alpine-baselayout
|
||||
L:GPL-2.0-only
|
||||
o:alpine-baselayout
|
||||
m:Natanael Copa <ncopa@alpinelinux.org>
|
||||
t:1655134784
|
||||
c:cb70ca5c6d6db0399d2dd09189c5d57827bce5cd
|
||||
r:alpine-baselayout
|
||||
F:etc
|
||||
R:fstab
|
||||
Z:Q11Q7hNe8QpDS531guqCdrXBzoA/o=
|
||||
R:group
|
||||
Z:Q13K+olJg5ayzHSVNUkggZJXuB+9Y=
|
||||
R:hostname
|
||||
Z:Q16nVwYVXP/tChvUPdukVD2ifXOmc=
|
||||
R:hosts
|
||||
Z:Q1BD6zJKZTRWyqGnPi4tSfd3krsMU=
|
||||
R:inittab
|
||||
Z:Q1TsthbhW7QzWRe1E/NKwTOuD4pHc=
|
||||
R:modules
|
||||
Z:Q1toogjUipHGcMgECgPJX64SwUT1M=
|
||||
R:mtab
|
||||
a:0:0:777
|
||||
Z:Q1kiljhXXH1LlQroHsEJIkPZg2eiw=
|
||||
R:passwd
|
||||
Z:Q1TchuuLUfur0izvfZQZxgN/LJhB8=
|
||||
R:profile
|
||||
Z:Q1F3DgXUP+jNZDknmQPPb5t9FSfDg=
|
||||
R:protocols
|
||||
Z:Q1omKlp3vgGq2ZqYzyD/KHNdo8rDc=
|
||||
R:services
|
||||
Z:Q19WLCv5ItKg4MH7RWfNRh1I7byQc=
|
||||
R:shadow
|
||||
a:0:42:640
|
||||
Z:Q1ltrPIAW2zHeDiajsex2Bdmq3uqA=
|
||||
R:shells
|
||||
Z:Q1ojm2YdpCJ6B/apGDaZ/Sdb2xJkA=
|
||||
R:sysctl.conf
|
||||
Z:Q14upz3tfnNxZkIEsUhWn7Xoiw96g=
|
||||
|
||||
C:Q1aCu0LmUDoAFSOX49uHvkYC1WasQ=
|
||||
P:musl
|
||||
V:1.2.3-r0
|
||||
A:x86_64
|
||||
S:383304
|
||||
I:622592
|
||||
T:the musl c library (libc) implementation
|
||||
U:https://musl.libc.org/
|
||||
L:MIT
|
||||
o:musl
|
||||
m:Timo Teräs <timo.teras@iki.fi>
|
||||
t:1649396308
|
||||
c:ee13d43a53938d8a04ba787b9423f3270a3c14a7
|
||||
p:so:libc.musl-x86_64.so.1=1
|
||||
F:lib
|
||||
R:ld-musl-x86_64.so.1
|
||||
a:0:0:755
|
||||
Z:Q1ZZqflKEvStJz4SXV0SDMi3wOtM0=
|
||||
R:libc.musl-x86_64.so.1
|
||||
a:0:0:777
|
||||
Z:Q17yJ3JFNypA4mxhJJr0ou6CzsJVI=
|
||||
|
||||
C:Q1iZ+C2JJdBlm2KKtAOkSkM7zZegY=
|
||||
P:busybox
|
||||
V:1.35.0-r17
|
||||
A:x86_64
|
||||
S:507831
|
||||
I:962560
|
||||
T:Size optimized toolbox of many common UNIX utilities
|
||||
U:https://busybox.net/
|
||||
L:GPL-2.0-only
|
||||
o:busybox
|
||||
m:Sören Tempel <soeren+alpine@soeren-tempel.net>
|
||||
t:1659366884
|
||||
c:2bf6ec48e526113f87216683cd341a78af5f0b3f
|
||||
D:so:libc.musl-x86_64.so.1
|
||||
p:/bin/sh cmd:busybox=1.35.0-r17 cmd:sh=1.35.0-r17
|
||||
r:busybox-initscripts
|
||||
F:bin
|
||||
R:busybox
|
||||
a:0:0:755
|
||||
Z:Q1WUwBY0eOGgzgVxTZxJBZPyQUicI=
|
||||
R:sh
|
||||
a:0:0:777
|
||||
Z:Q1pcfTfDNEbNKQc2s1tia7da05M8Q=
|
||||
F:etc
|
||||
R:securetty
|
||||
Z:Q1mB95Hq2NUTZ599RDiSsj9w5FrOU=
|
||||
R:udhcpd.conf
|
||||
Z:Q1EgLFjj67ou3eMqp4m3r2ZjnQ7QU=
|
||||
F:etc/logrotate.d
|
||||
R:acpid
|
||||
Z:Q1TylyCINVmnS+A/Tead4vZhE7Bks=
|
||||
F:etc/network
|
||||
F:etc/network/if-down.d
|
||||
F:etc/network/if-post-down.d
|
||||
F:etc/network/if-post-up.d
|
||||
F:etc/network/if-pre-down.d
|
||||
F:etc/network/if-pre-up.d
|
||||
F:etc/network/if-up.d
|
||||
R:dad
|
||||
a:0:0:775
|
||||
Z:Q1ORf+lPRKuYgdkBBcKoevR1t60Q4=
|
||||
F:sbin
|
||||
F:tmp
|
||||
M:0:0:1777
|
||||
F:usr
|
||||
F:usr/sbin
|
||||
F:usr/share
|
||||
F:usr/share/udhcpc
|
||||
R:default.script
|
||||
a:0:0:755
|
||||
Z:Q1t9vir/ZrX3nbSIYT9BDLWZenkVQ=
|
||||
F:var
|
||||
F:var/cache
|
||||
F:var/cache/misc
|
||||
F:var/lib
|
||||
F:var/lib/udhcpd
|
||||
|
||||
C:Q1l6/nM0K+cyVdqNfgkp1/c6Ylzk0=
|
||||
P:alpine-baselayout
|
||||
V:3.2.0-r22
|
||||
A:x86_64
|
||||
S:11126
|
||||
I:348160
|
||||
T:Alpine base dir structure and init scripts
|
||||
U:https://git.alpinelinux.org/cgit/aports/tree/main/alpine-baselayout
|
||||
L:GPL-2.0-only
|
||||
o:alpine-baselayout
|
||||
m:Natanael Copa <ncopa@alpinelinux.org>
|
||||
t:1655134784
|
||||
c:cb70ca5c6d6db0399d2dd09189c5d57827bce5cd
|
||||
D:alpine-baselayout-data=3.2.0-r22 /bin/sh so:libc.musl-x86_64.so.1
|
||||
p:cmd:mkmntdirs=3.2.0-r22
|
||||
F:dev
|
||||
F:dev/pts
|
||||
F:dev/shm
|
||||
F:etc
|
||||
R:motd
|
||||
Z:Q1XmduVVNURHQ27TvYp1Lr5TMtFcA=
|
||||
F:etc/apk
|
||||
F:etc/conf.d
|
||||
F:etc/crontabs
|
||||
R:root
|
||||
a:0:0:600
|
||||
Z:Q1vfk1apUWI4yLJGhhNRd0kJixfvY=
|
||||
F:etc/init.d
|
||||
F:etc/modprobe.d
|
||||
R:aliases.conf
|
||||
Z:Q1WUbh6TBYNVK7e4Y+uUvLs/7viqk=
|
||||
R:blacklist.conf
|
||||
Z:Q14TdgFHkTdt3uQC+NBtrntOnm9n4=
|
||||
R:i386.conf
|
||||
Z:Q1pnay/njn6ol9cCssL7KiZZ8etlc=
|
||||
R:kms.conf
|
||||
Z:Q1ynbLn3GYDpvajba/ldp1niayeog=
|
||||
F:etc/modules-load.d
|
||||
F:etc/network
|
||||
F:etc/network/if-down.d
|
||||
F:etc/network/if-post-down.d
|
||||
F:etc/network/if-pre-up.d
|
||||
F:etc/network/if-up.d
|
||||
F:etc/opt
|
||||
F:etc/periodic
|
||||
F:etc/periodic/15min
|
||||
F:etc/periodic/daily
|
||||
F:etc/periodic/hourly
|
||||
F:etc/periodic/monthly
|
||||
F:etc/periodic/weekly
|
||||
F:etc/profile.d
|
||||
R:README
|
||||
Z:Q135OWsCzzvnB2fmFx62kbqm1Ax1k=
|
||||
R:color_prompt.sh.disabled
|
||||
Z:Q11XM9mde1Z29tWMGaOkeovD/m4uU=
|
||||
R:locale.sh
|
||||
Z:Q1S8j+WW71mWxfVy8ythqU7HUVoBw=
|
||||
F:etc/sysctl.d
|
||||
F:home
|
||||
F:lib
|
||||
F:lib/firmware
|
||||
F:lib/mdev
|
||||
F:lib/modules-load.d
|
||||
F:lib/sysctl.d
|
||||
R:00-alpine.conf
|
||||
Z:Q1HpElzW1xEgmKfERtTy7oommnq6c=
|
||||
F:media
|
||||
F:media/cdrom
|
||||
F:media/floppy
|
||||
F:media/usb
|
||||
F:mnt
|
||||
F:opt
|
||||
F:proc
|
||||
F:root
|
||||
M:0:0:700
|
||||
F:run
|
||||
F:sbin
|
||||
R:mkmntdirs
|
||||
a:0:0:755
|
||||
Z:Q1+f8Hjd+dkHS03O6ZZaIw7mb8nLM=
|
||||
F:srv
|
||||
F:sys
|
||||
F:tmp
|
||||
M:0:0:1777
|
||||
F:usr
|
||||
F:usr/lib
|
||||
F:usr/lib/modules-load.d
|
||||
F:usr/local
|
||||
F:usr/local/bin
|
||||
F:usr/local/lib
|
||||
F:usr/local/share
|
||||
F:usr/sbin
|
||||
F:usr/share
|
||||
F:usr/share/man
|
||||
F:usr/share/misc
|
||||
F:var
|
||||
R:run
|
||||
a:0:0:777
|
||||
Z:Q11/SNZz/8cK2dSKK+cJpVrZIuF4Q=
|
||||
F:var/cache
|
||||
F:var/cache/misc
|
||||
F:var/empty
|
||||
M:0:0:555
|
||||
F:var/lib
|
||||
F:var/lib/misc
|
||||
F:var/local
|
||||
F:var/lock
|
||||
F:var/lock/subsys
|
||||
F:var/log
|
||||
F:var/mail
|
||||
F:var/opt
|
||||
F:var/spool
|
||||
R:mail
|
||||
a:0:0:777
|
||||
Z:Q1dzbdazYZA2nTzSIG3YyNw7d4Juc=
|
||||
F:var/spool/cron
|
||||
R:crontabs
|
||||
a:0:0:777
|
||||
Z:Q1OFZt+ZMp7j0Gny0rqSKuWJyqYmA=
|
||||
F:var/tmp
|
||||
M:0:0:1777
|
||||
|
||||
C:Q1FBfIjtsEmvuqoNXpShXDcm/mjzE=
|
||||
P:alpine-keys
|
||||
V:2.4-r1
|
||||
A:x86_64
|
||||
S:13359
|
||||
I:159744
|
||||
T:Public keys for Alpine Linux packages
|
||||
U:https://alpinelinux.org
|
||||
L:MIT
|
||||
o:alpine-keys
|
||||
m:Natanael Copa <ncopa@alpinelinux.org>
|
||||
t:1634579657
|
||||
c:aab68f8c9ab434a46710de8e12fb3206e2930a59
|
||||
r:alpine-base
|
||||
F:etc
|
||||
F:etc/apk
|
||||
F:etc/apk/keys
|
||||
R:alpine-devel@lists.alpinelinux.org-4a6a0840.rsa.pub
|
||||
Z:Q1OvCFSO94z97c80mIDCxqGkh2Og4=
|
||||
R:alpine-devel@lists.alpinelinux.org-5243ef4b.rsa.pub
|
||||
Z:Q1v7YWZYzAWoclaLDI45jEguI7YN0=
|
||||
R:alpine-devel@lists.alpinelinux.org-5261cecb.rsa.pub
|
||||
Z:Q1NnGuDsdQOx4ZNYfB3N97eLyGPkI=
|
||||
R:alpine-devel@lists.alpinelinux.org-6165ee59.rsa.pub
|
||||
Z:Q1lZlTESNrelWTNkL/oQzmAU8a99A=
|
||||
R:alpine-devel@lists.alpinelinux.org-61666e3f.rsa.pub
|
||||
Z:Q1WNW6Sy87HpJ3IdemQy8pju33Kms=
|
||||
F:usr
|
||||
F:usr/share
|
||||
F:usr/share/apk
|
||||
F:usr/share/apk/keys
|
||||
R:alpine-devel@lists.alpinelinux.org-4a6a0840.rsa.pub
|
||||
Z:Q1OvCFSO94z97c80mIDCxqGkh2Og4=
|
||||
R:alpine-devel@lists.alpinelinux.org-5243ef4b.rsa.pub
|
||||
Z:Q1v7YWZYzAWoclaLDI45jEguI7YN0=
|
||||
R:alpine-devel@lists.alpinelinux.org-524d27bb.rsa.pub
|
||||
Z:Q1BTqS+H/UUyhQuzHwiBl47+BTKuU=
|
||||
R:alpine-devel@lists.alpinelinux.org-5261cecb.rsa.pub
|
||||
Z:Q1NnGuDsdQOx4ZNYfB3N97eLyGPkI=
|
||||
R:alpine-devel@lists.alpinelinux.org-58199dcc.rsa.pub
|
||||
Z:Q1Oaxdcsa6AYoPdLi0U4lO3J2we18=
|
||||
R:alpine-devel@lists.alpinelinux.org-58cbb476.rsa.pub
|
||||
Z:Q1yPq+su65ksNox3uXB+DR7P18+QU=
|
||||
R:alpine-devel@lists.alpinelinux.org-58e4f17d.rsa.pub
|
||||
Z:Q1MpZDNX0LeLHvSOwVUyXiXx11NN0=
|
||||
R:alpine-devel@lists.alpinelinux.org-5e69ca50.rsa.pub
|
||||
Z:Q1glCQ/eJbvA5xqcswdjFrWv5Fnk0=
|
||||
R:alpine-devel@lists.alpinelinux.org-60ac2099.rsa.pub
|
||||
Z:Q1XUdDEoNTtjlvrS+iunk6ziFgIpU=
|
||||
R:alpine-devel@lists.alpinelinux.org-6165ee59.rsa.pub
|
||||
Z:Q1lZlTESNrelWTNkL/oQzmAU8a99A=
|
||||
R:alpine-devel@lists.alpinelinux.org-61666e3f.rsa.pub
|
||||
Z:Q1WNW6Sy87HpJ3IdemQy8pju33Kms=
|
||||
R:alpine-devel@lists.alpinelinux.org-616a9724.rsa.pub
|
||||
Z:Q1I9Dy6hryacL2YWXg+KlE6WvwEd4=
|
||||
R:alpine-devel@lists.alpinelinux.org-616abc23.rsa.pub
|
||||
Z:Q1NSnsgmcMbU4g7j5JaNs0tVHpHVA=
|
||||
R:alpine-devel@lists.alpinelinux.org-616ac3bc.rsa.pub
|
||||
Z:Q1VaMBBk4Rxv6boPLKF+I085Q8y2E=
|
||||
R:alpine-devel@lists.alpinelinux.org-616adfeb.rsa.pub
|
||||
Z:Q13hJBMHAUquPbp5jpAPFjQI2Y1vQ=
|
||||
R:alpine-devel@lists.alpinelinux.org-616ae350.rsa.pub
|
||||
Z:Q1V/a5P9pKRJb6tihE3e8O6xaPgLU=
|
||||
R:alpine-devel@lists.alpinelinux.org-616db30d.rsa.pub
|
||||
Z:Q13wLJrcKQajql5a1p9Q45U+ZXENA=
|
||||
F:usr/share/apk/keys/aarch64
|
||||
R:alpine-devel@lists.alpinelinux.org-58199dcc.rsa.pub
|
||||
a:0:0:777
|
||||
Z:Q17j9nWJkQ+wfIuVQzIFrmFZ7fSOc=
|
||||
R:alpine-devel@lists.alpinelinux.org-616ae350.rsa.pub
|
||||
a:0:0:777
|
||||
Z:Q1snr+Q1UbfHyCr/cmmtVvMIS7SGs=
|
||||
F:usr/share/apk/keys/armhf
|
||||
R:alpine-devel@lists.alpinelinux.org-524d27bb.rsa.pub
|
||||
a:0:0:777
|
||||
Z:Q1U9QtsdN+rYZ9Zh76EfXy00JZHMg=
|
||||
R:alpine-devel@lists.alpinelinux.org-616a9724.rsa.pub
|
||||
a:0:0:777
|
||||
Z:Q1bC+AdQ0qWBTmefXiI0PvmYOJoVQ=
|
||||
F:usr/share/apk/keys/armv7
|
||||
R:alpine-devel@lists.alpinelinux.org-524d27bb.rsa.pub
|
||||
a:0:0:777
|
||||
Z:Q1U9QtsdN+rYZ9Zh76EfXy00JZHMg=
|
||||
R:alpine-devel@lists.alpinelinux.org-616adfeb.rsa.pub
|
||||
a:0:0:777
|
||||
Z:Q1xbIVu7ScwqGHxXGwI22aSe5OdUY=
|
||||
F:usr/share/apk/keys/mips64
|
||||
R:alpine-devel@lists.alpinelinux.org-5e69ca50.rsa.pub
|
||||
a:0:0:777
|
||||
Z:Q1hCZdFx+LvzbLtPs753je78gEEBQ=
|
||||
F:usr/share/apk/keys/ppc64le
|
||||
R:alpine-devel@lists.alpinelinux.org-58cbb476.rsa.pub
|
||||
a:0:0:777
|
||||
Z:Q1t21dhCLbTJmAHXSCeOMq/2vfSgo=
|
||||
R:alpine-devel@lists.alpinelinux.org-616abc23.rsa.pub
|
||||
a:0:0:777
|
||||
Z:Q1PS9zNIPJanC8qcsc5qarEWqhV5Q=
|
||||
F:usr/share/apk/keys/riscv64
|
||||
R:alpine-devel@lists.alpinelinux.org-60ac2099.rsa.pub
|
||||
a:0:0:777
|
||||
Z:Q1NVPbZavaXpsItFwQYDWbpor7yYE=
|
||||
R:alpine-devel@lists.alpinelinux.org-616db30d.rsa.pub
|
||||
a:0:0:777
|
||||
Z:Q1U6tfuKRy5J8C6iaKPMZaT/e8tbA=
|
||||
F:usr/share/apk/keys/s390x
|
||||
R:alpine-devel@lists.alpinelinux.org-58e4f17d.rsa.pub
|
||||
a:0:0:777
|
||||
Z:Q1sjbV2r2w0Ih2vwdzC4Jq6UI7cMQ=
|
||||
R:alpine-devel@lists.alpinelinux.org-616ac3bc.rsa.pub
|
||||
a:0:0:777
|
||||
Z:Q1l09xa7RnbOIC1dI9FqbaCfS/GXY=
|
||||
F:usr/share/apk/keys/x86
|
||||
R:alpine-devel@lists.alpinelinux.org-4a6a0840.rsa.pub
|
||||
a:0:0:777
|
||||
Z:Q1Ii51i7Nrc4uft14HhqugaUqdH64=
|
||||
R:alpine-devel@lists.alpinelinux.org-5243ef4b.rsa.pub
|
||||
a:0:0:777
|
||||
Z:Q1Y49eVxhpvftbQ3yAdvlLfcrPLTU=
|
||||
R:alpine-devel@lists.alpinelinux.org-61666e3f.rsa.pub
|
||||
a:0:0:777
|
||||
Z:Q1HjdvcVkpBZzr1aSe3p7oQfAtm/E=
|
||||
F:usr/share/apk/keys/x86_64
|
||||
R:alpine-devel@lists.alpinelinux.org-4a6a0840.rsa.pub
|
||||
a:0:0:777
|
||||
Z:Q1Ii51i7Nrc4uft14HhqugaUqdH64=
|
||||
R:alpine-devel@lists.alpinelinux.org-5261cecb.rsa.pub
|
||||
a:0:0:777
|
||||
Z:Q1AUFY+fwSBTcrYetjT7NHvafrSQc=
|
||||
R:alpine-devel@lists.alpinelinux.org-6165ee59.rsa.pub
|
||||
a:0:0:777
|
||||
Z:Q1qKA23VzMUDle+Dqnrr5Kz+Xvty4=
|
||||
|
||||
C:Q1huqjigIP7ZNHBueDUmNnT6PpToI=
|
||||
P:ca-certificates-bundle
|
||||
V:20220614-r0
|
||||
A:x86_64
|
||||
S:125920
|
||||
I:233472
|
||||
T:Pre generated bundle of Mozilla certificates
|
||||
U:https://www.mozilla.org/en-US/about/governance/policies/security-group/certs/
|
||||
L:MPL-2.0 AND MIT
|
||||
o:ca-certificates
|
||||
m:Natanael Copa <ncopa@alpinelinux.org>
|
||||
t:1659254961
|
||||
c:bb51fa7743320ac61f76e181cca84daa9977573e
|
||||
p:ca-certificates-cacert=20220614-r0
|
||||
r:libressl2.7-libcrypto
|
||||
F:etc
|
||||
F:etc/ssl
|
||||
R:cert.pem
|
||||
a:0:0:777
|
||||
Z:Q1Nj6gTBdkZpTFW/obJGdpfvK0StA=
|
||||
F:etc/ssl/certs
|
||||
R:ca-certificates.crt
|
||||
Z:Q1D8ljYj7pXsRq4d/eHGNYB0GY1+I=
|
||||
|
||||
C:Q1rd80DWg+fcm+GFn06ahfUUPUshw=
|
||||
P:libcrypto1.1
|
||||
V:1.1.1q-r0
|
||||
A:x86_64
|
||||
S:1212577
|
||||
I:2772992
|
||||
T:Crypto library from openssl
|
||||
U:https://www.openssl.org/
|
||||
L:OpenSSL
|
||||
o:openssl
|
||||
m:Timo Teras <timo.teras@iki.fi>
|
||||
t:1657033577
|
||||
c:26153b65138c876d57e81750f6de6baab6d5bd5b
|
||||
D:so:libc.musl-x86_64.so.1
|
||||
p:so:libcrypto.so.1.1=1.1
|
||||
r:libressl2.7-libcrypto
|
||||
F:etc
|
||||
F:etc/ssl
|
||||
R:ct_log_list.cnf
|
||||
Z:Q1olh8TpdAi2QnTl4FK3TjdUiSwTo=
|
||||
R:ct_log_list.cnf.dist
|
||||
Z:Q1olh8TpdAi2QnTl4FK3TjdUiSwTo=
|
||||
R:openssl.cnf
|
||||
Z:Q1wGuxVEOK9iGLj1i8D3BSBnT7MJA=
|
||||
R:openssl.cnf.dist
|
||||
Z:Q1wGuxVEOK9iGLj1i8D3BSBnT7MJA=
|
||||
F:etc/ssl/certs
|
||||
F:etc/ssl/misc
|
||||
R:CA.pl
|
||||
a:0:0:755
|
||||
Z:Q1IACevKhK93GYBHp96Ie26jgZ17s=
|
||||
R:tsget
|
||||
a:0:0:777
|
||||
Z:Q13NVgfr7dQUuGYxur0tNalH6EIjU=
|
||||
R:tsget.pl
|
||||
a:0:0:755
|
||||
Z:Q15sBrpDGKgjg82+bFLL8ivnu5pbQ=
|
||||
F:etc/ssl/private
|
||||
F:lib
|
||||
R:libcrypto.so.1.1
|
||||
a:0:0:755
|
||||
Z:Q1f/TrTwFtSlD1k639L+FfsTkJWPY=
|
||||
F:usr
|
||||
F:usr/lib
|
||||
R:libcrypto.so.1.1
|
||||
a:0:0:777
|
||||
Z:Q1T2si+c7ts7sgDxQYve4B3i1Dgo0=
|
||||
F:usr/lib/engines-1.1
|
||||
R:afalg.so
|
||||
a:0:0:755
|
||||
Z:Q1Oljrwcq5h1sKPXcImsYYWLqm9SA=
|
||||
R:capi.so
|
||||
a:0:0:755
|
||||
Z:Q1Xtf9a1EQ1VWfygx1oNhMvNoNZzw=
|
||||
R:padlock.so
|
||||
a:0:0:755
|
||||
Z:Q1ttkhyM+fT6wkUcV9zgXXTTF7VNo=
|
||||
|
||||
C:Q1ciplPwPAKDa19jkbxYjiiv+G5Es=
|
||||
P:libssl1.1
|
||||
V:1.1.1q-r0
|
||||
A:x86_64
|
||||
S:213294
|
||||
I:540672
|
||||
T:SSL shared libraries
|
||||
U:https://www.openssl.org/
|
||||
L:OpenSSL
|
||||
o:openssl
|
||||
m:Timo Teras <timo.teras@iki.fi>
|
||||
t:1657033577
|
||||
c:26153b65138c876d57e81750f6de6baab6d5bd5b
|
||||
D:so:libc.musl-x86_64.so.1 so:libcrypto.so.1.1
|
||||
p:so:libssl.so.1.1=1.1
|
||||
r:libressl
|
||||
F:lib
|
||||
R:libssl.so.1.1
|
||||
a:0:0:755
|
||||
Z:Q1/on1tWApiZJE4XvUyE6MTFO2MY0=
|
||||
F:usr
|
||||
F:usr/lib
|
||||
R:libssl.so.1.1
|
||||
a:0:0:777
|
||||
Z:Q18j35pe3yp6HOgMih1wlGP1/mm2c=
|
||||
|
||||
C:Q1KWJXawaNPiINHfdzCg/FrEmiAaU=
|
||||
P:ssl_client
|
||||
V:1.35.0-r17
|
||||
A:x86_64
|
||||
S:5004
|
||||
I:28672
|
||||
T:EXternal ssl_client for busybox wget
|
||||
U:https://busybox.net/
|
||||
L:GPL-2.0-only
|
||||
o:busybox
|
||||
m:Sören Tempel <soeren+alpine@soeren-tempel.net>
|
||||
t:1659366884
|
||||
c:2bf6ec48e526113f87216683cd341a78af5f0b3f
|
||||
D:so:libc.musl-x86_64.so.1 so:libcrypto.so.1.1 so:libssl.so.1.1
|
||||
p:cmd:ssl_client=1.35.0-r17
|
||||
i:busybox=1.35.0-r17 libssl1.1
|
||||
r:busybox-initscripts
|
||||
F:usr
|
||||
F:usr/bin
|
||||
R:ssl_client
|
||||
a:0:0:755
|
||||
Z:Q1C6qA8RFt5eagesbaqu4plc6Ctyc=
|
||||
|
||||
C:Q1Ekuqm/0CPywDCKEbEwhsPCw+z9E=
|
||||
P:zlib
|
||||
V:1.2.12-r3
|
||||
A:x86_64
|
||||
S:53346
|
||||
I:110592
|
||||
T:A compression/decompression Library
|
||||
U:https://zlib.net/
|
||||
L:Zlib
|
||||
o:zlib
|
||||
m:Natanael Copa <ncopa@alpinelinux.org>
|
||||
t:1660030129
|
||||
c:57ce38bde7ce42964b664c137935cf2de803ac44
|
||||
D:so:libc.musl-x86_64.so.1
|
||||
p:so:libz.so.1=1.2.12
|
||||
F:lib
|
||||
R:libz.so.1
|
||||
a:0:0:777
|
||||
Z:Q1+aBjyJ7dmLatVkyqCNnAChlDZh8=
|
||||
R:libz.so.1.2.12
|
||||
a:0:0:755
|
||||
Z:Q1x/qx/7zlM20k7fLfVee7A4WLOC8=
|
||||
|
||||
C:Q1VFFFWMKjB9aRkehIATc5kwgAhlU=
|
||||
P:apk-tools
|
||||
V:2.12.9-r3
|
||||
A:x86_64
|
||||
S:120745
|
||||
I:307200
|
||||
T:Alpine Package Keeper - package manager for alpine
|
||||
U:https://gitlab.alpinelinux.org/alpine/apk-tools
|
||||
L:GPL-2.0-only
|
||||
o:apk-tools
|
||||
m:Natanael Copa <ncopa@alpinelinux.org>
|
||||
t:1652592000
|
||||
c:34d90ac8388e88126893f5d27ea35d304e65e5ab
|
||||
D:musl>=1.2 ca-certificates-bundle so:libc.musl-x86_64.so.1 so:libcrypto.so.1.1 so:libssl.so.1.1 so:libz.so.1
|
||||
p:so:libapk.so.3.12.0=3.12.0 cmd:apk=2.12.9-r3
|
||||
F:etc
|
||||
F:etc/apk
|
||||
F:etc/apk/keys
|
||||
F:etc/apk/protected_paths.d
|
||||
F:lib
|
||||
R:libapk.so.3.12.0
|
||||
a:0:0:755
|
||||
Z:Q1kVeagJvcGMIKp8ijGOxaZD08ONs=
|
||||
F:sbin
|
||||
R:apk
|
||||
a:0:0:755
|
||||
Z:Q1P1oUBG/VMMhnndf2fBXsZXBjHVE=
|
||||
F:var
|
||||
F:var/cache
|
||||
F:var/cache/misc
|
||||
F:var/lib
|
||||
F:var/lib/apk
|
||||
|
||||
C:Q1Gcqe+ND8DFOlhM3R0o5KyZjR2oE=
|
||||
P:scanelf
|
||||
V:1.3.4-r0
|
||||
A:x86_64
|
||||
S:36745
|
||||
I:94208
|
||||
T:Scan ELF binaries for stuff
|
||||
U:https://wiki.gentoo.org/wiki/Hardened/PaX_Utilities
|
||||
L:GPL-2.0-only
|
||||
o:pax-utils
|
||||
m:Natanael Copa <ncopa@alpinelinux.org>
|
||||
t:1651005390
|
||||
c:d7ae612a3cc5f827289d915783b4cbf8c7207947
|
||||
D:so:libc.musl-x86_64.so.1
|
||||
p:cmd:scanelf=1.3.4-r0
|
||||
r:pax-utils
|
||||
F:usr
|
||||
F:usr/bin
|
||||
R:scanelf
|
||||
a:0:0:755
|
||||
Z:Q1YPb72qHJJvTH6mJkN9DuExFQQh8=
|
||||
|
||||
C:Q1VVfxM3uSO0X38HWpj1LN0E61fxo=
|
||||
P:musl-utils
|
||||
V:1.2.3-r0
|
||||
A:x86_64
|
||||
S:36938
|
||||
I:135168
|
||||
T:the musl c library (libc) implementation
|
||||
U:https://musl.libc.org/
|
||||
L:MIT BSD GPL2+
|
||||
o:musl
|
||||
m:Timo Teräs <timo.teras@iki.fi>
|
||||
t:1649396308
|
||||
c:ee13d43a53938d8a04ba787b9423f3270a3c14a7
|
||||
D:scanelf so:libc.musl-x86_64.so.1
|
||||
p:cmd:getconf=1.2.3-r0 cmd:getent=1.2.3-r0 cmd:iconv=1.2.3-r0 cmd:ldconfig=1.2.3-r0 cmd:ldd=1.2.3-r0
|
||||
r:libiconv
|
||||
F:sbin
|
||||
R:ldconfig
|
||||
a:0:0:755
|
||||
Z:Q1Kja2+POZKxEkUOZqwSjC6kmaED4=
|
||||
F:usr
|
||||
F:usr/bin
|
||||
R:getconf
|
||||
a:0:0:755
|
||||
Z:Q1hRQA0bFX/Ywt3mbD6NpV9BIbPrU=
|
||||
R:getent
|
||||
a:0:0:755
|
||||
Z:Q1khbUz6GBU8iiQ3oV6Ln2hlXf4/0=
|
||||
R:iconv
|
||||
a:0:0:755
|
||||
Z:Q1H1QpYQDkdYIK2LLGv3m6qjpLyAY=
|
||||
R:ldd
|
||||
a:0:0:755
|
||||
Z:Q1yFAhGggmL7ERgbIA7KQxyTzf3ks=
|
||||
|
||||
C:Q1O4GFJRvHz95tPjO84qpEvkNVwDw=
|
||||
P:libc-utils
|
||||
V:0.7.2-r3
|
||||
A:x86_64
|
||||
S:1480
|
||||
I:4096
|
||||
T:Meta package to pull in correct libc
|
||||
U:https://alpinelinux.org
|
||||
L:BSD-2-Clause AND BSD-3-Clause
|
||||
o:libc-dev
|
||||
m:Natanael Copa <ncopa@alpinelinux.org>
|
||||
t:1585632275
|
||||
c:60424133be2e79bbfeff3d58147a22886f817ce2
|
||||
D:musl-utils
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
C:Q1p78yvTLG094tHE1+dToJGbmYzQE=
|
||||
P:libc-utils
|
||||
V:0.7.2-r0
|
||||
A:x86_64
|
||||
S:1175
|
||||
I:4096
|
||||
T:Meta package to pull in correct libc
|
||||
U:http://alpinelinux.org
|
||||
L:MPL-2.0 AND MIT
|
||||
o:libc-dev
|
||||
m:Natanael Copa <ncopa@alpinelinux.org>
|
||||
t:1575749004
|
||||
c:97b1c2842faa3bfa30f5811ffbf16d5ff9f1a479
|
||||
D:musl-utils
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
C:Q1bTtF5526tETKfL+lnigzIDvm+2o=
|
||||
P:musl-utils
|
||||
V:1.1.24-r2
|
||||
A:x86_64
|
||||
S:37944
|
||||
I:151552
|
||||
T:the musl c library (libc) implementation
|
||||
U:https://musl.libc.org/
|
||||
L:MIT BSD GPL2+
|
||||
o:musl
|
||||
m:Timo Teräs <timo.teras@iki.fi>
|
||||
t:1584790550
|
||||
c:4024cc3b29ad4c65544ad068b8f59172b5494306
|
||||
D:scanelf so:libc.musl-x86_64.so.1
|
||||
p:cmd:getconf cmd:getent cmd:iconv cmd:ldconfig cmd:ldd
|
||||
r:libiconv
|
||||
F:sbin
|
||||
R:ldconfig
|
||||
a:0:0:755
|
||||
Z:Q1Kja2+POZKxEkUOZqwSjC6kmaED4=
|
||||
F:usr
|
||||
F:usr/bin
|
||||
R:iconv
|
||||
a:0:0:755
|
||||
Z:Q1CVmFbdY+Hv6/jAHl1gec2Kbx1EY=
|
||||
R:ldd
|
||||
a:0:0:755
|
||||
Z:Q1yFAhGggmL7ERgbIA7KQxyTzf3ks=
|
||||
R:getconf
|
||||
a:0:0:755
|
||||
Z:Q1dAdYK8M/INibRQF5B3Rw7cmNDDA=
|
||||
R:getent
|
||||
a:0:0:755
|
||||
Z:Q1eR2Dz/WylabgbWMTkd2+hGmEya4=
|
||||
@@ -0,0 +1,34 @@
|
||||
C:Q1bTtF5526tETKfL+lnigzIDvm+2o=
|
||||
P:musl-utils
|
||||
V:1.1.24-r2
|
||||
A:x86_64
|
||||
S:37944
|
||||
I:151552
|
||||
T:the musl c library (libc) implementation
|
||||
U:https://musl.libc.org/
|
||||
L:MIT BSD GPL2+
|
||||
o:musl
|
||||
m:Timo Teräs <timo.teras@iki.fi>
|
||||
t:1584790550
|
||||
c:4024cc3b29ad4c65544ad068b8f59172b5494306
|
||||
D:scanelf so:libc.musl-x86_64.so.1
|
||||
p:cmd:getconf cmd:getent cmd:iconv cmd:ldconfig cmd:ldd
|
||||
r:libiconv
|
||||
F:sbin
|
||||
R:ldconfig
|
||||
a:0:0:755
|
||||
Z:Q1Kja2+POZKxEkUOZqwSjC6kmaED4=
|
||||
F:usr
|
||||
F:usr/bin
|
||||
R:iconv
|
||||
a:0:0:755
|
||||
Z:Q1CVmFbdY+Hv6/jAHl1gec2Kbx1EY=
|
||||
R:ldd
|
||||
a:0:0:755
|
||||
Z:Q1yFAhGggmL7ERgbIA7KQxyTzf3ks=
|
||||
R:getconf
|
||||
a:0:0:755
|
||||
Z:Q1dAdYK8M/INibRQF5B3Rw7cmNDDA=
|
||||
R:getent
|
||||
a:0:0:755
|
||||
Z:Q1eR2Dz/WylabgbWMTkd2+hGmEya4=
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user