123 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	js "encoding/json"
 | |
| 	"fmt"
 | |
| 
 | |
| 	"github.com/pkg/errors"
 | |
| 	of "github.com/projectatomic/libpod/cmd/podman/formats"
 | |
| 	"github.com/projectatomic/libpod/cmd/podman/libpodruntime"
 | |
| 	"github.com/urfave/cli"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	mountDescription = `
 | |
|    podman mount
 | |
|    Lists all mounted containers mount points
 | |
| 
 | |
|    podman mount CONTAINER-NAME-OR-ID
 | |
|    Mounts the specified container and outputs the mountpoint
 | |
| `
 | |
| 
 | |
| 	mountFlags = []cli.Flag{
 | |
| 		cli.BoolFlag{
 | |
| 			Name:  "notruncate",
 | |
| 			Usage: "do not truncate output",
 | |
| 		},
 | |
| 		cli.StringFlag{
 | |
| 			Name:  "format",
 | |
| 			Usage: "Change the output format to Go template",
 | |
| 		},
 | |
| 	}
 | |
| 	mountCommand = cli.Command{
 | |
| 		Name:        "mount",
 | |
| 		Usage:       "Mount a working container's root filesystem",
 | |
| 		Description: mountDescription,
 | |
| 		Action:      mountCmd,
 | |
| 		ArgsUsage:   "[CONTAINER-NAME-OR-ID]",
 | |
| 		Flags:       mountFlags,
 | |
| 	}
 | |
| )
 | |
| 
 | |
| // jsonMountPoint stores info about each container
 | |
| type jsonMountPoint struct {
 | |
| 	ID         string   `json:"id"`
 | |
| 	Names      []string `json:"names"`
 | |
| 	MountPoint string   `json:"mountpoint"`
 | |
| }
 | |
| 
 | |
| func mountCmd(c *cli.Context) error {
 | |
| 	if err := validateFlags(c, mountFlags); err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	runtime, err := libpodruntime.GetRuntime(c)
 | |
| 	if err != nil {
 | |
| 		return errors.Wrapf(err, "could not get runtime")
 | |
| 	}
 | |
| 	defer runtime.Shutdown(false)
 | |
| 
 | |
| 	formats := map[string]bool{
 | |
| 		"":            true,
 | |
| 		of.JSONString: true,
 | |
| 	}
 | |
| 
 | |
| 	args := c.Args()
 | |
| 	json := c.String("format") == of.JSONString
 | |
| 	if !formats[c.String("format")] {
 | |
| 		return errors.Errorf("%q is not a supported format", c.String("format"))
 | |
| 	}
 | |
| 
 | |
| 	if len(args) > 1 {
 | |
| 		return errors.Errorf("too many arguments specified")
 | |
| 	}
 | |
| 
 | |
| 	if len(args) == 1 {
 | |
| 		if json {
 | |
| 			return errors.Wrapf(err, "json option can not be used with a container id")
 | |
| 		}
 | |
| 		ctr, err := runtime.LookupContainer(args[0])
 | |
| 		if err != nil {
 | |
| 			return errors.Wrapf(err, "error looking up container %q", args[0])
 | |
| 		}
 | |
| 		mountPoint, err := ctr.Mount()
 | |
| 		if err != nil {
 | |
| 			return errors.Wrapf(err, "error mounting container %q", ctr.ID())
 | |
| 		}
 | |
| 		fmt.Printf("%s\n", mountPoint)
 | |
| 	} else {
 | |
| 		jsonMountPoints := []jsonMountPoint{}
 | |
| 		containers, err2 := runtime.GetContainers()
 | |
| 		if err2 != nil {
 | |
| 			return errors.Wrapf(err2, "error reading list of all containers")
 | |
| 		}
 | |
| 		for _, container := range containers {
 | |
| 			mountPoint, err := container.Mountpoint()
 | |
| 			if err != nil {
 | |
| 				return errors.Wrapf(err, "error getting mountpoint for %q", container.ID())
 | |
| 			}
 | |
| 			if mountPoint == "" {
 | |
| 				continue
 | |
| 			}
 | |
| 			if json {
 | |
| 				jsonMountPoints = append(jsonMountPoints, jsonMountPoint{ID: container.ID(), Names: []string{container.Name()}, MountPoint: mountPoint})
 | |
| 				continue
 | |
| 			}
 | |
| 
 | |
| 			if c.Bool("notruncate") {
 | |
| 				fmt.Printf("%-64s %s\n", container.ID(), mountPoint)
 | |
| 			} else {
 | |
| 				fmt.Printf("%-12.12s %s\n", container.ID(), mountPoint)
 | |
| 			}
 | |
| 		}
 | |
| 		if json {
 | |
| 			data, err := js.MarshalIndent(jsonMountPoints, "", "    ")
 | |
| 			if err != nil {
 | |
| 				return err
 | |
| 			}
 | |
| 			fmt.Printf("%s\n", data)
 | |
| 		}
 | |
| 	}
 | |
| 	return nil
 | |
| }
 |