mirror of
https://github.com/safedep/pmg.git
synced 2026-08-03 07:24:09 +02:00
* feat: add extractor logic for manifest files * feat: add manifest-based package installation detection * feat: add osv-scanner for extracting lockfiles * refactor: add comment for cmd parse * refactor: add Ecosystem() method to PackageManager interface * refactor: implement package-manager-specific extractors & replace osv-scanner with scalibr * Update extractor/extractor.go Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Sahil Bansal <bansalsahil315@gmail.com> --------- Signed-off-by: Sahil Bansal <bansalsahil315@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
79 lines
1.9 KiB
Go
79 lines
1.9 KiB
Go
package extractor
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
packagev1 "buf.build/gen/go/safedep/api/protocolbuffers/go/safedep/messages/package/v1"
|
|
"github.com/safedep/dry/log"
|
|
)
|
|
|
|
type ExtractorConfig struct {
|
|
ExtractorPackageManager PackageManagerName
|
|
ScanDir string
|
|
}
|
|
|
|
type extractor struct {
|
|
Config ExtractorConfig
|
|
extractorManager ExtractorManager
|
|
}
|
|
|
|
func NewDefaultExtractorConfig() *ExtractorConfig {
|
|
return &ExtractorConfig{
|
|
ScanDir: ".",
|
|
}
|
|
}
|
|
|
|
func New(config ExtractorConfig) *extractor {
|
|
return &extractor{
|
|
Config: config,
|
|
extractorManager: *NewExtractorManager(),
|
|
}
|
|
}
|
|
|
|
func (e *extractor) ExtractManifest() ([]*packagev1.PackageVersion, error) {
|
|
packagesToAnalyze := []*packagev1.PackageVersion{}
|
|
|
|
// Get the list of lockfiles to check based on ecosystem
|
|
filesToCheck := e.getFilesToCheck()
|
|
|
|
for _, filename := range filesToCheck {
|
|
filePath := filepath.Join(e.Config.ScanDir, filename)
|
|
|
|
// Check if the file exists
|
|
if _, err := os.Stat(filePath); os.IsNotExist(err) {
|
|
continue
|
|
}
|
|
|
|
extractor, err := e.getExtractorForFile()
|
|
if err != nil {
|
|
log.Warnf("failed to get extractor\n")
|
|
continue
|
|
}
|
|
|
|
// Extract packages from this lockfile
|
|
packages, err := extractor.Extract(filePath, e.Config.ScanDir)
|
|
if err != nil {
|
|
log.Warnf("failed to extract from %s: %v\n", filePath, err)
|
|
continue
|
|
}
|
|
|
|
packagesToAnalyze = append(packagesToAnalyze, packages...)
|
|
}
|
|
|
|
return packagesToAnalyze, nil
|
|
}
|
|
|
|
func (e *extractor) getFilesToCheck() []string {
|
|
return e.extractorManager.GetSupportedFilesForPackageManager(e.Config.ExtractorPackageManager)
|
|
}
|
|
|
|
func (e *extractor) getExtractorForFile() (PackageManagerExtractor, error) {
|
|
extractor := e.extractorManager.GetExtractorForPackageManager(e.Config.ExtractorPackageManager)
|
|
if extractor == nil {
|
|
return nil, fmt.Errorf("no extractor found for the specified package manager: %s", e.Config.ExtractorPackageManager)
|
|
}
|
|
return extractor, nil
|
|
}
|