// Open the backend specified by URI. // Valid formats are: // * /foo/bar -> local repository at /foo/bar // * s3://region/bucket -> amazon s3 bucket // * sftp://user@host/foo/bar -> remote sftp repository on host for user at path foo/bar // * sftp://host//tmp/backup -> remote sftp repository on host at path /tmp/backup // * c:\temp -> local repository at c:\temp - the path must exist func open(u string) (backend.Backend, error) { // check if the url is a directory that exists fi, err := os.Stat(u) if err == nil && fi.IsDir() { return local.Open(u) } url, err := url.Parse(u) if err != nil { return nil, err } if url.Scheme == "" { return local.Open(url.Path) } if len(url.Path) < 1 { return nil, fmt.Errorf("unable to parse url %v", url) } if url.Scheme == "s3" { return s3.Open(url.Host, url.Path[1:]) } args := []string{url.Host} if url.User != nil && url.User.Username() != "" { args = append(args, "-l") args = append(args, url.User.Username()) } args = append(args, "-s") args = append(args, "sftp") return sftp.Open(url.Path[1:], "ssh", args...) }
// Open the backend specified by a location config. func open(s string) (backend.Backend, error) { debug.Log("open", "parsing location %v", s) loc, err := location.Parse(s) if err != nil { return nil, err } switch loc.Scheme { case "local": debug.Log("open", "opening local repository at %#v", loc.Config) return local.Open(loc.Config.(string)) case "sftp": debug.Log("open", "opening sftp repository at %#v", loc.Config) return sftp.OpenWithConfig(loc.Config.(sftp.Config)) case "s3": cfg := loc.Config.(s3.Config) if cfg.KeyID == "" { cfg.KeyID = os.Getenv("AWS_ACCESS_KEY_ID") } if cfg.Secret == "" { cfg.Secret = os.Getenv("AWS_SECRET_ACCESS_KEY") } debug.Log("open", "opening s3 repository at %#v", cfg) return s3.Open(cfg) } debug.Log("open", "invalid repository location: %v", s) return nil, fmt.Errorf("invalid scheme %q", loc.Scheme) }
// OpenLocalRepo opens the local repository located at dir. func OpenLocalRepo(t testing.TB, dir string) *repository.Repository { be, err := local.Open(dir) OK(t, err) repo := repository.New(be) err = repo.SearchKey(TestPassword) OK(t, err) return repo }
func TestLocalBackend(t *testing.T) { // test for non-existing backend b, err := local.Open("/invalid-restic-test") Assert(t, err != nil, "opening invalid repository at /invalid-restic-test should have failed, but err is nil") Assert(t, b == nil, fmt.Sprintf("opening invalid repository at /invalid-restic-test should have failed, but b is not nil: %v", b)) s := setupLocalBackend(t) defer teardownLocalBackend(t, s) testBackend(s, t) }
// Open the backend specified by URI. // Valid formats are: // * /foo/bar -> local repository at /foo/bar // * s3://region/bucket -> amazon s3 bucket // * sftp://user@host/foo/bar -> remote sftp repository on host for user at path foo/bar // * sftp://host//tmp/backup -> remote sftp repository on host at path /tmp/backup func open(u string) (backend.Backend, error) { url, err := url.Parse(u) if err != nil { return nil, err } if url.Scheme == "" { return local.Open(url.Path) } else if url.Scheme == "s3" { return s3.Open(url.Host, url.Path[1:]) } args := []string{url.Host} if url.User != nil && url.User.Username() != "" { args = append(args, "-l") args = append(args, url.User.Username()) } args = append(args, "-s") args = append(args, "sftp") return sftp.Open(url.Path[1:], "ssh", args...) }