Refactor backends

This commit is contained in:
Alexander Neumann
2015-03-28 11:50:23 +01:00
parent f51aba1510
commit 5e69788eac
31 changed files with 1106 additions and 1125 deletions

View File

@@ -185,14 +185,22 @@ func (cmd CmdBackup) Execute(args []string) error {
return err
}
var parentSnapshotID backend.ID
var (
parentSnapshot string
parentSnapshotID backend.ID
)
if cmd.Parent != "" {
parentSnapshotID, err = s.FindSnapshot(cmd.Parent)
parentSnapshot, err = s.FindSnapshot(cmd.Parent)
if err != nil {
return fmt.Errorf("invalid id %q: %v", cmd.Parent, err)
}
parentSnapshotID, err = backend.ParseID(parentSnapshot)
if err != nil {
return fmt.Errorf("invalid parent snapshot id %v", parentSnapshot)
}
fmt.Printf("found parent snapshot %v\n", parentSnapshotID)
}

View File

@@ -49,7 +49,12 @@ func (cmd CmdCat) Execute(args []string) error {
}
// find snapshot id with prefix
id, err = s.FindSnapshot(args[1])
name, err := s.FindSnapshot(args[1])
if err != nil {
return err
}
id, err = backend.ParseID(name)
if err != nil {
return err
}
@@ -71,7 +76,7 @@ func (cmd CmdCat) Execute(args []string) error {
case "tree":
// try storage id
tree := &restic.Tree{}
err := s.LoadJSONID(backend.Tree, id, tree)
err := s.LoadJSONID(backend.Tree, id.String(), tree)
if err != nil {
return err
}
@@ -86,7 +91,7 @@ func (cmd CmdCat) Execute(args []string) error {
return nil
case "snapshot":
sn := &restic.Snapshot{}
err = s.LoadJSONID(backend.Snapshot, id, sn)
err = s.LoadJSONID(backend.Snapshot, id.String(), sn)
if err != nil {
return err
}
@@ -100,13 +105,15 @@ func (cmd CmdCat) Execute(args []string) error {
return nil
case "key":
data, err := s.Get(backend.Key, id)
rd, err := s.Get(backend.Key, id.String())
if err != nil {
return err
}
dec := json.NewDecoder(rd)
var key restic.Key
err = json.Unmarshal(data, &key)
err = dec.Decode(&key)
if err != nil {
return err
}

View File

@@ -115,8 +115,13 @@ func (c CmdFind) findInTree(s restic.Server, blob restic.Blob, path string) ([]f
return results, nil
}
func (c CmdFind) findInSnapshot(s restic.Server, id backend.ID) error {
debug.Log("restic.find", "searching in snapshot %s\n for entries within [%s %s]", id, c.oldest, c.newest)
func (c CmdFind) findInSnapshot(s restic.Server, name string) error {
debug.Log("restic.find", "searching in snapshot %s\n for entries within [%s %s]", name, c.oldest, c.newest)
id, err := backend.ParseID(name)
if err != nil {
return err
}
sn, err := restic.LoadSnapshot(s, id)
if err != nil {
@@ -182,12 +187,9 @@ func (c CmdFind) Execute(args []string) error {
return c.findInSnapshot(s, snapshotID)
}
list, err := s.List(backend.Snapshot)
if err != nil {
return err
}
for _, snapshotID := range list {
done := make(chan struct{})
defer close(done)
for snapshotID := range s.List(backend.Snapshot, done) {
err := c.findInSnapshot(s, snapshotID)
if err != nil {

View File

@@ -55,7 +55,7 @@ func fsckFile(opts CmdFsck, s restic.Server, m *restic.Map, IDs []backend.ID) (u
}
} else {
// test if data blob is there
ok, err := s.Test(backend.Data, blob.Storage)
ok, err := s.Test(backend.Data, blob.Storage.String())
if err != nil {
return 0, err
}
@@ -201,14 +201,19 @@ func (cmd CmdFsck) Execute(args []string) error {
}
if cmd.Snapshot != "" {
snapshotID, err := s.FindSnapshot(cmd.Snapshot)
name, err := s.FindSnapshot(cmd.Snapshot)
if err != nil {
return fmt.Errorf("invalid id %q: %v", cmd.Snapshot, err)
}
err = fsck_snapshot(cmd, s, snapshotID)
id, err := backend.ParseID(name)
if err != nil {
fmt.Fprintf(os.Stderr, "check for snapshot %v failed\n", snapshotID)
fmt.Fprintf(os.Stderr, "invalid snapshot id %v\n", name)
}
err = fsck_snapshot(cmd, s, id)
if err != nil {
fmt.Fprintf(os.Stderr, "check for snapshot %v failed\n", id)
}
return err
@@ -219,17 +224,20 @@ func (cmd CmdFsck) Execute(args []string) error {
cmd.o_trees = backend.NewIDSet()
}
list, err := s.List(backend.Snapshot)
debug.Log("restic.fsck", "checking %d snapshots\n", len(list))
if err != nil {
return err
}
done := make(chan struct{})
defer close(done)
var firstErr error
for _, snapshotID := range list {
err := fsck_snapshot(cmd, s, snapshotID)
for name := range s.List(backend.Snapshot, done) {
id, err := backend.ParseID(name)
if err != nil {
fmt.Fprintf(os.Stderr, "check for snapshot %v failed\n", snapshotID)
fmt.Fprintf(os.Stderr, "invalid snapshot id %v\n", name)
continue
}
err = fsck_snapshot(cmd, s, id)
if err != nil {
fmt.Fprintf(os.Stderr, "check for snapshot %v failed\n", id)
firstErr = err
}
}
@@ -252,13 +260,16 @@ func (cmd CmdFsck) Execute(args []string) error {
for _, d := range l {
debug.Log("restic.fsck", "checking for orphaned %v\n", d.desc)
blobs, err := s.List(d.tpe)
if err != nil {
return err
}
done := make(chan struct{})
for _, id := range blobs {
err := d.set.Find(id)
for name := range s.List(d.tpe, done) {
id, err := backend.ParseID(name)
if err != nil {
fmt.Fprintf(os.Stderr, "invalid id for %v: %v\n", d.tpe, name)
continue
}
err = d.set.Find(id)
if err != nil {
if !cmd.RemoveOrphaned {
fmt.Printf("orphaned %v %v\n", d.desc, id)
@@ -266,7 +277,7 @@ func (cmd CmdFsck) Execute(args []string) error {
}
fmt.Printf("removing orphaned %v %v\n", d.desc, id)
err := s.Remove(d.tpe, id)
err := s.Remove(d.tpe, name)
if err != nil {
return err
}

View File

@@ -31,22 +31,25 @@ func list_keys(s restic.Server) error {
return err
}
s.EachID(backend.Key, func(id backend.ID) {
k, err := restic.LoadKey(s, id)
done := make(chan struct{})
defer close(done)
for name := range s.List(backend.Key, done) {
k, err := restic.LoadKey(s, name)
if err != nil {
fmt.Fprintf(os.Stderr, "LoadKey() failed: %v\n", err)
return
continue
}
var current string
if id.Equal(s.Key().ID()) {
if name == s.Key().Name() {
current = "*"
} else {
current = " "
}
tab.Rows = append(tab.Rows, []interface{}{current, id[:plen],
tab.Rows = append(tab.Rows, []interface{}{current, name[:plen],
k.Username, k.Hostname, k.Created.Format(TimeFormat)})
})
}
tab.Write(os.Stdout)
@@ -71,17 +74,17 @@ func add_key(s restic.Server) error {
return nil
}
func delete_key(s restic.Server, id backend.ID) error {
if id.Equal(s.Key().ID()) {
func delete_key(s restic.Server, name string) error {
if name == s.Key().Name() {
return errors.New("refusing to remove key currently used to access repository")
}
err := s.Remove(backend.Key, id)
err := s.Remove(backend.Key, name)
if err != nil {
return err
}
fmt.Printf("removed key %v\n", id)
fmt.Printf("removed key %v\n", name)
return nil
}
@@ -100,7 +103,7 @@ func change_password(s restic.Server) error {
}
// remove old key
err = s.Remove(backend.Key, s.Key().ID())
err = s.Remove(backend.Key, s.Key().Name())
if err != nil {
return err
}

View File

@@ -49,7 +49,9 @@ func (cmd CmdList) Execute(args []string) error {
return errors.New("invalid type")
}
return s.EachID(t, func(id backend.ID) {
for id := range s.List(t, nil) {
fmt.Printf("%s\n", id)
})
}
return nil
}

View File

@@ -76,7 +76,12 @@ func (cmd CmdLs) Execute(args []string) error {
return err
}
id, err := backend.FindSnapshot(s, args[0])
name, err := backend.FindSnapshot(s, args[0])
if err != nil {
return err
}
id, err := backend.ParseID(name)
if err != nil {
return err
}

View File

@@ -35,7 +35,12 @@ func (cmd CmdRestore) Execute(args []string) error {
return err
}
id, err := backend.FindSnapshot(s, args[0])
name, err := backend.FindSnapshot(s, args[0])
if err != nil {
errx(1, "invalid id %q: %v", args[0], err)
}
id, err := backend.ParseID(name)
if err != nil {
errx(1, "invalid id %q: %v", args[0], err)
}

View File

@@ -101,12 +101,21 @@ func (cmd CmdSnapshots) Execute(args []string) error {
tab.Header = fmt.Sprintf("%-8s %-19s %-10s %s", "ID", "Date", "Source", "Directory")
tab.RowFormat = "%-8s %-19s %-10s %s"
done := make(chan struct{})
defer close(done)
list := []*restic.Snapshot{}
s.EachID(backend.Snapshot, func(id backend.ID) {
for name := range s.List(backend.Snapshot, done) {
id, err := backend.ParseID(name)
if err != nil {
fmt.Fprintf(os.Stderr, "error parsing id: %v", name)
continue
}
sn, err := restic.LoadSnapshot(s, id)
if err != nil {
fmt.Fprintf(os.Stderr, "error loading snapshot %s: %v\n", id, err)
return
continue
}
pos := sort.Search(len(list), func(i int) bool {
@@ -120,7 +129,7 @@ func (cmd CmdSnapshots) Execute(args []string) error {
} else {
list = append(list, sn)
}
})
}
plen, err := s.PrefixLength(backend.Snapshot)
if err != nil {

View File

@@ -12,6 +12,8 @@ import (
"github.com/jessevdk/go-flags"
"github.com/restic/restic"
"github.com/restic/restic/backend"
"github.com/restic/restic/backend/local"
"github.com/restic/restic/backend/sftp"
"github.com/restic/restic/debug"
)
@@ -79,7 +81,7 @@ func (cmd CmdInit) Execute(args []string) error {
os.Exit(1)
}
fmt.Printf("created restic backend %v at %s\n", s.ID().Str(), opts.Repo)
fmt.Printf("created restic backend %v at %s\n", s.ID(), opts.Repo)
return nil
}
@@ -96,7 +98,7 @@ func open(u string) (backend.Backend, error) {
}
if url.Scheme == "" {
return backend.OpenLocal(url.Path)
return local.Open(url.Path)
}
args := []string{url.Host}
@@ -106,7 +108,7 @@ func open(u string) (backend.Backend, error) {
}
args = append(args, "-s")
args = append(args, "sftp")
return backend.OpenSFTP(url.Path[1:], "ssh", args...)
return sftp.Open(url.Path[1:], "ssh", args...)
}
// Create the backend specified by URI.
@@ -117,7 +119,7 @@ func create(u string) (backend.Backend, error) {
}
if url.Scheme == "" {
return backend.CreateLocal(url.Path)
return local.Create(url.Path)
}
args := []string{url.Host}
@@ -127,7 +129,7 @@ func create(u string) (backend.Backend, error) {
}
args = append(args, "-s")
args = append(args, "sftp")
return backend.CreateSFTP(url.Path[1:], "ssh", args...)
return sftp.Create(url.Path[1:], "ssh", args...)
}
func OpenRepo() (restic.Server, error) {