podterminal/web/reverseProxy.go

129 lines
2.8 KiB
Go
Raw Normal View History

2024-01-30 16:45:03 +01:00
package web
import (
"fmt"
"log"
2024-02-03 11:11:10 +01:00
"net/http"
2024-01-30 16:45:03 +01:00
"net/http/httputil"
"net/url"
"time"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
2024-02-03 11:11:10 +01:00
"github.com/spf13/viper"
2024-01-30 16:45:03 +01:00
"git.jmbit.de/jmb/podterminal/pods"
)
func createReverseProxy(backendService string) (*httputil.ReverseProxy, error) {
var err error
log.Println("Creating reverse Proxy for ", backendService)
backendURL, err := url.Parse(backendService)
if err != nil {
log.Printf("Could not parse backend URL: %v", err)
}
proxy := &httputil.ReverseProxy{
Rewrite: func(request *httputil.ProxyRequest) {
request.SetURL(backendURL)
request.Out.Host = request.In.Host
},
2024-02-03 11:11:10 +01:00
ModifyResponse: func(response *http.Response) error {
if response.StatusCode == http.StatusBadGateway {
time.Sleep(time.Second)
response.StatusCode = 307
response.Header.Set("Location", "/")
}
return nil
},
2024-01-30 16:45:03 +01:00
}
return proxy, err
}
func containerProxy(c *gin.Context) {
session := sessions.Default(c)
2024-02-03 11:11:10 +01:00
sessionID := ""
if session.Get("ct") == nil && session.Get("ready") == nil {
session.Set("ready", false)
session.Save()
2024-01-30 16:45:03 +01:00
log.Println("Creating Container for Session ", sessionID)
ct, err := pods.CreateContainer()
session.Set("ct", ct)
session.Save()
2024-01-30 16:45:03 +01:00
if err != nil {
c.HTML(500, "Error", fmt.Sprintf("[%s] Could not create Container: %v", sessionID, err))
session.Delete("ct")
session.Save()
2024-01-30 16:45:03 +01:00
c.Abort()
}
err = pods.StartContainer(ct)
if err != nil {
c.HTML(500, "Error", fmt.Sprintf("[%s] Could not start Container: %v", sessionID, err))
session.Delete("ct")
session.Save()
2024-01-30 16:45:03 +01:00
c.Abort()
}
2024-01-30 16:45:03 +01:00
ctip, err := pods.GetContainerIP(ct)
if err != nil {
c.HTML(500, "Error", fmt.Sprintf("[%s] Could not get Container ip: %v", sessionID, err))
session.Delete("ct")
session.Save()
2024-01-30 16:45:03 +01:00
c.Abort()
}
2024-01-31 13:12:43 +01:00
// Soft fail Skel
2024-02-01 17:32:46 +01:00
// _ = pods.CopySkelToContainer(ct)
2024-01-30 16:45:03 +01:00
2024-02-03 11:11:10 +01:00
proxies[ct], err = createReverseProxy(
fmt.Sprintf("http://%s:%d", ctip, viper.GetInt("container_port")),
)
2024-01-30 16:45:03 +01:00
if err != nil {
c.HTML(
500,
"Error",
fmt.Sprintf("[%s] Could not create Container Proxy: %v", sessionID, err),
)
session.Delete("ct")
session.Save()
2024-01-30 16:45:03 +01:00
c.Abort()
}
session.Set("ready", true)
2024-01-30 16:45:03 +01:00
session.Save()
2024-02-03 11:11:10 +01:00
c.Redirect(307, "/")
2024-01-30 16:45:03 +01:00
} else {
sessionCT := session.Get("ct")
switch sessionCT.(type) {
case string:
default:
c.HTML(500, "Error", "Session Container ID is not a string")
session.Delete("ct")
2024-02-03 11:11:10 +01:00
session.Delete("ready")
session.Save()
2024-01-30 16:45:03 +01:00
c.Abort()
}
2024-02-03 11:11:10 +01:00
if session.Get("ready").(bool) == false {
time.Sleep(time.Second)
c.Redirect(307, "/")
}
2024-01-30 16:45:03 +01:00
id := session.Get("ct").(string)
proxy := proxies[id]
2024-02-03 11:11:10 +01:00
if proxy != nil {
proxy.ServeHTTP(c.Writer, c.Request)
} else {
session.Delete("ct")
session.Delete("ready")
session.Save()
c.Abort()
}
2024-01-30 16:45:03 +01:00
}
}