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
- Variables
- func MenderSessionTerminateAll() (shellCount int, sessionCount int, err error)
- func MenderSessionTerminateExpired() (shellCount int, sessionCount int, totalExpiredLeft int, err error)
- func MenderShellDeleteById(id string) error
- func MenderShellSessionGetCount() int
- func MenderShellSessionGetSessionIds() []string
- func MenderShellStopById(sessionId string) error
- func MenderShellStopByUserId(userId string) (count uint, err error)
- type Config
- type Constructor
- type FileTransferHandler
- func (h *FileTransferHandler) Close() error
- func (h *FileTransferHandler) DownloadHandler(fd *os.File, msg *ws.ProtoMsg, w ResponseWriter) (err error)
- func (h *FileTransferHandler) Error(msg *ws.ProtoMsg, w ResponseWriter, err error)
- func (h *FileTransferHandler) FileUploadHandler(msg *ws.ProtoMsg, params model.UploadRequest, w ResponseWriter) (err error)
- func (h *FileTransferHandler) InitFileDownload(msg *ws.ProtoMsg, w ResponseWriter) (err error)
- func (h *FileTransferHandler) InitFileUpload(msg *ws.ProtoMsg, w ResponseWriter) (err error)
- func (h *FileTransferHandler) ServeProtoMsg(msg *ws.ProtoMsg, w ResponseWriter)
- func (h *FileTransferHandler) StatFile(msg *ws.ProtoMsg, w ResponseWriter)
- type HandlerFunc
- type MenderPortForwarder
- type MenderSessionStatus
- type MenderSessionType
- type MenderShellSession
- func (s *MenderShellSession) GetActiveAtFmt() string
- func (s *MenderShellSession) GetExpiresAtFmt() string
- func (s *MenderShellSession) GetId() string
- func (s *MenderShellSession) GetShellCommandPath() string
- func (s *MenderShellSession) GetShellPid() int
- func (s *MenderShellSession) GetStartedAtFmt() string
- func (s *MenderShellSession) GetStatus() MenderSessionStatus
- func (s *MenderShellSession) HealthcheckPong()
- func (s *MenderShellSession) IsExpired(setStatus bool) bool
- func (s *MenderShellSession) ResizeShell(height, width uint16)
- func (s *MenderShellSession) ShellCommand(m *ws.ProtoMsg) error
- func (s *MenderShellSession) StartShell(sessionId string, terminal MenderShellTerminalSettings) error
- func (s *MenderShellSession) StopShell() (err error)
- type MenderShellTerminalSettings
- type PortForwardHandler
- type ProtoRoutes
- type ResponseWriter
- type ResponseWriterFunc
- type Router
- type Session
- func (sess *Session) Done() <-chan struct{}
- func (sess *Session) Error(msg *ws.ProtoMsg, close bool, errMessage string)
- func (sess *Session) HandleControl(msg *ws.ProtoMsg) (close bool)
- func (sess *Session) ListenAndServe()
- func (sess *Session) MsgChan() chan<- *ws.ProtoMsg
- func (sess *Session) Ping() error
- type SessionHandler
Constants ¶
const ( ACKSlidingWindowSend = 10 ACKSlidingWindowRecv = 20 FileTransferBufSize = 4096 )
const ( NormalMessage int = iota + 1 ErrorMessage )
const MaxTraceback = 32
const (
NoExpirationTimeout = time.Second * 0
)
Variables ¶
var ( ErrNoSession = errors.New("session: does not exist") ErrNoSessionID = errors.New("session: message does not have a session ID") )
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") )
var (
MaxUserSessions = 1
)
Functions ¶
func MenderShellDeleteById ¶
func MenderShellSessionGetCount ¶
func MenderShellSessionGetCount() int
func MenderShellSessionGetSessionIds ¶
func MenderShellSessionGetSessionIds() []string
func MenderShellStopById ¶
func MenderShellStopByUserId ¶
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 (*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 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 ResponseWriterFunc ¶
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) ListenAndServe ¶
func (sess *Session) ListenAndServe()
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.