mirror of
https://github.com/restic/restic.git
synced 2025-12-10 10:01:54 +00:00
Refactor backends
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user