153 lines
3.6 KiB
Go
153 lines
3.6 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log/slog"
|
|
"os"
|
|
"time"
|
|
"vctp/db"
|
|
"vctp/internal/tasks"
|
|
utils "vctp/internal/utils"
|
|
"vctp/log"
|
|
"vctp/server"
|
|
"vctp/server/router"
|
|
|
|
"github.com/go-co-op/gocron/v2"
|
|
"github.com/joho/godotenv"
|
|
)
|
|
|
|
var (
|
|
bindDisableTls bool
|
|
sha1ver string // sha1 revision used to build the program
|
|
buildTime string // when the executable was built
|
|
cronFrequency time.Duration
|
|
)
|
|
|
|
func main() {
|
|
// Load data from environment file
|
|
envFilename := utils.GetFilePath(".env")
|
|
err := godotenv.Load(envFilename)
|
|
if err != nil {
|
|
panic("Error loading .env file")
|
|
}
|
|
|
|
logger := log.New(
|
|
log.GetLevel(),
|
|
log.GetOutput(),
|
|
)
|
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
|
|
// Configure database
|
|
database, err := db.New(logger, "./db.sqlite3")
|
|
if err != nil {
|
|
logger.Error("Failed to create database", "error", err)
|
|
os.Exit(1)
|
|
}
|
|
defer database.Close()
|
|
|
|
if err = db.Migrate(database); err != nil {
|
|
logger.Error("failed to migrate database", "error", err)
|
|
return
|
|
}
|
|
|
|
// Prepare the task scheduler
|
|
s, err := gocron.NewScheduler()
|
|
if err != nil {
|
|
logger.Error("failed to create scheduler", "error", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Pass useful information to the cron jobs
|
|
c := &tasks.CronTask{
|
|
Logger: logger,
|
|
Database: database,
|
|
}
|
|
|
|
// Determine bind IP
|
|
bindIP := os.Getenv("BIND_IP")
|
|
if bindIP == "" {
|
|
bindIP = utils.GetOutboundIP().String()
|
|
}
|
|
// Determine bind port
|
|
bindPort := os.Getenv("BIND_PORT")
|
|
if bindPort == "" {
|
|
bindPort = "9443"
|
|
}
|
|
bindAddress := fmt.Sprint(bindIP, ":", bindPort)
|
|
slog.Info("Will listen on address", "ip", bindIP, "port", bindPort)
|
|
|
|
// Determine bind disable TLS
|
|
bindDisableTlsEnv := os.Getenv("BIND_DISABLE_TLS")
|
|
if bindDisableTlsEnv == "true" {
|
|
bindDisableTls = true
|
|
}
|
|
|
|
// Get file names for TLS cert/key
|
|
tlsCertFilename := os.Getenv("TLS_CERT_FILE")
|
|
if tlsCertFilename != "" {
|
|
tlsCertFilename = utils.GetFilePath(tlsCertFilename)
|
|
} else {
|
|
tlsCertFilename = "./cert.pem"
|
|
}
|
|
|
|
tlsKeyFilename := os.Getenv("TLS_KEY_FILE")
|
|
if tlsKeyFilename != "" {
|
|
tlsKeyFilename = utils.GetFilePath(tlsKeyFilename)
|
|
} else {
|
|
tlsKeyFilename = "./privkey.pem"
|
|
}
|
|
|
|
// Generate certificate if required
|
|
if !(utils.FileExists(tlsCertFilename) && utils.FileExists(tlsKeyFilename)) {
|
|
slog.Warn("Specified TLS certificate or private key do not exist", "certificate", tlsCertFilename, "tls-key", tlsKeyFilename)
|
|
utils.GenerateCerts(tlsCertFilename, tlsKeyFilename)
|
|
}
|
|
|
|
cronFrequencyString := os.Getenv("VCENTER_POLLING_SECONDS")
|
|
if cronFrequencyString != "" {
|
|
cronFrequency, err = time.ParseDuration(cronFrequencyString)
|
|
if err != nil {
|
|
slog.Error("Can't convert VCENTER_POLLING_SECONDS value to time duration. Defaulting to 60s", "value", cronFrequencyString, "error", err)
|
|
cronFrequency = time.Second * 60
|
|
}
|
|
} else {
|
|
cronFrequency = time.Second * 60
|
|
}
|
|
logger.Debug("Setting VM polling cronjob frequency to", "frequency", cronFrequency)
|
|
|
|
// start background processing
|
|
startsAt := time.Now().Add(time.Second * 10)
|
|
job, err := s.NewJob(
|
|
gocron.DurationJob(cronFrequency),
|
|
gocron.NewTask(func() {
|
|
c.RunVmCheck(ctx, logger)
|
|
}), gocron.WithSingletonMode(gocron.LimitModeReschedule),
|
|
gocron.WithStartAt(gocron.WithStartDateTime(startsAt)),
|
|
)
|
|
if err != nil {
|
|
logger.Error("failed to start cron jobs", "error", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
slog.Debug("Created cron job", "job", job)
|
|
|
|
s.Start()
|
|
|
|
// Start server
|
|
svr := server.New(
|
|
logger,
|
|
s,
|
|
cancel,
|
|
bindAddress,
|
|
server.WithRouter(router.New(logger, database)),
|
|
)
|
|
|
|
svr.DisableTls(bindDisableTls)
|
|
svr.SetCertificate(tlsCertFilename)
|
|
svr.SetPrivateKey(tlsKeyFilename)
|
|
|
|
svr.StartAndWait()
|
|
}
|