diff options
Diffstat (limited to 'internal')
-rw-r--r-- | internal/config/config.go | 18 | ||||
-rw-r--r-- | internal/consts/consts.go | 30 | ||||
-rw-r--r-- | internal/db/service.go | 15 | ||||
-rw-r--r-- | internal/server/server.go | 66 |
4 files changed, 93 insertions, 36 deletions
diff --git a/internal/config/config.go b/internal/config/config.go index 9b6935a7c..1f31eefd6 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -19,22 +19,24 @@ package config import ( - "encoding/json" "fmt" "os" "github.com/gotosocial/gotosocial/internal/db" + "gopkg.in/yaml.v2" ) // Config contains all the configuration needed to run gotosocial type Config struct { - DBConfig *db.Config `json:"db,omitempty"` + LogLevel string `yaml:"logLevel"` + ApplicationName string `yaml:"applicationName,omitempty"` + DBConfig *db.Config `yaml:"db,omitempty"` } // New returns a new config, or an error if something goes amiss. // The path parameter is optional, for loading a configuration json from the given path. func New(path string) (*Config, error) { - var config *Config + config := &Config{} if path != "" { var err error if config, err = loadFromFile(path); err != nil { @@ -45,7 +47,7 @@ func New(path string) (*Config, error) { return config, nil } -// loadFromFile takes a path to a .json file and attempts to load a Config object from it +// loadFromFile takes a path to a yaml file and attempts to load a Config object from it func loadFromFile(path string) (*Config, error) { bytes, err := os.ReadFile(path) if err != nil { @@ -53,16 +55,16 @@ func loadFromFile(path string) (*Config, error) { } config := &Config{} - if err := json.Unmarshal(bytes, config); err != nil { + if err := yaml.Unmarshal(bytes, config); err != nil { return nil, fmt.Errorf("could not unmarshal file at path %s: %s", path, err) } return config, nil } -// WithFlags returns a copy of this config object with flags set using the provided flags object -func (c *Config) WithFlags(f Flags) *Config { - return c +// ParseFlags sets flags on the config using the provided Flags object +func (c *Config) ParseFlags(f Flags) { + } // Flags is a wrapper for any type that can store keyed flags and give them back diff --git a/internal/consts/consts.go b/internal/consts/consts.go index 92c574a41..8a22e5825 100644 --- a/internal/consts/consts.go +++ b/internal/consts/consts.go @@ -20,11 +20,12 @@ // Don't judge me. package consts -// FlagNames is used for storing the names of the various flags used for +// Flags is used for storing the names of the various flags used for // initializing and storing urfavecli flag variables. -type FlagNames struct { +type Flags struct { LogLevel string ApplicationName string + ConfigPath string DbType string DbAddress string DbPort string @@ -35,38 +36,27 @@ type FlagNames struct { // GetFlagNames returns a struct containing the names of the various flags used for // initializing and storing urfavecli flag variables. -func GetFlagNames() FlagNames { - return FlagNames{ +func GetFlagNames() Flags { + return Flags{ LogLevel: "log-level", ApplicationName: "application-name", + ConfigPath: "config-path", DbType: "db-type", DbAddress: "db-address", DbPort: "db-port", - DbUser: "db-users", + DbUser: "db-user", DbPassword: "db-password", DbDatabase: "db-database", } } -// EnvNames is used for storing the environment variable keys used for -// initializing and storing urfavecli flag variables. -type EnvNames struct { - LogLevel string - ApplicationName string - DbType string - DbAddress string - DbPort string - DbUser string - DbPassword string - DbDatabase string -} - // GetEnvNames returns a struct containing the names of the environment variable keys used for // initializing and storing urfavecli flag variables. -func GetEnvNames() FlagNames { - return FlagNames{ +func GetEnvNames() Flags { + return Flags{ LogLevel: "GTS_LOG_LEVEL", ApplicationName: "GTS_APPLICATION_NAME", + ConfigPath: "GTS_CONFIG_PATH", DbType: "GTS_DB_TYPE", DbAddress: "GTS_DB_ADDRESS", DbPort: "GTS_DB_PORT", diff --git a/internal/db/service.go b/internal/db/service.go index 6c738606e..4449a984f 100644 --- a/internal/db/service.go +++ b/internal/db/service.go @@ -46,14 +46,13 @@ type Service interface { // Config provides configuration options for the database connection type Config struct { - Type string `json:"type,omitempty"` - Address string `json:"address,omitempty"` - Port int `json:"port,omitempty"` - User string `json:"user,omitempty"` - Password string `json:"password,omitempty"` - PasswordFile string `json:"passwordFile,omitempty"` - Database string `json:"database,omitempty"` - ApplicationName string `json:"applicationName,omitempty"` + Type string `yaml:"type,omitempty"` + Address string `yaml:"address,omitempty"` + Port int `yaml:"port,omitempty"` + User string `yaml:"user,omitempty"` + Password string `yaml:"password,omitempty"` + Database string `yaml:"database,omitempty"` + ApplicationName string `yaml:"applicationName,omitempty"` } // NewService returns a new database service that satisfies the Service interface and, by extension, diff --git a/internal/server/server.go b/internal/server/server.go new file mode 100644 index 000000000..6457f55dd --- /dev/null +++ b/internal/server/server.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 server + +import ( + "context" + "fmt" + "os" + "os/signal" + "syscall" + + "github.com/gotosocial/gotosocial/internal/config" + "github.com/gotosocial/gotosocial/internal/consts" + "github.com/gotosocial/gotosocial/internal/db" + "github.com/gotosocial/gotosocial/internal/log" + "github.com/urfave/cli/v2" +) + +// Run starts the gotosocial server +func Run(c *cli.Context) error { + log, err := log.New(c.String("log-level")) + if err != nil { + return fmt.Errorf("error creating logger: %s", err) + } + + gtsConfig, err := config.New(c.String(consts.GetFlagNames().ConfigPath)) + if err != nil { + return fmt.Errorf("error creating config: %s", err) + } + + ctx := context.Background() + dbService, err := db.NewService(ctx, gtsConfig.DBConfig, log) + if err != nil { + return fmt.Errorf("error creating dbservice: %s", err) + } + + // catch shutdown signals from the operating system + sigs := make(chan os.Signal, 1) + signal.Notify(sigs, os.Interrupt, syscall.SIGTERM) + sig := <-sigs + log.Infof("received signal %s, shutting down", sig) + + // close down all running services in order + if err := dbService.Stop(ctx); err != nil { + return fmt.Errorf("error closing dbservice: %s", err) + } + + log.Info("done! exiting...") + return nil +} |