From 2e773d3c7eeebd32a5ff0fa5ace641b291efd0d5 Mon Sep 17 00:00:00 2001 From: ACoolName Date: Sat, 11 May 2024 16:52:23 +0300 Subject: [PATCH] updated code --- main.go | 2 ++ models/server.go | 10 +++++++ servers/servers.go | 71 +++++++++++++++++++++++++++++++++++----------- 3 files changed, 67 insertions(+), 16 deletions(-) diff --git a/main.go b/main.go index 66bb41a..9be482a 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,7 @@ import ( "acooldomain.co/backend/auth" "acooldomain.co/backend/dbhandler" + "acooldomain.co/backend/servers" "acooldomain.co/backend/users" "github.com/gin-gonic/gin" ) @@ -24,6 +25,7 @@ func main() { } users.LoadGroup(router.Group("/users"), client) auth.LoadGroup(router.Group("/auth"), client) + servers.LoadGroup(router.Group("/servers"), client) router.Run("localhost:8080") } diff --git a/models/server.go b/models/server.go index 1364dfd..cf76dab 100644 --- a/models/server.go +++ b/models/server.go @@ -17,6 +17,7 @@ type ServerInfo struct { Image ImageInfo On bool Nickname string + Ports []Port } type FileBrowserInfo struct { @@ -24,3 +25,12 @@ type FileBrowserInfo struct { OwnerId string ConnectedTo ServerInfo } + +type ServerData struct { + Id string + OwnerId string + Image string + VolumeId string + Nickname string + UserPermissions map[string]Permission +} diff --git a/servers/servers.go b/servers/servers.go index a90998b..6b64391 100644 --- a/servers/servers.go +++ b/servers/servers.go @@ -3,13 +3,17 @@ package servers import ( "context" "encoding/json" + "fmt" + "strings" - "acooldomain.co/backend/auth" "acooldomain.co/backend/models" + "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/volume" "github.com/docker/docker/client" "github.com/gin-gonic/gin" + "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" ) @@ -34,33 +38,67 @@ type ImageLabels struct { Type string `json:"type"` } -func (con Connection) GetServers(ctx *gin.Context) { - claims, ok := ctx.Get("claims") - if !ok { - ctx.AbortWithStatus(500) +func transformContainerPortsToModel(ports []types.Port) []models.Port { + modelPorts := make([]models.Port, len(ports)) + for index, port := range ports { + modelPorts[index] = models.Port{ + Number: int(port.PublicPort), + Protocol: port.Type, + } } + return modelPorts +} - containers, err := con.apiClient.ContainerList( +func (con Connection) GetServers(ctx *gin.Context) { + volumes, err := con.apiClient.VolumeList( context.TODO(), - container.ListOptions{ - All: true, - Filters: filters.NewArgs(filters.Arg("type", "GAME")), + volume.ListOptions{ + Filters: filters.NewArgs(filters.Arg("label", "type=GAME")), }, ) - var volumeLabels ContainerLabels + if err != nil { + ctx.AbortWithError(500, err) + } + var volumeLabels VolumeLabels var servers []models.ServerInfo - - for _, container := range containers { - jsonData, err := json.Marshal(container.Labels) + println("Found %d Containers", len(volumes.Volumes)) + for _, volume := range volumes.Volumes { + jsonData, err := json.Marshal(volume.Labels) if err != nil { continue } json.Unmarshal(jsonData, &volumeLabels) + + imageNameAndVersion := strings.Split(volumeLabels.ImageId, ":") + + imageName := imageNameAndVersion[0] + imageVersion := imageNameAndVersion[1] + containers, err := con.apiClient.ContainerList(context.Background(), container.ListOptions{ + All: true, + Filters: filters.NewArgs(filters.Arg("label", "type=GAME"), filters.Arg("label", fmt.Sprintf("volume_id=%s", volume.Name))), + }) + var state bool + var ports []models.Port + if err != nil || len(containers) == 0 { + state = false + ports = nil + } else { + container := containers[0] + state = container.State == "running" + ports = container.Ports + } + var serverData models.ServerData + con.connection.Database("backend").Collection("servers").FindOne(context.TODO(), bson.D{{Key: "volume_id", Value: volume.Name}}).Decode(&serverData) + servers = append(servers, models.ServerInfo{ - Id: container.ID, + Id: volume.Name, Image: models.ImageInfo{ - Name: container.Image + Name: imageName, + Version: imageVersion, }, + OwnerId: volumeLabels.OwnerId, + On: state, + Ports: ports, }) } @@ -68,6 +106,7 @@ func (con Connection) GetServers(ctx *gin.Context) { if err != nil { ctx.AbortWithError(500, err) } + ctx.JSON(200, servers) } @@ -79,5 +118,5 @@ func LoadGroup(group *gin.RouterGroup, mongo_client *mongo.Client) { defer apiClient.Close() connection := Connection{connection: mongo_client, apiClient: apiClient} - group.Use(auth.AuthorizedTo(0)).GET("/", connection.GetServers) + group.GET("/", connection.GetServers) }