aboutsummaryrefslogtreecommitdiff
path: root/unmaintained/see_meta/see_meta.go
blob: 405aed0baa5dd96f63fa5c7b521d1540749c7f30 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package main

import (
	"flag"
	"fmt"
	"io"
	"log"
	"os"

	"google.golang.org/protobuf/proto"

	"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
	"github.com/seaweedfs/seaweedfs/weed/util"
)

var (
	metaFile = flag.String("meta", "", "meta file generated via fs.meta.save")
)

func main() {
	flag.Parse()

	dst, err := os.OpenFile(*metaFile, os.O_RDONLY, 0644)
	if err != nil {
		log.Fatalf("failed to open %s: %v", *metaFile, err)
	}
	defer dst.Close()

	err = walkMetaFile(dst)
	if err != nil {
		log.Fatalf("failed to visit %s: %v", *metaFile, err)
	}

}

func walkMetaFile(dst *os.File) error {

	sizeBuf := make([]byte, 4)

	for {
		if n, err := dst.Read(sizeBuf); n != 4 {
			if err == io.EOF {
				return nil
			}
			return err
		}

		size := util.BytesToUint32(sizeBuf)

		data := make([]byte, int(size))

		if n, err := dst.Read(data); n != len(data) {
			return err
		}

		fullEntry := &filer_pb.FullEntry{}
		if err := proto.Unmarshal(data, fullEntry); err != nil {
			return err
		}

		fmt.Fprintf(os.Stdout, "file %s %v\n", util.FullPath(fullEntry.Dir).Child(fullEntry.Entry.Name), fullEntry.Entry.Attributes.String())
		for i, chunk := range fullEntry.Entry.Chunks {
			fmt.Fprintf(os.Stdout, "  chunk: %d %v %d,%x%08x\n", i+1, chunk, chunk.Fid.VolumeId, chunk.Fid.FileKey, chunk.Fid.Cookie)
		}

	}

}