mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2024-10-31 22:40:01 +00:00
81f33c3b9f
* [feature] Add media list command This is an attempt to help alleviate #1776. Using admin media list --local the full path to each local media file will be printed, with a newline. The output of this should be feadable into backup tools in order to allow to backup local media too. Together with the database this should allow to fully recover from the loss of an instance. The list command also gets a --remote flag for symmetry. In the case of --remote we print the RemoteURL instead, the location the asset can be retrieved from. To get all media, you can run with --local and --remote. * [bugfix] Fix the test failures * [feature] Reimplement list media as top commands This changes the implementation of admin media list --<variant> to two separate top-level commands, list-local and list-remote. The implementation now iterates over over the database in batches of 200 in order to avoid loading all media metadata into memory. * [feature] Implement ListMedia with filter callback This does away with the somewhat odd iterator-like structure we had before and does away with most of the loop duplication in list-local and list-remote. Instead they call GetAllMediaPaths with a filter func to select the media they want. That's accumulated into a slice and eventually returned. * [bugfix] Simplify remote filter Since we don't append the empty string anywhere, the remote filter can be limited to returning RemoteURL, as that'll be an empty string for local media. * [docs] Add media list commands to CLI reference --------- Co-authored-by: tobi <31960611+tsmethurst@users.noreply.github.com>
258 lines
7.9 KiB
Go
258 lines
7.9 KiB
Go
// GoToSocial
|
|
// Copyright (C) GoToSocial Authors admin@gotosocial.org
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
//
|
|
// 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 main
|
|
|
|
import (
|
|
"github.com/spf13/cobra"
|
|
"github.com/superseriousbusiness/gotosocial/cmd/gotosocial/action/admin/account"
|
|
"github.com/superseriousbusiness/gotosocial/cmd/gotosocial/action/admin/media"
|
|
"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"
|
|
)
|
|
|
|
func adminCommands() *cobra.Command {
|
|
adminCmd := &cobra.Command{
|
|
Use: "admin",
|
|
Short: "gotosocial admin-related tasks",
|
|
}
|
|
|
|
/*
|
|
ADMIN ACCOUNT COMMANDS
|
|
*/
|
|
|
|
adminAccountCmd := &cobra.Command{
|
|
Use: "account",
|
|
Short: "admin commands related to local (this instance) accounts",
|
|
}
|
|
config.AddAdminAccount(adminAccountCmd)
|
|
|
|
adminAccountCreateCmd := &cobra.Command{
|
|
Use: "create",
|
|
Short: "create a new local account",
|
|
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(), account.Create)
|
|
},
|
|
}
|
|
config.AddAdminAccountCreate(adminAccountCreateCmd)
|
|
adminAccountCmd.AddCommand(adminAccountCreateCmd)
|
|
|
|
adminAccountListCmd := &cobra.Command{
|
|
Use: "list",
|
|
Short: "list all existing local accounts",
|
|
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(), account.List)
|
|
},
|
|
}
|
|
adminAccountCmd.AddCommand(adminAccountListCmd)
|
|
|
|
adminAccountConfirmCmd := &cobra.Command{
|
|
Use: "confirm",
|
|
Short: "confirm an existing local account manually, thereby skipping email confirmation",
|
|
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(), account.Confirm)
|
|
},
|
|
}
|
|
config.AddAdminAccount(adminAccountConfirmCmd)
|
|
adminAccountCmd.AddCommand(adminAccountConfirmCmd)
|
|
|
|
adminAccountPromoteCmd := &cobra.Command{
|
|
Use: "promote",
|
|
Short: "promote a local account to admin",
|
|
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(), account.Promote)
|
|
},
|
|
}
|
|
config.AddAdminAccount(adminAccountPromoteCmd)
|
|
adminAccountCmd.AddCommand(adminAccountPromoteCmd)
|
|
|
|
adminAccountDemoteCmd := &cobra.Command{
|
|
Use: "demote",
|
|
Short: "demote a local account from admin to normal user",
|
|
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(), account.Demote)
|
|
},
|
|
}
|
|
config.AddAdminAccount(adminAccountDemoteCmd)
|
|
adminAccountCmd.AddCommand(adminAccountDemoteCmd)
|
|
|
|
adminAccountDisableCmd := &cobra.Command{
|
|
Use: "disable",
|
|
Short: "prevent a local account from signing in or posting etc, but don't delete anything",
|
|
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(), account.Disable)
|
|
},
|
|
}
|
|
config.AddAdminAccount(adminAccountDisableCmd)
|
|
adminAccountCmd.AddCommand(adminAccountDisableCmd)
|
|
|
|
adminAccountPasswordCmd := &cobra.Command{
|
|
Use: "password",
|
|
Short: "set a new password for the given local account",
|
|
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(), account.Password)
|
|
},
|
|
}
|
|
config.AddAdminAccount(adminAccountPasswordCmd)
|
|
config.AddAdminAccountPassword(adminAccountPasswordCmd)
|
|
adminAccountCmd.AddCommand(adminAccountPasswordCmd)
|
|
|
|
adminCmd.AddCommand(adminAccountCmd)
|
|
|
|
/*
|
|
ADMIN IMPORT/EXPORT COMMANDS
|
|
*/
|
|
|
|
adminExportCmd := &cobra.Command{
|
|
Use: "export",
|
|
Short: "export data from the database to file at the given path",
|
|
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(), trans.Export)
|
|
},
|
|
}
|
|
config.AddAdminTrans(adminExportCmd)
|
|
adminCmd.AddCommand(adminExportCmd)
|
|
|
|
adminImportCmd := &cobra.Command{
|
|
Use: "import",
|
|
Short: "import data from a file into the database",
|
|
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(), trans.Import)
|
|
},
|
|
}
|
|
config.AddAdminTrans(adminImportCmd)
|
|
adminCmd.AddCommand(adminImportCmd)
|
|
|
|
/*
|
|
ADMIN MEDIA COMMANDS
|
|
*/
|
|
|
|
adminMediaCmd := &cobra.Command{
|
|
Use: "media",
|
|
Short: "admin commands related to stored media / emojis",
|
|
}
|
|
|
|
/*
|
|
ADMIN MEDIA LIST COMMANDS
|
|
*/
|
|
|
|
adminMediaListLocalCmd := &cobra.Command{
|
|
Use: "list-local",
|
|
Short: "admin command to list media on local 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(), media.ListLocal)
|
|
},
|
|
}
|
|
|
|
adminMediaListRemoteCmd := &cobra.Command{
|
|
Use: "list-remote",
|
|
Short: "admin command to list remote media cached on this instance",
|
|
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(), media.ListRemote)
|
|
},
|
|
}
|
|
|
|
adminMediaCmd.AddCommand(adminMediaListLocalCmd, adminMediaListRemoteCmd)
|
|
|
|
/*
|
|
ADMIN MEDIA PRUNE COMMANDS
|
|
*/
|
|
adminMediaPruneCmd := &cobra.Command{
|
|
Use: "prune",
|
|
Short: "admin commands for pruning media from storage",
|
|
}
|
|
|
|
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)
|
|
|
|
adminMediaPruneRemoteCmd := &cobra.Command{
|
|
Use: "remote",
|
|
Short: "prune unused / stale media from storage, older than given number of days",
|
|
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.Remote)
|
|
},
|
|
}
|
|
config.AddAdminMediaPrune(adminMediaPruneRemoteCmd)
|
|
adminMediaPruneCmd.AddCommand(adminMediaPruneRemoteCmd)
|
|
|
|
adminMediaPruneAllCmd := &cobra.Command{
|
|
Use: "all",
|
|
Short: "perform all media and emoji prune / cleaning commands",
|
|
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.All)
|
|
},
|
|
}
|
|
config.AddAdminMediaPrune(adminMediaPruneAllCmd)
|
|
adminMediaPruneCmd.AddCommand(adminMediaPruneAllCmd)
|
|
|
|
adminMediaCmd.AddCommand(adminMediaPruneCmd)
|
|
|
|
adminCmd.AddCommand(adminMediaCmd)
|
|
|
|
return adminCmd
|
|
}
|