github.com/tilotech/tilores-cli@v0.28.0/internal/pkg/step/plugininstall.go (about) 1 package step 2 3 import ( 4 "errors" 5 "fmt" 6 "os" 7 "os/exec" 8 "strings" 9 ) 10 11 // PluginInstall creates a step that installs the provided plugin. 12 func PluginInstall(pkg, version, target string) Step { 13 return func() error { 14 wd, err := os.Getwd() 15 if err != nil { 16 return err 17 } 18 cmd := createCommand("go", "install", fmt.Sprintf("%v@%v", pkg, version)) 19 cmd.Env = os.Environ() 20 cmd.Env = append(cmd.Env, fmt.Sprintf("GOBIN=%v", wd)) 21 22 err = cmd.Run() 23 if err != nil { 24 return fmt.Errorf("failed to get plugin dependency %v: %v", pkg, err) 25 } 26 27 sourceParts := strings.Split(pkg, "/") 28 source := sourceParts[len(sourceParts)-1] 29 err = os.Rename(source, target) 30 if err != nil { 31 return fmt.Errorf("failed to move plugin dependency %v from %v to %v: %v", pkg, source, target, err) 32 } 33 34 // Install plugin for linux os (used by AWS lambda) 35 cmdLinux := createCommand("go", "install", fmt.Sprintf("%v@%v", pkg, version)) 36 linuxGoEnvs := []string{fmt.Sprintf("GOPATH=%v/plugins", wd), "GOOS=linux", "GOARCH=arm64", "CGO_ENABLED=0"} 37 cmdLinux.Env = os.Environ() 38 cmdLinux.Env = append(cmdLinux.Env, linuxGoEnvs...) 39 40 err = cmdLinux.Run() 41 if err != nil { 42 return fmt.Errorf("failed to get plugin dependency for linux %v: %v", pkg, err) 43 } 44 45 pluginLinuxBinPath := wd + "/plugins/bin/linux_arm64/" + source 46 if _, err := os.Stat(pluginLinuxBinPath); errors.Is(err, os.ErrNotExist) { 47 pluginLinuxBinPath = wd + "/plugins/bin/" + source 48 } 49 err = os.Rename(pluginLinuxBinPath, target+"-linux-arm64") 50 if err != nil { 51 return fmt.Errorf("failed to move plugin dependency %v from %v to %v: %v", pkg, pluginLinuxBinPath, target+"-linux-arm64", err) 52 } 53 54 _, err = exec.Command("chmod", "-R", "0755", wd+"/plugins").CombinedOutput() //nolint:gosec 55 if err != nil { 56 return fmt.Errorf("chmod failed on plugins folder: %v", err) 57 } 58 err = os.RemoveAll(wd + "/plugins/") 59 if err != nil { 60 return fmt.Errorf("failed to cleanup after plugins install: %v", err) 61 } 62 63 return nil 64 } 65 }