package handlers
import (
"path/filepath"
"github.com/gofiber/fiber/v2"
"github.com/limanmys/render-engine/app/models"
"github.com/limanmys/render-engine/internal/bridge"
"github.com/limanmys/render-engine/internal/liman"
"github.com/limanmys/render-engine/pkg/logger"
)
func ScriptRunner (c *fiber .Ctx ) error {
params := []string {"local_path" , "root" , "parameters" , "server_id" }
for _ , param := range params {
if len (c .FormValue (param )) < 1 {
return logger .FiberError (fiber .StatusBadRequest , param +" parameter is missing" )
}
}
server , err := liman .GetServer (&models .Server {ID : c .FormValue ("server_id" )})
if err != nil {
return err
}
session , err := bridge .GetSession (
c .Locals ("user_id" ).(string ),
server .ID ,
server .IPAddress ,
)
if err != nil {
return err
}
established := session .CreateFileConnection (
c .Locals ("user_id" ).(string ),
c .FormValue ("server_id" ),
server .IPAddress ,
)
if !established {
return logger .FiberError (fiber .StatusServiceUnavailable , "cannot establish file connection" )
}
remotePath := ""
if server .Os == "linux" {
remotePath = "/tmp/" + filepath .Base (c .FormValue ("local_path" ))
_ , err := session .Run ("rm " + remotePath )
if err != nil {
return err
}
} else {
remotePath = session .WindowsPath + c .FormValue ("remote_path" ) + ".ps1"
}
err = session .Put (c .FormValue ("local_path" ), remotePath )
if err != nil {
return err
}
output := ""
if server .Os == "linux" {
_ , err := session .Run ("chmod +x " + remotePath )
if err != nil {
return err
}
if c .FormValue ("root" ) == "yes" {
credentials , err := liman .GetCredentials (&models .User {ID : c .Locals ("user_id" ).(string )}, server )
if err != nil {
return err
}
if credentials .Type == "ssh" {
remotePath = `sudo -p "liman-pass-sudo" ` + remotePath
} else {
remotePath = "sudo " + remotePath
}
}
output , err = session .Run (remotePath + " " + c .FormValue ("parameters" ))
if err != nil {
return logger .FiberError (fiber .StatusInternalServerError , "cannot run linux script" )
}
} else {
output , err = session .Run (session .WindowsLetter + ":\\" + remotePath + " " + c .FormValue ("parameters" ))
if err != nil {
return logger .FiberError (fiber .StatusInternalServerError , "cannot run windows script" )
}
}
return c .SendString (output )
}
The pages are generated with Golds v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds .