package main import ( "context" "os" "os/signal" "syscall" "time" "github.com/mediocregopher/blog.mediocregopher.com/srv/cache" cfgpkg "github.com/mediocregopher/blog.mediocregopher.com/srv/cfg" "github.com/mediocregopher/blog.mediocregopher.com/srv/gmi" "github.com/mediocregopher/blog.mediocregopher.com/srv/http" "github.com/mediocregopher/blog.mediocregopher.com/srv/mailinglist" "github.com/mediocregopher/blog.mediocregopher.com/srv/post" "github.com/mediocregopher/blog.mediocregopher.com/srv/post/asset" "github.com/mediocregopher/blog.mediocregopher.com/srv/pow" "github.com/mediocregopher/mediocre-go-lib/v2/mctx" "github.com/mediocregopher/mediocre-go-lib/v2/mlog" "github.com/tilinna/clock" ) func main() { ctx := context.Background() cfg := cfgpkg.NewBlogCfg(cfgpkg.Params{}) var dataDir cfgpkg.DataDir dataDir.SetupCfg(cfg) defer dataDir.Close() ctx = mctx.WithAnnotator(ctx, &dataDir) var powMgrParams pow.ManagerParams powMgrParams.SetupCfg(cfg) ctx = mctx.WithAnnotator(ctx, &powMgrParams) var mailerParams mailinglist.MailerParams mailerParams.SetupCfg(cfg) ctx = mctx.WithAnnotator(ctx, &mailerParams) var mlParams mailinglist.Params mlParams.SetupCfg(cfg) ctx = mctx.WithAnnotator(ctx, &mlParams) var httpParams http.Params httpParams.SetupCfg(cfg) ctx = mctx.WithAnnotator(ctx, &httpParams) var gmiParams gmi.Params gmiParams.SetupCfg(cfg) ctx = mctx.WithAnnotator(ctx, &gmiParams) // initialization err := cfg.Init(ctx) logger := mlog.NewLogger(nil) defer logger.Close() logger.Info(ctx, "process started") defer logger.Info(ctx, "process exiting") if err != nil { logger.Fatal(ctx, "initializing", err) } clock := clock.Realtime() powStore := pow.NewMemoryStore(clock) defer powStore.Close() powMgrParams.Store = powStore powMgrParams.Clock = clock powMgr := pow.NewManager(powMgrParams) var mailer mailinglist.Mailer if mailerParams.SMTPAddr == "" { logger.Info(ctx, "-smtp-addr not given, using a fake Mailer") mailer = mailinglist.NewLogMailer(logger.WithNamespace("fake-mailer")) } else { mailer = mailinglist.NewMailer(mailerParams) } mlStore, err := mailinglist.NewStore(dataDir) if err != nil { logger.Fatal(ctx, "initializing mailing list storage", err) } defer mlStore.Close() mlParams.Store = mlStore mlParams.Mailer = mailer mlParams.Clock = clock ml := mailinglist.New(mlParams) postSQLDB, err := post.NewSQLDB(dataDir) if err != nil { logger.Fatal(ctx, "initializing sql db for post data", err) } defer postSQLDB.Close() postStore := post.NewStore(postSQLDB) postAssetStore := asset.NewStore(postSQLDB) postAssetLoader := asset.NewStoreLoader(postAssetStore) postAssetLoader = asset.NewArchiveLoader(postAssetLoader) postAssetLoader = asset.NewImageLoader(postAssetLoader) postDraftStore := post.NewDraftStore(postSQLDB) cache := cache.New(5000) httpParams.Logger = logger.WithNamespace("http") httpParams.Cache = cache httpParams.PowManager = powMgr httpParams.PostStore = postStore httpParams.PostAssetStore = postAssetStore httpParams.PostAssetLoader = postAssetLoader httpParams.PostDraftStore = postDraftStore httpParams.MailingList = ml httpParams.GeminiPublicURL = gmiParams.PublicURL logger.Info(ctx, "starting http api") httpAPI, err := http.New(httpParams) if err != nil { logger.Fatal(ctx, "starting http api", err) } defer func() { shutdownCtx, cancel := context.WithTimeout(ctx, 5*time.Second) defer cancel() if err := httpAPI.Shutdown(shutdownCtx); err != nil { logger.Fatal(ctx, "shutting down http api", err) } }() gmiParams.Logger = logger.WithNamespace("gmi") gmiParams.Cache = cache gmiParams.PostStore = postStore gmiParams.PostAssetLoader = postAssetLoader gmiParams.HTTPPublicURL = httpParams.PublicURL logger.Info(ctx, "starting gmi api") gmiAPI, err := gmi.New(gmiParams) if err != nil { logger.Fatal(ctx, "starting gmi api", err) } defer func() { shutdownCtx, cancel := context.WithTimeout(ctx, 5*time.Second) defer cancel() if err := gmiAPI.Shutdown(shutdownCtx); err != nil { logger.Fatal(ctx, "shutting down gmi api", err) } }() // wait sigCh := make(chan os.Signal, 1) signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM) <-sigCh // let the defers begin }