mirror of
https://github.com/safedep/pmg.git
synced 2026-08-03 07:24:09 +02:00
71 lines
1.7 KiB
Go
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
|
|
}
|