storj.io/minio@v0.0.0-20230509071714-0cbc90f649b1/docs/zh_CN/bucket/versioning/xl-meta-to-json.go (about)

     1  /*
     2   * MinIO Cloud Storage, (C) 2020 MinIO, Inc.
     3   *
     4   * Licensed under the Apache License, Version 2.0 (the "License");
     5   * you may not use this file except in compliance with the License.
     6   * You may obtain a copy of the License at
     7   *
     8   *     http://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  
    17  package main
    18  
    19  import (
    20  	"bytes"
    21  	"encoding/json"
    22  	"fmt"
    23  	"io"
    24  	"log"
    25  	"os"
    26  
    27  	"github.com/minio/cli"
    28  	"github.com/tinylib/msgp/msgp"
    29  )
    30  
    31  var xlHeader = [4]byte{'X', 'L', '2', ' '}
    32  
    33  func main() {
    34  	app := cli.NewApp()
    35  	app.Copyright = "MinIO, Inc."
    36  	app.Usage = "xl.meta to JSON"
    37  	app.HideVersion = true
    38  	app.CustomAppHelpTemplate = `NAME:
    39    {{.Name}} - {{.Usage}}
    40  
    41  USAGE:
    42    {{.Name}} {{if .VisibleFlags}}[FLAGS]{{end}} METAFILES...
    43  {{if .VisibleFlags}}
    44  GLOBAL FLAGS:
    45    {{range .VisibleFlags}}{{.}}
    46    {{end}}{{end}}
    47  `
    48  
    49  	app.HideHelpCommand = true
    50  
    51  	app.Flags = []cli.Flag{
    52  		cli.BoolFlag{
    53  			Usage: "Print each file as a separate line without formatting",
    54  			Name:  "ndjson",
    55  		},
    56  	}
    57  
    58  	app.Action = func(c *cli.Context) error {
    59  		if !c.Args().Present() {
    60  			cli.ShowAppHelp(c)
    61  			return nil
    62  		}
    63  		for _, file := range c.Args() {
    64  			var r io.Reader
    65  			switch file {
    66  			case "-":
    67  				r = os.Stdin
    68  			default:
    69  				f, err := os.Open(file)
    70  				if err != nil {
    71  					return err
    72  				}
    73  				defer f.Close()
    74  				r = f
    75  			}
    76  
    77  			// Read header
    78  			var tmp [4]byte
    79  			_, err := io.ReadFull(r, tmp[:])
    80  			if err != nil {
    81  				return err
    82  			}
    83  			if !bytes.Equal(tmp[:], xlHeader[:]) {
    84  				return fmt.Errorf("xlMeta: unknown XLv2 header, expected %v, got %v", xlHeader[:4], tmp[:4])
    85  			}
    86  			// Skip version check for now
    87  			_, err = io.ReadFull(r, tmp[:])
    88  			if err != nil {
    89  				return err
    90  			}
    91  
    92  			var buf bytes.Buffer
    93  			_, err = msgp.CopyToJSON(&buf, r)
    94  			if err != nil {
    95  				return err
    96  			}
    97  			if c.Bool("ndjson") {
    98  				fmt.Println(buf.String())
    99  				continue
   100  			}
   101  			var msi map[string]interface{}
   102  			dec := json.NewDecoder(&buf)
   103  			// Use number to preserve integers.
   104  			dec.UseNumber()
   105  			err = dec.Decode(&msi)
   106  			if err != nil {
   107  				return err
   108  			}
   109  			b, err := json.MarshalIndent(msi, "", "  ")
   110  			if err != nil {
   111  				return err
   112  			}
   113  			fmt.Println(string(b))
   114  		}
   115  		return nil
   116  	}
   117  	err := app.Run(os.Args)
   118  	if err != nil {
   119  		log.Fatal(err)
   120  	}
   121  }