1package main
2
3import (
4	"compress/gzip"
5	"io"
6	"os"
7	"path/filepath"
8
9	winio "github.com/Microsoft/go-winio"
10	"github.com/Microsoft/hcsshim/internal/appargs"
11	"github.com/Microsoft/hcsshim/internal/ociwclayer"
12	"github.com/urfave/cli"
13)
14
15var exportCommand = cli.Command{
16	Name:  "export",
17	Usage: "exports a layer to a tar file",
18	Flags: []cli.Flag{
19		cli.StringSliceFlag{
20			Name:  "layer, l",
21			Usage: "paths to the read-only parent layers",
22		},
23		cli.StringFlag{
24			Name:  "output, o",
25			Usage: "output layer tar (defaults to stdout)",
26		},
27		cli.BoolFlag{
28			Name:  "gzip, z",
29			Usage: "compress output with gzip compression",
30		},
31	},
32	ArgsUsage: "<layer path>",
33	Before:    appargs.Validate(appargs.NonEmptyString),
34	Action: func(context *cli.Context) (err error) {
35		path, err := filepath.Abs(context.Args().First())
36		if err != nil {
37			return err
38		}
39
40		layers, err := normalizeLayers(context.StringSlice("layer"), true)
41		if err != nil {
42			return err
43		}
44
45		err = winio.EnableProcessPrivileges([]string{winio.SeBackupPrivilege})
46		if err != nil {
47			return err
48		}
49
50		fp := context.String("output")
51		f := os.Stdout
52		if fp != "" {
53			f, err = os.Create(fp)
54			if err != nil {
55				return err
56			}
57			defer f.Close()
58		}
59		w := io.Writer(f)
60		if context.Bool("gzip") {
61			w = gzip.NewWriter(w)
62		}
63
64		return ociwclayer.ExportLayer(w, path, layers)
65	},
66}
67