/
legacycli.go
116 lines (95 loc) · 3.67 KB
/
legacycli.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package basic_workflows
import (
"bufio"
"bytes"
"os"
"github.com/pkg/errors"
"github.com/snyk/cli/cliv2/internal/cliv2"
"github.com/snyk/cli/cliv2/internal/proxy"
"github.com/snyk/cli/cliv2/internal/utils"
"github.com/snyk/go-application-framework/pkg/configuration"
pkg_utils "github.com/snyk/go-application-framework/pkg/utils"
"github.com/snyk/go-application-framework/pkg/workflow"
"github.com/snyk/go-httpauth/pkg/httpauth"
"github.com/spf13/pflag"
)
var WORKFLOWID_LEGACY_CLI workflow.Identifier = workflow.NewWorkflowIdentifier("legacycli")
var DATATYPEID_LEGACY_CLI_STDOUT workflow.Identifier = workflow.NewTypeIdentifier(WORKFLOWID_LEGACY_CLI, "stdout")
const (
PROXY_NOAUTH string = "proxy-noauth"
)
func Init(engine workflow.Engine) error {
flagset := pflag.NewFlagSet("legacycli", pflag.ContinueOnError)
flagset.StringSlice(configuration.RAW_CMD_ARGS, os.Args[1:], "Command line arguments for the legacy CLI.")
flagset.Bool(configuration.WORKFLOW_USE_STDIO, false, "Use StdIn and StdOut")
config := workflow.ConfigurationOptionsFromFlagset(flagset)
entry, _ := engine.Register(WORKFLOWID_LEGACY_CLI, config, legacycliWorkflow)
entry.SetVisibility(false)
return nil
}
func FilteredArgs(args []string) []string {
// filter args not meant to be forwarded to CLIv1 or an Extensions
elementsToFilter := []string{"--" + PROXY_NOAUTH}
filteredArgs := args
for _, element := range elementsToFilter {
filteredArgs = pkg_utils.RemoveSimilar(filteredArgs, element)
}
return filteredArgs
}
func legacycliWorkflow(invocation workflow.InvocationContext, input []workflow.Data) (output []workflow.Data, err error) {
output = []workflow.Data{}
var outBuffer bytes.Buffer
var errBuffer bytes.Buffer
config := invocation.GetConfiguration()
debugLogger := invocation.GetLogger()
args := config.GetStringSlice(configuration.RAW_CMD_ARGS)
useStdIo := config.GetBool(configuration.WORKFLOW_USE_STDIO)
debug := config.GetBool(configuration.DEBUG)
cacheDirectory := config.GetString(configuration.CACHE_PATH)
insecure := config.GetBool(configuration.INSECURE_HTTPS)
proxyAuthenticationMechanismString := config.GetString(configuration.PROXY_AUTHENTICATION_MECHANISM)
proxyAuthenticationMechanism := httpauth.AuthenticationMechanismFromString(proxyAuthenticationMechanismString)
if debug {
args = append(args, "--debug")
}
debugLogger.Println("Arguments:", args)
debugLogger.Println("Cache directory:", cacheDirectory)
debugLogger.Println("Insecure HTTPS:", insecure)
debugLogger.Println("Use StdIO:", useStdIo)
// prepare environment by creating all required folders in advance
err = utils.CreateAllDirectories(cacheDirectory, cliv2.GetFullVersion())
if err != nil {
return output, err
}
// init cli object
var cli *cliv2.CLI
cli, err = cliv2.NewCLIv2(cacheDirectory, debugLogger)
if err != nil {
return output, err
}
if useStdIo == false {
in := bytes.NewReader([]byte{})
out := bufio.NewWriter(&outBuffer)
err := bufio.NewWriter(&errBuffer)
cli.SetIoStreams(in, out, err)
}
// init proxy object
wrapperProxy, err := proxy.NewWrapperProxy(insecure, cacheDirectory, cliv2.GetFullVersion(), debugLogger)
if err != nil {
return output, errors.Wrap(err, "Failed to create proxy!")
}
defer wrapperProxy.Close()
wrapperProxy.SetUpstreamProxyAuthentication(proxyAuthenticationMechanism)
err = wrapperProxy.Start()
if err != nil {
return output, errors.Wrap(err, "Failed to start the proxy!")
}
// run the cli
proxyInfo := wrapperProxy.ProxyInfo()
err = cli.Execute(proxyInfo, FilteredArgs(args))
if useStdIo == false {
data := workflow.NewData(DATATYPEID_LEGACY_CLI_STDOUT, "text/plain", outBuffer.Bytes())
output = append(output, data)
}
return output, err
}