Files
pmg/packagemanager/extractor.go
T

71 lines
1.7 KiB
Go

package packagemanager
import (
"context"
"fmt"
packagev1 "buf.build/gen/go/safedep/api/protocolbuffers/go/safedep/messages/package/v1"
scalibr "github.com/google/osv-scalibr"
"github.com/google/osv-scalibr/extractor/filesystem/list"
scalibrfs "github.com/google/osv-scalibr/fs"
)
var NpmExtractors []string = []string{"javascript/packagejson", "javascript/pnpmlock"}
var PyPiExtractors []string = []string{"python/requirements", "python/pipfilelock"}
type ExtractorConfig struct {
ExtractorsName []string
ExtractorEcosystem packagev1.Ecosystem
context context.Context
ScanDir string
}
type extractor struct {
Config ExtractorConfig
}
func NewDefaultExtractorConfig() *ExtractorConfig {
return &ExtractorConfig{
ScanDir: ".",
}
}
func NewExtractor(config ExtractorConfig) *extractor {
return &extractor{
Config: config,
}
}
func (e *extractor) ExtractManifestFiles() ([]*packagev1.PackageVersion, error) {
extractors, err := list.ExtractorsFromNames(e.Config.ExtractorsName)
if err != nil {
return nil, fmt.Errorf("error while fetching extractors %w", err)
}
scanConfig := &scalibr.ScanConfig{
ScanRoots: scalibrfs.RealFSScanRoots(e.Config.ScanDir),
FilesystemExtractors: extractors,
}
scanner := scalibr.New()
scanResult := scanner.Scan(e.Config.context, scanConfig)
packagesToAnalyze := []*packagev1.PackageVersion{}
for _, invPkg := range scanResult.Inventory.Packages {
packageVer := &packagev1.PackageVersion{
Package: &packagev1.Package{
Name: invPkg.Name,
Ecosystem: e.Config.ExtractorEcosystem,
},
Version: invPkg.Version,
}
packagesToAnalyze = append(packagesToAnalyze, packageVer)
}
return packagesToAnalyze, nil
}