2020-02-01 16:54:19 +01:00
|
|
|
package serv
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2020-02-10 07:45:37 +01:00
|
|
|
"crypto/sha256"
|
2020-02-01 16:54:19 +01:00
|
|
|
"fmt"
|
|
|
|
"os"
|
2020-02-23 22:07:21 +01:00
|
|
|
"time"
|
2020-02-01 16:54:19 +01:00
|
|
|
|
|
|
|
"github.com/dosco/super-graph/allow"
|
2020-02-10 07:45:37 +01:00
|
|
|
"github.com/dosco/super-graph/crypto"
|
2020-02-01 16:54:19 +01:00
|
|
|
"github.com/jackc/pgx/v4"
|
|
|
|
"github.com/jackc/pgx/v4/pgxpool"
|
|
|
|
"github.com/rs/zerolog"
|
|
|
|
)
|
|
|
|
|
|
|
|
func initLog() {
|
|
|
|
out := zerolog.ConsoleWriter{Out: os.Stderr}
|
|
|
|
logger = zerolog.New(out).With().Timestamp().Logger()
|
|
|
|
errlog = logger.With().Caller().Logger()
|
|
|
|
}
|
|
|
|
|
|
|
|
func initConf() (*config, error) {
|
|
|
|
vi := newConfig(getConfigName())
|
|
|
|
|
|
|
|
if err := vi.ReadInConfig(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
inherits := vi.GetString("inherits")
|
|
|
|
if len(inherits) != 0 {
|
|
|
|
vi = newConfig(inherits)
|
|
|
|
|
|
|
|
if err := vi.ReadInConfig(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if vi.IsSet("inherits") {
|
|
|
|
errlog.Fatal().Msgf("inherited config (%s) cannot itself inherit (%s)",
|
|
|
|
inherits,
|
|
|
|
vi.GetString("inherits"))
|
|
|
|
}
|
|
|
|
|
|
|
|
vi.SetConfigName(getConfigName())
|
|
|
|
|
|
|
|
if err := vi.MergeInConfig(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
c := &config{}
|
|
|
|
|
|
|
|
if err := c.Init(vi); err != nil {
|
|
|
|
return nil, fmt.Errorf("unable to decode config, %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
logLevel, err := zerolog.ParseLevel(c.LogLevel)
|
|
|
|
if err != nil {
|
|
|
|
errlog.Error().Err(err).Msg("error setting log_level")
|
|
|
|
}
|
|
|
|
zerolog.SetGlobalLevel(logLevel)
|
|
|
|
|
|
|
|
return c, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func initDB(c *config, useDB bool) (*pgx.Conn, error) {
|
|
|
|
config, _ := pgx.ParseConfig("")
|
|
|
|
config.Host = c.DB.Host
|
|
|
|
config.Port = c.DB.Port
|
|
|
|
config.User = c.DB.User
|
|
|
|
config.Password = c.DB.Password
|
|
|
|
config.RuntimeParams = map[string]string{
|
|
|
|
"application_name": c.AppName,
|
|
|
|
"search_path": c.DB.Schema,
|
|
|
|
}
|
|
|
|
|
|
|
|
if useDB {
|
|
|
|
config.Database = c.DB.DBName
|
|
|
|
}
|
|
|
|
|
|
|
|
switch c.LogLevel {
|
|
|
|
case "debug":
|
|
|
|
config.LogLevel = pgx.LogLevelDebug
|
|
|
|
case "info":
|
|
|
|
config.LogLevel = pgx.LogLevelInfo
|
|
|
|
case "warn":
|
|
|
|
config.LogLevel = pgx.LogLevelWarn
|
|
|
|
case "error":
|
|
|
|
config.LogLevel = pgx.LogLevelError
|
|
|
|
default:
|
|
|
|
config.LogLevel = pgx.LogLevelNone
|
|
|
|
}
|
|
|
|
|
|
|
|
config.Logger = NewSQLLogger(logger)
|
|
|
|
|
|
|
|
db, err := pgx.ConnectConfig(context.Background(), config)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return db, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func initDBPool(c *config) (*pgxpool.Pool, error) {
|
|
|
|
config, _ := pgxpool.ParseConfig("")
|
|
|
|
config.ConnConfig.Host = c.DB.Host
|
|
|
|
config.ConnConfig.Port = c.DB.Port
|
|
|
|
config.ConnConfig.Database = c.DB.DBName
|
|
|
|
config.ConnConfig.User = c.DB.User
|
|
|
|
config.ConnConfig.Password = c.DB.Password
|
|
|
|
config.ConnConfig.RuntimeParams = map[string]string{
|
|
|
|
"application_name": c.AppName,
|
|
|
|
"search_path": c.DB.Schema,
|
|
|
|
}
|
|
|
|
|
|
|
|
switch c.LogLevel {
|
|
|
|
case "debug":
|
|
|
|
config.ConnConfig.LogLevel = pgx.LogLevelDebug
|
|
|
|
case "info":
|
|
|
|
config.ConnConfig.LogLevel = pgx.LogLevelInfo
|
|
|
|
case "warn":
|
|
|
|
config.ConnConfig.LogLevel = pgx.LogLevelWarn
|
|
|
|
case "error":
|
|
|
|
config.ConnConfig.LogLevel = pgx.LogLevelError
|
|
|
|
default:
|
|
|
|
config.ConnConfig.LogLevel = pgx.LogLevelNone
|
|
|
|
}
|
|
|
|
|
|
|
|
config.ConnConfig.Logger = NewSQLLogger(logger)
|
|
|
|
|
|
|
|
// if c.DB.MaxRetries != 0 {
|
|
|
|
// opt.MaxRetries = c.DB.MaxRetries
|
|
|
|
// }
|
|
|
|
|
|
|
|
if c.DB.PoolSize != 0 {
|
|
|
|
config.MaxConns = conf.DB.PoolSize
|
|
|
|
}
|
|
|
|
|
2020-02-23 22:07:21 +01:00
|
|
|
var db *pgxpool.Pool
|
|
|
|
var err error
|
|
|
|
|
|
|
|
for i := 1; i < 10; i++ {
|
|
|
|
db, err = pgxpool.ConnectConfig(context.Background(), config)
|
|
|
|
if err == nil {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
time.Sleep(time.Duration(i*100) * time.Millisecond)
|
|
|
|
}
|
|
|
|
|
2020-02-01 16:54:19 +01:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return db, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func initCompiler() {
|
|
|
|
var err error
|
|
|
|
|
|
|
|
qcompile, pcompile, err = initCompilers(conf)
|
|
|
|
if err != nil {
|
|
|
|
errlog.Fatal().Err(err).Msg("failed to initialize compilers")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func initAllowList(cpath string) {
|
|
|
|
var ac allow.Config
|
|
|
|
var err error
|
|
|
|
|
|
|
|
if !conf.Production {
|
|
|
|
ac = allow.Config{CreateIfNotExists: true, Persist: true}
|
|
|
|
}
|
|
|
|
|
|
|
|
allowList, err = allow.New(cpath, ac)
|
|
|
|
if err != nil {
|
|
|
|
errlog.Fatal().Err(err).Msg("failed to initialize allow list")
|
|
|
|
}
|
|
|
|
}
|
2020-02-10 07:45:37 +01:00
|
|
|
|
|
|
|
func initCrypto() {
|
|
|
|
if len(conf.SecretKey) != 0 {
|
|
|
|
secretKey = sha256.Sum256([]byte(conf.SecretKey))
|
|
|
|
conf.SecretKey = ""
|
|
|
|
internalKey = secretKey
|
|
|
|
|
|
|
|
} else {
|
|
|
|
internalKey = crypto.NewEncryptionKey()
|
|
|
|
}
|
|
|
|
}
|