diff --git a/cmd/backup/config.go b/cmd/backup/config.go index 766848ba..692214da 100644 --- a/cmd/backup/config.go +++ b/cmd/backup/config.go @@ -98,6 +98,7 @@ type Config struct { GoogleDriveImpersonateSubject string `split_words:"true"` GoogleDriveEndpoint string `split_words:"true"` GoogleDriveTokenURL string `split_words:"true"` + GoogleDriveTeamDriveID string `split_words:"true"` Timezone string `envconfig:"TZ"` source string additionalEnvVars map[string]string diff --git a/cmd/backup/script.go b/cmd/backup/script.go index 797ae905..4c4e2d5f 100644 --- a/cmd/backup/script.go +++ b/cmd/backup/script.go @@ -259,6 +259,7 @@ func (s *script) init() error { ImpersonateSubject: s.c.GoogleDriveImpersonateSubject, Endpoint: s.c.GoogleDriveEndpoint, TokenURL: s.c.GoogleDriveTokenURL, + TeamDriveID: s.c.GoogleDriveTeamDriveID, } googleDriveBackend, err := googledrive.NewStorageBackend(googleDriveConfig, logFunc) if err != nil { diff --git a/docs/reference/index.md b/docs/reference/index.md index 09741231..32b47385 100644 --- a/docs/reference/index.md +++ b/docs/reference/index.md @@ -429,6 +429,14 @@ If you need to confirm what the container actually loaded, see [Show loaded conf # --- +# In case you are storing your archives in a "Team Drive", this value needs to be set. +# Note that you will still need to set GOOGLE_DRIVE_FOLDER_ID to determine where +# archives will be store. + +# GOOGLE_DRIVE_TEAM_DRIVE_ID="" + +# --- + # The email address of the user to impersonate when accessing Google Drive (domain-wide delegation). # This is required becasue your service account needs to act on behalf of a user in your organization in order to upload files. # How to: https://support.google.com/a/answer/162106 diff --git a/internal/storage/googledrive/googledrive.go b/internal/storage/googledrive/googledrive.go index e558d3eb..d0ed33b5 100644 --- a/internal/storage/googledrive/googledrive.go +++ b/internal/storage/googledrive/googledrive.go @@ -25,7 +25,8 @@ import ( type googleDriveStorage struct { storage.StorageBackend - client *drive.Service + client *drive.Service + teamDriveID string } // Config allows to configure a Google Drive storage backend. @@ -35,6 +36,7 @@ type Config struct { ImpersonateSubject string Endpoint string TokenURL string + TeamDriveID string } // NewStorageBackend creates and initializes a new Google Drive storage backend. @@ -78,7 +80,8 @@ func NewStorageBackend(opts Config, logFunc storage.Log) (storage.Backend, error DestinationPath: opts.FolderID, Log: logFunc, }, - client: srv, + client: srv, + teamDriveID: opts.TeamDriveID, }, nil } @@ -135,6 +138,9 @@ func (b *googleDriveStorage) Prune(deadline time.Time, pruningPrefix string) (*s pageToken := "" for { req := b.client.Files.List().Q(query).SupportsAllDrives(true).Fields("files(id, name, createdTime, parents)").PageToken(pageToken) + if b.teamDriveID != "" { + req = req.DriveId(b.teamDriveID).IncludeItemsFromAllDrives(true).Corpora("drive") + } res, err := req.Do() if err != nil { return nil, errwrap.Wrap(err, "listing files")