podterminal/web/router.go

85 lines
1.7 KiB
Go

package web
import (
"fmt"
"log"
"net/http/httputil"
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie"
"github.com/gin-gonic/gin"
"github.com/spf13/viper"
)
var proxies = make(map[string]*httputil.ReverseProxy)
func Run() error {
router := setupRouter()
address := fmt.Sprintf("%s:%d", viper.GetString("ip_addr"), viper.GetInt("port"))
log.Println("Listening on address", address)
var err error
if viper.GetBool("ssl") == true {
err = router.RunTLS(
address,
viper.GetString("ssl_cert"),
viper.GetString("ssl_cert_key"),
)
log.Println("Using SSL")
} else {
err = router.Run(address)
}
log.Println("Router is ready")
if err != nil {
log.Panic("Could not start Webserver: ", err)
return err
}
return nil
}
func setupRouter() *gin.Engine {
log.Println("Setting up router")
gin.ForceConsoleColor()
gin.SetMode("release")
router := gin.New()
store := cookie.NewStore([]byte(viper.GetString("session_key")))
store.Options(sessions.Options{
MaxAge: viper.GetInt("maxAge"),
})
router.Use(gin.Recovery())
router.Use(sessions.Sessions("session", store))
//router.Use(urlLog())
if viper.GetBool("block_filebrowser") == true {
router.Use(blockFilebrowser)
}
router.Use(containerProxy)
// router.Any("/", containerProxy)
return router
}
func urlLog() gin.HandlerFunc {
return func(c *gin.Context) {
log.Printf(
"[INFO] %s: %s: %s",
c.Request.RemoteAddr,
c.Request.Method,
c.Request.URL,
)
}
}
// blockFilebrowser blocks the URLs used by the Kclient File browser
func blockFilebrowser(c *gin.Context) {
switch c.Request.URL.RawPath {
case "/files":
c.Abort()
case "/filebrowser.js":
c.Abort()
case "/files/socket.io":
c.Abort()
default:
c.Next()
}
}