Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions ami/configuration.go
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,21 @@ func WriteAppDefinition(workingDir string, configuration map[string]any, appConf
return os.Rename(newAppDefPath, appDefPath)
}

func EnsureRemoteAppDirectory(locator *RemoteConfiguration) error {
session, err := locator.OpenAppRemoteSession()
if err != nil {
return err
}
defer session.Close()

credentials, err := locator.GetElevationCredentials()
if err != nil {
return err
}

return prepareFolderStructure(session.sshClient, locator.InstancePath, locator.App, locator.Username, credentials.ToEnvMap())
}

func ReadAppDefinition(workingDir string, appConfigPath string) (map[string]any, error) {
if isRemote, locator := IsRemoteApp(workingDir); isRemote {
session, err := locator.OpenAppRemoteSession()
Expand Down
15 changes: 14 additions & 1 deletion ami/exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,17 @@ func ExecuteRaw(args ...string) (int, error) {
return 0, nil
}

func applyExistingWorkingDir(proc *exec.Cmd, workingDir string) {
if proc == nil || workingDir == "" {
return
}

info, err := os.Stat(workingDir)
if err == nil && info.IsDir() {
proc.Dir = workingDir
}
}

func createAmiCmd(workingDir string, args ...string) (*exec.Cmd, error) {
eliPath, amiPath, err := GetEliAndAmiPath()
if err != nil {
Expand All @@ -45,7 +56,9 @@ func createAmiCmd(workingDir string, args ...string) (*exec.Cmd, error) {
eliArgs = append(eliArgs, "--path="+workingDir)
eliArgs = append(eliArgs, args...)

return exec.Command(eliPath, eliArgs...), nil
proc := exec.Command(eliPath, eliArgs...)
applyExistingWorkingDir(proc, workingDir)
return proc, nil
}

func runAmiCmd(workingDir string, args ...string) (exitCode int, err error) {
Expand Down
27 changes: 27 additions & 0 deletions ami/exec_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package ami

import (
"os/exec"
"testing"
)

func TestApplyExistingWorkingDir(t *testing.T) {
cmd := exec.Command("true")
dir := t.TempDir()

applyExistingWorkingDir(cmd, dir)

if cmd.Dir != dir {
t.Fatalf("expected working dir %q, got %q", dir, cmd.Dir)
}
}

func TestApplyExistingWorkingDirSkipsMissingDir(t *testing.T) {
cmd := exec.Command("true")

applyExistingWorkingDir(cmd, "/definitely/missing/dir")

if cmd.Dir != "" {
t.Fatalf("expected empty working dir for missing path, got %q", cmd.Dir)
}
}
52 changes: 49 additions & 3 deletions ami/remote.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package ami

import (
"bytes"
"context"
"crypto/rand"
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"io"
"os"
"path"
"path/filepath"
Expand Down Expand Up @@ -102,6 +104,10 @@ func (config *RemoteConfiguration) ToSshConnectionDetails() *system.SshConnectio
}
}

func (config *RemoteConfiguration) GetRemoteAppPath() string {
return path.Join(config.InstancePath, config.App)
}

func (config *RemoteConfiguration) GetElevationCredentials() (*RemoteElevateCredentials, error) {
if config.Elevate == REMOTE_ELEVATION_NONE {
return &RemoteElevateCredentials{Kind: REMOTE_ELEVATION_NONE}, nil
Expand Down Expand Up @@ -620,18 +626,58 @@ func (session *TezbakeRemoteSession) ForwardAmiExecuteWithOutputChannel(workingD
return result.ExitCode, result.Error
}

func (session *TezbakeRemoteSession) writeFileToRemote(fullPath string, content []byte, mode os.FileMode) error {
func (session *TezbakeRemoteSession) writeReaderToRemote(fullPath string, src io.Reader, mode os.FileMode) error {
file, err := session.sftpSession.OpenFile(fullPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC)
if err != nil {
return err
}
defer file.Close()

_, err = file.Write(content)
if _, err := io.Copy(file, src); err != nil {
return err
}

return file.Chmod(mode)
}

func (session *TezbakeRemoteSession) writeFileToRemote(fullPath string, content []byte, mode os.FileMode) error {
return session.writeReaderToRemote(fullPath, bytes.NewReader(content), mode)
}

func (session *TezbakeRemoteSession) UploadFile(localPath string, remotePath string, mode os.FileMode) error {
src, err := os.Open(localPath)
if err != nil {
return err
}
defer src.Close()

return session.writeReaderToRemote(remotePath, src, mode)
}

func (session *TezbakeRemoteSession) DownloadFile(remotePath string, localPath string, mode os.FileMode) error {
src, err := session.sftpSession.Open(remotePath)
if err != nil {
return err
}
defer src.Close()

dst, err := os.OpenFile(localPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, mode)
if err != nil {
return err
}
defer dst.Close()

err = file.Chmod(mode)
if _, err := io.Copy(dst, src); err != nil {
return err
}

return dst.Chmod(mode)
}

func (session *TezbakeRemoteSession) RemoveRemoteFile(remotePath string) error {
err := session.sftpSession.Remove(remotePath)
if errors.Is(err, os.ErrNotExist) {
return nil
}
return err
}
9 changes: 9 additions & 0 deletions apps/apps.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,15 @@ func GetInstalledApps(cmd *cobra.Command) []base.BakeBuddyApp {
return result
}

func FromId(id string) (base.BakeBuddyApp, bool) {
for _, app := range All {
if app.GetId() == id {
return app, true
}
}
return nil, false
}

func NodeFromPath(path string) *node.Node {
return node.FromPath(path)
}
Expand Down
Loading