1package main
2
3import (
4	"errors"
5	"fmt"
6	"os"
7	"path/filepath"
8
9	"github.com/Microsoft/hcsshim"
10	"github.com/Microsoft/hcsshim/internal/appargs"
11	"github.com/urfave/cli"
12)
13
14var mountCommand = cli.Command{
15	Name:      "mount",
16	Usage:     "mounts a scratch",
17	ArgsUsage: "<scratch path>",
18	Flags: []cli.Flag{
19		cli.StringSliceFlag{
20			Name:  "layer, l",
21			Usage: "paths to the parent layers for this layer",
22		},
23	},
24	Action: func(context *cli.Context) (err error) {
25		if context.NArg() != 1 {
26			return errors.New("invalid usage")
27		}
28		path, err := filepath.Abs(context.Args().First())
29		if err != nil {
30			return err
31		}
32
33		layers, err := normalizeLayers(context.StringSlice("layer"), true)
34		if err != nil {
35			return err
36		}
37
38		err = hcsshim.ActivateLayer(driverInfo, path)
39		if err != nil {
40			return err
41		}
42		defer func() {
43			if err != nil {
44				hcsshim.DeactivateLayer(driverInfo, path)
45			}
46		}()
47
48		err = hcsshim.PrepareLayer(driverInfo, path, layers)
49		if err != nil {
50			return err
51		}
52		defer func() {
53			if err != nil {
54				hcsshim.UnprepareLayer(driverInfo, path)
55			}
56		}()
57
58		mountPath, err := hcsshim.GetLayerMountPath(driverInfo, path)
59		if err != nil {
60			return err
61		}
62		_, err = fmt.Println(mountPath)
63		return err
64	},
65}
66
67var unmountCommand = cli.Command{
68	Name:      "unmount",
69	Usage:     "unmounts a scratch",
70	ArgsUsage: "<layer path>",
71	Before:    appargs.Validate(appargs.NonEmptyString),
72	Action: func(context *cli.Context) (err error) {
73		path, err := filepath.Abs(context.Args().First())
74		if err != nil {
75			return err
76		}
77
78		err = hcsshim.UnprepareLayer(driverInfo, path)
79		if err != nil {
80			fmt.Fprintln(os.Stderr, err)
81		}
82		err = hcsshim.DeactivateLayer(driverInfo, path)
83		if err != nil {
84			return err
85		}
86		return nil
87	},
88}
89