converge/pkg/comms/events.go
Erik Brakkee ff97c1ccd2 Now by default wsproxy uses a specific protocol to establish connections to the server. It does this by adding the ?wsproxy query parameter.
The server then sends it the protocol version and the client connection info describing whether an agent was found or not. This improves usability for users.

With the --raw option it bypasses this query parameter and wsproxy then works in the old way as a simple stdio-websocket connector. It then still works with converge server but can also be used for simple websocket troubleshooting.
2024-08-01 20:22:41 +02:00

126 lines
2.1 KiB
Go

package comms
import (
"encoding/gob"
"os"
"os/user"
"runtime"
"time"
)
const PROTOCOL_VERSION = 2
func init() {
RegisterEventsWithGob()
}
// Agent to server events
type AgentInfo struct {
Username string
Hostname string
Pwd string
OS string
Shell string
}
type ClientInfo struct {
ClientId int
}
type SessionInfo struct {
ClientId string
// "ssh", "sftp"
SessionType string
}
type ExpiryTimeUpdate struct {
ExpiryTime time.Time
}
type HeartBeat struct {
// Empty
}
type ProtocolVersion struct {
Version int
}
type UserPassword struct {
Username string
Password string
}
// initialization mesaage when agent connects to server
type ServerInfo struct {
UserPassword UserPassword
}
// 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
}
// Generic wrapper message required to send messages of arbitrary type
type ConvergeMessage struct {
Value interface{}
}
func NewAgentInfo(shell string) AgentInfo {
username, _ := user.Current()
host, _ := os.Hostname()
pwd, _ := os.Getwd()
return AgentInfo{
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(AgentInfo{})
gob.Register(SessionInfo{})
gob.Register(ExpiryTimeUpdate{})
gob.Register(HeartBeat{})
// ConvergeServer to Agent and client
gob.Register(ProtocolVersion{})
// ConvergeServer to Agent
gob.Register(UserPassword{})
// ConvergeServer to Client
gob.Register(ClientConnectionInfo{})
// Wrapper event.
gob.Register(ConvergeMessage{})
}
// Server to client events
type ClientConnectionInfo struct {
Ok bool
Message string
}