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:
Alex Goodman
2023-11-02 12:39:42 +00:00
committed by GitHub
parent 6c41f15975
commit b2f4d7eda2
144 changed files with 294 additions and 273 deletions
+15
View File
@@ -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())
})
}
}
+62
View File
@@ -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()
}
+210
View File
@@ -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)
}
})
}
}
+440
View File
@@ -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(&currentEntry, 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