diff --git a/abs/replica_client.go b/abs/replica_client.go index 3c180ba..576e466 100644 --- a/abs/replica_client.go +++ b/abs/replica_client.go @@ -56,8 +56,14 @@ func (c *ReplicaClient) Init(ctx context.Context) (err error) { return nil } + // Read account key from environment, if available. + accountKey := c.AccountKey + if accountKey == "" { + accountKey = os.Getenv("LITESTREAM_AZURE_ACCOUNT_KEY") + } + // Authenticate to ACS. - credential, err := azblob.NewSharedKeyCredential(c.AccountName, c.AccountKey) + credential, err := azblob.NewSharedKeyCredential(c.AccountName, accountKey) if err != nil { return err } @@ -487,6 +493,7 @@ func (itr *walSegmentIterator) fetch() error { } marker = resp.NextMarker + println("dbg/wal.fetch", len(resp.Segment.BlobItems)) for _, item := range resp.Segment.BlobItems { key := path.Base(item.Name) index, offset, err := litestream.ParseWALSegmentPath(key) diff --git a/cmd/litestream/main.go b/cmd/litestream/main.go index bf92e55..f3bd985 100644 --- a/cmd/litestream/main.go +++ b/cmd/litestream/main.go @@ -502,36 +502,37 @@ func newABSReplicaClientFromConfig(c *ReplicaConfig, r *litestream.Replica) (_ * return nil, fmt.Errorf("cannot specify url & bucket for abs replica") } - bucket, path := c.Bucket, c.Path - - // Apply settings from URL, if specified. - if c.URL != "" { - _, uhost, upath, err := ParseReplicaURL(c.URL) - if err != nil { - return nil, err - } - - // Only apply URL parts to field that have not been overridden. - if path == "" { - path = upath - } - if bucket == "" { - bucket = uhost - } - } - - // Ensure required settings are set. - if bucket == "" { - return nil, fmt.Errorf("bucket required for abs replica") - } - // Build replica. client := abs.NewReplicaClient() client.AccountName = c.AccountName client.AccountKey = c.AccountKey - client.Bucket = bucket - client.Path = path + client.Bucket = c.Bucket + client.Path = c.Path client.Endpoint = c.Endpoint + + // Apply settings from URL, if specified. + if c.URL != "" { + u, err := url.Parse(c.URL) + if err != nil { + return nil, err + } + + if client.AccountName == "" && u.User != nil { + client.AccountName = u.User.Username() + } + if client.Bucket == "" { + client.Bucket = u.Host + } + if client.Path == "" { + client.Path = strings.TrimPrefix(path.Clean(u.Path), "/") + } + } + + // Ensure required settings are set. + if client.Bucket == "" { + return nil, fmt.Errorf("bucket required for abs replica") + } + return client, nil }