2022-07-28 15:00:43 +00:00
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
2022-08-11 20:32:10 +00:00
|
|
|
|
"fmt"
|
2022-12-16 21:44:45 +00:00
|
|
|
|
"net/http"
|
|
|
|
|
"os"
|
|
|
|
|
"os/signal"
|
2023-01-20 13:14:17 +00:00
|
|
|
|
"syscall"
|
2023-08-15 21:33:53 +00:00
|
|
|
|
"time"
|
2023-01-20 13:14:17 +00:00
|
|
|
|
|
|
|
|
|
"github.com/gorilla/mux"
|
2023-08-15 21:33:53 +00:00
|
|
|
|
"github.com/twmb/franz-go/pkg/kgo"
|
2023-01-20 13:14:17 +00:00
|
|
|
|
"go.uber.org/zap"
|
|
|
|
|
"go.uber.org/zap/zapcore"
|
2024-12-16 09:17:48 +00:00
|
|
|
|
"gitea.pena/PenaSide/docxTemplater/amo"
|
|
|
|
|
"gitea.pena/PenaSide/docxTemplater/broker/tariff"
|
|
|
|
|
"gitea.pena/PenaSide/docxTemplater/dal"
|
|
|
|
|
"gitea.pena/PenaSide/docxTemplater/gdisk"
|
|
|
|
|
"gitea.pena/PenaSide/docxTemplater/handlers"
|
|
|
|
|
"gitea.pena/PenaSide/docxTemplater/middleware"
|
|
|
|
|
"gitea.pena/PenaSide/docxTemplater/privileges"
|
|
|
|
|
smtpclient "gitea.pena/PenaSide/docxTemplater/smtp-client"
|
|
|
|
|
"gitea.pena/PenaSide/docxTemplater/tools"
|
|
|
|
|
"gitea.pena/PenaSide/docxTemplater/worker"
|
|
|
|
|
"gitea.pena/PenaSide/docxTemplater/yadisk"
|
2022-07-28 15:00:43 +00:00
|
|
|
|
)
|
|
|
|
|
|
2022-08-11 20:32:10 +00:00
|
|
|
|
type Env struct {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
Domain string `env:"DOMAIN" default:"tempgen.pena.digital"`
|
|
|
|
|
LogFile string `env:"LOG_FILE" default:"./tmp/logs.log"`
|
|
|
|
|
MongoURL string `env:"MONGO_URL" default:"mongodb://mongo:30000/?replicaSet=penahub-rs"`
|
|
|
|
|
DBName string `env:"DB_NAME" default:"templategen"`
|
|
|
|
|
YaDiskClientID string `env:"YADISK_CLIENT_ID" default:"94482c181e5148c096ae6ad3b2a981ea"`
|
|
|
|
|
YaDiskClientSecret string `env:"YADISK_CLIENT_SECRET" default:"7dc4f541c3f64f4a9078e59d7494d222"`
|
|
|
|
|
GDiskCredentials string `env:"GDISK_CREDENTIALS" default:"./static/gdisk-credentials.json"`
|
|
|
|
|
AmoClientID string `env:"AMO_CLIENT_ID" default:"6c7f3fdb-cce7-4fb0-a8a3-640b695c8d00"`
|
2023-08-31 12:15:27 +00:00
|
|
|
|
AmoClientSecret string `env:"AMO_CLIENT_SECRET" default:"NF37okqvWJFk3ZA8enlzkMrRdOpfZeowDIHJl5RGGMiyoIOsLgPx8d6fLJXwyvYI"`
|
2023-08-15 21:33:53 +00:00
|
|
|
|
AmoRedirectUrn string `env:"AMO_REDIRECT_URN" default:"/settings/widgets/penagen/"`
|
2023-08-29 19:36:36 +00:00
|
|
|
|
TokenKey string `env:"TOKEN_KEY" default:"z1eRU{fq*VtfLAsz"`
|
2023-08-15 21:33:53 +00:00
|
|
|
|
KafkaTariff string `env:"KAFKA_TARIFF"`
|
|
|
|
|
KafkaBrokers []string `env:"KAFKA_BROKERS"`
|
|
|
|
|
KafkaTariffTopic string `env:"KAFKA_TARIFF_TOPIC"`
|
|
|
|
|
KafkaConsumerGroupID string `env:"KAFKA_CONSUMER_GROUP_ID"`
|
|
|
|
|
PrivilegesDomain string `env:"PRIVILEGES_DOMAIN"`
|
2023-09-22 20:16:04 +00:00
|
|
|
|
EmailHost string `env:"EMAIL_HOST"`
|
|
|
|
|
EmailPort string `env:"EMAIL_PORT"`
|
|
|
|
|
EmailSender string `env:"EMAIL_SENDER"`
|
|
|
|
|
EmailIdentity string `env:"EMAIL_IDENTITY"`
|
|
|
|
|
EmailUsername string `env:"EMAIL_USERNAME"`
|
|
|
|
|
EmailPassword string `env:"EMAIL_PASSWORD"`
|
2022-08-11 20:32:10 +00:00
|
|
|
|
}
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
|
|
|
|
func main() {
|
2022-09-15 13:53:55 +00:00
|
|
|
|
opts := GetOpts()
|
2022-07-28 15:00:43 +00:00
|
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
// Set tools/token
|
|
|
|
|
tools.SetToken(opts.TokenKey)
|
|
|
|
|
|
2022-07-28 15:00:43 +00:00
|
|
|
|
// Logger
|
|
|
|
|
cfgLogger := zap.NewDevelopmentConfig()
|
|
|
|
|
cfgLogger.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
|
2022-08-10 13:53:34 +00:00
|
|
|
|
cfgLogger.EncoderConfig.ConsoleSeparator = " "
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
|
|
|
|
logger, err := cfgLogger.Build()
|
|
|
|
|
|
2022-11-26 06:08:53 +00:00
|
|
|
|
logger.Info("OPTIONS", zap.Any("ENV", opts))
|
|
|
|
|
|
2022-07-28 15:00:43 +00:00
|
|
|
|
if err != nil {
|
|
|
|
|
panic(err)
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
err = privileges.PublishPrivileges(ctx, "https://admin.pena.digital/strator")
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("ErrorPublishPrivileges", zap.Error(err))
|
|
|
|
|
}
|
2023-05-14 18:27:13 +00:00
|
|
|
|
|
2022-07-28 15:00:43 +00:00
|
|
|
|
// Start Data Access Layer
|
|
|
|
|
|
2023-08-15 21:33:53 +00:00
|
|
|
|
mongoDal, err := dal.InitMongoDAL(ctx, opts.MongoURL, opts.DBName, logger)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
defer mongoDal.Disconnect()
|
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
logger.Error("ErrorConnectToDAL", zap.Error(err))
|
|
|
|
|
return
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Yandex Disk
|
2023-08-15 21:33:53 +00:00
|
|
|
|
yaDisk := yadisk.NewClientApp(
|
2022-08-11 20:32:10 +00:00
|
|
|
|
opts.YaDiskClientID,
|
|
|
|
|
opts.YaDiskClientSecret,
|
2022-09-15 13:53:55 +00:00
|
|
|
|
fmt.Sprintf("https://%v/yadisk", opts.Domain),
|
|
|
|
|
fmt.Sprintf("https://%v", opts.Domain),
|
|
|
|
|
)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
2022-08-11 20:32:10 +00:00
|
|
|
|
// Google Drive
|
2023-08-15 21:33:53 +00:00
|
|
|
|
gDisk, err := gdisk.NewClientApp(opts.GDiskCredentials)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
logger.Error("ErrorCreateGoogleDriveClientApp", zap.Error(err))
|
|
|
|
|
return
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Amo
|
|
|
|
|
amoApp := amo.NewClientApp(
|
2022-08-11 20:32:10 +00:00
|
|
|
|
opts.AmoClientID,
|
2022-09-15 13:53:55 +00:00
|
|
|
|
opts.AmoClientSecret,
|
2023-08-15 21:33:53 +00:00
|
|
|
|
fmt.Sprintf("https://%v/amo", opts.Domain),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Tariff
|
|
|
|
|
kafkaTariffClient, err := kgo.NewClient(
|
|
|
|
|
kgo.SeedBrokers(opts.KafkaBrokers...),
|
|
|
|
|
kgo.ConsumerGroup(opts.KafkaConsumerGroupID),
|
2023-11-19 22:11:03 +00:00
|
|
|
|
kgo.ConsumeResetOffset(kgo.NewOffset().AfterMilli(time.Now().UnixMilli())),
|
2023-08-15 21:33:53 +00:00
|
|
|
|
kgo.DefaultProduceTopic(opts.KafkaTariffTopic),
|
|
|
|
|
kgo.ConsumeTopics(opts.KafkaTariffTopic),
|
|
|
|
|
)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("ErrorCreateKafkaTariffClient", zap.Error(err))
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tariffConsumerDeps := tariff.ConsumerDeps{
|
|
|
|
|
Logger: logger,
|
|
|
|
|
Client: kafkaTariffClient,
|
|
|
|
|
}
|
|
|
|
|
tariffConsumer := tariff.NewConsumer(tariffConsumerDeps)
|
|
|
|
|
|
|
|
|
|
// Tariff worker
|
|
|
|
|
tariffWorkerDeps := worker.TariffWorkerDeps{
|
|
|
|
|
Logger: logger,
|
|
|
|
|
Dal: mongoDal,
|
|
|
|
|
TariffConsumer: tariffConsumer,
|
|
|
|
|
PrivilegesDomain: opts.PrivilegesDomain,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tariffWorker := worker.NewTariffWorker(tariffWorkerDeps)
|
|
|
|
|
|
|
|
|
|
go tariffWorker.Run(ctx)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
2023-09-22 20:16:04 +00:00
|
|
|
|
mailClient := smtpclient.NewClient(smtpclient.ClientDeps{
|
|
|
|
|
Host: opts.EmailHost,
|
|
|
|
|
Port: opts.EmailPort,
|
|
|
|
|
Sender: opts.EmailSender,
|
|
|
|
|
Auth: &smtpclient.PlainAuth{
|
|
|
|
|
Identity: opts.EmailIdentity,
|
|
|
|
|
Username: opts.EmailUsername,
|
|
|
|
|
Password: opts.EmailPassword,
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
|
2022-07-28 15:00:43 +00:00
|
|
|
|
// Handlers
|
2022-11-24 19:37:47 +00:00
|
|
|
|
h := handlers.NewHandlers(mongoDal, yaDisk, gDisk, amoApp, logger, &handlers.HandlerVars{
|
|
|
|
|
Domain: opts.Domain,
|
|
|
|
|
AmoRedirectUrn: opts.AmoRedirectUrn,
|
2023-09-22 20:16:04 +00:00
|
|
|
|
}, mailClient)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
2023-10-15 07:08:13 +00:00
|
|
|
|
outer := mux.NewRouter()
|
|
|
|
|
|
|
|
|
|
// Router free from amo middleware
|
|
|
|
|
f := outer.NewRoute().Subrouter()
|
|
|
|
|
f.HandleFunc("/generator/service", h.GeneratorService)
|
|
|
|
|
|
|
|
|
|
// Router with amo middleware
|
|
|
|
|
r := outer.NewRoute().Subrouter()
|
2023-08-15 21:33:53 +00:00
|
|
|
|
|
2022-07-28 15:00:43 +00:00
|
|
|
|
// Add Assets
|
|
|
|
|
|
2022-09-15 13:53:55 +00:00
|
|
|
|
r.PathPrefix("/tmp/generated/").Handler(http.StripPrefix("/tmp/generated/",
|
|
|
|
|
http.FileServer(http.Dir("tmp/generated"))))
|
2022-11-24 19:37:47 +00:00
|
|
|
|
|
|
|
|
|
r.PathPrefix("/tmp/downloaded/").Handler(http.StripPrefix("/tmp/downloaded/",
|
|
|
|
|
http.FileServer(http.Dir("tmp/downloaded"))))
|
|
|
|
|
|
2022-07-28 15:00:43 +00:00
|
|
|
|
r.PathPrefix("/.well-known/pki-validation/").Handler(http.StripPrefix("/.well-known/pki-validation/", http.FileServer(http.Dir(".well-known/pki-validation"))))
|
2022-08-10 13:53:34 +00:00
|
|
|
|
r.PathPrefix("/.well-known/acme-challenge/").Handler(http.StripPrefix("/.well-known/acme-challenge/",
|
|
|
|
|
http.FileServer(http.Dir(".well-known/acme-challenge"))))
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
2022-11-24 19:37:47 +00:00
|
|
|
|
r.PathPrefix("/static/examples/docx/").Handler(http.StripPrefix("/static/examples/docx/",
|
|
|
|
|
http.FileServer(http.Dir("/static/examples/docx/"))))
|
|
|
|
|
|
2022-08-11 20:32:10 +00:00
|
|
|
|
//# region ====== HANDLERS ======
|
2022-07-28 15:00:43 +00:00
|
|
|
|
r.NotFoundHandler = http.HandlerFunc(h.PageNotFound)
|
|
|
|
|
|
2022-08-10 13:53:34 +00:00
|
|
|
|
r.HandleFunc("/amo", h.AmoSaveToken)
|
2022-11-24 19:37:47 +00:00
|
|
|
|
r.HandleFunc("/amo/state", h.AmoState)
|
2022-08-22 04:23:47 +00:00
|
|
|
|
r.HandleFunc("/amo/access_rules", h.AmoAccessRules)
|
|
|
|
|
|
|
|
|
|
// Set rules for Amo end-points
|
|
|
|
|
amoAccess := map[string]string{
|
|
|
|
|
"/amo/webhook": "visibility",
|
|
|
|
|
"/amo/generateDoc": "creation",
|
|
|
|
|
}
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
r.HandleFunc("/yadisk", h.YaDiskSaveToken)
|
|
|
|
|
r.HandleFunc("/yadisk/setSettings", h.YaDiskSetSettings)
|
2022-09-15 13:53:55 +00:00
|
|
|
|
r.HandleFunc("/yadisk/getList", h.YaDiskGetList)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
r.HandleFunc("/yadisk/resources/get", h.YaDiskGetResources)
|
|
|
|
|
r.HandleFunc("/yadisk/resources/put", h.YaDiskPutResources)
|
|
|
|
|
r.HandleFunc("/yadisk/resources/delete", h.YaDiskDeleteResources)
|
2022-11-24 19:37:47 +00:00
|
|
|
|
r.HandleFunc("/yadisk/resources/upload", h.YaDiskUploadResources)
|
2023-01-20 13:14:17 +00:00
|
|
|
|
r.HandleFunc("/yadisk/resources/downloadlink", h.YaDiskDownloadLink)
|
2022-12-16 21:44:45 +00:00
|
|
|
|
r.HandleFunc("/yadisk/resources/download", h.YaDiskDownload)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
|
2022-11-12 10:24:48 +00:00
|
|
|
|
r.HandleFunc("/gdisk/getTemplateDir", h.GDiskGetDirTemplate) // устарело?
|
2022-10-11 10:07:29 +00:00
|
|
|
|
r.HandleFunc("/gdisk", h.GDiskSaveToken)
|
|
|
|
|
r.HandleFunc("/gdisk/setSettings", h.GDiskSetSettings)
|
2022-09-15 14:39:16 +00:00
|
|
|
|
r.HandleFunc("/gdisk/getList", h.GDiskGetList)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
2022-10-11 10:07:29 +00:00
|
|
|
|
r.HandleFunc("/gdisk/resources/get", h.GDiskGetResources)
|
|
|
|
|
r.HandleFunc("/gdisk/resources/put", h.GDiskPutResources)
|
|
|
|
|
r.HandleFunc("/gdisk/resources/delete", h.GDiskDeleteResources)
|
2022-11-24 19:37:47 +00:00
|
|
|
|
r.HandleFunc("/gdisk/resources/upload", h.GDiskUploadResources)
|
2022-10-11 10:07:29 +00:00
|
|
|
|
|
2023-04-03 18:27:15 +00:00
|
|
|
|
r.HandleFunc("/penadisk/setSettings", h.PenaDiskSetSettings)
|
|
|
|
|
r.HandleFunc("/penadisk/resources/get", h.PenaDiskGetResources)
|
|
|
|
|
r.HandleFunc("/penadisk/resources/put", h.PenaDiskPutResources)
|
|
|
|
|
r.HandleFunc("/penadisk/resources/delete", h.PenaDiskDeleteResources)
|
|
|
|
|
r.HandleFunc("/penadisk/resources/upload", h.PenaDiskUploadResources)
|
2023-04-18 12:56:05 +00:00
|
|
|
|
r.HandleFunc("/penadisk/resources/downloadlink", h.PenaDiskDownloadLink)
|
2023-04-03 18:27:15 +00:00
|
|
|
|
|
2022-11-12 10:24:48 +00:00
|
|
|
|
r.HandleFunc("/template/set", h.TemplateSet)
|
|
|
|
|
r.HandleFunc("/template/get", h.TemplateGet)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
r.HandleFunc("/template/getListByUser", h.TemplateGetListByUser)
|
2022-11-12 10:24:48 +00:00
|
|
|
|
r.HandleFunc("/template/getListByGroup", h.TemplateGetListByGroup)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
r.HandleFunc("/template/update", h.TemplateUpdate)
|
|
|
|
|
r.HandleFunc("/template/delete", h.TemplateDelete)
|
|
|
|
|
|
2022-11-12 10:24:48 +00:00
|
|
|
|
r.HandleFunc("/group/create", h.TemplateGroupCreate)
|
|
|
|
|
r.HandleFunc("/group/getList", h.TemplateGroupGetList)
|
|
|
|
|
r.HandleFunc("/group/edit", h.TemplateGroupEdit)
|
|
|
|
|
r.HandleFunc("/group/put", h.TemplateGroupPut)
|
|
|
|
|
r.HandleFunc("/group/remove", h.TemplateGroupRemove)
|
|
|
|
|
r.HandleFunc("/group/delete", h.TemplateGroupDelete)
|
|
|
|
|
r.HandleFunc("/group/{id}", h.TemplateGroupGet)
|
|
|
|
|
|
|
|
|
|
r.HandleFunc("/generator/byAmoLead", h.GeneratorByAmoLead)
|
|
|
|
|
r.HandleFunc("/generator/byData", h.GeneratorByData)
|
|
|
|
|
r.HandleFunc("/generator/byTemplate", h.GeneratorByData)
|
|
|
|
|
r.HandleFunc("/generator/byAmoWebhook", h.GeneratorByAmoWebhook)
|
2022-11-24 19:37:47 +00:00
|
|
|
|
r.HandleFunc("/generator/byamowebhook", h.GeneratorByAmoWebhook)
|
2022-11-12 10:24:48 +00:00
|
|
|
|
|
2022-12-19 12:01:38 +00:00
|
|
|
|
r.HandleFunc("/history/get", h.GetHistoryByID)
|
2023-01-13 13:31:06 +00:00
|
|
|
|
r.HandleFunc("/history/getList", h.GetHistoryList)
|
|
|
|
|
r.HandleFunc("/history/getlist", h.GetHistoryList)
|
2022-12-19 12:01:38 +00:00
|
|
|
|
|
2022-08-11 20:32:10 +00:00
|
|
|
|
//#endregion
|
|
|
|
|
|
2022-07-28 15:00:43 +00:00
|
|
|
|
// Middlewares
|
2022-08-22 04:23:47 +00:00
|
|
|
|
mw := middleware.InitMiddleware(mongoDal, amoApp, logger, amoAccess)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
|
|
|
|
|
r.Use(
|
2022-08-10 13:53:34 +00:00
|
|
|
|
mw.MiddlewareHeaders,
|
|
|
|
|
mw.MiddlewareCors,
|
|
|
|
|
mw.MiddlewareAmoJwt,
|
2022-07-28 15:00:43 +00:00
|
|
|
|
mw.Logger,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
r.NotFoundHandler = r.NewRoute().HandlerFunc(h.PageNotFound).GetHandler()
|
|
|
|
|
|
|
|
|
|
srv := http.Server{
|
2023-10-15 07:08:13 +00:00
|
|
|
|
Handler: outer,
|
2023-08-15 21:33:53 +00:00
|
|
|
|
ReadHeaderTimeout: time.Second * 3, // TODO: Обсудить со Skeris
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
|
err := srv.ListenAndServe()
|
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
logger.Error("CanNotServe", zap.Error(err))
|
|
|
|
|
return
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
2022-08-10 13:53:34 +00:00
|
|
|
|
// TLS
|
|
|
|
|
|
2022-08-22 04:23:47 +00:00
|
|
|
|
fullCert := fmt.Sprintf("./static/cert/%v/fullchain.pem", opts.Domain)
|
|
|
|
|
privCert := fmt.Sprintf("./static/cert/%v/privkey.pem", opts.Domain)
|
|
|
|
|
|
2022-07-28 15:00:43 +00:00
|
|
|
|
go func() {
|
2022-08-22 04:23:47 +00:00
|
|
|
|
err := srv.ListenAndServeTLS(fullCert, privCert)
|
2022-07-28 15:00:43 +00:00
|
|
|
|
if err != nil {
|
2023-08-15 21:33:53 +00:00
|
|
|
|
logger.Error("CanNotServe", zap.Error(err))
|
|
|
|
|
return
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
// Graceful Shutdown
|
|
|
|
|
interrupt := make(chan os.Signal, 1)
|
|
|
|
|
signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM)
|
|
|
|
|
killSignal := <-interrupt
|
|
|
|
|
switch killSignal {
|
|
|
|
|
case os.Interrupt:
|
2023-08-15 21:33:53 +00:00
|
|
|
|
logger.Error("AppInterrupted")
|
|
|
|
|
return
|
2022-07-28 15:00:43 +00:00
|
|
|
|
case syscall.SIGTERM:
|
2023-08-15 21:33:53 +00:00
|
|
|
|
logger.Error("AppTerminated")
|
|
|
|
|
return
|
2022-07-28 15:00:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
defer cancel()
|
|
|
|
|
}
|
2022-09-15 13:53:55 +00:00
|
|
|
|
|
|
|
|
|
func GetOpts() Env {
|
|
|
|
|
return getEnv(Env{})
|
|
|
|
|
}
|