14 changed files with 300 additions and 349 deletions
@ -0,0 +1,42 @@
|
||||
/* |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
####### components ####### Copyright (c) 2021 mls-361 ############################################## MIT License ####### |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
*/ |
||||
|
||||
package components |
||||
|
||||
import ( |
||||
"forge.chapril.org/mls-361/logger" |
||||
"forge.chapril.org/mls-361/uuid" |
||||
|
||||
"forge.chapril.org/armen/armen/internal/config/data" |
||||
) |
||||
|
||||
// Application AFAIRE.
|
||||
type Application interface { |
||||
ID() uuid.UUID |
||||
Name() string |
||||
LookupEnv(suffix string) (string, bool) |
||||
} |
||||
|
||||
// Config AFAIRE.
|
||||
type Config interface { |
||||
Logger() *data.Logger |
||||
Server() *data.Server |
||||
} |
||||
|
||||
// Logger AFAIRE.
|
||||
type Logger interface { |
||||
logger.Logger |
||||
} |
||||
|
||||
// Server AFAIRE.
|
||||
type Server interface { |
||||
Start() error |
||||
Stop() |
||||
} |
||||
|
||||
/* |
||||
######################################################################################################## @(°_°)@ ####### |
||||
*/ |
@ -1,55 +0,0 @@
|
||||
/* |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
####### config ####### Copyright (c) 2021 mls-361 ################################################## MIT License ####### |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
*/ |
||||
|
||||
package config |
||||
|
||||
// Data AFAIRE.
|
||||
type Data struct { |
||||
Logger *Logger `json:"logger"` |
||||
MongoDB *MongoDB `json:"mongodb"` |
||||
PostgreSQL *PostgreSQL `json:"postgresql"` |
||||
Engine *Engine `json:"engine"` |
||||
} |
||||
|
||||
func (d *Data) validate() (string, error) { |
||||
if d.Logger == nil { |
||||
d.Logger = defaultLogger() |
||||
} else if err := d.Logger.validate(); err != nil { |
||||
return "", err |
||||
} |
||||
|
||||
if d.Engine != nil { |
||||
if err := d.Engine.validate(); err != nil { |
||||
return "", err |
||||
} |
||||
|
||||
return "", nil |
||||
} |
||||
|
||||
if d.MongoDB != nil { |
||||
if err := d.MongoDB.validate(); err != nil { |
||||
return "", err |
||||
} |
||||
|
||||
return _sourceMongoDB, nil |
||||
} |
||||
|
||||
if d.PostgreSQL != nil { |
||||
if err := d.PostgreSQL.validate(); err != nil { |
||||
return "", err |
||||
} |
||||
|
||||
return _sourcePostgreSQL, nil |
||||
} |
||||
|
||||
d.Engine = defaultEngine() |
||||
|
||||
return "", nil |
||||
} |
||||
|
||||
/* |
||||
######################################################################################################## @(°_°)@ ####### |
||||
*/ |
@ -0,0 +1,40 @@
|
||||
/* |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
####### data ####### Copyright (c) 2021 mls-361 #################################################### MIT License ####### |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
*/ |
||||
|
||||
package data |
||||
|
||||
// Data AFAIRE.
|
||||
type Data struct { |
||||
Logger *Logger `json:"logger"` |
||||
Server *Server `json:"server"` |
||||
} |
||||
|
||||
// Default AFAIRE.
|
||||
func (d *Data) Default() { |
||||
d.Logger = defaultLogger() |
||||
d.Server = defaultServer() |
||||
} |
||||
|
||||
// Validate AFAIRE.
|
||||
func (d *Data) Validate() error { |
||||
if d.Logger == nil { |
||||
d.Logger = defaultLogger() |
||||
} else if err := d.Logger.validate(); err != nil { |
||||
return err |
||||
} |
||||
|
||||
if d.Server == nil { |
||||
d.Server = defaultServer() |
||||
} else if err := d.Server.validate(); err != nil { |
||||
return err |
||||
} |
||||
|
||||
return nil |
||||
} |
||||
|
||||
/* |
||||
######################################################################################################## @(°_°)@ ####### |
||||
*/ |
@ -1,10 +1,10 @@
|
||||
/* |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
####### config ####### Copyright (c) 2021 mls-361 ################################################## MIT License ####### |
||||
####### data ####### Copyright (c) 2021 mls-361 #################################################### MIT License ####### |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
*/ |
||||
|
||||
package config |
||||
package data |
||||
|
||||
const ( |
||||
_defaultLoggerLevel = "trace" |
@ -1,22 +1,27 @@
|
||||
/* |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
####### config ####### Copyright (c) 2021 mls-361 ################################################## MIT License ####### |
||||
####### data ####### Copyright (c) 2021 mls-361 #################################################### MIT License ####### |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
*/ |
||||
|
||||
package config |
||||
package data |
||||
|
||||
// Engine AFAIRE.
|
||||
type Engine struct { |
||||
Version string `json:"version"` |
||||
UseAfter string `json:"use_after"` |
||||
const ( |
||||
_defaultServerPort = 65535 |
||||
) |
||||
|
||||
// Server AFAIRE.
|
||||
type Server struct { |
||||
Port int `json:"port"` |
||||
} |
||||
|
||||
func defaultEngine() *Engine { |
||||
return &Engine{} |
||||
func defaultServer() *Server { |
||||
return &Server{ |
||||
Port: _defaultServerPort, |
||||
} |
||||
} |
||||
|
||||
func (e *Engine) validate() error { |
||||
func (s *Server) validate() error { |
||||
return nil |
||||
} |
||||
|
@ -0,0 +1,42 @@
|
||||
/* |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
####### json ####### Copyright (c) 2021 mls-361 #################################################### MIT License ####### |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
*/ |
||||
|
||||
package json |
||||
|
||||
import ( |
||||
"encoding/json" |
||||
"io/ioutil" |
||||
"path/filepath" |
||||
|
||||
"forge.chapril.org/armen/armen/internal/components" |
||||
) |
||||
|
||||
const ( |
||||
_defaultConfigDir = "/etc" |
||||
) |
||||
|
||||
// LoadConfig AFAIRE.
|
||||
func LoadConfig(app components.Application, destination interface{}) error { |
||||
file, ok := app.LookupEnv("CONFIG_FILE") |
||||
if !ok { |
||||
file = filepath.Join(_defaultConfigDir, app.Name(), app.Name()+".json") |
||||
} |
||||
|
||||
data, err := ioutil.ReadFile(file) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
|
||||
if err := json.Unmarshal(data, destination); err != nil { |
||||
return err |
||||
} |
||||
|
||||
return nil |
||||
} |
||||
|
||||
/* |
||||
######################################################################################################## @(°_°)@ ####### |
||||
*/ |
@ -1,19 +0,0 @@
|
||||
/* |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
####### config ####### Copyright (c) 2021 mls-361 ################################################## MIT License ####### |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
*/ |
||||
|
||||
package config |
||||
|
||||
// MongoDB AFAIRE.
|
||||
type MongoDB struct { |
||||
} |
||||
|
||||
func (m *MongoDB) validate() error { |
||||
return nil |
||||
} |
||||
|
||||
/* |
||||
######################################################################################################## @(°_°)@ ####### |
||||
*/ |
@ -1,19 +0,0 @@
|
||||
/* |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
####### config ####### Copyright (c) 2021 mls-361 ################################################## MIT License ####### |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
*/ |
||||
|
||||
package config |
||||
|
||||
// PostgreSQL AFAIRE.
|
||||
type PostgreSQL struct { |
||||
} |
||||
|
||||
func (p *PostgreSQL) validate() error { |
||||
return nil |
||||
} |
||||
|
||||
/* |
||||
######################################################################################################## @(°_°)@ ####### |
||||
*/ |
@ -1,90 +0,0 @@
|
||||
/* |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
####### engine ####### Copyright (c) 2021 mls-361 ################################################## MIT License ####### |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
*/ |
||||
|
||||
package engine |
||||
|
||||
import ( |
||||
"sync" |
||||
|
||||
"forge.chapril.org/armen/armen/internal/config" |
||||
"forge.chapril.org/mls-361/application" |
||||
"forge.chapril.org/mls-361/logger" |
||||
"forge.chapril.org/mls-361/uuid" |
||||
) |
||||
|
||||
// Engine AFAIRE. |
||||
type Engine struct { |
||||
app *application.Application |
||||
config *config.Config |
||||
configCh chan bool |
||||
stopCh chan struct{} |
||||
endCh chan error |
||||
swg sync.WaitGroup |
||||
logger logger.Logger |
||||
} |
||||
|
||||
// New AFAIRE. |
||||
func New(app *application.Application, config *config.Config) *Engine { |
||||
return &Engine{ |
||||
app: app, |
||||
config: config, |
||||
configCh: make(chan bool), |
||||
stopCh: make(chan struct{}), |
||||
endCh: make(chan error, 1), |
||||
} |
||||
} |
||||
|
||||
// ConfigHasChanged AFAIRE. |
||||
func (e *Engine) ConfigHasChanged() { |
||||
e.configCh <- true |
||||
} |
||||
|
||||
// EndCh AFAIRE. |
||||
func (e *Engine) EndCh() <-chan error { |
||||
return e.endCh |
||||
} |
||||
|
||||
// Wait AFAIRE. |
||||
func (e *Engine) Wait() { |
||||
e.swg.Wait() |
||||
} |
||||
|
||||
func (e *Engine) loop() { |
||||
loop: |
||||
for { |
||||
select { |
||||
case <-e.configCh: |
||||
case <-e.stopCh: |
||||
break loop |
||||
} |
||||
} |
||||
|
||||
e.endCh <- nil |
||||
} |
||||
|
||||
func (e *Engine) main(logger logger.Logger) { |
||||
defer e.swg.Done() |
||||
defer logger.Remove() |
||||
|
||||
e.logger = logger |
||||
|
||||
e.loop() |
||||
} |
||||
|
||||
// Start AFAIRE. |
||||
func (e *Engine) Start(logger logger.Logger) { |
||||
e.swg.Add(1) |
||||
go e.main(logger.NewLogger(uuid.New(), "engine")) //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
||||
} |
||||
|
||||
// Stop AFAIRE. |
||||
func (e *Engine) Stop() { |
||||
close(e.stopCh) |
||||
} |
||||
|
||||
/* |
||||
######################################################################################################## @(°_°)@ ####### |
||||
*/ |
@ -1,15 +1,19 @@
|
||||
/* |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
####### supervisor ####### Copyright (c) 2021 mls-361 ############################################## MIT License ####### |
||||
####### logger ####### Copyright (c) 2021 mls-361 ################################################## MIT License ####### |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
*/ |
||||
|
||||
package supervisor |
||||
package logger |
||||
|
||||
import "forge.chapril.org/mls-361/logger" |
||||
import ( |
||||
"forge.chapril.org/mls-361/logger" |
||||
|
||||
func (s *Supervisor) createLogger() (logger.Logger, error) { |
||||
app := s.app |
||||
"forge.chapril.org/armen/armen/internal/components" |
||||
) |
||||
|
||||
// AFAIRE.
|
||||
func Build(app components.Application, _ components.Config) (logger.Logger, error) { |
||||
return logger.New(app.ID(), app.Name(), "trace", logger.NewStderrOutput()) |
||||
} |
||||
|
@ -0,0 +1,39 @@
|
||||
/* |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
####### server ####### Copyright (c) 2021 mls-361 ################################################## MIT License ####### |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
*/ |
||||
|
||||
package server |
||||
|
||||
import ( |
||||
"forge.chapril.org/mls-361/logger" |
||||
|
||||
"forge.chapril.org/armen/armen/internal/components" |
||||
) |
||||
|
||||
type server struct { |
||||
} |
||||
|
||||
func newServer() *server { |
||||
return &server{} |
||||
} |
||||
|
||||
func Build(config components.Config, logger logger.Logger) (*server, error) { |
||||
cs := newServer() |
||||
|
||||
return cs, nil |
||||
} |
||||
|
||||
// Start AFAIRE.
|
||||
func (cs *server) Start() error { |
||||
return nil |
||||
} |
||||
|
||||
// Stop AFAIRE.
|
||||
func (cs *server) Stop() { |
||||
} |
||||
|
||||
/* |
||||
######################################################################################################## @(°_°)@ ####### |
||||
*/ |
@ -1,99 +0,0 @@
|
||||
/* |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
####### supervisor ####### Copyright (c) 2021 mls-361 ############################################## MIT License ####### |
||||
------------------------------------------------------------------------------------------------------------------------ |
||||
*/ |
||||
|
||||
package supervisor |
||||
|
||||
import ( |
||||
"os" |
||||
"time" |
||||
|
||||
"forge.chapril.org/mls-361/application" |
||||
"forge.chapril.org/mls-361/failure" |
||||
"forge.chapril.org/mls-361/logger" |
||||
|
||||
"forge.chapril.org/armen/armen/internal/config" |
||||
) |
||||
|
||||
// Supervisor AFAIRE.
|
||||
type Supervisor struct { |
||||
app *application.Application |
||||
config *config.Config |
||||
logger logger.Logger |
||||
} |
||||
|
||||
// New AFAIRE.
|
||||
func New(app *application.Application) *Supervisor { |
||||
return &Supervisor{ |
||||
app: app, |
||||
config: config.New(app), |
||||
} |
||||
} |
||||
|
||||
func (s *Supervisor) loadConfig() error { |
||||
complete, err := s.config.Load() |
||||
if err != nil { |
||||
return failure.Wrap(err, "unable to load configuration") ///////////////////////////////////////////////////////
|
||||
} |
||||
|
||||
if complete { |
||||
return nil |
||||
} |
||||
|
||||
if err := s.config.LoadFromSource(); err != nil { |
||||
return failure.Wrap(err, "impossible to load the entire configuration") ////////////////////////////////////////
|
||||
} |
||||
|
||||
return nil |
||||
} |
||||
|
||||
func (s *Supervisor) createComponents() error { |
||||
return nil |
||||
} |
||||
|
||||
func (s *Supervisor) loop() { |
||||
} |
||||
|
||||
// Run AFAIRE.
|
||||
func (s *Supervisor) Run() error { |
||||
if err := s.loadConfig(); err != nil { |
||||
return failure.Wrap(err, "unable to load configuration") ///////////////////////////////////////////////////////
|
||||
} |
||||
|
||||
logger, err := s.createLogger() |
||||
if err != nil { |
||||
return failure.Wrap(err, "impossible to create the logger") ////////////////////////////////////////////////////
|
||||
} |
||||
|
||||
app := s.app |
||||
|
||||
defer func() { |
||||
logger.Info("END", "uptime", time.Since(app.StartedAt()).Round(time.Second).String()) //::::::::::::::::::::::::
|
||||
logger.Remove() |
||||
}() |
||||
|
||||
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(), |
||||
) |
||||
|
||||
s.logger = logger |
||||
|
||||
if err := s.createComponents(); err != nil { |
||||
return failure.Wrap(err, "impossible to create the components") //::::::::::::::::::::::::::::::::::::::::::::::
|
||||
} |
||||
|
||||
s.loop() |
||||
|
||||
return nil |
||||
} |
||||
|
||||
/* |
||||
######################################################################################################## @(°_°)@ ####### |
||||
*/ |
Loading…
Reference in new issue