added stuff

This commit is contained in:
ACoolName 2024-05-21 21:59:38 +03:00
parent cbe0d7934b
commit a6a63805e4
4 changed files with 236 additions and 236 deletions

38
.vscode/launch.json vendored
View File

@ -1,20 +1,20 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceFolder}",
"env": {
"HOST_IP": "127.0.0.1",
"UPNP_PATH": "test.upnp",
"CONFIG_PATH": "config.json"
}
}
]
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceFolder}",
"env": {
"HOST_IP": "127.0.0.1",
"UPNP_PATH": "test.upnp",
"CONFIG_PATH": "config.json"
}
}
]
}

View File

@ -1,87 +1,87 @@
package mail
import (
"crypto/tls"
"fmt"
"net/mail"
"net/smtp"
"acooldomain.co/backend/models"
)
const EMAIL_SERVER_ENV_VAR = "EMAIL_SERVER"
const FROM_EMAIL_ENV_VAR = "FROM_EMAIL"
var auth *smtp.Auth
var mailConfig *models.EmailConfig
func InitializeClient(config models.EmailConfig) error {
simpleAuth := smtp.PlainAuth("", config.Username, config.Password, config.Server)
auth = &simpleAuth
mailConfig = &config
return nil
}
func SendMail(
recipient string,
subject string,
content string,
) error {
if auth == nil {
return fmt.Errorf("mail not initialized")
}
if mailConfig == nil {
return fmt.Errorf("mail not initialized")
}
from := mail.Address{Name: "", Address: mailConfig.FromEmail}
to := mail.Address{Name: "", Address: recipient}
headers := make(map[string]string)
headers["From"] = from.String()
headers["To"] = to.String()
headers["Subject"] = subject
message := ""
for k, v := range headers {
message += fmt.Sprintf("%s: %s\r\n", k, v)
}
message += "\r\n" + content
conn, err := tls.Dial("tcp", mailConfig.Server+":465", &tls.Config{ServerName: mailConfig.Server})
if err != nil {
return err
}
client, err := smtp.NewClient(conn, mailConfig.Server)
if err != nil {
return err
}
if err = client.Auth(*auth); err != nil {
return err
}
if err = client.Mail(mailConfig.FromEmail); err != nil {
return err
}
if err = client.Rcpt(recipient); err != nil {
return err
}
writer, err := client.Data()
if err != nil {
return err
}
_, err = writer.Write([]byte(message))
if err != nil {
return err
}
if err = writer.Close(); err != nil {
return err
}
return client.Quit()
}
package mail
import (
"crypto/tls"
"fmt"
"net/mail"
"net/smtp"
"acooldomain.co/backend/models"
)
const EMAIL_SERVER_ENV_VAR = "EMAIL_SERVER"
const FROM_EMAIL_ENV_VAR = "FROM_EMAIL"
var auth *smtp.Auth
var mailConfig *models.EmailConfig
func InitializeClient(config models.EmailConfig) error {
simpleAuth := smtp.PlainAuth("", config.Username, config.Password, config.Server)
auth = &simpleAuth
mailConfig = &config
return nil
}
func SendMail(
recipient string,
subject string,
content string,
) error {
if auth == nil {
return fmt.Errorf("mail not initialized")
}
if mailConfig == nil {
return fmt.Errorf("mail not initialized")
}
from := mail.Address{Name: "", Address: mailConfig.FromEmail}
to := mail.Address{Name: "", Address: recipient}
headers := make(map[string]string)
headers["From"] = from.String()
headers["To"] = to.String()
headers["Subject"] = subject
message := ""
for k, v := range headers {
message += fmt.Sprintf("%s: %s\r\n", k, v)
}
message += "\r\n" + content
conn, err := tls.Dial("tcp", mailConfig.Server+":465", &tls.Config{ServerName: mailConfig.Server})
if err != nil {
return err
}
client, err := smtp.NewClient(conn, mailConfig.Server)
if err != nil {
return err
}
if err = client.Auth(*auth); err != nil {
return err
}
if err = client.Mail(mailConfig.FromEmail); err != nil {
return err
}
if err = client.Rcpt(recipient); err != nil {
return err
}
writer, err := client.Data()
if err != nil {
return err
}
_, err = writer.Write([]byte(message))
if err != nil {
return err
}
if err = writer.Close(); err != nil {
return err
}
return client.Quit()
}

View File

@ -1,14 +1,14 @@
package models
type EmailConfig struct {
FromEmail string
Username string
Password string
Server string
}
type GlobalConfig struct {
Email EmailConfig
Key string
Algorithm string
}
package models
type EmailConfig struct {
FromEmail string
Username string
Password string
Server string
}
type GlobalConfig struct {
Email EmailConfig
Key string
Algorithm string
}

View File

@ -1,116 +1,116 @@
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)
}
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)
}