First version with basic communication from agent to server working.

This commit is contained in:
Erik Brakkee 2024-07-24 21:39:14 +02:00
parent f5fb7c5ed2
commit ffeca2a533
5 changed files with 147 additions and 72 deletions

View File

@ -2,8 +2,8 @@ package main
import ( import (
"bufio" "bufio"
"converge/cmd/comms"
"converge/pkg/agent" "converge/pkg/agent"
"converge/pkg/comms"
"converge/pkg/iowrappers" "converge/pkg/iowrappers"
"converge/pkg/terminal" "converge/pkg/terminal"
"converge/pkg/websocketutil" "converge/pkg/websocketutil"

View File

@ -1,69 +0,0 @@
package comms
import (
"fmt"
"github.com/hashicorp/yamux"
"io"
"log"
"net"
)
type CommChannel struct {
Peer net.Conn
Session *yamux.Session
}
type Role int
const (
Agent Role = iota
ConvergeServer
)
func NewCommChannel(role Role, wsConn io.ReadWriteCloser) (CommChannel, error) {
var commChannel CommChannel
switch role {
case Agent:
listener, err := yamux.Server(wsConn, nil)
if err != nil {
return CommChannel{}, err
}
commChannel = CommChannel{
Peer: nil,
Session: listener,
}
case ConvergeServer:
clientSession, err := yamux.Client(wsConn, nil)
if err != nil {
return CommChannel{}, err
}
commChannel = CommChannel{
Peer: nil,
Session: clientSession,
}
default:
panic(fmt.Errorf("Undefined role %d", role))
}
// communication from Agent to ConvergeServer
switch role {
case Agent:
conn, err := commChannel.Session.OpenStream()
commChannel.Peer = conn
if err != nil {
return CommChannel{}, err
}
case ConvergeServer:
conn, err := commChannel.Session.Accept()
commChannel.Peer = conn
if err != nil {
return CommChannel{}, err
}
default:
panic(fmt.Errorf("Undefined role %d", role))
}
log.Println("Communication channel between agent and converge server established")
return commChannel, nil
}

View File

@ -51,7 +51,7 @@ func main() {
os.Exit(1) os.Exit(1)
} }
downloadDir := *downloadOption downloadDir := *downloadOption
log.Println("Doanload directory", downloadDir) log.Println("Download directory", downloadDir)
admin := converge.NewAdmin() admin := converge.NewAdmin()
registrationService := websocketutil.WebSocketService{ registrationService := websocketutil.WebSocketService{

144
pkg/comms/agentserver.go Normal file
View File

@ -0,0 +1,144 @@
package comms
import (
"encoding/gob"
"fmt"
"github.com/hashicorp/yamux"
"io"
"log"
"net"
"os"
"os/user"
"time"
)
type CommChannel struct {
Peer net.Conn
Encoder *gob.Encoder
Decoder *gob.Decoder
Session *yamux.Session
}
type Role int
const (
Agent Role = iota
ConvergeServer
)
func NewCommChannel(role Role, wsConn io.ReadWriteCloser) (CommChannel, error) {
var commChannel CommChannel
switch role {
case Agent:
listener, err := yamux.Server(wsConn, nil)
if err != nil {
return CommChannel{}, err
}
commChannel = CommChannel{
Peer: nil,
Session: listener,
}
case ConvergeServer:
clientSession, err := yamux.Client(wsConn, nil)
if err != nil {
return CommChannel{}, err
}
commChannel = CommChannel{
Peer: nil,
Session: clientSession,
}
default:
panic(fmt.Errorf("Undefined role %d", role))
}
// communication from Agent to ConvergeServer
switch role {
case Agent:
conn, err := commChannel.Session.OpenStream()
commChannel.Peer = conn
if err != nil {
return CommChannel{}, err
}
case ConvergeServer:
conn, err := commChannel.Session.Accept()
commChannel.Peer = conn
if err != nil {
return CommChannel{}, err
}
default:
panic(fmt.Errorf("Undefined role %d", role))
}
log.Println("Communication channel between agent and converge server established")
gob.Register(RemoteSession{})
gob.Register(ExpiryTimeUpdate{})
gob.Register(ConvergeMessage{})
commChannel.Encoder = gob.NewEncoder(commChannel.Peer)
commChannel.Decoder = gob.NewDecoder(commChannel.Peer)
switch role {
case Agent:
err := commChannel.Encoder.Encode(ConvergeMessage{Value: NewRemoteSession()})
if err != nil {
log.Printf("Encoding error %v", err)
}
err = commChannel.Encoder.Encode(ConvergeMessage{Value: NewExpiryTimeUpdate(time.Now())})
if err != nil {
log.Printf("Encoding error %v", err)
}
case ConvergeServer:
go serverReader(commChannel)
}
return commChannel, nil
}
func serverReader(channel CommChannel) {
for {
var result ConvergeMessage
err := channel.Decoder.Decode(&result)
if err != nil {
log.Printf("Error decoding object %v", err)
}
switch v := result.Value.(type) {
case RemoteSession:
log.Println("RECEIVED: session info ", v)
case ExpiryTimeUpdate:
log.Println("RECEIVED: expirytime update ", v)
default:
fmt.Printf(" Unknown type: %T\n", v)
}
}
}
type RemoteSession struct {
Username string
Hostname string
Pwd string
}
func NewRemoteSession() RemoteSession {
username, _ := user.Current()
host, _ := os.Hostname()
pwd, _ := os.Getwd()
return RemoteSession{
Username: username.Username,
Hostname: host,
Pwd: pwd,
}
}
type ExpiryTimeUpdate struct {
ExpiryTime time.Time
}
type ConvergeMessage struct {
Value interface{}
}
func NewExpiryTimeUpdate(expiryTime time.Time) ExpiryTimeUpdate {
return ExpiryTimeUpdate{ExpiryTime: expiryTime}
}

View File

@ -1,7 +1,7 @@
package converge package converge
import ( import (
"converge/cmd/comms" "converge/pkg/comms"
"converge/pkg/iowrappers" "converge/pkg/iowrappers"
"fmt" "fmt"
"github.com/hashicorp/yamux" "github.com/hashicorp/yamux"