summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'cmd')
-rw-r--r--cmd/gotosocial/action/admin/media/prune/orphaned.go72
-rw-r--r--cmd/gotosocial/admin.go36
2 files changed, 108 insertions, 0 deletions
diff --git a/cmd/gotosocial/action/admin/media/prune/orphaned.go b/cmd/gotosocial/action/admin/media/prune/orphaned.go
new file mode 100644
index 000000000..4ceb356bd
--- /dev/null
+++ b/cmd/gotosocial/action/admin/media/prune/orphaned.go
@@ -0,0 +1,72 @@
+/*
+ GoToSocial
+ Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package prune
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/superseriousbusiness/gotosocial/cmd/gotosocial/action"
+ "github.com/superseriousbusiness/gotosocial/internal/config"
+ "github.com/superseriousbusiness/gotosocial/internal/db/bundb"
+ "github.com/superseriousbusiness/gotosocial/internal/log"
+ "github.com/superseriousbusiness/gotosocial/internal/media"
+ gtsstorage "github.com/superseriousbusiness/gotosocial/internal/storage"
+)
+
+// Orphaned prunes orphaned media from storage.
+var Orphaned action.GTSAction = func(ctx context.Context) error {
+ dbService, err := bundb.NewBunDBService(ctx)
+ if err != nil {
+ return fmt.Errorf("error creating dbservice: %s", err)
+ }
+
+ storage, err := gtsstorage.AutoConfig()
+ if err != nil {
+ return fmt.Errorf("error creating storage backend: %w", err)
+ }
+
+ manager, err := media.NewManager(dbService, storage)
+ if err != nil {
+ return fmt.Errorf("error instantiating mediamanager: %s", err)
+ }
+
+ dry := config.GetAdminMediaPruneDryRun()
+
+ pruned, err := manager.PruneOrphaned(ctx, dry)
+ if err != nil {
+ return fmt.Errorf("error pruning: %s", err)
+ }
+
+ if dry {
+ log.Infof("DRY RUN: %d stored items are orphaned and eligible to be pruned", pruned)
+ } else {
+ log.Infof("%d stored items were orphaned and pruned", pruned)
+ }
+
+ if err := storage.Close(); err != nil {
+ return fmt.Errorf("error closing storage backend: %w", err)
+ }
+
+ if err := dbService.Stop(ctx); err != nil {
+ return fmt.Errorf("error closing dbservice: %s", err)
+ }
+
+ return nil
+}
diff --git a/cmd/gotosocial/admin.go b/cmd/gotosocial/admin.go
index 4bf71d612..0575452fb 100644
--- a/cmd/gotosocial/admin.go
+++ b/cmd/gotosocial/admin.go
@@ -21,6 +21,7 @@ package main
import (
"github.com/spf13/cobra"
"github.com/superseriousbusiness/gotosocial/cmd/gotosocial/action/admin/account"
+ "github.com/superseriousbusiness/gotosocial/cmd/gotosocial/action/admin/media/prune"
"github.com/superseriousbusiness/gotosocial/cmd/gotosocial/action/admin/trans"
"github.com/superseriousbusiness/gotosocial/internal/config"
)
@@ -152,5 +153,40 @@ func adminCommands() *cobra.Command {
config.AddAdminTrans(adminImportCmd)
adminCmd.AddCommand(adminImportCmd)
+ /*
+ ADMIN MEDIA COMMANDS
+ */
+
+ adminMediaCmd := &cobra.Command{
+ Use: "media",
+ Short: "admin commands related stored media attachments/emojis",
+ }
+
+ /*
+ ADMIN MEDIA PRUNE COMMANDS
+ */
+ adminMediaPruneCmd := &cobra.Command{
+ Use: "prune",
+ Short: "admin commands for pruning unused/orphaned media from storage",
+ }
+ config.AddAdminMediaPrune(adminMediaPruneCmd)
+
+ adminMediaPruneOrphanedCmd := &cobra.Command{
+ Use: "orphaned",
+ Short: "prune orphaned media from storage",
+ PreRunE: func(cmd *cobra.Command, args []string) error {
+ return preRun(preRunArgs{cmd: cmd})
+ },
+ RunE: func(cmd *cobra.Command, args []string) error {
+ return run(cmd.Context(), prune.Orphaned)
+ },
+ }
+ config.AddAdminMediaPrune(adminMediaPruneOrphanedCmd)
+ adminMediaPruneCmd.AddCommand(adminMediaPruneOrphanedCmd)
+
+ adminMediaCmd.AddCommand(adminMediaPruneCmd)
+
+ adminCmd.AddCommand(adminMediaCmd)
+
return adminCmd
}