First version with basic communication from agent to server working.
This commit is contained in:
parent
5bd3795534
commit
459300b0d3
@ -2,8 +2,8 @@ package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"converge/cmd/comms"
|
||||
"converge/pkg/agent"
|
||||
"converge/pkg/comms"
|
||||
"converge/pkg/iowrappers"
|
||||
"converge/pkg/terminal"
|
||||
"converge/pkg/websocketutil"
|
||||
|
@ -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
|
||||
}
|
@ -51,7 +51,7 @@ func main() {
|
||||
os.Exit(1)
|
||||
}
|
||||
downloadDir := *downloadOption
|
||||
log.Println("Doanload directory", downloadDir)
|
||||
log.Println("Download directory", downloadDir)
|
||||
|
||||
admin := converge.NewAdmin()
|
||||
registrationService := websocketutil.WebSocketService{
|
||||
|
144
pkg/comms/agentserver.go
Normal file
144
pkg/comms/agentserver.go
Normal 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}
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
package converge
|
||||
|
||||
import (
|
||||
"converge/cmd/comms"
|
||||
"converge/pkg/comms"
|
||||
"converge/pkg/iowrappers"
|
||||
"fmt"
|
||||
"github.com/hashicorp/yamux"
|
||||
|
Loading…
Reference in New Issue
Block a user