//go:build windows package main import ( "bufio" "compress/gzip" "context" "io" "os" "path/filepath" "github.com/Microsoft/go-winio" "github.com/Microsoft/hcsshim/internal/appargs" "github.com/Microsoft/hcsshim/pkg/ociwclayer" "github.com/urfave/cli" ) var importCommand = cli.Command{ Name: "import", Usage: "imports a layer from a tar file", Flags: []cli.Flag{ cli.StringSliceFlag{ Name: "layer, l", Usage: "paths to the read-only parent layers", }, cli.StringFlag{ Name: "input, i", Usage: "input layer tar (defaults to stdin)", }, }, ArgsUsage: "", Before: appargs.Validate(appargs.NonEmptyString), Action: func(cliContext *cli.Context) (err error) { path, err := filepath.Abs(cliContext.Args().First()) if err != nil { return err } layers, err := normalizeLayers(cliContext.StringSlice("layer"), false) if err != nil { return err } fp := cliContext.String("input") f := os.Stdin if fp != "" { f, err = os.Open(fp) if err != nil { return err } defer f.Close() } r, err := addDecompressor(f) if err != nil { return err } err = winio.EnableProcessPrivileges([]string{winio.SeBackupPrivilege, winio.SeRestorePrivilege}) if err != nil { return err } _, err = ociwclayer.ImportLayerFromTar(context.Background(), r, path, layers) return err }, } func addDecompressor(r io.Reader) (io.Reader, error) { b := bufio.NewReader(r) hdr, err := b.Peek(3) if err != nil { return nil, err } if hdr[0] == 0x1f && hdr[1] == 0x8b && hdr[2] == 8 { return gzip.NewReader(b) } return b, nil }