2021-02-28 15:17:18 +01:00
/ *
2021-03-01 15:41:43 +01:00
GoToSocial
Copyright ( C ) 2021 GoToSocial Authors admin @ gotosocial . org
2021-02-28 15:17:18 +01:00
2021-03-01 15:41:43 +01:00
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 .
2021-02-28 15:17:18 +01:00
2021-03-01 15:41:43 +01:00
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 .
2021-02-28 15:17:18 +01:00
2021-03-01 15:41:43 +01:00
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/>.
2021-02-28 15:17:18 +01:00
* /
2021-02-27 22:57:50 +01:00
package main
import (
2021-03-04 14:38:18 +01:00
"fmt"
2021-03-02 22:52:31 +01:00
"os"
"github.com/sirupsen/logrus"
2021-05-30 13:12:00 +02:00
"github.com/superseriousbusiness/gotosocial/internal/cliactions"
"github.com/superseriousbusiness/gotosocial/internal/cliactions/admin/account"
"github.com/superseriousbusiness/gotosocial/internal/cliactions/server"
2021-06-21 12:27:23 +02:00
"github.com/superseriousbusiness/gotosocial/internal/cliactions/testrig"
2021-04-01 20:46:45 +02:00
"github.com/superseriousbusiness/gotosocial/internal/config"
"github.com/superseriousbusiness/gotosocial/internal/log"
2021-03-03 11:28:28 +01:00
"github.com/urfave/cli/v2"
2021-02-27 22:57:50 +01:00
)
2021-06-28 12:17:20 +02:00
// Version is the software version of GtS being used
var Version string
// Commit is the git commit of GtS being used
var Commit string
2021-02-27 22:57:50 +01:00
func main ( ) {
2021-03-04 14:38:18 +01:00
flagNames := config . GetFlagNames ( )
envNames := config . GetEnvNames ( )
2021-04-19 19:42:19 +02:00
defaults := config . GetDefaults ( )
2021-03-03 11:28:28 +01:00
app := & cli . App {
2021-06-28 12:17:20 +02:00
Version : Version + " " + Commit [ : 7 ] ,
Usage : "a fediverse social media server" ,
2021-03-03 11:28:28 +01:00
Flags : [ ] cli . Flag {
2021-03-03 18:12:02 +01:00
// GENERAL FLAGS
2021-03-03 11:28:28 +01:00
& cli . StringFlag {
2021-03-03 18:12:02 +01:00
Name : flagNames . LogLevel ,
Usage : "Log level to run at: debug, info, warn, fatal" ,
2021-04-19 19:42:19 +02:00
Value : defaults . LogLevel ,
EnvVars : [ ] string { envNames . LogLevel } ,
2021-03-03 11:28:28 +01:00
} ,
& cli . StringFlag {
2021-03-03 18:12:02 +01:00
Name : flagNames . ApplicationName ,
Usage : "Name of the application, used in various places internally" ,
2021-04-19 19:42:19 +02:00
Value : defaults . ApplicationName ,
2021-03-03 18:12:02 +01:00
EnvVars : [ ] string { envNames . ApplicationName } ,
Hidden : true ,
} ,
2021-03-03 21:15:20 +01:00
& 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" ,
2021-04-19 19:42:19 +02:00
Value : defaults . ConfigPath ,
2021-03-03 21:15:20 +01:00
EnvVars : [ ] string { envNames . ConfigPath } ,
} ,
2021-03-22 22:26:54 +01:00
& cli . StringFlag {
Name : flagNames . Host ,
Usage : "Hostname to use for the server (eg., example.org, gotosocial.whatever.com)" ,
2021-04-19 19:42:19 +02:00
Value : defaults . Host ,
2021-03-22 22:26:54 +01:00
EnvVars : [ ] string { envNames . Host } ,
} ,
& cli . StringFlag {
Name : flagNames . Protocol ,
Usage : "Protocol to use for the REST api of the server (only use http for debugging and tests!)" ,
2021-04-19 19:42:19 +02:00
Value : defaults . Protocol ,
2021-03-22 22:26:54 +01:00
EnvVars : [ ] string { envNames . Protocol } ,
} ,
2021-03-03 18:12:02 +01:00
// DATABASE FLAGS
& cli . StringFlag {
Name : flagNames . DbType ,
Usage : "Database type: eg., postgres" ,
2021-04-19 19:42:19 +02:00
Value : defaults . DbType ,
2021-03-03 18:12:02 +01:00
EnvVars : [ ] string { envNames . DbType } ,
} ,
& cli . StringFlag {
Name : flagNames . DbAddress ,
Usage : "Database ipv4 address or hostname" ,
2021-04-19 19:42:19 +02:00
Value : defaults . DbAddress ,
2021-03-03 18:12:02 +01:00
EnvVars : [ ] string { envNames . DbAddress } ,
} ,
& cli . IntFlag {
Name : flagNames . DbPort ,
Usage : "Database port" ,
2021-04-19 19:42:19 +02:00
Value : defaults . DbPort ,
2021-03-03 18:12:02 +01:00
EnvVars : [ ] string { envNames . DbPort } ,
} ,
& cli . StringFlag {
Name : flagNames . DbUser ,
Usage : "Database username" ,
2021-04-19 19:42:19 +02:00
Value : defaults . DbUser ,
2021-03-03 18:12:02 +01:00
EnvVars : [ ] string { envNames . DbUser } ,
} ,
& cli . StringFlag {
2021-03-04 14:38:18 +01:00
Name : flagNames . DbPassword ,
Usage : "Database password" ,
2021-04-19 19:42:19 +02:00
Value : defaults . DbPassword ,
2021-03-04 14:38:18 +01:00
EnvVars : [ ] string { envNames . DbPassword } ,
2021-03-03 18:12:02 +01:00
} ,
& cli . StringFlag {
Name : flagNames . DbDatabase ,
Usage : "Database name" ,
2021-04-19 19:42:19 +02:00
Value : defaults . DbDatabase ,
2021-03-03 18:12:02 +01:00
EnvVars : [ ] string { envNames . DbDatabase } ,
2021-03-03 11:28:28 +01:00
} ,
2021-03-18 23:27:43 +01:00
// TEMPLATE FLAGS
& cli . StringFlag {
Name : flagNames . TemplateBaseDir ,
2021-04-01 20:46:45 +02:00
Usage : "Basedir for html templating files for rendering pages and composing emails." ,
2021-04-19 19:42:19 +02:00
Value : defaults . TemplateBaseDir ,
2021-03-18 23:27:43 +01:00
EnvVars : [ ] string { envNames . TemplateBaseDir } ,
} ,
2021-06-21 19:46:10 +02:00
& cli . StringFlag {
Name : flagNames . AssetBaseDir ,
Usage : "Directory to serve static assets from, accessible at example.com/assets/" ,
Value : defaults . AssetBaseDir ,
EnvVars : [ ] string { envNames . AssetBaseDir } ,
} ,
2021-04-01 20:46:45 +02:00
// ACCOUNTS FLAGS
& cli . BoolFlag {
Name : flagNames . AccountsOpenRegistration ,
Usage : "Allow anyone to submit an account signup request. If false, server will be invite-only." ,
2021-04-19 19:42:19 +02:00
Value : defaults . AccountsOpenRegistration ,
2021-04-01 20:46:45 +02:00
EnvVars : [ ] string { envNames . AccountsOpenRegistration } ,
} ,
& cli . BoolFlag {
2021-04-19 19:42:19 +02:00
Name : flagNames . AccountsApprovalRequired ,
2021-04-01 20:46:45 +02:00
Usage : "Do account signups require approval by an admin or moderator before user can log in? If false, new registrations will be automatically approved." ,
2021-04-19 19:42:19 +02:00
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 } ,
2021-04-01 20:46:45 +02:00
} ,
// MEDIA FLAGS
& cli . IntFlag {
Name : flagNames . MediaMaxImageSize ,
Usage : "Max size of accepted images in bytes" ,
2021-04-19 19:42:19 +02:00
Value : defaults . MediaMaxImageSize ,
2021-04-01 20:46:45 +02:00
EnvVars : [ ] string { envNames . MediaMaxImageSize } ,
} ,
& cli . IntFlag {
Name : flagNames . MediaMaxVideoSize ,
Usage : "Max size of accepted videos in bytes" ,
2021-04-19 19:42:19 +02:00
Value : defaults . MediaMaxVideoSize ,
2021-04-01 20:46:45 +02:00
EnvVars : [ ] string { envNames . MediaMaxVideoSize } ,
} ,
2021-04-19 19:42:19 +02:00
& 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 } ,
} ,
2021-04-01 20:46:45 +02:00
// STORAGE FLAGS
& cli . StringFlag {
Name : flagNames . StorageBackend ,
Usage : "Storage backend to use for media attachments" ,
2021-04-19 19:42:19 +02:00
Value : defaults . StorageBackend ,
2021-04-01 20:46:45 +02:00
EnvVars : [ ] string { envNames . StorageBackend } ,
} ,
& cli . StringFlag {
Name : flagNames . StorageBasePath ,
2021-04-19 19:42:19 +02:00
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 ,
2021-04-01 20:46:45 +02:00
EnvVars : [ ] string { envNames . StorageBasePath } ,
} ,
& cli . StringFlag {
Name : flagNames . StorageServeProtocol ,
Usage : "Protocol to use for serving media attachments (use https if storage is local)" ,
2021-04-19 19:42:19 +02:00
Value : defaults . StorageServeProtocol ,
2021-04-01 20:46:45 +02:00
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)" ,
2021-04-19 19:42:19 +02:00
Value : defaults . StorageServeHost ,
2021-04-01 20:46:45 +02:00
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)" ,
2021-04-19 19:42:19 +02:00
Value : defaults . StorageServeBasePath ,
2021-04-01 20:46:45 +02:00
EnvVars : [ ] string { envNames . StorageServeBasePath } ,
} ,
2021-04-19 19:42:19 +02:00
// 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 } ,
} ,
2021-05-09 11:25:13 +02:00
// 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 } ,
} ,
2021-03-03 11:28:28 +01:00
} ,
Commands : [ ] * cli . Command {
{
Name : "server" ,
Usage : "gotosocial server-related tasks" ,
Subcommands : [ ] * cli . Command {
{
2021-03-04 14:38:18 +01:00
Name : "start" ,
Usage : "start the gotosocial server" ,
Action : func ( c * cli . Context ) error {
2021-05-30 13:12:00 +02:00
return runAction ( c , server . Start )
2021-03-04 14:38:18 +01:00
} ,
} ,
} ,
} ,
2021-05-22 14:26:45 +02:00
{
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 {
2021-05-23 18:07:04 +02:00
Name : config . UsernameFlag ,
Usage : config . UsernameUsage ,
2021-05-22 14:26:45 +02:00
} ,
& cli . StringFlag {
2021-05-23 18:07:04 +02:00
Name : config . EmailFlag ,
Usage : config . EmailUsage ,
2021-05-22 14:26:45 +02:00
} ,
& cli . StringFlag {
2021-05-23 18:07:04 +02:00
Name : config . PasswordFlag ,
Usage : config . PasswordUsage ,
2021-05-22 14:26:45 +02:00
} ,
} ,
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 {
2021-05-23 18:07:04 +02:00
Name : config . UsernameFlag ,
Usage : config . UsernameUsage ,
2021-05-22 14:26:45 +02:00
} ,
} ,
Action : func ( c * cli . Context ) error {
return runAction ( c , account . Confirm )
} ,
} ,
{
Name : "promote" ,
Usage : "promote an account to admin" ,
Flags : [ ] cli . Flag {
& cli . StringFlag {
2021-05-23 18:07:04 +02:00
Name : config . UsernameFlag ,
Usage : config . UsernameUsage ,
2021-05-22 14:26:45 +02:00
} ,
} ,
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 {
2021-05-23 18:07:04 +02:00
Name : config . UsernameFlag ,
Usage : config . UsernameUsage ,
2021-05-22 14:26:45 +02:00
} ,
} ,
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 {
2021-05-23 18:07:04 +02:00
Name : config . UsernameFlag ,
Usage : config . UsernameUsage ,
2021-05-22 14:26:45 +02:00
} ,
} ,
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 {
2021-05-23 18:07:04 +02:00
Name : config . UsernameFlag ,
Usage : config . UsernameUsage ,
2021-05-22 14:26:45 +02:00
} ,
} ,
Action : func ( c * cli . Context ) error {
return runAction ( c , account . Suspend )
} ,
} ,
} ,
} ,
} ,
} ,
2021-04-19 19:42:19 +02:00
{
Name : "testrig" ,
Usage : "gotosocial testrig tasks" ,
Subcommands : [ ] * cli . Command {
{
Name : "start" ,
Usage : "start the gotosocial testrig" ,
Action : func ( c * cli . Context ) error {
2021-06-21 12:27:23 +02:00
return runAction ( c , testrig . Start )
2021-04-19 19:42:19 +02:00
} ,
} ,
} ,
} ,
2021-03-03 11:28:28 +01:00
} ,
2021-03-02 22:52:31 +01:00
}
2021-03-03 11:28:28 +01:00
err := app . Run ( os . Args )
if err != nil {
logrus . Fatal ( err )
2021-03-02 22:52:31 +01:00
}
2021-02-27 22:57:50 +01:00
}
2021-03-04 14:38:18 +01:00
// runAction builds up the config and logger necessary for any
// gotosocial action, and then executes the action.
2021-05-30 13:12:00 +02:00
func runAction ( c * cli . Context , a cliactions . GTSAction ) error {
2021-03-04 14:38:18 +01:00
// create a new *config.Config based on the config path provided...
2021-03-18 23:27:43 +01:00
conf , err := config . FromFile ( c . String ( config . GetFlagNames ( ) . ConfigPath ) )
2021-03-04 14:38:18 +01:00
if err != nil {
return fmt . Errorf ( "error creating config: %s" , err )
}
// ... and the flags set on the *cli.Context by urfave
2021-06-28 12:17:20 +02:00
if err := conf . ParseCLIFlags ( c , c . App . Version ) ; err != nil {
2021-05-22 14:26:45 +02:00
return fmt . Errorf ( "error parsing config: %s" , err )
}
2021-03-04 14:38:18 +01:00
// 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 )
}