2021-08-02 01:10:41 +00:00
|
|
|
package app
|
|
|
|
|
2021-08-29 11:41:29 +00:00
|
|
|
import (
|
|
|
|
"os"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"coopcloud.tech/abra/cli/internal"
|
2021-12-11 23:17:39 +00:00
|
|
|
"coopcloud.tech/abra/pkg/autocomplete"
|
2021-08-29 11:41:29 +00:00
|
|
|
"github.com/sirupsen/logrus"
|
|
|
|
"github.com/urfave/cli/v2"
|
|
|
|
)
|
2021-08-02 01:10:41 +00:00
|
|
|
|
|
|
|
var appCpCommand = &cli.Command{
|
|
|
|
Name: "cp",
|
2021-09-04 23:34:56 +00:00
|
|
|
Aliases: []string{"c"},
|
2021-08-02 01:10:41 +00:00
|
|
|
ArgsUsage: "<src> <dst>",
|
2021-09-04 23:34:56 +00:00
|
|
|
Usage: "Copy files to/from a running app service",
|
2021-11-13 21:49:53 +00:00
|
|
|
Description: `
|
|
|
|
This command supports copying files to and from any app service file system.
|
|
|
|
|
|
|
|
If you want to copy a myfile.txt to the root of the app service:
|
|
|
|
|
|
|
|
abra app cp <app> myfile.txt app:/
|
|
|
|
|
|
|
|
And if you want to copy that file back to your current working directory locally:
|
|
|
|
|
|
|
|
abra app cp <app> app:/myfile.txt .
|
|
|
|
|
|
|
|
`,
|
2021-08-29 11:41:29 +00:00
|
|
|
Action: func(c *cli.Context) error {
|
2021-09-05 21:17:35 +00:00
|
|
|
app := internal.ValidateApp(c)
|
2021-08-29 11:41:29 +00:00
|
|
|
|
|
|
|
src := c.Args().Get(1)
|
|
|
|
dst := c.Args().Get(2)
|
|
|
|
if src == "" {
|
|
|
|
logrus.Fatal("missing <src> argument")
|
|
|
|
} else if dst == "" {
|
|
|
|
logrus.Fatal("missing <dest> argument")
|
|
|
|
}
|
|
|
|
|
|
|
|
parsedSrc := strings.SplitN(src, ":", 2)
|
|
|
|
parsedDst := strings.SplitN(dst, ":", 2)
|
|
|
|
errorMsg := "one of <src>/<dest> arguments must take $SERVICE:$PATH form"
|
|
|
|
if len(parsedSrc) == 2 && len(parsedDst) == 2 {
|
|
|
|
logrus.Fatal(errorMsg)
|
|
|
|
} else if len(parsedSrc) != 2 {
|
|
|
|
if len(parsedDst) != 2 {
|
|
|
|
logrus.Fatal(errorMsg)
|
|
|
|
}
|
|
|
|
} else if len(parsedDst) != 2 {
|
|
|
|
if len(parsedSrc) != 2 {
|
|
|
|
logrus.Fatal(errorMsg)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var service string
|
|
|
|
var srcPath string
|
|
|
|
var dstPath string
|
|
|
|
isToContainer := false // <container:src> <dst>
|
|
|
|
if len(parsedSrc) == 2 {
|
|
|
|
service = parsedSrc[0]
|
|
|
|
srcPath = parsedSrc[1]
|
|
|
|
dstPath = dst
|
2021-09-10 22:54:02 +00:00
|
|
|
logrus.Debugf("assuming transfer is coming FROM the container")
|
2021-08-29 11:41:29 +00:00
|
|
|
} else if len(parsedDst) == 2 {
|
|
|
|
service = parsedDst[0]
|
|
|
|
dstPath = parsedDst[1]
|
|
|
|
srcPath = src
|
|
|
|
isToContainer = true // <src> <container:dst>
|
2021-09-10 22:54:02 +00:00
|
|
|
logrus.Debugf("assuming transfer is going TO the container")
|
2021-08-29 11:41:29 +00:00
|
|
|
}
|
|
|
|
|
2021-11-13 21:50:14 +00:00
|
|
|
if !isToContainer {
|
|
|
|
if _, err := os.Stat(dstPath); os.IsNotExist(err) {
|
|
|
|
logrus.Fatalf("%s does not exist locally?", dstPath)
|
|
|
|
}
|
|
|
|
}
|
2021-11-15 15:48:23 +00:00
|
|
|
err := internal.ConfigureAndCp(c, app, srcPath, dstPath, service, isToContainer)
|
2021-08-29 11:41:29 +00:00
|
|
|
if err != nil {
|
|
|
|
logrus.Fatal(err)
|
|
|
|
}
|
|
|
|
return nil
|
2021-11-15 15:48:23 +00:00
|
|
|
|
2021-08-29 11:41:29 +00:00
|
|
|
},
|
2021-12-11 23:17:39 +00:00
|
|
|
BashComplete: autocomplete.AppNameComplete,
|
2021-08-02 01:10:41 +00:00
|
|
|
}
|