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 }