package servers import ( "context" "encoding/json" "fmt" "acooldomain.co/backend/auth" "acooldomain.co/backend/models" "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/mongo" ) func (con Connection) getBrowserInfo(volume volume.Volume) (*models.FileBrowserInfo, error) { serverInfo, err := con.getServerInfo(volume) if err != nil { return nil, err } containers, err := con.dockerClient.ContainerList(context.TODO(), container.ListOptions{ All: true, Filters: filters.NewArgs(filters.Arg("label", "type=FILE_BROWSER"), filters.Arg("label", fmt.Sprintf("volume_id=%s", volume.Name))), }) if err != nil || len(containers) == 0 { return nil, nil } container := containers[0] jsonData, err := json.Marshal(container.Labels) if err != nil { return nil, err } var browserInfo ContainerLabels err = json.Unmarshal(jsonData, &browserInfo) if err != nil { return nil, err } return &models.FileBrowserInfo{ Id: container.ID, OwnerId: browserInfo.OwnerId, ConnectedTo: *serverInfo, Url: container.ID[:12] + "." + DOMAIN, }, nil } func (con Connection) GetBrowsers(ctx *gin.Context) { volumes, err := con.dockerClient.VolumeList( context.TODO(), volume.ListOptions{ Filters: filters.NewArgs(filters.Arg("label", "type=GAME")), }, ) if err != nil { ctx.AbortWithError(500, err) } var servers []models.FileBrowserInfo for _, volume := range volumes.Volumes { browserInfo, err := con.getBrowserInfo(*volume) if err != nil { ctx.AbortWithError(500, err) } if browserInfo == nil { continue } servers = append(servers, *browserInfo) } if err != nil { ctx.AbortWithError(500, err) } ctx.JSON(200, servers) } func (con Connection) StopBrowser(ctx *gin.Context) { serverId := ctx.Param("server_id") containersList, err := con.dockerClient.ContainerList(context.TODO(), container.ListOptions{ Filters: filters.NewArgs(filters.Arg("label", "volume_id="+serverId), filters.Arg("label", "type=FILE_BROWSER")), }) if err != nil { ctx.AbortWithError(500, err) return } if len(containersList) == 0 { ctx.Status(200) return } for _, containerData := range containersList { con.dockerClient.ContainerStop(context.TODO(), containerData.ID, container.StopOptions{}) } ctx.Status(200) } func LoadBrowsersGroup(group *gin.RouterGroup, mongo_client *mongo.Client, config models.GlobalConfig) { apiClient, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { panic(err) } defer apiClient.Close() connection := Connection{databaseConnection: mongo_client, dockerClient: apiClient} group.GET("/", auth.AuthorizedTo(0), connection.GetBrowsers) group.POST("/:server_id/stop", auth.AuthorizedTo(models.Browse, connection.serverAuthorized(models.Browse)), connection.StopBrowser) }