First version with basic communication from agent to server working.
This commit is contained in:
parent
f5fb7c5ed2
commit
ffeca2a533
@ -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"
|
||||||
|
@ -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)
|
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
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
|
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"
|
||||||
|
Loading…
Reference in New Issue
Block a user