Files
oneterm/backend/internal/api/api.go

118 lines
3.1 KiB
Go

package api
import (
"context"
"fmt"
"net/http"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
"github.com/veops/oneterm/internal/acl"
"github.com/veops/oneterm/internal/api/router"
"github.com/veops/oneterm/internal/model"
"github.com/veops/oneterm/internal/service"
fileservice "github.com/veops/oneterm/internal/service/file"
gsession "github.com/veops/oneterm/internal/session"
"github.com/veops/oneterm/pkg/config"
"github.com/veops/oneterm/pkg/db"
"github.com/veops/oneterm/pkg/logger"
)
var (
ctx, cancel = context.WithCancel(context.Background())
srv = &http.Server{}
)
func initDB() {
cfg := db.ConfigFromGlobal()
if err := db.Init(cfg, true,
model.DefaultAccount, model.DefaultAsset, model.DefaultAuthorization, model.DefaultAuthorizationV2,
model.DefaultCommand, model.DefaultCommandTemplate, model.DefaultConfig, model.DefaultFileHistory,
model.DefaultGateway, model.DefaultHistory, model.DefaultNode, model.DefaultPublicKey,
model.DefaultSession, model.DefaultSessionCmd, model.DefaultShare, model.DefaultQuickCommand,
model.DefaultUserPreference, model.DefaultStorageConfig, model.DefaultStorageMetrics,
model.DefaultTimeTemplate, model.DefaultMigrationRecord,
); err != nil {
logger.L().Fatal("Failed to init database", zap.Error(err))
}
if err := db.DropIndex(&model.Authorization{}, "asset_account_id_del"); err != nil {
logger.L().Fatal("Failed to drop index", zap.Error(err))
}
gsession.InitSessionCleanup()
}
func initServices() {
service.InitAuthorizationService()
fileservice.InitFileService()
// Initialize predefined dangerous commands and templates
if err := service.InitBuiltinCommands(); err != nil {
logger.L().Error("Failed to initialize builtin commands", zap.Error(err))
}
// Initialize built-in time templates
timeTemplateService := service.NewTimeTemplateService()
if err := timeTemplateService.InitializeBuiltInTemplates(ctx); err != nil {
logger.L().Error("Failed to initialize built-in time templates", zap.Error(err))
}
acl.MigrateNode()
acl.MigrateCommand()
}
func initStorage() error {
service.InitStorageService()
if service.DefaultStorageService == nil {
logger.L().Error("Storage service initialization failed")
return nil
}
logger.L().Info("Storage system initialization completed successfully")
// Initialize storage cleaner service
service.InitStorageCleanerService()
return nil
}
func RunApi() error {
initDB()
initServices()
// Initialize storage
if err := initStorage(); err != nil {
logger.L().Fatal("Failed to init storage", zap.Error(err))
}
r := gin.New()
router.SetupRouter(r)
srv.Addr = fmt.Sprintf("%s:%d", config.Cfg.Http.Host, config.Cfg.Http.Port)
srv.Handler = r
logger.L().Info("Starting HTTP server",
zap.String("address", srv.Addr))
err := srv.ListenAndServe()
if err != nil && err != http.ErrServerClosed {
logger.L().Fatal("Start HTTP server failed", zap.Error(err))
}
return err
}
func StopApi() {
defer cancel()
logger.L().Info("Stopping HTTP server")
if err := srv.Shutdown(ctx); err != nil {
logger.L().Error("Stop HTTP server failed", zap.Error(err))
}
}