|
|
|
/*
|
|
|
|
------------------------------------------------------------------------------------------------------------------------
|
|
|
|
####### main ####### Copyright (c) 2021 mls-361 #################################################### MIT License #######
|
|
|
|
------------------------------------------------------------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"os"
|
|
|
|
"os/signal"
|
|
|
|
"sync"
|
|
|
|
"syscall"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"forge.chapril.org/mls-361/application"
|
|
|
|
"forge.chapril.org/mls-361/errors"
|
|
|
|
|
|
|
|
"forge.chapril.org/armen/armen/internal/api"
|
|
|
|
"forge.chapril.org/armen/armen/internal/cmdline"
|
|
|
|
"forge.chapril.org/armen/armen/internal/components"
|
|
|
|
"forge.chapril.org/armen/armen/internal/config"
|
|
|
|
"forge.chapril.org/armen/armen/internal/crypto"
|
|
|
|
"forge.chapril.org/armen/armen/internal/demo"
|
|
|
|
"forge.chapril.org/armen/armen/internal/logger"
|
|
|
|
"forge.chapril.org/armen/armen/internal/model"
|
|
|
|
"forge.chapril.org/armen/armen/internal/router"
|
|
|
|
"forge.chapril.org/armen/armen/internal/server"
|
|
|
|
"forge.chapril.org/armen/armen/internal/storage"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
_version string
|
|
|
|
_builtAt string
|
|
|
|
)
|
|
|
|
|
|
|
|
func createComponents(app components.Application) (components.Logger, components.Server, error) {
|
|
|
|
config, err := config.Load(app)
|
|
|
|
if err != nil {
|
|
|
|
return nil, nil, errors.WithMessage(err, "config") /////////////////////////////////////////////////////////////
|
|
|
|
}
|
|
|
|
|
|
|
|
logger, err := logger.Build(app, config)
|
|
|
|
if err != nil {
|
|
|
|
return nil, nil, errors.WithMessage(err, "logger") /////////////////////////////////////////////////////////////
|
|
|
|
}
|
|
|
|
|
|
|
|
crypto, err := crypto.Build(app)
|
|
|
|
if err != nil {
|
|
|
|
return nil, nil, errors.WithMessage(err, "crypto") /////////////////////////////////////////////////////////////
|
|
|
|
}
|
|
|
|
|
|
|
|
storage, err := storage.Build(app, config, logger, crypto)
|
|
|
|
if err != nil {
|
|
|
|
return nil, nil, errors.WithMessage(err, "storage") ////////////////////////////////////////////////////////////
|
|
|
|
}
|
|
|
|
|
|
|
|
model, err := model.Build(logger, storage)
|
|
|
|
if err != nil {
|
|
|
|
return nil, nil, errors.WithMessage(err, "model") //////////////////////////////////////////////////////////////
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := demo.Build(app, logger, model); err != nil {
|
|
|
|
return nil, nil, errors.WithMessage(err, "demo") ///////////////////////////////////////////////////////////////
|
|
|
|
}
|
|
|
|
|
|
|
|
router := router.Build(logger)
|
|
|
|
|
|
|
|
server, err := server.Build(config, logger, router)
|
|
|
|
if err != nil {
|
|
|
|
return nil, nil, errors.WithMessage(err, "server") /////////////////////////////////////////////////////////////
|
|
|
|
}
|
|
|
|
|
|
|
|
api.Build(logger, router, model)
|
|
|
|
|
|
|
|
return logger, server, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func waitEnd(server components.Server) (*sync.WaitGroup, chan struct{}) {
|
|
|
|
endCh := make(chan struct{})
|
|
|
|
group := new(sync.WaitGroup)
|
|
|
|
|
|
|
|
group.Add(1)
|
|
|
|
|
|
|
|
go func() { //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|
|
|
defer group.Done()
|
|
|
|
defer server.Stop()
|
|
|
|
|
|
|
|
sigCh := make(chan os.Signal, 1)
|
|
|
|
defer close(sigCh)
|
|
|
|
|
|
|
|
signal.Notify(sigCh, os.Interrupt, syscall.SIGABRT, syscall.SIGQUIT, syscall.SIGTERM)
|
|
|
|
|
|
|
|
select {
|
|
|
|
case <-sigCh:
|
|
|
|
case <-endCh:
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
|
|
|
return group, endCh
|
|
|
|
}
|
|
|
|
|
|
|
|
func run() error {
|
|
|
|
app := application.New("armen", _version, _builtAt)
|
|
|
|
|
|
|
|
if end, err := cmdline.Parse(app); end || err != nil {
|
|
|
|
return app.OnError(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
logger, server, err := createComponents(app)
|
|
|
|
if err != nil {
|
|
|
|
return app.OnError(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
logger.Info( //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|
|
|
"BEGIN",
|
|
|
|
"id", app.ID(),
|
|
|
|
"name", app.Name(),
|
|
|
|
"version", app.Version(),
|
|
|
|
"builtAt", app.BuiltAt().Format("2006-01-02 15:04:05"),
|
|
|
|
"pid", os.Getpid(),
|
|
|
|
)
|
|
|
|
|
|
|
|
group, endCh := waitEnd(server)
|
|
|
|
|
|
|
|
demo.Start()
|
|
|
|
|
|
|
|
err = server.Start()
|
|
|
|
|
|
|
|
close(endCh)
|
|
|
|
|
|
|
|
demo.Stop()
|
|
|
|
|
|
|
|
group.Wait()
|
|
|
|
|
|
|
|
logger.Info( //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
|
|
|
"END",
|
|
|
|
"uptime", time.Since(app.StartedAt()).Round(time.Second).String(),
|
|
|
|
)
|
|
|
|
|
|
|
|
return app.OnError(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
if run() != nil {
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
######################################################################################################## @(°_°)@ #######
|
|
|
|
*/
|