115 lines
3.1 KiB
Go
115 lines
3.1 KiB
Go
package service
|
|
|
|
import (
|
|
"acc-server-manager/local/model"
|
|
"acc-server-manager/local/repository"
|
|
"acc-server-manager/local/utl/tracking"
|
|
"context"
|
|
"log"
|
|
"path/filepath"
|
|
"sync"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
type ServerService struct {
|
|
repository *repository.ServerRepository
|
|
apiService *ApiService
|
|
instances sync.Map
|
|
configService *ConfigService
|
|
}
|
|
|
|
func NewServerService(repository *repository.ServerRepository, apiService *ApiService, configService *ConfigService) *ServerService {
|
|
service := &ServerService{
|
|
repository: repository,
|
|
apiService: apiService,
|
|
configService: configService,
|
|
}
|
|
servers := repository.GetAll(context.Background())
|
|
for _, server := range *servers {
|
|
status, err := service.apiService.StatusServer(server.ServiceName)
|
|
if err != nil {
|
|
log.Print(err.Error())
|
|
}
|
|
if (status == string(model.StatusRunning)) {
|
|
service.StartAccServerRuntime(&server)
|
|
}
|
|
}
|
|
return service
|
|
}
|
|
|
|
func (s *ServerService) StartAccServerRuntime(server *model.Server) {
|
|
s.instances.Delete(server.ID)
|
|
instance := tracking.NewAccServerInstance(server, func(states ...tracking.StateChange) {
|
|
for _, state := range states {
|
|
log.Println(tracking.StateChanges[state])
|
|
}
|
|
})
|
|
config, _ := DecodeFileName(ConfigurationJson)(server.ConfigPath)
|
|
cfg := config.(model.Configuration)
|
|
event, _ := DecodeFileName(EventJson)(server.ConfigPath)
|
|
evt := event.(model.EventConfig)
|
|
|
|
instance.State.MaxConnections = cfg.MaxConnections.ToInt()
|
|
instance.State.Track = evt.Track
|
|
|
|
go tracking.TailLogFile(filepath.Join(server.ConfigPath, "\\server\\log\\server.log"), instance.HandleLogLine)
|
|
s.instances.Store(server.ID, instance)
|
|
}
|
|
|
|
// GetAll
|
|
// Gets All rows from Server table.
|
|
//
|
|
// Args:
|
|
// context.Context: Application context
|
|
// Returns:
|
|
// string: Application version
|
|
func (as ServerService) GetAll(ctx *fiber.Ctx) *[]model.Server {
|
|
servers := as.repository.GetAll(ctx.UserContext())
|
|
|
|
for i, server := range *servers {
|
|
status, err := as.apiService.StatusServer(server.ServiceName)
|
|
if err != nil {
|
|
log.Print(err.Error())
|
|
}
|
|
(*servers)[i].Status = model.ServiceStatus(status)
|
|
instance, ok := as.instances.Load(server.ID)
|
|
if !ok {
|
|
log.Print("Unable to retrieve instance for server of ID: ", server.ID)
|
|
} else {
|
|
serverInstance := instance.(*tracking.AccServerInstance)
|
|
if (serverInstance.State != nil) {
|
|
(*servers)[i].State = *serverInstance.State
|
|
}
|
|
}
|
|
}
|
|
|
|
return servers
|
|
}
|
|
|
|
// GetById
|
|
// Gets rows by ID from Server table.
|
|
//
|
|
// Args:
|
|
// context.Context: Application context
|
|
// Returns:
|
|
// string: Application version
|
|
func (as ServerService) GetById(ctx *fiber.Ctx, serverID int) *model.Server {
|
|
server := as.repository.GetFirst(ctx.UserContext(), serverID)
|
|
status, err := as.apiService.StatusServer(server.ServiceName)
|
|
if err != nil {
|
|
log.Print(err.Error())
|
|
}
|
|
server.Status = model.ServiceStatus(status)
|
|
instance, ok := as.instances.Load(server.ID)
|
|
if !ok {
|
|
log.Print("Unable to retrieve instance for server of ID: ", server.ID)
|
|
} else {
|
|
serverInstance := instance.(*tracking.AccServerInstance)
|
|
if (serverInstance.State != nil) {
|
|
server.State = *serverInstance.State
|
|
}
|
|
}
|
|
|
|
return server
|
|
} |