You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
177 lines
4.3 KiB
177 lines
4.3 KiB
package main
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/segmentio/encoding/json"
|
|
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
"github.com/prometheus/client_golang/prometheus/promhttp"
|
|
"github.com/spf13/viper"
|
|
"github.com/Cyclops-Labs/cyclops-4-hpc.git/extensions/lexis/restapi"
|
|
"github.com/Cyclops-Labs/cyclops-4-hpc.git/extensions/lexis/server/dbManager"
|
|
l "gitlab.com/cyclops-utilities/logging"
|
|
)
|
|
|
|
var (
|
|
cfg configuration
|
|
version string
|
|
service string
|
|
)
|
|
|
|
// dbStart handles the initialization of the dbManager returning a pointer to
|
|
// the DbParameter to be able to use the dbManager methods.
|
|
// Parameters:
|
|
// - models: variadic interface{} containing all the models that need to be
|
|
// migrated to the db.
|
|
// Returns:
|
|
// - DbParameter reference.
|
|
func dbStart(models ...interface{}) *dbManager.DbParameter {
|
|
|
|
connStr := "user=" + cfg.DB.Username + " password=" + cfg.DB.Password +
|
|
" dbname=" + cfg.DB.DbName + " sslmode=" + cfg.DB.SSLMode +
|
|
" host=" + cfg.DB.Host + " port=" + strconv.Itoa(cfg.DB.Port)
|
|
|
|
return dbManager.New(connStr, models...)
|
|
|
|
}
|
|
|
|
// getBasePath function is to get the base URL of the server.
|
|
// Returns:
|
|
// - String with the value of the base URL of the server.
|
|
func getBasePath() string {
|
|
|
|
type jsonBasePath struct {
|
|
BasePath string
|
|
}
|
|
|
|
bp := jsonBasePath{}
|
|
|
|
e := json.Unmarshal(restapi.SwaggerJSON, &bp)
|
|
|
|
if e != nil {
|
|
|
|
l.Warning.Printf("[MAIN] Unmarshalling of the basepath failed: %v\n", e)
|
|
|
|
}
|
|
|
|
return bp.BasePath
|
|
|
|
}
|
|
|
|
func init() {
|
|
|
|
confFile := flag.String("conf", "./config", "configuration file path (without toml extension)")
|
|
|
|
flag.Parse()
|
|
|
|
//placeholder code as the default value will ensure this situation will never arise
|
|
if len(*confFile) == 0 {
|
|
|
|
fmt.Printf("Usage: %v -conf=/path/to/configuration/file\n", strings.Title(service))
|
|
|
|
os.Exit(0)
|
|
|
|
}
|
|
|
|
// err := gcfg.ReadFileInto(&cfg, *confFile)
|
|
viper.SetConfigName(*confFile) // name of config file (without extension)
|
|
viper.SetConfigType("toml")
|
|
viper.AddConfigPath(".") // path to look for the config file in
|
|
|
|
err := viper.ReadInConfig() // Find and read the config file
|
|
|
|
if err != nil {
|
|
|
|
// TODO(murp) - differentiate between file not found and formatting error in
|
|
// config file)
|
|
fmt.Printf("[MAIN] Failed to parse configuration data: %v\nCorrect usage: %v -conf=/path/to/configuration/file\n", err, strings.Title(service))
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
cfg = parseConfig()
|
|
|
|
e := l.InitLogger(cfg.General.LogFile, cfg.General.LogLevel, cfg.General.LogToConsole)
|
|
|
|
if e != nil {
|
|
|
|
fmt.Printf("[MAIN] Initialization of the logger failed. Error: %v\n", e)
|
|
|
|
}
|
|
|
|
l.Info.Printf("Cyclops Labs %v Manager version %v initialized\n", strings.Title(service), version)
|
|
|
|
dumpConfig(cfg)
|
|
|
|
}
|
|
|
|
func main() {
|
|
|
|
//Getting the service handler and prometheus register
|
|
h, r, e := getService()
|
|
|
|
if e != nil {
|
|
|
|
log.Fatal(e)
|
|
|
|
}
|
|
|
|
if cfg.Prometheus.MetricsExport {
|
|
|
|
l.Info.Printf("[MAIN] Starting to serve Prometheus Metrics, access server on https://localhost:%v/%v\n", cfg.Prometheus.MetricsPort, cfg.Prometheus.MetricsRoute)
|
|
|
|
go func() {
|
|
|
|
http.Handle(cfg.Prometheus.MetricsRoute, promhttp.HandlerFor(r, promhttp.HandlerOpts{}))
|
|
|
|
log.Fatal(http.ListenAndServe(":"+cfg.Prometheus.MetricsPort, nil))
|
|
|
|
}()
|
|
|
|
}
|
|
|
|
serviceLocation := ":" + strconv.Itoa(cfg.General.ServerPort)
|
|
|
|
if cfg.General.HTTPSEnabled {
|
|
|
|
c := &tls.Config{
|
|
MinVersion: tls.VersionTLS12,
|
|
CurvePreferences: []tls.CurveID{tls.CurveP521, tls.CurveP384, tls.CurveP256},
|
|
PreferServerCipherSuites: true,
|
|
}
|
|
|
|
srv := &http.Server{
|
|
Addr: serviceLocation,
|
|
Handler: h,
|
|
TLSConfig: c,
|
|
TLSNextProto: make(map[string]func(*http.Server, *tls.Conn, http.Handler), 0),
|
|
}
|
|
|
|
l.Info.Printf("[MAIN] Starting to serve %v, access server on https://localhost%v\n", strings.Title(service), serviceLocation)
|
|
|
|
metricTime.With(prometheus.Labels{"type": "Service (HTTPS) start time"}).Set(float64(time.Now().Unix()))
|
|
|
|
log.Fatal(srv.ListenAndServeTLS(cfg.General.CertificateFile, cfg.General.CertificateKey))
|
|
|
|
} else {
|
|
|
|
l.Info.Printf("[MAIN] Starting to serve %v, access server on http://localhost%v\n", strings.Title(service), serviceLocation)
|
|
|
|
metricTime.With(prometheus.Labels{"type": "Service (HTTP) start time"}).Set(float64(time.Now().Unix()))
|
|
|
|
// Run the standard http server
|
|
log.Fatal(http.ListenAndServe(serviceLocation, h))
|
|
|
|
}
|
|
|
|
}
|
|
|