spiegel_podman/cmd/podman/export.go
baude 13d2354bc6 Separate remote and local commands
In the previous CLI, we had an accurate depiction of commands
available for the remote client and those available for the
local client.

Signed-off-by: baude <bbaude@redhat.com>
2019-02-11 12:53:21 -06:00

74 lines
1.9 KiB
Go

package main
import (
"os"
"github.com/containers/libpod/cmd/podman/cliconfig"
"github.com/containers/libpod/libpod/adapter"
"github.com/containers/libpod/pkg/rootless"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
var (
exportCommand cliconfig.ExportValues
exportDescription = "Exports container's filesystem contents as a tar archive" +
" and saves it on the local machine."
_exportCommand = &cobra.Command{
Use: "export",
Short: "Export container's filesystem contents as a tar archive",
Long: exportDescription,
RunE: func(cmd *cobra.Command, args []string) error {
exportCommand.InputArgs = args
exportCommand.GlobalFlags = MainGlobalOpts
return exportCmd(&exportCommand)
},
Example: "CONTAINER",
}
)
func init() {
exportCommand.Command = _exportCommand
flags := exportCommand.Flags()
flags.StringVarP(&exportCommand.Output, "output", "o", "/dev/stdout", "Write to a file, default is STDOUT")
}
// exportCmd saves a container to a tarball on disk
func exportCmd(c *cliconfig.ExportValues) error {
if os.Geteuid() != 0 {
rootless.SetSkipStorageSetup(true)
}
runtime, err := adapter.GetRuntime(&c.PodmanCommand)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
defer runtime.Shutdown(false)
args := c.InputArgs
if len(args) == 0 {
return errors.Errorf("container id must be specified")
}
if len(args) > 1 {
return errors.Errorf("too many arguments given, need 1 at most.")
}
output := c.Output
if runtime.Remote && (output == "/dev/stdout" || len(output) == 0) {
return errors.New("remote client usage must specify an output file (-o)")
}
if output == "/dev/stdout" {
file := os.Stdout
if logrus.IsTerminal(file) {
return errors.Errorf("refusing to export to terminal. Use -o flag or redirect")
}
}
if err := validateFileName(output); err != nil {
return err
}
return runtime.Export(args[0], output)
}