ganeti

Safe HaskellNone

Ganeti.UDSServer

Contents

Description

Implementation of the Ganeti Unix Domain Socket JSON server interface.

Synopsis

Utility functions

withTimeout :: Int -> String -> IO a -> IO aSource

Generic protocol functionality

data RecvResult Source

Result of receiving a message from the socket.

Constructors

RecvConnClosed

Connection closed

RecvError String

Any other error

RecvOk String

Successfull receive

Instances

eOM :: Word8Source

bEOM :: ByteStringSource

data MsgKeys Source

Valid keys in the requests and responses.

Constructors

Method 
Args 
Success 
Result 

strOfKey :: MsgKeys -> StringSource

The serialisation of MsgKeys into strings in messages.

data ConnectConfig Source

Constructors

ConnectConfig 

Fields

recvTmo :: Int
 
sendTmo :: Int
 

data Client Source

A client encapsulation. Note that it has separate read and write handle. For sockets it is the same handle. It is required for bi-directional inter-process pipes though.

Constructors

Client 

Fields

rsocket :: Handle
 
wsocket :: Handle
 
rbuf :: IORef ByteString
 
clientConfig :: ConnectConfig
 

data Server Source

A server encapsulation.

Constructors

Server 

Fields

sSocket :: Socket
 
sPath :: FilePath
 
serverConfig :: ConnectConfig
 

Unix sockets

openClientSocketSource

Arguments

:: Int

connection timeout

-> FilePath

socket path

-> IO Handle 

Creates a Unix socket and connects it to the specified path, where timeout specifies the connection timeout.

closeClientSocket :: Handle -> IO ()Source

Closes the handle. Performing the operation on a handle that has already been closed has no effect; doing so is not an error. All other operations on a closed handle will fail.

openServerSocket :: FilePath -> IO SocketSource

Creates a Unix socket and binds it to the specified path.

closeServerSocket :: Socket -> FilePath -> IO ()Source

acceptSocket :: Socket -> IO HandleSource

Client and server

connectClientSource

Arguments

:: ConnectConfig

configuration for the client

-> Int

connection timeout

-> FilePath

socket path

-> IO Client 

Connects to the master daemon and returns a Client.

connectServer :: ServerConfig -> Bool -> FilePath -> IO ServerSource

Creates and returns a server endpoint.

pipeClient :: ConnectConfig -> IO (Client, Client)Source

Creates a new bi-directional client pipe. The two returned clients talk to each other through the pipe.

closeServer :: MonadBase IO m => Server -> m ()Source

Closes a server endpoint.

acceptClient :: Server -> IO ClientSource

Accepts a client

closeClient :: Client -> IO ()Source

Closes the client socket. Performing the operation on a client that has already been closed has no effect; doing so is not an error. All other operations on a closed client will fail with an exception.

clientToFd :: Client -> IO (Fd, Fd)Source

Extracts the read (the first) and the write (the second) file descriptor of a client. This closes the underlying Handles, therefore the original client is closed and unusable after the call.

The purpose of this function is to keep the communication channel open, while replacing a Client with some other means.

sendMsg :: Client -> String -> IO ()Source

Sends a message over a transport.

recvUpdate :: ConnectConfig -> Handle -> ByteString -> IO (ByteString, ByteString)Source

recvMsg :: Client -> IO StringSource

Waits for a message over a transport.

recvMsgExt :: Client -> IO RecvResultSource

Extended wrapper over recvMsg.

buildCallSource

Arguments

:: (JSON mth, JSON args) 
=> mth

The method

-> args

The arguments

-> String

The serialized form

Serialize a request to String.

parseCall :: (JSON mth, JSON args) => String -> Result (mth, args)Source

Parse the required keys out of a call.

buildResponseSource

Arguments

:: Bool

Success

-> JSValue

The arguments

-> String

The serialized form

Serialize the response to String.

decodeError :: JSValue -> ErrorResult JSValueSource

parseResponse :: String -> ErrorResult JSValueSource

Check that luxi responses contain the required keys and that the call was successful.

logMsg :: (Show e, JSON e, MonadLog m) => Handler i m o -> i -> GenericResult e JSValue -> m ()Source

prepareMsg :: JSON e => GenericResult e JSValue -> (Bool, JSValue)Source

Processing client requests

data Handler i m o Source

Constructors

Handler 

Fields

hParse :: JSValue -> JSValue -> Result i

parses method and its arguments into the input type

hInputLogShort :: i -> String

short description of an input, for the INFO logging level

hInputLogLong :: i -> String

long description of an input, for the DEBUG logging level

hExec :: i -> HandlerResult m o

executes the handler on an input

handleJsonMessage :: (JSON o, Monad m) => Handler i m o -> i -> HandlerResult m JSValueSource

handleRawMessage :: (JSON o, MonadLog m) => Handler i m o -> String -> m (Bool, String)Source

handleClient :: (JSON o, MonadBase IO m, MonadLog m) => Handler i m o -> Client -> m BoolSource

clientLoop :: (JSON o, MonadBase IO m, MonadLog m) => Handler i m o -> Client -> m ()Source

listener :: (JSON o, MonadBaseControl IO m, MonadLog m) => Handler i m o -> Server -> m ()Source

Main listener loop: accepts clients, forks an I/O thread to handle that client.