diff options
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/gotosocial/accountsflags.go | 47 | ||||
-rw-r--r-- | cmd/gotosocial/admincommands.go | 128 | ||||
-rw-r--r-- | cmd/gotosocial/commands.go | 37 | ||||
-rw-r--r-- | cmd/gotosocial/databaseflags.go | 77 | ||||
-rw-r--r-- | cmd/gotosocial/flags.go | 48 | ||||
-rw-r--r-- | cmd/gotosocial/generalflags.go | 66 | ||||
-rw-r--r-- | cmd/gotosocial/letsencryptflags.go | 47 | ||||
-rw-r--r-- | cmd/gotosocial/main.go | 406 | ||||
-rw-r--r-- | cmd/gotosocial/mediaflags.go | 53 | ||||
-rw-r--r-- | cmd/gotosocial/oidcflags.go | 71 | ||||
-rw-r--r-- | cmd/gotosocial/runaction.go | 51 | ||||
-rw-r--r-- | cmd/gotosocial/servercommands.go | 42 | ||||
-rw-r--r-- | cmd/gotosocial/statusesflags.go | 59 | ||||
-rw-r--r-- | cmd/gotosocial/storageflags.go | 59 | ||||
-rw-r--r-- | cmd/gotosocial/templateflags.go | 41 | ||||
-rw-r--r-- | cmd/gotosocial/testrigcommands.go | 42 |
16 files changed, 879 insertions, 395 deletions
diff --git a/cmd/gotosocial/accountsflags.go b/cmd/gotosocial/accountsflags.go new file mode 100644 index 000000000..9f9be266d --- /dev/null +++ b/cmd/gotosocial/accountsflags.go @@ -0,0 +1,47 @@ +/* + GoToSocial + Copyright (C) 2021 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 main + +import ( + "github.com/superseriousbusiness/gotosocial/internal/config" + "github.com/urfave/cli/v2" +) + +func accountsFlags(flagNames, envNames config.Flags, defaults config.Defaults) []cli.Flag { + return []cli.Flag{ + &cli.BoolFlag{ + Name: flagNames.AccountsOpenRegistration, + Usage: "Allow anyone to submit an account signup request. If false, server will be invite-only.", + Value: defaults.AccountsOpenRegistration, + EnvVars: []string{envNames.AccountsOpenRegistration}, + }, + &cli.BoolFlag{ + Name: flagNames.AccountsApprovalRequired, + Usage: "Do account signups require approval by an admin or moderator before user can log in? If false, new registrations will be automatically approved.", + Value: defaults.AccountsRequireApproval, + EnvVars: []string{envNames.AccountsApprovalRequired}, + }, + &cli.BoolFlag{ + Name: flagNames.AccountsReasonRequired, + Usage: "Do new account signups require a reason to be submitted on registration?", + Value: defaults.AccountsReasonRequired, + EnvVars: []string{envNames.AccountsReasonRequired}, + }, + } +} diff --git a/cmd/gotosocial/admincommands.go b/cmd/gotosocial/admincommands.go new file mode 100644 index 000000000..6fb3651ef --- /dev/null +++ b/cmd/gotosocial/admincommands.go @@ -0,0 +1,128 @@ +/* + GoToSocial + Copyright (C) 2021 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 main + +import ( + "github.com/superseriousbusiness/gotosocial/internal/cliactions/admin/account" + "github.com/superseriousbusiness/gotosocial/internal/config" + "github.com/urfave/cli/v2" +) + +func adminCommands() []*cli.Command { + return []*cli.Command{ + { + Name: "admin", + Usage: "gotosocial admin-related tasks", + Subcommands: []*cli.Command{ + { + Name: "account", + Usage: "admin commands related to accounts", + Subcommands: []*cli.Command{ + { + Name: "create", + Usage: "create a new account", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: config.UsernameFlag, + Usage: config.UsernameUsage, + }, + &cli.StringFlag{ + Name: config.EmailFlag, + Usage: config.EmailUsage, + }, + &cli.StringFlag{ + Name: config.PasswordFlag, + Usage: config.PasswordUsage, + }, + }, + Action: func(c *cli.Context) error { + return runAction(c, account.Create) + }, + }, + { + Name: "confirm", + Usage: "confirm an existing account manually, thereby skipping email confirmation", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: config.UsernameFlag, + Usage: config.UsernameUsage, + }, + }, + Action: func(c *cli.Context) error { + return runAction(c, account.Confirm) + }, + }, + { + Name: "promote", + Usage: "promote an account to admin", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: config.UsernameFlag, + Usage: config.UsernameUsage, + }, + }, + Action: func(c *cli.Context) error { + return runAction(c, account.Promote) + }, + }, + { + Name: "demote", + Usage: "demote an account from admin to normal user", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: config.UsernameFlag, + Usage: config.UsernameUsage, + }, + }, + Action: func(c *cli.Context) error { + return runAction(c, account.Demote) + }, + }, + { + Name: "disable", + Usage: "prevent an account from signing in or posting etc, but don't delete anything", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: config.UsernameFlag, + Usage: config.UsernameUsage, + }, + }, + Action: func(c *cli.Context) error { + return runAction(c, account.Disable) + }, + }, + { + Name: "suspend", + Usage: "completely remove an account and all of its posts, media, etc", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: config.UsernameFlag, + Usage: config.UsernameUsage, + }, + }, + Action: func(c *cli.Context) error { + return runAction(c, account.Suspend) + }, + }, + }, + }, + }, + }, + } +} diff --git a/cmd/gotosocial/commands.go b/cmd/gotosocial/commands.go new file mode 100644 index 000000000..0c16d1fb5 --- /dev/null +++ b/cmd/gotosocial/commands.go @@ -0,0 +1,37 @@ +/* + GoToSocial + Copyright (C) 2021 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 main + +import ( + "github.com/urfave/cli/v2" +) + +func getCommands() []*cli.Command { + commands := []*cli.Command{} + commandSets := [][]*cli.Command{ + serverCommands(), + adminCommands(), + testrigCommands(), + } + for _, cs := range commandSets { + commands = append(commands, cs...) + } + + return commands +} diff --git a/cmd/gotosocial/databaseflags.go b/cmd/gotosocial/databaseflags.go new file mode 100644 index 000000000..7abe64f1b --- /dev/null +++ b/cmd/gotosocial/databaseflags.go @@ -0,0 +1,77 @@ +/* + GoToSocial + Copyright (C) 2021 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 main + +import ( + "github.com/superseriousbusiness/gotosocial/internal/config" + "github.com/urfave/cli/v2" +) + +func databaseFlags(flagNames, envNames config.Flags, defaults config.Defaults) []cli.Flag { + return []cli.Flag{ + &cli.StringFlag{ + Name: flagNames.DbType, + Usage: "Database type: eg., postgres", + Value: defaults.DbType, + EnvVars: []string{envNames.DbType}, + }, + &cli.StringFlag{ + Name: flagNames.DbAddress, + Usage: "Database ipv4 address or hostname", + Value: defaults.DbAddress, + EnvVars: []string{envNames.DbAddress}, + }, + &cli.IntFlag{ + Name: flagNames.DbPort, + Usage: "Database port", + Value: defaults.DbPort, + EnvVars: []string{envNames.DbPort}, + }, + &cli.StringFlag{ + Name: flagNames.DbUser, + Usage: "Database username", + Value: defaults.DbUser, + EnvVars: []string{envNames.DbUser}, + }, + &cli.StringFlag{ + Name: flagNames.DbPassword, + Usage: "Database password", + Value: defaults.DbPassword, + EnvVars: []string{envNames.DbPassword}, + }, + &cli.StringFlag{ + Name: flagNames.DbDatabase, + Usage: "Database name", + Value: defaults.DbDatabase, + EnvVars: []string{envNames.DbDatabase}, + }, + &cli.StringFlag{ + Name: flagNames.DbTLSMode, + Usage: "Database tls mode", + Value: defaults.DBTlsMode, + EnvVars: []string{envNames.DbTLSMode}, + }, + &cli.StringFlag{ + Name: flagNames.DbTLSCACert, + Usage: "Path to CA cert for db tls connection", + Value: defaults.DBTlsCACert, + EnvVars: []string{envNames.DbTLSCACert}, + }, + } +} diff --git a/cmd/gotosocial/flags.go b/cmd/gotosocial/flags.go new file mode 100644 index 000000000..355ec0b81 --- /dev/null +++ b/cmd/gotosocial/flags.go @@ -0,0 +1,48 @@ +/* + GoToSocial + Copyright (C) 2021 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 main + +import ( + "github.com/superseriousbusiness/gotosocial/internal/config" + "github.com/urfave/cli/v2" +) + +func getFlags() []cli.Flag { + flagNames := config.GetFlagNames() + envNames := config.GetEnvNames() + defaults := config.GetDefaults() + + flags := []cli.Flag{} + flagSets := [][]cli.Flag{ + generalFlags(flagNames, envNames, defaults), + databaseFlags(flagNames, envNames, defaults), + templateFlags(flagNames, envNames, defaults), + accountsFlags(flagNames, envNames, defaults), + mediaFlags(flagNames, envNames, defaults), + storageFlags(flagNames, envNames, defaults), + statusesFlags(flagNames, envNames, defaults), + letsEncryptFlags(flagNames, envNames, defaults), + oidcFlags(flagNames, envNames, defaults), + } + for _, fs := range flagSets { + flags = append(flags, fs...) + } + + return flags +} diff --git a/cmd/gotosocial/generalflags.go b/cmd/gotosocial/generalflags.go new file mode 100644 index 000000000..3b0b9806a --- /dev/null +++ b/cmd/gotosocial/generalflags.go @@ -0,0 +1,66 @@ +/* + GoToSocial + Copyright (C) 2021 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 main + +import ( + "github.com/superseriousbusiness/gotosocial/internal/config" + "github.com/urfave/cli/v2" +) + +func generalFlags(flagNames, envNames config.Flags, defaults config.Defaults) []cli.Flag { + return []cli.Flag{ + &cli.StringFlag{ + Name: flagNames.LogLevel, + Usage: "Log level to run at: debug, info, warn, fatal", + Value: defaults.LogLevel, + EnvVars: []string{envNames.LogLevel}, + }, + &cli.StringFlag{ + Name: flagNames.ApplicationName, + Usage: "Name of the application, used in various places internally", + Value: defaults.ApplicationName, + EnvVars: []string{envNames.ApplicationName}, + Hidden: true, + }, + &cli.StringFlag{ + Name: flagNames.ConfigPath, + Usage: "Path to a yaml file containing gotosocial configuration. Values set in this file will be overwritten by values set as env vars or arguments", + Value: defaults.ConfigPath, + EnvVars: []string{envNames.ConfigPath}, + }, + &cli.StringFlag{ + Name: flagNames.Host, + Usage: "Hostname to use for the server (eg., example.org, gotosocial.whatever.com). DO NOT change this on a server that's already run!", + Value: defaults.Host, + EnvVars: []string{envNames.Host}, + }, + &cli.StringFlag{ + Name: flagNames.AccountDomain, + Usage: "Domain to use in account names (eg., example.org, whatever.com). If not set, will default to the setting for host. DO NOT change this on a server that's already run!", + Value: defaults.AccountDomain, + EnvVars: []string{envNames.AccountDomain}, + }, + &cli.StringFlag{ + Name: flagNames.Protocol, + Usage: "Protocol to use for the REST api of the server (only use http for debugging and tests!)", + Value: defaults.Protocol, + EnvVars: []string{envNames.Protocol}, + }, + } +} diff --git a/cmd/gotosocial/letsencryptflags.go b/cmd/gotosocial/letsencryptflags.go new file mode 100644 index 000000000..03495fd11 --- /dev/null +++ b/cmd/gotosocial/letsencryptflags.go @@ -0,0 +1,47 @@ +/* + GoToSocial + Copyright (C) 2021 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 main + +import ( + "github.com/superseriousbusiness/gotosocial/internal/config" + "github.com/urfave/cli/v2" +) + +func letsEncryptFlags(flagNames, envNames config.Flags, defaults config.Defaults) []cli.Flag { + return []cli.Flag{ + &cli.BoolFlag{ + Name: flagNames.LetsEncryptEnabled, + Usage: "Enable letsencrypt TLS certs for this server. If set to true, then cert dir also needs to be set (or take the default).", + Value: defaults.LetsEncryptEnabled, + EnvVars: []string{envNames.LetsEncryptEnabled}, + }, + &cli.StringFlag{ + Name: flagNames.LetsEncryptCertDir, + Usage: "Directory to store acquired letsencrypt certificates.", + Value: defaults.LetsEncryptCertDir, + EnvVars: []string{envNames.LetsEncryptCertDir}, + }, + &cli.StringFlag{ + Name: flagNames.LetsEncryptEmailAddress, + Usage: "Email address to use when requesting letsencrypt certs. Will receive updates on cert expiry etc.", + Value: defaults.LetsEncryptEmailAddress, + EnvVars: []string{envNames.LetsEncryptEmailAddress}, + }, + } +} diff --git a/cmd/gotosocial/main.go b/cmd/gotosocial/main.go index e8bc793bd..c47a4dc9b 100644 --- a/cmd/gotosocial/main.go +++ b/cmd/gotosocial/main.go @@ -19,16 +19,9 @@ package main import ( - "fmt" "os" "github.com/sirupsen/logrus" - "github.com/superseriousbusiness/gotosocial/internal/cliactions" - "github.com/superseriousbusiness/gotosocial/internal/cliactions/admin/account" - "github.com/superseriousbusiness/gotosocial/internal/cliactions/server" - "github.com/superseriousbusiness/gotosocial/internal/cliactions/testrig" - "github.com/superseriousbusiness/gotosocial/internal/config" - "github.com/superseriousbusiness/gotosocial/internal/log" "github.com/urfave/cli/v2" ) @@ -40,372 +33,18 @@ var Version string var Commit string func main() { - flagNames := config.GetFlagNames() - envNames := config.GetEnvNames() - defaults := config.GetDefaults() - app := &cli.App{ - Version: Version + " " + Commit[:7], - Usage: "a fediverse social media server", - Flags: []cli.Flag{ - // GENERAL FLAGS - &cli.StringFlag{ - Name: flagNames.LogLevel, - Usage: "Log level to run at: debug, info, warn, fatal", - Value: defaults.LogLevel, - EnvVars: []string{envNames.LogLevel}, - }, - &cli.StringFlag{ - Name: flagNames.ApplicationName, - Usage: "Name of the application, used in various places internally", - Value: defaults.ApplicationName, - EnvVars: []string{envNames.ApplicationName}, - Hidden: true, - }, - &cli.StringFlag{ - Name: flagNames.ConfigPath, - Usage: "Path to a yaml file containing gotosocial configuration. Values set in this file will be overwritten by values set as env vars or arguments", - Value: defaults.ConfigPath, - EnvVars: []string{envNames.ConfigPath}, - }, - &cli.StringFlag{ - Name: flagNames.Host, - Usage: "Hostname to use for the server (eg., example.org, gotosocial.whatever.com). DO NOT change this on a server that's already run!", - Value: defaults.Host, - EnvVars: []string{envNames.Host}, - }, - &cli.StringFlag{ - Name: flagNames.AccountDomain, - Usage: "Domain to use in account names (eg., example.org, whatever.com). If not set, will default to the setting for host. DO NOT change this on a server that's already run!", - Value: defaults.AccountDomain, - EnvVars: []string{envNames.AccountDomain}, - }, - &cli.StringFlag{ - Name: flagNames.Protocol, - Usage: "Protocol to use for the REST api of the server (only use http for debugging and tests!)", - Value: defaults.Protocol, - EnvVars: []string{envNames.Protocol}, - }, - - // DATABASE FLAGS - &cli.StringFlag{ - Name: flagNames.DbType, - Usage: "Database type: eg., postgres", - Value: defaults.DbType, - EnvVars: []string{envNames.DbType}, - }, - &cli.StringFlag{ - Name: flagNames.DbAddress, - Usage: "Database ipv4 address or hostname", - Value: defaults.DbAddress, - EnvVars: []string{envNames.DbAddress}, - }, - &cli.IntFlag{ - Name: flagNames.DbPort, - Usage: "Database port", - Value: defaults.DbPort, - EnvVars: []string{envNames.DbPort}, - }, - &cli.StringFlag{ - Name: flagNames.DbUser, - Usage: "Database username", - Value: defaults.DbUser, - EnvVars: []string{envNames.DbUser}, - }, - &cli.StringFlag{ - Name: flagNames.DbPassword, - Usage: "Database password", - Value: defaults.DbPassword, - EnvVars: []string{envNames.DbPassword}, - }, - &cli.StringFlag{ - Name: flagNames.DbDatabase, - Usage: "Database name", - Value: defaults.DbDatabase, - EnvVars: []string{envNames.DbDatabase}, - }, - &cli.StringFlag{ - Name: flagNames.DbTLSMode, - Usage: "Database tls mode", - Value: defaults.DBTlsMode, - EnvVars: []string{envNames.DbTLSMode}, - }, - &cli.StringFlag{ - Name: flagNames.DbTLSCACert, - Usage: "Path to CA cert for db tls connection", - Value: defaults.DBTlsCACert, - EnvVars: []string{envNames.DbTLSCACert}, - }, - - // TEMPLATE FLAGS - &cli.StringFlag{ - Name: flagNames.TemplateBaseDir, - Usage: "Basedir for html templating files for rendering pages and composing emails.", - Value: defaults.TemplateBaseDir, - EnvVars: []string{envNames.TemplateBaseDir}, - }, - &cli.StringFlag{ - Name: flagNames.AssetBaseDir, - Usage: "Directory to serve static assets from, accessible at example.com/assets/", - Value: defaults.AssetBaseDir, - EnvVars: []string{envNames.AssetBaseDir}, - }, - - // ACCOUNTS FLAGS - &cli.BoolFlag{ - Name: flagNames.AccountsOpenRegistration, - Usage: "Allow anyone to submit an account signup request. If false, server will be invite-only.", - Value: defaults.AccountsOpenRegistration, - EnvVars: []string{envNames.AccountsOpenRegistration}, - }, - &cli.BoolFlag{ - Name: flagNames.AccountsApprovalRequired, - Usage: "Do account signups require approval by an admin or moderator before user can log in? If false, new registrations will be automatically approved.", - Value: defaults.AccountsRequireApproval, - EnvVars: []string{envNames.AccountsApprovalRequired}, - }, - &cli.BoolFlag{ - Name: flagNames.AccountsReasonRequired, - Usage: "Do new account signups require a reason to be submitted on registration?", - Value: defaults.AccountsReasonRequired, - EnvVars: []string{envNames.AccountsReasonRequired}, - }, - - // MEDIA FLAGS - &cli.IntFlag{ - Name: flagNames.MediaMaxImageSize, - Usage: "Max size of accepted images in bytes", - Value: defaults.MediaMaxImageSize, - EnvVars: []string{envNames.MediaMaxImageSize}, - }, - &cli.IntFlag{ - Name: flagNames.MediaMaxVideoSize, - Usage: "Max size of accepted videos in bytes", - Value: defaults.MediaMaxVideoSize, - EnvVars: []string{envNames.MediaMaxVideoSize}, - }, - &cli.IntFlag{ - Name: flagNames.MediaMinDescriptionChars, - Usage: "Min required chars for an image description", - Value: defaults.MediaMinDescriptionChars, - EnvVars: []string{envNames.MediaMinDescriptionChars}, - }, - &cli.IntFlag{ - Name: flagNames.MediaMaxDescriptionChars, - Usage: "Max permitted chars for an image description", - Value: defaults.MediaMaxDescriptionChars, - EnvVars: []string{envNames.MediaMaxDescriptionChars}, - }, - - // STORAGE FLAGS - &cli.StringFlag{ - Name: flagNames.StorageBackend, - Usage: "Storage backend to use for media attachments", - Value: defaults.StorageBackend, - EnvVars: []string{envNames.StorageBackend}, - }, - &cli.StringFlag{ - Name: flagNames.StorageBasePath, - Usage: "Full path to an already-created directory where gts should store/retrieve media files. Subfolders will be created within this dir.", - Value: defaults.StorageBasePath, - EnvVars: []string{envNames.StorageBasePath}, - }, - &cli.StringFlag{ - Name: flagNames.StorageServeProtocol, - Usage: "Protocol to use for serving media attachments (use https if storage is local)", - Value: defaults.StorageServeProtocol, - EnvVars: []string{envNames.StorageServeProtocol}, - }, - &cli.StringFlag{ - Name: flagNames.StorageServeHost, - Usage: "Hostname to serve media attachments from (use the same value as host if storage is local)", - Value: defaults.StorageServeHost, - EnvVars: []string{envNames.StorageServeHost}, - }, - &cli.StringFlag{ - Name: flagNames.StorageServeBasePath, - Usage: "Path to append to protocol and hostname to create the base path from which media files will be served (default will mostly be fine)", - Value: defaults.StorageServeBasePath, - EnvVars: []string{envNames.StorageServeBasePath}, - }, - - // STATUSES FLAGS - &cli.IntFlag{ - Name: flagNames.StatusesMaxChars, - Usage: "Max permitted characters for posted statuses", - Value: defaults.StatusesMaxChars, - EnvVars: []string{envNames.StatusesMaxChars}, - }, - &cli.IntFlag{ - Name: flagNames.StatusesCWMaxChars, - Usage: "Max permitted characters for content/spoiler warnings on statuses", - Value: defaults.StatusesCWMaxChars, - EnvVars: []string{envNames.StatusesCWMaxChars}, - }, - &cli.IntFlag{ - Name: flagNames.StatusesPollMaxOptions, - Usage: "Max amount of options permitted on a poll", - Value: defaults.StatusesPollMaxOptions, - EnvVars: []string{envNames.StatusesPollMaxOptions}, - }, - &cli.IntFlag{ - Name: flagNames.StatusesPollOptionMaxChars, - Usage: "Max amount of characters for a poll option", - Value: defaults.StatusesPollOptionMaxChars, - EnvVars: []string{envNames.StatusesPollOptionMaxChars}, - }, - &cli.IntFlag{ - Name: flagNames.StatusesMaxMediaFiles, - Usage: "Maximum number of media files/attachments per status", - Value: defaults.StatusesMaxMediaFiles, - EnvVars: []string{envNames.StatusesMaxMediaFiles}, - }, + var v string + if Commit == "" { + v = Version + } else { + v = Version + " " + Commit[:7] + } - // LETSENCRYPT FLAGS - &cli.BoolFlag{ - Name: flagNames.LetsEncryptEnabled, - Usage: "Enable letsencrypt TLS certs for this server. If set to true, then cert dir also needs to be set (or take the default).", - Value: defaults.LetsEncryptEnabled, - EnvVars: []string{envNames.LetsEncryptEnabled}, - }, - &cli.StringFlag{ - Name: flagNames.LetsEncryptCertDir, - Usage: "Directory to store acquired letsencrypt certificates.", - Value: defaults.LetsEncryptCertDir, - EnvVars: []string{envNames.LetsEncryptCertDir}, - }, - &cli.StringFlag{ - Name: flagNames.LetsEncryptEmailAddress, - Usage: "Email address to use when requesting letsencrypt certs. Will receive updates on cert expiry etc.", - Value: defaults.LetsEncryptEmailAddress, - EnvVars: []string{envNames.LetsEncryptEmailAddress}, - }, - }, - Commands: []*cli.Command{ - { - Name: "server", - Usage: "gotosocial server-related tasks", - Subcommands: []*cli.Command{ - { - Name: "start", - Usage: "start the gotosocial server", - Action: func(c *cli.Context) error { - return runAction(c, server.Start) - }, - }, - }, - }, - { - Name: "admin", - Usage: "gotosocial admin-related tasks", - Subcommands: []*cli.Command{ - { - Name: "account", - Usage: "admin commands related to accounts", - Subcommands: []*cli.Command{ - { - Name: "create", - Usage: "create a new account", - Flags: []cli.Flag{ - &cli.StringFlag{ - Name: config.UsernameFlag, - Usage: config.UsernameUsage, - }, - &cli.StringFlag{ - Name: config.EmailFlag, - Usage: config.EmailUsage, - }, - &cli.StringFlag{ - Name: config.PasswordFlag, - Usage: config.PasswordUsage, - }, - }, - Action: func(c *cli.Context) error { - return runAction(c, account.Create) - }, - }, - { - Name: "confirm", - Usage: "confirm an existing account manually, thereby skipping email confirmation", - Flags: []cli.Flag{ - &cli.StringFlag{ - Name: config.UsernameFlag, - Usage: config.UsernameUsage, - }, - }, - Action: func(c *cli.Context) error { - return runAction(c, account.Confirm) - }, - }, - { - Name: "promote", - Usage: "promote an account to admin", - Flags: []cli.Flag{ - &cli.StringFlag{ - Name: config.UsernameFlag, - Usage: config.UsernameUsage, - }, - }, - Action: func(c *cli.Context) error { - return runAction(c, account.Promote) - }, - }, - { - Name: "demote", - Usage: "demote an account from admin to normal user", - Flags: []cli.Flag{ - &cli.StringFlag{ - Name: config.UsernameFlag, - Usage: config.UsernameUsage, - }, - }, - Action: func(c *cli.Context) error { - return runAction(c, account.Demote) - }, - }, - { - Name: "disable", - Usage: "prevent an account from signing in or posting etc, but don't delete anything", - Flags: []cli.Flag{ - &cli.StringFlag{ - Name: config.UsernameFlag, - Usage: config.UsernameUsage, - }, - }, - Action: func(c *cli.Context) error { - return runAction(c, account.Disable) - }, - }, - { - Name: "suspend", - Usage: "completely remove an account and all of its posts, media, etc", - Flags: []cli.Flag{ - &cli.StringFlag{ - Name: config.UsernameFlag, - Usage: config.UsernameUsage, - }, - }, - Action: func(c *cli.Context) error { - return runAction(c, account.Suspend) - }, - }, - }, - }, - }, - }, - { - Name: "testrig", - Usage: "gotosocial testrig tasks", - Subcommands: []*cli.Command{ - { - Name: "start", - Usage: "start the gotosocial testrig", - Action: func(c *cli.Context) error { - return runAction(c, testrig.Start) - }, - }, - }, - }, - }, + app := &cli.App{ + Version: v, + Usage: "a fediverse social media server", + Flags: getFlags(), + Commands: getCommands(), } err := app.Run(os.Args) @@ -413,26 +52,3 @@ func main() { logrus.Fatal(err) } } - -// runAction builds up the config and logger necessary for any -// gotosocial action, and then executes the action. -func runAction(c *cli.Context, a cliactions.GTSAction) error { - - // create a new *config.Config based on the config path provided... - conf, err := config.FromFile(c.String(config.GetFlagNames().ConfigPath)) - if err != nil { - return fmt.Errorf("error creating config: %s", err) - } - // ... and the flags set on the *cli.Context by urfave - if err := conf.ParseCLIFlags(c, c.App.Version); err != nil { - return fmt.Errorf("error parsing config: %s", err) - } - - // create a logger with the log level, formatting, and output splitter already set - log, err := log.New(conf.LogLevel) - if err != nil { - return fmt.Errorf("error creating logger: %s", err) - } - - return a(c.Context, conf, log) -} diff --git a/cmd/gotosocial/mediaflags.go b/cmd/gotosocial/mediaflags.go new file mode 100644 index 000000000..abf009a89 --- /dev/null +++ b/cmd/gotosocial/mediaflags.go @@ -0,0 +1,53 @@ +/* + GoToSocial + Copyright (C) 2021 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 main + +import ( + "github.com/superseriousbusiness/gotosocial/internal/config" + "github.com/urfave/cli/v2" +) + +func mediaFlags(flagNames, envNames config.Flags, defaults config.Defaults) []cli.Flag { + return []cli.Flag{ + &cli.IntFlag{ + Name: flagNames.MediaMaxImageSize, + Usage: "Max size of accepted images in bytes", + Value: defaults.MediaMaxImageSize, + EnvVars: []string{envNames.MediaMaxImageSize}, + }, + &cli.IntFlag{ + Name: flagNames.MediaMaxVideoSize, + Usage: "Max size of accepted videos in bytes", + Value: defaults.MediaMaxVideoSize, + EnvVars: []string{envNames.MediaMaxVideoSize}, + }, + &cli.IntFlag{ + Name: flagNames.MediaMinDescriptionChars, + Usage: "Min required chars for an image description", + Value: defaults.MediaMinDescriptionChars, + EnvVars: []string{envNames.MediaMinDescriptionChars}, + }, + &cli.IntFlag{ + Name: flagNames.MediaMaxDescriptionChars, + Usage: "Max permitted chars for an image description", + Value: defaults.MediaMaxDescriptionChars, + EnvVars: []string{envNames.MediaMaxDescriptionChars}, + }, + } +} diff --git a/cmd/gotosocial/oidcflags.go b/cmd/gotosocial/oidcflags.go new file mode 100644 index 000000000..93b86b166 --- /dev/null +++ b/cmd/gotosocial/oidcflags.go @@ -0,0 +1,71 @@ +/* + GoToSocial + Copyright (C) 2021 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 main + +import ( + "github.com/superseriousbusiness/gotosocial/internal/config" + "github.com/urfave/cli/v2" +) + +func oidcFlags(flagNames, envNames config.Flags, defaults config.Defaults) []cli.Flag { + return []cli.Flag{ + &cli.BoolFlag{ + Name: flagNames.OIDCEnabled, + Usage: "Enabled OIDC authorization for this instance. If set to true, then the other OIDC flags must also be set.", + Value: defaults.OIDCEnabled, + EnvVars: []string{envNames.OIDCEnabled}, + }, + &cli.StringFlag{ + Name: flagNames.OIDCIdpName, + Usage: "Name of the OIDC identity provider. Will be shown to the user when logging in.", + Value: defaults.OIDCIdpName, + EnvVars: []string{envNames.OIDCIdpName}, + }, + &cli.BoolFlag{ + Name: flagNames.OIDCSkipVerification, + Usage: "Skip verification of tokens returned by the OIDC provider. Should only be set to 'true' for testing purposes, never in a production environment!", + Value: defaults.OIDCSkipVerification, + EnvVars: []string{envNames.OIDCSkipVerification}, + }, + &cli.StringFlag{ + Name: flagNames.OIDCIssuer, + Usage: "Address of the OIDC issuer. Should be the web address, including protocol, at which the issuer can be reached. Eg., 'https://example.org/auth'", + Value: defaults.OIDCIssuer, + EnvVars: []string{envNames.OIDCIssuer}, + }, + &cli.StringFlag{ + Name: flagNames.OIDCClientID, + Usage: "ClientID of GoToSocial, as registered with the OIDC provider.", + Value: defaults.OIDCClientID, + EnvVars: []string{envNames.OIDCClientID}, + }, + &cli.StringFlag{ + Name: flagNames.OIDCClientSecret, + Usage: "ClientSecret of GoToSocial, as registered with the OIDC provider.", + Value: defaults.OIDCClientSecret, + EnvVars: []string{envNames.OIDCClientSecret}, + }, + &cli.StringSliceFlag{ + Name: flagNames.OIDCScopes, + Usage: "ClientSecret of GoToSocial, as registered with the OIDC provider.", + Value: cli.NewStringSlice(defaults.OIDCScopes...), + EnvVars: []string{envNames.OIDCScopes}, + }, + } +} diff --git a/cmd/gotosocial/runaction.go b/cmd/gotosocial/runaction.go new file mode 100644 index 000000000..fc548d85f --- /dev/null +++ b/cmd/gotosocial/runaction.go @@ -0,0 +1,51 @@ +/* + GoToSocial + Copyright (C) 2021 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 main + +import ( + "fmt" + + "github.com/superseriousbusiness/gotosocial/internal/cliactions" + "github.com/superseriousbusiness/gotosocial/internal/config" + "github.com/superseriousbusiness/gotosocial/internal/log" + "github.com/urfave/cli/v2" +) + +// runAction builds up the config and logger necessary for any +// gotosocial action, and then executes the action. +func runAction(c *cli.Context, a cliactions.GTSAction) error { + + // create a new *config.Config based on the config path provided... + conf, err := config.FromFile(c.String(config.GetFlagNames().ConfigPath)) + if err != nil { + return fmt.Errorf("error creating config: %s", err) + } + // ... and the flags set on the *cli.Context by urfave + if err := conf.ParseCLIFlags(c, c.App.Version); err != nil { + return fmt.Errorf("error parsing config: %s", err) + } + + // create a logger with the log level, formatting, and output splitter already set + log, err := log.New(conf.LogLevel) + if err != nil { + return fmt.Errorf("error creating logger: %s", err) + } + + return a(c.Context, conf, log) +} diff --git a/cmd/gotosocial/servercommands.go b/cmd/gotosocial/servercommands.go new file mode 100644 index 000000000..7a1692b79 --- /dev/null +++ b/cmd/gotosocial/servercommands.go @@ -0,0 +1,42 @@ +/* + GoToSocial + Copyright (C) 2021 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 main + +import ( + "github.com/superseriousbusiness/gotosocial/internal/cliactions/server" + "github.com/urfave/cli/v2" +) + +func serverCommands() []*cli.Command { + return []*cli.Command{ + { + Name: "server", + Usage: "gotosocial server-related tasks", + Subcommands: []*cli.Command{ + { + Name: "start", + Usage: "start the gotosocial server", + Action: func(c *cli.Context) error { + return runAction(c, server.Start) + }, + }, + }, + }, + } +} diff --git a/cmd/gotosocial/statusesflags.go b/cmd/gotosocial/statusesflags.go new file mode 100644 index 000000000..af52dc0ae --- /dev/null +++ b/cmd/gotosocial/statusesflags.go @@ -0,0 +1,59 @@ +/* + GoToSocial + Copyright (C) 2021 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 main + +import ( + "github.com/superseriousbusiness/gotosocial/internal/config" + "github.com/urfave/cli/v2" +) + +func statusesFlags(flagNames, envNames config.Flags, defaults config.Defaults) []cli.Flag { + return []cli.Flag{ + &cli.IntFlag{ + Name: flagNames.StatusesMaxChars, + Usage: "Max permitted characters for posted statuses", + Value: defaults.StatusesMaxChars, + EnvVars: []string{envNames.StatusesMaxChars}, + }, + &cli.IntFlag{ + Name: flagNames.StatusesCWMaxChars, + Usage: "Max permitted characters for content/spoiler warnings on statuses", + Value: defaults.StatusesCWMaxChars, + EnvVars: []string{envNames.StatusesCWMaxChars}, + }, + &cli.IntFlag{ + Name: flagNames.StatusesPollMaxOptions, + Usage: "Max amount of options permitted on a poll", + Value: defaults.StatusesPollMaxOptions, + EnvVars: []string{envNames.StatusesPollMaxOptions}, + }, + &cli.IntFlag{ + Name: flagNames.StatusesPollOptionMaxChars, + Usage: "Max amount of characters for a poll option", + Value: defaults.StatusesPollOptionMaxChars, + EnvVars: []string{envNames.StatusesPollOptionMaxChars}, + }, + &cli.IntFlag{ + Name: flagNames.StatusesMaxMediaFiles, + Usage: "Maximum number of media files/attachments per status", + Value: defaults.StatusesMaxMediaFiles, + EnvVars: []string{envNames.StatusesMaxMediaFiles}, + }, + } +} diff --git a/cmd/gotosocial/storageflags.go b/cmd/gotosocial/storageflags.go new file mode 100644 index 000000000..326e1fae5 --- /dev/null +++ b/cmd/gotosocial/storageflags.go @@ -0,0 +1,59 @@ +/* + GoToSocial + Copyright (C) 2021 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 main + +import ( + "github.com/superseriousbusiness/gotosocial/internal/config" + "github.com/urfave/cli/v2" +) + +func storageFlags(flagNames, envNames config.Flags, defaults config.Defaults) []cli.Flag { + return []cli.Flag{ + &cli.StringFlag{ + Name: flagNames.StorageBackend, + Usage: "Storage backend to use for media attachments", + Value: defaults.StorageBackend, + EnvVars: []string{envNames.StorageBackend}, + }, + &cli.StringFlag{ + Name: flagNames.StorageBasePath, + Usage: "Full path to an already-created directory where gts should store/retrieve media files. Subfolders will be created within this dir.", + Value: defaults.StorageBasePath, + EnvVars: []string{envNames.StorageBasePath}, + }, + &cli.StringFlag{ + Name: flagNames.StorageServeProtocol, + Usage: "Protocol to use for serving media attachments (use https if storage is local)", + Value: defaults.StorageServeProtocol, + EnvVars: []string{envNames.StorageServeProtocol}, + }, + &cli.StringFlag{ + Name: flagNames.StorageServeHost, + Usage: "Hostname to serve media attachments from (use the same value as host if storage is local)", + Value: defaults.StorageServeHost, + EnvVars: []string{envNames.StorageServeHost}, + }, + &cli.StringFlag{ + Name: flagNames.StorageServeBasePath, + Usage: "Path to append to protocol and hostname to create the base path from which media files will be served (default will mostly be fine)", + Value: defaults.StorageServeBasePath, + EnvVars: []string{envNames.StorageServeBasePath}, + }, + } +} diff --git a/cmd/gotosocial/templateflags.go b/cmd/gotosocial/templateflags.go new file mode 100644 index 000000000..c7bf93bc0 --- /dev/null +++ b/cmd/gotosocial/templateflags.go @@ -0,0 +1,41 @@ +/* + GoToSocial + Copyright (C) 2021 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 main + +import ( + "github.com/superseriousbusiness/gotosocial/internal/config" + "github.com/urfave/cli/v2" +) + +func templateFlags(flagNames, envNames config.Flags, defaults config.Defaults) []cli.Flag { + return []cli.Flag{ + &cli.StringFlag{ + Name: flagNames.TemplateBaseDir, + Usage: "Basedir for html templating files for rendering pages and composing emails.", + Value: defaults.TemplateBaseDir, + EnvVars: []string{envNames.TemplateBaseDir}, + }, + &cli.StringFlag{ + Name: flagNames.AssetBaseDir, + Usage: "Directory to serve static assets from, accessible at example.com/assets/", + Value: defaults.AssetBaseDir, + EnvVars: []string{envNames.AssetBaseDir}, + }, + } +} diff --git a/cmd/gotosocial/testrigcommands.go b/cmd/gotosocial/testrigcommands.go new file mode 100644 index 000000000..9b9aa3806 --- /dev/null +++ b/cmd/gotosocial/testrigcommands.go @@ -0,0 +1,42 @@ +/* + GoToSocial + Copyright (C) 2021 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 main + +import ( + "github.com/superseriousbusiness/gotosocial/internal/cliactions/testrig" + "github.com/urfave/cli/v2" +) + +func testrigCommands() []*cli.Command { + return []*cli.Command{ + { + Name: "testrig", + Usage: "gotosocial testrig tasks", + Subcommands: []*cli.Command{ + { + Name: "start", + Usage: "start the gotosocial testrig", + Action: func(c *cli.Context) error { + return runAction(c, testrig.Start) + }, + }, + }, + }, + } +} |