package internal import ( "fmt" "os" "coopcloud.tech/abra/cli/formatter" "coopcloud.tech/abra/pkg/client" "coopcloud.tech/abra/pkg/config" "coopcloud.tech/abra/pkg/container" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/pkg/archive" "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" ) func ConfigureAndCp(c *cli.Context, app config.App, srcPath string, dstPath string, service string, isToContainer bool) error { appFiles, err := config.LoadAppFiles("") if err != nil { logrus.Fatal(err) } appEnv, err := config.GetApp(appFiles, app.Name) if err != nil { logrus.Fatal(err) } cl, err := client.New(app.Server) if err != nil { logrus.Fatal(err) } filters := filters.NewArgs() filters.Add("name", fmt.Sprintf("%s_%s", appEnv.StackName(), service)) container, err := container.GetContainer(c.Context, cl, filters, true) if err != nil { logrus.Fatal(err) } logrus.Debugf("retrieved %s as target container on %s", formatter.ShortenID(container.ID), app.Server) if isToContainer { if _, err := os.Stat(srcPath); err != nil { logrus.Fatalf("%s does not exist?", srcPath) } toTarOpts := &archive.TarOptions{NoOverwriteDirNonDir: true, Compression: archive.Gzip} content, err := archive.TarWithOptions(srcPath, toTarOpts) if err != nil { logrus.Fatal(err) } copyOpts := types.CopyToContainerOptions{AllowOverwriteDirWithFile: false, CopyUIDGID: false} if err := cl.CopyToContainer(c.Context, container.ID, dstPath, content, copyOpts); err != nil { logrus.Fatal(err) } } else { content, _, err := cl.CopyFromContainer(c.Context, container.ID, srcPath) if err != nil { logrus.Fatal(err) } defer content.Close() fromTarOpts := &archive.TarOptions{NoOverwriteDirNonDir: true, Compression: archive.Gzip} if err := archive.Untar(content, dstPath, fromTarOpts); err != nil { logrus.Fatal(err) } } return nil }