mirror of
https://github.com/safedep/pmg.git
synced 2026-08-03 07:24:09 +02:00
* fix: Show error messages on fatal failures #32 * test: Add E2E test * test: fix E2E scripts * test: fix E2E scripts * fix: Race condition in concurrent analyzer * fix: update formatting to ensure docs URL is clickable Signed-off-by: Sahil Bansal <bansalsahil315@gmail.com> * fix: E2E test --------- Signed-off-by: Sahil Bansal <bansalsahil315@gmail.com> Co-authored-by: Sahil Bansal <bansalsahil315@gmail.com>
82 lines
2.4 KiB
Go
82 lines
2.4 KiB
Go
package flows
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/safedep/pmg/analyzer"
|
|
"github.com/safedep/pmg/config"
|
|
"github.com/safedep/pmg/guard"
|
|
"github.com/safedep/pmg/internal/ui"
|
|
"github.com/safedep/pmg/packagemanager"
|
|
)
|
|
|
|
type commonFlow struct {
|
|
pm packagemanager.PackageManager
|
|
}
|
|
|
|
// Creates a common flow of execution for all package managers. This should work for most
|
|
// of the cases unless a package manager has its own unique requirements. Configuration
|
|
// should be passed through the context (Global Config)
|
|
func Common(pm packagemanager.PackageManager) *commonFlow {
|
|
return &commonFlow{
|
|
pm: pm,
|
|
}
|
|
}
|
|
|
|
func (f *commonFlow) Run(ctx context.Context, args []string) error {
|
|
config, err := config.FromContext(ctx)
|
|
if err != nil {
|
|
ui.Fatalf("Failed to get config: %s", err)
|
|
}
|
|
|
|
packageResolverConfig := packagemanager.NewDefaultNpmDependencyResolverConfig()
|
|
packageResolverConfig.IncludeTransitiveDependencies = config.Transitive
|
|
packageResolverConfig.TransitiveDepth = config.TransitiveDepth
|
|
packageResolverConfig.IncludeDevDependencies = config.IncludeDevDependencies
|
|
|
|
packageResolver, err := packagemanager.NewNpmDependencyResolver(packageResolverConfig)
|
|
if err != nil {
|
|
ui.Fatalf("Failed to create dependency resolver: %s", err)
|
|
}
|
|
|
|
var analyzers []analyzer.PackageVersionAnalyzer
|
|
|
|
if config.Paranoid {
|
|
malysisActiveScanAnalyzer, err := analyzer.NewMalysisActiveScanAnalyzer(analyzer.DefaultMalysisActiveScanAnalyzerConfig())
|
|
if err != nil {
|
|
ui.Fatalf("Failed to create malware analyzer: %s", err)
|
|
}
|
|
|
|
analyzers = append(analyzers, malysisActiveScanAnalyzer)
|
|
} else {
|
|
malysisQueryAnalyzer, err := analyzer.NewMalysisQueryAnalyzer(analyzer.MalysisQueryAnalyzerConfig{})
|
|
if err != nil {
|
|
ui.Fatalf("Failed to create malware analyzer: %s", err)
|
|
}
|
|
|
|
analyzers = append(analyzers, malysisQueryAnalyzer)
|
|
}
|
|
|
|
interaction := guard.PackageManagerGuardInteraction{
|
|
SetStatus: ui.SetStatus,
|
|
ClearStatus: ui.ClearStatus,
|
|
GetConfirmationOnMalware: ui.GetConfirmationOnMalware,
|
|
Block: ui.Block,
|
|
}
|
|
|
|
guardConfig := guard.DefaultPackageManagerGuardConfig()
|
|
guardConfig.DryRun = config.DryRun
|
|
|
|
proxy, err := guard.NewPackageManagerGuard(guardConfig, f.pm, packageResolver, analyzers, interaction)
|
|
if err != nil {
|
|
ui.Fatalf("Failed to create package manager guard: %s", err)
|
|
}
|
|
|
|
err = proxy.Run(ctx, args)
|
|
if err != nil {
|
|
ui.Fatalf("pmg: failed to execute command: %s", err)
|
|
}
|
|
|
|
return err
|
|
}
|