feat: add commands

This commit is contained in:
Louis Dalibard 2024-04-01 22:04:54 +02:00
parent d8e89bd5db
commit 36cc923896
8 changed files with 102 additions and 5 deletions

View File

@ -63,6 +63,49 @@ func StatusThread(host string) {
state.State.Mutex.Unlock()
}
func Command(command string) {
for host := range config.Config.Hosts {
state.State.Mutex.Lock()
state.State.Machines[host] = state.Machine{
State: state.Working,
JobStart: time.Now(),
}
state.State.Mutex.Unlock()
go CommandThread(host, command)
}
DisplayState()
}
func CommandThread(host string, command string) {
base, err := url.Parse("http://" + config.Config.Hosts[host] + constants.HostEndpoint)
utils.CheckError(err)
base.Path += "command"
params := url.Values{}
params.Add("token", auth.CreateToken())
params.Add("command", command)
base.RawQuery = params.Encode()
client := http.Client{
Timeout: config.Config.CommandTimeout,
}
resp, err := client.Get(base.String())
if utils.JobFailed(err, host) {
return
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if utils.JobFailed(err, host) {
return
}
state.State.Mutex.Lock()
state.State.Machines[host] = state.Machine{
State: state.Completed,
JobStart: state.State.Machines[host].JobStart,
JobEnd: time.Now(),
Message: string(body),
}
state.State.Mutex.Unlock()
}
func DisplayState() {
finished := false
for !finished {

View File

@ -1,20 +1,31 @@
package config
import "time"
type ConfigStruct struct {
Hosts map[string]string
Hosts map[string]string
Commands map[string][]string
CommandTimeout time.Duration
}
var Config = ConfigStruct{
Hosts: map[string]string{
"alpha": "127.0.0.1",
"beta": "127.0.0.1",
"alpha": "127.0.0.1",
/*"beta": "127.0.0.1",
"gamma": "127.0.0.1",
"delta": "127.0.0.1",
"epsilon": "127.0.0.1",
"zeta": "127.0.0.1",
"eta": "127.0.0.1",
"omega": "127.0.0.1",
"omega": "127.0.0.1",*/
},
Commands: map[string][]string{
"update": {"yes", "|", "sudo", "pacman", "-Syyu"},
"neofetch": {"neofetch"},
"uptime": {"uptime"},
"uname": {"uname", "-A"},
},
CommandTimeout: 20 * time.Minute,
}
var AuthSecret = []byte("ChangeMe!")

BIN
kon

Binary file not shown.

View File

@ -25,6 +25,14 @@ func main() {
log.Fatal("Cannot find command.")
}
} else if len(args) == 3 {
switch args[1] {
case "command":
client.Command(args[2])
default:
log.Fatal("Cannot find command.")
}
} else {
log.Fatal("Too many arguments.")
}

View File

@ -3,9 +3,11 @@ package middlewares
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/logger"
"github.com/gofiber/fiber/v2/middleware/recover"
)
func Init(app *fiber.App) {
app.Use(recover.New())
app.Use(logger.New(logger.Config{
TimeFormat: "2006-01-02 15:04:05",
}))

View File

@ -0,0 +1,31 @@
package command
import (
"kon/auth"
"kon/config"
"kon/utils"
"os/exec"
"github.com/gofiber/fiber/v2"
)
func HandleFunc(c *fiber.Ctx) error {
queryValue := c.Query("token")
command := c.Query("command")
if auth.VerifyToken(queryValue) {
val, ok := config.Config.Commands[command]
if !ok {
return c.SendString("Command not found.")
} else {
cmd := exec.Command(val[0])
if len(val) > 1 {
cmd = exec.Command(val[0], val[1:]...)
}
err := cmd.Run()
utils.CheckError(err)
return c.SendString("Command was run successfully!")
}
} else {
return c.SendString("Auth failed!")
}
}

View File

@ -1,6 +1,7 @@
package paths
import (
"kon/pon/paths/command"
"kon/pon/paths/status"
"github.com/gofiber/fiber/v2"
@ -8,4 +9,5 @@ import (
func Init(app *fiber.App) {
app.Get("/status", status.HandleFunc)
app.Get("/command", command.HandleFunc)
}

View File

@ -42,6 +42,6 @@ func HandleFunc(c *fiber.Ctx) error {
utils.CheckError(err)
return c.SendString(string(statusJSON))
} else {
return c.SendString("no")
return c.SendString("Auth failed!")
}
}