mirror of
https://github.com/superseriousbusiness/gotosocial
synced 2025-06-05 21:59:39 +02:00
Implement Cobra CLI tooling, Viper config tooling (#336)
* start pulling out + replacing urfave and config * replace many many instances of config * move more stuff => viper * properly remove urfave * move some flags to root command * add testrig commands to root * alias config file keys * start adding cli parsing tests * reorder viper init * remove config path alias * fmt * change config file keys to non-nested * we're more or less in business now * tidy up the common func * go fmt * get tests passing again * add note about the cliparsing tests * reorganize * update docs with changes * structure cmd dir better * rename + move some files around * fix dangling comma
This commit is contained in:
@ -26,6 +26,7 @@ import (
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/spf13/viper"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/config"
|
||||
"github.com/superseriousbusiness/gotosocial/internal/db"
|
||||
"golang.org/x/crypto/acme/autocert"
|
||||
@ -58,7 +59,6 @@ type Router interface {
|
||||
type router struct {
|
||||
engine *gin.Engine
|
||||
srv *http.Server
|
||||
config *config.Config
|
||||
certManager *autocert.Manager
|
||||
}
|
||||
|
||||
@ -69,10 +69,16 @@ func (r *router) AttachStaticFS(relativePath string, fs http.FileSystem) {
|
||||
|
||||
// Start starts the router nicely. It will serve two handlers if letsencrypt is enabled, and only the web/API handler if letsencrypt is not enabled.
|
||||
func (r *router) Start() {
|
||||
if r.config.LetsEncryptConfig.Enabled {
|
||||
keys := config.Keys
|
||||
leEnabled := viper.GetBool(keys.LetsEncryptEnabled)
|
||||
|
||||
if leEnabled {
|
||||
bindAddress := viper.GetString(keys.BindAddress)
|
||||
lePort := viper.GetInt(keys.LetsEncryptPort)
|
||||
|
||||
// serve the http handler on the selected letsencrypt port, for receiving letsencrypt requests and solving their devious riddles
|
||||
go func() {
|
||||
listen := fmt.Sprintf("%s:%d", r.config.BindAddress, r.config.LetsEncryptConfig.Port)
|
||||
listen := fmt.Sprintf("%s:%d", bindAddress, lePort)
|
||||
if err := http.ListenAndServe(listen, r.certManager.HTTPHandler(http.HandlerFunc(httpsRedirect))); err != nil && err != http.ErrServerClosed {
|
||||
logrus.Fatalf("listen: %s", err)
|
||||
}
|
||||
@ -103,7 +109,9 @@ func (r *router) Stop(ctx context.Context) error {
|
||||
//
|
||||
// The given DB is only used in the New function for parsing config values, and is not otherwise
|
||||
// pinned to the router.
|
||||
func New(ctx context.Context, cfg *config.Config, db db.DB) (Router, error) {
|
||||
func New(ctx context.Context, db db.DB) (Router, error) {
|
||||
keys := config.Keys
|
||||
|
||||
gin.SetMode(gin.ReleaseMode)
|
||||
|
||||
// create the actual engine here -- this is the core request routing handler for gts
|
||||
@ -116,12 +124,13 @@ func New(ctx context.Context, cfg *config.Config, db db.DB) (Router, error) {
|
||||
engine.MaxMultipartMemory = 8 << 20
|
||||
|
||||
// set up IP forwarding via x-forward-* headers.
|
||||
if err := engine.SetTrustedProxies(cfg.TrustedProxies); err != nil {
|
||||
trustedProxies := viper.GetStringSlice(keys.TrustedProxies)
|
||||
if err := engine.SetTrustedProxies(trustedProxies); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// enable cors on the engine
|
||||
if err := useCors(cfg, engine); err != nil {
|
||||
if err := useCors(engine); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@ -129,17 +138,19 @@ func New(ctx context.Context, cfg *config.Config, db db.DB) (Router, error) {
|
||||
loadTemplateFunctions(engine)
|
||||
|
||||
// load templates onto the engine
|
||||
if err := loadTemplates(cfg, engine); err != nil {
|
||||
if err := loadTemplates(engine); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// enable session store middleware on the engine
|
||||
if err := useSession(ctx, cfg, db, engine); err != nil {
|
||||
if err := useSession(ctx, db, engine); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// create the http server here, passing the gin engine as handler
|
||||
listen := fmt.Sprintf("%s:%d", cfg.BindAddress, cfg.Port)
|
||||
bindAddress := viper.GetString(keys.BindAddress)
|
||||
port := viper.GetInt(keys.Port)
|
||||
listen := fmt.Sprintf("%s:%d", bindAddress, port)
|
||||
s := &http.Server{
|
||||
Addr: listen,
|
||||
Handler: engine,
|
||||
@ -151,15 +162,19 @@ func New(ctx context.Context, cfg *config.Config, db db.DB) (Router, error) {
|
||||
|
||||
// We need to spawn the underlying server slightly differently depending on whether lets encrypt is enabled or not.
|
||||
// In either case, the gin engine will still be used for routing requests.
|
||||
leEnabled := viper.GetBool(keys.LetsEncryptEnabled)
|
||||
|
||||
var m *autocert.Manager
|
||||
if cfg.LetsEncryptConfig.Enabled {
|
||||
if leEnabled {
|
||||
// le IS enabled, so roll up an autocert manager for handling letsencrypt requests
|
||||
host := viper.GetString(keys.Host)
|
||||
leCertDir := viper.GetString(keys.LetsEncryptCertDir)
|
||||
leEmailAddress := viper.GetString(keys.LetsEncryptEmailAddress)
|
||||
m = &autocert.Manager{
|
||||
Prompt: autocert.AcceptTOS,
|
||||
HostPolicy: autocert.HostWhitelist(cfg.Host),
|
||||
Cache: autocert.DirCache(cfg.LetsEncryptConfig.CertDir),
|
||||
Email: cfg.LetsEncryptConfig.EmailAddress,
|
||||
HostPolicy: autocert.HostWhitelist(host),
|
||||
Cache: autocert.DirCache(leCertDir),
|
||||
Email: leEmailAddress,
|
||||
}
|
||||
s.TLSConfig = m.TLSConfig()
|
||||
}
|
||||
@ -167,7 +182,6 @@ func New(ctx context.Context, cfg *config.Config, db db.DB) (Router, error) {
|
||||
return &router{
|
||||
engine: engine,
|
||||
srv: s,
|
||||
config: cfg,
|
||||
certManager: m,
|
||||
}, nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user