mirror of
https://github.com/restic/restic.git
synced 2024-12-27 02:08:37 +00:00
0dfdc11ed9
This change removes the hardcoded Google auth mechanism for the GCS backend, instead using Google's provided client library to discover and generate credential material. Google recommend that client libraries use their common auth mechanism in order to authorise requests against Google services. Doing so means you automatically support various types of authentication, from the standard GOOGLE_APPLICATION_CREDENTIALS environment variable to making use of Google's metadata API if running within Google Container Engine.
60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
package gs
|
|
|
|
import (
|
|
"path"
|
|
"strings"
|
|
|
|
"github.com/restic/restic/internal/errors"
|
|
"github.com/restic/restic/internal/options"
|
|
)
|
|
|
|
// Config contains all configuration necessary to connect to a Google Cloud Storage
|
|
// bucket. We use Google's default application credentials to acquire an access token, so
|
|
// we don't require that calling code supply any authentication material here.
|
|
type Config struct {
|
|
ProjectID string
|
|
Bucket string
|
|
Prefix string
|
|
|
|
Connections uint `option:"connections" help:"set a limit for the number of concurrent connections (default: 20)"`
|
|
}
|
|
|
|
// NewConfig returns a new Config with the default values filled in.
|
|
func NewConfig() Config {
|
|
return Config{
|
|
Connections: 5,
|
|
}
|
|
}
|
|
|
|
func init() {
|
|
options.Register("gs", Config{})
|
|
}
|
|
|
|
// ParseConfig parses the string s and extracts the gcs config. The
|
|
// supported configuration format is gs:bucketName:/[prefix].
|
|
func ParseConfig(s string) (interface{}, error) {
|
|
if !strings.HasPrefix(s, "gs:") {
|
|
return nil, errors.New("gs: invalid format")
|
|
}
|
|
|
|
// strip prefix "gs:"
|
|
s = s[3:]
|
|
|
|
// use the first entry of the path as the bucket name and the
|
|
// remainder as prefix
|
|
data := strings.SplitN(s, ":", 2)
|
|
if len(data) < 2 {
|
|
return nil, errors.New("gs: invalid format: bucket name or path not found")
|
|
}
|
|
|
|
bucket, path := data[0], path.Clean(data[1])
|
|
|
|
if strings.HasPrefix(path, "/") {
|
|
path = path[1:]
|
|
}
|
|
|
|
cfg := NewConfig()
|
|
cfg.Bucket = bucket
|
|
cfg.Prefix = path
|
|
return cfg, nil
|
|
}
|