Required lots of rework since the GOBChannel appeared to be reading ahead of the data it actually needed. Now using more low-level IO to send the clientId over to the agent instead.
121 lines
2.2 KiB
Go
121 lines
2.2 KiB
Go
package comms
|
|
|
|
import (
|
|
"encoding/gob"
|
|
"os"
|
|
"os/user"
|
|
"runtime"
|
|
"time"
|
|
)
|
|
|
|
const PROTOCOL_VERSION = 5
|
|
|
|
// for testing protocol version mismatch we define a separate protocol version
|
|
// for the agent and server
|
|
var agentProtocolVersion = PROTOCOL_VERSION
|
|
var serverProtocolVersion = PROTOCOL_VERSION
|
|
|
|
func init() {
|
|
RegisterEventsWithGob()
|
|
}
|
|
|
|
// Agent to server events
|
|
|
|
type EnvironmentInfo struct {
|
|
Username string
|
|
Hostname string
|
|
Pwd string
|
|
OS string
|
|
Shell string
|
|
}
|
|
|
|
type SessionInfo struct {
|
|
ClientId string
|
|
|
|
// "ssh", "sftp"
|
|
SessionType string
|
|
}
|
|
|
|
type ExpiryTimeUpdate struct {
|
|
ExpiryTime time.Time
|
|
}
|
|
|
|
type HeartBeat struct {
|
|
// Empty
|
|
}
|
|
|
|
type ProtocolVersion struct {
|
|
Version int
|
|
}
|
|
|
|
// initialization mesaage when agent connects to server
|
|
|
|
type ServerInfo struct {
|
|
// used for testing only.
|
|
TestId int
|
|
}
|
|
|
|
// confirmation message when agent connects
|
|
type AgentRegistration struct {
|
|
Ok bool
|
|
Message string
|
|
// final Id assigned by the server. Usually identical to the requested id
|
|
// but if there is a conflict, a new id is chosen.
|
|
Id string
|
|
HostPrivateKey []byte
|
|
}
|
|
|
|
// Generic wrapper message required to send messages of arbitrary type
|
|
|
|
type ConvergeMessage struct {
|
|
Value any
|
|
}
|
|
|
|
func NewEnvironmentInfo(shell string) EnvironmentInfo {
|
|
username, _ := user.Current()
|
|
host, _ := os.Hostname()
|
|
pwd, _ := os.Getwd()
|
|
return EnvironmentInfo{
|
|
Username: username.Username,
|
|
Hostname: host,
|
|
Pwd: pwd,
|
|
OS: runtime.GOOS,
|
|
Shell: shell,
|
|
}
|
|
}
|
|
|
|
func NewSessionInfo(clientId, sessionType string) SessionInfo {
|
|
return SessionInfo{
|
|
ClientId: clientId,
|
|
SessionType: sessionType,
|
|
}
|
|
}
|
|
|
|
func NewExpiryTimeUpdate(expiryTime time.Time) ExpiryTimeUpdate {
|
|
return ExpiryTimeUpdate{ExpiryTime: expiryTime}
|
|
}
|
|
|
|
func RegisterEventsWithGob() {
|
|
// Agent to ConvergeServer
|
|
gob.Register(EnvironmentInfo{})
|
|
gob.Register(SessionInfo{})
|
|
gob.Register(ExpiryTimeUpdate{})
|
|
gob.Register(HeartBeat{})
|
|
|
|
// ConvergeServer to Agent and client
|
|
gob.Register(ProtocolVersion{})
|
|
|
|
// ConvergeServer to Client
|
|
gob.Register(ClientConnectionInfo{})
|
|
|
|
// Wrapper event.
|
|
gob.Register(ConvergeMessage{})
|
|
}
|
|
|
|
// Server to client events
|
|
|
|
type ClientConnectionInfo struct {
|
|
Ok bool
|
|
Message string
|
|
}
|