session

package
v0.0.0-...-f015300 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 22, 2024 License: Apache-2.0 Imports: 29 Imported by: 0

Documentation

Overview

Package session provides ProtoMsg Session abstraction. A session is a persistent communication channel with it's own set of control packets for opening and closing channels and performing end-to-end health checks. This package provides three levels of abstractions. On top, the Router manages creation and deletion as well as routing of messages to Sessions based on the ProtoMsg 'sid' (SessionID) header. The Session abstraction manages persistent session context such as creating and deleting as well as routing messages to SessionHandlers based on the 'proto' (ProtoType) header. The Session also takes care of session control messages. The SessionHandler is the application specific handler interface that takes care of the application specific messages. The ServeProtoMsg function is called for every inbound message with the associated ProtoType for the registered handler. If the SessionHandler requires persisting resources, Close MUST free these resources when the session shuts down. NOTE: ProtoRoutes that are used to map ProtoTypes to SessionHandlers maps

ProtoTypes to Constructors, since the Router must be able to regenerate
new Sessions with independent sets of SessionHandlers.

Index

Constants

View Source
const (
	ACKSlidingWindowSend = 10
	ACKSlidingWindowRecv = 20
	FileTransferBufSize  = 4096
)
View Source
const (
	NormalMessage int = iota + 1
	ErrorMessage
)
View Source
const MaxTraceback = 32
View Source
const (
	NoExpirationTimeout = time.Second * 0
)

Variables

View Source
var (
	ErrNoSession   = errors.New("session: does not exist")
	ErrNoSessionID = errors.New("session: message does not have a session ID")
)
View Source
var (
	ErrSessionShellAlreadyRunning         = errors.New("shell is already running")
	ErrSessionShellNotRunning             = errors.New("shell is not running")
	ErrSessionShellTooManySessionsPerUser = errors.New("user has too many open sessions")
	ErrSessionNotFound                    = errors.New("session not found")
	ErrSessionTooManyShellsAlreadyRunning = errors.New("too many shells spawned")
)
View Source
var (
	MaxUserSessions = 1
)

Functions

func MenderSessionTerminateAll

func MenderSessionTerminateAll() (shellCount int, sessionCount int, err error)

func MenderSessionTerminateExpired

func MenderSessionTerminateExpired() (
	shellCount int,
	sessionCount int,
	totalExpiredLeft int,
	err error,
)

func MenderShellDeleteById

func MenderShellDeleteById(id string) error

func MenderShellSessionGetCount

func MenderShellSessionGetCount() int

func MenderShellSessionGetSessionIds

func MenderShellSessionGetSessionIds() []string

func MenderShellStopById

func MenderShellStopById(sessionId string) error

func MenderShellStopByUserId

func MenderShellStopByUserId(userId string) (count uint, err error)

Types

type Config

type Config struct {
	// IdleTimeout is the duration a session can remain inactive before
	// it shuts down.
	IdleTimeout time.Duration
}

Config is the static configuration for Sessions and Routers.

type Constructor

type Constructor func() SessionHandler

Constructor is a function for SessionHandler initializers. To create a Router, all ProtoType Routes must route to a SessionHandler Constructor (factory).

func FileTransfer

func FileTransfer(limits config.Limits) Constructor

FileTransfer creates a new filetransfer constructor

func MenderClient

func MenderClient() Constructor

func PortForward

func PortForward() Constructor

type FileTransferHandler

type FileTransferHandler struct {
	// contains filtered or unexported fields
}

func (*FileTransferHandler) Close

func (h *FileTransferHandler) Close() error

func (*FileTransferHandler) DownloadHandler

func (h *FileTransferHandler) DownloadHandler(
	fd *os.File,
	msg *ws.ProtoMsg,
	w ResponseWriter,
) (err error)

func (*FileTransferHandler) Error

func (h *FileTransferHandler) Error(msg *ws.ProtoMsg, w ResponseWriter, err error)

func (*FileTransferHandler) FileUploadHandler

func (h *FileTransferHandler) FileUploadHandler(
	msg *ws.ProtoMsg,
	params model.UploadRequest,
	w ResponseWriter,
) (err error)

func (*FileTransferHandler) InitFileDownload

func (h *FileTransferHandler) InitFileDownload(msg *ws.ProtoMsg, w ResponseWriter) (err error)

func (*FileTransferHandler) InitFileUpload

func (h *FileTransferHandler) InitFileUpload(msg *ws.ProtoMsg, w ResponseWriter) (err error)

func (*FileTransferHandler) ServeProtoMsg

func (h *FileTransferHandler) ServeProtoMsg(msg *ws.ProtoMsg, w ResponseWriter)

func (*FileTransferHandler) StatFile

func (h *FileTransferHandler) StatFile(msg *ws.ProtoMsg, w ResponseWriter)

type HandlerFunc

type HandlerFunc func(msg *ws.ProtoMsg, w ResponseWriter)

func (HandlerFunc) Close

func (h HandlerFunc) Close() error

func (HandlerFunc) ServeProtoMsg

func (h HandlerFunc) ServeProtoMsg(msg *ws.ProtoMsg, w ResponseWriter)

type MenderPortForwarder

type MenderPortForwarder struct {
	SessionID      string
	ConnectionID   string
	ResponseWriter ResponseWriter
	// contains filtered or unexported fields
}

func (*MenderPortForwarder) Close

func (f *MenderPortForwarder) Close(sendStopMessage bool) error

func (*MenderPortForwarder) Connect

func (f *MenderPortForwarder) Connect(protocol string, host string, portNumber uint16) error

func (*MenderPortForwarder) Read

func (f *MenderPortForwarder) Read()

func (*MenderPortForwarder) Write

func (f *MenderPortForwarder) Write(body []byte) error

type MenderSessionStatus

type MenderSessionStatus int
const (
	ActiveSession MenderSessionStatus = iota
	ExpiredSession
	IdleSession
	HangedSession
	EmptySession
	NewSession
)

type MenderSessionType

type MenderSessionType int
const (
	ShellInteractiveSession MenderSessionType = iota
	MonitoringSession
	RemoteDebugSession
	ConfigurationSession
)

type MenderShellSession

type MenderShellSession struct {
	// contains filtered or unexported fields
}

func MenderShellSessionGetById

func MenderShellSessionGetById(id string) *MenderShellSession

func MenderShellSessionsGetByUserId

func MenderShellSessionsGetByUserId(userId string) []*MenderShellSession

func NewMenderShellSession

func NewMenderShellSession(
	sessionId string,
	userId string,
	expireAfter time.Duration,
	expireAfterIdle time.Duration,
) (s *MenderShellSession, err error)

func (*MenderShellSession) GetActiveAtFmt

func (s *MenderShellSession) GetActiveAtFmt() string

func (*MenderShellSession) GetExpiresAtFmt

func (s *MenderShellSession) GetExpiresAtFmt() string

func (*MenderShellSession) GetId

func (s *MenderShellSession) GetId() string

func (*MenderShellSession) GetShellCommandPath

func (s *MenderShellSession) GetShellCommandPath() string

func (*MenderShellSession) GetShellPid

func (s *MenderShellSession) GetShellPid() int

func (*MenderShellSession) GetStartedAtFmt

func (s *MenderShellSession) GetStartedAtFmt() string

func (*MenderShellSession) GetStatus

func (s *MenderShellSession) GetStatus() MenderSessionStatus

func (*MenderShellSession) HealthcheckPong

func (s *MenderShellSession) HealthcheckPong()

func (*MenderShellSession) IsExpired

func (s *MenderShellSession) IsExpired(setStatus bool) bool

func (*MenderShellSession) ResizeShell

func (s *MenderShellSession) ResizeShell(height, width uint16)

func (*MenderShellSession) ShellCommand

func (s *MenderShellSession) ShellCommand(m *ws.ProtoMsg) error

func (*MenderShellSession) StartShell

func (s *MenderShellSession) StartShell(
	sessionId string,
	terminal MenderShellTerminalSettings,
) error

func (*MenderShellSession) StopShell

func (s *MenderShellSession) StopShell() (err error)

type MenderShellTerminalSettings

type MenderShellTerminalSettings struct {
	Uid            uint32
	Gid            uint32
	Shell          string
	HomeDir        string
	TerminalString string
	Height         uint16
	Width          uint16
	ShellArguments []string
}

type PortForwardHandler

type PortForwardHandler struct {
	// contains filtered or unexported fields
}

func (*PortForwardHandler) Close

func (h *PortForwardHandler) Close() error

func (*PortForwardHandler) ServeProtoMsg

func (h *PortForwardHandler) ServeProtoMsg(msg *ws.ProtoMsg, w ResponseWriter)

type ProtoRoutes

type ProtoRoutes map[ws.ProtoType]Constructor

type ResponseWriter

type ResponseWriter interface {
	WriteProtoMsg(msg *ws.ProtoMsg) error
}

type ResponseWriterFunc

type ResponseWriterFunc func(msg *ws.ProtoMsg) error

func (ResponseWriterFunc) WriteProtoMsg

func (f ResponseWriterFunc) WriteProtoMsg(msg *ws.ProtoMsg) error

type Router

type Router interface {
	RouteMessage(msg *ws.ProtoMsg, w ResponseWriter) error
}

func NewRouter

func NewRouter(routes ProtoRoutes, config Config) Router

type Session

type Session struct {
	Config
	ID     string
	Routes ProtoRoutes
	// contains filtered or unexported fields
}

func New

func New(
	sessionID string,
	msgChan chan *ws.ProtoMsg,
	w ResponseWriter,
	routes ProtoRoutes,
	config Config,
) *Session

func (*Session) Done

func (sess *Session) Done() <-chan struct{}

func (*Session) Error

func (sess *Session) Error(msg *ws.ProtoMsg, close bool, errMessage string)

func (*Session) HandleControl

func (sess *Session) HandleControl(msg *ws.ProtoMsg) (close bool)

func (*Session) ListenAndServe

func (sess *Session) ListenAndServe()

func (*Session) MsgChan

func (sess *Session) MsgChan() chan<- *ws.ProtoMsg

func (*Session) Ping

func (sess *Session) Ping() error

type SessionHandler

type SessionHandler interface {
	// ServeProtoMsg handles individual messages within the associated
	// class of ProtoTypes.
	ServeProtoMsg(msg *ws.ProtoMsg, w ResponseWriter)
	// Close frees allocated resources when the session closes. It SHOULD
	// return an error if the session closes unexpectedly.
	Close() error
}

SessionHandler defines the interface for application specific ProtoMsg handlers.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL