93 lines
2.2 KiB
Go
93 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/pkg/errors"
|
|
"github.com/projectatomic/libpod/cmd/podman/libpodruntime"
|
|
"github.com/projectatomic/libpod/libpod"
|
|
"github.com/sirupsen/logrus"
|
|
"github.com/urfave/cli"
|
|
)
|
|
|
|
var (
|
|
umountFlags = []cli.Flag{
|
|
cli.BoolFlag{
|
|
Name: "all, a",
|
|
Usage: "umount all of the currently mounted containers",
|
|
},
|
|
}
|
|
|
|
umountCommand = cli.Command{
|
|
Name: "umount",
|
|
Aliases: []string{"unmount"},
|
|
Usage: "Unmounts working container's root filesystem",
|
|
Description: "Unmounts working container's root filesystem",
|
|
Flags: umountFlags,
|
|
Action: umountCmd,
|
|
ArgsUsage: "CONTAINER-NAME-OR-ID",
|
|
}
|
|
)
|
|
|
|
func umountCmd(c *cli.Context) error {
|
|
runtime, err := libpodruntime.GetRuntime(c)
|
|
if err != nil {
|
|
return errors.Wrapf(err, "could not get runtime")
|
|
}
|
|
defer runtime.Shutdown(false)
|
|
|
|
umountAll := c.Bool("all")
|
|
args := c.Args()
|
|
if len(args) == 0 && !umountAll {
|
|
return errors.Errorf("container ID must be specified")
|
|
}
|
|
if len(args) > 0 && umountAll {
|
|
return errors.Errorf("when using the --all switch, you may not pass any container IDs")
|
|
}
|
|
|
|
umountContainerErrStr := "error unmounting container"
|
|
var lastError error
|
|
if len(args) > 0 {
|
|
for _, name := range args {
|
|
ctr, err := runtime.LookupContainer(name)
|
|
if err != nil {
|
|
if lastError != nil {
|
|
logrus.Error(lastError)
|
|
}
|
|
lastError = errors.Wrapf(err, "%s %s", umountContainerErrStr, name)
|
|
continue
|
|
}
|
|
|
|
if err = ctr.Unmount(); err != nil {
|
|
if lastError != nil {
|
|
logrus.Error(lastError)
|
|
}
|
|
lastError = errors.Wrapf(err, "%s %s", umountContainerErrStr, name)
|
|
continue
|
|
}
|
|
fmt.Printf("%s\n", ctr.ID())
|
|
}
|
|
} else {
|
|
containers, err := runtime.GetContainers()
|
|
if err != nil {
|
|
return errors.Wrapf(err, "error reading Containers")
|
|
}
|
|
for _, ctr := range containers {
|
|
ctrState, err := ctr.State()
|
|
if ctrState == libpod.ContainerStateRunning || err != nil {
|
|
continue
|
|
}
|
|
|
|
if err = ctr.Unmount(); err != nil {
|
|
if lastError != nil {
|
|
logrus.Error(lastError)
|
|
}
|
|
lastError = errors.Wrapf(err, "%s %s", umountContainerErrStr, ctr.ID())
|
|
continue
|
|
}
|
|
fmt.Printf("%s\n", ctr.ID())
|
|
}
|
|
}
|
|
return lastError
|
|
}
|