Files
backrest/cmd/devtools/oplogimport/main.go

71 lines
1.5 KiB
Go

package main
import (
"bytes"
"compress/gzip"
"flag"
"log"
"os"
"path"
v1 "github.com/garethgeorge/backrest/gen/go/v1"
"github.com/garethgeorge/backrest/internal/env"
"github.com/garethgeorge/backrest/internal/oplog/bboltstore"
"go.uber.org/zap"
"google.golang.org/protobuf/encoding/prototext"
)
var (
outpath = flag.String("import-oplog-path", "", "path to import the oplog from compressed textproto e.g. .textproto.gz")
)
func main() {
flag.Parse()
if *outpath == "" {
flag.Usage()
return
}
// create a reader from the file
f, err := os.Open(*outpath)
if err != nil {
log.Fatalf("error opening file: %v", err)
}
defer f.Close()
cr, err := gzip.NewReader(f)
if err != nil {
log.Fatalf("error creating gzip reader: %v", err)
}
defer cr.Close()
// read into a buffer
var buf bytes.Buffer
if _, err := buf.ReadFrom(cr); err != nil {
log.Printf("error reading from gzip reader: %v", err)
}
log.Printf("importing operations from %q", *outpath)
output := &v1.OperationList{}
if err := prototext.Unmarshal(buf.Bytes(), output); err != nil {
log.Fatalf("error unmarshalling operations: %v", err)
}
zap.S().Infof("importing %d operations", len(output.Operations))
oplogFile := path.Join(env.DataDir(), "oplog.boltdb")
opstore, err := bboltstore.NewBboltStore(oplogFile)
if err != nil {
log.Fatalf("error creating oplog : %v", err)
}
defer opstore.Close()
for _, op := range output.Operations {
if err := opstore.Add(op); err != nil {
log.Printf("error adding operation to oplog: %v", err)
}
}
}